2020-02-16 16:54:04 +00:00
|
|
|
/// Game-specific pattern and spawn types
|
|
|
|
/// -------------------------------------
|
[Reverse-engineering] [th04/th05] Bullet pattern types
uth05win TL note: "n-way all-around" means "ring"… yep, let's better
improve on the naming here, once again using established terminology
from Sparen's Danmaku Design Guide at
https://sparen.github.io/ph3tutorials/ddsga3.html
Since TH04 only supports rings *or* spreads *or* stacks, overloading
[delta] to store both spread angle and stack speed, that enum does
serve kind of a purpose in TH04. Unlike TH05, where it could be vastly
simplified to a bitfield with 4 flags: aim to player, randomize angle,
randomize speed, force single. Which could then actually create *more*
types of patterns than these uselessly defined 14 distinct types, all
of which can already be derived from the other values of the upcoming
template structure:
• Set [stack] to 1 if you don't want a stack
• Set [spread] to 1 if you don't want a spread
• Set [spread_delta_angle] to 0 to turn a N-way spread into a ring
Easy.
Part of P0075, funded by Myles and -Tom-.
2020-02-14 16:34:06 +00:00
|
|
|
#if GAME == 5
|
|
|
|
# include "th05/bullet/pattypes.h"
|
|
|
|
#else
|
|
|
|
# include "th04/bullet/pattypes.h"
|
|
|
|
#endif
|
2020-02-16 16:54:04 +00:00
|
|
|
/// -------------------------------------
|
[Reverse-engineering] [th04/th05] Bullet pattern types
uth05win TL note: "n-way all-around" means "ring"… yep, let's better
improve on the naming here, once again using established terminology
from Sparen's Danmaku Design Guide at
https://sparen.github.io/ph3tutorials/ddsga3.html
Since TH04 only supports rings *or* spreads *or* stacks, overloading
[delta] to store both spread angle and stack speed, that enum does
serve kind of a purpose in TH04. Unlike TH05, where it could be vastly
simplified to a bitfield with 4 flags: aim to player, randomize angle,
randomize speed, force single. Which could then actually create *more*
types of patterns than these uselessly defined 14 distinct types, all
of which can already be derived from the other values of the upcoming
template structure:
• Set [stack] to 1 if you don't want a stack
• Set [spread] to 1 if you don't want a spread
• Set [spread_delta_angle] to 0 to turn a N-way spread into a ring
Easy.
Part of P0075, funded by Myles and -Tom-.
2020-02-14 16:34:06 +00:00
|
|
|
|
2020-02-03 19:32:56 +00:00
|
|
|
/// States and modes
|
|
|
|
/// ----------------
|
|
|
|
#pragma option -b-
|
|
|
|
|
2020-02-12 20:22:49 +00:00
|
|
|
#define BSS_CLOUD_FRAMES (BULLET_CLOUD_CELS * 4)
|
|
|
|
#define BMS_DECAY_FRAMES (BULLET_DECAY_CELS * 4)
|
2020-02-03 19:32:56 +00:00
|
|
|
#define BMS_SLOWDOWN_BASE_SPEED 4.5f
|
|
|
|
#define BMS_SLOWDOWN_FRAMES 32
|
|
|
|
|
|
|
|
enum bullet_spawn_state_t {
|
|
|
|
/// Hitbox is active
|
|
|
|
/// ----------------
|
|
|
|
BSS_GRAZEABLE = 0,
|
|
|
|
BSS_GRAZED = 1,
|
|
|
|
BSS_ACTIVE = 2,
|
|
|
|
/// ----------------
|
|
|
|
|
|
|
|
/// Delay "cloud", no hitbox
|
|
|
|
/// ------------------------
|
|
|
|
BSS_CLOUD_BACKWARDS = 3,
|
|
|
|
BSS_CLOUD_FORWARDS = 4,
|
|
|
|
BSS_CLOUD_END = (BSS_CLOUD_FORWARDS + BSS_CLOUD_FRAMES),
|
|
|
|
/// ------------------------
|
|
|
|
};
|
|
|
|
|
|
|
|
enum bullet_move_state_t {
|
|
|
|
/// Hitbox is active
|
|
|
|
/// ----------------
|
|
|
|
// Slows down from BMS_SLOWDOWN_BASE_SPEED to [final_speed]
|
|
|
|
BMS_SLOWDOWN = 0,
|
|
|
|
// Special processing according to [special_motion]
|
|
|
|
BMS_SPECIAL = 1,
|
|
|
|
// No special processing
|
|
|
|
BMS_NORMAL = 2,
|
|
|
|
/// ----------------
|
|
|
|
|
|
|
|
/// Decay, no hitbox
|
|
|
|
/// ----------------
|
|
|
|
BMS_DECAY = 4,
|
|
|
|
BMS_DECAY_END = (BMS_DECAY + BMS_DECAY_FRAMES),
|
|
|
|
/// ----------------
|
|
|
|
};
|
|
|
|
|
|
|
|
enum bullet_special_motion_t {
|
|
|
|
};
|
|
|
|
|
|
|
|
#pragma option -b
|
|
|
|
/// ----------------
|
|
|
|
|
|
|
|
struct bullet_t {
|
|
|
|
char flag;
|
|
|
|
char age;
|
|
|
|
motion_t pos;
|
|
|
|
unsigned char from_pattern; // unused
|
|
|
|
int8_t unused;
|
|
|
|
SubpixelLength8 speed_cur;
|
|
|
|
unsigned char angle;
|
|
|
|
bullet_spawn_state_t spawn_state;
|
|
|
|
bullet_move_state_t move_state;
|
|
|
|
bullet_special_motion_t special_motion;
|
|
|
|
unsigned char speed_final;
|
|
|
|
union {
|
|
|
|
unsigned char slowdown_time; // with BMS_SLOWDOWN
|
|
|
|
unsigned char turn_count; // with BMS_SPECIAL
|
|
|
|
} ax;
|
|
|
|
union {
|
|
|
|
unsigned char slowdown_speed_delta; // with BMS_SLOWDOWN
|
|
|
|
unsigned char turn_angle; // with BMS_SPECIAL
|
|
|
|
} dx;
|
|
|
|
int patnum;
|
|
|
|
|
|
|
|
#if GAME == 5
|
|
|
|
// Coordinates for BSM_STRAIGHT
|
|
|
|
SPPoint origin;
|
|
|
|
int distance;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
#define PELLET_W 8
|
|
|
|
#define PELLET_H 8
|
|
|
|
#define BULLET16_W 16
|
|
|
|
#define BULLET16_H 16
|
|
|
|
|
|
|
|
#if GAME == 5
|
|
|
|
# define PELLET_COUNT 180
|
|
|
|
# define BULLET16_COUNT 220
|
2020-02-13 21:07:11 +00:00
|
|
|
|
|
|
|
// Returns the patnum for the directional or vector bullet sprite starting at
|
|
|
|
// [patnum_base] that shows the given [angle].
|
|
|
|
int pascal near bullet_patnum_for_angle(int patnum_base, unsigned char angle);
|
|
|
|
// Updates [bullet]'s patnum based on its current angle.
|
|
|
|
void pascal near bullet_update_patnum(bullet_t near *bullet);
|
|
|
|
|
2020-02-03 19:32:56 +00:00
|
|
|
#else
|
|
|
|
# define PELLET_COUNT 240
|
|
|
|
# define BULLET16_COUNT 200
|
2020-02-13 21:07:11 +00:00
|
|
|
|
|
|
|
// Returns the offset for a directional bullet sprite that shows the given
|
|
|
|
// [angle].
|
|
|
|
int pascal near bullet_patnum_for_angle(unsigned char angle);
|
2020-02-03 19:32:56 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define BULLET_COUNT (PELLET_COUNT + BULLET16_COUNT)
|
|
|
|
|
|
|
|
extern bullet_t bullets[BULLET_COUNT];
|
|
|
|
#define pellets (&bullets[0])
|
|
|
|
#define bullets16 (&bullets[PELLET_COUNT])
|
2020-02-15 20:13:31 +00:00
|
|
|
|
|
|
|
struct bullet_template_t {
|
|
|
|
uint8_t spawn_type;
|
|
|
|
unsigned char patnum; // TH05: 0 = pellet
|
|
|
|
SPPoint origin;
|
|
|
|
#if GAME == 5
|
|
|
|
bullet_pattern_t pattern;
|
|
|
|
bullet_special_motion_t special_motion;
|
|
|
|
unsigned char spread;
|
|
|
|
unsigned char spread_angle_delta;
|
|
|
|
unsigned char stack;
|
|
|
|
SubpixelLength8 stack_speed_delta;
|
|
|
|
unsigned char angle;
|
|
|
|
SubpixelLength8 speed;
|
|
|
|
#else
|
|
|
|
SPPoint velocity;
|
|
|
|
bullet_pattern_t pattern;
|
|
|
|
unsigned char angle;
|
|
|
|
SubpixelLength8 speed;
|
|
|
|
unsigned char count;
|
|
|
|
bullet_template_delta_t delta;
|
|
|
|
uint8_t unused_1;
|
|
|
|
bullet_special_motion_t special_motion;
|
|
|
|
uint8_t unused_2;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
extern bullet_template_t bullet_template;
|