-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X VAR wont_fit : BOOLEAN; X BEGIN X Move_Down := FALSE; X IF greebie.y_pos < grid_length THEN`20 X BEGIN X sm_no := binshape`5Bgreebie.shape`5D.sm_no`5Bgreebie.rot`5D; X wont_fit := Check_move( 0,1,sm_no,greebie.x_pos,greebie.y_pos ); X IF NOT( wont_fit ) THEN X BEGIN X PutShape( Greebie, s_clear ); X Greebie.y_pos := Greebie.y_pos + 1; X PutShape( Greebie, s_draw ); X Move_Down := TRUE; X END; X END; X END; X X`7B************************************************************************* V**** X** ReDraw_Grid X** X** Redraws the characters inside the playfield X`7D X PROCEDURE ReDraw_Grid; X VAR x, y : INTEGER; X line : VARYING`5B 255 `5D OF CHAR; X BEGIN X FOR y := 1 TO grid_length DO X BEGIN X Posn(x_offset+1, y_offset+y ); X line := ''; X FOR x := 1 TO grid_width DO X IF grid`5Bx,y`5D <> ' ' THEN`20 X line := line + inv+grid`5Bx,y`5D+nml X ELSE X line := line + ' '; X QIO_Write( line ); X END; X X END; X X X`7B************************************************************************* V**** X** ZapGridLine X** X**`20 X`7D X PROCEDURE ZapGridLine( lineno : INTEGER ); X VAR x,i : INTEGER; X l1,l2 : VARYING`5Bgrid_width`5D OF CHAR; X b : BOOLEAN; X BEGIN X l1 := ''; l2 := ''; X FOR x := 1 TO grid_width DO BEGIN X l1 := l1 + '#'; X l2 := l2 + '%'; X END; X b := TRUE;`20 X FOR i := 1 TO 10 DO BEGIN X Posn(x_offset+1, y_offset+lineno ); X IF b THEN X QIO_Write( l1 ) X ELSE X QIO_Write( l2 ); X b := NOT( b ); X Sleep( 0, 0.03 ); `20 X END; X END; X`7B************************************************************************* V**** X** Remove_Line X** X** Removes a line of chars from grid and moves the lines above it down one. X`7D X PROCEDURE Remove_Line( line : INTEGER ); X VAR x,y : INTEGER; X BEGIN X ZapGridLine( line ); X FOR y := line DOWNTO 2 DO`20 X FOR x := 1 TO grid_width DO X grid`5Bx,y`5D := grid`5Bx,y-1`5D; X END; X X`7B************************************************************************* V**** X** Show_Target X** X** How many lines till the end of the stage !! X`7D XPROCEDURE Show_Target; XVAR targ, len : INTEGER; XBEGIN X WITH wow DO BEGIN X IF linecount > lines_target THEN`20 X targ := 0`20 X ELSE X targ := lines_target - linecount; X END; X IF targ > 99 THEN`20 X len := 3 X ELSE X len := 2; X Posn( 35, 9 ); QIO_Write( ' '+UDEC(targ,3 )); XEND; X X`7B************************************************************************* V**** X** Show_Wow X** X** Wow! Show 'em how good their score is! X`7D X X PROCEDURE Show_Wow; X BEGIN X Posn(6,7); QIO_Write( UDEC( wow.score, 6 ) ); X Posn(6,10); QIO_Write( UDEC( wow.lines, 3 ) ); X Posn(6,13); QIO_Write( UDEC( wow.stage, 2 ) ); X Show_Target; X END; X`20 X X`7B************************************************************************* V**** X** Bonus X** X** Give the suckers a bonus! X`7D XPROCEDURE Bonus; XVAR x,y,i,no_lines : INTEGER; X gclear : BOOLEAN; XBEGIN X gclear := TRUE; X y := 1; X no_lines := 0; X WHILE gclear DO X BEGIN X FOR x := 1 TO grid_width DO X IF grid`5Bx,y`5D <> ' ' THEN gclear := FALSE; X IF gclear THEN X BEGIN X no_lines := no_lines + 1; X wow.score := wow.score + 20; X Message( UDEC( no_lines, 2)+' lines clear! Bonus: '+ X UDEC(wow.score,7), TRUE ); X Show_wow; X FOR x:= 1 TO grid_width DO X PutGrid(x,y,'-'); X y := y + 1; X END; X IF y > grid_length THEN gclear := FALSE; X END; X IF no_lines > 0 THEN X BEGIN X Sleep( 2,0 ); X Message( '', FALSE ); X END; X IF y > grid_length THEN X BEGIN X Message( '1000 POINT CLEARED SCREEN BONUS!', true ); X Sleep( 5 ); X Message( '' , FALSE ); X wow.score := wow.score + 1000; X END; X END; X X`7B************************************************************************* V**** X** Congrats X**`20 X** X`7D XPROCEDURE Congratulate; XVAR On : BOOLEAN; X i : INTEGER; XBEGIN X On := FALSE; X FOR i := 1 TO 50 DO X BEGIN X IF On THEN `20 X Message( inv+'You have made it to the next stage!', TRUE ) X ELSE X Message( nml+'You have made it to the next stage!', TRUE ); X On := NOT( On ); X Sleep( 0, 0.06 ); X END; X Message( Nml, TRUE ); X Message( '', FALSE ); X Is_Msg := TRUE; X CASE wow.level OF X 2 : Message( 'How much longer can you last?', Is_Msg); X 3 : Message( 'Can you handle the pressure?', Is_Msg); X 4 : Message( 'Bet ya think ya doing well huh?', Is_Msg); X 5 : Message( 'Bet you'+apst+'re sweatin, Sunshine!', Is_Msg); X 6 : Message( 'You'+apst+'re dead now, Hotshot', Is_Msg); X 7 : Message( 'What are ya? A Robot?', Is_Msg); X 8 : Message( 'You sure you'+apst+'re not cheating?', Is_Msg); X 9 : Message( 'You cannot last much longer!', Is_Msg ); X 10 : Message( 'You must be a Motorhead fan, right?', Is_Msg ); X 11 : Message( 'Lets see how fast this thing moves!', Is_Msg );`20 X OTHERWISE Message( 'You obviously know Commander Krotche!', Is_Msg); X END; XEND; X`7B************************************************************************* V**** X** Diamond; X** X** X`7D XPROCEDURE Diamond; XVAR x,y,i,center : INTEGER; XBEGIN X wow.lines_target := wow.lines_target + 5; X Show_Wow; X Congratulate; X ClearGrid( grid ); X center := grid_width DIV 2; X FOR i := 0 TO 4 DO X IF NOT( ODD( i ) ) THEN BEGIN X grid`5B center+1+i , grid_length - 4 + i `5D := binshape`5B random(7) V `5D.ch; X grid`5B center-i , grid_length - 4 + i `5D := binshape`5B random(7) `5 VD.ch; X END; X FOR i := 0 TO 1 DO BEGIN `20 X grid`5B center+1+i , grid_length - 1 + i `5D := binshape`5B random(7) `5 VD.ch; X grid`5B center-i , grid_length - 1 + i `5D := binshape`5B random(7) `5D. Vch; X END; X Redraw_Grid; XEND; `20 X `20 X`7B************************************************************************* V**** X** Make_harder X** X** Sucker's asking for it... X`7D XPROCEDURE Make_Harder; XVAR x,y : INTEGER; X BEGIN X Show_wow; X Congratulate; X ClearGrid( grid ); X FOR y := grid_length- wow.random TO grid_length DO X FOR x := 1 TO grid_width DO X IF Random( 100 ) > 75 THEN`20 X grid`5Bx,y`5D := binshape`5B random( 7 ) `5D.ch X ELSE X grid`5Bx,y`5D := ' '; X IF wow.random < 8 THEN`20 X wow.random := wow.random + 2; X Redraw_Grid; X Show_wow; XEND; `20 X X`7B************************************************************************* V**** X** Change_to_Medium difficulty X** X** Change of scene, folks... X`7D XPROCEDURE Change_to_Medium; XVAR y,i : INTEGER; X BEGIN X wow.lines_target := 20; X Show_Wow; X Congratulate; X ClearGrid( grid ); X FOR y := 10 TO grid_length DO X BEGIN X grid`5B1,y`5D := binshape`5B Random( 7 ) `5D.ch; X grid`5Bgrid_width,y`5D := binshape`5B Random( 7 ) `5D.ch; X END; X Redraw_Grid; X Show_Wow; X END; X X`7B************************************************************************* V**** X** Extra Fast! X** X** Clear the screen and set the game to a blinding speed X`7D XPROCEDURE Extra_Fast( VAR Delay : real ); XBEGIN X Delay := delay - (0.01 ); X wow.lines_target := 15; X Show_wow; X Congratulate; X ClearGrid( grid ); X Redraw_Grid; X wow.random := 4; XEND; X X`7B************************************************************************* V**** X** Increase_Level X** X** No more Mr Nice Guy! X`7D X PROCEDURE Increase_Level; X BEGIN X wow.level := wow.level + 1; X wow.linecount := 0; X END; X X`7B************************************************************************* V**** X** Next_Stage X** X** On to next stage X`7D XPROCEDURE Next_Stage( VAR delay: real ); XBEGIN X QIO_Purge; X Bonus; X wow.stage := wow.stage + 1; X Increase_Level; X CASE wow.stage OF X 1 : `7Bdo nothing `7D; X 2 : BEGIN X delay := delay - 0.0200; X wow.lines_target := 15; X Congratulate; X ClearGrid( grid ); X Redraw_Grid; X show_wow; X END;`20 X 3 : BEGIN`20 X delay := delay - 0.0300; X wow.lines_target := 20; X Congratulate; X ClearGrid( grid ); X Redraw_Grid; X show_wow; X END; X 4 : BEGIN X Change_to_Medium; X delay := initial_delay - 0.0150;`20 X END; X 5 : BEGIN X Change_to_Medium; X delay := delay - 0.025;`20 X END; X 6 : BEGIN X Make_Harder; X delay := initial_delay - 0.0150; X wow.lines_target := 20; X END; X 7 : BEGIN X Diamond; X delay := delay - 0.0100; X END; X 8,9 : BEGIN X Make_harder; X delay := delay - 0.0050; X wow.lines_target := 20; X END; X 10 : Extra_Fast( delay ); X OTHERWISE`20 X BEGIN X Make_Harder; `20 X wow.lines_target := 20; X IF delay > 0.010 THEN delay := delay - 0.0050; X END; X END; XEND; X `20 X`7B************************************************************************* V**** X** Check_Resting X** X** Checks to see if the resting greebie has filled any whole lines across X`7D X FUNCTION Check_Resting( VAR greebie: greebie_type;`20 X VAR delay : real ) : BOOLEAN; X VAR sh_x, sh_y, sm_no, line_total,linesRmvd, point : INTEGER; X BEGIN`20 X check_Resting := TRUE; X linesRmvd := 0; X point := binshape`5Bgreebie.shape`5D.pointv`5Bgreebie.rot`5D; X sm_no := binshape`5Bgreebie.shape`5D.sm_no`5Bgreebie.rot`5D ; X FOR sh_y := 0 TO 3 DO X FOR sh_x := 0 TO 3 DO X IF (sm`5B sm_no, sh_y, sh_x `5D = 1 ) THEN X grid`5B greebie.x_pos + sh_x, greebie.y_pos + sh_y `5D :=`20 X binshape`5B greebie.shape `5D.ch; X FOR sh_y := 0 TO 3 DO X BEGIN X line_total := 0; X FOR sh_x := 1 TO grid_width DO X IF greebie.y_pos+sh_y <= grid_length THEN`20 X IF grid`5Bsh_x, greebie.y_pos+sh_y`5D <> ' ' THEN X line_total := line_total + 1; X IF line_total = grid_width THEN X BEGIN X Remove_Line( greebie.y_pos+sh_y ); X linesRmvd := linesRmvd + 1; X END; X END; `20 X IF Is_Msg THEN X BEGIN X Is_Msg := FALSE; X Message( '', Is_Msg ); X END; X IF linesRmvd > 0 THEN X BEGIN X wow.score := wow.score + ( point * ( (linesRmvd+1) ** 2 ) ) +`20 X ( 250 * ORD(linesRmvd = 4)); X wow.lines := wow.lines + linesRmvd; X Redraw_Grid; X IF linesRmvd = 4 THEN X BEGIN X Is_Msg := TRUE; X Message( 'You scored a TETRIS!', Is_Msg ); X END; X END X ELSE`20 X BEGIN X wow.score := wow.score + (2 * point); `20 X IF greebie.y_pos = 1 THEN`20 X Check_Resting := FALSE ; X END; X wow.linecount := wow.linecount + linesRmvd; X Show_Wow; X if wow.linecount >= wow.lines_target then X Next_Stage( delay ); X `20 X END; X X`7B************************************************************************* V**** X** Check_Top X** X** Checks top of screen to see if there is any room left, else return false. X`7D XFUNCTION Check_Top( Greebie : Greebie_Type ) : BOOLEAN; XVAR x,y,sm_no : INTEGER; X ok : BOOLEAN; XBEGIN X ok := TRUE; X sm_no := binshape`5Bgreebie.shape`5D.sm_no`5Bgreebie.rot`5D ; X FOR y := 0 TO 3 DO X FOR x := 0 TO 3 DO X IF (sm`5B sm_no, y, x `5D = 1) AND`20 X (Grid`5B greebie.x_pos+x, greebie.y_pos+y `5D <> ' ') THEN X ok := FALSE; X Check_Top := ok; XEND; X`7B************************************************************************* V**** X** Drop_Greebie X** X** When the drop key is pressed the greebie drops quickly X`7D X PROCEDURE Drop_Greebie( VAR greebie : greebie_type); X BEGIN X WHILE Move_Down( greebie ) DO X ; X END; X`20 X`7B************************************************************************* V**** X** Display_next X** X** Shows what the next greebie looks like X`7D X PROCEDURE DisplayNext( Next_Greebie : Greebie_Type); X BEGIN X PutShape_Abs( Next_Greebie, s_draw ); X END; X X`7B************************************************************************* V****`20 X** ClearNext X** X** Erases the 'next greebie' ready for a new picture of the next 'next greeb Vie' X`7D X PROCEDURE ClearNext( Next_Greebie : Greebie_Type ); X BEGIN`20 X PutShape_Abs( Next_Greebie, s_clear ); X END; X X`7B************************************************************************* V**** X** ReDraw_Complete_Screen X** X** Redraws the entire screen when the redraw key is pressed X`7D X X PROCEDURE ReDraw_Complete_Screen( Next_Greebie: greebie_type); X BEGIN X SetUpScreen; X ReDraw_Grid; X Show_Wow; X DisplayNext( Next_Greebie ); X END; X `20 X`7B************************************************************************* V**** X** Pause game X** X** X`7D XPROCEDURE Pause; XVAR ch : CHAR; XBEGIN X QIO_Purge; X Message (VT100_bright_only+'GAME PAUSED - press any key to continue'+ X VT100_normal, true ); X ch := QIO_1_Char; X Message ('', false ); XEND; X X(*************************************************************************** V) +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-