pbad->base.y = y;
pbad->base.xm = 1.3;
pbad->base.ym = 4.8;
+ pbad->old_base = pbad->base;
pbad->dir = LEFT;
pbad->seen = NO;
- timer_init(&pbad->timer);
+ timer_init(&pbad->timer,YES);
physic_init(&pbad->physic);
}
pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
+ if (pbad->dying != FALLING)
+ collision_swept_object_map(&pbad->old_base,&pbad->base);
+ if (pbad->base.y > screen->h)
+ pbad->base.alive = NO;
/* Bump into things horizontally: */
if (!pbad->dying)
{
- if (issolid( pbad->base.x - 1, (int) pbad->base.y))
+ if (issolid( pbad->base.x, (int) pbad->base.y + 16))
{
pbad->dir = RIGHT;
}
- else if (issolid( pbad->base.x + pbad->base.width-1, (int) pbad->base.y))
- {
+ else if (issolid( pbad->base.x + pbad->base.width, (int) pbad->base.y + 16))
+ {
pbad->dir = LEFT;
- }
+ }
}
/* Fall if we get off the ground: */
if (pbad->dying != FALLING)
{
- if (!issolid(pbad->base.x, pbad->base.y + 32) &&
- pbad->base.ym < MAX_YM)
+ if (!issolid(pbad->base.x+16, pbad->base.y + 32))
{
- pbad->base.ym = pbad->base.ym + GRAVITY;
+ if(!physic_is_set(&pbad->physic))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,2.);
+ }
+
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
}
else
{
pbad->base.y = (int)(pbad->base.y / 32) * 32;
pbad->base.ym = 0;
}
+ physic_init(&pbad->physic);
}
}
else
- pbad->base.ym = pbad->base.ym + GRAVITY;
+ {
+ if(!physic_is_set(&pbad->physic))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,2.);
+ }
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
if (pbad->base.y > screen->h)
pbad->base.alive = NO;
/* Move left/right: */
- if (pbad->mode != KICK && pbad->mode != HELD)
+ if (pbad->mode == NORMAL || pbad->mode == KICK)
{
if (pbad->dying == NO ||
pbad->dying == FALLING)
pbad->base.x = pbad->base.x - pbad->base.xm * frame_ratio;
}
}
- else if (pbad->mode == KICK)
- {
- /* Obsolete
- if (pbad->dir == RIGHT)
- pbad->base.x = pbad->base.x + 16;
- else if (pbad->dir == LEFT)
- pbad->base.x = pbad->base.x - 16;*/
- }
else if (pbad->mode == HELD)
{ /* FIXME: The pbad object shouldn't know about pplayer objects. */
/* If we're holding the laptop */
- if(tux.dir==RIGHT)
+ pbad->dir=tux.dir;
+ if(pbad->dir==RIGHT)
{
- pbad->base.x = tux.base.x - 16;
- pbad->base.y = tux.base.y - 8 - (tux.size*16);
+ pbad->base.x = tux.base.x + 16;
+ pbad->base.y = tux.base.y + tux.base.height/1.5 - pbad->base.height;
}
else /* facing left */
{
pbad->base.x = tux.base.x - 16;
- pbad->base.y = tux.base.y - 8 - (tux.size*16);
+ pbad->base.y = tux.base.y + tux.base.height/1.5 - pbad->base.height;
+ }
+ if(collision_object_map(&pbad->base))
+ {
+ pbad->base.x = tux.base.x;
+ pbad->base.y = tux.base.y + tux.base.height/1.5 - pbad->base.height;
}
if(tux.input.fire != DOWN) /* SHOOT! */
{
- pbad->dir=tux.dir;
+ if(pbad->dir == LEFT)
+ pbad->base.x -= 24;
+ else
+ pbad->base.x += 24;
+
pbad->mode=KICK;
pbad->base.ym-=8;
play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER);
if(pbad->mode != HELD)
pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
+ if (pbad->dying != FALLING)
+ collision_swept_object_map(&pbad->old_base,&pbad->base);
+ if (pbad->base.y > screen->h)
+ pbad->base.alive = NO;
+ /* Bump into things horizontally: */
+
/* Bump into things horizontally: */
if (!pbad->dying)
{
- if (issolid(pbad->base.x, pbad->base.y))
+ int changed = pbad->dir;
+ if (issolid( pbad->base.x, (int) pbad->base.y + 16))
{
- pbad->dir = !pbad->dir;
-
- if (pbad->mode == KICK)
- {
- /* handle stereo sound */
- /* FIXME: In theory a badguy object doesn't know anything about player objects */
- if (tux.base.x > pbad->base.x)
- play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
- else if (tux.base.x < pbad->base.x)
- play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
- else
- play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
- }
+ pbad->dir = RIGHT;
+ }
+ else if (issolid( pbad->base.x + pbad->base.width, (int) pbad->base.y + 16))
+ {
+ pbad->dir = LEFT;
}
+ if(pbad->mode == KICK && changed != pbad->dir)
+ {
+ /* handle stereo sound */
+ /* FIXME: In theory a badguy object doesn't know anything about player objects */
+ if (tux.base.x > pbad->base.x)
+ play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
+ else if (tux.base.x < pbad->base.x)
+ play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
+ else
+ play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
+ }
+
}
if (pbad->dying != FALLING)
{
- if (!issolid(pbad->base.x, pbad->base.y + 32) &&
- pbad->base.ym < MAX_YM)
+ if (!issolid(pbad->base.x+16, pbad->base.y + 32))
{
+ if(!physic_is_set(&pbad->physic))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,0.);
+ }
+
if(pbad->mode != HELD)
- pbad->base.ym = pbad->base.ym + GRAVITY;
+ {
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
}
else
{
pbad->base.y = (int)(pbad->base.y / 32) * 32;
pbad->base.ym = 0;
}
+ physic_init(&pbad->physic);
}
}
else
- pbad->base.ym = pbad->base.ym + GRAVITY;
+ {
+ if(!physic_is_set(&pbad->physic))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,0.);
+ }
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
+
- if (pbad->base.y > screen->h)
- pbad->base.alive = NO;
}
else if (pbad->kind == BAD_MONEY)
{
pbad->base.y = pbad->base.y + pbad->base.ym * frame_ratio;
- if(physic_get_state(&pbad->physic) == -1)
- physic_set_state(&pbad->physic,PH_VTU);
-
- if(issolid(pbad->base.x, pbad->base.y + 32))
- {
- physic_set_state(&pbad->physic,PH_VTU);
- pbad->base.ym = -0.6;
- }
- else if(issolid(pbad->base.x, pbad->base.y - 1))
- { /* This works, but isn't the best solution imagineable */
- pbad->base.ym = physic_get_velocity(&pbad->physic,-6.);
- }
- else
- {
- pbad->base.ym = physic_get_velocity(&pbad->physic,6.);
- }
+ if (pbad->dying != FALLING)
+ collision_swept_object_map(&pbad->old_base,&pbad->base);
if (pbad->base.y > screen->h)
pbad->base.alive = NO;
+
+ if(physic_get_state(&pbad->physic) == -1)
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,0.);
+ }
+
+ if (pbad->dying != FALLING)
+ {
+ if(issolid(pbad->base.x, pbad->base.y + 32))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,6.);
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
+ else if(issolid(pbad->base.x, pbad->base.y))
+ { /* This works, but isn't the best solution imagineable */
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,0.);
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ ++pbad->base.y;
+ }
+ else
+ {
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
+ }
+ else
+ {
+ if(!physic_is_set(&pbad->physic))
+ {
+ physic_set_state(&pbad->physic,PH_VT);
+ physic_set_start_vy(&pbad->physic,0.);
+ }
+ pbad->base.ym = physic_get_velocity(&pbad->physic);
+ }
}
else if (pbad->kind == -1)
{}
/* Handle mode timer: */
- if (pbad->mode == FLAT /* && bad_guys[1].mode != HELD*/)
+ if (pbad->mode == FLAT && pbad->mode != HELD)
{
if(!timer_check(&pbad->timer))
+ {
pbad->mode = NORMAL;
+ pbad->base.xm = 4;
+ }
+ }
+ else if (pbad->mode == KICK)
+ {
+ timer_check(&pbad->timer);
}
- /* else if (pbad->mode == KICK)
- {
- if (pbad->timer > 0)
- pbad->timer--;
- }*/
/* Handle dying timer: */
else if (pbad->kind == BAD_LAPTOP)
add_score(pbad->base.x - scroll_x, pbad->base.y,
25 * score_multiplier);
+ else if (pbad->kind == BAD_MONEY)
+ add_score(pbad->base.x - scroll_x, pbad->base.y,
+ 50 * score_multiplier);
/* Play death sound: */
play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
break;
case CO_BADGUY:
pbad_c = (bad_guy_type*) p_c_object;
- if (pbad->mode != FLAT)
- pbad->dir = !pbad->dir;
+ if (pbad->mode == NORMAL)
+ {
+ /* do nothing */
+ }
else
{
/* We're in kick mode, kill the other guy: */
add_score(pbad->base.x - scroll_x,
pbad->base.y, 100);
}
- pbad->dir = !pbad->dir;
break;
case CO_PLAYER:
pplayer_c = (player_type*) p_c_object;
- if (pbad->kind == BAD_BSOD)
+ if(pbad->kind != BAD_MONEY)
{
- pbad->dying = SQUISHED;
- timer_start(&pbad->timer,4000);
- pplayer_c->base.ym = -KILL_BOUNCE_YM;
+ if (pbad->kind == BAD_BSOD)
+ {
+ pbad->dying = SQUISHED;
+ timer_start(&pbad->timer,4000);
+ physic_set_state(&pplayer_c->vphysic,PH_VT);
+ physic_set_start_vy(&pplayer_c->vphysic,2.);
+ pplayer_c->base.y = pbad->base.y - pplayer_c->base.height;
- add_score(pbad->base.x - scroll_x, pbad->base.y,
- 50 * score_multiplier);
+ add_score(pbad->base.x - scroll_x, pbad->base.y,
+ 50 * score_multiplier);
- play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
- }
- else if (pbad->kind == BAD_LAPTOP)
- {
- if (pbad->mode != KICK)
+ play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
+ }
+ else if (pbad->kind == BAD_LAPTOP)
{
- /* Flatten! */
- play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
- pbad->mode = FLAT;
- pbad->base.xm = 4;
+ if (pbad->mode == NORMAL || pbad->mode == KICK)
+ {
+ /* Flatten! */
- timer_start(&pbad->timer,10000);
+ play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
+ pbad->mode = FLAT;
+ pbad->base.xm = 4;
- pplayer_c->base.y = pplayer_c->base.y - 32;
- }
- else
- {
- /* Kick! */
+ timer_start(&pbad->timer,10000);
- pbad->mode = KICK;
- play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
+ physic_set_state(&pplayer_c->vphysic,PH_VT);
+ physic_set_start_vy(&pplayer_c->vphysic,2.);
+ pplayer_c->base.y = pbad->base.y - pplayer_c->base.height;
+ }
+ else if (pbad->mode == FLAT)
+ {
+ /* Kick! */
- if (pplayer_c->base.x <= pbad->base.x)
- pbad->dir = RIGHT;
- else
- pbad->dir = LEFT;
+ play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
- timer_start(&pbad->timer,5000);
- }
+ if (pplayer_c->base.x <= pbad->base.x)
+ pbad->dir = RIGHT;
+ else
+ pbad->dir = LEFT;
- pplayer_c->base.ym = -KILL_BOUNCE_YM;
+ pbad->base.xm = 8;
- add_score(pbad->base.x - scroll_x,
- pbad->base.y,
- 25 * score_multiplier);
+ timer_start(&pbad->timer,5000);
+ }
- /* play_sound(sounds[SND_SQUISH]); */
+ physic_set_state(&pplayer_c->vphysic,PH_VT);
+ physic_set_start_vy(&pplayer_c->vphysic,2.);
+ pplayer_c->base.y = pbad->base.y - pplayer_c->base.height;
+
+ add_score(pbad->base.x - scroll_x,
+ pbad->base.y,
+ 25 * score_multiplier);
+
+ /* play_sound(sounds[SND_SQUISH]); */
+ }
+ score_multiplier++;
}
break;
}