$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 30-MAY-1992 03:15:36.83 By user MASLIB $! $! This VMS_SHARE Written by: $! Andy Harper, Kings College London UK $! $! Acknowledgements to: $! James Gray - Original VMS_SHARE $! Michael Bednarek - Original Concept and implementation $! $!+ THIS PACKAGE DISTRIBUTED IN 3 PARTS, TO KEEP EACH PART $! BELOW 30 BLOCKS $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. BUILD.COM;1 $! 2. CROSSFIRE.PAS;1 $! 3. CROSSFIRE.SCN;1 $! 4. CROSSFIRE_HELP.PIC;1 $! 5. CROSSFIRE_START.PIC;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if f$trnlnm("SHARE_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $UNPACK: SUBROUTINE ! P1=filename, P2=checksum $ if f$search(P1) .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped." $ delete 'f'* $ exit $file_absent: $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'." $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped." $ delete 'f'* $ exit $dirok: $ w "-I-PROCESS, Processing file ''P1'." $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1' PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b)); LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION( BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1); IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE; MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1; ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")= 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF"; POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r); ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1; COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE, "output_file"));ENDPROCEDURE;Unpacker;QUIT; $ delete/nolog 'f'* $ CHECKSUM 'P1' $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT $ e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ ENDSUBROUTINE $START: $ create 'f' X$ PASCAL CROSSFIRE X$ LINK CROSSFIRE, INTERACT/LIB X$ DELETE *.OBJ;*/NOCONFIRM X$ EXIT $ CALL UNPACK BUILD.COM;1 1662326307 $ create 'f' X`5B Inherit ('INTERACT') `5D X XPROGRAM CROSSFIRE (picfile,screenfile); X`20 XCONST X walls = `5B'j'..'x'`5D; X greeblies = `5B'O','#','*'`5D; X greeblieno = 24; X topclass = 3; X topprize = 2; X ammopic = '+'; X maxshots = 5; X space = ' '; X youpic = '`60'; X startlives = 3; X bonus = '$'; X XTYPE X ammotype = RECORD (** Ammunition left in each of four weapons. V **) X u,d,l,r :INTEGER; X END; X boardline = ARRAY `5B10..40`5D OF CHAR; X greeblietype = RECORD (** One record for each greeblie. **) X pic :1..topclass; X x :0..39; X y :0..23; X active,alive :BOOLEAN; X END; X greebliestart = RECORD (** One start position per greeblie. **) X x :11..39; X y :2..23; X END; X directype = (U,D,L,R,S); X bulletype = RECORD (** Shot in motion. **) X x :10..40; X y :1..24; X aim :directype; X END; X drawstring = VARYING `5B80`5D OF CHAR; X outstring = VARYING `5B255`5D OF CHAR; X v_string = VARYING `5B255`5D OF CHAR; X score_type = INTEGER; X XVAR X picfile,screenfile :TEXT; X score :score_type; X board :ARRAY `5B1..24`5D OF boardline; X xpos, ammoX, bonusX :11..39; X ypos, ammoY, bonusY :2..23; X bonuslive, ammolive :BOOLEAN; X yourlives :INTEGER; X ammo :ammotype; X direction,newdirection :directype; X greeblie :ARRAY `5B1..greeblieno`5D OF greeblietype; X startpos :ARRAY `5B1..greeblieno`5D OF greebliestart; X pic :ARRAY `5B1..topclass`5D OF CHAR; X greebvalue :ARRAY `5B1..topclass`5D OF INTEGER; X shots :ARRAY `5B1..maxshots`5D OF bulletype; X shotsgoing :0..maxshots; X activegreeb,livingreeb :0..greeblieno; X Round_no :0..500; X sleeptime :integer; X maxactive :UNSIGNED; X Move_counter, efn :INTEGER; X exitordered :BOOLEAN; X`20 X X(*** Main Display Routine. ***) X X PROCEDURE DRAWAT(y,x :INTEGER; string :drawstring; stringlength :INTEGER); X(*************************************************************************) X BEGIN X qio_Write(VT100_esc+'`5B'+dec(y)+';'+dec(x)+'H'+string); X END; X X(** Draw a single character - co-ords always length 2. **) X X PROCEDURE DRAWCHAR(y,x :INTEGER; letter :CHAR); X(**********************************************) X BEGIN X qio_Write(VT100_esc+'`5B'+dec(y)+';'+dec(x)+'H'+letter); X END; X X X PROCEDURE SHOWSCORE(score :score_type); X(**************************************) X BEGIN X qio_write (VT100_esc+'`5B4;2H'+dec(score,,7)); X END; X X X(** Draw ammo indicator - called whenever screen is updated. **) X X PROCEDURE DRAWAMMO; X(******************) X BEGIN X IF ammo.u > 10 THEN DrawChar(12,7,'x') X ELSE IF ammo.u > 0 THEN DrawChar(12,7,'.'); X IF ammo.d > 10 THEN DrawChar(14,7,'x') X ELSE IF ammo.d > 0 THEN DrawChar(14,7,'.'); X IF ammo.l > 10 THEN DrawChar(13,6,'q') X ELSE IF ammo.l > 0 THEN DrawChar(13,6,'.'); X IF ammo.r > 10 THEN DrawChar(13,8,'q') X ELSE IF ammo.r > 0 THEN DrawChar(13,8,'.'); X END; (* Draw Ammo indicator *) X X X(** Draw screen and set graphics mode. **) X X PROCEDURE INITSCREEN; X(********************) X X VAR inline :v_string; X boardindex,lineindex, X counter :INTEGER; X sparemen :PACKED ARRAY `5B1..5`5D OF CHAR; X X BEGIN X OPEN(screenfile,'IMAGE_DIR:Crossfire.scn',history := readonly); X RESET(screenfile); X counter := 0; X READLN(screenfile,inline); (*** First line does screen init. ***) X qio_Write(inline); X REPEAT X READLN(screenfile,inline); X qio_Write(inline); X counter := counter + 1; X lineindex := 0; X REPEAT X lineindex := lineindex + 1; X UNTIL ((inline.body`5Blineindex`5D = '#') AND (inline.body`5Blineindex+ V1`5D = '6')); X lineindex := lineindex + 11; X boardindex := 10; X WHILE NOT (lineindex > inline.length) DO BEGIN X board`5Bcounter`5D`5Bboardindex`5D := inline.body`5Blineindex`5D; X boardindex := boardindex + 1; X lineindex := lineindex + 1; X END; (** while on current line **) X UNTIL EOF(screenfile); X CLOSE(screenfile); X ShowScore(score); X qio_write (VT100_esc+'`5B9;4H'+dec(Round_no,,2)); X DrawAmmo; X X Bonuslive := FALSE; AmmoLive := FALSE; X X (** Draw row of waiting extra lives. **) X X sparemen := '`7E`7E`7E`7E`7E'; X IF yourlives > 1 THEN X FOR counter := 1 TO (yourlives - 1) DO X sparemen`5Bcounter`5D := youpic; X qio_write (VT100_esc+'`5B12;1H'+sparemen); X X Drawchar(ypos,xpos,youpic); X FOR counter := 1 TO greeblieno DO X IF greeblie`5Bcounter`5D.alive THEN X Drawchar(greeblie`5Bcounter`5D.y,greeblie`5Bcounter`5D.x,pic`5Bgreebl Vie`5Bcounter`5D.pic`5D); X END; (** Initscreen **) X X X(*** Called once - at the start of each game. ***)`20 X X PROCEDURE INITGAME; X(******************) X X VAR counter :INTEGER; X X X PROCEDURE DRAWTITLE; X VAR X inchar : char; X Inline : varying `5B255`5D of char; X BEGIN X Image_dir; X OPEN(picfile,'IMAGE_DIR:Crossfire_start.pic', History := readonly); X RESET(picfile); X WHILE NOT EOF(picfile) DO BEGIN X readln (picfile,Inline); X qio_writeln (Inline); X END; X CLOSE(picfile); X IF upper_case(qio_1_Char) = 'I' THEN`20 X show_graphedt ('Crossfire_help.pic'); X END; (* draw title page *) X X X BEGIN X drawtitle; X efn := 21; (* No. of event flag used by sleeps. *) X exitordered := FALSE; X yourlives := startlives; X Round_no := 0; X Move_counter := 0; X pic`5B1`5D := 'O'; pic`5B2`5D := '#'; pic`5B3`5D := '*'; X greebvalue`5B1`5D := 10; greebvalue`5B2`5D := 25; greebvalue`5B3`5D := 50 V; X ammo.u := 25; ammo.d := 25; ammo.l := 25; ammo.r := 25; X FOR counter := 1 TO greeblieno DO BEGIN X CASE counter OF X 1,2,3,4,5,6, X 7 :BEGIN X startpos`5Bcounter`5D.x := 9 + 4 * counter; X startpos`5Bcounter`5D.y := 2 X END; X 8,9,10,11, X 12 :BEGIN X startpos`5Bcounter`5D.x := 39; X startpos`5Bcounter`5D.y := 4 * (counter - 7); X END; X 13,14,15,16,17,18, X 19 :BEGIN X startpos`5Bcounter`5D.x := 37 - 4 * (counter - 13); X startpos`5Bcounter`5D.y := 22; X END; X 20,21,22,23, X 24 :BEGIN X startpos`5Bcounter`5D.x := 11; X startpos`5Bcounter`5D.y := 20 - 4 * (counter - 20); X END; X END; (** case counter **) X END; (** FOR counter **) X END; (** Initialise Game **) X X X(*** Called each time you lose a life. ***) X X PROCEDURE RESTART_PLAY; X(**********************) X X VAR counter :INTEGER; X X BEGIN X xpos := 28; ypos := 12;`20 X shotsgoing := 0; X FOR counter := 1 TO maxshots DO X shots`5Bcounter`5D.aim := S; X activegreeb := 0; X FOR counter := 1 TO greeblieno DO BEGIN X IF greeblie`5Bcounter`5D.active THEN BEGIN X greeblie`5Bcounter`5D.x := startpos`5Bcounter`5D.x; X greeblie`5Bcounter`5D.y := startpos`5Bcounter`5D.y; X END; (** Send active greeblies home. **) X greeblie`5Bcounter`5D.active := FALSE; X END; (** FOR counter **) X END; (** Restart play **) X X X PROCEDURE YOUREDEAD(VAR lives :INTEGER); X(***************************************) X X BEGIN X qio_write (vt100_BELL); X qio_purge; X lives := lives - 1; X IF lives > 0 THEN BEGIN X Restart_Play; X InitScreen; X END; (** IF lives > 0 **) X END; (*** You're Dead ***) X X X(*** Called at the start of each round. ***) X X PROCEDURE INITROUND; X(*******************) X X VAR counter :INTEGER; X X BEGIN X Round_no := Round_no + 1; X CASE (Round_no MOD 11) OF X 1 :BEGIN sleeptime := 30; maxactive := 2; END; X 2 :BEGIN sleeptime := 24; maxactive := 2; END; X 3 :BEGIN sleeptime := 18; maxactive := 2; END; X 4 :BEGIN sleeptime := 28; maxactive := 3; END; X 5 :BEGIN sleeptime := 22; maxactive := 3; END; X 6 :BEGIN sleeptime := 16; maxactive := 3; END; X 7 :BEGIN sleeptime := 30; maxactive := 4; END; X 8 :BEGIN sleeptime := 25; maxactive := 4; END; X 9 :BEGIN sleeptime := 30; maxactive := 5; END; X 10 :BEGIN sleeptime := 25; maxactive := 5; END; X 0 :BEGIN sleeptime := 20; maxactive := 5; END; X END; (** Case round_no mod 10 **) X yourlives := min(5,yourlives + 1); X xpos := 28; ypos := 12;`20 X direction := R; X newdirection := R; X shotsgoing := 0; X FOR counter := 1 TO maxshots DO X shots`5Bcounter`5D.aim := S; X activegreeb := 0; X livingreeb := greeblieno; X FOR counter := 1 TO greeblieno DO BEGIN X greeblie`5Bcounter`5D.active := FALSE; X greeblie`5Bcounter`5D.alive := TRUE; X greeblie`5Bcounter`5D.pic := 1; X greeblie`5Bcounter`5D.x := startpos`5Bcounter`5D.x; X greeblie`5Bcounter`5D.y := startpos`5Bcounter`5D.y; X END; (** FOR counter **) X END; (** Initialise round **) X X X (*** Carried out at end of each round. ***) X X PROCEDURE ROUNDOVER; X(*******************) X X VAR`20 X counter :1..23; X round_bonus, ammo_bonus, X life_bonus, total_bonus :INTEGER; X inchar :CHAR; X X BEGIN X FOR counter := 1 TO 23 DO X Drawat(counter,10,VT100_esc+'`5BK',3); X qio_write (VT100_graphics_off); X posn (15,2); X qio_write ('ROUND '+dec(round_no)+' COMPLETED'); X round_bonus := round_no * 100; X posn (15,14); X qio_write ('Victory Bonus :'+dec(round_bonus,,4)); X life_bonus := yourlives * 50 * round_no; X posn (15,15); X qio_write ('Lives Bonus :'+dec(life_bonus,,4)); X ammo_bonus := ammo.u + ammo.d + ammo.l + ammo.r; X posn (15,16); X qio_write ('Ammo. Bonus :'+dec(ammo_bonus,,4)); X total_bonus := ammo_bonus + life_bonus + round_bonus; X posn (29,17); X qio_write (VT100_graphics_on+'qqqqqq'+VT100_graphics_off); X posn (30,18); X qio_write (dec(total_bonus,,4)); X score := score + total_bonus; X Showscore(score); X posn (11,23); X qio_write ('`5BPress a key to begin round.`5D'+VT100_graphics_on); X qio_purge; X inchar := qio_1_Char; X END; X X X PROCEDURE MOVESHOT(VAR shot:bulletype); X(**************************************) X X VAR X count :1..greeblieno; X X PROCEDURE CHECKSHOT(VAR shot:bulletype); X (*=====================================*) X BEGIN X FOR count := 1 TO greeblieno DO +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+-