U0 SaveAnim() { I64 i,j,d; I64 MaxData=AnimationLength* AnimationSize* AnimationSize*2; U8 *AnimData= ACAlloc(MaxData); CatPrint(AnimData,"%u %u ", AnimationLength, AnimationSize); I64 DocPos=StrLen(AnimData); for(i=0;i<AnimationLength;i++){ for(j=0;j<AnimationSize;j++){ for(d=0;d<AnimationSize;d++){ AnimData[DocPos++] = MStrPrint("%X",Frames[i][j][d])[0]; } } } AnimData[DocPos]=0; U8 *FileName; DirMk("~/TOSAnimations"); if(FileName=PopUpFileName("~/TOSAnimations/Anim1.VID.Z")); { FileWrite(FileName,AnimData,StrLen(AnimData)); } Free(AnimData); } I64 StrHex2I64(U8* str) { I64 sum = 0; Iterate: while('0'<= *str <='9') { sum = sum*10+ (*str-'0'); str++; } //Sometimes the parser randomly returns 5. if(*str==5) { str++; goto Iterate; } return sum; } U8 StrHex2U8(U8* str) { U8 sum = 0; U8 i; for(i=0; i<2; i++) { sum*=16; if(*str >= 'A') { sum+= (10 + *str - 'A'); } else { sum+= (*str - '0'); } str++; } return sum; } U0 LoadAnim() { U8 *FileName=PopUpPickFile("~/TOSAnimations"); U8 *LoadedData=FileRead(FileName); if(!LoadedData) return; U8 *progress=LoadedData; I64 AnimLen= StrHex2I64(progress); progress=StrFirstOcc(progress, " ")+1; I64 AnimSize= StrHex2I64(progress); progress=StrFirstOcc(progress, " "); if(AnimSize>200|| AnimLen>200|| AnimSize<2|| AnimLen<2) { Free(LoadedData); return; } AnimationSize=AnimSize; AnimationLength=AnimLen; I64 i,j,d; for(i=0;i<AnimationLength;i++){ for(j=0;j<AnimationSize;j++){ for(d=0;d<AnimationSize;d++){ Frames[i][j][d]=StrHex2U8(progress); progress++; } } } Frame=AnimationLength-1; Free(LoadedData); }