Integrate duck frames

This commit is contained in:
Marijn van der Werf 2016-08-13 12:23:54 +02:00
parent 30fd2160d7
commit ac070103b1
3 changed files with 47 additions and 22 deletions

View File

@ -33,6 +33,8 @@ const uint32 vehicle_particle_base_sprites[] = {
22577, 22589, 22601, 22613, 22625
};
extern const uint8 * duck_animations[];
/**
* rct2: 0x00672AC9
*/
@ -188,8 +190,7 @@ void misc_paint(rct_sprite *misc, int imageDirection)
rct_duck duck = misc->duck;
uint32 stateAddress = RCT2_ADDRESS(0x97F058, uint32)[duck.state];
uint8 imageOffset = RCT2_ADDRESS(stateAddress, uint8)[duck.var_26];
uint8 imageOffset = duck_animations[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

@ -43,15 +43,39 @@ static const rct_xy16 duck_move_offset[] = {
{ 0, -1 }
};
/** rct2: 0x0097F06C */
static const uint8 duck_fly_to_water_animation[] = {
8, 9, 10, 11, 12, 13
};
/** rct2: 0x0097F072 */
static const uint8 duck_swim_animation[] = {
0
};
// rct2: 0x0097F073
static const uint8 duck_drink_animation[] = {
1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 255
1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0xFF
};
// rct2: 0x0097F08C
static const uint8 duck_double_drink_animation[] = {
4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6,
6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 0, 0, 0, 0, 255
6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 0, 0, 0, 0, 0xFF
};
/** rct2: 0x0097F0B4 */
static const uint8 duck_fly_away_animation[] = {
8, 9, 10, 11, 12, 13
};
/** rct2: 0x0097F058 */
const uint8 * duck_animations[] = {
duck_fly_to_water_animation, // DUCK_STATE_FLY_TO_WATER
duck_swim_animation, // DUCK_STATE_SWIM
duck_drink_animation, // DUCK_STATE_DRINK
duck_double_drink_animation, // DUCK_STATE_DOUBLE_DRINK
duck_fly_away_animation, // DUCK_STATE_FLY_AWAY
};
/**
@ -90,7 +114,7 @@ void create_duck(int targetX, int targetY)
sprite->duck.sprite_direction = direction << 3;
sprite_move(targetX, targetY, 496, sprite);
sprite->duck.state = DUCK_STATE_FLY_TO_WATER;
sprite->duck.var_26 = 0;
sprite->duck.frame = 0;
}
}
@ -133,9 +157,9 @@ static void duck_update_fly_to_water(rct_duck *duck)
if (gCurrentTicks & 3)
return;
duck->var_26++;
if (duck->var_26 >= 6)
duck->var_26 = 0;
duck->frame++;
if (duck->frame >= countof(duck_fly_to_water_animation))
duck->frame = 0;
duck_invalidate(duck);
int manhattanDistance = abs(duck->target_x - duck->x) + abs(duck->target_y - duck->y);
@ -160,7 +184,7 @@ static void duck_update_fly_to_water(rct_duck *duck)
if (waterHeight >= duck->z)
z += 4;
duck->var_26 = 1;
duck->frame = 1;
} else {
z = duck->z;
}
@ -172,7 +196,7 @@ static void duck_update_fly_to_water(rct_duck *duck)
duck_update_fly_away(duck);
} else {
duck->state = DUCK_STATE_SWIM;
duck->var_26 = 0;
duck->frame = 0;
duck_update_swim(duck);
}
}
@ -191,11 +215,11 @@ static void duck_update_swim(rct_duck *duck)
if ((randomNumber & 0xFFFF) < 0x666) {
if (randomNumber & 0x80000000) {
duck->state = DUCK_STATE_DOUBLE_DRINK;
duck->var_26 = -1;
duck->frame = -1;
duck_update_double_drink(duck);
} else {
duck->state = DUCK_STATE_DRINK;
duck->var_26 = -1;
duck->frame = -1;
duck_update_drink(duck);
}
return;
@ -246,10 +270,10 @@ static void duck_update_swim(rct_duck *duck)
*/
static void duck_update_drink(rct_duck *duck)
{
duck->var_26++;
if (duck_drink_animation[duck->var_26] == 255) {
duck->frame++;
if (duck_drink_animation[duck->frame] == 0xFF) {
duck->state = DUCK_STATE_SWIM;
duck->var_26 = 0;
duck->frame = 0;
duck_update_swim(duck);
} else {
duck_invalidate(duck);
@ -262,10 +286,10 @@ static void duck_update_drink(rct_duck *duck)
*/
static void duck_update_double_drink(rct_duck *duck)
{
duck->var_26++;
if (duck_double_drink_animation[duck->var_26] == 255) {
duck->frame++;
if (duck_double_drink_animation[duck->frame] == 0xFF) {
duck->state = DUCK_STATE_SWIM;
duck->var_26 = 0;
duck->frame = 0;
duck_update_swim(duck);
} else {
duck_invalidate(duck);
@ -281,9 +305,9 @@ static void duck_update_fly_away(rct_duck *duck)
if (gCurrentTicks & 3)
return;
duck->var_26++;
if (duck->var_26 >= 6)
duck->var_26 = 0;
duck->frame++;
if (duck->frame >= countof(duck_fly_away_animation))
duck->frame = 0;
duck_invalidate(duck);
int direction = duck->sprite_direction >> 3;

View File

@ -148,7 +148,7 @@ typedef struct rct_duck {
uint8 pad_16[0x8];
uint8 sprite_direction; // 0x1E
uint8 pad_1F[0x7];
uint16 var_26;
uint16 frame;
uint8 pad_28[0x8];
sint16 target_x; // 0x30
sint16 target_y; // 0x32