Fix compilation and refactor GetFrameImage

This commit is contained in:
Ted John 2017-03-12 12:28:35 +00:00
parent cd54503bdb
commit 481f5d706f
5 changed files with 42 additions and 15 deletions

View File

@ -181,18 +181,14 @@ void misc_paint(rct_sprite *misc, sint32 imageDirection)
break;
}
case SPRITE_MISC_DUCK: // 8
{
if (dpi->zoom_level != 0) {
return;
case SPRITE_MISC_DUCK:
if (dpi->zoom_level == 0) {
rct_duck * duck = &misc->duck;
uint32 imageId = duck_get_frame_image(&misc->duck, imageDirection);
if (imageId != 0) {
sub_98196C(imageId, 0, 0, 1, 1, 0, duck->z, get_current_rotation());
}
}
rct_duck duck = misc->duck;
uint8 imageOffset = DuckAnimations[duck.state][duck.frame];
uint32 imageId = 23133 + (imageOffset * 4) + (imageDirection / 8);
sub_98196C(imageId, 0, 0, 1, 1, 0, duck.z, get_current_rotation());
break;
}
}
}

View File

@ -535,6 +535,13 @@ static const sint32 Unk9A39C4[] = {
1946281152,
};
static const rct_xy16 AvoidCollisionMoveOffset[] = {
{ -1, 0 },
{ 0, 1 },
{ 1, 0 },
{ 0, -1 },
};
static bool vehicle_move_info_valid(sint32 cd, sint32 typeAndDirection, sint32 offset)
{
if (cd >= countof(gTrackVehicleInfo)) {
@ -7123,8 +7130,8 @@ static bool vehicle_update_motion_collision_detection(
uint32 offsetSpriteDirection = (vehicle->sprite_direction + 4) & 31;
uint32 offsetDirection = offsetSpriteDirection >> 3;
uint32 next_x_diff = abs(x + DuckMoveOffset[offsetDirection].x - collideVehicle->x);
uint32 next_y_diff = abs(y + DuckMoveOffset[offsetDirection].y - collideVehicle->y);
uint32 next_x_diff = abs(x + AvoidCollisionMoveOffset[offsetDirection].x - collideVehicle->x);
uint32 next_y_diff = abs(y + AvoidCollisionMoveOffset[offsetDirection].y - collideVehicle->y);
if (next_x_diff + next_y_diff < x_diff + y_diff){
mayCollide = true;

View File

@ -659,6 +659,8 @@ enum {
SPR_RIDE_DESIGN_PREVIEW_MAZE_ICE_BLOCKS = 21992,
SPR_RIDE_DESIGN_PREVIEW_MAZE_WOODEN_FENCES = 21993,
SPR_DUCK = 23133,
SPR_NEXT_WEATHER = 23189,
SPR_WEATHER_SUN = 23190,
SPR_WEATHER_SUN_CLOUD = 23191,

View File

@ -16,6 +16,7 @@
#include "../core/Math.hpp"
#include "../core/Util.hpp"
#include "../sprites.h"
extern "C"
{
@ -32,10 +33,11 @@ enum DUCK_STATE
SWIM,
DRINK,
DOUBLE_DRINK,
FLY_AWAY
FLY_AWAY,
};
constexpr sint32 DUCK_MAX_STATES = 5;
static const rct_xy16 DuckMoveOffset[4] =
static const rct_xy16 DuckMoveOffset[] =
{
{ -1, 0 },
{ 0, 1 },
@ -298,6 +300,18 @@ void rct_duck::UpdateFlyAway()
}
}
uint32 rct_duck::GetFrameImage(sint32 direction) const
{
uint32 imageId = 0;
if (state < DUCK_MAX_STATES)
{
// TODO check frame is in range
uint8 imageOffset = DuckAnimations[state][frame];
imageId = SPR_DUCK + (imageOffset * 4) + (direction / 8);
}
return imageId;
}
extern "C"
{
void create_duck(sint32 targetX, sint32 targetY)
@ -376,4 +390,9 @@ extern "C"
}
}
}
uint32 duck_get_frame_image(const rct_duck * duck, sint32 direction)
{
return duck->GetFrameImage(direction);
}
}

View File

@ -168,6 +168,7 @@ typedef struct rct_duck {
void UpdateDrink();
void UpdateDoubleDrink();
void UpdateFlyAway();
uint32 GetFrameImage(sint32 direction) const;
void Invalidate();
void Remove();
void MoveTo(sint16 x, sint16 y, sint16 z);
@ -453,6 +454,7 @@ void create_duck(sint32 targetX, sint32 targetY);
void duck_update(rct_duck *duck);
void duck_press(rct_duck *duck);
void duck_remove_all();
uint32 duck_get_frame_image(const rct_duck * duck, sint32 direction);
///////////////////////////////////////////////////////////////
// Money effect
@ -471,3 +473,4 @@ void crash_splash_update(rct_crash_splash *splash);
const char *sprite_checksum();
#endif