diff --git a/main.ras b/main.ras index a21704d..df33ed4 100644 --- a/main.ras +++ b/main.ras @@ -1,12 +1,39 @@ program MyProgram; var - x,y: byte; - aux: integer; - // sprite_x is an integer since x values range between 0 and 320 - sprite_x : integer = 160; - sprite_y : byte = 100; - player_x : byte = 110; - player_dir:byte = $ff; + x,y: byte; + b0,b1,b2: byte; + i: integer; + etick:byte; + eticknext:byte; + anim:byte; + anif:byte; + pow:byte; + pownext:byte; + + first_key:byte; + score:integer; + hiscore:integer; + power:integer; + +//Enemy + ex:array [3] of byte; + ey:array [3] of byte; + ef:array [3] of byte; + ei:byte; + +//Shoot + dx:array [3] of byte; + dy:array [3] of byte; + df:array [3] of byte; + di:byte; +//Power + px:byte; + py:byte; + pf:byte; + +// Player info + player_x : byte; + player_dir:byte; // joystick_dir is used to display either left or right-pointing sprite joystick_dir : byte; // sprite location is where we keep the sprite in the memory. @@ -27,9 +54,41 @@ @define useBank 0 // Include the sprite binary file. The original // image is located under sprites/sprites.flf - sprites:incbin("sprites.bin", @spriteLoc); +// Initializes the program (one time) +procedure InitProgram(); +begin + hiscore:=0; +end; + +// Initializes the game (once per game match) +procedure InitGame(); +begin + first_key:=0; + score:=0; + power:=0; + player_x:=110; + player_dir:= $ff; + di:=0; + ei:=0; + for b0:=0 to 3 do begin + ex[b0]:=0; + ey[b0]:=0; + ef[b0]:=0; + dx[b0]:=0; + dy[b0]:=0; + df[b0]:=0; + end; + etick:=0; + eticknext:=200; + anim:=0; + anif:=0; + pow:=0; + pownext:=110+(random()/2); + px:=0;py:=0;pf:=0; +end; + // This method initializes the screen procedure InitScreen(); var c,s:pointer; @@ -79,7 +138,7 @@ sprite_color[@spr_powerup]:=yellow; // Player sprite behind chars spr_priority:= ^$D01B; - spr_priority[0]:=1; + spr_priority[0]:=%01110001; // Player constant height sprite_pos[1]:=220; // Turn on sprite 0 (or @useSprite) @@ -96,18 +155,23 @@ end; // This method is called one time per raster cycle -procedure UpdateSprite(); +procedure Frame(); var pressing:byte; begin if player_dir=0 then - inc(player_x) else + player_x:=player_x+2 else if player_dir=1 then - dec(player_x); + player_x:=player_x-2; if keypressed(key_space) = 1 then begin if pressing=0 then begin + if first_key=0 then begin + moveto(2,1,hi(screen_char_loc)); + printstring(" ",0,40); + first_key:=1; + end; pressing:=1; if player_dir=0 then begin player_dir:=1; @@ -116,12 +180,92 @@ player_dir:=0; SetSpriteLoc(@spr_player, @spriteNumBase+2, @useBank); end; + di:=di+1; + if di>=3 then + di:=0; + df[di]:=1; + dx[di]:=player_x; + dy[di]:=210; + PlaySound(sid_channel1, + 13, // Volume + 200, // Hi byte frequency + 0*16+0, // Attack voice 1 + 3*16 + 3, // Sustain = 16*15 + release=6 + 1 +sid_noise, // Waveform + sid_noise); // waveform end; end else pressing:=0; if player_x>220 then player_x := 4; if player_x<4 then player_x := 220; - sprite_pos[0]:=player_x; +// Enemy deploy + etick:=etick+1; + if etick >= eticknext then begin + etick:=0; + eticknext:=eticknext-5; + ei:=ei+1; + if ei>=3 then + ei:=0; + ef[ei]:=1; + ex[ei]:=Random(); + if ex[ei]<20 then ex[ei]:=20; + if ex[ei]>200 then ex[ei]:=200; + ey[ei]:=20; + end; +// Enemy animation + anim:=anim+1; + if anim>4 then begin + anim:=0; + if anif=0 then + anif:=1 + else + anif:=0; + SetSpriteLoc(@spr_e1, @spriteNumBase+3+anif, @useBank); + SetSpriteLoc(@spr_e2, @spriteNumBase+3+anif, @useBank); + SetSpriteLoc(@spr_e3, @spriteNumBase+3+anif, @useBank); + end; +//Power deploy + if pf:=0 then pow:=pow+1; + if pow>0 then begin //pownext then begin + pow:=0; + pownext:=110;//+(random()/2); + pf:=1; + px:=Random(); + if px<20 then px:=20; + if px>200 then px:=200; + py:=60; + end; + +// Hardware Update + sprite_pos[0]:=player_x; + for b0:=0 to 3 do begin + b1:=8+(b0*2); + if df[b0]=0 then + sprite_pos[b1]:=0 + else begin + sprite_pos[b1]:=dx[b0]; + sprite_pos[b1+1]:=dy[b0]; + dy[b0]:=dy[b0]-5; + if dy[b0]<15 then df[b0]:=0; + end; + b1:=2+(b0*2); + if ef[b0]=0 then + sprite_pos[b1]:=0 + else begin + sprite_pos[b1]:=ex[b0]; + sprite_pos[b1+1]:=ey[b0]; + ey[b0]:=ey[b0]+1; + if ey[b0]>245 then ef[b0]:=0; + end; + end; + if pf:=0 then + sprite_pos[14]:=0; + begin + sprite_pos[14]:=px; + sprite_pos[15]:=py; + py:=py+2; + if py>245 then pf:=0; + end; /* moveto(1,23,hi(screen_char_loc)); printstring("JOYSTICK IN PORT 2 TO MOVE",0,40); @@ -159,12 +303,14 @@ // Update joystick here Joystick(@joystickPort); // Update sprites - UpdateSprite(); + Frame(); closeirq(); end; // Main program begin + InitProgram(); + InitGame(); InitScreen(); InitSprites(); StartRasterChain(MainRaster(),0,1); diff --git a/sprites.flf b/sprites.flf index 146c08d..6d26eec 100644 --- a/sprites.flf +++ b/sprites.flf Binary files differ