-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ XVictimdesc - Text message victim sees when being hit by spell. XPrompt - If there is no prompt specified, for an offensive spell, X`09 it uses your target as coordinates. For a defensive spell, X`09 it uses your coordinates. X`09 If there is a prompt specified, it will ask for destination X`09 coordinates for a defensive spell. XPretty much meaningless right now. XIcon - Character which represents the spell on the screen. XRendition - Special attributes of the character (blinking, bold...) X XGeometry - Shape the spell takes the form of (circle, square, line) X Circle : Geoparm 1 determines the inner circle's radius (0 for most case Vs) X : Geoparm 2 determines the outer radius of the circle. X Square : Geoparm 1 determines the width of the square (ok, so it should V be X`09 called a rectangle) X : Geoparm 2 determines the heigth of the square. X XHurt spells- Damage others when they get hit. X Parm1 : Max random damage done. X Parm2 : Randomness of damage done (1 = uniform dist, 2, 3, 4 = sharper V bell X curve. X Parm3 : Not used. X Parm4 : Range of spell. X XHeal spells- Just use a hurt spell, but put a negative number for Parm1 X XFreeze spells - Freeze others for a while. X Parm1 : Max freeze time. X Parm2 : Randomness of freeze time (as above) X Parm3 : Not used. X Parm4 : Range of spell. X XTeleport spells - Randomly teleports those hit X Parm1 : Range of teleportation X Parm4 : Range of spell $ CALL UNPACK SPELL.HELP;1 1467105728 $ create 'f' X$ define/nolog root $1$dua12:`5Btemp.maself`5D X! This is where the .pas files are to be kept. X$ set process/priority = 4 X$ pn = "set proc/name = " X$ set def temp X! temp is a variable I have previously defined. I keep the scratch work out X! of my regular account this way. You might DEFINE TEMP SYS$SCRATCH or X! something like that. X$ if p1 .eqs. "D" X$ then X$ pas = "pascal/debug/noopt" X$ link = "link/debug" X$ endif X$ define makefile root:sr.make X! Place where the makefile is kept. (W/ the .pas files...in my case). X$ make X$ write sys$output "Wowsers." $ CALL UNPACK SR.COM;1 474286888 $ create 'f' Xsr.exe: sr.obj X`09pn "linking" X`09link sr,srinit,srsys,srio,srother,sract,srcom,srop,srtime,srmap,srmove,sr Vmisc,srmenu Xsr.obj:`09root:sr.pas root:srclass.pas srinit.obj srsys.obj srio.obj srother V.obj srmisc.obj srmenu.obj srmove.obj srmap.obj srop.obj srcom.obj sract.obj V srtime.obj X`09pn "sr" X`09pas root:sr Xsrinit.obj: root:srinit.pas X`09pn "srinit" X`09pas root:srinit Xsrsys.obj: srinit.obj root:srsys.pas X`09pn "srsys" X`09pas root:srsys Xsrio.obj: srsys.obj root:srio.pas X`09pn "srio" X`09pas root:srio Xsrother.obj: srio.obj root:srother.pas X`09pn "srother" X`09pas root:srother Xsrmisc.obj: srother.obj root:srmisc.pas X`09pn "srmisc" X`09pas root:srmisc Xsrmenu.obj: srother.obj root:srmenu.pas X`09pn "srmenu" X`09pas root:srmenu Xsrmap.obj: srmisc.obj root:srmap.pas X`09pn "srmap" X`09pas root:srmap Xsrmove.obj: srmap.obj root:srmove.pas X`09pn "srmove" X`09pas root:srmove Xsrop.obj: srmisc.obj srmenu.obj root:srop.pas X`09pn "srop" X`09pas root:srop Xsrcom.obj: srmove.obj root:srcom.pas X`09pn "srcom" X`09pas root:srcom Xsract.obj: srmove.obj root:sract.pas X`09pn "sract" X`09pas root:sract Xsrtime.obj: srmove.obj root:srtime.pas X`09pn "srtime" X`09pas root:srtime $ CALL UNPACK SR.MAKE;1 1023690772 $ create 'f' X`7B `20 XNeed extra fparm for element type of hurt foreground X X`09Program structure: X0`091`092`093`094`095`096 Xinit Xinit`09>sys Xinit`09sys`09>io Xinit`09sys`09io`09>other Xinit`09sys`09`09other`09>misc Xinit`09sys`09`09other`09>menu Xinit`09sys`09`09other`09misc`09>move Xinit`09sys`09io`09other`09msc+mnu`09>op Xinit`09sys`09io`09other`09misc`09move`09>com Xinit`09sys`09io`09other`09misc`09move`09>act Xinit`09sys`09`09other`09`09move`09>time X`7D X X`5Binherit X('srinit','srsys','srio','srother','srop','sract','srcom','srmove', X 'srtime','srmisc','sys$library:starlet')`5D X Xprogram sr(input,output); X X`5BASYNCHRONOUS`5D FUNCTION lib$cvt_from_internal_time ( X`09operation : UNSIGNED; X`09VAR resultant_time : `5BVOLATILE`5D UNSIGNED; X`09input_time : $UQUAD := %IMMED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION lib$spawn ( X`09command_string : `5BCLASS_S`5D PACKED ARRAY `5B$l1..$u1:INTEGER`5D OF CHA VR := %IMMED 0; X`09input_file : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF CHAR := V %IMMED 0; X`09output_file : `5BCLASS_S`5D PACKED ARRAY `5B$l3..$u3:INTEGER`5D OF CHAR : V= %IMMED 0; X`09flags : UNSIGNED := %IMMED 0; X`09process_name : `5BCLASS_S`5D PACKED ARRAY `5B$l5..$u5:INTEGER`5D OF CHAR V := %IMMED 0; X`09VAR process_id : `5BVOLATILE`5D UNSIGNED := %IMMED 0; X`09%IMMED completion_status_address : $DEFPTR := %IMMED 0; X`09byte_integer_event_flag_num : $UBYTE := %IMMED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE AST_address := %IMMED 0; X`09%IMMED varying_AST_argument : `5BUNSAFE`5D INTEGER := %IMMED 0; X`09prompt_string : `5BCLASS_S`5D PACKED ARRAY `5B$l11..$u11:INTEGER`5D OF CH VAR := %IMMED 0; X`09cli : `5BCLASS_S`5D PACKED ARRAY `5B$l12..$u12:INTEGER`5D OF CHAR := %IMM VED 0) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION lib$delete_file ( X`09filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l1..$u1:INTEGER`5D OF CHAR; X`09default_filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l2..$u2:INTEGER`5D OF C VHAR := %IMMED 0; X`09related_filespec : `5BCLASS_S`5D PACKED ARRAY `5B$l3..$u3:INTEGER`5D OF C VHAR := %IMMED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_success_procedure := %I VMMED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_error_procedure := %IMM VED 0; X`09%IMMED `5BUNBOUND, ASYNCHRONOUS`5D PROCEDURE user_confirm_procedure := %I VMMED 0; X`09%IMMED user_specified_argument : `5BUNSAFE`5D INTEGER := %IMMED 0; X`09VAR resultant_name : `5BCLASS_S,VOLATILE`5D PACKED ARRAY `5B$l8..$u8:INTE VGER`5D OF CHAR := %IMMED 0; X`09VAR file_scan_context : `5BVOLATILE`5D UNSIGNED := %IMMED 0) : INTEGER; E VXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$end_pasteboard_update ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X`20 X`5BASYNCHRONOUS`5D FUNCTION smg$begin_pasteboard_update ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X X`5BASYNCHRONOUS`5D FUNCTION smg$repaint_screen ( X`09pasteboard_id : UNSIGNED) : INTEGER; EXTERNAL; X`20 X`5Bglobal`5D Xfunction getkey(key_mode:integer := 0):char; Xforward; X Xprocedure show_status; Xvar X s:string; X i,n:integer; Xbegin X if get_name(name`5Bna_player`5D.id,'Stats on who',n) then X with person`5Bn`5D do X begin X x_label(name`5Bna_player`5D.id`5Bn`5D+'''s stats'); X purge_x; X add_x('room '+name`5Bna_room`5D.id`5Ban_int`5Bn_location`5D.int`5Bn`5 VD`5D); X add_x('x loc '+int(loc.x)); X add_x('y loc '+int(loc.y)); X add_x('feet '+int(feet)); X add_x('head '+int(head)); X add_x('here '+boo(here)); X add_x('alive '+boo(alive)); X add_x('channel '+int(channel)); X draw_x; X for i := 1 to at_max do X act_out(plr`5Bnow`5D.log,e_req_status,,,n,i,,,,,,person`5Bn`5D.channel); X end; Xend; X Xfunction revive_player:boolean; Xvar X i:integer := 0; X s:string; X passed:boolean := false; Xbegin X wl('Attempting to revive your old bones...'); X if (op_userid < op_userid(name`5Bna_user`5D.id`5Bplr`5Bnow`5D.log`5D)) the Vn X revive_player := true X else if (lowcase(get_userid) <> name`5Bna_user`5D.id`5Bplr`5Bnow`5D.log`5D V) then X begin X wl('A voice thunders from above!'); X repeat X grab_line('What''s the password! ',s,,false); X passed := (lowcase(player.password) = lowcase(s)); X i := i + 1; X if not passed and (i < 3) then wl('Try again.'); X until passed or (i = 3); X revive_player := passed; X end X else revive_player := true; Xend; X Xprocedure init_player(playername:string := ''); Xvar X i,n:integer; X s:string; X X procedure init_prime; X begin X plr`5Bnow`5D.log := n; X wl('Damn glad you could make it.'); X grab_line('Enter a password you will remember:',s,,false); X if playername = '' then playername := name`5Bna_user`5D.id`5Bplr`5Bnow`5 VD.log`5D; X getname(na_player); X name`5Bna_player`5D.id`5Bn`5D := playername; X putname(na_player); X getname(na_user); X name`5Bna_user`5D.id`5Bplr`5Bnow`5D.log`5D := lowcase(get_userid); X if checkprivs(10) then X begin X grab_line('Username',s); X if s <> '' then name`5Bna_user`5D.id`5Bplr`5Bnow`5D.log`5D := s; X end; X putname(na_user); X getplayer(plr`5Bnow`5D.log); X player.password:= lowcase(s); X pl`5Bnow`5D.where.r := 1; X pl`5Bnow`5D.where.x := 1; X pl`5Bnow`5D.where.y := 1; X putplayer; X end; X Xbegin X first_time := true; X if allocate(i_player,n) then init_prime X else X begin X remove_old_player; X init_prime; X end; Xend; X Xfunction setup_character:boolean; Xvar X s:string; X i:integer; X new_player:boolean; X myusername:shortstring; Xbegin X openfiles; X %include 'root:srclass.pas'; X tickerquick := getticks; X tickernormal := getticks; X tickerslow := getticks; X myusername := lowcase(get_userid); X privlevel := min(10,op_userid); X now := 1; X forget_all; X wl; X wl('Welcome to '+game_name+'!'); X wl('Written by Peter Beaty (maself@ubvms.cc.buffalo.edu).'); X if checkprivs(10) then X if grab_yes('Enter system? ') then do_system; X readnames; X readindexes; X new_player := not exact_name(na_user,i,myusername); X plr`5Bnow`5D.log := i; X grab_line('By what name are you known',s); X setup_character := true; X if (s = '') and new_player then init_player X else if s = '' then setup_character := revive_player X else if lookup(name`5Bna_player`5D.id,s,i) then X begin X plr`5Bnow`5D.log := i; X setup_character := revive_player; X end X else if new_player then init_player(s) X else if checkprivs(10) then init_player(s) X else setup_character := false; X interactive := true; Xend; X Xprocedure enter_realm; Xvar X s:string; Xbegin X debug := false; X getplayer(plr`5Bnow`5D.log); X player.mbx := substr(mymbx,1,20); X putplayer; X getindex(i_ingame); X indx`5Bi_ingame`5D.on`5Bplr`5Bnow`5D.log`5D := true; X putindex(i_ingame); X assign_channels; X player_stats; X stats; X show_stats; X act_out(plr`5Bnow`5D.log,e_msg,,,,,,,name`5Bna_player`5D.id`5Bplr`5Bnow`5D V.log`5D+ X`09'Has entered the realm.'); X enter_room(pl`5Bnow`5D.where); X set_mbx_ast; Xend; X Xprocedure leave_realm; Xbegin X wl('Saving game...'); X leave_room('reality'); X act_out(plr`5Bnow`5D.log,e_deassign,,,,,,,,,true); X deassign_channels; X deassign_channel(mychannel); X getindex(i_ingame); X indx`5Bi_ingame`5D.on`5Bplr`5Bnow`5D.log`5D := false; X putindex(i_ingame); X sysstatus := lib$cvt_from_internal_time(lib$k_second_of_year, X %ref pl`5Bnow`5D.last_play); X save_player; X smg$end_pasteboard_update(pasteboard); Xend; X X`5Bglobal`5D Xfunction handle_key(a_key:$uword; key_mode:integer):boolean; Xvar X i,x,y:integer; X a_loc:loc; X s:string; X Xmain_help`09:array`5B1..50`5D of shortstring := ( X`09'1..9 Keypad Movement', X`09'up/dn arrows scroll', X`09'5 Go through exit', X`09'0 Picks up object', X`09'Enter Attacks target', X`09', Target''s health', X`09''' Says something', X`09'A Rebirth', X`09'`5Ea Toggle screen', X`09'b player status', X`09'B Brief mode', X`09'C choose class', X`09'c climb', X`09'd drops an object', X`09'D duplicate object', X`09'e equip something', X`09'F Paste foregrounds', X`09'`5Ef show fg layers', X`09'i inventory', X`09'j jump up', X`09'k kneel at shrine', X`09'K Known spells', X`09'l look at someone', X`09'`5El listen for sounds', X`09'm map a foreground', X`09'n change your name', X`09'o open/close a door', X`09'O operator menu', X`09'p set your password', X`09'P players list', X`09'`5Ep toggle privs', X`09'q quits', X`09'`5Er refresh screen', X`09'r use something', X`09'R change race', X`09's show stats', X`09'S Scan players', X`09't throw something', X`09'T target someone', X`09'u unequip something', X`09'U unmap foreground', X`09'v set scroll ratio', X`09'V toggle view', X`09'w who list', X`09'W whisper something', X`09'`5Ew set window size', X`09'X show coordinates', X`09'x center yourself', X`09'y yell something', X`09'z zap a spell'); X Xoperator_help:array`5B1..25`5D of shortstring := ( X`09'`5Ea activete npc', X`09'C toggle cursor', X`09'd debug mode', X`09'D delete player', X`09'e map text', X`09'`5Ee drag char', X`09'E edit something', X`09'f find fg type', X`09'i install foregnds', X`09'k kill someone :)', X`09'l L `5El cheat', X`09'M make room, etc', X`09'`5Ep respond to poof', X`09'p poof somewhere', X`09'q Quit players', X`09'P disk performance', X`09'`5Er player <> random', X`09'r remote poof', X`09's show plr status', X`09'S enter system', X`09'u U `5Eu set screen', X`09'v center viewport', X`09'w do a whois', X`09'`5Ew write foreground', X`09'x poof to target'); X X begin X case key_mode of X X0`09: Xcase a_key of X smg$k_trm_up`09`09:x_up; X smg$k_trm_down`09:x_down; X otherwise handle_key := true; Xend; X Xkey_kind: Xbegin X case a_key of X smg$k_trm_question_mark: X begin X wl('f - foreground o - object p - player'); X wl('r - race R - Room s - spell'); X end; X smg$k_trm_lowercase_f, X smg$k_trm_lowercase_o, X smg$k_trm_lowercase_r, X smg$k_trm_lowercase_s, X smg$k_trm_uppercase_r, X smg$k_trm_lowercase_q:handle_key := true; X end; Xend; X Xkey_get_direction: Xbegin X case a_key of X smg$k_trm_kp2`09`09:a_key := smg$k_trm_two; X smg$k_trm_kp4`09`09:a_key := smg$k_trm_four; X smg$k_trm_kp6`09`09:a_key := smg$k_trm_six; X smg$k_trm_kp8`09`09:a_key := smg$k_trm_eight; X end; X X case a_key of X smg$k_trm_two, X smg$k_trm_four, X smg$k_trm_six, X smg$k_trm_eight, X smg$k_trm_lowercase_n, X smg$k_trm_uppercase_n, X smg$k_trm_lowercase_s, X smg$k_trm_uppercase_s, X smg$k_trm_lowercase_e, X smg$k_trm_uppercase_e, X smg$k_trm_lowercase_w, X smg$k_trm_uppercase_w`09:handle_key := true; +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-