www.pudn.com > nucsrc > ANIM.C
/*============================================================================*/ /* PROJECT NUCLEUS. (c) RocSoft, 1995. */ /* v1.0 18 Jan 95. */ /*============================================================================*/ #include#include #include #include #include #include #include #include #include #include "\rocco\glib\games.h" #include #include #include #include #include "defines.h" #include "prototyp.h" #include "globals.h" extern int Logo_Control[14]; extern int Power_Up_Delay; /*================[ Functions For Background Replacement ]====================*/ void Colour_Cycle_Switcher( int page ) { unsigned char *buff=Pal.pal; showpage( page ); /* VR in progress on exit */ _asm { les bx, buff add bx, FRACTAL_CYCLE_COLOUR_1 mov cx, FRACTAL_CYCLE_COUNT add cx, 3 mov dx, 03C8H mov al, FRACTAL_COLOUR_REG_1 out dx, al inc dl Repeat: mov al, es:[bx] out dx, al inc bx loop Repeat } } /*===================[ Functions For AUTOMATON Control ]======================*/ int Beam_Mover( void *object, int *x, int *y ) { BEAM *b=Cfg.beams + ((OBJECT *)object)->pri - BEAM_TOON_BASE_PRI; *x = (b->x+=b->vx); if ( *x<0 || *x>VX_MAX ) { b->active = FALSE; return( DELETE_OBJECT ); } return( ACTIVE_OBJECT ); } int Counter_Mover( void *object, int *x, int *y ) { int i=((OBJECT *)object)->pri - COUNTER_TOON_BASE_PRI; NUCLEUS *n=Cfg.nuclei+i; SPRITE *s=Counter_Icons+n->cframe; *x = n->cx - (s->w>>1); *y = n->cy - (s->h>>1); return( ACTIVE_OBJECT ); } int Logo_Mover( void *object, int *x, int *y ) { OBJECT *o=object; int *pri=Logo_Control+o->pri; if( *pri ) { if ( o->pri<7 ) /* Top line */ { if ( (*y) LOGO_BL_Y ) (*y)--; else (*pri)++; } } if ( (*pri)==2 ) putimg( o->toon->img+o->idx,*x,*y,2 ); return( ((*pri)==3)?DELETE_OBJECT:ACTIVE_OBJECT ); } int Particle_Mover( void *object, int *x, int *y ) { OBJECT *o=object; int idx=o->pri-PARTICLE_TOON_BASE_PRI; PARTICLE *p=Cfg.particles+idx; SPRITE *s=SParticles+p->type; *x = p->x - (s->w>>1); *y = p->y - (s->h>>1); return( ACTIVE_OBJECT ); } int PowerUp_Mover( void *object, int *x, int *y ) { if ( (*x) > VX_MAX ) return( DELETE_OBJECT ); (*x)++; return( ACTIVE_OBJECT ); } int Rogue_Mover( void *object, int *x, int *y ) { OBJECT *o=object; int idx=o->pri-ROGUE_TOON_BASE_PRI; SPRITE *s=RogueParticles+o->idx; PARTICLE *p=Cfg.rogues+idx; *x = p->x - (s->w>>1); *y = p->y - (s->h>>1); return( ACTIVE_OBJECT ); } int Shield_Mover( void *object, int *x, int *y ) { SHIELD *s=Cfg.shields + ((OBJECT *)object)->pri - SHIELD_TOON_BASE_PRI; *x = s->x - s->rx; *y = s->y - s->ry; return( ACTIVE_OBJECT ); } int Syringe_Mover( void *object, int *x, int *y ) { OBJECT *o=object; IMAGE *i=o->toon->img+o->idx; switch( SyringeBase ) { case 0: /* Points to top left */ *x = MouseX; *y = MouseY; break; case 5: /* Points to top right */ *x = MouseX - i->w + 1; *y = MouseY; break; case 10: /* Points to bottom right */ *x = MouseX - i->w + 1; *y = MouseY - i->h + 1; break; default: /* Points to bottom left */ *x = MouseX; *y = MouseY - i->h + 1; } return( ACTIVE_OBJECT ); } /*========================[ MORPHING Functions ]=============================*/ int Beam_Morph( void *object, int *idx ) { BEAM *b=Cfg.beams + ((OBJECT *)object)->pri - BEAM_TOON_BASE_PRI; b->frame += (b->vx<0) ? -1 : 1; if ( b->frame<0 ) b->frame=NUM_OF_BEAMS-1; else if ( b->frame>=NUM_OF_BEAMS ) b->frame=0; *idx = b->frame; return( ACTIVE_OBJECT ); } int Counter_Morph( void *object, int *idx ) { int i=((OBJECT *)object)->pri - COUNTER_TOON_BASE_PRI; if ( (*idx=Cfg.nuclei[i].cframe)==0 ) { if ( Lev->time_meltdown ) Meltdown=TIME_MELTDOWN; } return( ACTIVE_OBJECT ); } int PowerUp_Morph( void *object, int *idx ) { if ( (++Power_Up_Delay) >= POWER_UP_FRAME_DELAY ) { Power_Up_Delay = 0; if ( (*idx)>=8 ) { if ( (++(*idx)) >= 16 ) *idx=8; } else { if ( (++(*idx)) >= 8 ) *idx=0; } } return( ACTIVE_OBJECT ); } int Rogue_Morph( void *object, int *idx ) { PARTICLE *p = Cfg.rogues + ((OBJECT *)object)->pri - ROGUE_TOON_BASE_PRI; if ( p->time==0 ) { p->rogue = FALSE; return( DELETE_OBJECT ); } if ( (++(p->delay))>=ROGUE_FRAME_DELAY ) { p->delay=0; if ( (++(p->frame))>=NUM_OF_ROGUE_PARTICLES ) p->frame=0; *idx = p->frame; } return( ACTIVE_OBJECT ); } int Shield_Morph( void *object, int *idx ) { SHIELD *s=Cfg.shields + ((OBJECT *)object)->pri - SHIELD_TOON_BASE_PRI; if ( !s->time ) { s->active = FALSE; return( DELETE_OBJECT ); } if ( s->frame < NUM_OF_SHIELDS-2 ) { if ( (++(s->reps)) >= SHIELD_GROWTH_REPS ) { s->reps = 0; (s->frame)++; s->rx = Shield_Icons[s->frame].w>>1; s->ry = Shield_Icons[s->frame].h>>1; } } else { if ( s->reps++ ) { s->frame^=0x01; s->reps =0; } } *idx = s->frame; return( ACTIVE_OBJECT ); } int Syringe_Morph( void *object, int *idx ) { static char delay=0; int x1,y1,x2,y2; if ( SyringeDir != 0 ) { if ( delay--==0 ) { delay = 1; if ( SyringeOffset+SyringeDir < 0 ) SyringeDir=0; else if ( SyringeOffset+SyringeDir >= SYRINGE_FRAMES ) SyringeDir=-SyringeDir; SyringeOffset += SyringeDir; } } switch( SyringeBase ) { case 0: x2 = (x1=MouseX) + SYRINGE_THRESHOLD - 1; y2 = (y1=MouseY) + SYRINGE_THRESHOLD - 1; break; case 5: x1 = (x2=MouseX) - SYRINGE_THRESHOLD + 1; y2 = (y1=MouseY) + SYRINGE_THRESHOLD - 1; break; case 10: x1 = (x2=MouseX) - SYRINGE_THRESHOLD + 1; y1 = (y2=MouseY) - SYRINGE_THRESHOLD + 1; break; default: x2 = (x1=MouseX) + SYRINGE_THRESHOLD - 1; y1 = (y2=MouseY) - SYRINGE_THRESHOLD + 1; } if ( x1 VX_MAX || y2>VY_MAX ) { if ( MouseY < VY_MAX-SYRINGE_THRESHOLD ) SyringeBase = (MouseX > VX_MIN+SYRINGE_THRESHOLD) ? 5 : 0; else SyringeBase = (MouseX > VX_MIN+SYRINGE_THRESHOLD) ? 10 : 15; } *idx = SyringeBase+SyringeOffset; return( ACTIVE_OBJECT ); } /*==========================[ End Of Source File ]===========================*/