-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+ X otherwise handle_key := false; X end; Xend; X Xkey_move_only: Xcase a_key of X smg$k_trm_kp1, X smg$k_trm_one`09`09:do_go(1); X smg$k_trm_kp2, X smg$k_trm_two`09`09:do_go(2); X smg$k_trm_kp3, X smg$k_trm_three`09:do_go(3); X smg$k_trm_kp4, X smg$k_trm_four`09:do_go(4); X smg$k_trm_kp5, X smg$k_trm_five`09:do_go(5); X smg$k_trm_kp6, X smg$k_trm_six`09`09:do_go(6); X smg$k_trm_kp7, X smg$k_trm_seven`09:do_go(7); X smg$k_trm_kp8, X smg$k_trm_eight`09:do_go(8); X smg$k_trm_kp9, X smg$k_Trm_nine`09:do_go(9); X smg$k_trm_period, X smg$k_trm_dot`09`09:handle_key := true; Xend; X Xkey_operator: Xbegin X case a_key of X smg$k_trm_ctrla`09:if checkprivs(10,true) then X`09`09`09 act_out(plr`5Bnow`5D.log,e_activate); X smg$k_trm_uppercase_c`09:if rnum(2) = 1 then disable_cursor X`09`09`09 else enable_cursor; X smg$k_trm_ctrld`09:balance_distribution; X smg$k_trm_lowercase_d`09:debug := not debug; X smg$k_trm_uppercase_d`09:if checkprivs(8,true) then X`09`09`09 if get_name(name`5Bna_player`5D.id,'Player to delete ',i) then X`09`09`09`09delete_player(i); X`7B smg$k_trm_ctrld`09:begin X`09`09`09 grab_line('DCL command:',s); X`09`09`09 sysstatus := lib$spawn(s,,'sys$scratch:sr.scratch'); X`09`09`09 typefile('sys$scratch:sr.scratch'); X`09`09`09 sysstatus := lib$delete_file('sys$scratch:sr.scratch'); X`09`09`09 end;`7D X smg$k_trm_lowercase_e`09:begin X`09`09`09 grab_line('Text to be mapped',s); X`09`09`09 for i := pl`5Bnow`5D.where.x to X`09`09`09 min(pl`5Bnow`5D.where.x+length(s)-1,here.size.x) do X`09`09`09 begin X`09`09`09 here.background`5Bi,pl`5Bnow`5D.where.y`5D := X`09`09`09 s`5B1+i-pl`5Bnow`5D.where.x`5D; X`09`09`09 fix_scenery(i,pl`5Bnow`5D.where.y); X`09`09`09 end; X`09`09`09 end; X smg$k_trm_ctrle`09:begin X`09`09`09 grab_line('Character to be dragged',s); X`09`09`09 if s = '' then drag_char := chr(0) X`09`09`09 else drag_char := s`5B1`5D; X`09`09`09 end; X smg$k_trm_uppercase_e`09:if checkprivs(1,true) then do_custom; X smg$k_trm_ctrli`09:if checkprivs(10,true) then X`09`09`09 act_out(plr`5Bnow`5D.log,e_halt); X smg$k_trm_uppercase_f`09:find_gold; X smg$k_trm_lowercase_f`09:begin X`09`09`09 grab_num('Foreground kind to find ',i,1,fg_max); X`09`09`09 if foreground_location(i,x,y) then X`09`09`09 begin X`09`09`09 wl(fg_type`5Bi`5D); X`09`09`09 show_coordinates(x,y); X`09`09`09 end; X`09`09`09 end; X smg$k_trm_lowercase_h, X smg$k_trm_question_mark :x_write_array(operator_help,,'Op help'); X smg$k_trm_lowercase_i`09:if grab_yes('Overwrite current foregrounds') then X`09`09`09 install_foregrounds; X smg$k_trm_lowercase_k`09:if checkprivs(10) then X`09`09`09 if get_name(name`5Bna_player`5D.id,'Kill whom?',i) then X`09`09`09 if i = plr`5Bnow`5D.log then do_die(i) X`09`09`09 else act_out(plr`5Bnow`5D.log,e_kill,i); X smg$k_trm_lowercase_l`09:if checkprivs(8,true) then X`09`09`09 if get_name(attrib_name,'Attribute Max',i) then X`09`09`09 grab_num('Max value',pl`5Bnow`5D.attrib_max`5Bi`5D); X smg$k_trm_uppercase_l`09:if checkprivs(8,true) then X`09`09`09 if get_name(attrib_name,'Attribute Current',i) then X`09`09`09 grab_num('Current value',pl`5Bnow`5D.attrib`5Bi`5D); X smg$k_trm_ctrll`09:if checkprivs(8,true) then X`09`09`09 if get_name(element,'Proficiency in',i,,,0) then X`09`09`09 grab_num('Value',pl`5Bnow`5D.proficiency`5Bi`5D); X smg$k_trm_uppercase_m`09:if checkprivs(8,true) then do_create; X smg$k_trm_lowercase_p`09:if checkprivs(4,true) then do_poof; X smg$k_trm_uppercase_p`09:begin X`09`09`09 performance := not performance; X`09`09`09 wl('Disk performance '+boo(performance)); X`09`09`09 end; X smg$k_trm_ctrlp`09:if plr`5Bnow`5D.dest.mission in `5B1..indx`5Bi_room`5D. Vtop`5D then X`09`09`09 begin X`09`09`09 a_loc.r := plr`5Bnow`5D.dest.mission; X`09`09`09 a_loc.x := plr`5Bnow`5D.dest.x; X`09`09`09 a_loc.y := plr`5Bnow`5D.dest.y; X`09`09`09 poof_prime(a_loc); X`09`09`09 end; X smg$k_trm_uppercase_q`09:if checkprivs(10,true) then X`09`09`09 if grab_yes('Quit all players?') then X`09`09`09 begin X`09`09`09 grab_line('Message?',s); X`09`09`09 grab_num('Time',i,0,1000,10); X`09`09`09 if s = '' then writev(s,'You have ',i:0, X`09`09`09 ' seconds to quit or your game will be halted.'); X`09`09`09 act_out(plr`5Bnow`5D.log,e_msg,,,,,,,s,,true); X`09`09`09 wait(i); X`09`09`09 act_out(plr`5Bnow`5D.log,e_quit,,,,,,,,,true); X`09`09`09 end; X smg$k_trm_lowercase_q`09:handle_key := true; X smg$k_trm_ctrlw`09:if checkprivs(2,true) then do_save_room; X smg$k_trm_lowercase_r`09:do_remote_poof; X smg$k_trm_ctrlr`09:designate_randoms; X smg$k_trm_uppercase_s`09:if checkprivs(10,true) then do_system; X smg$k_trm_lowercase_s`09:if checkprivs(10,true) then show_status; X smg$k_trm_lowercase_t`09:if checkprivs(8,true) then X`09`09`09 begin X`09`09`09 leave_realm; X`09`09`09 if get_name(name`5Bna_player`5D.id, X`09`09`09 'Game name to takeover',i) then X`09`09`09 begin X`09`09`09 plr`5Bnow`5D.log := i; X`09`09`09 revive_player; X`09`09`09 enter_realm; X`09`09`09 end; X`09`09`09 end; X smg$k_trm_lowercase_u`09:begin X`09`09`09 vpmaxx := 78; X`09`09`09 vpmaxy := 22; X`09`09`09 myvpmaxx := 78; X`09`09`09 myvpmaxy := 22; X`09`09`09 smg$begin_pasteboard_update(pasteboard); X`09`09`09 draw_screen(true); X`09`09`09 end; X smg$k_trm_uppercase_u`09:begin X`09`09`09 vpmaxx := 48; X`09`09`09 vpmaxy := 15; X`09`09`09 myvpmaxx := 48; X`09`09`09 myvpmaxy := 15; X`09`09`09 smg$begin_pasteboard_update(pasteboard); X`09`09`09 draw_screen(true); X`09`09`09 end; X smg$k_trm_ctrlu`09:begin X`09`09`09 vpmaxx := 78; X`09`09`09 vpmaxy := 15; X`09`09`09 myvpmaxx := 78; X`09`09`09 myvpmaxy := 15; X`09`09`09 smg$begin_pasteboard_update(pasteboard); X`09`09`09 draw_screen(true); X`09`09`09 end; X smg$k_trm_lowercase_w`09:if checkprivs(1,true) then do_whois; X smg$k_trm_lowercase_v`09:vp_center; X smg$k_trm_lowercase_x`09:if plr`5Bnow`5D.target`5B1`5D.log <> 0 then X`09`09`09 if person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.here then X`09`09`09 begin X`09`09`09 a_loc.r := here.valid; X`09`09`09 a_loc.x := person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.loc.x; X`09`09`09 a_loc.y := person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.loc.y; X`09`09`09 poof_prime(a_loc); X`09`09`09 end X`09`09`09 else wl('That person is not here.') X`09`09`09 else wl('You must first target someone.'); X end; X new_prompt('Op>'); Xend; X Xkey_main: Xbegin X handle_key := false; X case a_key of X smg$k_trm_up`09`09:x_up; X smg$k_trm_down`09:x_down; X smg$k_trm_kp0, X smg$k_trm_zero`09:if pl`5Bnow`5D.sts`5Bps_dead`5D.on then wl('Ghosts can'' Vt do that.') X`09`09`09 else if not plr`5Bnow`5D.hands then X`09`09`09 wl('Your body is not equipped to do that.') X`09`09`09 else do_get; X smg$k_trm_kp1, X smg$k_trm_one`09`09:do_go(1); X smg$k_trm_kp2, X smg$k_trm_two`09`09:do_go(2); X smg$k_trm_kp3, X smg$k_trm_three`09:do_go(3); X smg$k_trm_kp4, X smg$k_trm_four`09:do_go(4); X smg$k_trm_kp5, X smg$k_trm_five`09:do_go(5); X smg$k_trm_kp6, X smg$k_trm_six`09`09:do_go(6); X smg$k_trm_kp7, X smg$k_trm_seven`09:do_go(7); X smg$k_trm_kp8, X smg$k_trm_eight`09:do_go(8); X smg$k_trm_kp9, X smg$k_trm_nine`09:do_go(9); X smg$k_trm_space`09:if checkprivs(2) then here.background`5Bpl`5Bnow`5D.whe Vre.x,pl`5Bnow`5D.where.y`5D := X`09`09`09 getkey(0); X smg$k_trm_quote`09:do_say('Say: ','says',snd_normal); X smg$k_trm_comma`09:if plr`5Bnow`5D.target`5B1`5D.log = 0 then do_target X`09`09`09 else if on_screen(person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.loc.x V, X`09`09`09 person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.loc.y) then X`09`09`09 act_out(plr`5Bnow`5D.log,e_req_status,,, X`09`09`09 plr`5Bnow`5D.target`5B1`5D.log,at_health,,,,,, X`09`09`09 person`5Bplr`5Bnow`5D.target`5B1`5D.log`5D.channel) X`09`09`09 else wl('I can''t tell from here.'); X smg$k_trm_enter`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on and (not frozen) V then X`09`09`09 do_attack X`09`09`09 else if pl`5Bnow`5D.sts`5Bps_dead`5D.on then wl('You be dead.'); X smg$k_trm_uppercase_a`09:if pl`5Bnow`5D.sts`5Bps_dead`5D.on or checkprivs V(10) then do_rebirth X`09`09`09 else wl('Don''t be silly.'); X smg$k_trm_ctrla`09:toggle_full_text(not full_text); X smg$k_trm_lowercase_b`09:show_player_status; X smg$k_trm_uppercase_b`09:do_brief; X smg$k_trm_lowercase_c`09:if not step_up(pl`5Bnow`5D.where.x,pl`5Bnow`5D.wh Vere.y,1,true) then X`09`09`09 wl('You cannot climb here.'); X smg$k_trm_uppercase_c`09:choose_class; X smg$k_trm_lowercase_d`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_dr Vop; X smg$k_trm_uppercase_d`09:if checkprivs(2,true) then do_duplicate; X smg$k_trm_lowercase_e`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_eq Vuip; X smg$k_trm_uppercase_f`09:if checkprivs(2,true) then custom_fg_geometry; X smg$k_trm_ctrlf`09:do_identify; X smg$k_trm_lowercase_h, X smg$k_trm_question_mark :x_write_array(main_help,,game_name+' help'); X smg$k_trm_lowercase_i`09:do_inventory; X smg$k_trm_lowercase_j`09:if not step_up(pl`5Bnow`5D.where.x,pl`5Bnow`5D.wh Vere.y, X`09`09`09 2 * pl`5Bnow`5D.attrib`5Bat_size`5D,true) then X`09`09`09 wl('Boing!'); X smg$k_trm_lowercase_k`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_pr Vay; X smg$k_trm_uppercase_k`09:show_spells; X`7B smg$k_trm_ctrlk`09:if checkprivs(2) then X`09`09 `09begin X`09`09`09 sysstatus := lib$spawn; X`09`09`09 smg$repaint_screen(pasteboard); X`09`09`09 end;`7D X smg$k_trm_lowercase_l`09:do_look; X smg$k_trm_uppercase_l`09:if checkprivs(2) then do_list; X smg$k_trm_ctrll`09:begin X`09`09`09 wl('---Listening---'); X`09`09`09 freeze(2); X`09`09`09 act_out(plr`5Bnow`5D.log,e_listen); X`09`09`09 end; X smg$k_trm_lowercase_n`09:do_name; X smg$k_trm_lowercase_m`09:if checkprivs(2) then X`09`09`09 if get_name(fg.name,'Foreground to map ',i) X`09`09`09 then fg_map := i X`09`09`09 else fg_map := 0; X smg$k_trm_lowercase_o`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_op Ven; X smg$k_trm_uppercase_o`09:if checkprivs(1,true) then grab_key('Op> ',key_op Verator); X smg$k_trm_lowercase_p`09:do_password; X smg$k_trm_uppercase_p`09:do_players; X smg$k_trm_ctrlp`09:do_privs; X smg$k_trm_lowercase_q`09:if grab_yes('Quit forever? ') then handle_key := V true; X smg$k_trm_ctrlr`09:smg$repaint_screen(pasteboard); X smg$k_trm_lowercase_r`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_us Ve; X smg$k_trm_uppercase_r`09:choose_race; X smg$k_trm_uppercase_s`09:do_scan; X smg$k_trm_lowercase_s`09:show_stats; X smg$k_trm_uppercase_t`09:do_target; X smg$k_trm_lowercase_t`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_th Vrow; X smg$k_trm_lowercase_u`09:do_unequip; X smg$k_trm_uppercase_u`09:if checkprivs(2,true) then X`09`09`09 if get_name(fg.name,'Foreground to unmap ',i) then X`09`09`09 fg_map := -i X`09`09`09 else fg_map := 0; X smg$k_trm_uppercase_v`09:do_view; X smg$k_trm_lowercase_v`09:do_scroll; X smg$k_trm_lowercase_w`09:do_who; X smg$k_trm_uppercase_w`09:do_say('Whisper: ','whispers',snd_whisper); X smg$k_trm_ctrlw`09:do_window; X smg$k_trm_uppercase_x`09:show_coordinates(pl`5Bnow`5D.where.x,pl`5Bnow`5D. Vwhere.y); X smg$k_trm_lowercase_x`09:center_me(true); X smg$k_trm_lowercase_y`09:do_say('Yell: ','screams',snd_audible); X smg$k_trm_lowercase_z`09:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then do_ca Vst; X end; X new_prompt('Sr> '); Xend; X X end; Xend; X X`7B`09c_delete`09:if checkprivs then do_delete(s);`7D X Xfunction getkey`7B(key_mode:integer := 0):char`7D; Xvar X a_key:$uword; X gotkey:boolean := false; Xbegin X repeat X a_key := keyget; X if a_key = smg$k_trm_timeout then X begin X if interactive then allacts; X end X else gotkey := handle_key(a_key,key_mode); X until gotkey; X getkey := chr(a_key); Xend; X Xbegin X if create_mymbx('SHADOWBOX') then X begin X setup_display; X human := true; X if setup_character then X begin X enter_realm; X getkey(key_main); X leave_realm; X end X else wl('Unable to enter '+game_name+'.'); X remove_display; X end; Xend. $ CALL UNPACK SR.PAS;1 1664198001 $ create 'f' X`5Binherit ('srinit','srsys','srother','srmove','srmisc','srio'), X environment('sract')`5D X Xmodule sract; X X`5Basynchronous`5D Xprocedure remember(sendlog,x,y,base,head,mask:integer); Xbegin X person`5Bsendlog`5D.alive := unmask(mask,m_alive); X person`5Bsendlog`5D.here := true; X person`5Bsendlog`5D.loc.x := x; X person`5Bsendlog`5D.loc.y := y; X person`5Bsendlog`5D.feet := base; X person`5Bsendlog`5D.head := head; Xend; X X`5Basynchronous`5D Xprocedure plot_player(theirlog,x,y,p1,p2:integer); Xbegin X people_map`5Bx,y`5D := theirlog; X fix_scenery(x,y); X person`5Btheirlog`5D.loc.x := x; X person`5Btheirlog`5D.loc.y := y; X person`5Btheirlog`5D.feet := p1; X person`5Btheirlog`5D.head := p2; Xend; X X`5Basynchronous,global`5D Xprocedure unplot_player(theirlog:integer); Xbegin X with person`5Btheirlog`5D.loc do X begin X people_map`5Bx,y`5D := 0; X fix_scenery(x,y); X end; Xend; X X`5Basynchronous`5D Xprocedure bump_me(s:string); Xbegin X wl(s+' bumps into you.'); X do_go(1+rnd mod 9); Xend; X X`5Basynchronous`5D Xfunction soundfrom(x,y:integer):string; Xvar X slope:real; Xbegin X slope := (y-pl`5Bnow`5D.where.y)/(0.1+x-pl`5Bnow`5D.where.x); X if y-pl`5Bnow`5D.where.y < 0 then X begin X if abs(slope) > 1 then soundfrom := dir`5Bd_north`5D X else if x-pl`5Bnow`5D.where.x > 0 then soundfrom := dir`5Bd_east`5D X else soundfrom := dir`5Bd_west`5D; X end X else X begin X if abs(slope) > 1 then soundfrom := dir`5Bd_south`5D X else if x-pl`5Bnow`5D.where.x > 0 then soundfrom := dir`5Bd_east`5D X else soundfrom := dir`5Bd_west`5D; X end; Xend; X X`5Bglobal,asynchronous`5D Xprocedure handle_act; Xvar X moron,n,i,j,mask,sendlog,theact,x,y,p1,p2,p3,p4:integer; X a_loc:loc; X sendname:shortstring; X s,ss:$udata; Xbegin X with act do X begin X sendlog := sender; X theact := action; X s := msg; X ss:= note; X x := xloc; X y := yloc; X p1 := parm1; X p2 := parm2; X p3 := parm3; X p4 := parm4; X end; X X if sendlog <> 0 then sendname := name`5Bna_player`5D.id`5Bsendlog`5D X else sendname := 'Unknown'; X X case theact of X +-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-