(* This program does not work anymore, because it uses the old sprite routines with 16x16 sprites. It is only included for historical reasons. *) program XmasAnimation; uses sprites; type PictData = record magic, mode:integer; palette: array [0..15] of integer; pixeldata: array [0..31999] of integer; end; Sprite = record x,y:integer; oldX,oldY:integer; xdelta,ydelta:integer; curFrame:integer; frameCount:integer; frameTime:integer; frameLeft:integer; changed:boolean; frame:array [0..3] of SpritePixels; end; var pic:PictData; filename:string; infile:file; ch:char; santaSprite: Sprite; deerSprite: Sprite; ohDeerSprite: Sprite; rudolfSprite: Sprite; smokeSprite: Sprite; procedure WaitVSync; external; procedure loadPalette(var pic:PictData); var i:integer; begin for i := 0 to 15 do setpalette(i, pic.palette[i]); end; procedure showPic(var pic:PictData); begin PutScreen(pic.pixeldata); end; procedure loadSpriteFrame(var aSprite:Sprite;spriteIndex:integer; var sheetFile:file;sheetIndex:integer); begin seek(sheetFile, 8 + sheetIndex * 128); read(sheetFile, aSprite.frame[spriteIndex]); if aSprite.frameCount <= spriteIndex then aSprite.frameCount := spriteIndex + 1; aSprite.curFrame := 0; writeln('loaded sprite frame ', spriteIndex, ' from ', sheetIndex); end; procedure animateSprite(var aSprite:Sprite); var frameIndex:integer; frameTime,frameLeft:integer; ydelta:integer; oldX,oldY:integer; begin ydelta := aSprite.ydelta; frameIndex := aSprite.curFrame; frameTime := aSprite.frameTime; frameLeft := aSprite.frameLeft; oldX := aSprite.x; oldY := aSprite.y; aSprite.oldX := oldX; aSprite.oldY := oldY; frameLeft := frameLeft - 1; if frameLeft <= 0 then begin frameIndex := frameIndex + 1; frameLeft := aSprite.frameTime; aSprite.frameLeft := frameLeft; aSprite.curFrame := frameIndex; if frameIndex >= aSprite.frameCount then aSprite.curFrame := 0; if frameIndex = 1 then begin ydelta := - ydelta; aSprite.ydelta := ydelta; end; aSprite.y := aSprite.y + ydelta; end; aSprite.frameLeft := frameLeft; aSprite.x := aSprite.x + aSprite.xdelta; if aSprite.x > 620 then aSprite.x := 0; end; procedure animate; var i:integer; ydelta:integer; frameIndex:integer; frameTime:integer; oldX,oldY:integer; begin santaSprite.x := 0; santaSprite.y := 60; santaSprite.frameTime := 10; santaSprite.xdelta := 2; santaSprite.ydelta := 1; smokeSprite.x := 434; smokeSprite.y := 252; smokeSprite.frameTime := 20; deerSprite.x := 18; deerSprite.y := 60; deerSprite.frameTime := 10; deerSprite.xdelta := 2; deerSprite.ydelta := 1; ohDeerSprite.x := 33; ohDeerSprite.y := 61; ohDeerSprite.frameTime := 10; ohDeerSprite.xdelta := 2; ohDeerSprite.ydelta := 1; rudolfSprite.x := 49; rudolfSprite.y := 60; rudolfSprite.frameTime := 10; rudolfSprite.xdelta := 2; rudolfSprite.ydelta := 1; ydelta := 1; frameTime := santaSprite.frameTime; while not ConAvail do begin frameIndex := santaSprite.curFrame; oldX := santaSprite.x; oldY := santaSprite.y; PutSprite(oldX, oldY, santaSprite.frame[frameIndex]); i := i + 1; frameTime := frameTime - 1; if frameTime = 0 then begin frameTime := santaSprite.frameTime; santaSprite.curFrame := frameIndex + 1; if frameIndex >= santaSprite.frameCount then santaSprite.curFrame := 0; if frameIndex = 0 then ydelta := - ydelta; santaSprite.y := santaSprite.y + ydelta; end; santaSprite.x := santaSprite.x + 2; if santaSprite.x > 620 then santaSprite.x := 0; PutSprite(deerSprite.x, deerSprite.y, deerSprite.frame[deerSprite.curFrame]); PutSprite(ohDeerSprite.x, ohDeerSprite.y, ohDeerSprite.frame[ohDeerSprite.curFrame]); PutSprite(rudolfSprite.x, rudolfSprite.y, rudolfSprite.frame[rudolfSprite.curFrame]); PutSprite(smokeSprite.x, smokeSprite.y, smokeSprite.frame[smokeSprite.curFrame]); animateSprite(deerSprite); animateSprite(ohDeerSprite); animateSprite(rudolfSprite); animateSprite(smokeSprite); Delay(10); WaitVSync; UndrawSprite(oldX, oldY, pic.pixeldata); UndrawSprite(deerSprite.oldX, deerSprite.oldY, pic.pixeldata); UndrawSprite(ohDeerSprite.oldX, ohDeerSprite.oldY, pic.pixeldata); UndrawSprite(rudolfSprite.oldX, rudolfSprite.oldY, pic.pixeldata); UndrawSprite(smokeSprite.oldX, smokeSprite.oldY, pic.pixeldata); end; end; begin filename := 'background.pict'; open(infile, filename, ModeReadonly); read(infile, pic); close(infile); writeln('magic: ', pic.magic, ' mode:', pic.mode); loadPalette(pic); showPic(pic); open(infile, 'sprites.sprt', ModeReadOnly); loadSpriteFrame(santaSprite, 0, infile, 0); loadSpriteFrame(santaSprite, 1, infile, 1); loadSpriteFrame(deerSprite, 0, infile, 5); loadSpriteFrame(deerSprite, 1, infile, 6); loadSpriteFrame(deerSprite, 2, infile, 7); loadSpriteFrame(ohDeerSprite, 0, infile, 7); loadSpriteFrame(ohDeerSprite, 1, infile, 5); loadSpriteFrame(ohDeerSprite, 2, infile, 6); loadSpriteFrame(rudolfSprite, 0, infile, 3); loadSpriteFrame(rudolfSprite, 1, infile, 4); loadSpriteFrame(rudolfSprite, 2, infile, 2); loadSpriteFrame(smokeSprite, 0, infile, 8); loadSpriteFrame(smokeSprite, 1, infile, 9); loadSpriteFrame(smokeSprite, 2, infile, 10); loadSpriteFrame(smokeSprite, 3, infile, 11); close(infile); animate; end.