1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-09-08 03:54:27 +00:00

Missile to player lock is supposed to be a toggle; also factored out the commonalities of missile and ball drawing.

This commit is contained in:
Thomas Harte 2017-02-21 07:58:37 -05:00
parent 1bde0fed6f
commit d1dbf8c21f
3 changed files with 44 additions and 40 deletions

View File

@ -175,7 +175,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
case 0x26: tia_->set_player_delay(decodedAddress - 0x25, (*value)&1); break; case 0x26: tia_->set_player_delay(decodedAddress - 0x25, (*value)&1); break;
case 0x27: tia_->set_ball_delay((*value)&1); break; case 0x27: tia_->set_ball_delay((*value)&1); break;
case 0x28: case 0x28:
case 0x29: update_video(); tia_->set_missile_position_to_player(decodedAddress - 0x28); break; case 0x29: update_video(); tia_->set_missile_position_to_player(decodedAddress - 0x28, (*value)&2); break;
case 0x2a: update_video(); tia_->move(); break; case 0x2a: update_video(); tia_->move(); break;
case 0x2b: update_video(); tia_->clear_motion(); break; case 0x2b: update_video(); tia_->clear_motion(); break;
case 0x2c: update_video(); tia_->clear_collision_flags(); break; case 0x2c: update_video(); tia_->clear_collision_flags(); break;

View File

@ -351,10 +351,20 @@ void TIA::set_missile_position(int missile)
missile_[missile].position = 0; missile_[missile].position = 0;
} }
void TIA::set_missile_position_to_player(int missile) void TIA::set_missile_position_to_player(int missile, bool lock)
{ {
// TODO: implement this correctly; should be triggered by player counter hitting the appropriate point // TODO: implement this correctly; should be triggered by player counter hitting the appropriate point, and
missile_[missile].position = player_[missile].position + 5; // use additional storage position for enabled
if(lock)
{
missile_[missile].enabled = false;
missile_[missile].position = player_[missile].position + 5;
// printf("%d", missile);
}
else
{
missile_[missile].enabled = true;
}
} }
void TIA::set_missile_motion(int missile, uint8_t motion) void TIA::set_missile_motion(int missile, uint8_t motion)

View File

@ -62,7 +62,7 @@ class TIA {
void set_missile_enable(int missile, bool enabled); void set_missile_enable(int missile, bool enabled);
void set_missile_position(int missile); void set_missile_position(int missile);
void set_missile_position_to_player(int missile); void set_missile_position_to_player(int missile, bool lock);
void set_missile_motion(int missile, uint8_t motion); void set_missile_motion(int missile, uint8_t motion);
void set_ball_enable(bool enabled); void set_ball_enable(bool enabled);
@ -194,13 +194,10 @@ class TIA {
Player() : copy_flags(0), graphic{0, 0}, reverse_mask(false), pixel_position(32), graphic_index(0) {} Player() : copy_flags(0), graphic{0, 0}, reverse_mask(false), pixel_position(32), graphic_index(0) {}
} player_[2]; } player_[2];
// missile state // common actor for things that appear as a horizontal run of pixels
struct Missile: public Object { struct HorizontalRun: public Object {
bool enabled;
int size;
int copy_flags;
int pixel_position; int pixel_position;
int size;
inline void skip_pixels(int count) inline void skip_pixels(int count)
{ {
@ -212,57 +209,54 @@ class TIA {
pixel_position = size; pixel_position = size;
} }
inline void draw_pixels(uint8_t *const target, const int count, const uint8_t collision_identity)
{
int output_cursor = 0;
while(pixel_position && output_cursor < count)
{
target[output_cursor] |= collision_identity;
output_cursor++;
pixel_position--;
}
}
HorizontalRun() : pixel_position(0), size(1) {}
};
// missile state
struct Missile: public HorizontalRun {
bool enabled;
int copy_flags;
inline void draw_pixels(uint8_t *const target, const int count, const uint8_t collision_identity) inline void draw_pixels(uint8_t *const target, const int count, const uint8_t collision_identity)
{ {
if(!pixel_position) return; if(!pixel_position) return;
if(enabled) if(enabled)
{ {
int output_cursor = 0; HorizontalRun::draw_pixels(target, count, collision_identity);
while(pixel_position && output_cursor < count)
{
target[output_cursor] |= collision_identity;
output_cursor++;
pixel_position--;
}
} }
else else
{ {
skip_pixels(count); skip_pixels(count);
} }
} }
Missile() : enabled(false), copy_flags(0) {}
} missile_[2]; } missile_[2];
// ball state // ball state
struct Ball: public Object { struct Ball: public HorizontalRun {
bool enabled[2]; bool enabled[2];
int enabled_index; int enabled_index;
int size;
const int copy_flags = 0; const int copy_flags = 0;
int pixel_position;
inline void skip_pixels(int count)
{
pixel_position = std::max(0, pixel_position - count);
}
inline void reset_pixels()
{
pixel_position = size;
}
inline void draw_pixels(uint8_t *const target, const int count, const uint8_t collision_identity) inline void draw_pixels(uint8_t *const target, const int count, const uint8_t collision_identity)
{ {
if(!pixel_position) return; if(!pixel_position) return;
if(enabled[enabled_index]) if(enabled[enabled_index])
{ {
int output_cursor = 0; HorizontalRun::draw_pixels(target, count, collision_identity);
while(pixel_position && output_cursor < count)
{
target[output_cursor] |= collision_identity;
output_cursor++;
pixel_position--;
}
} }
else else
{ {
@ -270,7 +264,7 @@ class TIA {
} }
} }
Ball() : pixel_position(0), size(1), enabled_index(0) {} Ball() : enabled_index(0), enabled{false, false} {}
} ball_; } ball_;
// motion // motion