//-------------------------------------------------------------------------- // File: Animotion.c // Author: Laurent Pontet (known as THE HPMAN) // Date: July 31, 1999 // Description: AniMotion Library C source file. // Copyright (C) 1999 THE HPMAN //-------------------------------------------------------------------------- #include "animotion.h" void AMDraw(AniMotion *AM) {if(AM->AutoCount==TRUE) {if(AM->Count>0) AM->Count--; else AMNextFrame(AM); } //############### You can only change the following line ############### GsSortSprite(&(AM->Sprite),&OrderingTable[GsActiveBuffer],0); //####################################################################### } void AMMove(AniMotion *AM,u_int X,u_int Y) {(AM->Sprite).x+=X; (AM->Sprite).y+=Y; } u_int AMSetMove(AniMotion *AM,u_int ID) {u_int i; if((AM->ActualMove)->ID==ID) return(AM_SUCCESS); for(i=0;iUsedMoves;i++) {if((AM->Move)[i].ID==ID) {AM->ActualMove=&(AM->Move)[i]; AM->ActualFrame=0; AMSetFrameOnSprite(AM); return(AM_SUCCESS); } } return(AM_NO_SUCH_MOVE); } u_int AMGetActualMove(AniMotion *AM) {return((AM->ActualMove)->ID);} void AMNextFrame(AniMotion *AM) {if((AM->ActualMove)->Mode==AM_LOOP_STRAIGHT) {if(AM->ActualFrame==((AM->ActualMove)->NbFrames)-1) AM->ActualFrame=0; else AM->ActualFrame++; } else {if((AM->ActualMove)->Way==AM_INCREASING) if(AM->ActualFrame==((AM->ActualMove)->NbFrames)-1) {AM->ActualFrame--; (AM->ActualMove)->Way=AM_DECREASING; } else AM->ActualFrame++; else if(AM->ActualFrame==0) {AM->ActualFrame++; (AM->ActualMove)->Way=AM_INCREASING; } else AM->ActualFrame--; } AMSetFrameOnSprite(AM); } void AMSetFrameOnSprite(AniMotion *AM) { #ifndef TPageCalculate AM->Count=(AM->ActualMove)->Cluts[AM->ActualClut].Count; (AM->Sprite).u=(AM->ActualMove)->Cluts[AM->ActualClut].XOffset; (AM->Sprite).v=(AM->ActualMove)->Cluts[AM->ActualClut].YOffset; #else u_int OffX,OffY,TPageX,TPageY; AM->Count=(AM->ActualMove)->Frames[AM->ActualFrame].Count; OffX=(AM->ActualMove)->Frames[AM->ActualFrame].XOffset; OffY=(AM->ActualMove)->Frames[AM->ActualFrame].YOffset; TPageX=AM->DefaultTPageX; TPageY=AM->DefaultTPageY; switch(AM->TPageMode) {case TPage4Bit: while(OffX>=256) {OffX-=256; TPageX+=64;} break; case TPage8Bit: while(OffX>=128) {OffX-=128; TPageX+=64;} break; case TPage16Bit: while(OffX>=64) {OffX-=64; TPageX+=64;} break; } if(OffY>=256) {OffY-=256; TPageY+=256;} (AM->Sprite).u=OffX; (AM->Sprite).v=OffY; (AM->Sprite).tpage=GetTPage(AM->TPageMode,0,TPageX,TPageY); #endif } void AMSetSize(AniMotion *AM,u_short w,u_short h) {(AM->Sprite).w=w; (AM->Sprite).h=h; } void AMSetLocation(AniMotion *AM,short x,short y) {(AM->Sprite).x=x; (AM->Sprite).y=y; } void AMSetTexture(AniMotion *AM,GsIMAGE *i) {SpriteDefTexture(&(AM->Sprite),i); AM->TPageMode=i->pmode; #ifdef TPageCalculate AM->DefaultTPageX=i->px; AM->DefaultTPageY=i->py; AM->InitialTPage=(AM->Sprite).tpage; #endif } void AMInit(AniMotion *AM) {SpriteToDummy(&(AM->Sprite)); AM->AutoCount=TRUE; } void AMSetAutoCount(AniMotion *AM,BOOL mode) {AM->AutoCount=mode;} void AMLoadAMB(AniMotion *AM,u_long *adresse) {int i,j; u_int pos=0; #ifdef TPageCalculate u_short *Data; Data=(u_short *)adresse; #else u_char *Data; Data=(u_char *)adresse; #endif AM->UsedMoves=Data[pos++]; for(i=0;iUsedMoves;i++) //For each Move {AM->Move[i].ID=Data[pos++]; AM->Move[i].Mode=Data[pos++]; AM->Move[i].NbFrames=Data[pos++]; //printf("Id : %d NbCluts : %d\n",AM->Move[i].ID,AM->Move[i].NbCluts); for(j=0;jMove[i].NbFrames;j++) //For each Clut {AM->Move[i].Frames[j].XOffset=Data[pos++]; AM->Move[i].Frames[j].YOffset=Data[pos++]; AM->Move[i].Frames[j].Count=Data[pos++]; //printf("X : %d Y : %d Count : %d\n",AM->Move[i].Cluts[j].XOffset,AM->Move[i].Cluts[j].YOffset,AM->Move[i].Cluts[j].Count); } } }