$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 7-JUN-1992 21:36:55.17 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 15 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. ARALU.C;1 $! 2. ARALU.H;1 $! 3. ARALU.SCORE;1 $! 4. CREATE.C;1 $! 5. EXPLODE.C;1 $! 6. HELP.C;1 $! 7. MAKEFILE.;1 $! 8. MONSTERS.C;1 $! 9. MONSTERS.DAT;1 $! 10. O.OPT;1 $! 11. PLAY.C;1 $! 12. PLAY2.C;1 $! 13. RANDOM.C;1 $! 14. SAVE.C;1 $! 15. SCORE.C;1 $! 16. SCREEN.1;1 $! 17. SCREEN.2;1 $! 18. SCREEN.3;1 $! 19. SCREEN.4;1 $! 20. SCREEN.5;1 $! 21. SCREEN.6;1 $! 22. SCREEN.7;1 $! 23. SCREEN.8;1 $! 24. SCREEN.9;1 $! 25. WINDOWS.C;1 $! 26. WIZARD.C;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#include stdio X#include smgdef X#include descrip X#include jpidef X#include ctype X#include math X#include time X#include "aralu.h" X#include "random.c" X X Xcursor_on() X`7B Xprintf("\33`5B?25h"); X`7D X Xcursor_off() X`7B Xprintf("\33`5B?25l"); X`7D X Xenable_control() X`7B Xint mask = 0x02000000; Xlib$enable_ctrl(&mask); X`7D X Xdisable_control() X`7B Xint mask = 0x02000000; Xlib$disable_ctrl(&mask); X`7D X X/* Xclear_buffer() X`7B X$DESCRIPTOR(command_d,"set terminal/notypeahead"); X Xsmg$execute_command(&dsp_command,&command_d,&SMG$M_DATA_FOLLOWS); X`7D X*/ X X Xcreate( obj, quan) Xshort quan; Xchar obj; X`7B Xshort i = 0; Xshort y, x; X Xwhile( i< quan) `7B `09`09`09`09 X y = random(MAXROWS); X x = random(MAXCOLS); X if ( ISCLEAR( map`5By`5D`5Bx`5D.mapchar)) `7B`20 X map`5By`5D`5Bx`5D.mapchar = obj;`20 X if ( ITEM_PROPS`5Bidentify( obj)`5D`5BCOMBINE`5D) map`5By`5D`5Bx`5D.num Vber = 1; X else map`5By`5D`5Bx`5D.number = random( 5) + 1; X lib$wait(&0.008);`09`09/* to give the random a better effect */ X prt_char( map`5By`5D`5Bx`5D.mapchar, y, x); X i++;`20 X `7D X`7D X`7D X Xcreate_objects() X`7B Xint obj_num; X/* for the creation, make a few extras, since monsters eat them */ Xcreate( HEALTH, MAXMONSTERS*level); Xcreate( SWORD, 2); Xcreate( LSWORD, 2); Xcreate( DOOR, 2); Xcreate( STORE, 2); Xcreate( POTION, 2); Xcreate( CASH, random(5)); Xcreate( MINE, random(8)); Xcreate( PIT, random(8)); Xcreate( SCROLL, random(5)); Xif ( (obj_num = random( 6)) == 1) create( POTION, 1); Xelse if ( obj_num==2) `7B create( SCROLL, 4); create( HAXE, 1); `7D Xelse if ( obj_num==3) `7B create( AXE, 1); create( ARMOR, 1); `7D Xelse if ( obj_num==4) `7B create( BOW, 1); create( ARROW, 10); `7D Xelse if ( obj_num==5) `7B create( ARMOR, 1); create( LSWORD, 1); `7D Xelse create( SPACE, 1);`09`09/* should never happen */ X`7D X Xsub_holdmap() X`7B Xint i = 0; X Xwhile( holdmap`5Bi`5D.num != -5) `7B X map`5Bholdmap`5Bi`5D.y`5D`5Bholdmap`5Bi`5D.x`5D.number = holdmap`5Bi`5D.nu Vm; X map`5Bholdmap`5Bi`5D.y`5D`5Bholdmap`5Bi`5D.x`5D.mapchar = holdmap`5Bi`5D.h Voldchar; X if ( holdmap`5Bi`5D.holdchar == '@') `7B`20 X ppos.y = holdmap`5Bi`5D.y;`20 X ppos.x = holdmap`5Bi`5D.x;`20 X holdmap`5Bi`5D.holdchar = '@'; X `7D X i++; X`7D X`7D X X Xshort readscreen() X`7B XFILE *readfile; X Xchar screenfile`5B80`5D; Xshort ret = 0; Xshort i, j; X Xsprintf(screenfile,"%sscreen.%d",screenpath,level); Xif ( (readfile = fopen( screenfile,"r")) != NULL) `7B X for (i=0; i< MAXROWS; i++) `7B X fgets (maparray`5Bi`5D, MAXCOLS+5, readfile); X maparray`5Bi`5D`5BMAXCOLS`5D = '\0'; X `7D X X for (i=0; i< MAXROWS; i++) `20 X for (j=0; j< MAXCOLS; j++) `7B X map`5Bi`5D`5Bj`5D.mapchar = maparray`5Bi`5D`5Bj`5D; X map`5Bi`5D`5Bj`5D.number = 9999; X if ( map`5Bi`5D`5Bj`5D.mapchar == '@') `7B ppos.y = i; ppos.x = j;` V20 X `09 map`5Bi`5D`5Bj`5D.mapchar = SPACE; maparray`5Bi`5D`5Bj`5D = SPACE;`7D X`09else if ( map`5Bi`5D`5Bj`5D.mapchar == BONES) `7B a_posy = i; a_posx = j; V `7D X `7D X X underchar = SPACE; `09 `09/* starting out new screen */ X/* can't print out the monsters with the rest of the map, since the characte Vr X you see on the screen is not the same as the encoded character of the X monster, so we have to do it in write_map() */ Xif ( access( savefile, "r") != 0 && level == 1) X if ( (ret = read_monsters())) errmess( ret); X X`7D /* End file-open IF */ Xelse ret = E_OPENSCREEN; Xfclose( readfile); Xreturn( ret); X`7D X X Xprt_sub_holdmap() X`7B Xint i = 0; X Xwhile( holdmap`5Bi`5D.num != -5) `7B X prt_char( holdmap`5Bi`5D.holdchar, holdmap`5Bi`5D.y, holdmap`5Bi`5D.x); X i++; X `7D /* End while */ X`7D X X Xwrite_map() X`7B Xint count; X$DESCRIPTOR( map_desc, maparray); X Xmap_desc.dsc$w_length = MAXCOLS; X for (count=1;count<=MAXROWS;count++) `7B`20 X map_desc.dsc$a_pointer = &maparray`5Bcount-1`5D`5B0`5D; X smg$put_line(&dsp_main,&map_desc,0,0,0,0);`20 X `7D X Xprt_monsters(); X`7D X X X Xshort getkey() X`7B Xint key, send; Xdouble denom; X X Xwhile( !dead) `7B Xsend = FALSE; Xif ( smg$read_keystroke(&kboard,&key,0,&timeout) != 556) `7B X send = TRUE; X timeout_count--; X`7D Xif ( !in_arena) `7B`09/* can't heal while waiting in arena */ `20 X if ( CON == 20) denom = 1; X else `7B X if ( (denom = 20-CON) < 0) denom = 1 + 1/(CON-20); X else denom++; X `7D X if ( (++timeout_count*DIFFICULTY)/denom >=1) `7B`20 X if ( health < MAXHEALTH) `7B X health += 1;`20 X prt_health();`20 X `7D X timeout_count = 0;`20 X `7D X`7D /* End ARENA If */ X Xdo_acts(); X Xif ( send && !dead) return( key); X`7D /* End while */ X`7D X X Xdo_acts() X`7B Xint monspeed, i, j, k; Xint limit; X Xlib$wait(&DIFFICULTY); Xmoves++; Xif ( (moves % 500) == 0) get_time(); Xfor ( j = 0; j < NUMFLAGS; j++) X if ( flags`5Bj`5D.valid) `7B X if ( flags`5Bj`5D.moves > 0) `7B `20 X flags`5Bj`5D.moves--; X if ( operator) prt_moves( j); X `7D X else `7B X if ( j == SPEED) check_speed(); X else if ( j == CONFUSE) check_confusion(); `20 X else if ( j == IMMUNITY) check_immunity(); X else if ( j == MON_CONFUSE) check_mon_confuse(); X else if ( j == BLIND) check_blind(); X `7D X `7D X Xj = 0; Xk = 0; Xwhile( j++ < MAXMONSTERS*level) `7B X limit = monsters`5Bk`5D.max_mon; X for ( i=0; i< limit; i++) `7B X if ( !monsters`5Bk`5D.dead) `7B X if ( (monspeed = monsters`5Bk`5D.speed) < 1) monspeed = 1; X if ( moves % monspeed == 0)`20 X if ( !stop_monst)`09`09/* God flag for stopping monsters */ X move_monsters( k); X `7D X else if ( random( 100) < monsters`5Bk`5D.reschance) resurrect( k); X k++; X `7D /* End FOR(i) loop */ X`7D /* End while */ X`7D X X Xshort gameloop() X`7B Xint key, d = 0; Xshort ret = 0; X Xtimeout_count = moves = 0; Xwhile( !dead) `7B X key = getkey(); X if ( !dead) X if ( (ret = parse_keystroke( key)) != 0) break; X`7D Xif ( dead) `7B X prt_msg("Press RETURN to continue."); X do `7B X smg$read_keystroke(&kboard,&d); X `7Dwhile( d != 13); X prt_msg("Your backpack contained:"); X prt_inven(); X prt_msg("Press RETURN to continue."); X do `7B X smg$read_keystroke(&kboard,&d); X `7Dwhile( d != 13); X`7D Xif (ret == E_SAVED) ret = savegame(); Xreturn( ret); X`7D X X Xerrmess( number) Xint number; X`7B Xdelete_windows(); Xif ( number != E_ENDGAME) X printf("Aralu: %s\n",errors`5Bnumber`5D); Xcursor_on(); Xenable_control(); Xprintf("Thank you for trying aralu."); Xexit( 0); X`7D X X Xmain( argc, argv) Xint argc; Xchar *argv`5B`5D; X`7B Xshort i, j; Xshort ret, restored; Xchar op_username`5B12`5D; Xchar sk`5B10`5D; X X`09`09`09`09/* initialize BACKPACK struct for spaces */ Xfor (i=1; i< MAXINVEN; i++) X BACKPACK`5Bi`5D.invenchar = SPACE; X`09`09`09`09/* initialize FLAGS to nothing */ Xfor (i=0; i< NUMFLAGS; i++) X flags`5Bi`5D.valid = flags`5Bi`5D.moves = 0; X `20 XGAINLEVEL = KEYPOSESS = operator = dead = stop_monst =`20 X`09`09`09in_store = in_arena = can_exit = ret = restored = FALSE; Xlevel = 1; Xrandomize(); `09`09`09/* to get the ball rolling for random numbers */ X Xstrcpy( username, getenv("USER")); Xif ( argc > 1) `7B X if ( argv`5B1`5D`5B0`5D != '-') ret = E_USAGE; X else switch( toupper( argv`5B1`5D`5B1`5D)) `7B X `09 case 'C': X `09`09if ( strcmp( username, SUPERUSER) != 0) errmess( E_NOTSUPER);`20 X`09 `09printf("Are you sure you want to create another highscore file?\n" V); X `09`09scanf( "%s", sk); X `09`09if ( toupper( sk`5B0`5D) == 'Y') `7B X `09`09 if ( (ret = create_scorefile()) == 0) ret = E_CREATED; X `09`09`7D X `09`09else ret = E_ENDGAME; X`09`09break; X`09 case 'S': if ( (ret = outputscore()) == 0) ret = E_ENDGAME; break; X`09 case 'M':`20 X`09`09if ( strcmp( username, SUPERUSER) != 0) errmess( E_NOTSUPER);`20 X`09`09printf("Enter username:\n"); X`09`09scanf( "%s", op_username); X`09`09op_username`5B9`5D = 0; X`09`09strcpy( username, op_username); X`09`09break; X default: ret = E_USAGE; X `7D /* End switch */ Xif ( ret) errmess( ret); X`7D X Xif ( (ret = restore()) == 0) restored = TRUE; Xelse if ( ret != E_NOSAVEFILE) errmess( ret); Xelse if ( (ret = create_character()) != 0) errmess( ret); X Xif ( (ret = readscreen()) != 0) errmess( ret); Xif (restored) sub_holdmap(); X X/* game has been restored or re-started */ Xdisable_control(); Xcursor_off(); X/*clear_buffer();*/ Xcreate_windows(); Xchange_viewport( ppos.y, ppos.x); Xmap`5Bppos.y`5D`5Bppos.x`5D.mapchar = '@'; Xmaparray`5Bppos.y`5D`5Bppos.x`5D = '@'; Xwrite_map(); Xif ( restored) prt_sub_holdmap(); Xelse create_objects(); X Xprt_status(); Xget_time(); Xput_windows(); X Xremove( savefile); `09`09/* delete savefile so people can't cheat */ Xwhile(!dead) `7B Xif ( (ret = gameloop()) == E_GAINLEVEL) `7B X prt_msg("Congratulations! You made it through this level"); X experience = experience + level*BONUS; X level++; X MAXHEALTH = ((CON+level)*8); X if ( (ret = readscreen()) != 0) errmess( ret); X smg$begin_pasteboard_update(&pb); X smg$erase_display(&dsp_main); `09/* clear original map */ X change_viewport( ppos.y, ppos.x);`09/* restarts the viewport */ X map`5Bppos.y`5D`5Bppos.x`5D.mapchar = '@'; X maparray`5Bppos.y`5D`5Bppos.x`5D = '@'; X write_map();`09`09`09`09/* print out new map */ X create_objects(); X smg$end_pasteboard_update(&pb); X/* if ( !flags`5BSPEED`5D.valid && CURWEIGHT < MAXWEIGHT) speed = 1; */ X KEYPOSESS = GAINLEVEL = FALSE; X monkilled = dely = delx = 0; X prt_exp(); X prt_level(); X prt_key_status(); X`7D Xelse break; X`7D X Xdelete_windows();`20 Xif ( dead && !operator) ret = score(); X Xif ( ret) errmess( ret); Xelse `7B`20 X delete_windows();`20 X cursor_on(); X enable_control(); X printf("Thank you for trying aralu."); X exit( 0); X`7D X`7D $ CALL UNPACK ARALU.C;1 1432777987 $ create 'f' X#define`09ISCLEAR( position)`09(position == SPACE) X#define location(chr,target) ((unsigned int)strchr(target,chr)-(unsigned int V)target) X#define upcase(str_to_do) `7B$DESCRIPTOR(a,str_to_do);STR$UPCASE(&a,&a);`7D X X#define scorefile`09"disk$userdisk1:`5Bmas0.masandy.send.source.aralu`5Daral Vu.score" X#define savefile "sys$login:aralu.sav" X#define monfile`09`09"disk$userdisk1:`5Bmas0.masandy.send.source.aralu`5Dmon Vsters.dat" X X/* Screenfiles MUST have MAXROWS x MAXCOLS lines in it, otherwise the game * V/ X/* will screw up fast. */ X#define screenpath "disk$userdisk1:`5Bmas0.masandy.send.source.aralu`5D V" X#define SUPERUSER`09"MASANDY" X#define MAXSCOREENTRIES 20 /* number of entries in the score file */ X#define SCRATIOV `094 /* how close you get to the top/bottom */ X#define SCRATIOH`0916 /* how close you get to the left/right */ X#define BONUS`09`09200 /* bonus multiplier per level */ +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+-