home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / GAMES / DGEM / DGEM_DEV / DGEMDEV / DGEM.GFA (.txt) next >
GFA-BASIC Atari  |  2002-01-14  |  164KB  |  8,737 lines

  1. $m 256000
  2. IF FRE()<256000
  3.   ~FORM_ALERT(1,"[1][ Insufficient or fragmented | memory. ][ Quit ]")
  4.   QUIT 0
  5. ELSE
  6.   @init_1
  7.   @init_2
  8.   @gere_legal
  9.   @init_loading
  10.   @exit_loading
  11.   @snd_init
  12.   @boucle_generale
  13. ENDIF
  14. '
  15. > PROCEDURE sortir
  16.   tout_fermer
  17.   @gxalloc_main_exit(2)
  18.   IF background!
  19.     @remove_background
  20.   ENDIF
  21.   ~@garbage_close(1)
  22.   IF old_color_adr%=color_adr1% AND color_adr1%>0
  23.     vs_color(color_adr2%)
  24.   ENDIF
  25.   FOR k&=0 TO img_nb_slots&
  26.     unload_image(k&)
  27.   NEXT k&
  28.   IF dgx_adr%>0
  29.     ~GEMDOS(73,L:dgx_adr%)
  30.     dgx_adr%=0
  31.   ENDIF
  32.   FOR k&=0 TO snd_nb_slots&
  33.     unload_sound(k&)
  34.   NEXT k&
  35.   snd_exit
  36.   IF maze_desgin_adr%>0
  37.     ~GEMDOS(73,L:maze_design_adr%)
  38.   ENDIF
  39.   IF color_adr1%>0
  40.     ~GEMDOS(73,L:color_adr1%)
  41.   ENDIF
  42.   IF color_temp%>0
  43.     ~GEMDOS(73,L:color_temp%)
  44.   ENDIF
  45.   IF memory_pattern%>0
  46.     ~GEMDOS(73,L:memory_pattern%)
  47.   ENDIF
  48.   IF bubble%>0
  49.     ~GEMDOS(73,L:bubble%)
  50.   ENDIF
  51.   IF mfdb_structure%>0
  52.     ~GEMDOS(73,L:mfdb_structure%)
  53.   ENDIF
  54.   IF t_buf%>0
  55.     ~GEMDOS(73,L:t_buf%)
  56.   ENDIF
  57.   IF m_adr%>0
  58.     ~GEMDOS(73,L:m_adr%)
  59.   ENDIF
  60.   ~MENU_BAR(adtree%(0),0)
  61.   ~RSRC_FREE()
  62.   @v_clsvwk(vdi_handle&)
  63.   ~APPL_EXIT()
  64.   QUIT 0
  65. RETURN
  66. '
  67. > PROCEDURE init_1
  68.   ap_id&=APPL_INIT()
  69.   vdi_handle&=@v_opnvwk
  70.   ~GRAF_MOUSE(0,0)
  71.   '
  72.   dummy%=LPEEK(&H4F2)
  73.   dummy$=CHR$(ADD(48,PEEK(ADD(dummy%,2))))
  74.   dummy$=dummy$+CHR$(ADD(48,PEEK(ADD(dummy%,4))))+CHR$(ADD(48,PEEK(ADD(dummy%,3))))
  75.   tos_version%=VAL(dummy$)
  76.   '
  77.   magic!=@test_cookie("MagX",dummy%)
  78.   mint!=@test_cookie("MiNT",dummy%) OR @test_cookie("Gnva",dummy%)
  79.   '
  80.   aes&=VAL(HEX$(INT{LONG{ADD(GB,4)}}))
  81.   IF magic! OR mint!
  82.     naes!=TRUE
  83.   ENDIF
  84.   '
  85.   IF ap_id&=-1 OR vdi_handle&<0
  86.     sortir
  87.   ENDIF
  88.   '
  89.   ~WIND_UPDATE(1)
  90.   ~WIND_UPDATE(3)
  91.   '
  92.   ~WIND_GET(0,4,screenx&,screeny&,screenl&,screenh&)
  93.   '
  94.   @gxalloc_main_init(2)
  95.   @declare_var_general
  96.   @declare_var_maze
  97.   @declare_var_coords
  98.   @declare_var_image
  99.   @declare_var_sound
  100.   @declare_var_text
  101.   @declare_var_tables
  102.   @declare_var_job
  103.   @declare_var_preferences
  104.   RESERVE 32000
  105.   @declare_mem_general
  106.   @declare_mem_image
  107.   @declare_mem_color
  108.   '
  109.   ~RSRC_FREE()
  110.   IF @s_exist(pathfile_rsc$)=TRUE
  111.     IF RSRC_LOAD(pathfile_rsc$)=0
  112.       ~FORM_ALERT(1,"[1][ DGEM.RSC couldn't be loaded as | RSC file.][ Quit ]")
  113.       sortir
  114.     ELSE
  115.       FOR i&=0 TO nb_tree&
  116.         ~RSRC_GADDR(0,i&,adtree%(i&))
  117.       NEXT i&
  118.       FOR i&=1 TO nb_tree&
  119.         ~FORM_CENTER(adtree%(i&),xd&(i&),yd&(i&),ld&(i&),dummy&)
  120.         hd&(i&)=OB_H(adtree%(i&),0)
  121.       NEXT i&
  122.     ENDIF
  123.   ELSE
  124.     ~FORM_ALERT(1,"[1][ DGEM.RSC not found.| Put it in DGEM.DAT\SYS\ | folder.][ Quit ]")
  125.     sortir
  126.   ENDIF
  127.   '
  128.   @declare_mem_cursor
  129.   '
  130. RETURN
  131. > PROCEDURE declare_var_general
  132.   '
  133.   dgem_version$="0.14"
  134.   '
  135.   c0$=CHR$(0)
  136.   folder_home$=CHR$(ADD(GEMDOS(25),65))+":"+DIR$(SUCC(GEMDOS(25)))+"\"
  137.   '
  138.   extension_img$=".DGI"+c0$
  139.   extension_sav$=".DGS"+c0$
  140.   extension_snd$=".DGW"+c0$
  141.   extension_dwi$=".DWI"+c0$
  142.   extension_dfi$=".DFI"+c0$
  143.   extension_msg$=".MSG"+c0$
  144.   extension_job$=".JOB"+c0$
  145.   '
  146.   folder_maze$=folder_home$+"DGEM.DAT\MAZE\"
  147.   folder_image$=folder_home$+"DGEM.DAT\IMAGES\"
  148.   folder_sound$=folder_home$+"DGEM.DAT\SOUNDS\"
  149.   folder_system$=folder_home$+"DGEM.DAT\SYS\"
  150.   folder_game$=folder_home$+"DGEM.DAT\GAMES\"
  151.   '
  152.   filename_rsc$="DGEM.RSC"+c0$
  153.   filename_hyp$="DGEM.HYP"+c0$
  154.   filename_inf$="DGEM.INF"+c0$
  155.   filename_col$="DGEM.P04"+c0$
  156.   '
  157.   filename_dgm$="LABYRINT.DGM"+c0$
  158.   '
  159.   pathfile_rsc$=folder_system$+filename_rsc$
  160.   pathfile_hyp$=folder_system$+filename_hyp$
  161.   pathfile_inf$=folder_system$+filename_inf$
  162.   pathfile_col$=folder_system$+filename_col$
  163.   '
  164.   dummy$=SPACE$(128)
  165.   image_filename$=SPACE$(128)
  166.   '
  167.   signature$="Rajah Lone"
  168.   CLR signature$
  169.   '
  170.   nb_tree&=12
  171.   nb_window&=5
  172.   tree_window_title&=6
  173.   tree_iconified&=7
  174.   tree_alerts&=8
  175.   tree_legal&=9
  176.   '
  177.   DIM adtree%(nb_tree&),xd&(nb_tree&),yd&(nb_tree&),ld&(nb_tree&),hd&(nb_tree&)
  178.   DIM hand_win&(nb_tree&),wx&(nb_tree&),wy&(nb_tree&),wl&(nb_tree&),wh&(nb_tree&)
  179.   '
  180.   DIM win!(nb_tree&),aff!(nb_tree&)
  181.   FOR i&=0 TO nb_tree&
  182.     win!(i&)=FALSE
  183.     aff!(i&)=FALSE
  184.   NEXT i&
  185.   '
  186.   DIM cp_win&(nb_tree&)
  187.   FOR i&=0 TO nb_window&
  188.     cp_win&(i&)=&X1011
  189.   NEXT i&
  190.   IF naes!=TRUE
  191.     cp_win&(0)=BSET(cp_win&(0),14)
  192.   ENDIF
  193.   '
  194.   screen_width&=ADD(screenx&,screenl&)
  195.   screen_height&=ADD(screeny&,screenh&)
  196.   '
  197.   DIM keyboard_type$(3)
  198.   keyboard_type&=0
  199.   keyboard_type$(0)="ATARI"
  200.   keyboard_type$(1)="PC"
  201.   keyboard_type$(2)="MAC"
  202.   '
  203. RETURN
  204. > PROCEDURE declare_var_maze
  205.   '
  206.   myself_position_n&=0
  207.   myself_position_x&=10
  208.   myself_position_y&=10
  209.   myself_direction&=1
  210.   myself_new_direction&=1
  211.   '
  212.   ' 1=north, 2=south, 3=east, 4=west
  213.   '
  214.   maze_simulate_move&=11
  215.   '
  216.   maze_design_adr%=0
  217.   maze_design_len%=0
  218.   '
  219.   maze_nb_level&=0
  220.   maze_width&=0
  221.   maze_height&=0
  222.   '
  223.   DIM maze_design_level_adr%(32) ! for quick computing (set/get maze design)
  224.   '
  225.   DIM litem_array_level_adr%(32) ! for quick computing (set/get tile containor)
  226.   litem_array_len%=0
  227.   litem_array_adr%=0
  228.   '
  229.   ' relation item+position -> image id
  230.   ' idx  witem fitem
  231.   ' 0    F1F   F0
  232.   ' 1    F1L   L0
  233.   ' 2    F1R   R0
  234.   ' 3    F2F   F1
  235.   ' 4    F2L   L1
  236.   ' 5    F2R   R1
  237.   ' 6    L2F   F2
  238.   ' 7    R2F   L2
  239.   ' 8    L3F   R2
  240.   ' 9    F3L   F3
  241.   ' 10   F3R   L3
  242.   ' 11   L3F   R3
  243.   ' 12   R3F
  244.   '
  245.   witem_family_max&=6
  246.   witem_id_max&=64
  247.   DIM witem_to_sprite&(PRED(witem_family_max&),witem_id_max&,12,2)
  248.   fitem_family_max&=6
  249.   fitem_id_max&=32
  250.   DIM fitem_to_sprite&(PRED(fitem_family_max&),fitem_id_max&,12,2)
  251.   '
  252.   DIM litem_save%(MAX(fitem_id_max&,witem_id_max&))
  253.   '
  254.   DIM wall_inscription$(4),wall_inscription_len&(4)
  255.   wall_inscription$(0)=SPACE$(9)
  256.   wall_inscription_len&(0)=0
  257.   wall_inscription$(1)=SPACE$(9)
  258.   wall_inscription_len&(1)=0
  259.   wall_inscription$(2)=SPACE$(9)
  260.   wall_inscription_len&(2)=0
  261.   wall_inscription$(3)=SPACE$(9)
  262.   wall_inscription_len&(3)=0
  263.   '
  264.   offset_inscription_ptr&=4
  265.   '
  266.   offset_item_type&=0
  267.   offset_item_family&=1
  268.   offset_item_id&=2
  269.   offset_item_active&=3
  270.   '
  271.   offset_door_behavior&=4
  272.   offset_door_opened_by&=5
  273.   offset_door_orientation&=6
  274.   offset_door_job_type&=7
  275.   offset_door_open_state&=8
  276.   '
  277.   offset_teleporter_behavior&=4
  278.   offset_teleporter_scope&=5
  279.   offset_teleporter_rotation&=6
  280.   '
  281.   offset_switch_action_type&=4
  282.   offset_switch_behavior&=5
  283.   offset_switch_state&=8
  284.   '
  285.   offset_pad_action_type&=4
  286.   offset_pad_scope&=5
  287.   offset_pad_behavior&=6
  288.   '
  289.   offset_target_n&=10
  290.   offset_target_x&=12
  291.   offset_target_y&=14
  292.   '
  293. RETURN
  294. > PROCEDURE declare_var_coords
  295.   '
  296.   coords_nb_slots&=300
  297.   DIM coords_x&(coords_nb_slots&),coords_y&(coords_nb_slots&),coords_w&(coords_nb_slots&),coords_h&(coords_nb_slots&)
  298.   '
  299.   coords_w&(0)=224
  300.   coords_h&(0)=136
  301.   '
  302.   sensible_zone_space!=FALSE ! true if not blocked by a wall
  303.   '
  304.   sensible_zone_hand!=FALSE ! true if switch or active object on wall
  305.   sensible_zone_hand_id&=-1 ! coords id of this object
  306.   '
  307.   sensible_zone_f1l_ptr%=0 ! left distant floor
  308.   sensible_zone_f1r_ptr%=0 ! right distant floor
  309.   sensible_zone_f0l_ptr%=0 ! left near floor
  310.   sensible_zone_f0r_ptr%=0 ! right near floor
  311.   sensible_zone_hand_ptr%=0 ! on front wall or door
  312.   '
  313.   DIM ipwi_select&(13) ! height for wall inscriptions (number of lines)
  314.   ipwi_select&(0)=175
  315.   ipwi_select&(1)=178
  316.   ipwi_select&(2)=178
  317.   ipwi_select&(3)=176
  318.   ipwi_select&(4)=179
  319.   ipwi_select&(5)=179
  320.   ipwi_select&(6)=176
  321.   ipwi_select&(7)=176
  322.   ipwi_select&(8)=177
  323.   ipwi_select&(9)=180
  324.   ipwi_select&(10)=180
  325.   ipwi_select&(11)=177
  326.   ipwi_select&(12)=177
  327.   '
  328. RETURN
  329. > PROCEDURE declare_var_image
  330.   '
  331.   dungeon_view_len%=0
  332.   '
  333.   ' number of slots for images pool
  334.   img_nb_slots&=1500
  335.   '
  336.   ' MFDB and coord of the images
  337.   DIM img_mfdb%(img_nb_slots&)
  338.   DIM img_x&(img_nb_slots&),img_y&(img_nb_slots&)
  339.   DIM img_dx&(img_nb_slots&),img_dy&(img_nb_slots&)
  340.   DIM img_w&(img_nb_slots&),img_h&(img_nb_slots&)
  341.   '
  342.   ' pointer to loaded DGX file (group of DGI DGEM Images) or DGI file if not existing
  343.   dgx_adr%=0
  344.   old_dgx_filename$=""
  345.   '
  346.   ' rescale view (magnify *1 *2 *3)
  347.   scale_view!=FALSE
  348.   scale_view&=1
  349.   '
  350.   ' pixel<->palette index in 16 and 256 color mode
  351.   DIM pixorg_col|(256)
  352.   '
  353.   ' bit organization for true color mode
  354.   DIM bitorg_r|(16),bitorg_g|(16),bitorg_b|(16)
  355.   ' number of red, green, blue for a pixel
  356.   nb_bit_r|=0
  357.   nb_bit_g|=0
  358.   nb_bit_b|=0
  359.   '
  360.   ' 32bit value for palette mode to TC mode transformation
  361.   DIM color#(255)
  362.   '
  363.   ' transcodage table for pixel value<->color of the palette
  364.   DIM trans_pal|(255)
  365.   trans_pal|(0)=0
  366.   trans_pal|(1)=2
  367.   trans_pal|(2)=3
  368.   trans_pal|(3)=6
  369.   trans_pal|(4)=4
  370.   trans_pal|(5)=7
  371.   trans_pal|(6)=5
  372.   trans_pal|(7)=8
  373.   trans_pal|(8)=9
  374.   trans_pal|(9)=10
  375.   trans_pal|(10)=11
  376.   trans_pal|(11)=14
  377.   trans_pal|(12)=12
  378.   trans_pal|(13)=15
  379.   trans_pal|(14)=13
  380.   trans_pal|(15)=1
  381.   FOR i&=16 TO 255
  382.     trans_pal|(i&)=i&
  383.   NEXT i&
  384.   '
  385. RETURN
  386. > PROCEDURE declare_var_sound
  387.   '
  388.   ' number of slots for sounds pool
  389.   snd_nb_slots&=30
  390.   '
  391.   ' RAW sounds adresses
  392.   DIM snd_start%(snd_nb_slots&)
  393.   DIM snd_end%(snd_nb_slots&)
  394.   '
  395.   ' location of sound
  396.   snd_x&=0
  397.   snd_y&=0
  398.   '
  399. RETURN
  400. > PROCEDURE declare_var_tables
  401.   '
  402.   DIM rotation_result&(5,4) ! direction (N1,S2,E3,W4), rotation (0->3 * 90°)
  403.   '
  404.   rotation_result&(1,0)=1
  405.   rotation_result&(1,1)=4
  406.   rotation_result&(1,2)=2
  407.   rotation_result&(1,3)=3
  408.   '
  409.   rotation_result&(2,0)=2
  410.   rotation_result&(2,1)=3
  411.   rotation_result&(2,2)=1
  412.   rotation_result&(2,3)=4
  413.   '
  414.   rotation_result&(3,0)=3
  415.   rotation_result&(3,1)=1
  416.   rotation_result&(3,2)=4
  417.   rotation_result&(3,3)=2
  418.   '
  419.   rotation_result&(4,0)=4
  420.   rotation_result&(4,1)=2
  421.   rotation_result&(4,2)=3
  422.   rotation_result&(4,3)=1
  423.   '
  424.   DIM door_coords_src1&(9,2,4) ! fitem_position - 3, behavior (vert/hori) & state (opened?)
  425.   DIM door_coords_src2&(9,2,4)
  426.   DIM door_coords_des1&(9,2,4)
  427.   DIM door_coords_des2&(9,2,4)
  428.   '
  429.   door_coords_src1&(0,1,0)=105
  430.   door_coords_des1&(0,1,0)=15
  431.   door_coords_src1&(0,1,1)=133
  432.   door_coords_src2&(0,1,1)=134
  433.   door_coords_des1&(0,1,1)=51
  434.   door_coords_des2&(0,1,1)=52
  435.   door_coords_src1&(0,1,2)=135
  436.   door_coords_src2&(0,1,2)=136
  437.   door_coords_des1&(0,1,2)=53
  438.   door_coords_des2&(0,1,2)=54
  439.   door_coords_src1&(0,1,3)=137
  440.   door_coords_src2&(0,1,3)=138
  441.   door_coords_des1&(0,1,3)=55
  442.   door_coords_des2&(0,1,3)=56
  443.   '
  444.   door_coords_src1&(0,0,0)=105
  445.   door_coords_des1&(0,0,0)=15
  446.   door_coords_src1&(0,0,1)=106
  447.   door_coords_des1&(0,0,1)=16
  448.   door_coords_src1&(0,0,2)=107
  449.   door_coords_des1&(0,0,2)=17
  450.   door_coords_src1&(0,0,3)=108
  451.   door_coords_des1&(0,0,3)=18
  452.   '
  453.   door_coords_src1&(1,1,0)=109
  454.   door_coords_des1&(1,1,0)=19
  455.   door_coords_src1&(1,1,1)=140
  456.   door_coords_des1&(1,1,1)=58
  457.   door_coords_src1&(1,1,2)=142
  458.   door_coords_des1&(1,1,2)=60
  459.   door_coords_src1&(1,1,3)=144
  460.   door_coords_des1&(1,1,3)=62
  461.   '
  462.   door_coords_src1&(1,0,0)=109
  463.   door_coords_des1&(1,0,0)=19
  464.   door_coords_src1&(1,0,1)=110
  465.   door_coords_des1&(1,0,1)=20
  466.   door_coords_src1&(1,0,2)=111
  467.   door_coords_des1&(1,0,2)=21
  468.   door_coords_src1&(1,0,3)=112
  469.   door_coords_des1&(1,0,3)=22
  470.   '
  471.   door_coords_src1&(2,1,0)=113
  472.   door_coords_des1&(2,1,0)=23
  473.   door_coords_src1&(2,1,1)=145
  474.   door_coords_des1&(2,1,1)=63
  475.   door_coords_src1&(2,1,2)=147
  476.   door_coords_des1&(2,1,2)=65
  477.   door_coords_src1&(2,1,3)=149
  478.   door_coords_des1&(2,1,3)=67
  479.   '
  480.   door_coords_src1&(2,0,0)=113
  481.   door_coords_des1&(2,0,0)=23
  482.   door_coords_src1&(2,0,1)=114
  483.   door_coords_des1&(2,0,1)=24
  484.   door_coords_src1&(2,0,2)=115
  485.   door_coords_des1&(2,0,2)=25
  486.   door_coords_src1&(2,0,3)=116
  487.   door_coords_des1&(2,0,3)=26
  488.   '
  489.   door_coords_src1&(3,1,0)=117
  490.   door_coords_des1&(3,1,0)=27
  491.   door_coords_src1&(3,1,1)=151
  492.   door_coords_src2&(3,1,1)=152
  493.   door_coords_des1&(3,1,1)=69
  494.   door_coords_des2&(3,1,1)=70
  495.   door_coords_src1&(3,1,2)=153
  496.   door_coords_src2&(3,1,2)=154
  497.   door_coords_des1&(3,1,2)=71
  498.   door_coords_des2&(3,1,2)=72
  499.   door_coords_src1&(3,1,3)=155
  500.   door_coords_src2&(3,1,3)=156
  501.   door_coords_des1&(3,1,3)=73
  502.   door_coords_des2&(3,1,3)=74
  503.   '
  504.   door_coords_src1&(3,0,0)=117
  505.   door_coords_des1&(3,0,0)=27
  506.   door_coords_src1&(3,0,1)=118
  507.   door_coords_des1&(3,0,1)=28
  508.   door_coords_src1&(3,0,2)=119
  509.   door_coords_des1&(3,0,2)=29
  510.   door_coords_src1&(3,0,3)=120
  511.   door_coords_des1&(3,0,3)=30
  512.   '
  513.   door_coords_src1&(4,1,0)=121
  514.   door_coords_des1&(4,1,0)=31
  515.   door_coords_src1&(4,1,1)=157
  516.   door_coords_src2&(4,1,1)=158
  517.   door_coords_des1&(4,1,1)=75
  518.   door_coords_des2&(4,1,1)=76
  519.   door_coords_src1&(4,1,2)=159
  520.   door_coords_src2&(4,1,2)=160
  521.   door_coords_des1&(4,1,2)=77
  522.   door_coords_des2&(4,1,2)=78
  523.   door_coords_src1&(4,1,3)=161
  524.   door_coords_src2&(4,1,3)=162
  525.   door_coords_des1&(4,1,3)=79
  526.   door_coords_des2&(4,1,3)=80
  527.   '
  528.   door_coords_src1&(4,0,0)=121
  529.   door_coords_des1&(4,0,0)=31
  530.   door_coords_src1&(4,0,1)=122
  531.   door_coords_des1&(4,0,1)=32
  532.   door_coords_src1&(4,0,2)=123
  533.   door_coords_des1&(4,0,2)=33
  534.   door_coords_src1&(4,0,3)=124
  535.   door_coords_des1&(4,0,3)=34
  536.   '
  537.   door_coords_src1&(5,1,0)=125
  538.   door_coords_des1&(5,1,0)=35
  539.   door_coords_src1&(5,1,1)=163
  540.   door_coords_src2&(5,1,1)=164
  541.   door_coords_des1&(5,1,1)=81
  542.   door_coords_des2&(5,1,1)=82
  543.   door_coords_src1&(5,1,2)=165
  544.   door_coords_src2&(5,1,2)=166
  545.   door_coords_des1&(5,1,2)=83
  546.   door_coords_des2&(5,1,2)=84
  547.   door_coords_src1&(5,1,3)=167
  548.   door_coords_src2&(5,1,3)=168
  549.   door_coords_des1&(5,1,3)=85
  550.   door_coords_des2&(5,1,3)=86
  551.   '
  552.   door_coords_src1&(5,0,0)=125
  553.   door_coords_des1&(5,0,0)=35
  554.   door_coords_src1&(5,0,1)=126
  555.   door_coords_des1&(5,0,1)=36
  556.   door_coords_src1&(5,0,2)=127
  557.   door_coords_des1&(5,0,2)=37
  558.   door_coords_src1&(5,0,3)=128
  559.   door_coords_des1&(5,0,3)=38
  560.   '
  561.   door_coords_src1&(6,1,0)=129
  562.   door_coords_des1&(6,1,0)=39
  563.   door_coords_src1&(6,1,1)=169
  564.   door_coords_src2&(6,1,1)=170
  565.   door_coords_des1&(6,1,1)=87
  566.   door_coords_des2&(6,1,1)=88
  567.   door_coords_src1&(6,1,2)=171
  568.   door_coords_src2&(6,1,2)=172
  569.   door_coords_des1&(6,1,2)=89
  570.   door_coords_des2&(6,1,2)=90
  571.   door_coords_src1&(6,1,3)=173
  572.   door_coords_src2&(6,1,3)=174
  573.   door_coords_des1&(6,1,3)=91
  574.   door_coords_des2&(6,1,3)=92
  575.   '
  576.   door_coords_src1&(6,0,0)=129
  577.   door_coords_des1&(6,0,0)=39
  578.   door_coords_src1&(6,0,1)=130
  579.   door_coords_des1&(6,0,1)=40
  580.   door_coords_src1&(6,0,2)=131
  581.   door_coords_des1&(6,0,2)=41
  582.   door_coords_src1&(6,0,3)=132
  583.   door_coords_des1&(6,0,3)=42
  584.   '
  585.   door_coords_src1&(7,1,0)=129
  586.   door_coords_des1&(7,1,0)=43
  587.   door_coords_src1&(7,1,1)=169
  588.   door_coords_src2&(7,1,1)=170
  589.   door_coords_des1&(7,1,1)=93
  590.   door_coords_des2&(7,1,1)=94
  591.   door_coords_src1&(7,1,2)=171
  592.   door_coords_src2&(7,1,2)=172
  593.   door_coords_des1&(7,1,2)=95
  594.   door_coords_des2&(7,1,2)=96
  595.   door_coords_src1&(7,1,3)=173
  596.   door_coords_src2&(7,1,3)=174
  597.   door_coords_des1&(7,1,3)=97
  598.   door_coords_des2&(7,1,3)=98
  599.   '
  600.   door_coords_src1&(7,0,0)=129
  601.   door_coords_des1&(7,0,0)=43
  602.   door_coords_src1&(7,0,1)=130
  603.   door_coords_des1&(7,0,1)=44
  604.   door_coords_src1&(7,0,2)=131
  605.   door_coords_des1&(7,0,2)=45
  606.   door_coords_src1&(7,0,3)=132
  607.   door_coords_des1&(7,0,3)=46
  608.   '
  609.   door_coords_src1&(8,1,0)=129
  610.   door_coords_des1&(8,1,0)=47
  611.   door_coords_src1&(8,1,1)=169
  612.   door_coords_src2&(8,1,1)=170
  613.   door_coords_des1&(8,1,1)=99
  614.   door_coords_des2&(8,1,1)=100
  615.   door_coords_src1&(8,1,2)=171
  616.   door_coords_src2&(8,1,2)=172
  617.   door_coords_des1&(8,1,2)=101
  618.   door_coords_des2&(8,1,2)=102
  619.   door_coords_src1&(8,1,3)=171
  620.   door_coords_src2&(8,1,3)=172
  621.   door_coords_des1&(8,1,3)=103
  622.   door_coords_des2&(8,1,3)=104
  623.   '
  624.   door_coords_src1&(8,0,0)=129
  625.   door_coords_des1&(8,0,0)=47
  626.   door_coords_src1&(8,0,1)=130
  627.   door_coords_des1&(8,0,1)=48
  628.   door_coords_src1&(8,0,2)=131
  629.   door_coords_des1&(8,0,2)=49
  630.   door_coords_src1&(8,0,3)=132
  631.   door_coords_des1&(8,0,3)=50
  632.   '
  633. RETURN
  634. > PROCEDURE declare_var_text
  635.   '
  636.   cpt_scroll_text&=1
  637.   '
  638.   scroll_text$=SPACE$(50)
  639.   scroll_text$=scroll_text$+"RENAISSANCE PROUDLY PRESENTS A GAME CODED BY RAJAH LONE, "
  640.   scroll_text$=scroll_text$+"WITH THE HELP OF DAROOU AND MATEO, AND DEDICACED TO LEMONBUBBLE. "
  641.   scroll_text$=scroll_text$+SPACE$(5)
  642.   scroll_text$=scroll_text$+"SPECIAL LEGAL APPLIES TO THIS PROGRAM, PLEASE READ THE DOCUMENTATION."
  643.   scroll_text$=scroll_text$+SPACE$(5)
  644.   scroll_text$=scroll_text$+"GREETINGS TO ERS, MARCER/ELITE, HELIJAH, STRIDER, FAB & CICILE, HELLO AND FROST OF SECTOR1, FANFAN, BOUB AND MOMO OF POPSYTEAM, DBUG/NEXT, ANDERTAL, COSMOSH..."
  645.   '
  646.   len_scroll_text&=LEN(scroll_text$)
  647.   '
  648.   scroll_text$=scroll_text$+SPACE$(50)
  649.   '
  650. RETURN
  651. > PROCEDURE declare_var_preferences
  652.   '
  653.   DIM boolean_to_text$(1)
  654.   boolean_to_text$(0)="FALSE"
  655.   boolean_to_text$(1)="TRUE"
  656.   '
  657.   DIM preferences_buffer$(100)
  658.   FOR i&=0 TO 100
  659.     preferences_buffer$(i&)=SPACE$(80)
  660.   NEXT i&
  661.   '
  662.   folder_sav$=folder_game$+c0$
  663.   alert_confirm!=TRUE
  664.   snd_enabled!=TRUE
  665.   background!=TRUE
  666.   '
  667. RETURN
  668. > PROCEDURE declare_var_job
  669.   '
  670.   job_list_adr%=0
  671.   job_structure_length&=20
  672.   '
  673.   job_type_counter&=0
  674.   job_animation%=0
  675.   redraw_for_animation!=FALSE
  676.   job_type_open&=1
  677.   job_type_close&=2
  678.   job_type_enable&=3
  679.   job_type_disable&=4
  680.   job_type_swap_witem&=5
  681.   job_type_destroy_witem&=6
  682.   '
  683. RETURN
  684. > PROCEDURE declare_mem_general
  685.   '
  686.   ' AES message buffer
  687.   m_adr%=GEMDOS(72,L:32)
  688.   IF m_adr%=<0
  689.     sortir
  690.   ELSE
  691.     ABSOLUTE m_type&,m_adr%
  692.     ABSOLUTE m_ap_id&,ADD(m_adr%,2)
  693.     ABSOLUTE m_nothing&,ADD(m_adr%,4)
  694.     ABSOLUTE m_titre&,ADD(m_adr%,6)
  695.     ABSOLUTE m_fenetre&,ADD(m_adr%,6)
  696.     ABSOLUTE m_entree&,ADD(m_adr%,8)
  697.     ABSOLUTE m_x&,ADD(m_adr%,8)
  698.     ABSOLUTE m_y&,ADD(m_adr%,10)
  699.     ABSOLUTE m_l&,ADD(m_adr%,12)
  700.     ABSOLUTE m_h&,ADD(m_adr%,14)
  701.     '
  702.     s_adr%=ADD(m_adr%,16)
  703.   ENDIF
  704.   '
  705.   ' string transfert buffer
  706.   t_buf%=GEMDOS(72,L:2048)
  707.   '
  708.   ' bubble text memory
  709.   IF magic! OR mint!
  710.     bubble%=GEMDOS(68,L:256,W:32)
  711.   ELSE
  712.     bubble%=GEMDOS(72,L:256)
  713.   ENDIF
  714.   '
  715.   prepare_memory_filler
  716.   '
  717. RETURN
  718. > PROCEDURE declare_mem_image
  719.   '
  720.   ' pxy array and MFDB strutures
  721.   mfdb_structure%=GEMDOS(72,L:SHL(SHR(ADD(MUL(20,SUCC(img_nb_slots&)),31),4),4))
  722.   IF mfdb_structure%>0
  723.     FOR i&=0 TO img_nb_slots&
  724.       img_mfdb%(i&)=ADD(ADD(mfdb_structure%,16),MUL(i&,20))
  725.       reset_mfdb(img_mfdb%(i&))
  726.     NEXT i&
  727.   ELSE
  728.     sortir
  729.   ENDIF
  730.   '
  731.   screen%=img_mfdb%(0)
  732.   offscreen%=img_mfdb%(1)
  733.   scale_screen%=img_mfdb%(2)
  734.   '
  735.   ' screen abilities (bitplane number & scaling for vro_cpyfm)
  736.   INT{CONTRL}=102
  737.   INT{ADD(CONTRL,2)}=0
  738.   INT{ADD(CONTRL,6)}=1
  739.   INT{ADD(CONTRL,12)}=vdi_handle&
  740.   INT{INTIN}=1
  741.   VDISYS
  742.   '
  743.   nb_plan&=INT{ADD(INTOUT,8)}
  744.   scale_view!=BTST(INT{ADD(INTOUT,60)},0)
  745.   '
  746.   ' screen structure
  747.   IF @test_cookie("EdDI",dummy%)=TRUE
  748.     INT{CONTRL}=102
  749.     INT{ADD(CONTRL,2)}=0
  750.     INT{ADD(CONTRL,6)}=1
  751.     INT{ADD(CONTRL,10)}=1
  752.     INT{ADD(CONTRL,12)}=vdi_handle&
  753.     INT{INTIN}=2
  754.     VDISYS
  755.     '
  756.     nb_plan&=INT{ADD(INTOUT,4)}
  757.     IF nb_plan&=15
  758.       nb_plan&=16
  759.       mode_32k!=TRUE
  760.     ELSE
  761.       mode_32k!=FALSE
  762.     ENDIF
  763.     '
  764.     clut_mode&=INT{ADD(INTOUT,2)}
  765.     SELECT clut_mode&
  766.     CASE 1 ! palette mode: get pixel index<->palette color
  767.       FOR i&=16 TO 271
  768.         pixorg_col|(SUB(i&,16))=BYTE(INT{ADD(INTOUT,MUL(i&,2))})
  769.       NEXT i&
  770.     CASE 2 ! true color mode: get RGB structure for the pixel
  771.       nb_bit_r|=BYTE(INT{ADD(INTOUT,16)})
  772.       nb_bit_g|=BYTE(INT{ADD(INTOUT,18)})
  773.       nb_bit_b|=BYTE(INT{ADD(INTOUT,20)})
  774.       FOR i&=1 TO nb_bit_r|
  775.         bitorg_r|(i&)=BYTE(SUB(nb_plan&,INT{ADD(INTOUT,ADD(30,SHL&(i&,1)))}))
  776.       NEXT i&
  777.       FOR i&=1 TO nb_bit_g|
  778.         bitorg_g|(i&)=BYTE(SUB(nb_plan&,INT{ADD(INTOUT,ADD(62,SHL&(i&,1)))}))
  779.       NEXT i&
  780.       FOR i&=1 TO nb_bit_b|
  781.         bitorg_b|(i&)=BYTE(SUB(nb_plan&,INT{ADD(INTOUT,ADD(94,SHL&(i&,1)))}))
  782.       NEXT i&
  783.     ENDSELECT
  784.   ENDIF
  785.   '
  786.   ' color buffers filled with current palette
  787.   IF nb_plan&=4 OR nb_plan&=8
  788.     ' color_adr1%=GEMDOS(72,L:MUL(12,2^nb_plan&))
  789.     ' color_adr2%=ADD(color_adr1%,MUL(6,2^nb_plan&))
  790.     ' vq_color(color_adr1%)
  791.     ' vq_color(color_adr2%)
  792.   ENDIF
  793.   '
  794. RETURN
  795. > PROCEDURE declare_mem_color
  796.   IF nb_plan&>3
  797.     '
  798.     IF nb_plan&=8
  799.       color_adr1%=GEMDOS(72,L:3072)
  800.       color_adr2%=ADD(color_adr1%,1536)
  801.     ELSE
  802.       color_adr1%=GEMDOS(72,L:192)
  803.       color_adr2%=ADD(color_adr1%,96)
  804.     ENDIF
  805.     '
  806.     vq_color(color_adr1%)
  807.     vq_color(color_adr2%)
  808.     '
  809.     color_temp%=GEMDOS(72,L:96)
  810.     IF @s_exist(pathfile_col$) AND color_temp%>0
  811.       OPEN "i",#3,pathfile_col$
  812.       SEEK #3,12
  813.       BGET #3,color_temp%,96
  814.       CLOSE #3
  815.       '
  816.       SELECT nb_plan&
  817.       CASE 4
  818.         BMOVE color_temp%,color_adr1%,96
  819.       CASE 8
  820.         FOR itrans&=224 TO 239
  821.           INT{ADD(color_adr1%,MUL(itrans&,6))}=INT{ADD(color_temp%,MUL(trans_pal|(SUB(itrans&,224)),6))}
  822.           INT{ADD(ADD(color_adr1%,2),MUL(itrans&,6))}=INT{ADD(ADD(color_temp%,2),MUL(trans_pal|(SUB(itrans&,224)),6))}
  823.           INT{ADD(ADD(color_adr1%,4),MUL(itrans&,6))}=INT{ADD(ADD(color_temp%,4),MUL(trans_pal|(SUB(itrans&,224)),6))}
  824.         NEXT itrans&
  825.       DEFAULT
  826.         FOR itrans&=0 TO 15
  827.           r&=INT{ADD(color_temp%,MUL(itrans&,6))}
  828.           g&=INT{ADD(ADD(color_temp%,2),MUL(itrans&,6))}
  829.           b&=INT{ADD(ADD(color_temp%,4),MUL(itrans&,6))}
  830.           r|=BYTE((r&/1000)*255)
  831.           g|=BYTE((g&/1000)*255)
  832.           b|=BYTE((b&/1000)*255)
  833.           LET color#(itrans&)=@trns_pix(r|,g|,b|)
  834.         NEXT itrans&
  835.       ENDSELECT
  836.       ~GEMDOS(73,L:color_temp%)
  837.       LET color_temp%=0
  838.     ENDIF
  839.     '
  840.   ENDIF
  841. RETURN
  842. > PROCEDURE declare_mem_cursor
  843.   LOCAL cursor_nb&,cursor_i&,cursor_org%,cursor_dest%
  844.   '
  845.   cursor_nb&=OB_TAIL(adtree%(12),0)
  846.   DIM cursor_ptr%(cursor_nb&)
  847.   '
  848.   FOR cursor_i&=1 TO cursor_nb&
  849.     cursor_ptr%(cursor_i&)=GEMDOS(72,L:80)
  850.     IF cursor_ptr%(cursor_i&)>0
  851.       cursor_dest%=cursor_ptr%(cursor_i&)
  852.       cursor_org%=OB_SPEC(adtree%(12),cursor_i&)
  853.       '
  854.       ' ICONBLK to MFORM
  855.       INT{cursor_dest%}=0 ! MIN(0,MAX(INT{ADD(cursor_org%,14)},15)) ! x_char to x_cursor
  856.       INT{ADD(cursor_dest%,2)}=0 ! MIN(0,MAX(INT{ADD(cursor_org%,16)},15)) ! x_char to x_cursor
  857.       INT{ADD(cursor_dest%,4)}=1 ! bitplane
  858.       INT{ADD(cursor_dest%,6)}=0 ! mask color
  859.       INT{ADD(cursor_dest%,8)}=1 ! data color
  860.       '
  861.       BMOVE LONG{cursor_org%},ADD(cursor_dest%,10),32
  862.       BMOVE LONG{ADD(cursor_org%,4)},ADD(cursor_dest%,42),32
  863.       '
  864.     ELSE
  865.       cursor_ptr%(cursor_i&)=0
  866.     ENDIF
  867.   NEXT cursor_i&
  868.   '
  869. RETURN
  870. > PROCEDURE init_2
  871.   '
  872.   ' 16 colors minimum
  873.   IF nb_plan&<4
  874.     ~@alert(1,6)
  875.     sortir
  876.   ENDIF
  877.   '
  878.   ' if 16 colors screen or AES < 3.99
  879.   IF nb_plan&=4 OR aes&<340
  880.     adtree%(2)=adtree%(10)
  881.   ENDIF
  882.   '
  883.   ' setting the preferences panel
  884.   IF NOT scale_view!
  885.     OB_STATE(adtree%(5),15)=BSET(OB_STATE(adtree%(5),15),3)
  886.     OB_STATE(adtree%(5),16)=BSET(OB_STATE(adtree%(5),16),3)
  887.     OB_STATE(adtree%(5),17)=BSET(OB_STATE(adtree%(5),17),3)
  888.   ENDIF
  889.   OB_STATE(adtree%(5),15)=BSET(OB_STATE(adtree%(5),15),0)
  890.   IF screenl&<MUL(coords_w&(0),2)
  891.     OB_STATE(adtree%(5),16)=BSET(OB_STATE(adtree%(5),16),3)
  892.   ENDIF
  893.   IF screenl&<MUL(coords_w&(0),3)
  894.     OB_STATE(adtree%(5),17)=BSET(OB_STATE(adtree%(5),17),3)
  895.   ENDIF
  896.   '
  897.   ' settting the background panel
  898.   OB_X(adtree%(11),0)=screenx&
  899.   OB_Y(adtree%(11),0)=screeny&
  900.   OB_W(adtree%(11),0)=screenl&
  901.   OB_H(adtree%(11),0)=screenh&
  902.   OB_X(adtree%(11),1)=1
  903.   OB_Y(adtree%(11),1)=1
  904.   OB_X(adtree%(11),2)=SUB(screenl&,SUCC(OB_W(adtree%(11),2)))
  905.   OB_Y(adtree%(11),2)=SUB(screenh&,SUCC(OB_H(adtree%(11),2)))
  906.   IF nb_plan&>4
  907.     OB_SPEC(adtree%(11),0)=BSET(OB_SPEC(adtree%(11),0),0)
  908.     OB_SPEC(adtree%(11),0)=BCLR(OB_SPEC(adtree%(11),0),1)
  909.     OB_SPEC(adtree%(11),0)=BCLR(OB_SPEC(adtree%(11),0),2)
  910.     OB_SPEC(adtree%(11),0)=BCLR(OB_SPEC(adtree%(11),0),3)
  911.     INT{ADD(OB_SPEC(adtree%(11),1),12)}=9
  912.     INT{ADD(OB_SPEC(adtree%(11),2),12)}=9
  913.   ENDIF
  914.   '
  915.   OB_Y(adtree%(1),1)=-5
  916.   OB_H(adtree%(1),1)=ADD(OB_H(adtree%(1),1),10)
  917.   '
  918.   get_env_bubble
  919.   get_env_guide
  920.   get_env_home
  921.   '
  922.   ~WIND_UPDATE(2)
  923.   ~WIND_UPDATE(0)
  924.   ~MENU_BAR(adtree%(0),1)
  925.   menu_desactivate
  926.   menu_desactivate_game
  927.   '
  928.   IF magic! OR mint!
  929.     multi!=TRUE
  930.   ELSE
  931.     multi!=FALSE
  932.   ENDIF
  933.   '
  934.   IF multi!=FALSE
  935.     ~FORM_DIAL(3,0,0,0,0,screenx&,screeny&,screenl&,screenh&)
  936.   ENDIF
  937.   '
  938.   ~@gxalloc_init(1)
  939.   ~@garbage_open(1,100)
  940.   '
  941. RETURN
  942. '
  943. > PROCEDURE boucle_generale
  944.   menu_activate
  945.   DO
  946.     evnt&=@ev_multi(&X110011,258,3,0,200,mo_x&,mo_y&,mo_k&,m_touche&,m_clavier&,mo_c&)
  947.     IF BTST(evnt&,0)
  948.       boucle_clavier_generale
  949.       mo_c&=0
  950.       mo_k&=0
  951.     ENDIF
  952.     IF BTST(evnt&,1)
  953.       boucle_souris_generale
  954.     ENDIF
  955.     IF BTST(evnt&,4)
  956.       SELECT m_type&
  957.       CASE 10
  958.         boucle_menu
  959.       CASE 20
  960.         redraw
  961.       CASE 21
  962.         win_topped
  963.       CASE 22
  964.         win_closed
  965.       CASE 28
  966.         win_moved
  967.       CASE 29,31
  968.         win_ontop
  969.       CASE 30
  970.         win_untopped
  971.       CASE 34,36
  972.         iconify
  973.       CASE 35
  974.         uniconify
  975.       CASE 50
  976.         shut_down
  977.       CASE 1666
  978.         relocate_party
  979.       CASE 1667
  980.         reload_labyrinth
  981.       CASE 22360
  982.         FOR i&=1 TO 3
  983.           IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  984.             aff!(i&)=FALSE
  985.           ENDIF
  986.         NEXT i&
  987.       CASE 22361
  988.         FOR i&=1 TO 3
  989.           IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  990.             aff!(i&)=TRUE
  991.           ENDIF
  992.         NEXT i&
  993.       ENDSELECT
  994.       clear_m
  995.     ENDIF
  996.     IF BTST(evnt&,5)=TRUE
  997.       '
  998.       INC cpt_garbage&
  999.       IF cpt_garbage&>40
  1000.         ~FRE()
  1001.         ~FRE(0)
  1002.         CLR cpt_garbage&
  1003.       ENDIF
  1004.       '
  1005.       IF win!(1)
  1006.         CHAR{{OB_SPEC(adtree%(1),8)}}=MID$(scroll_text$,cpt_scroll_text&,49)
  1007.         black_white(1,8,0)
  1008.         INC cpt_scroll_text&
  1009.         IF cpt_scroll_text&>len_scroll_text&
  1010.           cpt_scroll_text&=1
  1011.         ENDIF
  1012.       ENDIF
  1013.     ENDIF
  1014.     '
  1015.     gere_cursor
  1016.     gere_lifetime
  1017.     '
  1018.   LOOP
  1019. RETURN
  1020. '
  1021. > PROCEDURE boucle_menu
  1022.   ~MENU_TNORMAL(adtree%(0),m_titre&,1)
  1023.   SELECT m_entree&
  1024.   CASE 9
  1025.     win(1)
  1026.   CASE 18 ! new game
  1027.     @new_game
  1028.   CASE 20 ! open
  1029.     @open_game_as
  1030.   CASE 22 ! save
  1031.     IF game_active! AND new_game!=FALSE
  1032.       @save_game
  1033.     ENDIF
  1034.   CASE 23 ! save as
  1035.     IF game_active!
  1036.       @save_game_as
  1037.     ENDIF
  1038.   CASE 25 ! preferences
  1039.     win(5)
  1040.   CASE 27 ! quitter
  1041.     IF alert_confirm!
  1042.       reponse&=@alert(1,5)
  1043.     ELSE
  1044.       reponse&=1
  1045.     ENDIF
  1046.     IF reponse&=1
  1047.       sortir
  1048.     ENDIF
  1049.   CASE 29
  1050.     IF game_active!
  1051.       win(0)
  1052.     ENDIF
  1053.   CASE 30
  1054.     IF game_active!
  1055.       win(2)
  1056.     ENDIF
  1057.   CASE 32
  1058.     win_join
  1059.   CASE 34
  1060.     launch_help("")
  1061.   ENDSELECT
  1062. RETURN
  1063. > PROCEDURE boucle_souris_generale
  1064.   IF mo_c&=1 AND mo_k&=1
  1065.     clic_win&=WIND_FIND(mo_x&,mo_y&)
  1066.     delai
  1067.     IF clic_win&=hand_win&(0) AND aff!(0)=TRUE
  1068.       gere_clic_in_sensible_zone
  1069.     ENDIF
  1070.     IF clic_win&=hand_win&(1) AND aff!(1)=TRUE
  1071.       gere_info
  1072.     ENDIF
  1073.     IF clic_win&=hand_win&(2) AND aff!(2)=TRUE AND end!=FALSE
  1074.       gere_action_pad
  1075.     ENDIF
  1076.     IF clic_win&=hand_win&(5) AND aff!(5)=TRUE
  1077.       gere_preferences
  1078.     ENDIF
  1079.   ENDIF
  1080. RETURN
  1081. > PROCEDURE boucle_clavier_generale
  1082.   '
  1083.   IF freeze_keyboard_buffer!
  1084.     delai
  1085.   ENDIF
  1086.   '
  1087.   m_clavier|=BYTE(m_clavier&)
  1088.   '
  1089.   SELECT m_clavier|
  1090.   CASE 9 ! ^I
  1091.     win(1)
  1092.   CASE 16 ! ^P
  1093.     win(5)
  1094.   CASE 14 ! ^N
  1095.     IF menu_active!
  1096.       @new_game
  1097.     ENDIF
  1098.   CASE 15 ! ^O
  1099.     IF menu_active!
  1100.       @open_game_as
  1101.     ENDIF
  1102.   CASE 19 ! ^S
  1103.     IF game_active! AND new_game!=FALSE
  1104.       @save_game
  1105.     ENDIF
  1106.   CASE 13 ! ^M
  1107.     IF game_active!
  1108.       @save_game_as
  1109.     ENDIF
  1110.   CASE 17 ! ^Q
  1111.     IF alert_confirm!
  1112.       reponse&=@alert(1,5)
  1113.     ELSE
  1114.       reponse&=1
  1115.     ENDIF
  1116.     IF reponse&=1
  1117.       sortir
  1118.     ENDIF
  1119.   CASE 21 ! ^U
  1120.     ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1121.     FOR i&=0 TO nb_window&
  1122.       IF top_win&=hand_win&(i&) AND win!(i&)=TRUE
  1123.         ferme_win(i&)
  1124.       ENDIF
  1125.     NEXT i&
  1126.   CASE 10 ! ^J
  1127.     win_join
  1128.   ENDSELECT
  1129.   '
  1130.   IF end!=FALSE AND icon!=FALSE
  1131.     '
  1132.     m_touche|=BYTE(SHR&(m_clavier&,8))
  1133.     '
  1134.     key_repeat_off
  1135.     SELECT m_touche|
  1136.     CASE 82 ! 20992
  1137.       IF win!(0)
  1138.         black_white(2,2,1)
  1139.         act_turn_left
  1140.         black_white(2,2,0)
  1141.       ENDIF
  1142.     CASE 72 ! 18432
  1143.       IF win!(0)
  1144.         black_white(2,3,1)
  1145.         act_go_straight
  1146.         black_white(2,3,0)
  1147.       ENDIF
  1148.     CASE 71 ! 18176
  1149.       IF win!(0)
  1150.         IF keyboard_type&=1
  1151.           black_white(2,3,1)
  1152.           act_go_straight
  1153.           black_white(2,3,0)
  1154.         ELSE
  1155.           black_white(2,4,1)
  1156.           act_turn_right
  1157.           black_white(2,4,0)
  1158.         ENDIF
  1159.       ENDIF
  1160.     CASE 73 !
  1161.       IF win!(0)
  1162.         black_white(2,4,1)
  1163.         act_turn_right
  1164.         black_white(2,4,0)
  1165.       ENDIF
  1166.     CASE 75,83 ! 19200
  1167.       IF win!(0)
  1168.         black_white(2,5,1)
  1169.         act_go_left
  1170.         black_white(2,5,0)
  1171.       ENDIF
  1172.     CASE 79,80 ! 20480
  1173.       IF win!(0)
  1174.         black_white(2,6,1)
  1175.         act_go_back
  1176.         black_white(2,6,0)
  1177.       ENDIF
  1178.     CASE 77,81 ! 19712
  1179.       IF win!(0)
  1180.         black_white(2,7,1)
  1181.         act_go_right
  1182.         black_white(2,7,0)
  1183.       ENDIF
  1184.     CASE 98 ! Help
  1185.       ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1186.       IF top_win&=hand_win&(5) AND win!(5)
  1187.         launch_help(" dgem_preferences")
  1188.       ELSE
  1189.         launch_help("")
  1190.       ENDIF
  1191.     CASE 68 ! F10
  1192.       IF game_active!
  1193.         win(0)
  1194.       ENDIF
  1195.     CASE 67 ! F9
  1196.       IF game_active!
  1197.         win(2)
  1198.       ENDIF
  1199.     ENDSELECT
  1200.     key_repeat_on
  1201.   ENDIF
  1202.   '
  1203. RETURN
  1204. '
  1205. > PROCEDURE win_closed
  1206.   FOR i&=0 TO nb_window&
  1207.     IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  1208.       ferme_win(i&)
  1209.     ENDIF
  1210.   NEXT i&
  1211.   win_untopped
  1212. RETURN
  1213. > PROCEDURE win_moved
  1214.   m_x&=MAX(SUCC(screenx&),m_x&)
  1215.   m_y&=MAX(SUCC(screeny&),m_y&)
  1216.   FOR i&=0 TO nb_window&
  1217.     IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  1218.       ~WIND_GET(hand_win&(i&),5,xf&,yf&,lf&,hf&)
  1219.       ~WIND_SET(hand_win&(i&),5,m_x&,m_y&,m_l&,m_h&)
  1220.       IF i&=0 AND icon!
  1221.         move_win(7,m_x&,m_y&,m_l&,m_h&)
  1222.       ELSE
  1223.         move_win(i&,m_x&,m_y&,m_l&,m_h&)
  1224.       ENDIF
  1225.       IF i&=0
  1226.         ~WIND_GET(hand_win&(2),5,xfa&,yfa&,lfa&,hfa&)
  1227.         IF SUCC(ADD(xf&,lf&))=xfa& AND yf&=yfa&
  1228.           ~WIND_SET(hand_win&(2),5,SUCC(ADD(m_x&,m_l&)),m_y&,lfa&,hfa&)
  1229.           move_win(2,SUCC(ADD(m_x&,m_l&)),m_y&,lfa&,hfa&)
  1230.         ENDIF
  1231.       ENDIF
  1232.     ENDIF
  1233.   NEXT i&
  1234. RETURN
  1235. > PROCEDURE win_topped
  1236.   win_untopped
  1237.   FOR i&=0 TO nb_window&
  1238.     IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  1239.       ~WIND_SET(hand_win&(i&),10,0,0,0,0)
  1240.     ENDIF
  1241.   NEXT i&
  1242.   win_ontop
  1243. RETURN
  1244. > PROCEDURE win_untopped
  1245.   FOR win_i&=0 TO 4
  1246.     IF win!(win_i&)=TRUE AND m_fenetre&=hand_win&(win_i&) AND win_i&<>1
  1247.       ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1248.       ~WIND_GET(top_win&,20,owner_win&,dummy&,dummy&,dummy&)
  1249.       IF owner_win&<>ap_id&
  1250.         vs_color(color_adr2%)
  1251.       ELSE
  1252.         IF (top_win&=hand_win&(1) AND win!(1)=TRUE) OR (top_win&=hand_win&(5) AND win!(5)=TRUE) OR icon!=TRUE
  1253.           vs_color(color_adr2%)
  1254.         ENDIF
  1255.       ENDIF
  1256.     ENDIF
  1257.   NEXT win_i&
  1258. RETURN
  1259. > PROCEDURE win_ontop
  1260.   ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1261.   exit!=FALSE
  1262.   FOR win_i&=0 TO 4
  1263.     IF win_i&<>1
  1264.       IF win!(win_i&)=TRUE AND m_fenetre&=hand_win&(win_i&) AND top_win&=m_fenetre& AND icon!=FALSE
  1265.         vs_color(color_adr1%)
  1266.         exit!=TRUE
  1267.       ENDIF
  1268.     ENDIF
  1269.   NEXT win_i&
  1270.   IF NOT exit!
  1271.     IF (win!(5)=TRUE AND m_fenetre&=hand_win&(5)) OR (win!(1)=TRUE AND m_fenetre&=hand_win&(1)) OR icon!=TRUE
  1272.       vs_color(color_adr2%)
  1273.     ENDIF
  1274.   ENDIF
  1275. RETURN
  1276. > PROCEDURE win_join
  1277.   IF win!(0)=TRUE AND win!(2)=TRUE
  1278.     ~WIND_GET(hand_win&(0),5,xf&,yf&,lf&,hf&)
  1279.     ~WIND_GET(hand_win&(2),5,xfa&,yfa&,lfa&,hfa&)
  1280.     ~WIND_SET(hand_win&(2),5,SUCC(ADD(xf&,lf&)),yf&,lfa&,hfa&)
  1281.     move_win(2,SUCC(ADD(xf&,lf&)),yf&,lfa&,hfa&)
  1282.   ENDIF
  1283. RETURN
  1284. > PROCEDURE iconify
  1285.   IF naes!
  1286.     FOR i&=1 TO nb_window&
  1287.       ferme_win(i&)
  1288.     NEXT i&
  1289.     IF m_fenetre&=hand_win&(0) AND win!(0)=TRUE
  1290.       icon!=TRUE
  1291.       ~WIND_SET(hand_win&(0),2,CARD(SWAP(OB_SPEC(adtree%(tree_alerts&),34))),CARD(OB_SPEC(adtree%(tree_alerts&),34)),0,0)
  1292.       ~WIND_SET(hand_win&(0),26,m_x&,m_y&,m_l&,m_h&)
  1293.       ~WIND_GET(hand_win&(0),5,m_x&,m_y&,m_l&,m_h&)
  1294.       move_win(7,m_x&,m_y&,m_l&,m_h&)
  1295.     ENDIF
  1296.   ENDIF
  1297. RETURN
  1298. > PROCEDURE uniconify
  1299.   IF m_fenetre&=hand_win&(0) AND win!(0)=TRUE AND naes!
  1300.     icon!=FALSE
  1301.     ~WIND_SET(m_fenetre&,27,m_x&,m_y&,m_l&,m_h&)
  1302.     ~WIND_SET(hand_win&(0),2,CARD(SWAP(OB_SPEC(adtree%(tree_window_title&),1))),CARD(OB_SPEC(adtree%(tree_window_title&),1)),0,0)
  1303.     win(2)
  1304.     win_join
  1305.     force_update(2)
  1306.   ENDIF
  1307. RETURN
  1308. > PROCEDURE shut_down
  1309.   ~APPL_EXIT()
  1310.   QUIT
  1311. RETURN
  1312. > PROCEDURE relocate_party
  1313.   IF m_ap_id&=APPL_FIND("DEDITOR ")
  1314.     snd_play(4,FALSE,myself_position_x&,myself_position_y&)
  1315.     FOR i&=0 TO 5
  1316.       delai
  1317.     NEXT i&
  1318.     snd_stop
  1319.     myself_position_n&=MAX(0,MIN(m_titre&,PRED(maze_nb_level&)))
  1320.     myself_position_x&=MAX(0,MIN(m_x&,PRED(maze_width&)))
  1321.     myself_position_y&=MAX(0,MIN(m_y&,PRED(maze_height&)))
  1322.     get_maze_environment
  1323.     draw_view(FALSE)
  1324.     win(0)
  1325.   ENDIF
  1326. RETURN
  1327. > PROCEDURE reload_labyrinth
  1328.   IF m_ap_id&=APPL_FIND("DEDITOR ")
  1329.     @load_maze_design(folder_maze$+filename_dgm$,TRUE)
  1330.     @load_maze_witem(folder_maze$+filename_dgm$,TRUE)
  1331.     @load_maze_witem_msg(folder_maze$+filename_dgm$,TRUE)
  1332.     @load_maze_fitem(folder_maze$+filename_dgm$,TRUE)
  1333.     get_maze_environment
  1334.     draw_view(FALSE)
  1335.     win(0)
  1336.   ENDIF
  1337. RETURN
  1338. '
  1339. > PROCEDURE win(dial&)
  1340.   IF win!(dial&)
  1341.     force_top(dial&)
  1342.   ELSE
  1343.     create_win(dial&)
  1344.   ENDIF
  1345. RETURN
  1346. > PROCEDURE create_win(dial&)
  1347.   hand_win&(dial&)=@window_create(cp_win&(dial&))
  1348.   IF hand_win&(dial&)>0
  1349.     win!(dial&)=TRUE
  1350.     IF dial&=0
  1351.       icon!=FALSE
  1352.       IF scale_view&=1
  1353.         ld&(0)=img_w&(1)
  1354.         hd&(0)=img_h&(1)
  1355.         xd&(0)=MAX(SUCC(screenx&),SHR&(SUB(screenl&,img_w&(1)),1))
  1356.         yd&(0)=MAX(SUCC(screeny&),SHR&(SUB(screenh&,img_h&(1)),1))
  1357.       ELSE
  1358.         ld&(0)=img_w&(2)
  1359.         hd&(0)=img_h&(2)
  1360.         xd&(0)=MAX(SUCC(screenx&),SHR&(SUB(screenl&,img_w&(2)),1))
  1361.         yd&(0)=MAX(SUCC(screeny&),SHR&(SUB(screenh&,img_h&(2)),1))
  1362.       ENDIF
  1363.     ELSE
  1364.       ~FORM_CENTER(adtree%(dial&),xd&(dial&),yd&(dial&),ld&(dial&),dummy&)
  1365.     ENDIF
  1366.     ~WIND_CALC(0,cp_win&(dial&),xd&(dial&),yd&(dial&),ld&(dial&),hd&(dial&),wx&(dial&),wy&(dial&),wl&(dial&),wh&(dial&))
  1367.     ~WIND_SET(hand_win&(dial&),2,CARD(SWAP(OB_SPEC(adtree%(tree_window_title&),SUCC(dial&)))),CARD(OB_SPEC(adtree%(tree_window_title&),SUCC(dial&))),0,0)
  1368.     wx&(dial&)=MAX(SUCC(screenx&),wx&(dial&))
  1369.     wy&(dial&)=MAX(SUCC(screeny&),wy&(dial&))
  1370.     move_win(dial&,wx&(dial&),wy&(dial&),wl&(dial&),wh&(dial&))
  1371.     ~WIND_SET(hand_win&(dial&),24,&X1,0,0,0)
  1372.     dummy&=WIND_OPEN(hand_win&(dial&),wx&(dial&),wy&(dial&),wl&(dial&),wh&(dial&))
  1373.     aff!(dial&)=win!(dial&)
  1374.   ELSE
  1375.     win!(dial&)=FALSE
  1376.     aff!(dial&)=FALSE
  1377.   ENDIF
  1378. RETURN
  1379. > PROCEDURE ferme_win(dial&)
  1380.   IF win!(dial&)
  1381.     ~WIND_CLOSE(hand_win&(dial&))
  1382.     ~WIND_DELETE(hand_win&(dial&))
  1383.     win!(dial&)=FALSE
  1384.     aff!(dial&)=FALSE
  1385.     IF dial&=0 OR dial&=2 OR dial&=3 OR dial&=4
  1386.       ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1387.       ~WIND_GET(top_win&,20,owner_win&,dummy&,dummy&,dummy&)
  1388.       IF owner_win&<>ap_id& OR (win!(1) AND top_win&=hand_win&(1)) OR (win!(5) AND top_win&=hand_win&(5))
  1389.         vs_color(color_adr2%)
  1390.       ENDIF
  1391.     ENDIF
  1392.   ENDIF
  1393. RETURN
  1394. > PROCEDURE move_win(dial&,x0&,y0&,l0&,h0&)
  1395.   IF win!(dial&)=TRUE
  1396.     IF dial&>0 OR icon!=FALSE
  1397.       ~WIND_CALC(1,cp_win&(dial&),x0&,y0&,l0&,h0&,xd&(dial&),yd&(dial&),dummy&,dummy&)
  1398.     ENDIF
  1399.     IF dial&>0
  1400.       OB_X(adtree%(dial&),0)=xd&(dial&)
  1401.       OB_Y(adtree%(dial&),0)=yd&(dial&)
  1402.     ENDIF
  1403.   ENDIF
  1404.   IF dial&=7 AND icon!=TRUE
  1405.     ~WIND_CALC(1,&X1001,m_x&,m_y&,m_l&,m_h&,xd&(7),yd&(7),ld&(7),hd&(7))
  1406.     OB_X(adtree%(7),0)=xd&(7)
  1407.     OB_Y(adtree%(7),0)=yd&(7)
  1408.     OB_W(adtree%(7),0)=ld&(7)
  1409.     OB_H(adtree%(7),0)=hd&(7)
  1410.     OB_X(adtree%(7),1)=MAX(0,SUB(OB_W(adtree%(7),0),OB_W(adtree%(7),1))/2)
  1411.     OB_Y(adtree%(7),1)=MAX(0,SUB(OB_H(adtree%(7),0),OB_H(adtree%(7),1))/2)
  1412.   ENDIF
  1413. RETURN
  1414. '
  1415. > PROCEDURE force_update(bar&)
  1416.   IF aff!(bar&)=TRUE
  1417.     INT{s_adr%}=20
  1418.     INT{ADD(s_adr%,2)}=ap_id&
  1419.     INT{ADD(s_adr%,4)}=0
  1420.     INT{ADD(s_adr%,6)}=hand_win&(bar&)
  1421.     INT{ADD(s_adr%,8)}=screenx&
  1422.     INT{ADD(s_adr%,10)}=screeny&
  1423.     INT{ADD(s_adr%,12)}=screenl&
  1424.     INT{ADD(s_adr%,14)}=screenh&
  1425.     ~APPL_WRITE(ap_id&,16,s_adr%)
  1426.   ENDIF
  1427. RETURN
  1428. > PROCEDURE force_top(bar&)
  1429.   ~WIND_GET(0,10,top_win&,dummy&,dummy&,dummy&)
  1430.   IF top_win&<>hand_win&(bar&) AND win!(bar&)
  1431.     clear_s
  1432.     INT{s_adr%}=21
  1433.     INT{ADD(s_adr%,2)}=ap_id&
  1434.     INT{ADD(s_adr%,6)}=hand_win&(bar&)
  1435.     ~APPL_WRITE(ap_id&,16,s_adr%)
  1436.   ENDIF
  1437. RETURN
  1438. > PROCEDURE clear_m
  1439.   FOR i&=0 TO 12 STEP 4
  1440.     LONG{ADD(m_adr%,i&)}=0
  1441.   NEXT i&
  1442. RETURN
  1443. > PROCEDURE clear_s
  1444.   FOR i&=0 TO 12 STEP 4
  1445.     LONG{ADD(s_adr%,i&)}=0
  1446.   NEXT i&
  1447. RETURN
  1448. '
  1449. > PROCEDURE redraw
  1450.   '
  1451.   control
  1452.   '
  1453.   ~WIND_GET(m_fenetre&,11,rx&,ry&,rl&,rh&)
  1454.   WHILE rl&<>0 AND rh&<>0
  1455.     IF RC_INTERSECT(m_x&,m_y&,m_l&,m_h&,rx&,ry&,rl&,rh&)
  1456.       FOR i&=0 TO nb_window&
  1457.         IF m_fenetre&=hand_win&(i&) AND win!(i&)=TRUE
  1458.           IF i&=0
  1459.             IF icon!
  1460.               ob_draw(adtree%(7),0,2,rx&,ry&,rl&,rh&)
  1461.             ELSE
  1462.               ~WIND_GET(hand_win&(0),4,xf&,yf&,lf&,hf&)
  1463.               '
  1464.               IF ADD(xf&,PRED(lf&))>screen_width&
  1465.                 lf&=SUB(screen_width&,xf&)
  1466.               ENDIF
  1467.               IF ADD(yf&,PRED(hf&))>screen_height&
  1468.                 hf&=SUB(screen_height&,yf&)
  1469.               ENDIF
  1470.               '
  1471.               IF scale_view&=1 OR NOT scale_view!
  1472.                 INT{mfdb_structure%}=SUB(rx&,xf&)
  1473.                 INT{ADD(mfdb_structure%,2)}=SUB(ry&,yf&)
  1474.                 INT{ADD(mfdb_structure%,4)}=ADD(PRED(SUB(rx&,xf&)),MIN(rl&,img_w&(1)))
  1475.                 INT{ADD(mfdb_structure%,6)}=ADD(PRED(SUB(ry&,yf&)),MIN(rh&,img_h&(1)))
  1476.                 INT{ADD(mfdb_structure%,8)}=rx&
  1477.                 INT{ADD(mfdb_structure%,10)}=ry&
  1478.                 INT{ADD(mfdb_structure%,12)}=ADD(PRED(rx&),MIN(rl&,img_w&(1)))
  1479.                 INT{ADD(mfdb_structure%,14)}=ADD(PRED(ry&),MIN(rh&,img_h&(1)))
  1480.                 '
  1481.                 vro_cpyfm(3,offscreen%,screen%)
  1482.               ELSE
  1483.                 INT{mfdb_structure%}=SUB(rx&,xf&)
  1484.                 INT{ADD(mfdb_structure%,2)}=SUB(ry&,yf&)
  1485.                 INT{ADD(mfdb_structure%,4)}=ADD(PRED(SUB(rx&,xf&)),MIN(rl&,img_w&(2)))
  1486.                 INT{ADD(mfdb_structure%,6)}=ADD(PRED(SUB(ry&,yf&)),MIN(rh&,img_h&(2)))
  1487.                 INT{ADD(mfdb_structure%,8)}=rx&
  1488.                 INT{ADD(mfdb_structure%,10)}=ry&
  1489.                 INT{ADD(mfdb_structure%,12)}=ADD(PRED(rx&),MIN(rl&,img_w&(2)))
  1490.                 INT{ADD(mfdb_structure%,14)}=ADD(PRED(ry&),MIN(rh&,img_h&(2)))
  1491.                 '
  1492.                 vro_cpyfm(3,scale_screen%,screen%)
  1493.               ENDIF
  1494.             ENDIF
  1495.           ELSE
  1496.             ob_draw(adtree%(i&),0,3,rx&,ry&,rl&,rh&)
  1497.           ENDIF
  1498.         ENDIF
  1499.       NEXT i&
  1500.     ENDIF
  1501.     ~WIND_GET(m_fenetre&,12,rx&,ry&,rl&,rh&)
  1502.   WEND
  1503.   '
  1504.   win_ontop
  1505.   uncontrol
  1506.   '
  1507. RETURN
  1508. > PROCEDURE black_white(arbre&,fils&,etat&)
  1509.   IF fils&>0
  1510.     SELECT etat&
  1511.     CASE 0
  1512.       OB_STATE(adtree%(arbre&),fils&)=BCLR(OB_STATE(adtree%(arbre&),fils&),0)
  1513.     CASE 1
  1514.       OB_STATE(adtree%(arbre&),fils&)=BSET(OB_STATE(adtree%(arbre&),fils&),0)
  1515.     ENDSELECT
  1516.   ENDIF
  1517.   IF aff!(arbre&)=TRUE
  1518.     ~WIND_GET(hand_win&(arbre&),4,xf&,yf&,lf&,hf&)
  1519.     ~WIND_GET(hand_win&(arbre&),11,rx&,ry&,rl&,rh&)
  1520.     control
  1521.     WHILE rl&<>0 AND rh&<>0
  1522.       IF RC_INTERSECT(xf&,yf&,lf&,hf&,rx&,ry&,rl&,rh&)
  1523.         ob_draw(adtree%(arbre&),fils&,1,rx&,ry&,rl&,rh&)
  1524.       ENDIF
  1525.       ~WIND_GET(hand_win&(arbre&),12,rx&,ry&,rl&,rh&)
  1526.     WEND
  1527.     uncontrol
  1528.   ENDIF
  1529. RETURN
  1530. > PROCEDURE redraw_view
  1531.   '
  1532.   IF scale_view&>1 AND scale_view!
  1533.     INT{mfdb_structure%}=0
  1534.     INT{ADD(mfdb_structure%,2)}=0
  1535.     INT{ADD(mfdb_structure%,4)}=PRED(img_w&(1))
  1536.     INT{ADD(mfdb_structure%,6)}=PRED(img_h&(1))
  1537.     INT{ADD(mfdb_structure%,8)}=0
  1538.     INT{ADD(mfdb_structure%,10)}=0
  1539.     INT{ADD(mfdb_structure%,12)}=PRED(img_w&(2))
  1540.     INT{ADD(mfdb_structure%,14)}=PRED(img_h&(2))
  1541.     '
  1542.     vro_cpyfm(-32765,offscreen%,scale_screen%)
  1543.   ENDIF
  1544.   '
  1545.   IF win!(0)=TRUE AND aff!(0)=TRUE AND icon!=FALSE
  1546.     control
  1547.     ~WIND_GET(hand_win&(0),11,rx&,ry&,rl&,rh&)
  1548.     ~WIND_GET(hand_win&(0),4,xf&,yf&,lf&,hf&)
  1549.     '
  1550.     IF ADD(xf&,PRED(lf&))>screen_width&
  1551.       lf&=SUB(screen_width&,xf&)
  1552.     ENDIF
  1553.     IF ADD(yf&,PRED(hf&))>screen_height&
  1554.       hf&=SUB(screen_height&,yf&)
  1555.     ENDIF
  1556.     '
  1557.     WHILE rl&<>0 AND rh&<>0
  1558.       IF RC_INTERSECT(xf&,yf&,lf&,hf&,rx&,ry&,rl&,rh&)
  1559.         IF scale_view&=1 OR NOT scale_view!
  1560.           INT{mfdb_structure%}=SUB(rx&,xf&)
  1561.           INT{ADD(mfdb_structure%,2)}=SUB(ry&,yf&)
  1562.           INT{ADD(mfdb_structure%,4)}=ADD(PRED(SUB(rx&,xf&)),MIN(rl&,img_w&(1)))
  1563.           INT{ADD(mfdb_structure%,6)}=ADD(PRED(SUB(ry&,yf&)),MIN(rh&,img_h&(1)))
  1564.           INT{ADD(mfdb_structure%,8)}=rx&
  1565.           INT{ADD(mfdb_structure%,10)}=ry&
  1566.           INT{ADD(mfdb_structure%,12)}=ADD(PRED(rx&),MIN(rl&,img_w&(1)))
  1567.           INT{ADD(mfdb_structure%,14)}=ADD(PRED(ry&),MIN(rh&,img_h&(1)))
  1568.           '
  1569.           vro_cpyfm(3,offscreen%,screen%)
  1570.         ELSE
  1571.           INT{mfdb_structure%}=SUB(rx&,xf&)
  1572.           INT{ADD(mfdb_structure%,2)}=SUB(ry&,yf&)
  1573.           INT{ADD(mfdb_structure%,4)}=ADD(PRED(SUB(rx&,xf&)),MIN(rl&,img_w&(2)))
  1574.           INT{ADD(mfdb_structure%,6)}=ADD(PRED(SUB(ry&,yf&)),MIN(rh&,img_h&(2)))
  1575.           INT{ADD(mfdb_structure%,8)}=rx&
  1576.           INT{ADD(mfdb_structure%,10)}=ry&
  1577.           INT{ADD(mfdb_structure%,12)}=ADD(PRED(rx&),MIN(rl&,img_w&(2)))
  1578.           INT{ADD(mfdb_structure%,14)}=ADD(PRED(ry&),MIN(rh&,img_h&(2)))
  1579.           '
  1580.           vro_cpyfm(3,scale_screen%,screen%)
  1581.         ENDIF
  1582.       ENDIF
  1583.       ~WIND_GET(hand_win&(0),12,rx&,ry&,rl&,rh&)
  1584.     WEND
  1585.     uncontrol
  1586.   ENDIF
  1587. RETURN
  1588. '
  1589. > PROCEDURE gere_legal
  1590.   IF NOT @s_exist(pathfile_inf$)
  1591.     control_form(tree_legal&)
  1592.     DO
  1593.       result&=FORM_DO(adtree%(tree_legal&),0)
  1594.     LOOP UNTIL result&>1
  1595.     OB_STATE(adtree%(tree_legal&),result&)=BCLR(OB_STATE(adtree%(tree_legal&),result&),0)
  1596.     uncontrol_form(tree_legal&)
  1597.     '
  1598.     IF result&=2
  1599.       @save_preferences
  1600.     ELSE
  1601.       sortir
  1602.     ENDIF
  1603.   ENDIF
  1604.   @load_preferences
  1605.   '
  1606. RETURN
  1607. '
  1608. > PROCEDURE init_loading
  1609.   OB_FLAGS(adtree%(1),9)=BCLR(OB_FLAGS(adtree%(1),9),7)
  1610.   OB_FLAGS(adtree%(1),11)=BSET(OB_FLAGS(adtree%(1),11),7)
  1611.   '
  1612.   OB_Y(adtree%(1),8)=120
  1613.   '
  1614.   OB_W(adtree%(1),10)=4
  1615.   CHAR{{OB_SPEC(adtree%(1),8)}}="LOADING COORDS..."
  1616.   win(1)
  1617.   force_update(1)
  1618.   @load_coords
  1619.   '
  1620.   OB_W(adtree%(1),10)=4
  1621.   CHAR{{OB_SPEC(adtree%(1),8)}}="LOADING IMAGES..."
  1622.   black_white(1,8,0)
  1623.   black_white(1,9,1)
  1624.   @load_images
  1625.   '
  1626.   OB_W(adtree%(1),10)=4
  1627.   CHAR{{OB_SPEC(adtree%(1),8)}}="SETTING WALL AND FLOOR ITEMS IMAGES..."
  1628.   black_white(1,8,0)
  1629.   black_white(1,9,1)
  1630.   @load_litems
  1631.   '
  1632.   OB_W(adtree%(1),10)=4
  1633.   CHAR{{OB_SPEC(adtree%(1),8)}}="LOADING SOUNDS..."
  1634.   black_white(1,8,0)
  1635.   black_white(1,9,1)
  1636.   @load_sounds
  1637.   '
  1638.   OB_W(adtree%(1),10)=4
  1639.   CHAR{{OB_SPEC(adtree%(1),8)}}="BUILDING MAZE..."
  1640.   black_white(1,8,0)
  1641.   black_white(1,9,1)
  1642.   @load_maze_design(folder_maze$+filename_dgm$,FALSE)
  1643.   '
  1644.   OB_W(adtree%(1),10)=4
  1645.   CHAR{{OB_SPEC(adtree%(1),8)}}="DECKING OUT WALLS..."
  1646.   black_white(1,8,0)
  1647.   black_white(1,9,1)
  1648.   @load_maze_witem(folder_maze$+filename_dgm$,FALSE)
  1649.   '
  1650.   OB_W(adtree%(1),10)=4
  1651.   CHAR{{OB_SPEC(adtree%(1),8)}}="READING WALL MESSAGES..."
  1652.   black_white(1,8,0)
  1653.   black_white(1,9,1)
  1654.   @load_maze_witem_msg(folder_maze$+filename_dgm$,FALSE)
  1655.   '
  1656.   OB_W(adtree%(1),10)=4
  1657.   CHAR{{OB_SPEC(adtree%(1),8)}}="DECKING OUT FLOORS..."
  1658.   black_white(1,8,0)
  1659.   black_white(1,9,1)
  1660.   @load_maze_fitem(folder_maze$+filename_dgm$,FALSE)
  1661.   '
  1662. RETURN
  1663. > PROCEDURE exit_loading
  1664.   OB_FLAGS(adtree%(1),9)=BSET(OB_FLAGS(adtree%(1),9),7)
  1665.   OB_FLAGS(adtree%(1),11)=BCLR(OB_FLAGS(adtree%(1),11),7)
  1666.   '
  1667.   OB_Y(adtree%(1),8)=132
  1668.   CHAR{{OB_SPEC(adtree%(1),8)}}=""
  1669.   '
  1670.   force_update(1)
  1671. RETURN
  1672. > PROCEDURE test_evnt
  1673.   evnt&=@ev_multi(&X110000,2,1,1,30,mo_x&,mo_y&,mo_k&,m_touche&,m_clavier&,mo_c&)
  1674.   IF BTST(evnt&,4)
  1675.     SELECT m_type&
  1676.     CASE 20
  1677.       redraw
  1678.     CASE 22
  1679.       win_closed
  1680.     CASE 28
  1681.       win_moved
  1682.     ENDSELECT
  1683.   ENDIF
  1684. RETURN
  1685. > PROCEDURE load_coords
  1686.   LOCAL catalog_filename$,catalog_adr%,catalog_ptr%,catalog_handle&,catalog_len%
  1687.   ~FRE()
  1688.   ~FRE(0)
  1689.   mouse_busy
  1690.   '
  1691.   ' load coords X,Y,W,H list
  1692.   '
  1693.   catalog_filename$=folder_image$+"COORDS.IDX"+c0$
  1694.   catalog_handle&=GEMDOS(61,L:V:catalog_filename$,W:0)
  1695.   IF catalog_handle&>0
  1696.     catalog_len%=GEMDOS(66,L:0,W:catalog_handle&,W:2)
  1697.     ~GEMDOS(66,L:0,W:catalog_handle&,W:0)
  1698.     catalog_adr%=GEMDOS(72,L:ADD(catalog_len%,16))
  1699.     IF catalog_adr%>0
  1700.       IF GEMDOS(63,W:catalog_handle&,L:catalog_len%,L:catalog_adr%)=catalog_len%
  1701.         '
  1702.         DIV catalog_len%,10
  1703.         DEC catalog_len%
  1704.         '
  1705.         catalog_ptr%=catalog_adr%
  1706.         catalog_i&=0
  1707.         DO
  1708.           IF MOD(catalog_i&,4)=0
  1709.             test_evnt
  1710.           ENDIF
  1711.           '
  1712.           coords_id&=INT{catalog_ptr%}
  1713.           IF coords_id&>0 AND coords_id&<SUCC(coords_nb_slots&)
  1714.             coords_x&(coords_id&)=INT{ADD(catalog_ptr%,2)}
  1715.             coords_y&(coords_id&)=INT{ADD(catalog_ptr%,4)}
  1716.             coords_w&(coords_id&)=INT{ADD(catalog_ptr%,6)}
  1717.             coords_h&(coords_id&)=INT{ADD(catalog_ptr%,8)}
  1718.           ENDIF
  1719.           '
  1720.           IF MOD(catalog_i&,4)=0
  1721.             OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(catalog_i&))/SUCC(catalog_len%),OB_W(adtree%(1),9)))
  1722.             black_white(1,9,1)
  1723.           ENDIF
  1724.           '
  1725.           ADD catalog_ptr%,10
  1726.           INC catalog_i&
  1727.         LOOP UNTIL catalog_i&>catalog_len%
  1728.         '
  1729.       ENDIF
  1730.       ~GEMDOS(73,L:catalog_adr%)
  1731.     ENDIF
  1732.     ~GEMDOS(62,W:catalog_handle&)
  1733.     '
  1734.   ENDIF
  1735.   '
  1736.   mouse_free
  1737. RETURN
  1738. > PROCEDURE load_images
  1739.   LOCAL catalog_filename$,catalog_adr%,catalog_ptr%,catalog_handle&,catalog_len%
  1740.   ~FRE()
  1741.   ~FRE(0)
  1742.   mouse_disk
  1743.   '
  1744.   ' load image catalogue
  1745.   '
  1746.   catalog_filename$=folder_image$+"IMAGES.IDX"+c0$
  1747.   catalog_handle&=GEMDOS(61,L:V:catalog_filename$,W:0)
  1748.   IF catalog_handle&>0
  1749.     catalog_len%=GEMDOS(66,L:0,W:catalog_handle&,W:2)
  1750.     ~GEMDOS(66,L:0,W:catalog_handle&,W:0)
  1751.     catalog_adr%=GEMDOS(72,L:ADD(catalog_len%,16))
  1752.     IF catalog_adr%>0
  1753.       IF GEMDOS(63,W:catalog_handle&,L:catalog_len%,L:catalog_adr%)=catalog_len%
  1754.         '
  1755.         DIV catalog_len%,96
  1756.         DEC catalog_len%
  1757.         '
  1758.         catalog_ptr%=catalog_adr%
  1759.         catalog_i&=0
  1760.         DO
  1761.           test_evnt
  1762.           '
  1763.           img_id&=INT{catalog_ptr%}
  1764.           IF img_id&>0 AND img_id&<SUCC(img_nb_slots&)
  1765.             img_x&(img_id&)=INT{ADD(catalog_ptr%,2)}
  1766.             img_y&(img_id&)=INT{ADD(catalog_ptr%,4)}
  1767.             img_w&(img_id&)=INT{ADD(catalog_ptr%,6)}
  1768.             img_h&(img_id&)=INT{ADD(catalog_ptr%,8)}
  1769.             img_mask!=(INT{ADD(catalog_ptr%,10)}>0)
  1770.             img_name$=CHAR{ADD(catalog_ptr%,12)}
  1771.             '
  1772.             IF LEFT$(img_name$)="@"
  1773.               img_name$=MID$(img_name$,2)
  1774.               BMOVE img_mfdb%(VAL(img_name$)),img_mfdb%(img_id&),20
  1775.               img_name$=MID$(img_name$,SUCC(INSTR(img_name$,"|")))
  1776.               img_dx&(img_id&)=VAL(img_name$)
  1777.               img_name$=MID$(img_name$,SUCC(INSTR(img_name$,"|")))
  1778.               img_dy&(img_id&)=VAL(img_name$)
  1779.             ELSE
  1780.               img_name$=folder_image$+CHAR{ADD(catalog_ptr%,12)}+extension_img$
  1781.               img_dx&(img_id&)=0
  1782.               img_dy&(img_id&)=0
  1783.               ~@load_image(img_id&,img_name$,img_mask!)
  1784.             ENDIF
  1785.           ENDIF
  1786.           '
  1787.           OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(catalog_i&))/SUCC(catalog_len%),OB_W(adtree%(1),9)))
  1788.           black_white(1,9,1)
  1789.           '
  1790.           ADD catalog_ptr%,96
  1791.           INC catalog_i&
  1792.         LOOP UNTIL catalog_i&>catalog_len%
  1793.         '
  1794.       ELSE
  1795.         ~@alert(1,9)
  1796.         sortir
  1797.       ENDIF
  1798.       ~GEMDOS(73,L:catalog_adr%)
  1799.     ELSE
  1800.       ~@alert(1,8)
  1801.       sortir
  1802.     ENDIF
  1803.     ~GEMDOS(62,W:catalog_handle&)
  1804.   ELSE
  1805.     ~@alert(1,7)
  1806.     sortir
  1807.   ENDIF
  1808.   '
  1809.   IF dgx_adr%>0
  1810.     ~GEMDOS(73,L:dgx_adr%)
  1811.     dgx_adr%=0
  1812.   ENDIF
  1813.   '
  1814.   mouse_free
  1815. RETURN
  1816. > FUNCTION load_image(pimg_id&,pimg_name$,pimg_mask!)
  1817.   $F!
  1818.   LOCAL file_adr%,mfdb_adr%,dummy_adr%,dummy_size%
  1819.   ~FRE(0)
  1820.   '
  1821.   mouse_disk
  1822.   good!=FALSE
  1823.   '
  1824.   file_adr%=@load_dgx(pimg_name$)
  1825.   IF file_adr%>0
  1826.     IF INT{ADD(file_adr%,12)}=4 AND MKL$(LONG{file_adr%})="_DGI"
  1827.       LONG{file_adr%}=ADD(file_adr%,20)
  1828.       '
  1829.       mfdb_adr%=img_mfdb%(pimg_id&)
  1830.       LONG{mfdb_adr%}=GEMDOS(72;L:ADD(MUL(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),SHL&(nb_plan&,1)),16))
  1831.       INT{ADD(mfdb_adr%,4)}=INT{ADD(file_adr%,4)}
  1832.       INT{ADD(mfdb_adr%,6)}=INT{ADD(file_adr%,6)}
  1833.       INT{ADD(mfdb_adr%,8)}=INT{ADD(file_adr%,8)}
  1834.       INT{ADD(mfdb_adr%,10)}=0
  1835.       IF mode_32k!
  1836.         INT{ADD(mfdb_adr%,12)}=15
  1837.       ELSE
  1838.         INT{ADD(mfdb_adr%,12)}=nb_plan&
  1839.       ENDIF
  1840.       INT{ADD(mfdb_adr%,14)}=0
  1841.       INT{ADD(mfdb_adr%,16)}=0
  1842.       INT{ADD(mfdb_adr%,18)}=0
  1843.       '
  1844.       SELECT nb_plan&
  1845.       CASE 4
  1846.         trns_form(file_adr%,mfdb_adr%)
  1847.         good!=TRUE
  1848.       CASE 8
  1849.         dummy_adr%=GEMDOS(72,L:ADD(MUL(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),SHL&(nb_plan&,1)),16))
  1850.         IF dummy_adr%>0
  1851.           dummy_size%=SHL(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),1)
  1852.           IF pimg_mask!
  1853.             memory_fill(ADD(dummy_adr%,SHL(dummy_size%,2)),SHL(dummy_size%,2),memory_pattern_0%)
  1854.           ELSE
  1855.             memory_fill(ADD(dummy_adr%,SHL(dummy_size%,2)),dummy_size%,memory_pattern_0%)
  1856.             memory_fill(ADD(dummy_adr%,MUL(dummy_size%,5)),MUL(dummy_size%,3),memory_pattern_1%)
  1857.           ENDIF
  1858.           BMOVE ADD(file_adr%,20),dummy_adr%,SHL(dummy_size%,2)
  1859.           LONG{file_adr%}=dummy_adr%
  1860.           INT{ADD(file_adr%,12)}=8
  1861.           trns_form(file_adr%,mfdb_adr%)
  1862.           ~GEMDOS(73,L:dummy_adr%)
  1863.           good!=TRUE
  1864.         ELSE
  1865.           good!=FALSE
  1866.         ENDIF
  1867.       CASE 15,16
  1868.         dummy_size%=SHL&(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),1)
  1869.         ADD file_adr%,20
  1870.         dummy_cale%=SUB(ADD(file_adr%,dummy_size%),2)
  1871.         ktrans%=LONG{mfdb_adr%}
  1872.         FOR itrans%=file_adr% TO dummy_cale% STEP 2
  1873.           '
  1874.           trns_0&=INT{itrans%}
  1875.           trns_1&=INT{ADD(itrans%,dummy_size%)}
  1876.           trns_2&=INT{ADD(itrans%,MUL(dummy_size%,2))}
  1877.           trns_3&=INT{ADD(itrans%,MUL(dummy_size%,3))}
  1878.           '
  1879.           FOR jtrans&=1 TO 16
  1880.             '
  1881.             trns_4&=SHR&(trns_0&,15)
  1882.             ADD trns_4&,SHL&(SHR&(trns_1&,15),1)
  1883.             ADD trns_4&,SHL&(SHR&(trns_2&,15),2)
  1884.             ADD trns_4&,SHL&(SHR&(trns_3&,15),3)
  1885.             '
  1886.             trns_0&=SHL&(trns_0&,1)
  1887.             trns_1&=SHL&(trns_1&,1)
  1888.             trns_2&=SHL&(trns_2&,1)
  1889.             trns_3&=SHL&(trns_3&,1)
  1890.             '
  1891.             INT{ktrans%}=CARD(color#(trans_pal|(trns_4&)))
  1892.             ADD ktrans%,2
  1893.             '
  1894.           NEXT jtrans&
  1895.         NEXT itrans%
  1896.         SUB file_adr%,20
  1897.         good!=TRUE
  1898.       CASE 24
  1899.         dummy_size%=SHL&(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),1)
  1900.         ADD file_adr%,20
  1901.         dummy_cale%=SUB(ADD(file_adr%,dummy_size%),2)
  1902.         ktrans%=LONG{mfdb_adr%}
  1903.         FOR itrans%=file_adr% TO dummy_cale% STEP 2
  1904.           '
  1905.           trns_0&=WORD{itrans%}
  1906.           trns_1&=WORD{ADD(itrans%,dummy_size%)}
  1907.           trns_2&=WORD{ADD(itrans%,MUL(dummy_size%,2))}
  1908.           trns_3&=WORD{ADD(itrans%,MUL(dummy_size%,3))}
  1909.           '
  1910.           FOR jtrans&=1 TO 16
  1911.             '
  1912.             trns_4&=SHR&(trns_0&,15)
  1913.             ADD trns_4&,SHL&(SHR&(trns_1&,15),1)
  1914.             ADD trns_4&,SHL&(SHR&(trns_2&,14),2)
  1915.             ADD trns_4&,SHL&(SHR&(trns_3&,13),3)
  1916.             '
  1917.             trns_0&=SHL&(trns_0&,1)
  1918.             trns_1&=SHL&(trns_1&,1)
  1919.             trns_2&=SHL&(trns_2&,1)
  1920.             trns_3&=SHL&(trns_3&,1)
  1921.             '
  1922.             dummy%=color#(trans_pal|(trns_4&))
  1923.             BYTE{ktrans%}=BYTE(SHR(dummy%,15))
  1924.             INC ktrans%
  1925.             BYTE{ktrans%}=BYTE(SHR(dummy%,7))
  1926.             INC ktrans%
  1927.             BYTE{ktrans%}=BYTE(dummy%)
  1928.             INC ktrans%
  1929.             '
  1930.           NEXT jtrans&
  1931.         NEXT itrans%
  1932.         SUB file_adr%,20
  1933.         good!=TRUE
  1934.       CASE 32
  1935.         dummy_size%=SHL&(MUL(INT{ADD(file_adr%,6)},INT{ADD(file_adr%,8)}),1)
  1936.         ADD file_adr%,20
  1937.         dummy_cale%=SUB(ADD(file_adr%,dummy_size%),2)
  1938.         ktrans%=LONG{mfdb_adr%}
  1939.         FOR itrans%=file_adr% TO dummy_cale% STEP 2
  1940.           '
  1941.           trns_0&=WORD{itrans%}
  1942.           trns_1&=WORD{ADD(itrans%,dummy_size%)}
  1943.           trns_2&=WORD{ADD(itrans%,MUL(dummy_size%,2))}
  1944.           trns_3&=WORD{ADD(itrans%,MUL(dummy_size%,3))}
  1945.           '
  1946.           FOR jtrans&=1 TO 16
  1947.             '
  1948.             trns_4&=SHR&(trns_0&,15)
  1949.             ADD trns_4&,SHL&(SHR&(trns_1&,15),1)
  1950.             ADD trns_4&,SHL&(SHR&(trns_2&,15),2)
  1951.             ADD trns_4&,SHL&(SHR&(trns_3&,15),3)
  1952.             '
  1953.             trns_0&=SHL&(trns_0&,1)
  1954.             trns_1&=SHL&(trns_1&,1)
  1955.             trns_2&=SHL&(trns_2&,1)
  1956.             trns_3&=SHL&(trns_3&,1)
  1957.             '
  1958.             LONG{ktrans%}=color#(trans_pal|(trns_4&))
  1959.             ADD ktrans%,4
  1960.             '
  1961.           NEXT jtrans&
  1962.         NEXT itrans%
  1963.         SUB file_adr%,20
  1964.         good!=TRUE
  1965.       ENDSELECT
  1966.       ~GEMDOS(73,L:file_adr%)
  1967.     ELSE
  1968.       good!=FALSE
  1969.     ENDIF
  1970.   ELSE
  1971.     good!=FALSE
  1972.   ENDIF
  1973.   '
  1974.   RETURN good!
  1975. ENDFUNC
  1976. > FUNCTION load_dgx(pdgx_name$)
  1977.   $F%
  1978.   LOCAL dgx_handle&,dgx_len%,dgx_filename$,dgx_pos&
  1979.   ~FRE(0)
  1980.   dgx_ptr%=0
  1981.   '
  1982.   dgx_pos&=RINSTR(pdgx_name$,"\")
  1983.   dgx_filename$=LEFT$(pdgx_name$,PRED(dgx_pos&))+".DGX"+c0$
  1984.   dgi_filename$=MID$(pdgx_name$,SUCC(dgx_pos&))
  1985.   dgi_filename$=LEFT$(dgi_filename$,PRED(INSTR(dgi_filename$,".")))
  1986.   IF LEN(dgi_filename$)<8
  1987.     dgi_filename$=dgi_filename$+SPACE$(MAX(SUB(8,LEN(dgi_filename$))))
  1988.   ENDIF
  1989.   '
  1990.   IF @s_exist(dgx_filename$)
  1991.     IF dgx_filename$=old_dgx_filename$
  1992.       dgx_ptr%=@search_into_dgx(dgi_filename$)
  1993.     ENDIF
  1994.     '
  1995.     IF dgx_ptr%=0
  1996.       '
  1997.       IF dgx_adr%>0
  1998.         ~GEMDOS(73,L:dgx_adr%)
  1999.         dgx_adr%=0
  2000.       ENDIF
  2001.       '
  2002.       dgx_handle&=GEMDOS(61,L:V:dgx_filename$,W:0)
  2003.       IF dgx_handle&>0
  2004.         dgx_len%=GEMDOS(66,L:0,W:dgx_handle&,W:2)
  2005.         ~GEMDOS(66,L:0,W:dgx_handle&,W:0)
  2006.         dgx_adr%=GEMDOS(72,L:SHL(SHR(ADD(dgx_len%,32),4),4))
  2007.         IF dgx_adr%>0
  2008.           ~GEMDOS(63,W:dgx_handle&,L:dgx_len%,L:dgx_adr%)
  2009.           '
  2010.           old_dgx_filename$=dgx_filename$
  2011.           dgx_ptr%=@search_into_dgx(dgi_filename$)
  2012.           '
  2013.         ENDIF
  2014.         ~GEMDOS(62,W:dgx_handle&)
  2015.       ENDIF
  2016.       '
  2017.     ENDIF
  2018.   ELSE
  2019.     '
  2020.     IF dgx_adr%>0
  2021.       ~GEMDOS(73,L:dgx_adr%)
  2022.       dgx_adr%=0
  2023.     ENDIF
  2024.     '
  2025.     dgx_handle&=GEMDOS(61,L:V:pdgx_name$,W:0)
  2026.     IF dgx_handle&>0
  2027.       dgx_len%=GEMDOS(66,L:0,W:dgx_handle&,W:2)
  2028.       ~GEMDOS(66,L:0,W:dgx_handle&,W:0)
  2029.       dgx_adr%=GEMDOS(72,L:SHL(SHR(ADD(dgx_len%,32),4),4))
  2030.       IF dgx_adr%>0
  2031.         ~GEMDOS(63,W:dgx_handle&,L:dgx_len%,L:dgx_adr%)
  2032.         '
  2033.         dgx_ptr%=dgx_adr%
  2034.         '
  2035.       ENDIF
  2036.       ~GEMDOS(62,W:dgx_handle&)
  2037.     ENDIF
  2038.   ENDIF
  2039.   '
  2040.   RETURN dgx_ptr%
  2041. ENDFUNC
  2042. > FUNCTION search_into_dgx(pdgi_name$)
  2043.   $F%
  2044.   LOCAL sdgx_ptr%,sdgx_name$,sdgx_len&,sdgx_cpt&
  2045.   sdgx_adr%=0
  2046.   sdgx_cpt&=0
  2047.   '
  2048.   IF dgx_adr%>0
  2049.     IF MKL$(LONG{dgx_adr%})="_DGX"
  2050.       sdgx_len&=INT{ADD(dgx_adr%,4)}
  2051.       IF sdgx_len&>0
  2052.         sdgx_ptr%=ADD(dgx_adr%,6)
  2053.         DO
  2054.           sdgx_name$=MKL$(LONG{sdgx_ptr%})+MKL$(LONG{ADD(sdgx_ptr%,4)})
  2055.           IF sdgx_name$=pdgi_name$
  2056.             sdgx_adr%=ADD(dgx_adr%,LONG{ADD(sdgx_ptr%,8)})
  2057.             sdgx_cpt&=sdgx_len&
  2058.           ENDIF
  2059.           INC sdgx_cpt&
  2060.           ADD sdgx_ptr%,12
  2061.         LOOP UNTIL sdgx_cpt&>=sdgx_len&
  2062.       ENDIF
  2063.     ENDIF
  2064.   ENDIF
  2065.   '
  2066.   RETURN sdgx_adr%
  2067. ENDFUNC
  2068. > PROCEDURE unload_image(pimg_id&)
  2069.   IF LONG{img_mfdb%(pimg_id&)}>0
  2070.     ~GEMDOS(73,L:LONG{img_mfdb%(pimg_id&)})
  2071.     LONG{img_mfdb%(pimg_id&)}=0
  2072.   ENDIF
  2073. RETURN
  2074. > PROCEDURE load_litems
  2075.   LOCAL catalog_filename$,catalog_adr%,catalog_ptr%,catalog_handle&,catalog_len%
  2076.   LOCAL litem_load_type&,litem_load_family&,litem_load_id&,litem_load_pos&,litem_load_mask&,litem_load_sprite&
  2077.   ~FRE()
  2078.   ~FRE(0)
  2079.   mouse_disk
  2080.   '
  2081.   ' load image catalogue for wall and floor items (type, family, id) -> sprite id
  2082.   '
  2083.   catalog_filename$=folder_image$+"ITEMS.IDX"+c0$
  2084.   catalog_handle&=GEMDOS(61,L:V:catalog_filename$,W:0)
  2085.   IF catalog_handle&>0
  2086.     catalog_len%=GEMDOS(66,L:0,W:catalog_handle&,W:2)
  2087.     ~GEMDOS(66,L:0,W:catalog_handle&,W:0)
  2088.     catalog_adr%=GEMDOS(72,L:ADD(catalog_len%,16))
  2089.     IF catalog_adr%>0
  2090.       IF GEMDOS(63,W:catalog_handle&,L:catalog_len%,L:catalog_adr%)=catalog_len%
  2091.         '
  2092.         DIV catalog_len%,12
  2093.         DEC catalog_len%
  2094.         '
  2095.         catalog_ptr%=catalog_adr%
  2096.         catalog_i&=0
  2097.         DO
  2098.           litem_load_type&=INT{catalog_ptr%}
  2099.           litem_load_family&=INT{ADD(catalog_ptr%,2)}
  2100.           litem_load_id&=INT{ADD(catalog_ptr%,4)}
  2101.           litem_load_pos&=MAX(0,MIN(INT{ADD(catalog_ptr%,6)},12))
  2102.           litem_load_mask&=MAX(0,MIN(INT{ADD(catalog_ptr%,8)},1))
  2103.           litem_load_sprite&=INT{ADD(catalog_ptr%,10)}
  2104.           '
  2105.           SELECT litem_load_type&
  2106.           CASE 0
  2107.             IF litem_load_family&<=fitem_family_max& AND litem_load_id&<=fitem_id_max& AND litem_load_family&>0
  2108.               fitem_to_sprite&(PRED(litem_load_family&),litem_load_id&,litem_load_pos&,litem_load_mask&)=litem_load_sprite&
  2109.             ENDIF
  2110.           CASE 1
  2111.             IF litem_load_family&<=witem_family_max& AND litem_load_id&<=witem_id_max& AND litem_load_family&>0
  2112.               witem_to_sprite&(PRED(litem_load_family&),litem_load_id&,litem_load_pos&,litem_load_mask&)=litem_load_sprite&
  2113.             ENDIF
  2114.           ENDSELECT
  2115.           '
  2116.           IF MOD(catalog_i&,32)=0
  2117.             test_evnt
  2118.             OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(catalog_i&))/catalog_len%,OB_W(adtree%(1),9)))
  2119.             black_white(1,9,1)
  2120.           ENDIF
  2121.           '
  2122.           ADD catalog_ptr%,12
  2123.           INC catalog_i&
  2124.         LOOP UNTIL catalog_i&>catalog_len%
  2125.         '
  2126.       ELSE
  2127.         ~@alert(1,47)
  2128.         sortir
  2129.       ENDIF
  2130.       ~GEMDOS(73,L:catalog_adr%)
  2131.     ELSE
  2132.       ~@alert(1,46)
  2133.       sortir
  2134.     ENDIF
  2135.     ~GEMDOS(62,W:catalog_handle&)
  2136.   ELSE
  2137.     ~@alert(1,45)
  2138.     sortir
  2139.   ENDIF
  2140.   '
  2141.   mouse_free
  2142. RETURN
  2143. > PROCEDURE load_sounds
  2144.   LOCAL catalog_filename$,catalog_adr%,catalog_ptr%,catalog_handle&,catalog_len%
  2145.   ~FRE()
  2146.   ~FRE(0)
  2147.   mouse_disk
  2148.   '
  2149.   ' load sound catalogue
  2150.   '
  2151.   catalog_filename$=folder_sound$+"SOUNDS.IDX"+c0$
  2152.   catalog_handle&=GEMDOS(61,L:V:catalog_filename$,W:0)
  2153.   IF catalog_handle&>0
  2154.     catalog_len%=GEMDOS(66,L:0,W:catalog_handle&,W:2)
  2155.     ~GEMDOS(66,L:0,W:catalog_handle&,W:0)
  2156.     catalog_adr%=GEMDOS(72,L:ADD(catalog_len%,16))
  2157.     IF catalog_adr%>0
  2158.       IF GEMDOS(63,W:catalog_handle&,L:catalog_len%,L:catalog_adr%)=catalog_len%
  2159.         '
  2160.         DIV catalog_len%,64
  2161.         DEC catalog_len%
  2162.         '
  2163.         catalog_ptr%=catalog_adr%
  2164.         catalog_i&=0
  2165.         DO
  2166.           test_evnt
  2167.           '
  2168.           snd_id&=INT{catalog_ptr%}
  2169.           IF snd_id&>0 AND snd_id&<SUCC(snd_nb_slots&)
  2170.             snd_name$=folder_sound$+CHAR{ADD(catalog_ptr%,2)}+extension_snd$
  2171.             ~@load_sound(snd_id&,snd_name$)
  2172.           ENDIF
  2173.           '
  2174.           OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(catalog_i&))/SUCC(catalog_len%),OB_W(adtree%(1),9)))
  2175.           black_white(1,9,1)
  2176.           '
  2177.           ADD catalog_ptr%,64
  2178.           INC catalog_i&
  2179.         LOOP UNTIL catalog_i&>catalog_len%
  2180.         '
  2181.       ELSE
  2182.         ~@alert(1,32)
  2183.         sortir
  2184.       ENDIF
  2185.       ~GEMDOS(73,L:catalog_adr%)
  2186.     ELSE
  2187.       ~@alert(1,31)
  2188.       sortir
  2189.     ENDIF
  2190.     ~GEMDOS(62,W:catalog_handle&)
  2191.   ELSE
  2192.     ~@alert(1,30)
  2193.     sortir
  2194.   ENDIF
  2195.   '
  2196.   mouse_free
  2197. RETURN
  2198. > FUNCTION load_sound(psnd_id&,psnd_name$)
  2199.   $F!
  2200.   LOCAL file_handle&,file_len%,file_adr%
  2201.   ~FRE(0)
  2202.   '
  2203.   good!=FALSE
  2204.   file_adr%=0
  2205.   file_handle&=GEMDOS(61,L:V:psnd_name$,W:0)
  2206.   IF file_handle&>0
  2207.     file_len%=GEMDOS(66,L:0,W:file_handle&,W:2)
  2208.     ~GEMDOS(66,L:0,W:file_handle&,W:0)
  2209.     IF tos_version%>300
  2210.       file_adr%=GEMDOS(68,L:SHL(SHR(ADD(file_len%,15),4),4),W:0)
  2211.     ELSE
  2212.       file_adr%=GEMDOS(72,L:SHL(SHR(ADD(file_len%,15),4),4))
  2213.     ENDIF
  2214.     IF file_adr%<1
  2215.       good!=FALSE
  2216.     ELSE
  2217.       IF GEMDOS(63,W:file_handle&,L:file_len%,L:file_adr%)=file_len%
  2218.         snd_start%(psnd_id&)=file_adr%
  2219.         snd_end%(psnd_id&)=ADD(file_adr%,file_len%)
  2220.         good!=TRUE
  2221.       ELSE
  2222.         ~GEMDOS(73,L:file_adr%)
  2223.         snd_start%(psnd_id&)=0
  2224.         snd_end%(psnd_id&)=0
  2225.       ENDIF
  2226.     ENDIF
  2227.     ~GEMDOS(62,W:file_handle&)
  2228.   ENDIF
  2229.   '
  2230.   RETURN good!
  2231. ENDFUNC
  2232. > PROCEDURE unload_sound(psnd_id&)
  2233.   IF snd_start%(psnd_id&)>0 AND psnd_id&>0
  2234.     ~GEMDOS(73,L:snd_start%(psnd_id&))
  2235.     snd_start%(psnd_id&)=0
  2236.     snd_end%(psnd_id&)=0
  2237.   ENDIF
  2238. RETURN
  2239. > PROCEDURE load_maze_design(pmaze_name$,reload!)
  2240.   LOCAL fmaze_handle&,fmaze_len%,fmaze_adr%,fmaze_ptr%,fmaze_temp_adr%
  2241.   LOCAL chk_table%,chk_line%,cell_value|,good!
  2242.   LOCAL litem_array_ptr%
  2243.   ~FRE()
  2244.   ~FRE(0)
  2245.   '
  2246.   good!=FALSE
  2247.   fmaze_adr%=0
  2248.   '
  2249.   IF @s_exist(pmaze_name$)=TRUE AND LEN(pmaze_name$)>1
  2250.     fmaze_handle&=GEMDOS(61,L:V:pmaze_name$,W:0)
  2251.     IF fmaze_handle&>0
  2252.       fmaze_len%=GEMDOS(66,L:0,W:fmaze_handle&,W:2)
  2253.       ~GEMDOS(66,L:0,W:fmaze_handle&,W:0)
  2254.       fmaze_adr%=GEMDOS(72,L:SHL(SHR(ADD(fmaze_len%,15),4),4))
  2255.       IF fmaze_adr%>0
  2256.         mouse_disk
  2257.         IF GEMDOS(63,W:fmaze_handle&,L:fmaze_len%,L:fmaze_adr%)=fmaze_len%
  2258.           '
  2259.           IF MKL$(LONG{fmaze_adr%})="_DGM" AND fmaze_len%>2570
  2260.             IF MKL$(LONG{ADD(fmaze_adr%,4)})=dgem_version$
  2261.               '
  2262.               IF maze_design_adr%>0
  2263.                 ~@gxalloc_exit(1) ! reset all floor & wall items
  2264.                 ~@garbage_close(1)
  2265.                 ~@gxalloc_init(1)
  2266.                 ~@garbage_open(1,100)
  2267.                 '
  2268.                 ~GEMDOS(73,L:maze_design_adr%)
  2269.                 maze_design_adr%=0
  2270.               ENDIF
  2271.               '
  2272.               maze_nb_level&=INT{ADD(fmaze_adr%,82)}
  2273.               maze_width&=INT{ADD(fmaze_adr%,84)}
  2274.               maze_height&=INT{ADD(fmaze_adr%,86)}
  2275.               '
  2276.               maze_design_len%=MUL(maze_nb_level&,MUL(maze_width&,maze_height&))
  2277.               maze_design_adr%=GEMDOS(72,L:SHL(SHR(ADD(maze_design_len%,15),4),4))
  2278.               IF maze_design_adr%>0
  2279.                 '
  2280.                 DEC maze_nb_level&
  2281.                 IF maze_nb_level&>32
  2282.                   ERASE maze_design_level_adr%()
  2283.                   DIM maze_design_level_adr%(MIN(maze_nb_level&,128))
  2284.                 ENDIF
  2285.                 INC maze_nb_level&
  2286.                 '
  2287.                 mouse_busy
  2288.                 good!=TRUE
  2289.                 fmaze_ptr%=ADD(fmaze_adr%,128)
  2290.                 fmaze_temp_adr%=maze_design_adr%
  2291.                 FOR maze_nb&=0 TO PRED(maze_nb_level&)
  2292.                   chk_table%=0
  2293.                   maze_design_level_adr%(maze_nb&)=fmaze_temp_adr%
  2294.                   FOR maze_y&=0 TO PRED(maze_height&)
  2295.                     chk_line%=0
  2296.                     FOR maze_x&=0 TO PRED(maze_width&)
  2297.                       cell_value|=BYTE{ADD(fmaze_ptr%,maze_x&)}
  2298.                       set_maze_design(maze_nb&,maze_x&,maze_y&,cell_value|)
  2299.                       INC fmaze_temp_adr%
  2300.                       ADD chk_line%,cell_value|
  2301.                     NEXT maze_x&
  2302.                     ADD fmaze_ptr%,maze_width&
  2303.                     IF (chk_line% AND &HF0F)<>INT{fmaze_ptr%}
  2304.                       good!=FALSE
  2305.                     ENDIF
  2306.                     ADD fmaze_ptr%,2
  2307.                     ADD chk_table%,chk_line%
  2308.                     EXIT IF NOT good!
  2309.                   NEXT maze_y&
  2310.                   IF (chk_table% AND &HFF0)<>INT{fmaze_ptr%}
  2311.                     good!=FALSE
  2312.                   ENDIF
  2313.                   ADD fmaze_ptr%,2
  2314.                   EXIT IF NOT good!
  2315.                   '
  2316.                   IF NOT reload!
  2317.                     OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(maze_nb&))/maze_nb_level&,OB_W(adtree%(1),9)))
  2318.                     black_white(1,9,1)
  2319.                     test_evnt
  2320.                   ENDIF
  2321.                   '
  2322.                 NEXT maze_nb&
  2323.                 mouse_free
  2324.                 IF NOT good!
  2325.                   ~@alert(1,14)
  2326.                   sortir
  2327.                 ENDIF
  2328.                 '
  2329.               ELSE
  2330.                 ~@alert(1,15)
  2331.                 sortir
  2332.               ENDIF
  2333.             ELSE
  2334.               ~@alert(1,16)
  2335.               sortir
  2336.             ENDIF
  2337.           ELSE
  2338.             ~@alert(1,17)
  2339.             sortir
  2340.           ENDIF
  2341.         ELSE
  2342.           ~@alert(1,18)
  2343.           sortir
  2344.         ENDIF
  2345.         mouse_free
  2346.         ~GEMDOS(73,L:fmaze_adr%)
  2347.       ENDIF
  2348.       ~GEMDOS(62,W:fmaze_handle&)
  2349.     ELSE
  2350.       ~@alert(1,13)
  2351.       sortir
  2352.     ENDIF
  2353.   ELSE
  2354.     ~@alert(1,12)
  2355.     sortir
  2356.   ENDIF
  2357.   '
  2358.   ' pointers array for wall and floor items
  2359.   '
  2360.   litem_array_len%=SHL(MUL(maze_nb_level&,MUL(maze_width&,maze_height&)),2)
  2361.   IF litem_array_adr%>0
  2362.     ~GEMDOS(73,L:litem_array_adr%)
  2363.   ENDIF
  2364.   litem_array_adr%=GEMDOS(72,L:SHL(SHR(ADD(litem_array_len%,15),4),4))
  2365.   memory_fill(litem_array_adr%,litem_array_len%,memory_pattern_0%)
  2366.   '
  2367.   IF maze_nb_level&>32
  2368.     ERASE litem_array_level_adr%()
  2369.     DIM litem_array_level_adr%(MIN(maze_nb_level&,128))
  2370.   ENDIF
  2371.   '
  2372.   litem_array_ptr%=litem_array_adr%
  2373.   FOR maze_nb&=0 TO PRED(maze_nb_level&)
  2374.     litem_array_level_adr%(maze_nb&)=litem_array_ptr%
  2375.     ADD litem_array_ptr%,SHL(MUL(maze_width&,maze_height&),2)
  2376.   NEXT maze_nb&
  2377.   '
  2378.   job_animation%=ADD(@new_job(job_type_counter&,0,0,0,0,0),10)
  2379.   '
  2380. RETURN
  2381. > PROCEDURE load_maze_witem(pmaze_name$,reload!)
  2382.   LOCAL file_handle&,len_handle%,file_adr%,file_ptr%,offset&,witem_file$,witem_nb&,witem_structure_length&
  2383.   LOCAL chk_table%,chk_line%,cell_value|,good!
  2384.   LOCAL litem_d|,litem_t|,litem_f|,litem_i|
  2385.   ~FRE()
  2386.   ~FRE(0)
  2387.   '
  2388.   good!=FALSE
  2389.   witem_file$=LEFT$(pmaze_name$,PRED(RINSTR(pmaze_name$,".DG")))+extension_dwi$
  2390.   file_adr%=0
  2391.   '
  2392.   IF @s_exist(witem_file$)=TRUE
  2393.     file_handle&=GEMDOS(61,L:V:witem_file$,W:0)
  2394.     IF file_handle&>0
  2395.       len_handle%=GEMDOS(66,L:0,W:file_handle&,W:2)
  2396.       ~GEMDOS(66,L:0,W:file_handle&,W:0)
  2397.       file_adr%=GEMDOS(72,L:SHL(SHR(ADD(len_handle%,15),4),4))
  2398.       IF file_adr%>0
  2399.         mouse_disk
  2400.         IF GEMDOS(63,W:file_handle&,L:len_handle%,L:file_adr%)=len_handle%
  2401.           IF MKL$(LONG{file_adr%})="_DWI" AND len_handle%>127
  2402.             IF VAL(MKL$(LONG{ADD(file_adr%,4)}))=<VAL(dgem_version$)
  2403.               '
  2404.               witem_structure_length&=INT{ADD(file_adr%,72)}
  2405.               witem_nb&=PRED(INT{ADD(file_adr%,74)})
  2406.               '
  2407.               chk_table%=0
  2408.               IF witem_nb&>-1
  2409.                 mouse_busy
  2410.                 good!=TRUE
  2411.                 file_ptr%=ADD(file_adr%,128)
  2412.                 FOR witem_n&=0 TO witem_nb&
  2413.                   chk_line%=0
  2414.                   maze_nb&=MAX(0,MIN(INT{file_ptr%},PRED(maze_nb_level&)))
  2415.                   ADD chk_line%,maze_nb&
  2416.                   maze_x&=MAX(0,MIN(PRED(INT{ADD(file_ptr%,2)}),PRED(maze_width&)))
  2417.                   ADD chk_line%,SUCC(maze_x&)
  2418.                   maze_y&=MAX(0,MIN(PRED(INT{ADD(file_ptr%,4)}),PRED(maze_height&)))
  2419.                   ADD chk_line%,SUCC(maze_y&)
  2420.                   litem_d|=MAX(1,MIN(BYTE{ADD(file_ptr%,7)},4))
  2421.                   ADD chk_line%,litem_d|
  2422.                   litem_t|=BYTE{ADD(file_ptr%,8)}
  2423.                   ADD chk_line%,litem_t|
  2424.                   litem_f|=BYTE{ADD(file_ptr%,9)}
  2425.                   ADD chk_line%,litem_f|
  2426.                   litem_i|=BYTE{ADD(file_ptr%,10)}
  2427.                   ADD chk_line%,litem_i|
  2428.                   '
  2429.                   IF INT{ADD(file_ptr%,ADD(8,witem_structure_length&))}<>(chk_line% AND &H57)
  2430.                     good!=FALSE
  2431.                     ~@alert(1,39)
  2432.                     sortir
  2433.                   ELSE
  2434.                     '
  2435.                     litem_adr%=@get_tile_containor(maze_nb&,maze_x&,maze_y&)
  2436.                     IF litem_adr%<1
  2437.                       litem_adr%=@create_tile_containor(maze_nb&,maze_x&,maze_y&)
  2438.                     ENDIF
  2439.                     IF litem_adr%>0
  2440.                       IF @get_maze_design(maze_nb&,maze_x&,maze_y&)=litem_t|
  2441.                         litem_tmp_adr%=@add_tile_item(litem_adr%,litem_d|,witem_structure_length&,litem_t|,litem_f|,litem_i|)
  2442.                         BMOVE ADD(file_ptr%,8),ADD(litem_tmp_adr%,6),witem_structure_length&
  2443.                       ENDIF
  2444.                     ENDIF
  2445.                     '
  2446.                   ENDIF
  2447.                   ADD file_ptr%,ADD(witem_structure_length&,10)
  2448.                   EXIT IF NOT good!
  2449.                   ADD chk_table%,chk_line%
  2450.                   '
  2451.                   IF NOT reload!
  2452.                     IF MOD(witem_n&,10)=0
  2453.                       OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(witem_n&))/SUCC(witem_nb&),OB_W(adtree%(1),9)))
  2454.                       black_white(1,9,1)
  2455.                       test_evnt
  2456.                     ENDIF
  2457.                   ENDIF
  2458.                   '
  2459.                 NEXT witem_n&
  2460.                 mouse_free
  2461.               ENDIF
  2462.               '
  2463.               IF INT{ADD(file_adr%,76)}<>(chk_table% AND &HF71)
  2464.                 good!=FALSE
  2465.                 ~@alert(1,39)
  2466.                 sortir
  2467.               ENDIF
  2468.             ELSE
  2469.               ~@alert(1,38)
  2470.               sortir
  2471.             ENDIF
  2472.           ELSE
  2473.             ~@alert(1,37)
  2474.             sortir
  2475.           ENDIF
  2476.         ELSE
  2477.           ~@alert(1,35)
  2478.           sortir
  2479.         ENDIF
  2480.         mouse_free
  2481.         ~GEMDOS(73,L:file_adr%)
  2482.       ENDIF
  2483.       ~GEMDOS(62,W:file_handle&)
  2484.     ELSE
  2485.       ~@alert(1,36)
  2486.       sortir
  2487.     ENDIF
  2488.   ENDIF
  2489.   '
  2490.   mouse_free
  2491. RETURN
  2492. > PROCEDURE load_maze_witem_msg(pmaze_name$,reload!)
  2493.   LOCAL msg_handle&,msg_len%,msg_adr%,file_ptr%,msg_file$,msg_ptr%
  2494.   LOCAL litem_ptr%
  2495.   ~FRE()
  2496.   ~FRE(0)
  2497.   '
  2498.   msg_file$=LEFT$(pmaze_name$,PRED(RINSTR(pmaze_name$,".DG")))+extension_msg$
  2499.   msg_adr%=0
  2500.   '
  2501.   IF @s_exist(msg_file$)=TRUE
  2502.     msg_handle&=GEMDOS(61,L:V:msg_file$,W:0)
  2503.     IF msg_handle&>0
  2504.       msg_len%=GEMDOS(66,L:0,W:msg_handle&,W:2)
  2505.       ~GEMDOS(66,L:0,W:msg_handle&,W:0)
  2506.       msg_adr%=GEMDOS(72,L:SHL(SHR(ADD(msg_len%,15),4),4))
  2507.       IF msg_adr%>0
  2508.         mouse_disk
  2509.         IF GEMDOS(63,W:msg_handle&,L:msg_len%,L:msg_adr%)=msg_len%
  2510.           IF MKL$(LONG{msg_adr%})="_MSG"
  2511.             '
  2512.             mouse_busy
  2513.             file_ptr%=ADD(msg_adr%,4)
  2514.             witem_n&=0
  2515.             witem_nb&=DIV(SUB(msg_len%,4),64)
  2516.             '
  2517.             WHILE file_ptr%<ADD(msg_adr%,msg_len%)
  2518.               maze_nb&=MAX(0,MIN(INT{file_ptr%},PRED(maze_nb_level&)))
  2519.               maze_x&=MAX(0,PRED(INT{ADD(file_ptr%,2)}))
  2520.               maze_y&=MAX(0,PRED(INT{ADD(file_ptr%,4)}))
  2521.               '
  2522.               IF @get_maze_design(maze_nb&,maze_x&,maze_y&)=1
  2523.                 litem_adr%=@get_tile_containor(maze_nb&,maze_x&,maze_y&)
  2524.                 IF litem_adr%>0
  2525.                   get_tile_pointers(litem_adr%,work_n%,work_s%,work_e%,work_w%)
  2526.                   litem_adr%=@litem_find_first_item(work_n%,work_s%,work_e%,work_w%)
  2527.                   WHILE litem_adr%>0
  2528.                     get_tile_item(litem_adr%,litem_ptr%,litem_len&,litem_tmp_type|,litem_tmp_family|,litem_tmp_id|)
  2529.                     IF litem_tmp_family|=3 AND litem_tmp_type|=1
  2530.                       IF LONG{ADD(litem_adr%,10)}=0
  2531.                         '
  2532.                         msg_ptr%=@garbage_look(1,56)
  2533.                         IF msg_ptr%=0
  2534.                           msg_ptr%=@gxalloc(1,56)
  2535.                         ENDIF
  2536.                         IF msg_ptr%>0
  2537.                           BMOVE ADD(file_ptr%,6),msg_ptr%,56
  2538.                         ENDIF
  2539.                         '
  2540.                         LONG{ADD(litem_adr%,10)}=msg_ptr%
  2541.                         '
  2542.                         litem_ptr%=0
  2543.                       ENDIF
  2544.                     ENDIF
  2545.                     litem_adr%=litem_ptr%
  2546.                   WEND
  2547.                   '
  2548.                 ENDIF
  2549.               ENDIF
  2550.               ADD file_ptr%,64
  2551.               INC witem_n&
  2552.               '
  2553.               IF NOT reload!
  2554.                 IF MOD(witem_n&,10)=0
  2555.                   OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(witem_n&))/SUCC(witem_nb&),OB_W(adtree%(1),9)))
  2556.                   black_white(1,9,1)
  2557.                   test_evnt
  2558.                 ENDIF
  2559.               ENDIF
  2560.               '
  2561.             WEND
  2562.           ENDIF
  2563.         ENDIF
  2564.         ~GEMDOS(73,L:msg_adr%)
  2565.       ENDIF
  2566.       ~GEMDOS(62,W:msg_handle&)
  2567.     ENDIF
  2568.   ENDIF
  2569.   '
  2570.   mouse_free
  2571. RETURN
  2572. > PROCEDURE load_maze_fitem(pmaze_name$,reload!)
  2573.   LOCAL file_handle&,len_handle%,file_adr%,file_ptr%,offset&,fitem_file$,fitem_nb&,fitem_structure_length&
  2574.   LOCAL chk_table%,chk_line%,cell_value|,good!
  2575.   LOCAL litem_d|,litem_t|,litem_f|,litem_i|,door_job_type|,door_open_state|
  2576.   ~FRE()
  2577.   ~FRE(0)
  2578.   '
  2579.   good!=FALSE
  2580.   fitem_file$=LEFT$(pmaze_name$,PRED(RINSTR(pmaze_name$,".DG")))+extension_dfi$
  2581.   file_adr%=0
  2582.   '
  2583.   IF @s_exist(fitem_file$)=TRUE
  2584.     file_handle&=GEMDOS(61,L:V:fitem_file$,W:0)
  2585.     IF file_handle&>0
  2586.       len_handle%=GEMDOS(66,L:0,W:file_handle&,W:2)
  2587.       ~GEMDOS(66,L:0,W:file_handle&,W:0)
  2588.       file_adr%=GEMDOS(72,L:SHL(SHR(ADD(len_handle%,15),4),4))
  2589.       IF file_adr%>0
  2590.         mouse_disk
  2591.         IF GEMDOS(63,W:file_handle&,L:len_handle%,L:file_adr%)=len_handle%
  2592.           IF MKL$(LONG{file_adr%})="_DFI" AND len_handle%>127
  2593.             IF VAL(MKL$(LONG{ADD(file_adr%,4)}))=<VAL(dgem_version$)
  2594.               '
  2595.               fitem_structure_length&=INT{ADD(file_adr%,72)}
  2596.               fitem_nb&=PRED(INT{ADD(file_adr%,74)})
  2597.               '
  2598.               chk_table%=0
  2599.               IF fitem_nb&>-1
  2600.                 mouse_busy
  2601.                 good!=TRUE
  2602.                 file_ptr%=ADD(file_adr%,128)
  2603.                 FOR fitem_n&=0 TO fitem_nb&
  2604.                   chk_line%=0
  2605.                   maze_nb&=MAX(0,MIN(INT{file_ptr%},PRED(maze_nb_level&)))
  2606.                   ADD chk_line%,maze_nb&
  2607.                   maze_x&=MAX(0,MIN(PRED(INT{ADD(file_ptr%,2)}),PRED(maze_width&)))
  2608.                   ADD chk_line%,SUCC(maze_x&)
  2609.                   maze_y&=MAX(0,MIN(PRED(INT{ADD(file_ptr%,4)}),PRED(maze_height&)))
  2610.                   ADD chk_line%,SUCC(maze_y&)
  2611.                   litem_t|=BYTE{ADD(file_ptr%,6)}
  2612.                   ADD chk_line%,litem_t|
  2613.                   litem_f|=BYTE{ADD(file_ptr%,7)}
  2614.                   ADD chk_line%,litem_f|
  2615.                   litem_i|=BYTE{ADD(file_ptr%,8)}
  2616.                   ADD chk_line%,litem_i|
  2617.                   '
  2618.                   IF INT{ADD(file_ptr%,ADD(6,fitem_structure_length&))}<>(chk_line% AND &H57)
  2619.                     good!=FALSE
  2620.                     ~@alert(1,44)
  2621.                     sortir
  2622.                   ELSE
  2623.                     '
  2624.                     litem_adr%=@get_tile_containor(maze_nb&,maze_x&,maze_y&)
  2625.                     IF litem_adr%<1
  2626.                       litem_adr%=@create_tile_containor(maze_nb&,maze_x&,maze_y&)
  2627.                     ENDIF
  2628.                     IF litem_adr%>0
  2629.                       IF @get_maze_design(maze_nb&,maze_x&,maze_y&)=litem_t|
  2630.                         litem_tmp_adr%=@add_tile_item(litem_adr%,1,fitem_structure_length&,litem_t|,litem_f|,litem_i|)
  2631.                         BMOVE ADD(file_ptr%,6),ADD(litem_tmp_adr%,6),fitem_structure_length&
  2632.                         '
  2633.                         ' recreate job for doors
  2634.                         '
  2635.                         IF litem_f|=3 AND litem_i|>2
  2636.                           door_job_type|=@get_byte(litem_tmp_adr%,offset_door_job_type&)
  2637.                           IF door_job_type|>0
  2638.                             ~@new_job(door_job_type|,200,litem_tmp_adr%,maze_nb&,maze_x&,maze_y&)
  2639.                           ENDIF
  2640.                         ENDIF
  2641.                         '
  2642.                       ENDIF
  2643.                     ENDIF
  2644.                     '
  2645.                   ENDIF
  2646.                   ADD file_ptr%,ADD(fitem_structure_length&,8)
  2647.                   EXIT IF NOT good!
  2648.                   ADD chk_table%,chk_line%
  2649.                   '
  2650.                   IF NOT reload!
  2651.                     IF MOD(fitem_n&,10)=0
  2652.                       OB_W(adtree%(1),10)=MAX(4,MIN((OB_W(adtree%(1),9)*SUCC(fitem_n&))/SUCC(fitem_nb&),OB_W(adtree%(1),9)))
  2653.                       black_white(1,9,1)
  2654.                       test_evnt
  2655.                     ENDIF
  2656.                   ENDIF
  2657.                   '
  2658.                 NEXT fitem_n&
  2659.                 mouse_free
  2660.               ENDIF
  2661.               '
  2662.               IF INT{ADD(file_adr%,76)}<>(chk_table% AND &HF71)
  2663.                 good!=FALSE
  2664.                 ~@alert(1,44)
  2665.                 sortir
  2666.               ENDIF
  2667.             ELSE
  2668.               ~@alert(1,43)
  2669.               sortir
  2670.             ENDIF
  2671.           ELSE
  2672.             ~@alert(1,42)
  2673.             sortir
  2674.           ENDIF
  2675.         ELSE
  2676.           ~@alert(1,40)
  2677.           sortir
  2678.         ENDIF
  2679.         mouse_free
  2680.         ~GEMDOS(73,L:file_adr%)
  2681.       ENDIF
  2682.       ~GEMDOS(62,W:file_handle&)
  2683.     ELSE
  2684.       ~@alert(1,41)
  2685.       sortir
  2686.     ENDIF
  2687.   ENDIF
  2688.   '
  2689.   mouse_free
  2690. RETURN
  2691. '
  2692. > PROCEDURE init_game
  2693.   '
  2694.   ' create offscreen buffer (length corresponding of view = image slot 11)
  2695.   '
  2696.   IF LONG{img_mfdb%(1)}>0
  2697.     ~GEMDOS(73,L:LONG{img_mfdb%(1)})
  2698.     LONG{img_mfdb%(1)}=0
  2699.   ENDIF
  2700.   '
  2701.   img_w&(1)=img_w&(11)
  2702.   img_h&(1)=img_h&(11)
  2703.   dungeon_view_len%=MUL(MUL(INT{ADD(img_mfdb%(11),8)},img_h&(1)),SHL(nb_plan&,1))
  2704.   '
  2705.   LONG{img_mfdb%(1)}=GEMDOS(72,L:ADD(dungeon_view_len%,16))
  2706.   IF LONG{img_mfdb%(1)}>0
  2707.     INT{ADD(offscreen%,4)}=INT{ADD(img_mfdb%(11),4)}
  2708.     INT{ADD(offscreen%,6)}=INT{ADD(img_mfdb%(11),6)}
  2709.     INT{ADD(offscreen%,8)}=INT{ADD(img_mfdb%(11),8)}
  2710.     INT{ADD(offscreen%,10)}=INT{ADD(img_mfdb%(11),10)}
  2711.     INT{ADD(offscreen%,12)}=INT{ADD(img_mfdb%(11),12)}
  2712.   ELSE
  2713.     ~@alert(1,11)
  2714.     sortir
  2715.   ENDIF
  2716.   '
  2717.   allocate_scale_screen
  2718.   '
  2719.   end!=FALSE
  2720.   '
  2721. RETURN
  2722. '
  2723. > PROCEDURE new_game
  2724.   '
  2725.   IF game_active!
  2726.     @load_maze_design(folder_maze$+filename_dgm$,TRUE)
  2727.     @load_maze_witem(folder_maze$+filename_dgm$,TRUE)
  2728.     @load_maze_witem_msg(folder_maze$+filename_dgm$,TRUE)
  2729.     @load_maze_fitem(folder_maze$+filename_dgm$,TRUE)
  2730.   ENDIF
  2731.   '
  2732.   init_game
  2733.   '
  2734.   pathfile_sav$=LEFT$(folder_sav$,PRED(LEN(folder_sav$)))+"DEFAULT"+extension_sav$
  2735.   '
  2736.   myself_position_n&=0
  2737.   myself_position_x&=21
  2738.   myself_position_y&=16
  2739.   myself_direction&=4
  2740.   myself_new_direction&=1
  2741.   '
  2742.   new_game!=TRUE
  2743.   ~MENU_IENABLE(adtree%(0),22,0)
  2744.   game_active!=TRUE
  2745.   menu_activate_game
  2746.   '
  2747.   get_maze_environment
  2748.   draw_view(TRUE)
  2749.   '
  2750.   IF icon!
  2751.     ferme_win(0)
  2752.   ENDIF
  2753.   ferme_win(1)
  2754.   win(0)
  2755.   win(2)
  2756.   win_join
  2757.   force_update(2)
  2758.   '
  2759. RETURN
  2760. > PROCEDURE open_game_as
  2761.   dummy$=@fileselector2$(19,LEFT$(folder_sav$,RINSTR(folder_sav$,"\"))+"*"+extension_sav$,"DEFAULT"+extension_sav$)
  2762.   IF LEN(dummy$)>1
  2763.     pathfile_sav$=@verify_extension$(dummy$)
  2764.     open_game
  2765.   ENDIF
  2766. RETURN
  2767. > PROCEDURE open_game
  2768.   LOCAL sav_handle&,sav_handle%,sav_adr%
  2769.   LOCAL chk_line%,good!
  2770.   ~FRE()
  2771.   ~FRE(0)
  2772.   '
  2773.   good!=FALSE
  2774.   sav_adr%=0
  2775.   '
  2776.   IF @s_exist(pathfile_sav$)=TRUE AND LEN(pathfile_sav$)>1
  2777.     sav_handle&=GEMDOS(61,L:V:pathfile_sav$,W:0)
  2778.     mouse_disk
  2779.     IF sav_handle&>0
  2780.       sav_len%=GEMDOS(66,L:0,W:sav_handle&,W:2)
  2781.       ~GEMDOS(66,L:0,W:sav_handle&,W:0)
  2782.       sav_adr%=GEMDOS(72,L:SHL(SHR(ADD(sav_len%,15),4),4))
  2783.       IF sav_adr%>0
  2784.         IF GEMDOS(63,W:sav_handle&,L:sav_len%,L:sav_adr%)=sav_len%
  2785.           IF MKL$(LONG{sav_adr%})="_DGS"
  2786.             IF MKL$(LONG{ADD(sav_adr%,4)})=dgem_version$ AND sav_len%>17
  2787.               '
  2788.               myself_position_n&=INT{ADD(sav_adr%,8)}
  2789.               myself_position_x&=INT{ADD(sav_adr%,10)}
  2790.               myself_position_y&=INT{ADD(sav_adr%,12)}
  2791.               myself_direction&=INT{ADD(sav_adr%,14)}
  2792.               '
  2793.               chk_line%=ADD(ADD(ADD(myself_position_n&,myself_position_x&),myself_position_y&),myself_direction&)
  2794.               IF AND(chk_line%,&HFA)<>INT{ADD(sav_adr%,16)}
  2795.                 ~@alert(1,21)
  2796.               ELSE
  2797.                 good!=TRUE
  2798.               ENDIF
  2799.               '
  2800.             ELSE
  2801.               ~@alert(1,22)
  2802.             ENDIF
  2803.           ELSE
  2804.             ~@alert(1,23)
  2805.           ENDIF
  2806.         ELSE
  2807.           ~@alert(1,24)
  2808.         ENDIF
  2809.         ~GEMDOS(73,L:sav_adr%)
  2810.       ENDIF
  2811.       ~GEMDOS(62,W:sav_handle&)
  2812.     ELSE
  2813.       ~@alert(1,25)
  2814.     ENDIF
  2815.     mouse_free
  2816.   ELSE
  2817.     ~@alert(1,26)
  2818.   ENDIF
  2819.   '
  2820.   IF NOT good!
  2821.     new_game
  2822.   ELSE
  2823.     '
  2824.     @load_maze_design(folder_maze$+filename_dgm$,TRUE)
  2825.     @load_maze_witem(pathfile_sav$,TRUE)
  2826.     @load_maze_witem_msg(folder_maze$+filename_dgm$,TRUE)
  2827.     @load_maze_fitem(pathfile_sav$,TRUE)
  2828.     '
  2829.     init_game
  2830.     '
  2831.     game_active!=TRUE
  2832.     menu_activate_game
  2833.     '
  2834.     get_maze_environment
  2835.     draw_view(TRUE)
  2836.     '
  2837.     IF icon!
  2838.       ferme_win(0)
  2839.     ENDIF
  2840.     ferme_win(1)
  2841.     win(0)
  2842.     win(2)
  2843.     win_join
  2844.     force_update(2)
  2845.     ~MENU_IENABLE(adtree%(0),22,1)
  2846.     '
  2847.   ENDIF
  2848.   '
  2849. RETURN
  2850. > PROCEDURE save_game_as
  2851.   dummy$=@fileselector2$(20,LEFT$(folder_sav$,RINSTR(folder_sav$,"\"))+"*"+extension_sav$,MID$(pathfile_sav$,SUCC(RINSTR(pathfile_sav$,"\"))))
  2852.   IF LEN(dummy$)>1
  2853.     IF @s_exist(dummy$)
  2854.       reponse&=@alert(2,27)
  2855.     ELSE
  2856.       reponse&=1
  2857.     ENDIF
  2858.     IF reponse&=1
  2859.       old_pathfile_sav$=pathfile_sav$
  2860.       pathfile_sav$=@verify_extension$(dummy$)
  2861.       @save_game
  2862.       new_game!=FALSE
  2863.       ~MENU_IENABLE(adtree%(0),22,1)
  2864.     ENDIF
  2865.   ENDIF
  2866. RETURN
  2867. > PROCEDURE save_game
  2868.   LOCAL sav_handle&,sav_len%,sav_adr%
  2869.   LOCAL chk_line%
  2870.   ~FRE()
  2871.   ~FRE(0)
  2872.   '
  2873.   IF @s_exist(pathfile_sav$)
  2874.     ~GEMDOS(65,L:V:pathfile_sav$)
  2875.   ENDIF
  2876.   '
  2877.   good!=TRUE
  2878.   sav_adr%=GEMDOS(72,L:32)
  2879.   '
  2880.   IF @s_exist(pathfile_sav$)=FALSE AND sav_adr%>0
  2881.     sav_handle&=GEMDOS(60,L:V:pathfile_sav$,W:0)
  2882.     mouse_disk
  2883.     IF sav_handle&>0
  2884.       '
  2885.       LONG{sav_adr%}=CVL("_DGS")
  2886.       LONG{ADD(sav_adr%,4)}=CVL(dgem_version$)
  2887.       INT{ADD(sav_adr%,8)}=myself_position_n&
  2888.       INT{ADD(sav_adr%,10)}=myself_position_x&
  2889.       INT{ADD(sav_adr%,12)}=myself_position_y&
  2890.       INT{ADD(sav_adr%,14)}=myself_direction&
  2891.       chk_line%=ADD(ADD(ADD(myself_position_n&,myself_position_x&),myself_position_y&),myself_direction&)
  2892.       INT{ADD(sav_adr%,16)}=AND(chk_line%,&HFA)
  2893.       '
  2894.       IF GEMDOS(64,W:sav_handle&,L:18,L:sav_adr%)<>18
  2895.         good!=FALSE
  2896.         ~@alert(1,28)
  2897.       ENDIF
  2898.       '
  2899.       ~GEMDOS(62,W:sav_handle&)
  2900.     ENDIF
  2901.     mouse_free
  2902.     ~GEMDOS(73,L:sav_adr%)
  2903.   ELSE
  2904.     ~@alert(1,29)
  2905.   ENDIF
  2906.   '
  2907.   IF NOT good!
  2908.     pathfile_sav$=old_pathfile_sav$
  2909.   ELSE
  2910.     @save_maze_witem(pathfile_sav$)
  2911.     @save_maze_fitem(pathfile_sav$)
  2912.   ENDIF
  2913.   '
  2914. RETURN
  2915. > PROCEDURE save_maze_witem(pmaze_file$)
  2916.   LOCAL file_handle&,len_handle%,file_adr%,file_ptr%,witem_file$,witem_structure_length&
  2917.   LOCAL chk_table%,chk_line%,cell_value|,good!
  2918.   LOCAL litem_ptr%,litem_n&,litem_d|
  2919.   ~FRE()
  2920.   ~FRE(0)
  2921.   '
  2922.   good!=TRUE
  2923.   '
  2924.   witem_nb&=0
  2925.   witem_file$=LEFT$(pmaze_file$,PRED(RINSTR(pmaze_file$,".DG")))+extension_dwi$
  2926.   ~GEMDOS(65,L:V:witem_file$)
  2927.   '
  2928.   file_adr%=GEMDOS(72,L:512)
  2929.   '
  2930.   IF @s_exist(witem_file$)=FALSE AND file_adr%>0
  2931.     memory_fill(file_adr%,512,memory_pattern_0%)
  2932.     '
  2933.     file_handle&=GEMDOS(60,L:V:witem_file$,W:0)
  2934.     '
  2935.     mouse_disk
  2936.     IF file_handle&>0
  2937.       '
  2938.       LONG{file_adr%}=CVL("_DWI")
  2939.       LONG{ADD(file_adr%,4)}=CVL(dgem_version$)
  2940.       witem_structure_length&=0
  2941.       '
  2942.       IF GEMDOS(64,W:file_handle&,L:128,L:file_adr%)<>128
  2943.         good!=FALSE
  2944.       ENDIF
  2945.       '
  2946.       IF good!
  2947.         chk_table%=0
  2948.         FOR maze_nb&=0 TO PRED(maze_nb_level&)
  2949.           FOR maze_y&=0 TO PRED(maze_height&)
  2950.             FOR maze_x&=0 TO PRED(maze_width&)
  2951.               litem_adr%=@get_tile_containor(maze_nb&,maze_x&,maze_y&)
  2952.               IF litem_adr%>0
  2953.                 '
  2954.                 litem_n&=0
  2955.                 get_tile_pointers(litem_adr%,work_n%,work_s%,work_e%,work_w%)
  2956.                 litem_d|=@litem_find_direction(work_n%,work_s%,work_e%,work_w%)
  2957.                 litem_adr%=@litem_find_first_item(work_n%,work_s%,work_e%,work_w%)
  2958.                 WHILE litem_adr%>0
  2959.                   get_tile_item(litem_adr%,litem_ptr%,dummy&,litem_tmp_type|,dummy|,dummy|)
  2960.                   IF witem_structure_length&=0
  2961.                     witem_structure_length&=MAX(0,SUB(dummy&,6))
  2962.                   ENDIF
  2963.                   IF litem_tmp_type|=1 AND litem_adr%>0
  2964.                     litem_save%(litem_n&)=litem_adr%
  2965.                     INC litem_n&
  2966.                     INC witem_nb&
  2967.                   ENDIF
  2968.                   litem_adr%=litem_ptr%
  2969.                 WEND
  2970.                 '
  2971.                 IF litem_n&>0
  2972.                   FOR litem_i&=0 TO PRED(litem_n&)
  2973.                     memory_fill(file_adr%,ADD(10,witem_structure_length&),memory_pattern_0%)
  2974.                     chk_line%=0
  2975.                     ADD chk_line%,maze_nb&
  2976.                     INT{file_adr%}=maze_nb&
  2977.                     ADD chk_line%,SUCC(maze_x&)
  2978.                     INT{ADD(file_adr%,2)}=SUCC(maze_x&)
  2979.                     ADD chk_line%,SUCC(maze_y&)
  2980.                     INT{ADD(file_adr%,4)}=SUCC(maze_y&)
  2981.                     BYTE{ADD(file_adr%,6)}=0
  2982.                     ADD chk_line%,litem_d|
  2983.                     BYTE{ADD(file_adr%,7)}=litem_d|
  2984.                     ADD chk_line%,BYTE{ADD(litem_save%(litem_i&),6)}
  2985.                     ADD chk_line%,BYTE{ADD(litem_save%(litem_i&),7)}
  2986.                     ADD chk_line%,BYTE{ADD(litem_save%(litem_i&),8)}
  2987.                     '
  2988.                     BMOVE ADD(litem_save%(litem_i&),6),ADD(file_adr%,8),witem_structure_length&
  2989.                     '
  2990.                     IF BYTE{ADD(litem_save%(litem_i&),7)}=3 ! message
  2991.                       LONG{ADD(file_adr%,12)}=0
  2992.                     ENDIF
  2993.                     '
  2994.                     INT{ADD(file_adr%,ADD(8,witem_structure_length&))}=chk_line% AND &H57
  2995.                     IF GEMDOS(64,W:file_handle&,L:ADD(10,witem_structure_length&),L:file_adr%)<>ADD(10,witem_structure_length&)
  2996.                       good!=FALSE
  2997.                     ENDIF
  2998.                     ADD chk_table%,chk_line%
  2999.                     EXIT IF NOT good!
  3000.                   NEXT litem_i&
  3001.                 ENDIF
  3002.                 '
  3003.               ENDIF
  3004.               EXIT IF NOT good!
  3005.             NEXT maze_x&
  3006.             EXIT IF NOT good!
  3007.           NEXT maze_y&
  3008.           EXIT IF NOT good!
  3009.         NEXT maze_nb&
  3010.         '
  3011.         ~GEMDOS(66,L:72,W:file_handle&,W:0)
  3012.         INT{file_adr%}=witem_structure_length&
  3013.         INT{ADD(file_adr%,2)}=witem_nb&
  3014.         INT{ADD(file_adr%,4)}=chk_table% AND &HF71
  3015.         ~GEMDOS(64,W:file_handle&,L:6,L:file_adr%)
  3016.         '
  3017.       ENDIF
  3018.       ~GEMDOS(62,W:file_handle&)
  3019.     ENDIF
  3020.     ~GEMDOS(73,L:file_adr%)
  3021.     mouse_free
  3022.   ENDIF
  3023.   file_adr%=0
  3024.   '
  3025. RETURN
  3026. > PROCEDURE save_maze_fitem(pmaze_file$)
  3027.   LOCAL file_handle&,len_handle%,file_adr%,file_ptr%,fitem_file$,witem_structure_length&
  3028.   LOCAL chk_table%,chk_line%,cell_value|,good!
  3029.   LOCAL litem_ptr%,litem_n&,litem_d|
  3030.   ~FRE()
  3031.   ~FRE(0)
  3032.   '
  3033.   good!=TRUE
  3034.   '
  3035.   fitem_nb&=0
  3036.   fitem_file$=LEFT$(pmaze_file$,PRED(RINSTR(pmaze_file$,".DG")))+extension_dfi$
  3037.   ~GEMDOS(65,L:V:fitem_file$)
  3038.   '
  3039.   file_adr%=GEMDOS(72,L:512)
  3040.   IF @s_exist(fitem_file$)=FALSE AND file_adr%>0
  3041.     '
  3042.     memory_fill(file_adr%,512,memory_pattern_0%)
  3043.     '
  3044.     file_handle&=GEMDOS(60,L:V:fitem_file$,W:0)
  3045.     '
  3046.     mouse_disk
  3047.     IF file_handle&>0
  3048.       '
  3049.       LONG{file_adr%}=CVL("_DFI")
  3050.       LONG{ADD(file_adr%,4)}=CVL(d_editor_version$)
  3051.       fitem_structure_length&=0
  3052.       '
  3053.       IF GEMDOS(64,W:file_handle&,L:128,L:file_adr%)<>128
  3054.         good!=FALSE
  3055.       ENDIF
  3056.       '
  3057.       IF good!
  3058.         chk_table%=0
  3059.         FOR maze_nb&=0 TO PRED(maze_nb_level&)
  3060.           FOR maze_y&=0 TO PRED(maze_height&)
  3061.             FOR maze_x&=0 TO PRED(maze_width&)
  3062.               litem_adr%=@get_tile_containor(maze_nb&,maze_x&,maze_y&)
  3063.               IF litem_adr%>0
  3064.                 '
  3065.                 litem_n&=0
  3066.                 get_tile_pointers(litem_adr%,work_n%,work_s%,work_e%,work_w%)
  3067.                 litem_adr%=@litem_find_first_item(work_n%,work_s%,work_e%,work_w%)
  3068.                 get_tile_item(litem_adr%,litem_ptr%,dummy&,litem_tmp_type|,dummy|,dummy|)
  3069.                 IF litem_tmp_type|=0 AND litem_adr%>0
  3070.                   IF fitem_structure_length&=0
  3071.                     fitem_structure_length&=MAX(0,SUB(dummy&,6))
  3072.                   ENDIF
  3073.                   litem_save%(0)=litem_adr%
  3074.                   litem_n&=1
  3075.                   INC fitem_nb&
  3076.                 ENDIF
  3077.                 '
  3078.                 IF litem_n&>0
  3079.                   chk_line%=0
  3080.                   memory_fill(file_adr%,ADD(8,fitem_structure_length&),memory_pattern_0%)
  3081.                   ADD chk_line%,maze_nb&
  3082.                   INT{file_adr%}=maze_nb&
  3083.                   ADD chk_line%,SUCC(maze_x&)
  3084.                   INT{ADD(file_adr%,2)}=SUCC(maze_x&)
  3085.                   ADD chk_line%,SUCC(maze_y&)
  3086.                   INT{ADD(file_adr%,4)}=SUCC(maze_y&)
  3087.                   ADD chk_line%,BYTE{ADD(litem_save%(0),6)}
  3088.                   ADD chk_line%,BYTE{ADD(litem_save%(0),7)}
  3089.                   ADD chk_line%,BYTE{ADD(litem_save%(0),8)}
  3090.                   '
  3091.                   BMOVE ADD(litem_save%(0),6),ADD(file_adr%,6),fitem_structure_length&
  3092.                   '
  3093.                   INT{ADD(file_adr%,ADD(6,fitem_structure_length&))}=chk_line% AND &H57
  3094.                   IF GEMDOS(64,W:file_handle&,L:ADD(8,fitem_structure_length&),L:file_adr%)<>ADD(8,fitem_structure_length&)
  3095.                     good!=FALSE
  3096.                   ENDIF
  3097.                   ADD chk_table%,chk_line%
  3098.                 ENDIF
  3099.                 '
  3100.               ENDIF
  3101.               EXIT IF NOT good!
  3102.             NEXT maze_x&
  3103.             EXIT IF NOT good!
  3104.           NEXT maze_y&
  3105.           EXIT IF NOT good!
  3106.         NEXT maze_nb&
  3107.         '
  3108.         ~GEMDOS(66,L:72,W:file_handle&,W:0)
  3109.         INT{file_adr%}=fitem_structure_length&
  3110.         INT{ADD(file_adr%,2)}=fitem_nb&
  3111.         INT{ADD(file_adr%,4)}=chk_table% AND &HF71
  3112.         ~GEMDOS(64,W:file_handle&,L:6,L:file_adr%)
  3113.         '
  3114.       ENDIF
  3115.       ~GEMDOS(62,W:file_handle&)
  3116.     ENDIF
  3117.     ~GEMDOS(73,L:file_adr%)
  3118.     mouse_free
  3119.   ENDIF
  3120.   file_adr%=0
  3121.   '
  3122. RETURN
  3123. > FUNCTION verify_extension$(pname$)
  3124.   LOCAL string0$,string1$,string2$,string1&
  3125.   '
  3126.   string1$=MID$(pname$,SUCC(RINSTR(pname$,"\")))
  3127.   pname$=LEFT$(pname$,RINSTR(pname$,"\"))
  3128.   '
  3129.   string1&=RINSTR(string1$,".")
  3130.   IF string1&>0
  3131.     string2$=MID$(string1$,string1&)
  3132.     IF UPPER$(LEFT$(string2$,4))=".DGS"
  3133.       string0$=pname$+string1$
  3134.     ELSE
  3135.       string0$=pname$+LEFT$(string1$,string1&)+"DGS"+c0$
  3136.     ENDIF
  3137.   ELSE
  3138.     string0$=pname$+LEFT$(string1$,PRED(LEN(string1$)))+".DGS"+c0$
  3139.   ENDIF
  3140.   '
  3141.   RETURN string0$
  3142. ENDFUNC
  3143. '
  3144. > PROCEDURE gere_action_pad
  3145.   SELECT OBJC_FIND(adtree%(2),0,3,mo_x&,mo_y&)
  3146.   CASE 2
  3147.     black_white(2,2,1)
  3148.     act_turn_left
  3149.     black_white(2,2,0)
  3150.   CASE 3
  3151.     black_white(2,3,1)
  3152.     act_go_straight
  3153.     black_white(2,3,0)
  3154.   CASE 4
  3155.     black_white(2,4,1)
  3156.     act_turn_right
  3157.     black_white(2,4,0)
  3158.   CASE 5
  3159.     black_white(2,5,1)
  3160.     act_go_left
  3161.     black_white(2,5,0)
  3162.   CASE 6
  3163.     black_white(2,6,1)
  3164.     act_go_back
  3165.     black_white(2,6,0)
  3166.   CASE 7
  3167.     black_white(2,7,1)
  3168.     act_go_right
  3169.     black_white(2,7,0)
  3170.   DEFAULT
  3171.     win(2)
  3172.   ENDSELECT
  3173. RETURN
  3174. > PROCEDURE act_turn_left
  3175.   SELECT maze_env_f0&
  3176.   CASE 0,11
  3177.     SELECT myself_direction&
  3178.     CASE 1
  3179.       myself_new_direction&=4
  3180.     CASE 2
  3181.       myself_new_direction&=3
  3182.     CASE 3
  3183.       myself_new_direction&=1
  3184.     CASE 4
  3185.       myself_new_direction&=2
  3186.     ENDSELECT
  3187.     myself_direction&=myself_new_direction&
  3188.     get_maze_environment
  3189.     snd_relocate
  3190.     draw_view(TRUE)
  3191.   CASE 2
  3192.     DEC myself_position_n&
  3193.     myself_direction&=1
  3194.     get_maze_environment
  3195.     snd_stop
  3196.     draw_view(TRUE)
  3197.   CASE 3
  3198.     DEC myself_position_n&
  3199.     myself_direction&=2
  3200.     get_maze_environment
  3201.     snd_stop
  3202.     draw_view(TRUE)
  3203.   CASE 4
  3204.     DEC myself_position_n&
  3205.     myself_direction&=3
  3206.     get_maze_environment
  3207.     snd_stop
  3208.     draw_view(TRUE)
  3209.   CASE 5
  3210.     DEC myself_position_n&
  3211.     myself_direction&=4
  3212.     get_maze_environment
  3213.     snd_stop
  3214.     draw_view(TRUE)
  3215.   CASE 6
  3216.     INC myself_position_n&
  3217.     myself_direction&=1
  3218.     get_maze_environment
  3219.     snd_stop
  3220.     draw_view(TRUE)
  3221.   CASE 7
  3222.     INC myself_position_n&
  3223.     myself_direction&=2
  3224.     get_maze_environment
  3225.     snd_stop
  3226.     draw_view(TRUE)
  3227.   CASE 8
  3228.     INC myself_position_n&
  3229.     myself_direction&=3
  3230.     get_maze_environment
  3231.     snd_stop
  3232.     draw_view(TRUE)
  3233.   CASE 9
  3234.     INC myself_position_n&
  3235.     myself_direction&=4
  3236.     get_maze_environment
  3237.     snd_stop
  3238.     draw_view(TRUE)
  3239.   ENDSELECT
  3240. RETURN
  3241. > PROCEDURE act_go_straight
  3242.   '
  3243.   move_is_blocked!=FALSE
  3244.   move_is_teleportation!=FALSE
  3245.   '
  3246.   IF maze_env_f1&=1 ! against wall
  3247.     move_is_blocked!=TRUE
  3248.   ELSE IF maze_env_f1&=0
  3249.     SELECT myself_direction&
  3250.     CASE 1
  3251.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  3252.     CASE 2
  3253.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  3254.     CASE 3
  3255.       fitem_beside_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  3256.     CASE 4
  3257.       fitem_beside_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  3258.     ENDSELECT
  3259.     '
  3260.     IF fitem_beside_ptr%>0
  3261.       get_tile_item(fitem_beside_ptr%,dummy%,dummy&,litem_beside_type|,litem_beside_family|,litem_beside_id|)
  3262.       IF litem_beside_type|=0
  3263.         IF litem_beside_family|=3
  3264.           IF litem_beside_id|=0 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)=0
  3265.             move_is_blocked!=TRUE
  3266.           ELSE IF litem_beside_id|=10 ! can pass through broken door
  3267.           ELSE IF litem_beside_id|>2 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)<3
  3268.             move_is_blocked!=TRUE
  3269.           ENDIF
  3270.         ELSE IF litem_beside_family|=4
  3271.           '
  3272.           IF BTST(@get_byte(fitem_beside_ptr%,offset_item_active&),0) ! active ?
  3273.             IF BTST(@get_byte(fitem_beside_ptr%,offset_teleporter_scope&),2) ! scope for party ?
  3274.               IF @get_int(fitem_beside_ptr%,offset_target_n&)>-2 AND @get_int(fitem_beside_ptr%,offset_target_x&)>0 AND @get_int(fitem_beside_ptr%,offset_target_y&)>0 ! existing location
  3275.                 move_is_teleportation!=TRUE
  3276.               ENDIF
  3277.             ENDIF
  3278.           ENDIF
  3279.           '
  3280.         ENDIF
  3281.       ENDIF
  3282.     ENDIF
  3283.   ENDIF
  3284.   '
  3285.   IF move_is_teleportation!
  3286.     teleport_party(fitem_beside_ptr%)
  3287.   ELSE IF move_is_blocked!
  3288.     SELECT myself_direction&
  3289.     CASE 1
  3290.       snd_play(1,FALSE,myself_position_x&,PRED(myself_position_y&))
  3291.     CASE 2
  3292.       snd_play(1,FALSE,myself_position_x&,SUCC(myself_position_y&))
  3293.     CASE 3
  3294.       snd_play(1,FALSE,SUCC(myself_position_x&),myself_position_y&)
  3295.     CASE 4
  3296.       snd_play(1,FALSE,PRED(myself_position_x&),myself_position_y&)
  3297.     ENDSELECT
  3298.   ELSE
  3299.     SELECT myself_direction&
  3300.     CASE 1
  3301.       DEC myself_position_y&
  3302.     CASE 2
  3303.       INC myself_position_y&
  3304.     CASE 3
  3305.       INC myself_position_x&
  3306.     CASE 4
  3307.       DEC myself_position_x&
  3308.     ENDSELECT
  3309.     release_pad
  3310.     snd_relocate
  3311.     test_stairs
  3312.     get_maze_environment
  3313.     draw_view(TRUE)
  3314.   ENDIF
  3315.   '
  3316. RETURN
  3317. > PROCEDURE act_turn_right
  3318.   SELECT maze_env_f0&
  3319.   CASE 0,11
  3320.     SELECT myself_direction&
  3321.     CASE 1
  3322.       myself_new_direction&=3
  3323.     CASE 2
  3324.       myself_new_direction&=4
  3325.     CASE 3
  3326.       myself_new_direction&=2
  3327.     CASE 4
  3328.       myself_new_direction&=1
  3329.     ENDSELECT
  3330.     myself_direction&=myself_new_direction&
  3331.     get_maze_environment
  3332.     snd_relocate
  3333.     draw_view(TRUE)
  3334.   CASE 2
  3335.     DEC myself_position_n&
  3336.     myself_direction&=1
  3337.     get_maze_environment
  3338.     snd_stop
  3339.     draw_view(TRUE)
  3340.   CASE 3
  3341.     DEC myself_position_n&
  3342.     myself_direction&=2
  3343.     get_maze_environment
  3344.     snd_stop
  3345.     draw_view(TRUE)
  3346.   CASE 4
  3347.     DEC myself_position_n&
  3348.     myself_direction&=3
  3349.     get_maze_environment
  3350.     snd_stop
  3351.     draw_view(TRUE)
  3352.   CASE 5
  3353.     DEC myself_position_n&
  3354.     myself_direction&=4
  3355.     get_maze_environment
  3356.     snd_stop
  3357.     draw_view(TRUE)
  3358.   CASE 6
  3359.     INC myself_position_n&
  3360.     myself_direction&=1
  3361.     get_maze_environment
  3362.     snd_stop
  3363.     draw_view(TRUE)
  3364.   CASE 7
  3365.     INC myself_position_n&
  3366.     myself_direction&=2
  3367.     get_maze_environment
  3368.     snd_stop
  3369.     draw_view(TRUE)
  3370.   CASE 8
  3371.     INC myself_position_n&
  3372.     myself_direction&=3
  3373.     get_maze_environment
  3374.     snd_stop
  3375.     draw_view(TRUE)
  3376.   CASE 9
  3377.     INC myself_position_n&
  3378.     myself_direction&=4
  3379.     get_maze_environment
  3380.     snd_stop
  3381.     draw_view(TRUE)
  3382.   ENDSELECT
  3383. RETURN
  3384. > PROCEDURE act_go_left
  3385.   '
  3386.   move_is_blocked!=FALSE
  3387.   move_is_teleportation!=FALSE
  3388.   '
  3389.   IF maze_env_l0&=1 ! against wall
  3390.     move_is_blocked!=TRUE
  3391.   ELSE IF maze_env_l0&=0
  3392.     SELECT myself_direction&
  3393.     CASE 1
  3394.       fitem_beside_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  3395.     CASE 2
  3396.       fitem_beside_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  3397.     CASE 3
  3398.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  3399.     CASE 4
  3400.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  3401.     ENDSELECT
  3402.     '
  3403.     IF fitem_beside_ptr%>0
  3404.       get_tile_item(fitem_beside_ptr%,dummy%,dummy&,litem_beside_type|,litem_beside_family|,litem_beside_id|)
  3405.       IF litem_beside_type|=0
  3406.         IF litem_beside_family|=3
  3407.           IF litem_beside_id|=0 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)=0
  3408.             move_is_blocked!=TRUE
  3409.           ELSE IF litem_beside_id|=10 ! can pass through broken door
  3410.           ELSE IF litem_beside_id|>2 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)<3
  3411.             move_is_blocked!=TRUE
  3412.           ENDIF
  3413.         ELSE IF litem_beside_family|=4
  3414.           '
  3415.           IF BTST(@get_byte(fitem_beside_ptr%,offset_item_active&),0) ! active ?
  3416.             IF BTST(@get_byte(fitem_beside_ptr%,offset_teleporter_scope&),2) ! scope for party ?
  3417.               IF @get_int(fitem_beside_ptr%,offset_target_n&)>-2 AND @get_int(fitem_beside_ptr%,offset_target_x&)>0 AND @get_int(fitem_beside_ptr%,offset_target_y&)>0 ! existing location
  3418.                 move_is_teleportation!=TRUE
  3419.               ENDIF
  3420.             ENDIF
  3421.           ENDIF
  3422.           '
  3423.         ENDIF
  3424.       ENDIF
  3425.     ENDIF
  3426.   ENDIF
  3427.   '
  3428.   IF move_is_teleportation!
  3429.     teleport_party(fitem_beside_ptr%)
  3430.   ELSE IF move_is_blocked!
  3431.     SELECT myself_direction&
  3432.     CASE 1
  3433.       snd_play(1,FALSE,PRED(myself_position_x&),myself_position_y&)
  3434.     CASE 2
  3435.       snd_play(1,FALSE,SUCC(myself_position_x&),myself_position_y&)
  3436.     CASE 3
  3437.       snd_play(1,FALSE,myself_position_x&,PRED(myself_position_y&))
  3438.     CASE 4
  3439.       snd_play(1,FALSE,myself_position_x&,SUCC(myself_position_y&))
  3440.     ENDSELECT
  3441.   ELSE
  3442.     SELECT myself_direction&
  3443.     CASE 1
  3444.       DEC myself_position_x&
  3445.     CASE 2
  3446.       INC myself_position_x&
  3447.     CASE 3
  3448.       DEC myself_position_y&
  3449.     CASE 4
  3450.       INC myself_position_y&
  3451.     ENDSELECT
  3452.     release_pad
  3453.     snd_relocate
  3454.     test_stairs
  3455.     get_maze_environment
  3456.     draw_view(TRUE)
  3457.   ENDIF
  3458. RETURN
  3459. > PROCEDURE act_go_back
  3460.   SELECT maze_env_f0&
  3461.   CASE 0,11
  3462.     '
  3463.     move_is_blocked!=FALSE
  3464.     move_is_teleportation!=FALSE
  3465.     '
  3466.     IF maze_env_f4&=1 ! against wall
  3467.       move_is_blocked!=TRUE
  3468.     ELSE IF maze_env_f4&=0
  3469.       SELECT myself_direction&
  3470.       CASE 1
  3471.         fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  3472.       CASE 2
  3473.         fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  3474.       CASE 3
  3475.         fitem_beside_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  3476.       CASE 4
  3477.         fitem_beside_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  3478.       ENDSELECT
  3479.       '
  3480.       IF fitem_beside_ptr%>0
  3481.         get_tile_item(fitem_beside_ptr%,dummy%,dummy&,litem_beside_type|,litem_beside_family|,litem_beside_id|)
  3482.         IF litem_beside_type|=0
  3483.           IF litem_beside_family|=3
  3484.             IF litem_beside_id|=0 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)=0
  3485.               move_is_blocked!=TRUE
  3486.             ELSE IF litem_beside_id|=10 ! can pass through broken door
  3487.             ELSE IF litem_beside_id|>2 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)<3
  3488.               move_is_blocked!=TRUE
  3489.             ENDIF
  3490.           ELSE IF litem_beside_family|=4
  3491.             '
  3492.             IF BTST(@get_byte(fitem_beside_ptr%,offset_item_active&),0) ! active ?
  3493.               IF BTST(@get_byte(fitem_beside_ptr%,offset_teleporter_scope&),2) ! scope for party ?
  3494.                 IF @get_int(fitem_beside_ptr%,offset_target_n&)>-2 AND @get_int(fitem_beside_ptr%,offset_target_x&)>0 AND @get_int(fitem_beside_ptr%,offset_target_y&)>0 ! existing location
  3495.                   move_is_teleportation!=TRUE
  3496.                 ENDIF
  3497.               ENDIF
  3498.             ENDIF
  3499.             '
  3500.           ENDIF
  3501.         ENDIF
  3502.       ENDIF
  3503.     ENDIF
  3504.     '
  3505.     IF move_is_teleportation!
  3506.       teleport_party(fitem_beside_ptr%)
  3507.     ELSE IF move_is_blocked!
  3508.       SELECT myself_direction&
  3509.       CASE 1
  3510.         snd_play(1,FALSE,myself_position_x&,SUCC(myself_position_y&))
  3511.       CASE 2
  3512.         snd_play(1,FALSE,myself_position_x&,PRED(myself_position_y&))
  3513.       CASE 3
  3514.         snd_play(1,FALSE,PRED(myself_position_x&),myself_position_y&)
  3515.       CASE 4
  3516.         snd_play(1,FALSE,SUCC(myself_position_x&),myself_position_y&)
  3517.       ENDSELECT
  3518.     ELSE
  3519.       SELECT myself_direction&
  3520.       CASE 1
  3521.         INC myself_position_y&
  3522.       CASE 2
  3523.         DEC myself_position_y&
  3524.       CASE 3
  3525.         DEC myself_position_x&
  3526.       CASE 4
  3527.         INC myself_position_x&
  3528.       ENDSELECT
  3529.       snd_relocate
  3530.       release_pad
  3531.       test_stairs
  3532.       get_maze_environment
  3533.       draw_view(TRUE)
  3534.     ENDIF
  3535.   CASE 2
  3536.     DEC myself_position_n&
  3537.     myself_direction&=1
  3538.     release_pad
  3539.     get_maze_environment
  3540.     snd_stop
  3541.     draw_view(TRUE)
  3542.   CASE 3
  3543.     DEC myself_position_n&
  3544.     myself_direction&=2
  3545.     release_pad
  3546.     get_maze_environment
  3547.     snd_stop
  3548.     draw_view(TRUE)
  3549.   CASE 4
  3550.     DEC myself_position_n&
  3551.     myself_direction&=3
  3552.     release_pad
  3553.     get_maze_environment
  3554.     snd_stop
  3555.     draw_view(TRUE)
  3556.   CASE 5
  3557.     DEC myself_position_n&
  3558.     myself_direction&=4
  3559.     release_pad
  3560.     get_maze_environment
  3561.     snd_stop
  3562.     draw_view(TRUE)
  3563.   CASE 6
  3564.     INC myself_position_n&
  3565.     myself_direction&=1
  3566.     release_pad
  3567.     get_maze_environment
  3568.     snd_stop
  3569.     draw_view(TRUE)
  3570.   CASE 7
  3571.     INC myself_position_n&
  3572.     myself_direction&=2
  3573.     release_pad
  3574.     get_maze_environment
  3575.     snd_stop
  3576.     draw_view(TRUE)
  3577.   CASE 8
  3578.     INC myself_position_n&
  3579.     myself_direction&=3
  3580.     release_pad
  3581.     get_maze_environment
  3582.     snd_stop
  3583.     draw_view(TRUE)
  3584.   CASE 9
  3585.     INC myself_position_n&
  3586.     myself_direction&=4
  3587.     release_pad
  3588.     get_maze_environment
  3589.     snd_stop
  3590.     draw_view(TRUE)
  3591.   ENDSELECT
  3592. RETURN
  3593. > PROCEDURE act_go_right
  3594.   '
  3595.   move_is_blocked!=FALSE
  3596.   move_is_teleportation!=FALSE
  3597.   '
  3598.   IF maze_env_r0&=1 ! against wall
  3599.     move_is_blocked!=TRUE
  3600.   ELSE IF maze_env_r0&=0
  3601.     SELECT myself_direction&
  3602.     CASE 1
  3603.       fitem_beside_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  3604.     CASE 2
  3605.       fitem_beside_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  3606.     CASE 3
  3607.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  3608.     CASE 4
  3609.       fitem_beside_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  3610.     ENDSELECT
  3611.     '
  3612.     IF fitem_beside_ptr%>0
  3613.       get_tile_item(fitem_beside_ptr%,dummy%,dummy&,litem_beside_type|,litem_beside_family|,litem_beside_id|)
  3614.       IF litem_beside_type|=0
  3615.         IF litem_beside_family|=3
  3616.           IF litem_beside_id|=0 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)=0
  3617.             move_is_blocked!=TRUE
  3618.           ELSE IF litem_beside_id|=10 ! can pass through broken door
  3619.           ELSE IF litem_beside_id|>2 AND @get_byte(fitem_beside_ptr%,offset_door_open_state&)<3
  3620.             move_is_blocked!=TRUE
  3621.           ENDIF
  3622.         ELSE IF litem_beside_family|=4
  3623.           '
  3624.           IF BTST(@get_byte(fitem_beside_ptr%,offset_item_active&),0) ! active ?
  3625.             IF BTST(@get_byte(fitem_beside_ptr%,offset_teleporter_scope&),2) ! scope for party ?
  3626.               IF @get_int(fitem_beside_ptr%,offset_target_n&)>-2 AND @get_int(fitem_beside_ptr%,offset_target_x&)>0 AND @get_int(fitem_beside_ptr%,offset_target_y&)>0 ! existing location
  3627.                 move_is_teleportation!=TRUE
  3628.               ENDIF
  3629.             ENDIF
  3630.           ENDIF
  3631.           '
  3632.         ENDIF
  3633.       ENDIF
  3634.     ENDIF
  3635.   ENDIF
  3636.   '
  3637.   IF move_is_teleportation!
  3638.     teleport_party(fitem_beside_ptr%)
  3639.   ELSE IF move_is_blocked!
  3640.     SELECT myself_direction&
  3641.     CASE 1
  3642.       snd_play(1,FALSE,SUCC(myself_position_x&),myself_position_y&)
  3643.     CASE 2
  3644.       snd_play(1,FALSE,PRED(myself_position_x&),myself_position_y&)
  3645.     CASE 3
  3646.       snd_play(1,FALSE,myself_position_x&,SUCC(myself_position_y&))
  3647.     CASE 4
  3648.       snd_play(1,FALSE,myself_position_x&,PRED(myself_position_y&))
  3649.     ENDSELECT
  3650.   ELSE
  3651.     SELECT myself_direction&
  3652.     CASE 1
  3653.       INC myself_position_x&
  3654.     CASE 2
  3655.       DEC myself_position_x&
  3656.     CASE 3
  3657.       INC myself_position_y&
  3658.     CASE 4
  3659.       DEC myself_position_y&
  3660.     ENDSELECT
  3661.     snd_relocate
  3662.     release_pad
  3663.     test_stairs
  3664.     get_maze_environment
  3665.     draw_view(TRUE)
  3666.   ENDIF
  3667. RETURN
  3668. '
  3669. > PROCEDURE gere_cursor
  3670.   view_clic_x&=-1
  3671.   view_clic_y&=-1
  3672.   '
  3673.   clic_win&=WIND_FIND(mo_x&,mo_y&)
  3674.   IF clic_win&=hand_win&(0) AND win!(0) AND NOT icon!
  3675.     ~WIND_GET(hand_win&(0),4,view_x&,view_y&,view_l&,view_h&)
  3676.     IF mo_x&>=view_x& AND mo_x&<ADD(view_x&,view_l&)
  3677.       IF mo_y&>=view_y& AND mo_y&<ADD(view_y&,view_h&)
  3678.         IF NOT mouse_inside_view!
  3679.           mouse_inside_view!=TRUE
  3680.           mouse_hand_point
  3681.         ENDIF
  3682.         view_clic_x&=SUB(mo_x&,view_x&)
  3683.         view_clic_y&=SUB(mo_y&,view_y&)
  3684.         '
  3685.         IF scale_view&>1
  3686.           DIV view_clic_x&,scale_view&
  3687.           DIV view_clic_y&,scale_view&
  3688.         ENDIF
  3689.       ELSE
  3690.         IF mouse_inside_view!
  3691.           mouse_free
  3692.           mouse_inside_view!=FALSE
  3693.         ENDIF
  3694.       ENDIF
  3695.     ELSE
  3696.       IF mouse_inside_view!
  3697.         mouse_free
  3698.         mouse_inside_view!=FALSE
  3699.       ENDIF
  3700.     ENDIF
  3701.   ELSE
  3702.     IF mouse_inside_view!
  3703.       mouse_free
  3704.       mouse_inside_view!=FALSE
  3705.     ENDIF
  3706.   ENDIF
  3707. RETURN
  3708. > PROCEDURE gere_clic_in_sensible_zone
  3709.   LOCAL sz_x1&,sz_y1&,sz_x2&,sz_y2&,located!
  3710.   located!=FALSE
  3711.   '
  3712.   IF @is_sensible_zone(8) ! clic on near floor left
  3713.     '
  3714.   ELSE IF @is_sensible_zone(9) ! clic on near floor right
  3715.     '
  3716.   ELSE IF sensible_zone_hand!
  3717.     IF sensible_zone_hand_id&>0
  3718.       IF @is_sensible_zone(sensible_zone_hand_id&) ! clic by the hand
  3719.         change_with_clic
  3720.       ENDIF
  3721.     ENDIF
  3722.   ELSE IF sensible_zone_space!
  3723.     IF @is_sensible_zone(10) ! clic on distant floor left
  3724.       '
  3725.     ELSE IF @is_sensible_zone(11) ! clic on distant floor right
  3726.       '
  3727.     ELSE IF @is_sensible_zone(12) ! clic in space left
  3728.       '
  3729.     ELSE IF @is_sensible_zone(13) ! clic in space right
  3730.       '
  3731.     ENDIF
  3732.   ENDIF
  3733.   '
  3734. RETURN
  3735. > FUNCTION is_sensible_zone(coords_id&)
  3736.   LOCAL sz_x1&,sz_y1&,sz_x2&,sz_y2&
  3737.   '
  3738.   sz_x1&=coords_x&(coords_id&)
  3739.   sz_y1&=coords_y&(coords_id&)
  3740.   sz_x2&=ADD(coords_x&(coords_id&),PRED(coords_w&(coords_id&)))
  3741.   sz_y2&=ADD(coords_y&(coords_id&),PRED(coords_h&(coords_id&)))
  3742.   '
  3743.   IF view_clic_x&>sz_x1& AND view_clic_x&<sz_x2& AND view_clic_y&>sz_y1& AND view_clic_y&<sz_y2&
  3744.     RETURN TRUE
  3745.   ENDIF
  3746.   RETURN FALSE
  3747. ENDFUNC
  3748. > PROCEDURE change_with_clic
  3749.   LOCAL job_type_for_clic&,litem_job%
  3750.   LOCAL door_open_state|,door_job_type|,litem_enable|,litem_target_ptr%
  3751.   LOCAL switch_state|,switch_behavior|,switch_action|
  3752.   LOCAL litem_target_t|,litem_target_f|,litem_target_i|,target_n&,target_x&,target_y&
  3753.   '
  3754.   SELECT sensible_zone_hand_id&
  3755.   CASE 1 ! door
  3756.     switch_noise
  3757.     '
  3758.     IF @get_byte(sensible_zone_hand_ptr%,offset_item_id&)<>10
  3759.       '
  3760.       door_job_type|=@get_byte(sensible_zone_hand_ptr%,offset_door_job_type&)
  3761.       door_open_state|=@get_byte(sensible_zone_hand_ptr%,offset_door_open_state&)
  3762.       '
  3763.       IF door_job_type|=1 OR door_open_state|>0
  3764.         job_type_for_clic&=job_type_close&
  3765.       ELSE IF door_job_type|=2 OR door_open_state|=0
  3766.         job_type_for_clic&=job_type_open&
  3767.       ENDIF
  3768.       '
  3769.       litem_job%=@search_job(sensible_zone_hand_ptr%)
  3770.       IF litem_job%>0
  3771.         set_job_type(litem_job%,job_type_for_clic&)
  3772.       ELSE
  3773.         SELECT myself_direction&
  3774.         CASE 1
  3775.           ~@new_job(job_type_for_clic&,200,sensible_zone_hand_ptr%,myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  3776.         CASE 2
  3777.           ~@new_job(job_type_for_clic&,200,sensible_zone_hand_ptr%,myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  3778.         CASE 3
  3779.           ~@new_job(job_type_for_clic&,200,sensible_zone_hand_ptr%,myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  3780.         CASE 4
  3781.           ~@new_job(job_type_for_clic&,200,sensible_zone_hand_ptr%,myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  3782.         ENDSELECT
  3783.       ENDIF
  3784.       set_byte(sensible_zone_hand_ptr%,offset_door_job_type&,job_type_for_clic&)
  3785.     ENDIF
  3786.     '
  3787.   CASE 2,3,4,5,6,7,14 ! switches
  3788.     '
  3789.     IF sensible_zone_hand_ptr%>0
  3790.       IF @get_byte(sensible_zone_hand_ptr%,offset_item_active&)>0
  3791.         '
  3792.         switch_state|=@get_byte(sensible_zone_hand_ptr%,offset_switch_state&)
  3793.         switch_behavior|=@get_byte(sensible_zone_hand_ptr%,offset_switch_behavior&)
  3794.         switch_action|=@get_byte(sensible_zone_hand_ptr%,offset_switch_action_type&)
  3795.         '
  3796.         target_n&=MIN(MAX(0,SUCC(@get_int(sensible_zone_hand_ptr%,offset_target_n&))),PRED(maze_nb_level&))
  3797.         target_x&=MIN(MAX(0,@get_int(sensible_zone_hand_ptr%,offset_target_x&)),PRED(maze_width&))
  3798.         target_y&=MIN(MAX(0,@get_int(sensible_zone_hand_ptr%,offset_target_y&)),PRED(maze_height&))
  3799.         '
  3800.         litem_target_ptr%=@get_fitem(target_n&,target_x&,target_y&)
  3801.         IF litem_target_ptr%>0
  3802.           litem_job%=@search_job(litem_target_ptr%)
  3803.           litem_target_f|=@get_byte(litem_target_ptr%,offset_item_family&)
  3804.           litem_enable|=@get_byte(litem_target_ptr%,offset_item_active&)
  3805.           IF litem_target_f|=3
  3806.             door_job_type|=@get_byte(litem_target_ptr%,offset_door_job_type&)
  3807.             door_open_state|=@get_byte(litem_target_ptr%,offset_door_open_state&)
  3808.           ENDIF
  3809.         ELSE
  3810.           litem_job%=0
  3811.         ENDIF
  3812.         '
  3813.         IF switch_state|=0 ! to be activated
  3814.           switch_noise
  3815.           set_byte(sensible_zone_hand_ptr%,offset_switch_state&,1)
  3816.           redraw_for_animation!=TRUE
  3817.           '
  3818.           IF litem_target_ptr%>0
  3819.             SELECT switch_action|
  3820.             CASE 0 ! open
  3821.               IF litem_target_f|=3
  3822.                 job_type_for_clic&=job_type_open&
  3823.               ELSE IF litem_target_f|=4
  3824.                 job_type_for_clic&=job_type_enable&
  3825.               ENDIF
  3826.             CASE 1 ! close
  3827.               IF litem_target_f|=3
  3828.                 job_type_for_clic&=job_type_close&
  3829.               ELSE IF litem_target_f|=4
  3830.                 job_type_for_clic&=job_type_disable&
  3831.               ENDIF
  3832.             CASE 2 !toggle
  3833.               IF litem_target_f|=3
  3834.                 IF door_job_type|=1 OR door_open_state|>0
  3835.                   job_type_for_clic&=job_type_close&
  3836.                 ELSE IF door_job_type|=2 OR door_open_state|=0
  3837.                   job_type_for_clic&=job_type_open&
  3838.                 ENDIF
  3839.               ELSE IF litem_target_f|=4
  3840.                 IF litem_enable|=0
  3841.                   job_type_for_clic&=job_type_enable&
  3842.                 ELSE
  3843.                   job_type_for_clic&=job_type_disable&
  3844.                 ENDIF
  3845.               ENDIF
  3846.             ENDSELECT
  3847.             IF litem_job%>0
  3848.               set_job_type(litem_job%,job_type_for_clic&)
  3849.             ELSE
  3850.               ~@new_job(job_type_for_clic&,200,litem_target_ptr%,target_n&,target_x&,target_y&)
  3851.             ENDIF
  3852.             IF litem_target_f|=3
  3853.               set_byte(litem_target_ptr%,offset_door_job_type&,job_type_for_clic&)
  3854.             ENDIF
  3855.           ENDIF
  3856.           '
  3857.         ELSE IF switch_behavior|=0 ! can be toggled
  3858.           switch_noise
  3859.           set_byte(sensible_zone_hand_ptr%,offset_switch_state&,0)
  3860.           redraw_for_animation!=TRUE
  3861.           '
  3862.           IF litem_target_ptr%>0
  3863.             SELECT switch_action|
  3864.             CASE 0 ! cancel open
  3865.               IF litem_target_f|=3
  3866.                 job_type_for_clic&=job_type_close&
  3867.               ELSE IF litem_target_f|=4
  3868.                 job_type_for_clic&=job_type_disable&
  3869.               ENDIF
  3870.             CASE 1 ! cancel close
  3871.               IF litem_target_f|=3
  3872.                 job_type_for_clic&=job_type_open&
  3873.               ELSE IF litem_target_f|=4
  3874.                 job_type_for_clic&=job_type_enable&
  3875.               ENDIF
  3876.             CASE 2 ! toggle
  3877.               IF litem_target_f|=3
  3878.                 IF door_job_type|=1 OR door_open_state|>0
  3879.                   job_type_for_clic&=job_type_close&
  3880.                 ELSE IF door_job_type|=2 OR door_open_state|=0
  3881.                   job_type_for_clic&=job_type_open&
  3882.                 ENDIF
  3883.               ELSE IF litem_target_f|=4
  3884.                 IF litem_enable|=0
  3885.                   job_type_for_clic&=job_type_enable&
  3886.                 ELSE
  3887.                   job_type_for_clic&=job_type_disable&
  3888.                 ENDIF
  3889.               ENDIF
  3890.             ENDSELECT
  3891.             IF litem_job%>0
  3892.               set_job_type(litem_job%,job_type_for_clic&)
  3893.             ELSE
  3894.               ~@new_job(job_type_for_clic&,200,litem_target_ptr%,target_n&,target_x&,target_y&)
  3895.             ENDIF
  3896.             IF litem_target_f|=3
  3897.               set_byte(litem_target_ptr%,offset_door_job_type&,job_type_for_clic&)
  3898.             ENDIF
  3899.           ENDIF
  3900.           '
  3901.         ENDIF
  3902.       ENDIF
  3903.     ENDIF
  3904.   ENDSELECT
  3905.   '
  3906. RETURN
  3907. > PROCEDURE switch_noise
  3908.   SELECT myself_direction&
  3909.   CASE 1
  3910.     snd_play(5,FALSE,myself_position_x&,PRED(myself_position_y&))
  3911.   CASE 2
  3912.     snd_play(5,FALSE,myself_position_x&,SUCC(myself_position_y&))
  3913.   CASE 3
  3914.     snd_play(5,FALSE,SUCC(myself_position_x&),myself_position_y&)
  3915.   CASE 4
  3916.     snd_play(5,FALSE,PRED(myself_position_x&),myself_position_y&)
  3917.   ENDSELECT
  3918. RETURN
  3919. '
  3920. > PROCEDURE gere_lifetime
  3921.   '
  3922.   test_fall_into_pit
  3923.   test_upon_pad
  3924.   test_end
  3925.   execute_jobs
  3926.   '
  3927.   IF redraw_for_animation!
  3928.     draw_view(FALSE)
  3929.   ENDIF
  3930.   '
  3931. RETURN
  3932. '
  3933. > PROCEDURE test_stairs
  3934.   '
  3935.   SELECT @get_maze_design(myself_position_n&,myself_position_x&,myself_position_y&)
  3936.   CASE 2
  3937.     DEC myself_position_n&
  3938.     myself_direction&=1
  3939.     snd_stop
  3940.   CASE 3
  3941.     DEC myself_position_n&
  3942.     myself_direction&=2
  3943.     snd_stop
  3944.   CASE 4
  3945.     DEC myself_position_n&
  3946.     myself_direction&=3
  3947.     snd_stop
  3948.   CASE 5
  3949.     DEC myself_position_n&
  3950.     myself_direction&=4
  3951.     snd_stop
  3952.   CASE 6
  3953.     INC myself_position_n&
  3954.     myself_direction&=1
  3955.     snd_stop
  3956.   CASE 7
  3957.     INC myself_position_n&
  3958.     myself_direction&=2
  3959.     snd_stop
  3960.   CASE 8
  3961.     INC myself_position_n&
  3962.     myself_direction&=3
  3963.     snd_stop
  3964.   CASE 9
  3965.     INC myself_position_n&
  3966.     myself_direction&=4
  3967.     snd_stop
  3968.   ENDSELECT
  3969.   '
  3970. RETURN
  3971. > PROCEDURE test_fall_into_pit
  3972.   '
  3973.   fall_into_pit!=FALSE
  3974.   '
  3975.   IF maze_env_f0&=10 OR maze_env_f0&=12
  3976.     fall_into_pit!=TRUE
  3977.   ELSE IF maze_env_f0&=0
  3978.     fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  3979.     IF fitem_f0_ptr%>0
  3980.       get_tile_item(fitem_f0_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  3981.       IF litem_work_type|=0 AND litem_work_family|=3 AND (litem_work_id|=1 OR litem_work_id|=2)
  3982.         IF @get_byte(fitem_f0_ptr%,offset_door_open_state&)>0
  3983.           fall_into_pit!=TRUE
  3984.         ENDIF
  3985.       ENDIF
  3986.     ENDIF
  3987.   ENDIF
  3988.   '
  3989.   IF fall_into_pit!
  3990.     snd_play(2,FALSE,myself_position_x&,myself_position_y&)
  3991.     FOR i&=0 TO 15
  3992.       delai
  3993.     NEXT i&
  3994.     INC myself_position_n&
  3995.     myself_position_n&=MIN(myself_position_n&,PRED(maze_nb_level&))
  3996.     get_maze_environment
  3997.     draw_view(TRUE)
  3998.     snd_stop
  3999.     snd_play(1,FALSE,myself_position_x&,myself_position_y&)
  4000.   ENDIF
  4001.   '
  4002. RETURN
  4003. > PROCEDURE test_upon_pad
  4004.   LOCAL job_type_for_clic&,litem_job%,pad_action|
  4005.   LOCAL door_open_state|,door_job_type|,litem_enable|,litem_target_ptr%
  4006.   LOCAL litem_target_t|,litem_target_f|,litem_target_i|,target_n&,target_x&,target_y&
  4007.   '
  4008.   IF old_pad_position_n&<>myself_position_n& OR old_pad_position_x&<>myself_position_x& OR old_pad_position_y&<>myself_position_y&
  4009.     IF maze_env_f0&=0
  4010.       fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  4011.       IF fitem_f0_ptr%>0
  4012.         get_tile_item(fitem_f0_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4013.         IF litem_work_type|=0 AND litem_work_family|=2
  4014.           IF @get_byte(fitem_f0_ptr%,offset_item_active&)>0
  4015.             '
  4016.             old_pad_position_n&=myself_position_n&
  4017.             old_pad_position_x&=myself_position_x&
  4018.             old_pad_position_y&=myself_position_y&
  4019.             '
  4020.             IF BTST(@get_byte(fitem_f0_ptr%,offset_pad_scope&),2) ! party
  4021.               '
  4022.               IF @get_byte(fitem_f0_ptr%,offset_pad_behavior&)>0
  4023.                 snd_play(5,FALSE,myself_position_x&,myself_position_y&)
  4024.               ENDIF
  4025.               '
  4026.               pad_action|=@get_byte(fitem_f0_ptr%,offset_pad_action_type&)
  4027.               '
  4028.               target_n&=MIN(MAX(0,SUCC(@get_int(fitem_f0_ptr%,offset_target_n&))),PRED(maze_nb_level&))
  4029.               target_x&=MIN(MAX(0,@get_int(fitem_f0_ptr%,offset_target_x&)),PRED(maze_width&))
  4030.               target_y&=MIN(MAX(0,@get_int(fitem_f0_ptr%,offset_target_y&)),PRED(maze_height&))
  4031.               '
  4032.               litem_target_ptr%=@get_fitem(target_n&,target_x&,target_y&)
  4033.               IF litem_target_ptr%>0
  4034.                 litem_job%=@search_job(litem_target_ptr%)
  4035.                 litem_target_f|=@get_byte(litem_target_ptr%,offset_item_family&)
  4036.                 litem_enable|=@get_byte(litem_target_ptr%,offset_item_active&)
  4037.                 IF litem_target_f|=3
  4038.                   door_job_type|=@get_byte(litem_target_ptr%,offset_door_job_type&)
  4039.                   door_open_state|=@get_byte(litem_target_ptr%,offset_door_open_state&)
  4040.                 ENDIF
  4041.               ELSE
  4042.                 litem_job%=0
  4043.               ENDIF
  4044.               '
  4045.               IF litem_target_ptr%>0
  4046.                 SELECT pad_action|
  4047.                 CASE 0 ! open
  4048.                   IF litem_target_f|=3
  4049.                     job_type_for_clic&=job_type_open&
  4050.                   ELSE IF litem_target_f|=4
  4051.                     job_type_for_clic&=job_type_enable&
  4052.                   ENDIF
  4053.                 CASE 1 ! close
  4054.                   IF litem_target_f|=3
  4055.                     job_type_for_clic&=job_type_close&
  4056.                   ELSE IF litem_target_f|=4
  4057.                     job_type_for_clic&=job_type_disable&
  4058.                   ENDIF
  4059.                 CASE 2 !toggle
  4060.                   IF litem_target_f|=3
  4061.                     IF door_job_type|=1 OR door_open_state|>0
  4062.                       job_type_for_clic&=job_type_close&
  4063.                     ELSE IF door_job_type|=2 OR door_open_state|=0
  4064.                       job_type_for_clic&=job_type_open&
  4065.                     ENDIF
  4066.                   ELSE IF litem_target_f|=4
  4067.                     IF litem_enable|=0
  4068.                       job_type_for_clic&=job_type_enable&
  4069.                     ELSE
  4070.                       job_type_for_clic&=job_type_disable&
  4071.                     ENDIF
  4072.                   ENDIF
  4073.                 CASE 3 ! open/enable with weight
  4074.                 CASE 4 ! close/disable with weight
  4075.                 ENDSELECT
  4076.                 IF litem_job%>0
  4077.                   set_job_type(litem_job%,job_type_for_clic&)
  4078.                 ELSE
  4079.                   ~@new_job(job_type_for_clic&,200,litem_target_ptr%,target_n&,target_x&,target_y&)
  4080.                 ENDIF
  4081.                 IF litem_target_f|=3
  4082.                   set_byte(litem_target_ptr%,offset_door_job_type&,job_type_for_clic&)
  4083.                 ENDIF
  4084.               ENDIF
  4085.               '
  4086.             ENDIF
  4087.           ENDIF
  4088.         ENDIF
  4089.       ENDIF
  4090.     ENDIF
  4091.   ENDIF
  4092.   '
  4093. RETURN
  4094. > PROCEDURE release_pad
  4095.   old_pad_position_n&=0
  4096.   old_pad_position_x&=0
  4097.   old_pad_position_y&=0
  4098. RETURN
  4099. > PROCEDURE teleport_party(fitem_tmp_ptr%)
  4100.   '
  4101.   release_pad
  4102.   '
  4103.   myself_position_n&=MIN(MAX(0,SUCC(@get_int(fitem_tmp_ptr%,offset_target_n&))),PRED(maze_nb_level&))
  4104.   myself_position_x&=MIN(MAX(0,@get_int(fitem_tmp_ptr%,offset_target_x&)),PRED(maze_width&))
  4105.   myself_position_y&=MIN(MAX(0,@get_int(fitem_tmp_ptr%,offset_target_y&)),PRED(maze_height&))
  4106.   myself_direction&=rotation_result&(myself_direction&,MIN(MAX(0,@get_byte(fitem_tmp_ptr%,offset_teleporter_rotation&)),3))
  4107.   '
  4108.   IF @get_byte(fitem_tmp_ptr%,offset_teleporter_behavior&)>0
  4109.     snd_play(4,FALSE,myself_position_x&,myself_position_y&)
  4110.   ENDIF
  4111.   '
  4112.   get_maze_environment
  4113.   draw_view(TRUE)
  4114.   '
  4115. RETURN
  4116. '
  4117. > PROCEDURE test_end
  4118.   IF myself_position_n&=7 AND end!=FALSE
  4119.     IF myself_position_x&=28
  4120.       IF myself_position_y&=16
  4121.         '
  4122.         end!=TRUE
  4123.         '
  4124.         ferme_win(2)
  4125.         test_evnt
  4126.         '
  4127.         ' from 3
  4128.         '
  4129.         move_end
  4130.         draw_end
  4131.         image_put(4,123)
  4132.         image_put(7,122)
  4133.         image_put(4,125)
  4134.         image_put(7,124)
  4135.         image_put(3,130)
  4136.         pause_end
  4137.         test_evnt
  4138.         '
  4139.         ' from 2
  4140.         '
  4141.         move_end
  4142.         draw_end
  4143.         image_put(4,119)
  4144.         image_put(7,118)
  4145.         image_put(4,121)
  4146.         image_put(7,120)
  4147.         image_put(3,131)
  4148.         pause_end
  4149.         test_evnt
  4150.         '
  4151.         ' from 1
  4152.         '
  4153.         move_end
  4154.         draw_end
  4155.         image_put(4,115)
  4156.         image_put(7,114)
  4157.         image_put(4,117)
  4158.         image_put(7,116)
  4159.         image_put(3,132)
  4160.         pause_end
  4161.         test_evnt
  4162.         '
  4163.         ' opening door
  4164.         '
  4165.         snd_play(3,FALSE,28,16)
  4166.         draw_end
  4167.         image_put(4,115)
  4168.         image_put(7,114)
  4169.         image_put(4,117)
  4170.         image_put(7,116)
  4171.         image_put(3,133)
  4172.         image_put(3,138)
  4173.         pause_end
  4174.         test_evnt
  4175.         '
  4176.         snd_play(3,FALSE,28,16)
  4177.         draw_end
  4178.         image_put(4,115)
  4179.         image_put(7,114)
  4180.         image_put(4,117)
  4181.         image_put(7,116)
  4182.         image_put(3,134)
  4183.         image_put(3,139)
  4184.         pause_end
  4185.         test_evnt
  4186.         '
  4187.         snd_play(3,FALSE,28,16)
  4188.         draw_end
  4189.         image_put(4,115)
  4190.         image_put(7,114)
  4191.         image_put(4,117)
  4192.         image_put(7,116)
  4193.         image_put(3,135)
  4194.         image_put(3,140)
  4195.         pause_end
  4196.         test_evnt
  4197.         '
  4198.         snd_play(3,FALSE,28,16)
  4199.         draw_end
  4200.         image_put(4,115)
  4201.         image_put(7,114)
  4202.         image_put(4,117)
  4203.         image_put(7,116)
  4204.         image_put(3,136)
  4205.         image_put(3,141)
  4206.         pause_end
  4207.         test_evnt
  4208.         '
  4209.         snd_play(3,FALSE,28,16)
  4210.         draw_end
  4211.         image_put(4,115)
  4212.         image_put(7,114)
  4213.         image_put(4,117)
  4214.         image_put(7,116)
  4215.         image_put(3,137)
  4216.         image_put(3,142)
  4217.         pause_end
  4218.         test_evnt
  4219.         snd_play(3,FALSE,28,16)
  4220.         '
  4221.         '
  4222.         ' move to outside
  4223.         '
  4224.         move_end
  4225.         draw_end
  4226.         pause_end
  4227.         test_evnt
  4228.         '
  4229.         move_end
  4230.         draw_end
  4231.         image_put(3,143)
  4232.         pause_end
  4233.         test_evnt
  4234.         '
  4235.         move_end
  4236.         draw_end
  4237.         image_put(3,144)
  4238.         pause_end
  4239.         test_evnt
  4240.         '
  4241.         move_end
  4242.         draw_end
  4243.         image_put(3,145)
  4244.         pause_end
  4245.         test_evnt
  4246.         '
  4247.       ENDIF
  4248.     ENDIF
  4249.   ENDIF
  4250. RETURN
  4251. > PROCEDURE move_end
  4252.   IF maze_simulate_move&=11
  4253.     maze_simulate_move&=12
  4254.   ELSE
  4255.     maze_simulate_move&=11
  4256.   ENDIF
  4257. RETURN
  4258. > PROCEDURE draw_end
  4259.   BMOVE LONG{img_mfdb%(maze_simulate_move&)},LONG{offscreen%},dungeon_view_len%
  4260.   '
  4261.   image_put(4,30)
  4262.   image_put(7,29) ! l3
  4263.   image_put(4,28)
  4264.   image_put(7,27) ! r3
  4265.   image_put(4,25)
  4266.   image_put(7,24) ! l2
  4267.   image_put(4,23)
  4268.   image_put(7,22) ! r2
  4269.   image_put(4,20)
  4270.   image_put(7,19) ! l1
  4271.   image_put(4,18)
  4272.   image_put(7,17) ! r1
  4273.   image_put(4,14)
  4274.   image_put(7,13) ! l0
  4275.   image_put(4,16)
  4276.   image_put(7,15) ! r0
  4277.   '
  4278. RETURN
  4279. > PROCEDURE pause_end
  4280.   ~EVNT_TIMER(750)
  4281.   redraw_view
  4282. RETURN
  4283. '
  4284. > PROCEDURE get_maze_environment
  4285.   '
  4286.   '   h l f r s
  4287.   ' 3 * * * * *
  4288.   ' 2   * * *
  4289.   ' 1   * * *
  4290.   ' 0   * x *
  4291.   ' 4     *
  4292.   '
  4293.   SELECT myself_direction&
  4294.   CASE 1
  4295.     maze_env_h3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,2),SUB(myself_position_y&,3))
  4296.     maze_env_l3&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,3))
  4297.     maze_env_f3&=@get_maze_design(myself_position_n&,myself_position_x&,SUB(myself_position_y&,3))
  4298.     maze_env_r3&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,3))
  4299.     maze_env_s3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,2),SUB(myself_position_y&,3))
  4300.     maze_env_l2&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,2))
  4301.     maze_env_f2&=@get_maze_design(myself_position_n&,myself_position_x&,SUB(myself_position_y&,2))
  4302.     maze_env_r2&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,2))
  4303.     maze_env_l1&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4304.     maze_env_f1&=@get_maze_design(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4305.     maze_env_r1&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4306.     maze_env_l0&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4307.     maze_env_f0&=@get_maze_design(myself_position_n&,myself_position_x&,myself_position_y&)
  4308.     maze_env_r0&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4309.     maze_env_f4&=@get_maze_design(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4310.     '
  4311.     witem_l3f_ptr%=@get_witem(2,myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,3))
  4312.     witem_f3l_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,3))
  4313.     witem_f3f_ptr%=@get_witem(2,myself_position_n&,myself_position_x&,SUB(myself_position_y&,3))
  4314.     witem_f3r_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,3))
  4315.     witem_r3f_ptr%=@get_witem(2,myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,3))
  4316.     witem_l2f_ptr%=@get_witem(2,myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,2))
  4317.     witem_f2l_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,2))
  4318.     witem_f2f_ptr%=@get_witem(2,myself_position_n&,myself_position_x&,SUB(myself_position_y&,2))
  4319.     witem_f2r_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,2))
  4320.     witem_r2f_ptr%=@get_witem(2,myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,2))
  4321.     witem_f1l_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4322.     witem_f1f_ptr%=@get_witem(2,myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4323.     witem_f1r_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4324.     '
  4325.     fitem_l3_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,3))
  4326.     fitem_f3_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUB(myself_position_y&,3))
  4327.     fitem_r3_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,3))
  4328.     fitem_l2_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,2))
  4329.     fitem_f2_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUB(myself_position_y&,2))
  4330.     fitem_r2_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,2))
  4331.     fitem_l1_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4332.     fitem_f1_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4333.     fitem_r1_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4334.     fitem_l0_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4335.     fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  4336.     fitem_r0_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4337.     '
  4338.   CASE 2
  4339.     maze_env_h3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,2),ADD(myself_position_y&,3))
  4340.     maze_env_l3&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,3))
  4341.     maze_env_f3&=@get_maze_design(myself_position_n&,myself_position_x&,ADD(myself_position_y&,3))
  4342.     maze_env_r3&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,3))
  4343.     maze_env_s3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,2),ADD(myself_position_y&,3))
  4344.     maze_env_l2&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,2))
  4345.     maze_env_f2&=@get_maze_design(myself_position_n&,myself_position_x&,ADD(myself_position_y&,2))
  4346.     maze_env_r2&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,2))
  4347.     maze_env_l1&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4348.     maze_env_f1&=@get_maze_design(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4349.     maze_env_r1&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4350.     maze_env_l0&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4351.     maze_env_f0&=@get_maze_design(myself_position_n&,myself_position_x&,myself_position_y&)
  4352.     maze_env_r0&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4353.     maze_env_f4&=@get_maze_design(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4354.     '
  4355.     witem_l3f_ptr%=@get_witem(1,myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,3))
  4356.     witem_f3l_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,3))
  4357.     witem_f3f_ptr%=@get_witem(1,myself_position_n&,myself_position_x&,ADD(myself_position_y&,3))
  4358.     witem_f3r_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,3))
  4359.     witem_r3f_ptr%=@get_witem(1,myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,3))
  4360.     witem_l2f_ptr%=@get_witem(1,myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,2))
  4361.     witem_f2l_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,2))
  4362.     witem_f2f_ptr%=@get_witem(1,myself_position_n&,myself_position_x&,ADD(myself_position_y&,2))
  4363.     witem_f2r_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,2))
  4364.     witem_r2f_ptr%=@get_witem(1,myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,2))
  4365.     witem_f1l_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4366.     witem_f1f_ptr%=@get_witem(1,myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4367.     witem_f1r_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4368.     '
  4369.     fitem_l3_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,3))
  4370.     fitem_f3_ptr%=@get_fitem(myself_position_n&,myself_position_x&,ADD(myself_position_y&,3))
  4371.     fitem_r3_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,3))
  4372.     fitem_l2_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,2))
  4373.     fitem_f2_ptr%=@get_fitem(myself_position_n&,myself_position_x&,ADD(myself_position_y&,2))
  4374.     fitem_r2_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,2))
  4375.     fitem_l1_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4376.     fitem_f1_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4377.     fitem_r1_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4378.     fitem_l0_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4379.     fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  4380.     fitem_r0_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4381.     '
  4382.   CASE 3
  4383.     maze_env_h3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,3),SUB(myself_position_y&,2))
  4384.     maze_env_l3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,3),PRED(myself_position_y&))
  4385.     maze_env_f3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,3),myself_position_y&)
  4386.     maze_env_r3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,3),SUCC(myself_position_y&))
  4387.     maze_env_s3&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,3),ADD(myself_position_y&,2))
  4388.     maze_env_l2&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,2),PRED(myself_position_y&))
  4389.     maze_env_f2&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,2),myself_position_y&)
  4390.     maze_env_r2&=@get_maze_design(myself_position_n&,ADD(myself_position_x&,2),SUCC(myself_position_y&))
  4391.     maze_env_l1&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4392.     maze_env_f1&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4393.     maze_env_r1&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4394.     maze_env_l0&=@get_maze_design(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4395.     maze_env_f0&=@get_maze_design(myself_position_n&,myself_position_x&,myself_position_y&)
  4396.     maze_env_r0&=@get_maze_design(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4397.     maze_env_f4&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4398.     '
  4399.     witem_l3f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,3),PRED(myself_position_y&))
  4400.     witem_f3l_ptr%=@get_witem(2,myself_position_n&,ADD(myself_position_x&,3),PRED(myself_position_y&))
  4401.     witem_f3f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,3),myself_position_y&)
  4402.     witem_f3r_ptr%=@get_witem(1,myself_position_n&,ADD(myself_position_x&,3),SUCC(myself_position_y&))
  4403.     witem_r3f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,3),SUCC(myself_position_y&))
  4404.     witem_l2f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,2),PRED(myself_position_y&))
  4405.     witem_f2l_ptr%=@get_witem(2,myself_position_n&,ADD(myself_position_x&,2),PRED(myself_position_y&))
  4406.     witem_f2f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,2),myself_position_y&)
  4407.     witem_f2r_ptr%=@get_witem(1,myself_position_n&,ADD(myself_position_x&,2),SUCC(myself_position_y&))
  4408.     witem_r2f_ptr%=@get_witem(4,myself_position_n&,ADD(myself_position_x&,2),SUCC(myself_position_y&))
  4409.     witem_f1l_ptr%=@get_witem(2,myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4410.     witem_f1f_ptr%=@get_witem(4,myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4411.     witem_f1r_ptr%=@get_witem(1,myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4412.     '
  4413.     fitem_l3_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,3),PRED(myself_position_y&))
  4414.     fitem_f3_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,3),myself_position_y&)
  4415.     fitem_r3_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,3),SUCC(myself_position_y&))
  4416.     fitem_l2_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,2),PRED(myself_position_y&))
  4417.     fitem_f2_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,2),myself_position_y&)
  4418.     fitem_r2_ptr%=@get_fitem(myself_position_n&,ADD(myself_position_x&,2),SUCC(myself_position_y&))
  4419.     fitem_l1_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&))
  4420.     fitem_f1_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4421.     fitem_r1_ptr%=@get_fitem(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&))
  4422.     fitem_l0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4423.     fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  4424.     fitem_r0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4425.     '
  4426.   CASE 4
  4427.     maze_env_h3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,3),ADD(myself_position_y&,2))
  4428.     maze_env_l3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,3),SUCC(myself_position_y&))
  4429.     maze_env_f3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,3),myself_position_y&)
  4430.     maze_env_r3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,3),PRED(myself_position_y&))
  4431.     maze_env_s3&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,3),SUB(myself_position_y&,2))
  4432.     maze_env_l2&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,2),SUCC(myself_position_y&))
  4433.     maze_env_f2&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,2),myself_position_y&)
  4434.     maze_env_r2&=@get_maze_design(myself_position_n&,SUB(myself_position_x&,2),PRED(myself_position_y&))
  4435.     maze_env_l1&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4436.     maze_env_f1&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4437.     maze_env_r1&=@get_maze_design(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4438.     maze_env_l0&=@get_maze_design(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4439.     maze_env_f0&=@get_maze_design(myself_position_n&,myself_position_x&,myself_position_y&)
  4440.     maze_env_r0&=@get_maze_design(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4441.     maze_env_f4&=@get_maze_design(myself_position_n&,SUCC(myself_position_x&),myself_position_y&)
  4442.     '
  4443.     witem_l3f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,3),SUCC(myself_position_y&))
  4444.     witem_f3l_ptr%=@get_witem(1,myself_position_n&,SUB(myself_position_x&,3),SUCC(myself_position_y&))
  4445.     witem_f3f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,3),myself_position_y&)
  4446.     witem_f3r_ptr%=@get_witem(2,myself_position_n&,SUB(myself_position_x&,3),PRED(myself_position_y&))
  4447.     witem_r3f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,3),PRED(myself_position_y&))
  4448.     witem_l2f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,2),SUCC(myself_position_y&))
  4449.     witem_f2l_ptr%=@get_witem(1,myself_position_n&,SUB(myself_position_x&,2),SUCC(myself_position_y&))
  4450.     witem_f2f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,2),myself_position_y&)
  4451.     witem_f2r_ptr%=@get_witem(2,myself_position_n&,SUB(myself_position_x&,2),PRED(myself_position_y&))
  4452.     witem_r2f_ptr%=@get_witem(3,myself_position_n&,SUB(myself_position_x&,2),PRED(myself_position_y&))
  4453.     witem_f1l_ptr%=@get_witem(1,myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4454.     witem_f1f_ptr%=@get_witem(3,myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4455.     witem_f1r_ptr%=@get_witem(2,myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4456.     '
  4457.     fitem_l3_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,3),SUCC(myself_position_y&))
  4458.     fitem_f3_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,3),myself_position_y&)
  4459.     fitem_r3_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,3),PRED(myself_position_y&))
  4460.     fitem_l2_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,2),SUCC(myself_position_y&))
  4461.     fitem_f2_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,2),myself_position_y&)
  4462.     fitem_r2_ptr%=@get_fitem(myself_position_n&,SUB(myself_position_x&,2),PRED(myself_position_y&))
  4463.     fitem_l1_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&))
  4464.     fitem_f1_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),myself_position_y&)
  4465.     fitem_r1_ptr%=@get_fitem(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&))
  4466.     fitem_l0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,SUCC(myself_position_y&))
  4467.     fitem_f0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,myself_position_y&)
  4468.     fitem_r0_ptr%=@get_fitem(myself_position_n&,myself_position_x&,PRED(myself_position_y&))
  4469.     '
  4470.   ENDSELECT
  4471.   '
  4472. RETURN
  4473. > PROCEDURE set_maze_design(pmaze_level&,pmaze_x&,pmaze_y&,pmaze_value|)
  4474.   BYTE{ADD(maze_design_level_adr%(pmaze_level&),ADD(MUL(pmaze_y&,maze_width&),pmaze_x&))}=pmaze_value|
  4475. RETURN
  4476. > FUNCTION get_maze_design(pmaze_level&,pmaze_x&,pmaze_y&)
  4477.   $F&
  4478.   '
  4479.   IF pmaze_x&>-1 AND pmaze_x&<maze_width&
  4480.     IF pmaze_y&>-1 AND pmaze_y&<maze_height&
  4481.       RETURN BYTE{ADD(maze_design_level_adr%(pmaze_level&),ADD(MUL(pmaze_y&,maze_width&),pmaze_x&))}
  4482.     ELSE
  4483.       RETURN 1
  4484.     ENDIF
  4485.   ELSE
  4486.     RETURN 1
  4487.   ENDIF
  4488. ENDFUNC
  4489. > FUNCTION get_witem(pdirection&,pmaze_level&,pmaze_x&,pmaze_y&)
  4490.   $F%
  4491.   LOCAL litem_ptr%
  4492.   '
  4493.   litem_ptr%=@get_tile_containor(pmaze_level&,pmaze_x&,pmaze_y&)
  4494.   IF litem_ptr%>0
  4495.     get_tile_pointers(litem_ptr%,work_n%,work_s%,work_e%,work_w%)
  4496.     SELECT pdirection&
  4497.     CASE 1
  4498.       RETURN work_n%
  4499.     CASE 2
  4500.       RETURN work_s%
  4501.     CASE 3
  4502.       RETURN work_e%
  4503.     CASE 4
  4504.       RETURN work_w%
  4505.     ENDSELECT
  4506.   ENDIF
  4507.   RETURN 0
  4508. ENDFUNC
  4509. > FUNCTION get_fitem(pmaze_level&,pmaze_x&,pmaze_y&)
  4510.   $F%
  4511.   LOCAL litem_ptr%
  4512.   '
  4513.   litem_ptr%=@get_tile_containor(pmaze_level&,pmaze_x&,pmaze_y&)
  4514.   IF litem_ptr%>0
  4515.     get_tile_pointers(litem_ptr%,work_n%,work_s%,work_e%,work_w%)
  4516.     RETURN work_n%
  4517.   ENDIF
  4518.   RETURN 0
  4519. ENDFUNC
  4520. > FUNCTION is_in_maze_environment(pmaze_level&,pmaze_x&,pmaze_y&)
  4521.   $F!
  4522.   '
  4523.   SELECT myself_direction&
  4524.   CASE 1
  4525.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,2),SUB(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4526.       RETURN TRUE
  4527.     ENDIF
  4528.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4529.       RETURN TRUE
  4530.     ENDIF
  4531.     IF @is_coords(myself_position_n&,myself_position_x&,SUB(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4532.       RETURN TRUE
  4533.     ENDIF
  4534.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4535.       RETURN TRUE
  4536.     ENDIF
  4537.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,2),SUB(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4538.       RETURN TRUE
  4539.     ENDIF
  4540.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),SUB(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4541.       RETURN TRUE
  4542.     ENDIF
  4543.     IF @is_coords(myself_position_n&,myself_position_x&,SUB(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4544.       RETURN TRUE
  4545.     ENDIF
  4546.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),SUB(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4547.       RETURN TRUE
  4548.     ENDIF
  4549.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4550.       RETURN TRUE
  4551.     ENDIF
  4552.     IF @is_coords(myself_position_n&,myself_position_x&,PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4553.       RETURN TRUE
  4554.     ENDIF
  4555.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4556.       RETURN TRUE
  4557.     ENDIF
  4558.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4559.       RETURN TRUE
  4560.     ENDIF
  4561.     IF @is_coords(myself_position_n&,myself_position_x&,myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4562.       RETURN TRUE
  4563.     ENDIF
  4564.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4565.       RETURN TRUE
  4566.     ENDIF
  4567.     IF @is_coords(myself_position_n&,myself_position_x&,SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4568.       RETURN TRUE
  4569.     ENDIF
  4570.   CASE 2
  4571.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,2),ADD(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4572.       RETURN TRUE
  4573.     ENDIF
  4574.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4575.       RETURN TRUE
  4576.     ENDIF
  4577.     IF @is_coords(myself_position_n&,myself_position_x&,ADD(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4578.       RETURN TRUE
  4579.     ENDIF
  4580.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4581.       RETURN TRUE
  4582.     ENDIF
  4583.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,2),ADD(myself_position_y&,3),pmaze_level&,pmaze_x&,pmaze_y&)
  4584.       RETURN TRUE
  4585.     ENDIF
  4586.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),ADD(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4587.       RETURN TRUE
  4588.     ENDIF
  4589.     IF @is_coords(myself_position_n&,myself_position_x&,ADD(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4590.       RETURN TRUE
  4591.     ENDIF
  4592.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),ADD(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4593.       RETURN TRUE
  4594.     ENDIF
  4595.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4596.       RETURN TRUE
  4597.     ENDIF
  4598.     IF @is_coords(myself_position_n&,myself_position_x&,SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4599.       RETURN TRUE
  4600.     ENDIF
  4601.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4602.       RETURN TRUE
  4603.     ENDIF
  4604.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4605.       RETURN TRUE
  4606.     ENDIF
  4607.     IF @is_coords(myself_position_n&,myself_position_x&,myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4608.       RETURN TRUE
  4609.     ENDIF
  4610.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4611.       RETURN TRUE
  4612.     ENDIF
  4613.     IF @is_coords(myself_position_n&,myself_position_x&,PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4614.       RETURN TRUE
  4615.     ENDIF
  4616.   CASE 3
  4617.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,3),SUB(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4618.       RETURN TRUE
  4619.     ENDIF
  4620.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,3),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4621.       RETURN TRUE
  4622.     ENDIF
  4623.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,3),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4624.       RETURN TRUE
  4625.     ENDIF
  4626.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,3),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4627.       RETURN TRUE
  4628.     ENDIF
  4629.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,3),ADD(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4630.       RETURN TRUE
  4631.     ENDIF
  4632.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,2),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4633.       RETURN TRUE
  4634.     ENDIF
  4635.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,2),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4636.       RETURN TRUE
  4637.     ENDIF
  4638.     IF @is_coords(myself_position_n&,ADD(myself_position_x&,2),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4639.       RETURN TRUE
  4640.     ENDIF
  4641.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4642.       RETURN TRUE
  4643.     ENDIF
  4644.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4645.       RETURN TRUE
  4646.     ENDIF
  4647.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4648.       RETURN TRUE
  4649.     ENDIF
  4650.     IF @is_coords(myself_position_n&,myself_position_x&,PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4651.       RETURN TRUE
  4652.     ENDIF
  4653.     IF @is_coords(myself_position_n&,myself_position_x&,myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4654.       RETURN TRUE
  4655.     ENDIF
  4656.     IF @is_coords(myself_position_n&,myself_position_x&,SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4657.       RETURN TRUE
  4658.     ENDIF
  4659.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4660.       RETURN TRUE
  4661.     ENDIF
  4662.   CASE 4
  4663.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,3),ADD(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4664.       RETURN TRUE
  4665.     ENDIF
  4666.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,3),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4667.       RETURN TRUE
  4668.     ENDIF
  4669.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,3),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4670.       RETURN TRUE
  4671.     ENDIF
  4672.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,3),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4673.       RETURN TRUE
  4674.     ENDIF
  4675.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,3),SUB(myself_position_y&,2),pmaze_level&,pmaze_x&,pmaze_y&)
  4676.       RETURN TRUE
  4677.     ENDIF
  4678.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,2),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4679.       RETURN TRUE
  4680.     ENDIF
  4681.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,2),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4682.       RETURN TRUE
  4683.     ENDIF
  4684.     IF @is_coords(myself_position_n&,SUB(myself_position_x&,2),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4685.       RETURN TRUE
  4686.     ENDIF
  4687.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4688.       RETURN TRUE
  4689.     ENDIF
  4690.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4691.       RETURN TRUE
  4692.     ENDIF
  4693.     IF @is_coords(myself_position_n&,PRED(myself_position_x&),PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4694.       RETURN TRUE
  4695.     ENDIF
  4696.     IF @is_coords(myself_position_n&,myself_position_x&,SUCC(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4697.       RETURN TRUE
  4698.     ENDIF
  4699.     IF @is_coords(myself_position_n&,myself_position_x&,myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4700.       RETURN TRUE
  4701.     ENDIF
  4702.     IF @is_coords(myself_position_n&,myself_position_x&,PRED(myself_position_y&),pmaze_level&,pmaze_x&,pmaze_y&)
  4703.       RETURN TRUE
  4704.     ENDIF
  4705.     IF @is_coords(myself_position_n&,SUCC(myself_position_x&),myself_position_y&,pmaze_level&,pmaze_x&,pmaze_y&)
  4706.       RETURN TRUE
  4707.     ENDIF
  4708.   ENDSELECT
  4709.   '
  4710.   RETURN FALSE
  4711. ENDFUNC
  4712. > FUNCTION is_coords(ic_l1&,ic_x1&,ic_y1&,ic_l2&,ic_x2&,ic_y2&)
  4713.   $F!
  4714.   '
  4715.   IF ic_l1&=ic_l2& AND ic_x1&=ic_x2& AND ic_y1&=ic_y2&
  4716.     RETURN TRUE
  4717.   ENDIF
  4718.   RETURN FALSE
  4719. ENDFUNC
  4720. '
  4721. > PROCEDURE draw_view(simulate_move!)
  4722.   '
  4723.   redraw_for_animation!=FALSE
  4724.   '
  4725.   IF simulate_move!
  4726.     IF maze_simulate_move&=11
  4727.       maze_simulate_move&=12
  4728.     ELSE
  4729.       maze_simulate_move&=11
  4730.     ENDIF
  4731.   ENDIF
  4732.   BMOVE LONG{img_mfdb%(maze_simulate_move&)},LONG{offscreen%},dungeon_view_len%
  4733.   '
  4734.   draw_view_h3
  4735.   draw_view_l3
  4736.   draw_view_s3
  4737.   draw_view_r3
  4738.   draw_view_f3
  4739.   draw_view_l2
  4740.   draw_view_r2
  4741.   draw_view_f2
  4742.   draw_view_l1
  4743.   draw_view_r1
  4744.   draw_view_f1
  4745.   draw_view_l0
  4746.   draw_view_r0
  4747.   draw_view_f0
  4748.   '
  4749.   redraw_view
  4750.   '
  4751. RETURN
  4752. > PROCEDURE draw_view_h3
  4753.   '
  4754.   SELECT BYTE(maze_env_h3&)
  4755.   CASE 1,11
  4756.     image_put(4,33)
  4757.     image_put(7,32)
  4758.   ENDSELECT
  4759.   '
  4760. RETURN
  4761. > PROCEDURE draw_view_s3
  4762.   '
  4763.   SELECT BYTE(maze_env_s3&)
  4764.   CASE 1,11
  4765.     image_put(4,35)
  4766.     image_put(7,34)
  4767.   ENDSELECT
  4768.   '
  4769. RETURN
  4770. > PROCEDURE draw_view_l3
  4771.   '
  4772.   SELECT BYTE(maze_env_l3&)
  4773.   CASE 0
  4774.     IF fitem_l3_ptr%>0
  4775.       get_tile_item(fitem_l3_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4776.       IF litem_work_type|=0 AND litem_work_family|>0
  4777.         IF litem_work_family|=3
  4778.           SELECT litem_work_id|
  4779.           CASE 0
  4780.             IF @get_byte(fitem_l3_ptr%,offset_door_open_state&)=0
  4781.               image_put(4,30)
  4782.               IF maze_simulate_move&=11
  4783.                 image_put(7,29)
  4784.               ELSE
  4785.                 image_put(7,170)
  4786.               ENDIF
  4787.             ENDIF
  4788.           CASE 1
  4789.             IF @get_byte(fitem_l3_ptr%,offset_door_open_state&)>0
  4790.               image_put(4,111)
  4791.               image_put(7,110)
  4792.             ENDIF
  4793.           CASE 2
  4794.             IF @get_byte(fitem_l3_ptr%,offset_door_open_state&)>0
  4795.             ENDIF
  4796.           DEFAULT
  4797.             image_put(4,129)! door left frame
  4798.             image_put(7,128)
  4799.             image_put_door(fitem_l3_ptr%,10)
  4800.             image_put(3,916)
  4801.           ENDSELECT
  4802.         ELSE
  4803.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  4804.             IF @get_byte(fitem_l3_ptr%,offset_item_active&)>0
  4805.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  4806.               redraw_for_animation!=TRUE
  4807.             ELSE
  4808.               litem_work_id|=10 ! do not draw
  4809.             ENDIF
  4810.           ENDIF
  4811.           DEC litem_work_family|
  4812.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,10,1))
  4813.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,10,0))
  4814.         ENDIF
  4815.       ENDIF
  4816.     ENDIF
  4817.     '
  4818.   CASE 1
  4819.     image_put(4,30)
  4820.     IF maze_simulate_move&=11
  4821.       image_put(7,29)
  4822.     ELSE
  4823.       image_put(7,170)
  4824.     ENDIF
  4825.     '
  4826.     IF witem_l3f_ptr%>0
  4827.       get_tile_item(witem_l3f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4828.       IF litem_work_type|=1 AND litem_work_family|>0
  4829.         IF litem_work_family|=3
  4830.           image_put_wall_inscription(witem_l3f_ptr%,11)
  4831.         ELSE
  4832.           IF litem_work_family|=4 ! wall switch
  4833.             IF @get_byte(witem_l3f_ptr%,offset_switch_state&)>0
  4834.               ADD litem_work_id|,32 ! activated sprite
  4835.             ENDIF
  4836.           ENDIF
  4837.           DEC litem_work_family|
  4838.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,11,1)=0
  4839.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,11,0))
  4840.           ELSE
  4841.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,11,1))
  4842.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,11,0))
  4843.           ENDIF
  4844.         ENDIF
  4845.       ENDIF
  4846.     ENDIF
  4847.     IF witem_f3l_ptr%>0
  4848.       get_tile_item(witem_f3l_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4849.       IF litem_work_type|=1 AND litem_work_family|>0
  4850.         IF litem_work_family|=3
  4851.           image_put_wall_inscription(witem_f3l_ptr%,9)
  4852.         ELSE
  4853.           IF litem_work_family|=4 ! wall switch
  4854.             IF @get_byte(witem_f3l_ptr%,offset_switch_state&)>0
  4855.               ADD litem_work_id|,32 ! activated sprite
  4856.             ENDIF
  4857.           ENDIF
  4858.           DEC litem_work_family|
  4859.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,9,1)=0
  4860.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,9,0))
  4861.           ELSE
  4862.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,9,1))
  4863.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,9,0))
  4864.           ENDIF
  4865.         ENDIF
  4866.       ENDIF
  4867.     ENDIF
  4868.     '
  4869.   CASE 11
  4870.     image_put(4,30)
  4871.     IF maze_simulate_move&=11
  4872.       image_put(7,29)
  4873.     ELSE
  4874.       image_put(7,170)
  4875.     ENDIF
  4876.   CASE 10
  4877.     image_put(4,111)
  4878.     image_put(7,110)
  4879.   CASE 12
  4880.   CASE 2 ! up north
  4881.     IF myself_direction&=1
  4882.       image_put(3,43)
  4883.     ENDIF
  4884.   CASE 3 ! up south
  4885.     IF myself_direction&=2
  4886.       image_put(3,43)
  4887.     ENDIF
  4888.   CASE 4 ! up east
  4889.     IF myself_direction&=3
  4890.       image_put(3,43)
  4891.     ENDIF
  4892.   CASE 5 ! up west
  4893.     IF myself_direction&=4
  4894.       image_put(3,43)
  4895.     ENDIF
  4896.   CASE 6 ! down north
  4897.     IF myself_direction&=1
  4898.       image_put(3,58)
  4899.     ENDIF
  4900.   CASE 7 ! down south
  4901.     IF myself_direction&=2
  4902.       image_put(3,58)
  4903.     ENDIF
  4904.   CASE 8 ! down east
  4905.     IF myself_direction&=3
  4906.       image_put(3,58)
  4907.     ENDIF
  4908.   CASE 9 ! down west
  4909.     IF myself_direction&=4
  4910.       image_put(3,58)
  4911.     ENDIF
  4912.   ENDSELECT
  4913.   '
  4914. RETURN
  4915. > PROCEDURE draw_view_r3
  4916.   '
  4917.   SELECT BYTE(maze_env_r3&)
  4918.   CASE 0
  4919.     IF fitem_r3_ptr%>0
  4920.       get_tile_item(fitem_r3_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4921.       IF litem_work_type|=0 AND litem_work_family|>0
  4922.         IF litem_work_family|=3
  4923.           SELECT litem_work_id|
  4924.           CASE 0
  4925.             IF @get_byte(fitem_r3_ptr%,offset_door_open_state&)=0
  4926.               image_put(4,28)
  4927.               IF maze_simulate_move&=11
  4928.                 image_put(7,27)
  4929.               ELSE
  4930.                 image_put(7,174)
  4931.               ENDIF
  4932.             ENDIF
  4933.           CASE 1
  4934.             IF @get_byte(fitem_r3_ptr%,offset_door_open_state&)>0
  4935.               image_put(4,113)
  4936.               image_put(7,112)
  4937.             ENDIF
  4938.           CASE 2
  4939.             IF @get_byte(fitem_r3_ptr%,offset_door_open_state&)>0
  4940.             ENDIF
  4941.           DEFAULT
  4942.             image_put(4,127) ! door right frame
  4943.             image_put(7,126)
  4944.             IF @get_byte(fitem_r3_ptr%,offset_door_opened_by&)=1
  4945.               image_put(3,655)
  4946.             ENDIF
  4947.             image_put_door(fitem_r3_ptr%,11)
  4948.             image_put(3,917)
  4949.           ENDSELECT
  4950.         ELSE
  4951.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  4952.             IF @get_byte(fitem_r3_ptr%,offset_item_active&)>0
  4953.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  4954.               redraw_for_animation!=TRUE
  4955.             ELSE
  4956.               litem_work_id|=10 ! do not draw
  4957.             ENDIF
  4958.           ENDIF
  4959.           DEC litem_work_family|
  4960.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,11,1))
  4961.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,11,0))
  4962.         ENDIF
  4963.       ENDIF
  4964.     ENDIF
  4965.     '
  4966.   CASE 1 ! wall
  4967.     image_put(4,28)
  4968.     IF maze_simulate_move&=11
  4969.       image_put(7,27)
  4970.     ELSE
  4971.       image_put(7,174)
  4972.     ENDIF
  4973.     '
  4974.     IF witem_r3f_ptr%>0
  4975.       get_tile_item(witem_r3f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4976.       IF litem_work_type|=1 AND litem_work_family|>0
  4977.         IF litem_work_family|=3
  4978.           image_put_wall_inscription(witem_r3f_ptr%,12)
  4979.         ELSE
  4980.           IF litem_work_family|=4 ! wall switch
  4981.             IF @get_byte(witem_r3f_ptr%,offset_switch_state&)>0
  4982.               ADD litem_work_id|,32 ! activated sprite
  4983.             ENDIF
  4984.           ENDIF
  4985.           DEC litem_work_family|
  4986.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,12,1)=0
  4987.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,12,0))
  4988.           ELSE
  4989.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,12,1))
  4990.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,12,0))
  4991.           ENDIF
  4992.         ENDIF
  4993.       ENDIF
  4994.     ENDIF
  4995.     IF witem_f3r_ptr%>0
  4996.       get_tile_item(witem_f3r_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  4997.       IF litem_work_type|=1 AND litem_work_family|>0
  4998.         IF litem_work_family|=3
  4999.           image_put_wall_inscription(witem_f3r_ptr%,10)
  5000.         ELSE
  5001.           IF litem_work_family|=4 ! wall switch
  5002.             IF @get_byte(witem_f3r_ptr%,offset_switch_state&)>0
  5003.               ADD litem_work_id|,32 ! activated sprite
  5004.             ENDIF
  5005.           ENDIF
  5006.           DEC litem_work_family|
  5007.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,10,1)=0
  5008.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,10,0))
  5009.           ELSE
  5010.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,10,1))
  5011.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,10,0))
  5012.           ENDIF
  5013.         ENDIF
  5014.       ENDIF
  5015.     ENDIF
  5016.     '
  5017.   CASE 11 ! imaginary wall
  5018.     image_put(4,28)
  5019.     IF maze_simulate_move&=11
  5020.       image_put(7,27)
  5021.     ELSE
  5022.       image_put(7,174)
  5023.     ENDIF
  5024.   CASE 10
  5025.     image_put(4,113)
  5026.     image_put(7,112)
  5027.   CASE 12
  5028.   CASE 2 ! up north
  5029.     IF myself_direction&=1
  5030.       image_put(3,44)
  5031.     ENDIF
  5032.   CASE 3 ! up south
  5033.     IF myself_direction&=2
  5034.       image_put(3,44)
  5035.     ENDIF
  5036.   CASE 4 ! up east
  5037.     IF myself_direction&=3
  5038.       image_put(3,44)
  5039.     ENDIF
  5040.   CASE 5 ! up west
  5041.     IF myself_direction&=4
  5042.       image_put(3,44)
  5043.     ENDIF
  5044.   CASE 6 ! down north
  5045.     IF myself_direction&=1
  5046.       image_put(3,59)
  5047.     ENDIF
  5048.   CASE 7 ! down south
  5049.     IF myself_direction&=2
  5050.       image_put(3,59)
  5051.     ENDIF
  5052.   CASE 8 ! down east
  5053.     IF myself_direction&=3
  5054.       image_put(3,59)
  5055.     ENDIF
  5056.   CASE 9 ! down west
  5057.     IF myself_direction&=4
  5058.       image_put(3,59)
  5059.     ENDIF
  5060.   ENDSELECT
  5061.   '
  5062. RETURN
  5063. > PROCEDURE draw_view_f3
  5064.   '
  5065.   SELECT BYTE(maze_env_f3&)
  5066.   CASE 0
  5067.     IF fitem_f3_ptr%>0
  5068.       get_tile_item(fitem_f3_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5069.       IF litem_work_type|=0 AND litem_work_family|>0
  5070.         IF litem_work_family|=3
  5071.           SELECT litem_work_id|
  5072.           CASE 0
  5073.             IF @get_byte(fitem_f3_ptr%,offset_door_open_state&)=0
  5074.               IF maze_simulate_move&=11
  5075.                 image_put(3,31)
  5076.               ELSE
  5077.                 image_put(3,166)
  5078.               ENDIF
  5079.             ENDIF
  5080.           CASE 1
  5081.             IF @get_byte(fitem_f3_ptr%,offset_door_open_state&)>0
  5082.               image_put(4,93)
  5083.               image_put(7,92)
  5084.             ENDIF
  5085.           CASE 2
  5086.             IF @get_byte(fitem_f3_ptr%,offset_door_open_state&)>0
  5087.             ENDIF
  5088.           DEFAULT
  5089.             image_put(4,123) ! door left frame
  5090.             image_put(7,122)
  5091.             image_put(4,125) ! door right frame
  5092.             image_put(7,124)
  5093.             image_put(3,658) ! top frame
  5094.             IF @get_byte(fitem_f3_ptr%,offset_door_opened_by&)=1
  5095.               image_put(3,654)
  5096.             ENDIF
  5097.             image_put_door(fitem_f3_ptr%,9)
  5098.           ENDSELECT
  5099.         ELSE
  5100.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5101.             IF @get_byte(fitem_f3_ptr%,offset_item_active&)>0
  5102.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  5103.               redraw_for_animation!=TRUE
  5104.             ELSE
  5105.               litem_work_id|=10 ! do not draw
  5106.             ENDIF
  5107.           ENDIF
  5108.           DEC litem_work_family|
  5109.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,9,1))
  5110.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,9,0))
  5111.         ENDIF
  5112.       ENDIF
  5113.     ENDIF
  5114.     '
  5115.   CASE 1
  5116.     IF maze_simulate_move&=11
  5117.       image_put(3,31)
  5118.     ELSE
  5119.       image_put(3,166)
  5120.     ENDIF
  5121.     '
  5122.     IF witem_f3f_ptr%>0
  5123.       get_tile_item(witem_f3f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5124.       IF litem_work_type|=1 AND litem_work_family|>0
  5125.         IF litem_work_family|=3
  5126.           image_put_wall_inscription(witem_f3f_ptr%,8)
  5127.         ELSE
  5128.           IF litem_work_family|=4 ! wall switch
  5129.             IF @get_byte(witem_f3f_ptr%,offset_switch_state&)>0
  5130.               ADD litem_work_id|,32 ! activated sprite
  5131.             ENDIF
  5132.           ENDIF
  5133.           DEC litem_work_family|
  5134.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,8,1)=0
  5135.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,8,0))
  5136.           ELSE
  5137.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,8,1))
  5138.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,8,0))
  5139.           ENDIF
  5140.         ENDIF
  5141.       ENDIF
  5142.     ENDIF
  5143.     '
  5144.   CASE 11
  5145.     IF maze_simulate_move&=11
  5146.       image_put(3,31)
  5147.     ELSE
  5148.       image_put(3,166)
  5149.     ENDIF
  5150.   CASE 10
  5151.     image_put(4,93)
  5152.     image_put(7,92)
  5153.   CASE 12
  5154.   CASE 2
  5155.     IF myself_direction&=1
  5156.       image_put(3,38)
  5157.     ENDIF
  5158.   CASE 3
  5159.     IF myself_direction&=2
  5160.       image_put(3,38)
  5161.     ENDIF
  5162.   CASE 4
  5163.     IF myself_direction&=3
  5164.       image_put(3,38)
  5165.     ENDIF
  5166.   CASE 5
  5167.     IF myself_direction&=4
  5168.       image_put(3,38)
  5169.     ENDIF
  5170.   CASE 6
  5171.     IF myself_direction&=1
  5172.       image_put(3,53)
  5173.     ENDIF
  5174.   CASE 7
  5175.     IF myself_direction&=2
  5176.       image_put(3,53)
  5177.     ENDIF
  5178.   CASE 8
  5179.     IF myself_direction&=3
  5180.       image_put(3,53)
  5181.     ENDIF
  5182.   CASE 9
  5183.     IF myself_direction&=4
  5184.       image_put(3,53)
  5185.     ENDIF
  5186.   ENDSELECT
  5187.   '
  5188. RETURN
  5189. > PROCEDURE draw_view_l2
  5190.   '
  5191.   SELECT BYTE(maze_env_l2&)
  5192.   CASE 0
  5193.     IF myself_position_n&>0
  5194.       SELECT myself_direction&
  5195.       CASE 1
  5196.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),SUB(myself_position_y&,2))
  5197.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),SUB(myself_position_y&,2))
  5198.       CASE 2
  5199.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),ADD(myself_position_y&,2))
  5200.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),ADD(myself_position_y&,2))
  5201.       CASE 3
  5202.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),ADD(myself_position_x&,2),PRED(myself_position_y&))
  5203.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),ADD(myself_position_x&,2),PRED(myself_position_y&))
  5204.       CASE 4
  5205.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUB(myself_position_x&,2),SUCC(myself_position_y&))
  5206.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUB(myself_position_x&,2),SUCC(myself_position_y&))
  5207.       ENDSELECT
  5208.       IF maze_env_up&=10 OR maze_env_up&=12
  5209.         image_put(4,79)
  5210.         image_put(7,78)
  5211.       ELSE IF fitem_up_ptr%>0
  5212.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  5213.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  5214.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  5215.             image_put(4,79)
  5216.             image_put(7,78)
  5217.           ENDIF
  5218.         ENDIF
  5219.       ENDIF
  5220.     ENDIF
  5221.     '
  5222.     IF fitem_l2_ptr%>0
  5223.       get_tile_item(fitem_l2_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5224.       IF litem_work_type|=0 AND litem_work_family|>0
  5225.         IF litem_work_family|=3
  5226.           SELECT litem_work_id|
  5227.           CASE 0
  5228.             IF @get_byte(fitem_l2_ptr%,offset_door_open_state&)=0
  5229.               image_put(4,25)
  5230.               IF maze_simulate_move&=11
  5231.                 image_put(7,24)
  5232.               ELSE
  5233.                 image_put(7,169)
  5234.               ENDIF
  5235.             ENDIF
  5236.           CASE 1
  5237.             IF @get_byte(fitem_l2_ptr%,offset_door_open_state&)>0
  5238.               image_put(4,109)
  5239.               image_put(7,108)
  5240.             ENDIF
  5241.           CASE 2
  5242.             IF @get_byte(fitem_l2_ptr%,offset_door_open_state&)>0
  5243.               image_put(4,157)
  5244.               image_put(7,156)
  5245.             ENDIF
  5246.           DEFAULT
  5247.             image_put(3,662) ! door top frame
  5248.             image_put_door(fitem_l2_ptr%,7)
  5249.           ENDSELECT
  5250.         ELSE
  5251.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5252.             IF @get_byte(fitem_l2_ptr%,offset_item_active&)>0
  5253.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  5254.               redraw_for_animation!=TRUE
  5255.             ELSE
  5256.               litem_work_id|=10 ! do not draw
  5257.             ENDIF
  5258.           ENDIF
  5259.           DEC litem_work_family|
  5260.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,7,1))
  5261.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,7,0))
  5262.         ENDIF
  5263.       ENDIF
  5264.     ENDIF
  5265.     '
  5266.   CASE 1
  5267.     image_put(4,25)
  5268.     IF maze_simulate_move&=11
  5269.       image_put(7,24)
  5270.     ELSE
  5271.       image_put(7,169)
  5272.     ENDIF
  5273.     '
  5274.     IF witem_l2f_ptr%>0
  5275.       get_tile_item(witem_l2f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5276.       IF litem_work_type|=1 AND litem_work_family|>0
  5277.         IF litem_work_family|=3
  5278.           image_put_wall_inscription(witem_l2f_ptr%,6)
  5279.         ELSE
  5280.           IF litem_work_family|=4 ! wall switch
  5281.             IF @get_byte(witem_l2f_ptr%,offset_switch_state&)>0
  5282.               ADD litem_work_id|,32 ! activated sprite
  5283.             ENDIF
  5284.           ENDIF
  5285.           DEC litem_work_family|
  5286.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,6,1)=0
  5287.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,6,0))
  5288.           ELSE
  5289.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,6,1))
  5290.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,6,0))
  5291.           ENDIF
  5292.         ENDIF
  5293.       ENDIF
  5294.     ENDIF
  5295.     IF witem_f2l_ptr%>0
  5296.       get_tile_item(witem_f2l_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5297.       IF litem_work_type|=1 AND litem_work_family|>0
  5298.         IF litem_work_family|=3
  5299.           image_put_wall_inscription(witem_f2l_ptr%,4)
  5300.         ELSE
  5301.           IF litem_work_family|=4 ! wall switch
  5302.             IF @get_byte(witem_f2l_ptr%,offset_switch_state&)>0
  5303.               ADD litem_work_id|,32 ! activated sprite
  5304.             ENDIF
  5305.           ENDIF
  5306.           DEC litem_work_family|
  5307.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,4,1)=0
  5308.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,4,0))
  5309.           ELSE
  5310.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,4,1))
  5311.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,4,0))
  5312.           ENDIF
  5313.         ENDIF
  5314.       ENDIF
  5315.     ENDIF
  5316.     '
  5317.   CASE 11
  5318.     image_put(4,25)
  5319.     IF maze_simulate_move&=11
  5320.       image_put(7,24)
  5321.     ELSE
  5322.       image_put(7,169)
  5323.     ENDIF
  5324.   CASE 10
  5325.     image_put(4,109)
  5326.     image_put(7,108)
  5327.   CASE 12
  5328.     image_put(4,157)
  5329.     image_put(7,156)
  5330.   CASE 2 ! up north
  5331.     SELECT myself_direction&
  5332.     CASE 1
  5333.       image_put(3,41)
  5334.     CASE 3
  5335.       image_put(3,66)
  5336.     ENDSELECT
  5337.   CASE 3 ! up south
  5338.     SELECT myself_direction&
  5339.     CASE 2
  5340.       image_put(3,41)
  5341.     CASE 4
  5342.       image_put(3,66)
  5343.     ENDSELECT
  5344.   CASE 4 ! up east
  5345.     SELECT myself_direction&
  5346.     CASE 3
  5347.       image_put(3,41)
  5348.     CASE 2
  5349.       image_put(3,66)
  5350.     ENDSELECT
  5351.   CASE 5 ! up west
  5352.     SELECT myself_direction&
  5353.     CASE 4
  5354.       image_put(3,41)
  5355.     CASE 1
  5356.       image_put(3,66)
  5357.     ENDSELECT
  5358.   CASE 6 ! down north
  5359.     SELECT myself_direction&
  5360.     CASE 1
  5361.       image_put(3,56)
  5362.     CASE 3
  5363.       image_put(3,66)
  5364.     ENDSELECT
  5365.   CASE 7 ! down south
  5366.     SELECT myself_direction&
  5367.     CASE 2
  5368.       image_put(3,56)
  5369.     CASE 4
  5370.       image_put(3,66)
  5371.     ENDSELECT
  5372.   CASE 8 ! down east
  5373.     SELECT myself_direction&
  5374.     CASE 3
  5375.       image_put(3,56)
  5376.     CASE 2
  5377.       image_put(3,66)
  5378.     ENDSELECT
  5379.   CASE 9 ! down west
  5380.     SELECT myself_direction&
  5381.     CASE 4
  5382.       image_put(3,56)
  5383.     CASE 1
  5384.       image_put(3,66)
  5385.     ENDSELECT
  5386.   ENDSELECT
  5387.   '
  5388. RETURN
  5389. > PROCEDURE draw_view_r2
  5390.   '
  5391.   SELECT BYTE(maze_env_r2&)
  5392.   CASE 0
  5393.     IF myself_position_n&>0
  5394.       SELECT myself_direction&
  5395.       CASE 1
  5396.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),SUB(myself_position_y&,2))
  5397.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),SUB(myself_position_y&,2))
  5398.       CASE 2
  5399.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),ADD(myself_position_y&,2))
  5400.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),ADD(myself_position_y&,2))
  5401.       CASE 3
  5402.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),ADD(myself_position_x&,2),SUCC(myself_position_y&))
  5403.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),ADD(myself_position_x&,2),SUCC(myself_position_y&))
  5404.       CASE 4
  5405.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUB(myself_position_x&,2),PRED(myself_position_y&))
  5406.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUB(myself_position_x&,2),PRED(myself_position_y&))
  5407.       ENDSELECT
  5408.       IF maze_env_up&=10 OR maze_env_up&=12
  5409.         image_put(4,81)
  5410.         image_put(7,80)
  5411.       ELSE IF fitem_up_ptr%>0
  5412.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  5413.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  5414.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  5415.             image_put(4,81)
  5416.             image_put(7,80)
  5417.           ENDIF
  5418.         ENDIF
  5419.       ENDIF
  5420.     ENDIF
  5421.     '
  5422.     IF fitem_r2_ptr%>0
  5423.       get_tile_item(fitem_r2_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5424.       IF litem_work_type|=0 AND litem_work_family|>0
  5425.         IF litem_work_family|=3
  5426.           SELECT litem_work_id|
  5427.           CASE 0
  5428.             IF @get_byte(fitem_r2_ptr%,offset_door_open_state&)=0
  5429.               image_put(4,23)
  5430.               IF maze_simulate_move&=11
  5431.                 image_put(7,22)
  5432.               ELSE
  5433.                 image_put(7,173)
  5434.               ENDIF
  5435.             ENDIF
  5436.           CASE 1
  5437.             IF @get_byte(fitem_r2_ptr%,offset_door_open_state&)>0
  5438.               image_put(4,107)
  5439.               image_put(7,106)
  5440.             ENDIF
  5441.           CASE 2
  5442.             IF @get_byte(fitem_r2_ptr%,offset_door_open_state&)>0
  5443.               image_put(4,163)
  5444.               image_put(7,162)
  5445.             ENDIF
  5446.           DEFAULT
  5447.             image_put(3,661) ! door top frame
  5448.             image_put_door(fitem_r2_ptr%,8)
  5449.           ENDSELECT
  5450.         ELSE
  5451.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5452.             IF @get_byte(fitem_r2_ptr%,offset_item_active&)>0
  5453.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  5454.               redraw_for_animation!=TRUE
  5455.             ELSE
  5456.               litem_work_id|=10 ! do not draw
  5457.             ENDIF
  5458.           ENDIF
  5459.           DEC litem_work_family|
  5460.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,8,1))
  5461.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,8,0))
  5462.         ENDIF
  5463.       ENDIF
  5464.     ENDIF
  5465.     '
  5466.   CASE 1
  5467.     image_put(4,23)
  5468.     IF maze_simulate_move&=11
  5469.       image_put(7,22)
  5470.     ELSE
  5471.       image_put(7,173)
  5472.     ENDIF
  5473.     '
  5474.     IF witem_r2f_ptr%>0
  5475.       get_tile_item(witem_r2f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5476.       IF litem_work_type|=1 AND litem_work_family|>0
  5477.         IF litem_work_family|=3
  5478.           image_put_wall_inscription(witem_r2f_ptr%,7)
  5479.         ELSE
  5480.           IF litem_work_family|=4 ! wall switch
  5481.             IF @get_byte(witem_r2f_ptr%,offset_switch_state&)>0
  5482.               ADD litem_work_id|,32 ! activated sprite
  5483.             ENDIF
  5484.           ENDIF
  5485.           DEC litem_work_family|
  5486.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,7,1)=0
  5487.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,7,0))
  5488.           ELSE
  5489.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,7,1))
  5490.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,7,0))
  5491.           ENDIF
  5492.         ENDIF
  5493.       ENDIF
  5494.     ENDIF
  5495.     IF witem_f2r_ptr%>0
  5496.       get_tile_item(witem_f2r_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5497.       IF litem_work_type|=1 AND litem_work_family|>0
  5498.         IF litem_work_family|=3
  5499.           image_put_wall_inscription(witem_f2r_ptr%,5)
  5500.         ELSE
  5501.           IF litem_work_family|=4 ! wall switch
  5502.             IF @get_byte(witem_f2r_ptr%,offset_switch_state&)>0
  5503.               ADD litem_work_id|,32 ! activated sprite
  5504.             ENDIF
  5505.           ENDIF
  5506.           DEC litem_work_family|
  5507.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,5,1)=0
  5508.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,5,0))
  5509.           ELSE
  5510.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,5,1))
  5511.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,5,0))
  5512.           ENDIF
  5513.         ENDIF
  5514.       ENDIF
  5515.     ENDIF
  5516.     '
  5517.   CASE 11
  5518.     image_put(4,23)
  5519.     IF maze_simulate_move&=11
  5520.       image_put(7,22)
  5521.     ELSE
  5522.       image_put(7,173)
  5523.     ENDIF
  5524.   CASE 10
  5525.     image_put(4,107)
  5526.     image_put(7,106)
  5527.   CASE 12
  5528.     image_put(4,163)
  5529.     image_put(7,162)
  5530.   CASE 2 ! up north
  5531.     SELECT myself_direction&
  5532.     CASE 1
  5533.       image_put(3,42)
  5534.     CASE 4
  5535.       image_put(3,67)
  5536.     ENDSELECT
  5537.   CASE 3 ! up south
  5538.     SELECT myself_direction&
  5539.     CASE 2
  5540.       image_put(3,42)
  5541.     CASE 3
  5542.       image_put(3,67)
  5543.     ENDSELECT
  5544.   CASE 4 ! up east
  5545.     SELECT myself_direction&
  5546.     CASE 3
  5547.       image_put(3,42)
  5548.     CASE 1
  5549.       image_put(3,67)
  5550.     ENDSELECT
  5551.   CASE 5 ! up west
  5552.     SELECT myself_direction&
  5553.     CASE 4
  5554.       image_put(3,42)
  5555.     CASE 2
  5556.       image_put(3,67)
  5557.     ENDSELECT
  5558.   CASE 6 ! down north
  5559.     SELECT myself_direction&
  5560.     CASE 1
  5561.       image_put(3,57)
  5562.     CASE 4
  5563.       image_put(3,67)
  5564.     ENDSELECT
  5565.   CASE 7 ! down south
  5566.     SELECT myself_direction&
  5567.     CASE 2
  5568.       image_put(3,57)
  5569.     CASE 3
  5570.       image_put(3,67)
  5571.     ENDSELECT
  5572.   CASE 8 ! down east
  5573.     SELECT myself_direction&
  5574.     CASE 3
  5575.       image_put(3,57)
  5576.     CASE 1
  5577.       image_put(3,67)
  5578.     ENDSELECT
  5579.   CASE 9 ! down west
  5580.     SELECT myself_direction&
  5581.     CASE 4
  5582.       image_put(3,57)
  5583.     CASE 2
  5584.       image_put(3,67)
  5585.     ENDSELECT
  5586.   ENDSELECT
  5587.   '
  5588. RETURN
  5589. > PROCEDURE draw_view_f2
  5590.   '
  5591.   SELECT BYTE(maze_env_f2&)
  5592.   CASE 0
  5593.     IF myself_position_n&>0
  5594.       SELECT myself_direction&
  5595.       CASE 1
  5596.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,SUB(myself_position_y&,2))
  5597.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,SUB(myself_position_y&,2))
  5598.       CASE 2
  5599.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,ADD(myself_position_y&,2))
  5600.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,ADD(myself_position_y&,2))
  5601.       CASE 3
  5602.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),ADD(myself_position_x&,2),myself_position_y&)
  5603.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),ADD(myself_position_x&,2),myself_position_y&)
  5604.       CASE 4
  5605.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUB(myself_position_x&,2),myself_position_y&)
  5606.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUB(myself_position_x&,2),myself_position_y&)
  5607.       ENDSELECT
  5608.       IF maze_env_up&=10 OR maze_env_up&=12
  5609.         image_put(4,77)
  5610.         image_put(7,76)
  5611.       ELSE IF fitem_up_ptr%>0
  5612.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  5613.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  5614.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  5615.             image_put(4,77)
  5616.             image_put(7,76)
  5617.           ENDIF
  5618.         ENDIF
  5619.       ENDIF
  5620.     ENDIF
  5621.     '
  5622.     IF fitem_f2_ptr%>0
  5623.       get_tile_item(fitem_f2_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5624.       IF litem_work_type|=0 AND litem_work_family|>0
  5625.         IF litem_work_family|=3
  5626.           SELECT litem_work_id|
  5627.           CASE 0
  5628.             IF @get_byte(fitem_f2_ptr%,offset_door_open_state&)=0
  5629.               IF maze_simulate_move&=11
  5630.                 image_put(3,26)
  5631.               ELSE
  5632.                 image_put(3,165)
  5633.               ENDIF
  5634.             ENDIF
  5635.           CASE 1
  5636.             IF @get_byte(fitem_f2_ptr%,offset_door_open_state&)>0
  5637.               image_put(4,95)
  5638.               image_put(7,94)
  5639.             ENDIF
  5640.           CASE 2
  5641.             IF @get_byte(fitem_f2_ptr%,offset_door_open_state&)>0
  5642.               image_put(4,151)
  5643.               image_put(7,150)
  5644.             ENDIF
  5645.           DEFAULT
  5646.             image_put(4,119) ! door left frame
  5647.             image_put(7,118)
  5648.             image_put(4,121) ! door right frame
  5649.             image_put(7,120)
  5650.             image_put(3,657) ! top frame
  5651.             IF @get_byte(fitem_f2_ptr%,offset_door_opened_by&)=1
  5652.               image_put(3,653)
  5653.             ENDIF
  5654.             image_put_door(fitem_f2_ptr%,6)
  5655.           ENDSELECT
  5656.         ELSE
  5657.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5658.             IF @get_byte(fitem_f2_ptr%,offset_item_active&)>0
  5659.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  5660.               redraw_for_animation!=TRUE
  5661.             ELSE
  5662.               litem_work_id|=10 ! do not draw
  5663.             ENDIF
  5664.           ENDIF
  5665.           DEC litem_work_family|
  5666.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,6,1))
  5667.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,6,0))
  5668.         ENDIF
  5669.       ENDIF
  5670.     ENDIF
  5671.     '
  5672.   CASE 1
  5673.     IF maze_simulate_move&=11
  5674.       image_put(3,26)
  5675.     ELSE
  5676.       image_put(3,165)
  5677.     ENDIF
  5678.     '
  5679.     IF witem_f2f_ptr%>0
  5680.       get_tile_item(witem_f2f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5681.       IF litem_work_type|=1 AND litem_work_family|>0
  5682.         IF litem_work_family|=3
  5683.           image_put_wall_inscription(witem_f2f_ptr%,3)
  5684.         ELSE
  5685.           IF litem_work_family|=4 ! wall switch
  5686.             IF @get_byte(witem_f2f_ptr%,offset_switch_state&)>0
  5687.               ADD litem_work_id|,32 ! activated sprite
  5688.             ENDIF
  5689.           ENDIF
  5690.           DEC litem_work_family|
  5691.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,3,1)=0
  5692.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,3,0))
  5693.           ELSE
  5694.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,3,1))
  5695.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,3,0))
  5696.           ENDIF
  5697.         ENDIF
  5698.       ENDIF
  5699.     ENDIF
  5700.     '
  5701.   CASE 11
  5702.     IF maze_simulate_move&=11
  5703.       image_put(3,26)
  5704.     ELSE
  5705.       image_put(3,165)
  5706.     ENDIF
  5707.   CASE 10
  5708.     image_put(4,95)
  5709.     image_put(7,94)
  5710.   CASE 12
  5711.     image_put(4,151)
  5712.     image_put(7,150)
  5713.   CASE 2
  5714.     IF myself_direction&=1
  5715.       image_put(3,37)
  5716.     ENDIF
  5717.   CASE 3
  5718.     IF myself_direction&=2
  5719.       image_put(3,37)
  5720.     ENDIF
  5721.   CASE 4
  5722.     IF myself_direction&=3
  5723.       image_put(3,37)
  5724.     ENDIF
  5725.   CASE 5
  5726.     IF myself_direction&=4
  5727.       image_put(3,37)
  5728.     ENDIF
  5729.   CASE 6
  5730.     IF myself_direction&=1
  5731.       image_put(3,52)
  5732.     ENDIF
  5733.   CASE 7
  5734.     IF myself_direction&=2
  5735.       image_put(3,52)
  5736.     ENDIF
  5737.   CASE 8
  5738.     IF myself_direction&=3
  5739.       image_put(3,52)
  5740.     ENDIF
  5741.   CASE 9
  5742.     IF myself_direction&=4
  5743.       image_put(3,52)
  5744.     ENDIF
  5745.   ENDSELECT
  5746.   '
  5747. RETURN
  5748. > PROCEDURE draw_view_l1
  5749.   '
  5750.   SELECT BYTE(maze_env_l1&)
  5751.   CASE 0
  5752.     IF myself_position_n&>0
  5753.       SELECT myself_direction&
  5754.       CASE 1
  5755.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),PRED(myself_position_y&))
  5756.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),PRED(myself_position_y&))
  5757.       CASE 2
  5758.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),SUCC(myself_position_y&))
  5759.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),SUCC(myself_position_y&))
  5760.       CASE 3
  5761.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),PRED(myself_position_y&))
  5762.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),PRED(myself_position_y&))
  5763.       CASE 4
  5764.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),SUCC(myself_position_y&))
  5765.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),SUCC(myself_position_y&))
  5766.       ENDSELECT
  5767.       IF maze_env_up&=10 OR maze_env_up&=12
  5768.         image_put(4,87)
  5769.         image_put(7,86)
  5770.       ELSE IF fitem_up_ptr%>0
  5771.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  5772.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  5773.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  5774.             image_put(4,87)
  5775.             image_put(7,86)
  5776.           ENDIF
  5777.         ENDIF
  5778.       ENDIF
  5779.     ENDIF
  5780.     '
  5781.     IF fitem_l1_ptr%>0
  5782.       get_tile_item(fitem_l1_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5783.       IF litem_work_type|=0 AND litem_work_family|>0
  5784.         IF litem_work_family|=3
  5785.           SELECT litem_work_id|
  5786.           CASE 0
  5787.             IF @get_byte(fitem_l1_ptr%,offset_door_open_state&)=0
  5788.               image_put(4,20)
  5789.               IF maze_simulate_move&=11
  5790.                 image_put(7,19)
  5791.               ELSE
  5792.                 image_put(7,168)
  5793.               ENDIF
  5794.             ENDIF
  5795.           CASE 1
  5796.             IF @get_byte(fitem_l1_ptr%,offset_door_open_state&)>0
  5797.               image_put(4,101)
  5798.               image_put(7,100)
  5799.             ENDIF
  5800.           CASE 2
  5801.             IF @get_byte(fitem_l1_ptr%,offset_door_open_state&)>0
  5802.               image_put(4,155)
  5803.               image_put(7,154)
  5804.             ENDIF
  5805.           DEFAULT
  5806.             image_put(3,660) ! door top frame
  5807.             image_put_door(fitem_l1_ptr%,4)
  5808.           ENDSELECT
  5809.         ELSE
  5810.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5811.             IF @get_byte(fitem_l1_ptr%,offset_item_active&)>0
  5812.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  5813.               redraw_for_animation!=TRUE
  5814.             ELSE
  5815.               litem_work_id|=10 ! do not draw
  5816.             ENDIF
  5817.           ENDIF
  5818.           DEC litem_work_family|
  5819.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,4,1))
  5820.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,4,0))
  5821.         ENDIF
  5822.       ENDIF
  5823.     ENDIF
  5824.     '
  5825.   CASE 1
  5826.     image_put(4,20)
  5827.     IF maze_simulate_move&=11
  5828.       image_put(7,19)
  5829.     ELSE
  5830.       image_put(7,168)
  5831.     ENDIF
  5832.     '
  5833.     IF witem_f1l_ptr%>0
  5834.       get_tile_item(witem_f1l_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5835.       IF litem_work_type|=1 AND litem_work_family|>0
  5836.         IF litem_work_family|=3
  5837.           image_put_wall_inscription(witem_f1l_ptr%,1)
  5838.         ELSE
  5839.           IF litem_work_family|=4 ! wall switch
  5840.             IF @get_byte(witem_f1l_ptr%,offset_switch_state&)>0
  5841.               ADD litem_work_id|,32 ! activated sprite
  5842.             ENDIF
  5843.           ENDIF
  5844.           DEC litem_work_family|
  5845.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,1,1)=0
  5846.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,1,0))
  5847.           ELSE
  5848.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,1,1))
  5849.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,1,0))
  5850.           ENDIF
  5851.         ENDIF
  5852.       ENDIF
  5853.     ENDIF
  5854.     '
  5855.   CASE 11
  5856.     image_put(4,20)
  5857.     IF maze_simulate_move&=11
  5858.       image_put(7,19)
  5859.     ELSE
  5860.       image_put(7,168)
  5861.     ENDIF
  5862.   CASE 10
  5863.     image_put(4,101)
  5864.     image_put(7,100)
  5865.   CASE 12
  5866.     image_put(4,155)
  5867.     image_put(7,154)
  5868.   CASE 2 ! up north
  5869.     SELECT myself_direction&
  5870.     CASE 1
  5871.       image_put(3,39)
  5872.     CASE 3
  5873.       image_put(4,48)
  5874.       image_put(7,47)
  5875.     ENDSELECT
  5876.   CASE 3 ! up south
  5877.     SELECT myself_direction&
  5878.     CASE 2
  5879.       image_put(3,39)
  5880.     CASE 4
  5881.       image_put(4,48)
  5882.       image_put(7,47)
  5883.     ENDSELECT
  5884.   CASE 4 ! up east
  5885.     SELECT myself_direction&
  5886.     CASE 3
  5887.       image_put(3,39)
  5888.     CASE 2
  5889.       image_put(4,48)
  5890.       image_put(7,47)
  5891.     ENDSELECT
  5892.   CASE 5 ! up west
  5893.     SELECT myself_direction&
  5894.     CASE 4
  5895.       image_put(3,39)
  5896.     CASE 1
  5897.       image_put(4,48)
  5898.       image_put(7,47)
  5899.     ENDSELECT
  5900.   CASE 6 ! down north
  5901.     SELECT myself_direction&
  5902.     CASE 1
  5903.       image_put(3,54)
  5904.     CASE 3
  5905.       image_put(4,61)
  5906.       image_put(7,60)
  5907.     ENDSELECT
  5908.   CASE 7 ! down south
  5909.     SELECT myself_direction&
  5910.     CASE 2
  5911.       image_put(3,54)
  5912.     CASE 4
  5913.       image_put(4,61)
  5914.       image_put(7,60)
  5915.     ENDSELECT
  5916.   CASE 8 ! down east
  5917.     SELECT myself_direction&
  5918.     CASE 3
  5919.       image_put(3,54)
  5920.     CASE 2
  5921.       image_put(4,61)
  5922.       image_put(7,60)
  5923.     ENDSELECT
  5924.   CASE 9 ! down west
  5925.     SELECT myself_direction&
  5926.     CASE 4
  5927.       image_put(3,54)
  5928.     CASE 1
  5929.       image_put(4,61)
  5930.       image_put(7,60)
  5931.     ENDSELECT
  5932.   ENDSELECT
  5933.   '
  5934. RETURN
  5935. > PROCEDURE draw_view_r1
  5936.   '
  5937.   SELECT BYTE(maze_env_r1&)
  5938.   CASE 0
  5939.     IF myself_position_n&>0
  5940.       SELECT myself_direction&
  5941.       CASE 1
  5942.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),PRED(myself_position_y&))
  5943.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),PRED(myself_position_y&))
  5944.       CASE 2
  5945.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),SUCC(myself_position_y&))
  5946.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),SUCC(myself_position_y&))
  5947.       CASE 3
  5948.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),SUCC(myself_position_y&))
  5949.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),SUCC(myself_position_y&))
  5950.       CASE 4
  5951.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),PRED(myself_position_y&))
  5952.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),PRED(myself_position_y&))
  5953.       ENDSELECT
  5954.       IF maze_env_up&=10 OR maze_env_up&=12
  5955.         image_put(4,89)
  5956.         image_put(7,88)
  5957.       ELSE IF fitem_up_ptr%>0
  5958.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  5959.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  5960.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  5961.             image_put(4,89)
  5962.             image_put(7,88)
  5963.           ENDIF
  5964.         ENDIF
  5965.       ENDIF
  5966.     ENDIF
  5967.     '
  5968.     IF fitem_r1_ptr%>0
  5969.       get_tile_item(fitem_r1_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  5970.       IF litem_work_type|=0 AND litem_work_family|>0
  5971.         IF litem_work_family|=3
  5972.           SELECT litem_work_id|
  5973.           CASE 0
  5974.             IF @get_byte(fitem_r1_ptr%,offset_door_open_state&)=0
  5975.               image_put(4,18)
  5976.               IF maze_simulate_move&=11
  5977.                 image_put(7,17)
  5978.               ELSE
  5979.                 image_put(7,172)
  5980.               ENDIF
  5981.             ENDIF
  5982.           CASE 1
  5983.             IF @get_byte(fitem_r1_ptr%,offset_door_open_state&)>0
  5984.               image_put(4,103)
  5985.               image_put(7,102)
  5986.             ENDIF
  5987.           CASE 2
  5988.             IF @get_byte(fitem_r1_ptr%,offset_door_open_state&)>0
  5989.               image_put(4,161)
  5990.               image_put(7,160)
  5991.             ENDIF
  5992.           DEFAULT
  5993.             image_put(3,659) ! door top frame
  5994.             image_put_door(fitem_r1_ptr%,5)
  5995.           ENDSELECT
  5996.         ELSE
  5997.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  5998.             IF @get_byte(fitem_r1_ptr%,offset_item_active&)>0
  5999.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  6000.               redraw_for_animation!=TRUE
  6001.             ELSE
  6002.               litem_work_id|=10 ! do not draw
  6003.             ENDIF
  6004.           ENDIF
  6005.           DEC litem_work_family|
  6006.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,5,1))
  6007.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,5,0))
  6008.         ENDIF
  6009.       ENDIF
  6010.     ENDIF
  6011.     '
  6012.   CASE 1
  6013.     image_put(4,18)
  6014.     IF maze_simulate_move&=11
  6015.       image_put(7,17)
  6016.     ELSE
  6017.       image_put(7,172)
  6018.     ENDIF
  6019.     '
  6020.     IF witem_f1r_ptr%>0
  6021.       get_tile_item(witem_f1r_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6022.       IF litem_work_type|=1 AND litem_work_family|>0
  6023.         IF litem_work_family|=3
  6024.           image_put_wall_inscription(witem_f1r_ptr%,2)
  6025.         ELSE
  6026.           IF litem_work_family|=4 ! wall switch
  6027.             IF @get_byte(witem_f1r_ptr%,offset_switch_state&)>0
  6028.               ADD litem_work_id|,32 ! activated sprite
  6029.             ENDIF
  6030.           ENDIF
  6031.           DEC litem_work_family|
  6032.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,2,1)=0
  6033.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,2,0))
  6034.           ELSE
  6035.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,2,1))
  6036.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,2,0))
  6037.           ENDIF
  6038.         ENDIF
  6039.       ENDIF
  6040.     ENDIF
  6041.     '
  6042.   CASE 11
  6043.     image_put(4,18)
  6044.     IF maze_simulate_move&=11
  6045.       image_put(7,17)
  6046.     ELSE
  6047.       image_put(7,172)
  6048.     ENDIF
  6049.   CASE 10
  6050.     image_put(4,103)
  6051.     image_put(7,102)
  6052.   CASE 12
  6053.     image_put(4,161)
  6054.     image_put(7,160)
  6055.   CASE 2 ! up north
  6056.     SELECT myself_direction&
  6057.     CASE 1
  6058.       image_put(3,40)
  6059.     CASE 4
  6060.       image_put(4,50)
  6061.       image_put(7,49)
  6062.     ENDSELECT
  6063.   CASE 3 ! up south
  6064.     SELECT myself_direction&
  6065.     CASE 2
  6066.       image_put(3,40)
  6067.     CASE 3
  6068.       image_put(4,50)
  6069.       image_put(7,49)
  6070.     ENDSELECT
  6071.   CASE 4 ! up east
  6072.     SELECT myself_direction&
  6073.     CASE 3
  6074.       image_put(3,40)
  6075.     CASE 1
  6076.       image_put(4,50)
  6077.       image_put(7,49)
  6078.     ENDSELECT
  6079.   CASE 5 ! up west
  6080.     SELECT myself_direction&
  6081.     CASE 4
  6082.       image_put(3,40)
  6083.     CASE 2
  6084.       image_put(4,50)
  6085.       image_put(7,49)
  6086.     ENDSELECT
  6087.   CASE 6 ! down north
  6088.     SELECT myself_direction&
  6089.     CASE 1
  6090.       image_put(3,55)
  6091.     CASE 4
  6092.       image_put(4,63)
  6093.       image_put(7,62)
  6094.     ENDSELECT
  6095.   CASE 7 ! down south
  6096.     SELECT myself_direction&
  6097.     CASE 2
  6098.       image_put(3,55)
  6099.     CASE 3
  6100.       image_put(4,63)
  6101.       image_put(7,62)
  6102.     ENDSELECT
  6103.   CASE 8 ! down east
  6104.     SELECT myself_direction&
  6105.     CASE 3
  6106.       image_put(3,55)
  6107.     CASE 1
  6108.       image_put(4,63)
  6109.       image_put(7,62)
  6110.     ENDSELECT
  6111.   CASE 9 ! down west
  6112.     SELECT myself_direction&
  6113.     CASE 4
  6114.       image_put(3,55)
  6115.     CASE 2
  6116.       image_put(4,63)
  6117.       image_put(7,62)
  6118.     ENDSELECT
  6119.   ENDSELECT
  6120.   '
  6121. RETURN
  6122. > PROCEDURE draw_view_f1
  6123.   '
  6124.   SELECT BYTE(maze_env_f1&)
  6125.   CASE 0
  6126.     IF myself_position_n&>0
  6127.       SELECT myself_direction&
  6128.       CASE 1
  6129.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6130.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6131.       CASE 2
  6132.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6133.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6134.       CASE 3
  6135.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6136.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6137.       CASE 4
  6138.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6139.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6140.       ENDSELECT
  6141.       IF maze_env_up&=10 OR maze_env_up&=12
  6142.         image_put(4,73)
  6143.         image_put(7,72)
  6144.       ELSE IF fitem_up_ptr%>0
  6145.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  6146.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  6147.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  6148.             image_put(4,73)
  6149.             image_put(7,72)
  6150.           ENDIF
  6151.         ENDIF
  6152.       ENDIF
  6153.     ENDIF
  6154.     '
  6155.     sensible_zone_space!=TRUE
  6156.     sensible_zone_hand!=FALSE
  6157.     sensible_zone_hand_id&=-1
  6158.     sensible_zone_hand_ptr%=0
  6159.     '
  6160.     IF fitem_f1_ptr%>0
  6161.       get_tile_item(fitem_f1_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6162.       IF litem_work_type|=0 AND litem_work_family|>0
  6163.         IF litem_work_family|=3
  6164.           SELECT litem_work_id|
  6165.           CASE 0
  6166.             IF @get_byte(fitem_f1_ptr%,offset_door_open_state&)=0
  6167.               IF maze_simulate_move&=11
  6168.                 image_put(3,21)
  6169.               ELSE
  6170.                 image_put(3,164)
  6171.               ENDIF
  6172.             ENDIF
  6173.           CASE 1
  6174.             IF @get_byte(fitem_f1_ptr%,offset_door_open_state&)>0
  6175.               image_put(4,91)
  6176.               image_put(7,90)
  6177.             ENDIF
  6178.           CASE 2
  6179.             IF @get_byte(fitem_f1_ptr%,offset_door_open_state&)>0
  6180.               image_put(4,149)
  6181.               image_put(7,148)
  6182.             ENDIF
  6183.           DEFAULT
  6184.             image_put(4,115) ! door left frame
  6185.             image_put(7,114)
  6186.             image_put(4,117) ! door right frame
  6187.             image_put(7,116)
  6188.             image_put(3,656) ! top frame
  6189.             IF @get_byte(fitem_f1_ptr%,offset_door_opened_by&)=1
  6190.               image_put(3,652)
  6191.               sensible_zone_hand!=TRUE
  6192.               sensible_zone_hand_id&=1
  6193.               sensible_zone_hand_ptr%=fitem_f1_ptr%
  6194.             ENDIF
  6195.             image_put_door(fitem_f1_ptr%,3)
  6196.           ENDSELECT
  6197.         ELSE
  6198.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  6199.             IF @get_byte(fitem_f1_ptr%,offset_item_active&)>0
  6200.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  6201.               redraw_for_animation!=TRUE
  6202.             ELSE
  6203.               litem_work_id|=10 ! do not draw
  6204.             ENDIF
  6205.           ENDIF
  6206.           DEC litem_work_family|
  6207.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,3,1))
  6208.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,3,0))
  6209.         ENDIF
  6210.       ENDIF
  6211.     ENDIF
  6212.     '
  6213.   CASE 1
  6214.     IF maze_simulate_move&=11
  6215.       image_put(3,21)
  6216.     ELSE
  6217.       image_put(3,164)
  6218.     ENDIF
  6219.     '
  6220.     sensible_zone_space!=FALSE
  6221.     sensible_zone_hand!=FALSE
  6222.     sensible_zone_hand_id&=-1
  6223.     sensible_zone_hand_ptr%=0
  6224.     '
  6225.     IF witem_f1f_ptr%>0
  6226.       get_tile_item(witem_f1f_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6227.       IF litem_work_type|=1 AND litem_work_family|>0
  6228.         IF litem_work_family|=3
  6229.           image_put_wall_inscription(witem_f1f_ptr%,0)
  6230.         ELSE
  6231.           IF litem_work_family|=4 ! wall switch
  6232.             sensible_zone_hand!=TRUE
  6233.             sensible_zone_hand_ptr%=witem_f1f_ptr%
  6234.             SELECT litem_work_id|
  6235.             CASE 0 ! tiny
  6236.               sensible_zone_hand_id&=2
  6237.             CASE 1 ! small
  6238.               sensible_zone_hand_id&=3
  6239.             CASE 2 ! big
  6240.               sensible_zone_hand_id&=4
  6241.             CASE 3 ! cranny
  6242.               sensible_zone_hand_id&=14
  6243.             CASE 4,5 ! blue or green
  6244.               sensible_zone_hand_id&=6
  6245.             CASE 6 ! red
  6246.               sensible_zone_hand_id&=7
  6247.             CASE 7 ! lever
  6248.               sensible_zone_hand_id&=5
  6249.             DEFAULT
  6250.               sensible_zone_hand!=FALSE
  6251.               sensible_zone_hand_id&=-1
  6252.               sensible_zone_hand_ptr%=0
  6253.             ENDSELECT
  6254.             '
  6255.             IF @get_byte(witem_f1f_ptr%,offset_switch_state&)>0 AND litem_work_id|>1
  6256.               ADD litem_work_id|,32 ! activated sprite but not tiny and small switch
  6257.             ENDIF
  6258.           ENDIF
  6259.           '
  6260.           DEC litem_work_family|
  6261.           IF witem_to_sprite&(litem_work_family|,litem_work_id|,0,1)=0
  6262.             image_put(3,witem_to_sprite&(litem_work_family|,litem_work_id|,0,0))
  6263.           ELSE
  6264.             image_put(4,witem_to_sprite&(litem_work_family|,litem_work_id|,0,1))
  6265.             image_put(7,witem_to_sprite&(litem_work_family|,litem_work_id|,0,0))
  6266.           ENDIF
  6267.         ENDIF
  6268.       ENDIF
  6269.     ENDIF
  6270.     '
  6271.   CASE 11
  6272.     IF maze_simulate_move&=11
  6273.       image_put(3,21)
  6274.     ELSE
  6275.       image_put(3,164)
  6276.     ENDIF
  6277.   CASE 10
  6278.     image_put(4,91)
  6279.     image_put(7,90)
  6280.   CASE 12
  6281.     image_put(4,149)
  6282.     image_put(7,148)
  6283.   CASE 2
  6284.     IF myself_direction&=1
  6285.       image_put(3,36)
  6286.     ENDIF
  6287.   CASE 3
  6288.     IF myself_direction&=2
  6289.       image_put(3,36)
  6290.     ENDIF
  6291.   CASE 4
  6292.     IF myself_direction&=3
  6293.       image_put(3,36)
  6294.     ENDIF
  6295.   CASE 5
  6296.     IF myself_direction&=4
  6297.       image_put(3,36)
  6298.     ENDIF
  6299.   CASE 6
  6300.     IF myself_direction&=1
  6301.       image_put(3,51)
  6302.     ENDIF
  6303.   CASE 7
  6304.     IF myself_direction&=2
  6305.       image_put(3,51)
  6306.     ENDIF
  6307.   CASE 8
  6308.     IF myself_direction&=3
  6309.       image_put(3,51)
  6310.     ENDIF
  6311.   CASE 9
  6312.     IF myself_direction&=4
  6313.       image_put(3,51)
  6314.     ENDIF
  6315.   ENDSELECT
  6316.   '
  6317. RETURN
  6318. > PROCEDURE draw_view_l0
  6319.   '
  6320.   SELECT BYTE(maze_env_l0&)
  6321.   CASE 0
  6322.     IF myself_position_n&>0
  6323.       SELECT myself_direction&
  6324.       CASE 1
  6325.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6326.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6327.       CASE 2
  6328.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6329.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6330.       CASE 3
  6331.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6332.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6333.       CASE 4
  6334.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6335.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6336.       ENDSELECT
  6337.       IF maze_env_up&=10 OR maze_env_up&=12
  6338.         image_put(4,85)
  6339.         image_put(7,84)
  6340.       ELSE IF fitem_up_ptr%>0
  6341.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  6342.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  6343.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  6344.             image_put(4,85)
  6345.             image_put(7,84)
  6346.           ENDIF
  6347.         ENDIF
  6348.       ENDIF
  6349.     ENDIF
  6350.     '
  6351.     IF fitem_l0_ptr%>0
  6352.       get_tile_item(fitem_l0_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6353.       IF litem_work_type|=0 AND litem_work_family|>0
  6354.         IF litem_work_family|=3
  6355.           SELECT litem_work_id|
  6356.           CASE 0
  6357.             IF @get_byte(fitem_l0_ptr%,offset_door_open_state&)=0
  6358.               image_put(4,14)
  6359.               IF maze_simulate_move&=11
  6360.                 image_put(7,13)
  6361.               ELSE
  6362.                 image_put(7,167)
  6363.               ENDIF
  6364.             ENDIF
  6365.           CASE 1
  6366.             IF @get_byte(fitem_l0_ptr%,offset_door_open_state&)>0
  6367.               image_put(4,97)
  6368.               image_put(7,96)
  6369.             ENDIF
  6370.           CASE 2
  6371.             IF @get_byte(fitem_l0_ptr%,offset_door_open_state&)>0
  6372.               image_put(4,153)
  6373.               image_put(7,152)
  6374.             ENDIF
  6375.           ENDSELECT
  6376.         ELSE
  6377.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  6378.             IF @get_byte(fitem_l0_ptr%,offset_item_active&)>0
  6379.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  6380.               redraw_for_animation!=TRUE
  6381.             ELSE
  6382.               litem_work_id|=10 ! do not draw
  6383.             ENDIF
  6384.           ENDIF
  6385.           DEC litem_work_family|
  6386.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,1,1))
  6387.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,1,0))
  6388.         ENDIF
  6389.       ENDIF
  6390.     ENDIF
  6391.     '
  6392.   CASE 1,11
  6393.     image_put(4,14)
  6394.     IF maze_simulate_move&=11
  6395.       image_put(7,13)
  6396.     ELSE
  6397.       image_put(7,167)
  6398.     ENDIF
  6399.   CASE 10
  6400.     image_put(4,97)
  6401.     image_put(7,96)
  6402.   CASE 12
  6403.     image_put(4,153)
  6404.     image_put(7,152)
  6405.   CASE 2 ! up north
  6406.     IF myself_direction&=3
  6407.       image_put(3,65)
  6408.     ENDIF
  6409.   CASE 3 ! up south
  6410.     IF myself_direction&=4
  6411.       image_put(3,65)
  6412.     ENDIF
  6413.   CASE 4 ! up east
  6414.     IF myself_direction&=2
  6415.       image_put(3,65)
  6416.     ENDIF
  6417.   CASE 5 ! up west
  6418.     IF myself_direction&=1
  6419.       image_put(3,65)
  6420.     ENDIF
  6421.   CASE 6 ! down north
  6422.     IF myself_direction&=3
  6423.       image_put(3,65)
  6424.     ENDIF
  6425.   CASE 7 ! down south
  6426.     IF myself_direction&=4
  6427.       image_put(3,65)
  6428.     ENDIF
  6429.   CASE 8 ! down east
  6430.     IF myself_direction&=2
  6431.       image_put(3,65)
  6432.     ENDIF
  6433.   CASE 9 ! down west
  6434.     IF myself_direction&=1
  6435.       image_put(3,65)
  6436.     ENDIF
  6437.   ENDSELECT
  6438.   '
  6439. RETURN
  6440. > PROCEDURE draw_view_r0
  6441.   '
  6442.   SELECT BYTE(maze_env_r0&)
  6443.   CASE 0
  6444.     IF myself_position_n&>0
  6445.       SELECT myself_direction&
  6446.       CASE 1
  6447.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6448.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),SUCC(myself_position_x&),myself_position_y&)
  6449.       CASE 2
  6450.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6451.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),PRED(myself_position_x&),myself_position_y&)
  6452.       CASE 3
  6453.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6454.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,SUCC(myself_position_y&))
  6455.       CASE 4
  6456.         maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6457.         fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,PRED(myself_position_y&))
  6458.       ENDSELECT
  6459.       IF maze_env_up&=10 OR maze_env_up&=12
  6460.         image_put(4,83)
  6461.         image_put(7,82)
  6462.       ELSE IF fitem_up_ptr%>0
  6463.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  6464.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  6465.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  6466.             image_put(4,83)
  6467.             image_put(7,82)
  6468.           ENDIF
  6469.         ENDIF
  6470.       ENDIF
  6471.     ENDIF
  6472.     '
  6473.     IF fitem_r0_ptr%>0
  6474.       get_tile_item(fitem_r0_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6475.       IF litem_work_type|=0 AND litem_work_family|>0
  6476.         IF litem_work_family|=3
  6477.           SELECT litem_work_id|
  6478.           CASE 0
  6479.             IF @get_byte(fitem_r0_ptr%,offset_door_open_state&)=0
  6480.               image_put(4,16)
  6481.               IF maze_simulate_move&=11
  6482.                 image_put(7,15)
  6483.               ELSE
  6484.                 image_put(7,171)
  6485.               ENDIF
  6486.             ENDIF
  6487.           CASE 1
  6488.             IF @get_byte(fitem_r0_ptr%,offset_door_open_state&)>0
  6489.               image_put(4,99)
  6490.               image_put(7,98)
  6491.             ENDIF
  6492.           CASE 2
  6493.             IF @get_byte(fitem_r0_ptr%,offset_door_open_state&)>0
  6494.               image_put(4,159)
  6495.               image_put(7,158)
  6496.             ENDIF
  6497.           ENDSELECT
  6498.         ELSE
  6499.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  6500.             IF @get_byte(fitem_r0_ptr%,offset_item_active&)>0
  6501.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  6502.               redraw_for_animation!=TRUE
  6503.             ELSE
  6504.               litem_work_id|=10 ! do not draw
  6505.             ENDIF
  6506.           ENDIF
  6507.           DEC litem_work_family|
  6508.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,2,1))
  6509.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,2,0))
  6510.         ENDIF
  6511.       ENDIF
  6512.     ENDIF
  6513.     '
  6514.   CASE 1,11
  6515.     image_put(4,16)
  6516.     IF maze_simulate_move&=11
  6517.       image_put(7,15)
  6518.     ELSE
  6519.       image_put(7,171)
  6520.     ENDIF
  6521.   CASE 10
  6522.     image_put(4,99)
  6523.     image_put(7,98)
  6524.   CASE 12
  6525.     image_put(4,159)
  6526.     image_put(7,158)
  6527.   CASE 2 ! up north
  6528.     IF myself_direction&=4
  6529.       image_put(3,64)
  6530.     ENDIF
  6531.   CASE 3 ! up south
  6532.     IF myself_direction&=3
  6533.       image_put(3,64)
  6534.     ENDIF
  6535.   CASE 4 ! up east
  6536.     IF myself_direction&=1
  6537.       image_put(3,64)
  6538.     ENDIF
  6539.   CASE 5 ! up west
  6540.     IF myself_direction&=2
  6541.       image_put(3,64)
  6542.     ENDIF
  6543.   CASE 6 ! down north
  6544.     IF myself_direction&=4
  6545.       image_put(3,64)
  6546.     ENDIF
  6547.   CASE 7 ! down south
  6548.     IF myself_direction&=3
  6549.       image_put(3,64)
  6550.     ENDIF
  6551.   CASE 8 ! down east
  6552.     IF myself_direction&=1
  6553.       image_put(3,64)
  6554.     ENDIF
  6555.   CASE 9 ! down west
  6556.     IF myself_direction&=2
  6557.       image_put(3,64)
  6558.     ENDIF
  6559.   ENDSELECT
  6560.   '
  6561. RETURN
  6562. > PROCEDURE draw_view_f0
  6563.   '
  6564.   SELECT BYTE(maze_env_f0&)
  6565.   CASE 0
  6566.     IF myself_position_n&>0
  6567.       maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,myself_position_y&)
  6568.       fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,myself_position_y&)
  6569.       '
  6570.       IF maze_env_up&=10 OR maze_env_up&=12
  6571.         image_put(4,75)
  6572.         image_put(7,74)
  6573.       ELSE IF fitem_up_ptr%>0
  6574.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  6575.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  6576.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  6577.             image_put(4,75)
  6578.             image_put(7,74)
  6579.           ENDIF
  6580.         ENDIF
  6581.       ENDIF
  6582.     ENDIF
  6583.     '
  6584.     IF fitem_f0_ptr%>0
  6585.       get_tile_item(fitem_f0_ptr%,dummy%,dummy&,litem_work_type|,litem_work_family|,litem_work_id|)
  6586.       IF litem_work_type|=0 AND litem_work_family|>0
  6587.         IF litem_work_family|=3
  6588.           SELECT litem_work_id|
  6589.           CASE 0
  6590.           CASE 1
  6591.             IF @get_byte(fitem_f0_ptr%,offset_door_open_state&)>0
  6592.               image_put(4,105)
  6593.               image_put(7,104)
  6594.             ENDIF
  6595.           CASE 2
  6596.             IF @get_byte(fitem_f0_ptr%,offset_door_open_state&)>0
  6597.               image_put(4,147)
  6598.               image_put(7,146)
  6599.             ENDIF
  6600.           DEFAULT
  6601.             litem_work_tmp|=@get_byte(fitem_f0_ptr%,offset_door_orientation&)
  6602.             IF (litem_work_tmp|=1 AND myself_direction&<3) OR (litem_work_tmp|=0 AND myself_direction&>2)
  6603.               image_put(4,651) ! front door frame
  6604.               image_put(7,650)
  6605.             ENDIF
  6606.           ENDSELECT
  6607.         ELSE
  6608.           IF litem_work_family|=4 AND litem_work_id|=1 ! animate waterfall
  6609.             IF @get_byte(fitem_f0_ptr%,offset_item_active&)>0
  6610.               ADD litem_work_id|,MOD((LONG{job_animation%}),3)
  6611.               redraw_for_animation!=TRUE
  6612.             ELSE
  6613.               litem_work_id|=10 ! do not draw
  6614.             ENDIF
  6615.           ENDIF
  6616.           DEC litem_work_family|
  6617.           image_put(4,fitem_to_sprite&(litem_work_family|,litem_work_id|,0,1))
  6618.           image_put(7,fitem_to_sprite&(litem_work_family|,litem_work_id|,0,0))
  6619.         ENDIF
  6620.       ENDIF
  6621.     ENDIF
  6622.     '
  6623.   CASE 11
  6624.     IF myself_position_n&>0
  6625.       maze_env_up&=@get_maze_design(PRED(myself_position_n&),myself_position_x&,myself_position_y&)
  6626.       fitem_up_ptr%=@get_fitem(PRED(myself_position_n&),myself_position_x&,myself_position_y&)
  6627.       '
  6628.       IF maze_env_up&=10 OR maze_env_up&=12
  6629.         image_put(4,75)
  6630.         image_put(7,74)
  6631.       ELSE IF fitem_up_ptr%>0
  6632.         get_tile_item(fitem_up_ptr%,dummy%,dummy&,litem_up_type|,litem_up_family|,litem_up_id|)
  6633.         IF litem_up_type|=0 AND litem_up_family|=3 AND (litem_up_id|=1 OR litem_up_id|=2)
  6634.           IF @get_byte(fitem_up_ptr%,offset_door_open_state&)>0
  6635.             image_put(4,75)
  6636.             image_put(7,74)
  6637.           ENDIF
  6638.         ENDIF
  6639.       ENDIF
  6640.     ENDIF
  6641.   CASE 10
  6642.     image_put(4,105)
  6643.     image_put(7,104)
  6644.   CASE 12
  6645.     image_put(4,147)
  6646.     image_put(7,146)
  6647.   CASE 2,3,4,5
  6648.     image_put(3,45)
  6649.     image_put(3,46)
  6650.   CASE 6,7,8,9
  6651.     image_put(4,69)
  6652.     image_put(7,68)
  6653.     image_put(4,71)
  6654.     image_put(7,70)
  6655.   ENDSELECT
  6656.   '
  6657. RETURN
  6658. '
  6659. > PROCEDURE gere_info
  6660.   SELECT OBJC_FIND(adtree%(1),0,1,mo_x&,mo_y&)
  6661.   CASE 11 ! call st-guide doc
  6662.     black_white(1,11,1)
  6663.     delai
  6664.     black_white(1,11,0)
  6665.     launch_help("")
  6666.   DEFAULT
  6667.     win(1)
  6668.   ENDSELECT
  6669. RETURN
  6670. '
  6671. > PROCEDURE gere_preferences
  6672.   SELECT OBJC_FIND(adtree%(5),0,2,mo_x&,mo_y&)
  6673.   CASE 1,2
  6674.     black_white(5,2,1)
  6675.     dummy$=@fileselector1$(10,LEFT$(folder_sav$,PRED(LEN(folder_sav$)))+"*"+extension_sav$,c0$)
  6676.     IF dummy$<>c0$ AND LEN(dummy$)>2
  6677.       folder_sav$=dummy$
  6678.       CHAR{{OB_SPEC(adtree%(5),2)}}=RIGHT$(folder_sav$,29)
  6679.     ENDIF
  6680.     black_white(5,2,0)
  6681.   CASE 3,4
  6682.     IF alert_confirm!
  6683.       black_white(5,3,0)
  6684.       alert_confirm!=FALSE
  6685.     ELSE
  6686.       black_white(5,3,1)
  6687.       alert_confirm!=TRUE
  6688.     ENDIF
  6689.   CASE 5,6
  6690.     IF snd_enabled!
  6691.       black_white(5,5,0)
  6692.       snd_enabled!=FALSE
  6693.       snd_exit
  6694.     ELSE
  6695.       black_white(5,5,1)
  6696.       snd_enabled!=TRUE
  6697.       snd_init
  6698.     ENDIF
  6699.   CASE 7,8
  6700.     IF background!
  6701.       black_white(5,7,0)
  6702.       background!=FALSE
  6703.       @remove_background
  6704.     ELSE
  6705.       black_white(5,7,1)
  6706.       background!=TRUE
  6707.       @set_background
  6708.     ENDIF
  6709.   CASE 9,10
  6710.     IF freeze_keyboard_buffer!
  6711.       black_white(5,9,0)
  6712.       freeze_keyboard_buffer!=FALSE
  6713.     ELSE
  6714.       black_white(5,9,1)
  6715.       freeze_keyboard_buffer!=TRUE
  6716.     ENDIF
  6717.   CASE 11,12
  6718.     IF keyboard_type&=1
  6719.       black_white(5,11,0)
  6720.       keyboard_type&=0
  6721.     ELSE
  6722.       black_white(5,11,1)
  6723.       keyboard_type&=1
  6724.     ENDIF
  6725.   CASE 15
  6726.     redraw_scale_view(1)
  6727.     allocate_scale_screen
  6728.   CASE 16
  6729.     redraw_scale_view(2)
  6730.     allocate_scale_screen
  6731.   CASE 17
  6732.     redraw_scale_view(3)
  6733.     allocate_scale_screen
  6734.   CASE 18
  6735.     black_white(5,18,1)
  6736.     delai
  6737.     launch_help(" dgem_preferences")
  6738.     black_white(5,18,0)
  6739.   CASE 19
  6740.     black_white(5,19,1)
  6741.     @save_preferences
  6742.     black_white(5,19,0)
  6743.   DEFAULT
  6744.     win(5)
  6745.   ENDSELECT
  6746. RETURN
  6747. > PROCEDURE load_preferences
  6748.   delete_preferences_buffer
  6749.   IF @s_exist(pathfile_inf$)=TRUE
  6750.     OPEN "i",#4,pathfile_inf$
  6751.     RECALL #4,preferences_buffer$(),-1,preferences_buffer_line%
  6752.     CLOSE #4
  6753.     IF preferences_buffer_line%>0 AND INSTR(preferences_buffer$(0),"DGEM_INF")>0
  6754.       folder_sav$=@preferences_find$("FOLDER_SAV")+c0$
  6755.       CHAR{{OB_SPEC(adtree%(5),2)}}=RIGHT$(folder_sav$,29)
  6756.       black_white(5,2,0)
  6757.       IF @preferences_find$("ALERT_CONFIRM")=boolean_to_text$(0)
  6758.         alert_confirm!=FALSE
  6759.         black_white(5,3,0)
  6760.       ELSE
  6761.         alert_confirm!=TRUE
  6762.         black_white(5,3,1)
  6763.       ENDIF
  6764.       IF @preferences_find$("FALCON_SOUND_ENABLED")=boolean_to_text$(1)
  6765.         snd_enabled!=TRUE
  6766.         black_white(5,5,1)
  6767.       ELSE
  6768.         snd_enabled!=FALSE
  6769.         black_white(5,5,0)
  6770.       ENDIF
  6771.       IF @preferences_find$("BACKGROUND")=boolean_to_text$(0)
  6772.         background!=FALSE
  6773.         black_white(5,7,0)
  6774.       ELSE
  6775.         background!=TRUE
  6776.         black_white(5,7,1)
  6777.         @set_background
  6778.       ENDIF
  6779.       IF @preferences_find$("FREEZE_KEYBOARD_BUFFER")=boolean_to_text$(1)
  6780.         freeze_keyboard_buffer!=TRUE
  6781.         black_white(5,9,1)
  6782.       ELSE
  6783.         freeze_keyboard_buffer!=FALSE
  6784.         black_white(5,9,0)
  6785.       ENDIF
  6786.       IF @preferences_find$("KEYBOARD_TYPE")="PC"
  6787.         keyboard_type&=1
  6788.         black_white(5,11,1)
  6789.       ELSE
  6790.         keyboard_type&=0
  6791.         black_white(5,11,0)
  6792.       ENDIF
  6793.       SELECT VAL(@preferences_find$("SCALE_VIEW"))
  6794.       CASE 2
  6795.         redraw_scale_view(2)
  6796.       CASE 3
  6797.         redraw_scale_view(3)
  6798.       DEFAULT
  6799.         redraw_scale_view(1)
  6800.       ENDSELECT
  6801.       IF NOT scale_view!
  6802.         redraw_scale_view(1)
  6803.       ENDIF
  6804.     ENDIF
  6805.   ENDIF
  6806.   delete_preferences_buffer
  6807. RETURN
  6808. > FUNCTION preferences_find$(find_key$)
  6809.   LOCAL len_find_key&,find_i%
  6810.   find_key$=find_key$+"="
  6811.   len_find_key&=LEN(find_key$)
  6812.   FOR find_i%=0 TO preferences_buffer_line%
  6813.     IF LEFT$(preferences_buffer$(find_i%),len_find_key&)=find_key$
  6814.       RETURN MID$(preferences_buffer$(find_i%),SUCC(len_find_key&))
  6815.     ENDIF
  6816.   NEXT find_i%
  6817.   RETURN ""
  6818. ENDFUNC
  6819. > PROCEDURE save_preferences
  6820.   mouse_disk
  6821.   '
  6822.   OPEN "o",#3,pathfile_inf$
  6823.   preferences_put("DGEM_INF",dgem_version$)
  6824.   preferences_put("#","")
  6825.   preferences_put("#","DO NOT MODIFY THESE VALUES!")
  6826.   preferences_put("#","")
  6827.   preferences_put("FOLDER_SAV",@remove_nullbyte$(folder_sav$))
  6828.   preferences_put("ALERT_CONFIRM",boolean_to_text$(ABS(alert_confirm!)))
  6829.   preferences_put("FALCON_SOUND_ENABLED",boolean_to_text$(ABS(snd_enabled!)))
  6830.   preferences_put("BACKGROUND",boolean_to_text$(ABS(background!)))
  6831.   preferences_put("FREEZE_KEYBOARD_BUFFER",boolean_to_text$(ABS(freeze_keyboard_buffer!)))
  6832.   preferences_put("KEYBOARD_TYPE",keyboard_type$(keyboard_type&))
  6833.   preferences_put("SCALE_VIEW",STR$(scale_view&))
  6834.   CLOSE #3
  6835.   '
  6836.   mouse_free
  6837. RETURN
  6838. > PROCEDURE delete_preferences_buffer
  6839.   FOR i&=0 TO 100
  6840.     preferences_buffer$(i&)=""
  6841.   NEXT i&
  6842.   ~FRE()
  6843.   ~FRE(0)
  6844. RETURN
  6845. > PROCEDURE preferences_put(put_key$,put_value$)
  6846.   PRINT #3,put_key$+"="+put_value$
  6847. RETURN
  6848. > PROCEDURE set_background
  6849.   ~WIND_SET(0,14,CARD(SWAP(adtree%(11))),CARD(adtree%(11)),0,0)
  6850.   ~FORM_DIAL(3,0,0,0,0,screenx&,screeny&,screenl&,screenh&)
  6851. RETURN
  6852. > PROCEDURE remove_background
  6853.   ~WIND_SET(0,14,0,0,0,0)
  6854.   ~FORM_DIAL(3,0,0,0,0,screenx&,screeny&,screenl&,screenh&)
  6855. RETURN
  6856. > PROCEDURE redraw_scale_view(pscale_view&)
  6857.   IF scale_view!
  6858.     '
  6859.     WHILE MUL(pscale_view&,MAX(coords_w&(0),img_w&(1)))>screenl&
  6860.       DEC pscale_view&
  6861.     WEND
  6862.     pscale_view&=MAX(1,pscale_view&)
  6863.     '
  6864.     IF pscale_view&<>scale_view&
  6865.       scale_view&=pscale_view&
  6866.       OB_STATE(adtree%(5),15)=BCLR(OB_STATE(adtree%(5),15),0)
  6867.       OB_STATE(adtree%(5),16)=BCLR(OB_STATE(adtree%(5),16),0)
  6868.       OB_STATE(adtree%(5),17)=BCLR(OB_STATE(adtree%(5),17),0)
  6869.       OB_STATE(adtree%(5),ADD(14,scale_view&))=BSET(OB_STATE(adtree%(5),ADD(15,scale_view&)),0)
  6870.       black_white(5,14,0)
  6871.     ENDIF
  6872.   ENDIF
  6873. RETURN
  6874. > PROCEDURE allocate_scale_screen
  6875.   LOCAL scale_temp&
  6876.   '
  6877.   IF LONG{scale_screen%}>0
  6878.     ~GEMDOS(73,L:LONG{scale_screen%})
  6879.     LONG{scale_screen%}=0
  6880.   ENDIF
  6881.   '
  6882.   IF scale_view&>1 AND scale_view!
  6883.     img_w&(2)=MUL(INT{ADD(offscreen%,4)},scale_view&)
  6884.     img_h&(2)=MUL(INT{ADD(offscreen%,6)},scale_view&)
  6885.     scale_temp&=SHR&(ADD(img_w&(2),15),4)
  6886.     '
  6887.     LONG{scale_screen%}=GEMDOS(72;L:ADD(MUL(MUL(img_h&(2),scale_temp&),SHL&(nb_plan&,1)),16))
  6888.     INT{ADD(scale_screen%,4)}=img_w&(2)
  6889.     INT{ADD(scale_screen%,6)}=img_h&(2)
  6890.     INT{ADD(scale_screen%,8)}=scale_temp&
  6891.     INT{ADD(scale_screen%,10)}=0
  6892.     INT{ADD(scale_screen%,12)}=INT{ADD(offscreen%,12)}
  6893.     INT{ADD(scale_screen%,14)}=0
  6894.     INT{ADD(scale_screen%,16)}=0
  6895.     INT{ADD(scale_screen%,18)}=0
  6896.   ELSE
  6897.     img_w&(2)=img_w&(1)
  6898.     img_h&(2)=img_h&(1)
  6899.   ENDIF
  6900.   '
  6901.   IF win!(0)
  6902.     ~WIND_GET(hand_win&(0),4,xd&(0),yd&(0),scale_temp&,dummy&)
  6903.     IF scale_temp&<>img_w&(2)
  6904.       IF scale_view&>1 AND scale_view!
  6905.         ld&(0)=img_w&(2)
  6906.         hd&(0)=img_h&(2)
  6907.       ELSE
  6908.         ld&(0)=img_w&(1)
  6909.         hd&(0)=img_h&(1)
  6910.       ENDIF
  6911.       ~WIND_CALC(0,cp_win&(0),xd&(0),yd&(0),ld&(0),hd&(0),wx&(0),wy&(0),wl&(0),wh&(0))
  6912.       ~WIND_SET(hand_win&(0),5,wx&(0),wy&(0),wl&(0),wh&(0))
  6913.     ENDIF
  6914.   ENDIF
  6915.   '
  6916.   redraw_view
  6917.   '
  6918. RETURN
  6919. '
  6920. > PROCEDURE launch_help(msg$)
  6921.   IF @s_exist(pathfile_hyp$)=TRUE
  6922.     guide_acc&=APPL_FIND("ST-GUIDE")
  6923.     IF (@s_exist(env_guide$)=TRUE AND env_guide$<>c0$) OR guide_acc&>0
  6924.       IF guide_acc&<0
  6925.         ferme_multi
  6926.         num_drive&=SUB(ASC(env_guide$),65)
  6927.         ~GEMDOS(14,W:num_drive&)
  6928.         CHDIR LEFT$(env_guide$,RINSTR(env_guide$,"\"))+c0$
  6929.       ENDIF
  6930.       IF multi!
  6931.         IF guide_acc&<0
  6932.           IF LEN(msg$)
  6933.             dummy$=LEFT$(pathfile_hyp$,PRED(LEN(pathfile_hyp$)))+msg$+c0$
  6934.             dummy$=CHR$(LEN(dummy$))+dummy$
  6935.           ELSE
  6936.             dummy$=CHR$(LEN(pathfile_hyp$))+pathfile_hyp$
  6937.           ENDIF
  6938.           shl_write(1,1,100,dummy$,env_guide$)
  6939.           FOR i&=0 TO 7
  6940.             delai
  6941.           NEXT i&
  6942.         ELSE
  6943.           call_help(msg$)
  6944.         ENDIF
  6945.       ELSE
  6946.         IF guide_acc&>0
  6947.           call_help(msg$)
  6948.         ELSE
  6949.           IF LEN(msg$)
  6950.             dummy$=LEFT$(pathfile_hyp$,PRED(LEN(pathfile_hyp$)))+msg$+c0$
  6951.             dummy$=CHR$(LEN(dummy$))+dummy$
  6952.           ELSE
  6953.             dummy$=CHR$(LEN(pathfile_hyp$))+pathfile_hyp$
  6954.           ENDIF
  6955.           ~EXEC(0,st_guide$,dummy$,c0$+c0$)
  6956.           mouse_free
  6957.         ENDIF
  6958.       ENDIF
  6959.       ouvre_multi
  6960.     ELSE
  6961.       ~@alert(1,2)
  6962.     ENDIF
  6963.   ELSE
  6964.     ~@alert(1,3)
  6965.   ENDIF
  6966. RETURN
  6967. > PROCEDURE call_help(msg$)
  6968.   IF t_buf%>0
  6969.     IF LEN(msg$)
  6970.       dummy$=LEFT$(pathfile_hyp$,PRED(LEN(pathfile_hyp$)))+msg$+c0$
  6971.     ELSE
  6972.       dummy$=pathfile_hyp$
  6973.     ENDIF
  6974.     CHAR{t_buf%}=LEFT$(dummy$,254)+c0$
  6975.     '
  6976.     clear_s
  6977.     INT{s_adr%}=18193
  6978.     INT{ADD(s_adr%,2)}=ap_id&
  6979.     LONG{ADD(s_adr%,6)}=t_buf%
  6980.     ~APPL_WRITE(guide_acc&,16,s_adr%)
  6981.     '
  6982.   ENDIF
  6983. RETURN
  6984. > PROCEDURE bubble(b_x&,b_y&,b_msg$)
  6985.   bubble_id&=APPL_FIND("BUBBLE  ")
  6986.   IF bubble_id&>0 AND bubble%>0
  6987.     CHAR{bubble%}=LEFT$(b_msg$,254)+c0$
  6988.     '
  6989.     clear_s
  6990.     INT{s_adr%}=47803
  6991.     INT{ADD(s_adr%,2)}=ap_id&
  6992.     INT{ADD(s_adr%,6)}=ADD(xf&,b_x&)
  6993.     INT{ADD(s_adr%,8)}=ADD(yf&,b_y&)
  6994.     LONG{ADD(s_adr%,10)}=bubble%
  6995.     ~APPL_WRITE(bubble_id&,16,s_adr%)
  6996.     '
  6997.     FOR de&=0 TO 10
  6998.       delai
  6999.     NEXT de&
  7000.     WHILE mo_c&=2
  7001.       ~GRAF_MKSTATE(dummy&,dummy&,mo_c&,dummy&)
  7002.     WEND
  7003.   ENDIF
  7004. RETURN
  7005. '
  7006. > PROCEDURE memory_fill(start_adr%,size%,pattern%)
  7007.   LOCAL filler_i%
  7008.   IF pattern%>0
  7009.     IF NOT EVEN(start_adr%)
  7010.       BYTE{start_adr%}=0
  7011.       INC start_adr%
  7012.       DEC size%
  7013.     ENDIF
  7014.     IF AND(size%,&HFF00)
  7015.       FOR filler_i%=1 TO SHR(size%,8)
  7016.         BMOVE pattern%,start_adr%,256
  7017.         ADD start_adr%,256
  7018.       NEXT filler_i%
  7019.     ENDIF
  7020.     BMOVE pattern%,start_adr%,AND(size%,&HFF)
  7021.   ENDIF
  7022. RETURN
  7023. > PROCEDURE prepare_memory_filler
  7024.   IF memory_pattern%>0
  7025.     ~GEMDOS(73,L:memory_pattern%)
  7026.   ENDIF
  7027.   memory_pattern%=GEMDOS(72;L:512)
  7028.   IF memory_pattern%>0
  7029.     FOR i&=0 TO 63
  7030.       LONG{ADD(memory_pattern%,SHL&(i&,2))}=0
  7031.     NEXT i&
  7032.     FOR i&=64 TO 127
  7033.       LONG{ADD(memory_pattern%,SHL&(i&,2))}=&X11111111111111111111111111111111
  7034.     NEXT i&
  7035.     memory_pattern_0%=memory_pattern%
  7036.     memory_pattern_1%=ADD(memory_pattern%,256)
  7037.   ELSE
  7038.     memory_pattern_0%=0
  7039.     memory_pattern_1%=0
  7040.   ENDIF
  7041. RETURN
  7042. '
  7043. > FUNCTION v_opnvwk
  7044.   $F&
  7045.   '
  7046.   INT{ADD(CONTRL,2)}=0
  7047.   INT{ADD(CONTRL,6)}=11
  7048.   INT{ADD(CONTRL,12)}=@graf_handle
  7049.   '
  7050.   INT{INTIN}=1           ! Numéro ID du périphérique physique (écran)
  7051.   INT{ADD(INTIN,2)}=1    ! Type de ligne
  7052.   INT{ADD(INTIN,4)}=1    ! Index de couleur Polyline
  7053.   INT{ADD(INTIN,6)}=1    ! Type de marqueur
  7054.   INT{ADD(INTIN,8)}=1    ! Index de couleur Polymarker
  7055.   INT{ADD(INTIN,10)}=1   ! Fonte de caractères
  7056.   INT{ADD(INTIN,12)}=1   ! Index couleur texte
  7057.   INT{ADD(INTIN,14)}=1   ! Fill interior Style
  7058.   INT{ADD(INTIN,16)}=1   ! Fill style index
  7059.   INT{ADD(INTIN,18)}=1   ! Fill index couleur
  7060.   INT{ADD(INTIN,20)}=2   ! Flag coordonnées NDC ou RC
  7061.   '
  7062.   VDISYS 100
  7063.   '
  7064.   RETURN INT{ADD(CONTRL,12)}
  7065.   '
  7066. ENDFUNC
  7067. > PROCEDURE v_clsvwk(vdi_handle0&)
  7068.   INT{ADD(CONTRL,12)}=vdi_handle0&
  7069.   VDISYS 101,0,0
  7070. RETURN
  7071. > FUNCTION graf_handle
  7072.   $F&
  7073.   '
  7074.   INT{ADD(GCONTRL,2)}=0
  7075.   INT{ADD(GCONTRL,4)}=5
  7076.   LONG{ADD(GCONTRL,6)}=0
  7077.   '
  7078.   GEMSYS 77
  7079.   '
  7080.   RETURN INT{GINTOUT}
  7081.   '
  7082. ENDFUNC
  7083. '
  7084. > PROCEDURE reset_mfdb(mfdb_z%)
  7085.   LONG{mfdb_z%}=0
  7086.   LONG{ADD(mfdb_z%,4)}=0
  7087.   LONG{ADD(mfdb_z%,8)}=0
  7088.   LONG{ADD(mfdb_z%,12)}=0
  7089.   LONG{ADD(mfdb_z%,16)}=0
  7090. RETURN
  7091. > FUNCTION trns_pix(trns_r|,trns_g|,trns_b|)
  7092.   $F%
  7093.   LOCAL trns_r$,trns_g$,trns_b$,td$
  7094.   ~FRE()
  7095.   ~FRE(0)
  7096.   '
  7097.   trns_dummy$=STRING$(nb_plan&,"0")
  7098.   '
  7099.   trns_r$=LEFT$(BIN$(trns_r|,8),nb_bit_r|)
  7100.   FOR trns_i|=1 TO nb_bit_r|
  7101.     MID$(trns_dummy$,bitorg_r|(trns_i|))=MID$(trns_r$,SUB(SUCC(nb_bit_r|),trns_i|),1)
  7102.   NEXT trns_i|
  7103.   '
  7104.   trns_g$=LEFT$(BIN$(trns_g|,8),nb_bit_g|)
  7105.   FOR trns_i|=1 TO nb_bit_g|
  7106.     MID$(trns_dummy$,bitorg_g|(trns_i|))=MID$(trns_g$,SUB(SUCC(nb_bit_g|),trns_i|),1)
  7107.   NEXT trns_i|
  7108.   '
  7109.   trns_b$=LEFT$(BIN$(trns_b|,8),nb_bit_b|)
  7110.   FOR trns_i|=1 TO nb_bit_b|
  7111.     MID$(trns_dummy$,bitorg_b|(trns_i|))=MID$(trns_b$,SUB(SUCC(nb_bit_b|),trns_i|),1)
  7112.   NEXT trns_i|
  7113.   '
  7114.   RETURN VAL("&X"+trns_dummy$)
  7115. ENDFUNC
  7116. > PROCEDURE trns_form(pscr_mfdb%,pdes_mfdb%)
  7117.   INT{ADD(CONTRL,12)}=vdi_handle&
  7118.   LONG{ADD(CONTRL,14)}=pscr_mfdb%
  7119.   LONG{ADD(CONTRL,18)}=pdes_mfdb%
  7120.   VDISYS 110,0,0
  7121. RETURN
  7122. > PROCEDURE image_put(mode&,pimg_id&)
  7123.   IF pimg_id&>0
  7124.     IF LONG{img_mfdb%(pimg_id&)}>0
  7125.       INT{mfdb_structure%}=img_dx&(pimg_id&)
  7126.       INT{ADD(mfdb_structure%,2)}=img_dy&(pimg_id&)
  7127.       INT{ADD(mfdb_structure%,4)}=ADD(img_dx&(pimg_id&),PRED(img_w&(pimg_id&)))
  7128.       INT{ADD(mfdb_structure%,6)}=ADD(img_dy&(pimg_id&),PRED(img_h&(pimg_id&)))
  7129.       INT{ADD(mfdb_structure%,8)}=img_x&(pimg_id&)
  7130.       INT{ADD(mfdb_structure%,10)}=img_y&(pimg_id&)
  7131.       INT{ADD(mfdb_structure%,12)}=ADD(img_x&(pimg_id&),PRED(img_w&(pimg_id&)))
  7132.       INT{ADD(mfdb_structure%,14)}=ADD(img_y&(pimg_id&),PRED(img_h&(pimg_id&)))
  7133.       '
  7134.       vro_cpyfm(mode&,img_mfdb%(pimg_id&),offscreen%)
  7135.     ELSE
  7136.       PRINT AT(2,3);"slot "+STR$(pimg_id&)+" no image!"
  7137.     ENDIF
  7138.   ENDIF
  7139. RETURN
  7140. > PROCEDURE image_put_door(ipd_fitem_ptr%,ipd_position&)
  7141.   LOCAL ipd_fitem_id|,ipd_state|,ipd_behavior|
  7142.   LOCAL ipd_img_src_id&,ipd_img_msk_id&
  7143.   LOCAL ipd_src1&,ipd_src2&,ipd_des1&,ipd_des2&
  7144.   '
  7145.   ipd_fitem_id|=@get_byte(ipd_fitem_ptr%,offset_item_id&)
  7146.   ipd_state|=MIN(MAX(0,@get_byte(ipd_fitem_ptr%,offset_door_open_state&)),4)
  7147.   ipd_behavior|=MIN(MAX(0,@get_byte(ipd_fitem_ptr%,offset_door_behavior&)),1)
  7148.   '
  7149.   IF ipd_state|<4 AND ipd_position&>2
  7150.     ipd_src1&=door_coords_src1&(SUB(ipd_position&,3),ipd_behavior|,ipd_state|)
  7151.     ipd_src2&=door_coords_src2&(SUB(ipd_position&,3),ipd_behavior|,ipd_state|)
  7152.     ipd_des1&=door_coords_des1&(SUB(ipd_position&,3),ipd_behavior|,ipd_state|)
  7153.     ipd_des2&=door_coords_des2&(SUB(ipd_position&,3),ipd_behavior|,ipd_state|)
  7154.   ELSE
  7155.     ipd_src1&=0
  7156.     ipd_src2&=0
  7157.     ipd_des1&=0
  7158.     ipd_des2&=0
  7159.   ENDIF
  7160.   '
  7161.   ipd_img_src_id&=fitem_to_sprite&(2,ipd_fitem_id|,ipd_position&,0)
  7162.   ipd_img_msk_id&=fitem_to_sprite&(2,ipd_fitem_id|,ipd_position&,1)
  7163.   '
  7164.   IF ipd_state|<4
  7165.     IF ipd_fitem_id|=16 OR ipd_fitem_id|=17 ! animate ra door
  7166.       IF EVEN(LONG{job_animation%})
  7167.         ADD ipd_img_src_id&,2
  7168.         ADD ipd_img_msk_id&,2
  7169.       ENDIF
  7170.       redraw_for_animation!=TRUE
  7171.     ENDIF
  7172.   ENDIF
  7173.   '
  7174.   IF ipd_src1&>0
  7175.     image_put_door_next(ipd_img_src_id&,ipd_img_msk_id&,ipd_src1&,ipd_des1&)
  7176.   ENDIF
  7177.   IF ipd_src2&>0
  7178.     image_put_door_next(ipd_img_src_id&,ipd_img_msk_id&,ipd_src2&,ipd_des2&)
  7179.   ENDIF
  7180.   '
  7181. RETURN
  7182. > PROCEDURE image_put_door_next(ipdn_img_src_id&,ipdn_img_msk_id&,ipdn_src&,ipdn_des&)
  7183.   '
  7184.   INT{mfdb_structure%}=coords_x&(ipdn_src&)
  7185.   INT{ADD(mfdb_structure%,2)}=coords_y&(ipdn_src&)
  7186.   INT{ADD(mfdb_structure%,4)}=ADD(coords_x&(ipdn_src&),PRED(coords_w&(ipdn_src&)))
  7187.   INT{ADD(mfdb_structure%,6)}=ADD(coords_y&(ipdn_src&),PRED(coords_h&(ipdn_src&)))
  7188.   '
  7189.   INT{ADD(mfdb_structure%,8)}=coords_x&(ipdn_des&)
  7190.   INT{ADD(mfdb_structure%,10)}=coords_y&(ipdn_des&)
  7191.   INT{ADD(mfdb_structure%,12)}=ADD(coords_x&(ipdn_des&),PRED(coords_w&(ipdn_des&)))
  7192.   INT{ADD(mfdb_structure%,14)}=ADD(coords_y&(ipdn_des&),PRED(coords_h&(ipdn_des&)))
  7193.   '
  7194.   IF ipdn_img_msk_id&>0
  7195.     IF LONG{img_mfdb%(ipdn_img_src_id&)}>0 AND LONG{img_mfdb%(ipdn_img_msk_id&)}>0
  7196.       vro_cpyfm(4,img_mfdb%(ipdn_img_msk_id&),offscreen%)
  7197.       vro_cpyfm(7,img_mfdb%(ipdn_img_src_id&),offscreen%)
  7198.     ELSE
  7199.       PRINT AT(2,3);"slot "+STR$(ipdn_img_src_id&)+","+STR$(ipdn_img_msk_id&)+" no image!"
  7200.     ENDIF
  7201.   ELSE IF ipdn_img_src_id&>0
  7202.     IF LONG{img_mfdb%(ipdn_img_src_id&)}>0
  7203.       vro_cpyfm(3,img_mfdb%(ipdn_img_src_id&),offscreen%)
  7204.     ELSE
  7205.       PRINT AT(2,3);"slot "+STR$(ipdn_img_src_id&)+" no image!"
  7206.     ENDIF
  7207.   ENDIF
  7208. RETURN
  7209. > PROCEDURE image_put_wall_inscription(ipwi_witem_ptr%,ipwi_position&)
  7210.   LOCAL ipwi_adr%,ipwi_line&,ipwi_img_src_id&,ipwi_img_msk_id&,ipwi_n&
  7211.   LOCAL ipwi_i&,ipwi_j&,ipwi_x&,ipwi_y&
  7212.   '
  7213.   ipwi_adr%=@get_long(ipwi_witem_ptr%,offset_inscription_ptr&)
  7214.   IF ipwi_adr%>0
  7215.     wall_inscription$(0)=LEFT$(CHAR{ipwi_adr%},12)
  7216.     wall_inscription_len&(0)=LEN(wall_inscription$(0))
  7217.     wall_inscription$(1)=LEFT$(CHAR{ADD(ipwi_adr%,14)},12)
  7218.     wall_inscription_len&(1)=LEN(wall_inscription$(1))
  7219.     wall_inscription$(2)=LEFT$(CHAR{ADD(ipwi_adr%,28)},10)
  7220.     wall_inscription_len&(2)=LEN(wall_inscription$(2))
  7221.     wall_inscription$(3)=LEFT$(CHAR{ADD(ipwi_adr%,40)},10)
  7222.     wall_inscription_len&(3)=LEN(wall_inscription$(3))
  7223.     FOR ipwi_i&=0 TO 3
  7224.       EXIT IF wall_inscription_len&(ipwi_i&)=0
  7225.     NEXT ipwi_i&
  7226.     ipwi_n&=MIN(4,ipwi_i&)
  7227.   ENDIF
  7228.   '
  7229.   IF ipwi_position&>0
  7230.     '
  7231.     IF ipwi_n&=1
  7232.       ipwi_img_src_id&=witem_to_sprite&(2,1,ipwi_position&,0)
  7233.       ipwi_img_msk_id&=witem_to_sprite&(2,1,ipwi_position&,1)
  7234.     ELSE
  7235.       ipwi_img_src_id&=witem_to_sprite&(2,0,ipwi_position&,0)
  7236.       ipwi_img_msk_id&=witem_to_sprite&(2,0,ipwi_position&,1)
  7237.     ENDIF
  7238.     '
  7239.     SELECT ipwi_n&
  7240.     CASE 1
  7241.       image_put_wall_inscription_next(ipwi_img_src_id&,ipwi_img_msk_id&,coords_x&(ipwi_select&(ipwi_position&)))
  7242.     CASE 2
  7243.       image_put_wall_inscription_next(ipwi_img_src_id&,ipwi_img_msk_id&,coords_y&(ipwi_select&(ipwi_position&)))
  7244.     CASE 3
  7245.       image_put_wall_inscription_next(ipwi_img_src_id&,ipwi_img_msk_id&,coords_w&(ipwi_select&(ipwi_position&)))
  7246.     CASE 4
  7247.       image_put_wall_inscription_next(ipwi_img_src_id&,ipwi_img_msk_id&,coords_h&(ipwi_select&(ipwi_position&)))
  7248.     ENDSELECT
  7249.     '
  7250.   ELSE IF ipwi_n&>0
  7251.     '
  7252.     image_put(3,1008)
  7253.     '
  7254.     INT{mfdb_structure%}=0
  7255.     INT{ADD(mfdb_structure%,2)}=0
  7256.     INT{ADD(mfdb_structure%,4)}=PRED(img_w&(1033))
  7257.     INT{ADD(mfdb_structure%,6)}=PRED(img_h&(1033))
  7258.     '
  7259.     FOR ipwi_i&=0 TO PRED(ipwi_n&)
  7260.       IF wall_inscription_len&(ipwi_i&)>0
  7261.         ipwi_x&=SHR&(SUB(coords_w&(0),MUL(img_w&(1033),wall_inscription_len&(ipwi_i&))),1)
  7262.         ipwi_y&=img_y&(1033)
  7263.         SELECT ipwi_i&
  7264.         CASE 0
  7265.           ADD ipwi_y&,coords_x&(ipwi_select&(0))
  7266.         CASE 1
  7267.           ADD ipwi_y&,coords_y&(ipwi_select&(0))
  7268.         CASE 2
  7269.           ADD ipwi_y&,coords_w&(ipwi_select&(0))
  7270.         CASE 3
  7271.           ADD ipwi_y&,coords_h&(ipwi_select&(0))
  7272.         ENDSELECT
  7273.         '
  7274.         FOR ipwi_j&=1 TO wall_inscription_len&(ipwi_i&)
  7275.           ipwi_char|=SUB(ASC(MID$(wall_inscription$(ipwi_i&),ipwi_j&,1)),65)
  7276.           image_put_wall_inscription_char(ipwi_char|,ipwi_x&,ipwi_y&)
  7277.           ADD ipwi_x&,img_w&(1033)
  7278.         NEXT ipwi_j&
  7279.       ENDIF
  7280.     NEXT ipwi_i&
  7281.   ENDIF
  7282.   '
  7283. RETURN
  7284. > PROCEDURE image_put_wall_inscription_next(ipwin_img_src_id&,ipwin_img_msk_id&,ipwin_h&)
  7285.   '
  7286.   INT{mfdb_structure%}=img_dx&(ipwin_img_src_id&)
  7287.   INT{ADD(mfdb_structure%,2)}=img_dy&(ipwin_img_src_id&)
  7288.   INT{ADD(mfdb_structure%,4)}=ADD(img_dx&(ipwin_img_src_id&),PRED(img_w&(ipwin_img_src_id&)))
  7289.   INT{ADD(mfdb_structure%,6)}=ADD(img_dy&(ipwin_img_src_id&),PRED(ipwin_h&))
  7290.   '
  7291.   INT{ADD(mfdb_structure%,8)}=img_x&(ipwin_img_src_id&)
  7292.   INT{ADD(mfdb_structure%,10)}=img_y&(ipwin_img_src_id&)
  7293.   INT{ADD(mfdb_structure%,12)}=ADD(img_x&(ipwin_img_src_id&),PRED(img_w&(ipwin_img_src_id&)))
  7294.   INT{ADD(mfdb_structure%,14)}=ADD(img_y&(ipwin_img_src_id&),PRED(ipwin_h&))
  7295.   '
  7296.   IF LONG{img_mfdb%(ipwin_img_src_id&)}>0 AND LONG{img_mfdb%(ipwin_img_msk_id&)}>0
  7297.     vro_cpyfm(4,img_mfdb%(ipwin_img_msk_id&),offscreen%)
  7298.     vro_cpyfm(7,img_mfdb%(ipwin_img_src_id&),offscreen%)
  7299.   ELSE
  7300.     PRINT AT(2,3);"slot "+STR$(ipwin_img_src_id&)+","+STR$(ipwin_img_msk_id&)+" no images!"
  7301.   ENDIF
  7302.   '
  7303. RETURN
  7304. > PROCEDURE image_put_wall_inscription_char(ipwic_char|,ipwic_x&,ipwic_y&)
  7305.   LOCAL ipwic_img_id&
  7306.   '
  7307.   IF ipwic_char|>-1 AND ipwic_char|<26
  7308.     ipwic_img_id&=ADD(MUL(ipwic_char|,2),1033)
  7309.     '
  7310.     INT{ADD(mfdb_structure%,8)}=ipwic_x&
  7311.     INT{ADD(mfdb_structure%,10)}=ipwic_y&
  7312.     INT{ADD(mfdb_structure%,12)}=ADD(ipwic_x&,PRED(img_w&(1033)))
  7313.     INT{ADD(mfdb_structure%,14)}=ADD(ipwic_y&,PRED(img_h&(1033)))
  7314.     '
  7315.     IF LONG{img_mfdb%(ipwic_img_id&)}>0 AND LONG{img_mfdb%(SUCC(ipwic_img_id&))}>0
  7316.       vro_cpyfm(4,img_mfdb%(SUCC(ipwic_img_id&)),offscreen%)
  7317.       vro_cpyfm(7,img_mfdb%(ipwic_img_id&),offscreen%)
  7318.     ELSE
  7319.       PRINT AT(2,3);"slot "+STR$(ipwic_img_id&)+" no letter!"
  7320.     ENDIF
  7321.   ENDIF
  7322.   '
  7323. RETURN
  7324. > PROCEDURE set_pxy(xq0&,yq0&,xq1&,yq1&,xz0&,yz0&,xz1&,yz1&)
  7325.   INT{mfdb_structure%}=xq0&
  7326.   INT{ADD(mfdb_structure%,2)}=yq0&
  7327.   INT{ADD(mfdb_structure%,4)}=xq1&
  7328.   INT{ADD(mfdb_structure%,6)}=yq1&
  7329.   INT{ADD(mfdb_structure%,8)}=xz0&
  7330.   INT{ADD(mfdb_structure%,10)}=yz0&
  7331.   INT{ADD(mfdb_structure%,12)}=xz1&
  7332.   INT{ADD(mfdb_structure%,14)}=yz1&
  7333. RETURN
  7334. > PROCEDURE vro_cpyfm(wr_mode&,pscr_mfdb%,pdes_mfdb%)
  7335.   '
  7336.   INT{ADD(CONTRL,12)}=vdi_handle&
  7337.   LONG{ADD(CONTRL,14)}=pscr_mfdb%
  7338.   LONG{ADD(CONTRL,18)}=pdes_mfdb%
  7339.   INT{INTIN}=wr_mode&
  7340.   BMOVE mfdb_structure%,PTSIN,16
  7341.   '
  7342.   VDISYS 109,1,4
  7343.   '
  7344. RETURN
  7345. > PROCEDURE vs_color(color_adr%)
  7346.   SELECT nb_plan&
  7347.   CASE 4
  7348.     col_dummy&=15
  7349.   CASE 8
  7350.     col_dummy&=255
  7351.   DEFAULT
  7352.     col_dummy&=0
  7353.   ENDSELECT
  7354.   IF col_dummy&>0
  7355.     IF color_adr%<>old_color_adr%
  7356.       old_color_adr%=color_adr%
  7357.       FOR col_i&=0 TO col_dummy&
  7358.         INT{ADD(CONTRL,12)}=vdi_handle&
  7359.         INT{INTIN}=col_i&
  7360.         col_j&=MUL(col_i&,6)
  7361.         INT{ADD(INTIN,2)}=WORD{ADD(color_adr%,col_j&)}
  7362.         INT{ADD(INTIN,4)}=WORD{ADD(ADD(color_adr%,2),col_j&)}
  7363.         INT{ADD(INTIN,6)}=WORD{ADD(ADD(color_adr%,4),col_j&)}
  7364.         VDISYS 14,4,0
  7365.       NEXT col_i&
  7366.     ENDIF
  7367.   ENDIF
  7368. RETURN
  7369. > PROCEDURE vq_color(color_adr%)
  7370.   SELECT nb_plan&
  7371.   CASE 4
  7372.     col_dummy&=15
  7373.   CASE 8
  7374.     col_dummy&=255
  7375.   DEFAULT
  7376.     col_dummy&=0
  7377.   ENDSELECT
  7378.   IF col_dummy&>0
  7379.     FOR col_i&=0 TO col_dummy&
  7380.       INT{ADD(CONTRL,12)}=vdi_handle&
  7381.       INT{INTIN}=col_i&
  7382.       INT{ADD(INTIN,2)}=1
  7383.       VDISYS 26,2,0
  7384.       col_j&=MUL(col_i&,6)
  7385.       INT{ADD(color_adr%,col_j&)}=INT{ADD(INTOUT,2)}
  7386.       INT{ADD(ADD(color_adr%,2),col_j&)}=INT{ADD(INTOUT,4)}
  7387.       INT{ADD(ADD(color_adr%,4),col_j&)}=INT{ADD(INTOUT,6)}
  7388.     NEXT col_i&
  7389.   ENDIF
  7390. RETURN
  7391. '
  7392. > PROCEDURE snd_init
  7393.   LOCAL snd_value%
  7394.   '
  7395.   snd_capable!=FALSE
  7396.   IF @test_cookie("_SND",snd_value%)
  7397.     IF BTST(snd_value%,1) OR BTST(snd_value%,2)
  7398.       snd_capable!=TRUE
  7399.     ELSE
  7400.       snd_capable!=FALSE
  7401.     ENDIF
  7402.   ELSE IF @test_cookie("McSn",snd_value%)
  7403.     snd_capable!=TRUE
  7404.   ELSE
  7405.     snd_capable!=FALSE
  7406.   ENDIF
  7407.   '
  7408.   snd_active!=FALSE
  7409.   IF snd_enabled! AND snd_capable!
  7410.     IF @locksnd=0
  7411.       IF snd_locked!
  7412.         snd_active!=TRUE
  7413.       ELSE
  7414.         IF @alert(1,33)=1
  7415.           snd_active!=TRUE
  7416.         ENDIF
  7417.       ENDIF
  7418.     ELSE
  7419.       snd_active!=TRUE
  7420.     ENDIF
  7421.   ENDIF
  7422.   '
  7423.   IF snd_active!
  7424.     ~@unlocksnd
  7425.     ~@locksnd
  7426.     snd_locked!=TRUE
  7427.     '
  7428.     ~@sndstatus(1)
  7429.     ~@devconnect(0,8,0,7,1)
  7430.     ~@soundcmd(0,0)
  7431.     ~@soundcmd(1,0)
  7432.     ~@setmode(0)
  7433.     '
  7434.     IF @test_cookie("_SND",snd_value%)
  7435.       IF BTST(snd_value%,4)
  7436.         ~@soundcmd(4,2)
  7437.       ENDIF
  7438.     ENDIF
  7439.   ENDIF
  7440. RETURN
  7441. > PROCEDURE snd_exit
  7442.   IF snd_active! AND snd_locked!
  7443.     snd_stop
  7444.     ~@unlocksnd
  7445.     snd_locked!=FALSE
  7446.     snd_active!=FALSE
  7447.   ENDIF
  7448. RETURN
  7449. > PROCEDURE snd_play(psnd_id&,repeat!,psnd_x&,psnd_y&)
  7450.   IF snd_active!
  7451.     ~@buffoper(0)
  7452.     ~@setbuffer(0,snd_start%(psnd_id&),snd_end%(psnd_id&))
  7453.     snd_x&=psnd_x&
  7454.     snd_y&=psnd_y&
  7455.     snd_relocate
  7456.     IF repeat!
  7457.       ~@buffoper(3)
  7458.     ELSE
  7459.       ~@buffoper(1)
  7460.     ENDIF
  7461.   ENDIF
  7462. RETURN
  7463. > PROCEDURE snd_stop
  7464.   IF snd_active!
  7465.     ~@buffoper(0)
  7466.     snd_x&=-1
  7467.     snd_y&=-1
  7468.   ENDIF
  7469. RETURN
  7470. > PROCEDURE snd_relocate
  7471.   IF snd_active!
  7472.     IF snd_x&>-1 AND snd_y&>-1
  7473.       SELECT myself_direction&
  7474.       CASE 1
  7475.         snd_left_w&=SUB(snd_x&,PRED(myself_position_x&))
  7476.         snd_left_h&=SUB(snd_y&,myself_position_y&)
  7477.         snd_right_w&=SUB(snd_x&,SUCC(myself_position_x&))
  7478.         snd_right_h&=SUB(snd_y&,myself_position_y&)
  7479.       CASE 2
  7480.         snd_left_w&=SUB(snd_x&,SUCC(myself_position_x&))
  7481.         snd_left_h&=SUB(snd_y&,myself_position_y&)
  7482.         snd_right_w&=SUB(snd_x&,PRED(myself_position_x&))
  7483.         snd_right_h&=SUB(snd_y&,myself_position_y&)
  7484.       CASE 3
  7485.         snd_left_w&=SUB(snd_x&,myself_position_x&)
  7486.         snd_left_h&=SUB(snd_y&,PRED(myself_position_y&))
  7487.         snd_right_w&=SUB(snd_x&,myself_position_x&)
  7488.         snd_right_h&=SUB(snd_y&,SUCC(myself_position_y&))
  7489.       CASE 4
  7490.         snd_left_w&=SUB(snd_x&,myself_position_x&)
  7491.         snd_left_h&=SUB(snd_y&,SUCC(myself_position_y&))
  7492.         snd_right_w&=SUB(snd_x&,myself_position_x&)
  7493.         snd_right_h&=SUB(snd_y&,PRED(myself_position_y&))
  7494.       ENDSELECT
  7495.       snd_left_d|=MAX(0,MIN(INT(ADD(MUL(snd_left_w&,snd_left_w&),MUL(snd_left_h&,snd_left_h&))),15))
  7496.       snd_right_d|=MAX(0,MIN(INT(ADD(MUL(snd_right_w&,snd_right_w&),MUL(snd_right_h&,snd_right_h&))),15))
  7497.       IF snd_left_d|<snd_right_d|
  7498.         snd_right_d|=MIN(ADD(2,snd_right_d|),15)
  7499.       ENDIF
  7500.       IF snd_left_d|>snd_right_d|
  7501.         snd_left_d|=MIN(ADD(2,snd_left_d|),15)
  7502.       ENDIF
  7503.       ~@soundcmd(0,SHL&(snd_left_d|,4))
  7504.       ~@soundcmd(1,SHL&(snd_right_d|,4))
  7505.     ENDIF
  7506.   ENDIF
  7507. RETURN
  7508. '
  7509. > FUNCTION create_tile_containor(p_tc_n&,p_tc_x&,p_tc_y&)
  7510.   $F%
  7511.   LOCAL tmp_tc_adr%
  7512.   '
  7513.   tmp_tc_adr%=@garbage_look(1,16)
  7514.   IF tmp_tc_adr%=0
  7515.     tmp_tc_adr%=@gxalloc(1,16)
  7516.   ENDIF
  7517.   IF tmp_tc_adr%>0
  7518.     set_tile_containor(tmp_tc_adr%,p_tc_n&,p_tc_x&,p_tc_y&)
  7519.     set_tile_pointers(tmp_tc_adr%,0,0,0,0)
  7520.     RETURN tmp_tc_adr%
  7521.   ENDIF
  7522.   RETURN 0
  7523. ENDFUNC
  7524. > PROCEDURE delete_tile_containor(p_tc_n&,p_tc_x&,p_tc_y&)
  7525.   LOCAL tmp_tc_adr%,tmp_tc_n%,tmp_tc_s%,tmp_tc_e%,tmp_tc_w%
  7526.   '
  7527.   tmp_tc_adr%=@get_tile_containor(p_tc_n&,p_tc_x&,p_tc_y&)
  7528.   IF tmp_tc_adr%>0
  7529.     FOR tmp_tc_i&=0 TO 12 STEP 4
  7530.       WHILE LONG{ADD(tmp_tc_adr%,tmp_tc_i&)}>0
  7531.         @remove_next_tile_item(ADD(tmp_tc_adr%,tmp_tc_i&))
  7532.       WEND
  7533.     NEXT tmp_tc_i&
  7534.     set_tile_pointers(tmp_tc_adr%,0,0,0,0)
  7535.     set_tile_containor(0,p_tc_n&,p_tc_x&,p_tc_y&)
  7536.     ~@garbage_insert(1,16,tmp_tc_adr%)
  7537.   ENDIF
  7538.   '
  7539. RETURN
  7540. > FUNCTION get_tile_containor(p_tc_n&,p_tc_x&,p_tc_y&)
  7541.   $F%
  7542.   IF p_tc_x&>-1 AND p_tc_x&<maze_width&
  7543.     IF p_tc_y&>-1 AND p_tc_y&<maze_height&
  7544.       RETURN LONG{ADD(litem_array_level_adr%(p_tc_n&),SHL(ADD(MUL(p_tc_y&,maze_width&),p_tc_x&),2))}
  7545.     ELSE
  7546.       RETURN 0
  7547.     ENDIF
  7548.   ELSE
  7549.     RETURN 0
  7550.   ENDIF
  7551. ENDFUNC
  7552. > PROCEDURE set_tile_containor(p_tc_adr%,p_tc_n&,p_tc_x&,p_tc_y&)
  7553.   LONG{ADD(litem_array_level_adr%(p_tc_n&),SHL(ADD(MUL(p_tc_y&,maze_width&),p_tc_x&),2))}=p_tc_adr%
  7554. RETURN
  7555. > PROCEDURE get_tile_pointers(p_tc_adr%,VAR tc_n%,tc_s%,tc_e%,tc_w%)
  7556.   tc_n%=LONG{p_tc_adr%}
  7557.   tc_s%=LONG{ADD(p_tc_adr%,4)}
  7558.   tc_e%=LONG{ADD(p_tc_adr%,8)}
  7559.   tc_w%=LONG{ADD(p_tc_adr%,12)}
  7560. RETURN
  7561. > PROCEDURE set_tile_pointers(p_tc_adr%,p_tc_n%,p_tc_s%,p_tc_e%,p_tc_w%)
  7562.   LONG{p_tc_adr%}=p_tc_n%
  7563.   LONG{ADD(p_tc_adr%,4)}=p_tc_s%
  7564.   LONG{ADD(p_tc_adr%,8)}=p_tc_e%
  7565.   LONG{ADD(p_tc_adr%,12)}=p_tc_w%
  7566. RETURN
  7567. '
  7568. > FUNCTION add_tile_item(p_tc_adr%,p_ti_direction|,p_ti_len%,p_ti_type|,p_ti_family|,p_ti_id|)
  7569.   $F%
  7570.   LOCAL tmp_ti_adr%,tmp_ti_ptr%,tmp_ti_ptr2%
  7571.   '
  7572.   ADD p_ti_len%,6
  7573.   tmp_ti_adr%=@garbage_look(1,p_ti_len%)
  7574.   IF tmp_ti_adr%=0
  7575.     tmp_ti_adr%=@gxalloc(1,p_ti_len%)
  7576.   ENDIF
  7577.   IF tmp_ti_adr%>0
  7578.     '
  7579.     tmp_ti_ptr%=ADD(p_tc_adr%,MUL(PRED(p_ti_direction|),4))
  7580.     DO
  7581.       tmp_ti_ptr2%=LONG{tmp_ti_ptr%}
  7582.       EXIT IF tmp_ti_ptr2%=0
  7583.       tmp_ti_ptr%=tmp_ti_ptr2%
  7584.     LOOP
  7585.     '
  7586.     LONG{tmp_ti_ptr%}=tmp_ti_adr%
  7587.     LONG{tmp_ti_adr%}=0                     ! next item pointer
  7588.     INT{ADD(tmp_ti_adr%,4)}=CARD(p_ti_len%) ! length of structure
  7589.     BYTE{ADD(tmp_ti_adr%,6)}=p_ti_type|     ! type
  7590.     BYTE{ADD(tmp_ti_adr%,7)}=p_ti_family|   ! family
  7591.     BYTE{ADD(tmp_ti_adr%,8)}=p_ti_id|       ! identidy
  7592.     '
  7593.     RETURN tmp_ti_adr%
  7594.   ENDIF
  7595.   RETURN 0
  7596. ENDFUNC
  7597. > PROCEDURE remove_next_tile_item(p_ti_adr%)
  7598.   LOCAL tmp_ti_ptr%,tmp_ti_adr%,tmp_ti_len&,tmp_cpt_i&
  7599.   '
  7600.   tmp_ti_ptr%=LONG{p_ti_adr%}
  7601.   '
  7602.   IF tmp_ti_ptr%>0
  7603.     get_tile_item(tmp_ti_ptr%,tmp_ti_adr%,tmp_ti_len&,dummy|,dummy|,dummy|)
  7604.     IF tmp_ti_len&>0
  7605.       SUB tmp_ti_len&,2
  7606.       FOR tmp_cpt_i&=0 TO tmp_ti_len& STEP 2
  7607.         INT{ADD(tmp_ti_ptr%,tmp_cpt_i&)}=0
  7608.       NEXT tmp_cpt_i&
  7609.       ~@garbage_insert(1,ADD(tmp_ti_len&,2),tmp_ti_ptr%)
  7610.     ENDIF
  7611.   ENDIF
  7612.   '
  7613.   IF tmp_ti_adr%>0
  7614.     LONG{p_ti_adr%}=tmp_ti_adr%
  7615.   ELSE
  7616.     LONG{p_ti_adr%}=0
  7617.   ENDIF
  7618. RETURN
  7619. > PROCEDURE swap_next_tile_items(p_ti_adr%)
  7620.   LOCAL tmp_ti_adr1%,tmp_ti_adr2%,tmp_ti_adr3%
  7621.   '
  7622.   tmp_ti_adr1%=LONG{p_ti_adr%}
  7623.   IF tmp_ti_adr1%>0
  7624.     tmp_ti_adr2%=LONG{tmp_ti_adr1%}
  7625.     IF tmp_ti_adr2%>0
  7626.       tmp_ti_adr3%=LONG{tmp_ti_adr2%}
  7627.       '
  7628.       LONG{p_ti_adr%}=tmp_ti_adr2%
  7629.       LONG{tmp_ti_adr2%}=tmp_ti_adr1%
  7630.       LONG{tmp_ti_adr1%}=tmp_ti_adr3%
  7631.       '
  7632.     ENDIF
  7633.   ENDIF
  7634.   '
  7635. RETURN
  7636. > PROCEDURE get_tile_item(p_ti_adr%,VAR r_ti_adr%,r_ti_len&,r_ti_type|,r_ti_family|,r_ti_id|)
  7637.   IF p_ti_adr%>0
  7638.     r_ti_adr%=LONG{p_ti_adr%}
  7639.     r_ti_len&=INT{ADD(p_ti_adr%,4)}
  7640.     r_ti_type|=BYTE{ADD(p_ti_adr%,6)}
  7641.     r_ti_family|=BYTE{ADD(p_ti_adr%,7)}
  7642.     r_ti_id|=BYTE{ADD(p_ti_adr%,8)}
  7643.   ELSE
  7644.     r_ti_adr%=0
  7645.     r_ti_len&=0
  7646.     r_ti_type|=0
  7647.     r_ti_family|=0
  7648.     r_ti_id|=0
  7649.   ENDIF
  7650. RETURN
  7651. > FUNCTION litem_find_direction(p_slot_n%,p_slot_s%,p_slot_e%,p_slot_w%)
  7652.   $F|
  7653.   IF p_slot_s%>0
  7654.     RETURN 2
  7655.   ELSE IF p_slot_e%>0
  7656.     RETURN 3
  7657.   ELSE IF p_slot_w%>0
  7658.     RETURN 4
  7659.   ENDIF
  7660.   RETURN 1
  7661. ENDFUNC
  7662. > FUNCTION litem_find_first_item(p_slot_n%,p_slot_s%,p_slot_e%,p_slot_w%)
  7663.   $F%
  7664.   IF p_slot_s%>0
  7665.     RETURN p_slot_s%
  7666.   ELSE IF p_slot_e%>0
  7667.     RETURN p_slot_e%
  7668.   ELSE IF p_slot_w%>0
  7669.     RETURN p_slot_w%
  7670.   ENDIF
  7671.   RETURN p_slot_n%
  7672. ENDFUNC
  7673. > FUNCTION get_byte(p_ti_adr%,p_ti_offset&)
  7674.   $F|
  7675.   RETURN BYTE{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}
  7676. ENDFUNC
  7677. > FUNCTION get_int(p_ti_adr%,p_ti_offset&)
  7678.   $F&
  7679.   RETURN INT{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}
  7680. ENDFUNC
  7681. > FUNCTION get_long(p_ti_adr%,p_ti_offset&)
  7682.   $F%
  7683.   RETURN LONG{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}
  7684. ENDFUNC
  7685. > PROCEDURE set_byte(p_ti_adr%,p_ti_offset&,p_byte|)
  7686.   BYTE{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}=p_byte|
  7687. RETURN
  7688. > PROCEDURE set_int(p_ti_adr%,p_ti_offset&,p_int&)
  7689.   INT{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}=p_int&
  7690. RETURN
  7691. > PROCEDURE set_long(p_ti_adr%,p_ti_offset&,p_long%)
  7692.   LONG{ADD(ADD(p_ti_adr%,6),p_ti_offset&)}=p_long%
  7693. RETURN
  7694. '
  7695. > PROCEDURE execute_jobs
  7696.   LOCAL ej_ptr%,ej_type&,ej_delay&,ej_value%
  7697.   LOCAL ej_litem_t|,ej_litem_f|,ej_litem_i|,ej_litem_s|
  7698.   LOCAL ej_prev_ptr%,ej_next_ptr%,ej_autokill!
  7699.   '
  7700.   ej_ptr%=job_list_adr%
  7701.   ej_prev_ptr%=0
  7702.   ej_next_ptr%=0
  7703.   '
  7704.   WHILE ej_ptr%>0
  7705.     ej_autokill!=FALSE
  7706.     ej_type&=INT{ADD(ej_ptr%,6)}
  7707.     ej_delay&=INT{ADD(ej_ptr%,8)}
  7708.     ej_value%=LONG{ADD(ej_ptr%,10)}
  7709.     '
  7710.     IF ej_delay&=0
  7711.       SELECT ej_type&
  7712.       CASE 0 ! counter for animations (waterfall, ra doors)
  7713.         '
  7714.         INC ej_value%
  7715.         IF ej_value%>101
  7716.           ej_value%=0
  7717.         ENDIF
  7718.         LONG{ADD(ej_ptr%,10)}=ej_value%
  7719.         '
  7720.       CASE 1 ! open litem
  7721.         '
  7722.         ej_litem_t|=@get_byte(ej_value%,offset_item_type&)
  7723.         ej_litem_f|=@get_byte(ej_value%,offset_item_family&)
  7724.         ej_litem_i|=@get_byte(ej_value%,offset_item_id&)
  7725.         '
  7726.         IF ej_litem_t|=0 AND ej_litem_f|=3 ! door
  7727.           IF ej_litem_i|<>10
  7728.             IF ej_litem_i|>2
  7729.               ej_litem_s|=@get_byte(ej_value%,offset_door_open_state&)
  7730.               IF ej_litem_s|<4
  7731.                 snd_play(3,FALSE,@get_job_x(ej_ptr%),@get_job_y(ej_ptr%))
  7732.               ENDIF
  7733.               ej_litem_s|=MIN(SUCC(ej_litem_s|),4)
  7734.               IF ej_litem_s|=4
  7735.                 set_byte(ej_value%,offset_door_job_type&,0)
  7736.                 ej_autokill!=TRUE
  7737.               ENDIF
  7738.               set_byte(ej_value%,offset_door_open_state&,ej_litem_s|)
  7739.             ELSE ! movable wall or trap door
  7740.               set_byte(ej_value%,offset_door_job_type&,0)
  7741.               ej_autokill!=TRUE
  7742.               set_byte(ej_value%,offset_door_open_state&,4)
  7743.             ENDIF
  7744.             redraw_for_animation!=TRUE
  7745.           ENDIF
  7746.         ENDIF
  7747.         '
  7748.       CASE 2 ! close litem
  7749.         '
  7750.         ej_litem_t|=@get_byte(ej_value%,offset_item_type&)
  7751.         ej_litem_f|=@get_byte(ej_value%,offset_item_family&)
  7752.         ej_litem_i|=@get_byte(ej_value%,offset_item_id&)
  7753.         '
  7754.         IF ej_litem_t|=0 AND ej_litem_f|=3 ! door
  7755.           IF ej_litem_i|<>10
  7756.             IF ej_litem_i|>2
  7757.               ej_litem_s|=@get_byte(ej_value%,offset_door_open_state&)
  7758.               IF ej_litem_s|>0
  7759.                 snd_play(3,FALSE,@get_job_x(ej_ptr%),@get_job_y(ej_ptr%))
  7760.               ENDIF
  7761.               ej_litem_s|=MAX(0,PRED(ej_litem_s|))
  7762.               IF ej_litem_s|=0
  7763.                 set_byte(ej_value%,offset_door_job_type&,0)
  7764.                 ej_autokill!=TRUE
  7765.               ENDIF
  7766.               set_byte(ej_value%,offset_door_open_state&,ej_litem_s|)
  7767.               '
  7768.               IF @get_job_x(ej_ptr%)=myself_position_x& ! under a closing door ?
  7769.                 IF @get_job_y(ej_ptr%)=myself_position_y&
  7770.                   IF @get_job_n(ej_ptr%)=myself_position_n&
  7771.                     IF ej_litem_s|<3
  7772.                       set_byte(ej_value%,offset_door_open_state&,4)
  7773.                       FOR i&=0 TO 4
  7774.                         delai
  7775.                       NEXT i&
  7776.                       snd_play(1,FALSE,myself_position_x&,myself_position_y&)
  7777.                     ENDIF
  7778.                   ENDIF
  7779.                 ENDIF
  7780.               ENDIF
  7781.               '
  7782.             ELSE ! movable wall or trap door
  7783.               set_byte(ej_value%,offset_door_job_type&,0)
  7784.               ej_autokill!=TRUE
  7785.               set_byte(ej_value%,offset_door_open_state&,0)
  7786.             ENDIF
  7787.             redraw_for_animation!=TRUE
  7788.           ENDIF
  7789.         ENDIF
  7790.         '
  7791.       CASE 3 ! enable litem
  7792.         '
  7793.         set_byte(ej_value%,offset_item_active&,1)
  7794.         ej_autokill!=TRUE
  7795.         redraw_for_animation!=TRUE
  7796.         '
  7797.       CASE 4 ! disable litem
  7798.         '
  7799.         set_byte(ej_value%,offset_item_active&,0)
  7800.         ej_autokill!=TRUE
  7801.         redraw_for_animation!=TRUE
  7802.         '
  7803.       CASE 5 ! swap in litem list
  7804.       CASE 6 ! destroy in litem list
  7805.       ENDSELECT
  7806.     ELSE IF ej_delay&>0
  7807.       INT{ADD(ej_ptr%,8)}=MAX(0,SUB(ej_delay&,200)) ! dec delay
  7808.     ENDIF
  7809.     '
  7810.     ej_next_ptr%=LONG{ej_ptr%}
  7811.     IF ej_autokill!
  7812.       autokill_job(ej_ptr%,ej_prev_ptr%,ej_next_ptr%)
  7813.     ENDIF
  7814.     ej_prev_ptr%=ej_ptr%
  7815.     ej_ptr%=ej_next_ptr%
  7816.   WEND
  7817.   '
  7818. RETURN
  7819. > FUNCTION new_job(nj_type&,nj_delay&,nj_value%,nj_n&,nj_x&,nj_y&)
  7820.   $F%
  7821.   LOCAL tmp_ti_adr%,tmp_ti_ptr%,tmp_ti_ptr2%
  7822.   '
  7823.   tmp_ti_adr%=@garbage_look(1,job_structure_length&)
  7824.   IF tmp_ti_adr%=0
  7825.     tmp_ti_adr%=@gxalloc(1,job_structure_length&)
  7826.   ENDIF
  7827.   IF tmp_ti_adr%>0
  7828.     '
  7829.     tmp_ti_ptr%=job_list_adr%
  7830.     IF tmp_ti_ptr%>0
  7831.       DO
  7832.         tmp_ti_ptr2%=LONG{tmp_ti_ptr%}
  7833.         EXIT IF tmp_ti_ptr2%=0
  7834.         tmp_ti_ptr%=tmp_ti_ptr2%
  7835.       LOOP
  7836.       LONG{tmp_ti_ptr%}=tmp_ti_adr%     ! fill previous job pointer
  7837.     ELSE
  7838.       job_list_adr%=tmp_ti_adr%
  7839.     ENDIF
  7840.     '
  7841.     LONG{tmp_ti_adr%}=0                 ! next job pointer
  7842.     INT{ADD(tmp_ti_adr%,4)}=job_structure_length&
  7843.     INT{ADD(tmp_ti_adr%,6)}=nj_type&    ! type of job
  7844.     INT{ADD(tmp_ti_adr%,8)}=nj_delay&   ! delay (=0 : execute, >0 : dec time)
  7845.     LONG{ADD(tmp_ti_adr%,10)}=nj_value% ! object pointer or value to manipulate
  7846.     INT{ADD(tmp_ti_adr%,14)}=nj_n& ! level-location
  7847.     INT{ADD(tmp_ti_adr%,16)}=nj_x& ! x-location
  7848.     INT{ADD(tmp_ti_adr%,18)}=nj_y& ! y-location
  7849.     '
  7850.     RETURN tmp_ti_adr%
  7851.   ENDIF
  7852.   RETURN 0
  7853. ENDFUNC
  7854. > FUNCTION search_job(sj_value%)
  7855.   LOCAL sj_ptr%,sj_next_ptr%,sj_exit!
  7856.   '
  7857.   IF job_list_adr%>0
  7858.     '
  7859.     sj_exit!=FALSE
  7860.     '
  7861.     sj_ptr%=job_list_adr%
  7862.     IF sj_ptr%>0
  7863.       DO
  7864.         IF LONG{ADD(sj_ptr%,10)}=sj_value%
  7865.           sj_exit!=TRUE
  7866.         ENDIF
  7867.         sj_next_ptr%=LONG{sj_ptr%}
  7868.         EXIT IF sj_exit! OR sj_next_ptr%=0
  7869.         sj_ptr%=sj_next_ptr%
  7870.       LOOP
  7871.       '
  7872.       IF sj_exit!
  7873.         RETURN sj_ptr%
  7874.       ENDIF
  7875.     ENDIF
  7876.   ENDIF
  7877.   RETURN 0
  7878. ENDFUNC
  7879. > PROCEDURE kill_job(kj_type&,kj_value%)
  7880.   LOCAL kj_prev_ptr%,kj_ptr%,kj_next_ptr%,kj_len&,tmp_cpt_i&,kj_exit!
  7881.   '
  7882.   IF job_list_adr%>0
  7883.     '
  7884.     kj_exit!=FALSE
  7885.     '
  7886.     kj_ptr%=job_list_adr%
  7887.     kj_prev_ptr%=0
  7888.     kj_next_ptr%=0
  7889.     '
  7890.     IF kj_ptr%>0
  7891.       DO
  7892.         IF LONG{ADD(kj_ptr%,10)}=kj_value% AND INT{ADD(kj_ptr%,6)}=kj_type&
  7893.           kj_exit!=TRUE
  7894.         ENDIF
  7895.         kj_next_ptr%=LONG{kj_ptr%}
  7896.         EXIT IF kj_exit! OR kj_next_ptr%=0
  7897.         kj_prev_ptr%=kj_ptr%
  7898.         kj_ptr%=kj_next_ptr%
  7899.       LOOP
  7900.       '
  7901.       IF kj_exit!
  7902.         kj_len&=SUB(job_structure_length&,2)
  7903.         FOR tmp_cpt_i&=0 TO kj_len& STEP 2
  7904.           INT{ADD(kj_ptr%,tmp_cpt_i&)}=0
  7905.         NEXT tmp_cpt_i&
  7906.         ~@garbage_insert(1,job_structure_length&,kj_ptr%)
  7907.         '
  7908.         IF kj_next_ptr%>0
  7909.           IF kj_prev_ptr%=0
  7910.             job_list_adr%=kj_next_ptr%
  7911.           ELSE
  7912.             LONG{kj_prev_ptr%}=kj_next_ptr%
  7913.           ENDIF
  7914.         ELSE
  7915.           IF kj_prev_ptr%>0
  7916.             LONG{kj_prev_ptr%}=0
  7917.           ENDIF
  7918.         ENDIF
  7919.       ENDIF
  7920.     ENDIF
  7921.   ENDIF
  7922. RETURN
  7923. > PROCEDURE autokill_job(akj_ptr%,akj_prev_ptr%,akj_next_ptr%)
  7924.   LOCAL akj_len&,tmp_cpt_i&
  7925.   '
  7926.   IF job_list_adr%>0 AND akj_ptr%>0
  7927.     '
  7928.     akj_len&=SUB(job_structure_length&,2)
  7929.     FOR tmp_cpt_i&=0 TO akj_len& STEP 2
  7930.       INT{ADD(akj_ptr%,tmp_cpt_i&)}=0
  7931.     NEXT tmp_cpt_i&
  7932.     ~@garbage_insert(1,job_structure_length&,akj_ptr%)
  7933.     '
  7934.     IF akj_next_ptr%>0
  7935.       IF akj_prev_ptr%=0
  7936.         job_list_adr%=akj_next_ptr%
  7937.       ELSE
  7938.         LONG{akj_prev_ptr%}=akj_next_ptr%
  7939.       ENDIF
  7940.     ELSE
  7941.       IF akj_prev_ptr%>0
  7942.         LONG{akj_prev_ptr%}=0
  7943.       ENDIF
  7944.     ENDIF
  7945.   ENDIF
  7946. RETURN
  7947. > FUNCTION next_job(nj_ptr%)
  7948.   $F%
  7949.   IF nj_ptr%>0
  7950.     RETURN LONG{nj_ptr%}
  7951.   ENDIF
  7952.   RETURN -1
  7953. ENDFUNC
  7954. > PROCEDURE set_job_type(nj_ptr%,nj_type&)
  7955.   INT{ADD(nj_ptr%,6)}=nj_type&
  7956. RETURN
  7957. > PROCEDURE set_job_delay(nj_ptr%,nj_delay&)
  7958.   INT{ADD(nj_ptr%,8)}=nj_delay&
  7959. RETURN
  7960. > FUNCTION get_job_type(nj_ptr%)
  7961.   $F&
  7962.   IF nj_ptr%>0
  7963.     RETURN INT{ADD(nj_ptr%,6)}
  7964.   ENDIF
  7965.   RETURN -1
  7966. ENDFUNC
  7967. > FUNCTION get_job_delay(nj_ptr%)
  7968.   $F&
  7969.   IF nj_ptr%>0
  7970.     RETURN INT{ADD(nj_ptr%,8)}
  7971.   ENDIF
  7972.   RETURN -1
  7973. ENDFUNC
  7974. > FUNCTION get_job_value(nj_ptr%)
  7975.   $F%
  7976.   IF nj_ptr%>0
  7977.     RETURN LONG{ADD(nj_ptr%,10)}
  7978.   ENDIF
  7979.   RETURN -1
  7980. ENDFUNC
  7981. > FUNCTION get_job_n(nj_ptr%)
  7982.   $F&
  7983.   IF nj_ptr%>0
  7984.     RETURN INT{ADD(nj_ptr%,14)}
  7985.   ENDIF
  7986.   RETURN -1
  7987. ENDFUNC
  7988. > FUNCTION get_job_x(nj_ptr%)
  7989.   $F&
  7990.   IF nj_ptr%>0
  7991.     RETURN INT{ADD(nj_ptr%,16)}
  7992.   ENDIF
  7993.   RETURN -1
  7994. ENDFUNC
  7995. > FUNCTION get_job_y(nj_ptr%)
  7996.   $F&
  7997.   IF nj_ptr%>0
  7998.     RETURN INT{ADD(nj_ptr%,18)}
  7999.   ENDIF
  8000.   RETURN -1
  8001. ENDFUNC
  8002. '
  8003. > FUNCTION garbage_open(n&,l&)
  8004.   $F!
  8005.   ~@garbage_close(n&)
  8006.   garbage%(n&)=GEMDOS(72,L:MUL(ADD(l&,100),6))
  8007.   IF garbage%(n&)>0
  8008.     garbage_maxline&(n&)=ADD(l&,100)
  8009.     garbage_nbline&(n&)=0
  8010.     RETURN TRUE
  8011.   ELSE
  8012.     garbage_maxline&(n&)=0
  8013.     garbage_nbline&(n&)=0
  8014.     RETURN FALSE
  8015.   ENDIF
  8016. ENDFUNC
  8017. > FUNCTION garbage_close(n&)
  8018.   $F!
  8019.   IF garbage%(n&)>0
  8020.     ~GEMDOS(73,L:garbage%(n&))
  8021.     garbage%(n&)=0
  8022.     RETURN TRUE
  8023.   ELSE
  8024.     garbage%(n&)=0
  8025.     RETURN FALSE
  8026.   ENDIF
  8027. ENDFUNC
  8028. > FUNCTION garbage_look(n&,l&)
  8029.   $F%
  8030.   garbage_cursor&=0
  8031.   garbage_exit!=FALSE
  8032.   '
  8033.   IF garbage%(n&)>0
  8034.     DO
  8035.       EXIT IF garbage_cursor&>=garbage_nbline&(n&) OR garbage_exit!
  8036.       IF @rx(n&,garbage_cursor&)>=l&
  8037.         garbage_exit!=TRUE
  8038.       ELSE
  8039.         INC garbage_cursor&
  8040.       ENDIF
  8041.     LOOP
  8042.     '
  8043.     IF garbage_exit!
  8044.       garb_ptr%=LONG{ADD(ADD(garbage%(n&),2),MUL(garbage_cursor&,6))}
  8045.       '
  8046.       garb_len%=MUL(SUB(garbage_nbline&(n&),garbage_cursor&),6)
  8047.       garb_adr%=ADD(garbage%(n&),MUL(garbage_cursor&,6))
  8048.       IF garb_len%>0
  8049.         BMOVE ADD(garb_adr%,6),garb_adr%,garb_len%
  8050.       ENDIF
  8051.       garbage_nbline&(n&)=MAX(0,PRED(garbage_nbline&(n&)))
  8052.       '
  8053.       RETURN garb_ptr%
  8054.     ELSE
  8055.       RETURN 0
  8056.     ENDIF
  8057.   ELSE
  8058.     RETURN 0
  8059.   ENDIF
  8060. ENDFUNC
  8061. > FUNCTION garbage_insert(n&,l&,d%)
  8062.   $F!
  8063.   garbage_cursor&=0
  8064.   garbage_exit!=FALSE
  8065.   '
  8066.   IF garbage%(n&)>0
  8067.     DO
  8068.       EXIT IF garbage_cursor&>=garbage_nbline&(n&) OR garbage_exit!
  8069.       IF @rx(n&,garbage_cursor&)>=l&
  8070.         garbage_exit!=TRUE
  8071.       ENDIF
  8072.       INC garbage_cursor&
  8073.     LOOP
  8074.     '
  8075.     IF @garbage_resize(n&,SUCC(garbage_nbline&(n&)))
  8076.       IF garbage_cursor&<garbage_nbline&(n&)
  8077.         garb_len%=MUL(SUB(garbage_nbline&(n&),garbage_cursor&),6)
  8078.         garb_adr%=ADD(garbage%(n&),MUL(garbage_cursor&,6))
  8079.         IF garb_len%>0
  8080.           BMOVE garb_adr%,ADD(garb_adr%,6),garb_len%
  8081.         ENDIF
  8082.       ENDIF
  8083.       '
  8084.       CARD{ADD(garbage%(n&),MUL(garbage_cursor&,6))}=l&
  8085.       LONG{ADD(ADD(garbage%(n&),2),MUL(garbage_cursor&,6))}=d%
  8086.       garbage_nbline&(n&)=MIN(SUCC(garbage_nbline&(n&)),garbage_maxline&(n&))
  8087.       garbage_exit!=TRUE
  8088.     ELSE
  8089.       garbage_exit!=FALSE
  8090.     ENDIF
  8091.   ENDIF
  8092.   '
  8093.   RETURN garbage_exit!
  8094. ENDFUNC
  8095. > FUNCTION garbage_resize(n&,l&)
  8096.   $F!
  8097.   IF l&>garbage_maxline&(n&)
  8098.     new_garbage%=GEMDOS(72,L:ADD(MUL(ADD(l&,200),6),6))
  8099.     IF new_garbage%>0
  8100.       BMOVE garbage%(n&),new_garbage%,MUL(garbage_nbline&(n&),6)
  8101.       ~GEMDOS(73,L:garbage%(n&))
  8102.       garbage%(n&)=new_garbage%
  8103.       garbage_maxline&(n&)=ADD(l&,200)
  8104.       RETURN TRUE
  8105.     ENDIF
  8106.     RETURN FALSE
  8107.   ENDIF
  8108.   RETURN TRUE
  8109. ENDFUNC
  8110. > FUNCTION rx(n&,l&)
  8111.   $F&
  8112.   RETURN CARD{ADD(garbage%(n&),MUL(l&,6))}
  8113. ENDFUNC
  8114. '
  8115. > PROCEDURE gxalloc_main_init(n&)
  8116.   '
  8117.   gxblk_max&=128
  8118.   gxblk_size%=16000
  8119.   '
  8120.   DIM garbage%(n&),garbage_maxline&(n&),garbage_nbline&(n&)
  8121.   DIM gxblk%(n&,PRED(gxblk_max&)),sgxblk%(n&,PRED(gxblk_max&))
  8122.   DIM gxblk_count&(n&),sgxblk_count&(n&)
  8123.   DIM last_gxadr%(n&),last_gxlen%(n&)
  8124.   DIM gxalloc!(n&)
  8125.   '
  8126. RETURN
  8127. > PROCEDURE gxalloc_main_exit(n&)
  8128.   LOCAL in&
  8129.   '
  8130.   FOR in&=0 TO n&
  8131.     ~@gxalloc_exit(in&)
  8132.   NEXT in&
  8133.   ERASE gxblk%(),sgxblk%()
  8134.   ERASE gxblk_count&(),sgxblk_count&()
  8135.   ERASE last_gxadr%(),last_gxlen%()
  8136.   ERASE gxalloc!()
  8137.   ERASE garbage%()
  8138.   ERASE garbage%(),garbage_maxline&(),garbage_nbline&()
  8139.   '
  8140. RETURN
  8141. > FUNCTION gxalloc_init(n&)
  8142.   $F%
  8143.   LOCAL ig&
  8144.   ~FRE(0)
  8145.   '
  8146.   IF NOT gxalloc!(n&)
  8147.     FOR ig&=0 TO PRED(gxblk_max&)
  8148.       gxblk%(n&,ig&)=0
  8149.       sgxblk%(n&,ig&)=0
  8150.     NEXT ig&
  8151.     '
  8152.     gxblk_count&(n&)=0
  8153.     sgxblk_count&(n&)=0
  8154.     last_gxadr%(n&)=0
  8155.     last_gxlen%(n&)=0
  8156.     '
  8157.     gxblk%(n&,0)=GEMDOS(72,L:ADD(gxblk_size%,4))
  8158.     IF gxblk%(n&,0)>0
  8159.       last_gxadr%(n&)=gxblk%(n&,0)
  8160.       last_gxlen%(n&)=gxblk_size%
  8161.       gxalloc!(n&)=TRUE
  8162.       RETURN 0
  8163.     ENDIF
  8164.     RETURN gxblk%(n&,0)
  8165.   ENDIF
  8166.   RETURN -1
  8167.   '
  8168. ENDFUNC
  8169. > FUNCTION gxalloc_exit(n&)
  8170.   $F%
  8171.   LOCAL ig&,free%
  8172.   '
  8173.   IF n&=1
  8174.     job_list_adr%=0
  8175.   ENDIF
  8176.   '
  8177.   IF gxalloc!(n&)
  8178.     gxalloc!(n&)=FALSE
  8179.     FOR ig&=0 TO gxblk_count&(n&)
  8180.       IF gxblk%(n&,ig&)>0
  8181.         free%=GEMDOS(73,L:gxblk%(n&,ig&))
  8182.         gxblk%(n&,ig&)=0
  8183.         IF free%<>0
  8184.           ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: can't free | memory block.|][ Ok ]")
  8185.         ENDIF
  8186.       ENDIF
  8187.     NEXT ig&
  8188.     FOR ig&=0 TO sgxblk_count&(n&)
  8189.       IF sgxblk%(n&,ig&)>0
  8190.         free%=GEMDOS(73,L:sgxblk%(n&,ig&))
  8191.         sgxblk%(n&,ig&)=0
  8192.         IF free%<>0
  8193.           ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: can't free | (big) memory block.|][ Ok ]")
  8194.         ENDIF
  8195.       ENDIF
  8196.     NEXT ig&
  8197.     RETURN 0
  8198.   ENDIF
  8199.   RETURN -1
  8200. ENDFUNC
  8201. > FUNCTION gxalloc(n&,wanted_size%)
  8202.   $F%
  8203.   '
  8204.   wanted_size%=ADD(wanted_size%,3) AND -4
  8205.   wanted_size%=MAX(4,wanted_size%)
  8206.   '
  8207.   IF wanted_size%>0
  8208.     IF wanted_size%<gxblk_size%
  8209.       IF SUB(last_gxlen%(n&),wanted_size%)<0
  8210.         temp_adr%=@new_gxblk(n&)
  8211.         IF temp_adr%=0
  8212.           new_gxadr%=last_gxadr%(n&)
  8213.           ADD last_gxadr%(n&),wanted_size%
  8214.           SUB last_gxlen%(n&),wanted_size%
  8215.           RETURN new_gxadr%
  8216.         ENDIF
  8217.         RETURN temp_adr%
  8218.       ELSE
  8219.         new_gxadr%=last_gxadr%(n&)
  8220.         ADD last_gxadr%(n&),wanted_size%
  8221.         SUB last_gxlen%(n&),wanted_size%
  8222.         RETURN new_gxadr%
  8223.       ENDIF
  8224.     ELSE IF wanted_size%=>gxblk_size%
  8225.       IF sgxblk_count&(n&)<gxblk_max&
  8226.         temp_adr%=GEMDOS(72,L:ADD(wanted_size%,32))
  8227.         IF temp_adr%>0
  8228.           sgxblk%(sgxblk_count&(n&))=temp_adr%
  8229.           INC sgxblk_count&(n&)
  8230.           RETURN temp_adr%
  8231.         ENDIF
  8232.         ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: can't | allocate a (big) memory block.][ Ok ]")
  8233.         RETURN temp_adr%
  8234.       ENDIF
  8235.       ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: all available | (big) memory blocks are allocated.][ Ok ]")
  8236.       RETURN -74
  8237.     ENDIF
  8238.   ENDIF
  8239.   ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: negative|length for a memory block.][ Ok ]")
  8240.   RETURN -70
  8241. ENDFUNC
  8242. > FUNCTION new_gxblk(n&)
  8243.   $F%
  8244.   INC gxblk_count&(n&)
  8245.   IF gxblk_count&(n&)<gxblk_max&
  8246.     gxblk%(n&,gxblk_count&(n&))=GEMDOS(72,L:ADD(gxblk_size%,32))
  8247.     IF gxblk%(n&,gxblk_count&(n&))>0
  8248.       last_gxadr%(n&)=gxblk%(n&,gxblk_count&(n&))
  8249.       last_gxlen%(n&)=gxblk_size%
  8250.       RETURN 0
  8251.     ELSE
  8252.       ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: can't | allocate a memory block.][ Ok ]")
  8253.     ENDIF
  8254.     DEC gxblk_count&(n&)
  8255.     RETURN gxblk%(n&,SUCC(gxblk_count&(n&)))
  8256.   ENDIF
  8257.   ~FORM_ALERT(1,"[1][| DGEM's GXALLOC: all available| blocks are allocated.][ Ok ]")
  8258.   RETURN -74
  8259. ENDFUNC
  8260. '
  8261. > FUNCTION alert(al_type&,alerte&)
  8262.   $F&
  8263.   RETURN FORM_ALERT(al_type&,CHAR{OB_SPEC(adtree%(tree_alerts&),alerte&)})
  8264. ENDFUNC
  8265. > FUNCTION window_create(cp_win_recu&)
  8266.   $F&
  8267.   '
  8268.   INT{ADD(GCONTRL,2)}=5
  8269.   INT{ADD(GCONTRL,4)}=1
  8270.   INT{ADD(GCONTRL,6)}=0
  8271.   INT{ADD(GCONTRL,8)}=0
  8272.   '
  8273.   INT{GINTIN}=cp_win_recu&
  8274.   INT{ADD(GINTIN,2)}=30
  8275.   INT{ADD(GINTIN,4)}=30
  8276.   INT{ADD(GINTIN,6)}=30
  8277.   INT{ADD(GINTIN,8)}=30
  8278.   '
  8279.   GEMSYS 100
  8280.   '
  8281.   RETURN INT{GINTOUT}
  8282. ENDFUNC
  8283. > FUNCTION ev_multi(em_flags&,em_cl&,em_ma&,em_st&,em_ct%,VAR em_mx&,em_my&,em_mk&,em_kbd&,em_key&,em_click&)
  8284.   $F&
  8285.   '
  8286.   INT{ADD(GCONTRL,2)}=16
  8287.   INT{ADD(GCONTRL,4)}=7
  8288.   INT{ADD(GCONTRL,6)}=1
  8289.   INT{ADD(GCONTRL,8)}=0
  8290.   '
  8291.   INT{GINTIN}=em_flags&
  8292.   INT{ADD(GINTIN,2)}=em_cl&
  8293.   INT{ADD(GINTIN,4)}=em_ma&
  8294.   INT{ADD(GINTIN,6)}=em_st&
  8295.   FOR i&=8 TO 24 STEP 4
  8296.     LONG{ADD(GINTIN,i&)}=0
  8297.   NEXT i&
  8298.   INT{ADD(GINTIN,28)}=WORD(em_ct%)
  8299.   INT{ADD(GINTIN,30)}=WORD(SWAP(em_ct%))
  8300.   '
  8301.   LONG{ADDRIN}=m_adr%
  8302.   '
  8303.   GEMSYS 25
  8304.   '
  8305.   em_mx&=INT{ADD(GINTOUT,2)}
  8306.   em_my&=INT{ADD(GINTOUT,4)}
  8307.   em_mk&=INT{ADD(GINTOUT,6)}
  8308.   em_kbd&=INT{ADD(GINTOUT,8)}
  8309.   em_key&=INT{ADD(GINTOUT,10)}
  8310.   em_click&=INT{ADD(GINTOUT,12)}
  8311.   '
  8312.   RETURN INT{GINTOUT}
  8313. ENDFUNC
  8314. > PROCEDURE ob_draw(ob_adr%,ob_start&,ob_dept&,ob_xclip&,ob_yclip&,ob_lclip&,ob_hclip&)
  8315.   '
  8316.   INT{ADD(GCONTRL,2)}=6
  8317.   INT{ADD(GCONTRL,4)}=1
  8318.   INT{ADD(GCONTRL,6)}=1
  8319.   INT{ADD(GCONTRL,8)}=0
  8320.   '
  8321.   INT{GINTIN}=ob_start&
  8322.   INT{ADD(GINTIN,2)}=ob_dept&
  8323.   INT{ADD(GINTIN,4)}=ob_xclip&
  8324.   INT{ADD(GINTIN,6)}=ob_yclip&
  8325.   INT{ADD(GINTIN,8)}=ob_lclip&
  8326.   INT{ADD(GINTIN,10)}=ob_hclip&
  8327.   '
  8328.   LONG{ADDRIN}=ob_adr%
  8329.   '
  8330.   GEMSYS 42
  8331.   '
  8332. RETURN
  8333. > PROCEDURE shl_write(mode&,wisgr&,wiscr&,cmd$,tail$)
  8334.   '
  8335.   INT{ADD(GCONTRL,2)}=3
  8336.   INT{ADD(GCONTRL,4)}=1
  8337.   INT{ADD(GCONTRL,6)}=2
  8338.   INT{ADD(GCONTRL,8)}=0
  8339.   '
  8340.   INT{GINTIN}=mode&
  8341.   INT{ADD(GINTIN,2)}=wisgr&
  8342.   INT{ADD(GINTIN,4)}=wiscr&
  8343.   '
  8344.   LONG{ADDRIN}=V:tail$
  8345.   LONG{ADD(ADDRIN,4)}=V:cmd$
  8346.   '
  8347.   GEMSYS 121
  8348.   '
  8349. RETURN
  8350. > FUNCTION fileselector1$(type_msg&,path$,name$)
  8351.   LOCAL path1$,name1$,choix_file&,retour_file&
  8352.   LET path1$=path$
  8353.   LET name1$=name$
  8354.   retour_file&=@fi_input(type_msg&,path1$,name1$,choix_file&)
  8355.   IF retour_file&=0 OR choix_file&=0
  8356.     RETURN chemin$+c0$
  8357.   ELSE
  8358.     RETURN LEFT$(path1$,RINSTR(path1$,"\"))+c0$
  8359.   ENDIF
  8360. ENDFUNC
  8361. > FUNCTION fileselector2$(type_msg&,path$,name$)
  8362.   LOCAL path1$,name1$,choix_file&,retour_file&
  8363.   LET path1$=path$
  8364.   LET name1$=name$
  8365.   retour_file&=@fi_input(type_msg&,path1$,name1$,choix_file&)
  8366.   IF name1$=c0$ OR name1$=""
  8367.     choix_file&=0
  8368.   ENDIF
  8369.   IF retour_file&=0 OR choix_file&=0
  8370.     RETURN c0$
  8371.   ELSE
  8372.     RETURN LEFT$(path1$,RINSTR(path1$,"\"))+name1$
  8373.   ENDIF
  8374. ENDFUNC
  8375. > FUNCTION fi_input(type_msg&,VAR fi_path$,fi_name$,fi_choix&)
  8376.   $F&
  8377.   '
  8378.   ~FRE(0)
  8379.   '
  8380.   IF tos_version%<104
  8381.     type_msg&=0
  8382.   ENDIF
  8383.   '
  8384.   IF type_msg&>0
  8385.     GCONTRL(0)=91
  8386.   ELSE
  8387.     GCONTRL(0)=90
  8388.   ENDIF
  8389.   GCONTRL(1)=0
  8390.   GCONTRL(2)=2
  8391.   IF type_msg&>0
  8392.     GCONTRL(3)=3
  8393.   ELSE
  8394.     GCONTRL(3)=2
  8395.   ENDIF
  8396.   GCONTRL(4)=0
  8397.   '
  8398.   fi_path$=fi_path$+SPACE$(300)
  8399.   fi_name$=fi_name$+SPACE$(100)
  8400.   '
  8401.   ADDRIN(0)=V:fi_path$
  8402.   ADDRIN(1)=V:fi_name$
  8403.   IF type_msg&>0
  8404.     ADDRIN(2)=OB_SPEC(adtree%(tree_alerts&),type_msg&)
  8405.   ENDIF
  8406.   '
  8407.   GEMSYS
  8408.   '
  8409.   fi_path$=CHAR{V:fi_path$}+c0$
  8410.   fi_name$=CHAR{V:fi_name$}+c0$
  8411.   fi_choix&=GINTOUT(1)
  8412.   '
  8413.   RETURN GINTOUT(0)
  8414. ENDFUNC
  8415. > FUNCTION s_exist(exist_name$)
  8416.   $F!
  8417.   LOCAL existe&
  8418.   IF LEN(exist_name$)=0 OR exist_name$=c0$
  8419.     RETURN FALSE
  8420.   ELSE
  8421.     existe&=GEMDOS(61,L:V:exist_name$,W:0)
  8422.     IF existe&>0
  8423.       ~GEMDOS(62,W:existe&)
  8424.       RETURN TRUE
  8425.     ELSE
  8426.       RETURN FALSE
  8427.     ENDIF
  8428.   ENDIF
  8429. ENDFUNC
  8430. > FUNCTION test_cookie(cookie_name$,VAR cookie_valeur%)
  8431.   $F!
  8432.   LOCAL read_cook%,nom_cook%,cookie%
  8433.   '
  8434.   nom_cook%=CVL(cookie_name$)
  8435.   cookie%=LPEEK(&H5A0)
  8436.   cookie_valeur%=0
  8437.   '
  8438.   IF cookie%<>0
  8439.     REPEAT
  8440.       read_cook%=LPEEK(cookie%)
  8441.       cookie_valeur%=LPEEK(ADD(cookie%,4))
  8442.       ADD cookie%,8
  8443.     UNTIL read_cook%=0 OR read_cook%=nom_cook%
  8444.     IF read_cook%=nom_cook%
  8445.       RETURN TRUE
  8446.     ELSE
  8447.       RETURN FALSE
  8448.     ENDIF
  8449.   ELSE
  8450.     RETURN FALSE
  8451.   ENDIF
  8452. ENDFUNC
  8453. > FUNCTION remove_nullbyte$(remove_name$)
  8454.   IF RIGHT$(remove_name$)=c0$
  8455.     RETURN LEFT$(remove_name$,MAX(0,PRED(LEN(remove_name$))))
  8456.   ELSE
  8457.     RETURN remove_name$
  8458.   ENDIF
  8459. ENDFUNC
  8460. > FUNCTION test_writable
  8461.   $F!
  8462.   test_filename$=folder_system$+"WRITE.TST"+c0$
  8463.   file_handle&=GEMDOS(60,L:V:test_filename$,W:0)
  8464.   IF file_handle&>0
  8465.     ~GEMDOS(62,W:file_handle&)
  8466.     ~GEMDOS(65,L:V:test_filename$)
  8467.     RETURN TRUE
  8468.   ENDIF
  8469.   RETURN FALSE
  8470. ENDFUNC
  8471. '
  8472. > PROCEDURE menu_desactivate
  8473.   menu_active!=FALSE
  8474.   ~MENU_IENABLE(adtree%(0),9,0)
  8475.   ~MENU_IENABLE(adtree%(0),18,0)
  8476.   ~MENU_IENABLE(adtree%(0),20,0)
  8477.   ~MENU_IENABLE(adtree%(0),22,1)
  8478.   ~MENU_IENABLE(adtree%(0),25,0)
  8479.   ~MENU_IENABLE(adtree%(0),27,0)
  8480. RETURN
  8481. > PROCEDURE menu_activate
  8482.   menu_active!=TRUE
  8483.   ~MENU_IENABLE(adtree%(0),9,1)
  8484.   ~MENU_IENABLE(adtree%(0),18,1)
  8485.   ~MENU_IENABLE(adtree%(0),20,1)
  8486.   ~MENU_IENABLE(adtree%(0),25,1)
  8487.   ~MENU_IENABLE(adtree%(0),27,1)
  8488. RETURN
  8489. > PROCEDURE menu_desactivate_game
  8490.   game_active!=FALSE
  8491.   ~MENU_IENABLE(adtree%(0),22,0)
  8492.   ~MENU_IENABLE(adtree%(0),23,0)
  8493.   ~MENU_IENABLE(adtree%(0),29,0)
  8494.   ~MENU_IENABLE(adtree%(0),30,0)
  8495.   ~MENU_IENABLE(adtree%(0),32,0)
  8496. RETURN
  8497. > PROCEDURE menu_activate_game
  8498.   game_active!=TRUE
  8499.   ~MENU_IENABLE(adtree%(0),22,0)
  8500.   ~MENU_IENABLE(adtree%(0),23,1)
  8501.   ~MENU_IENABLE(adtree%(0),29,1)
  8502.   ~MENU_IENABLE(adtree%(0),30,1)
  8503.   ~MENU_IENABLE(adtree%(0),32,1)
  8504. RETURN
  8505. > PROCEDURE tout_fermer
  8506.   FOR i&=0 TO nb_window&
  8507.     ferme_win(i&)
  8508.   NEXT i&
  8509. RETURN
  8510. > PROCEDURE control
  8511.   ~WIND_UPDATE(1)
  8512.   ~WIND_UPDATE(3)
  8513.   v_hide_c
  8514. RETURN
  8515. > PROCEDURE uncontrol
  8516.   ~WIND_UPDATE(2)
  8517.   ~WIND_UPDATE(0)
  8518.   v_show_c
  8519. RETURN
  8520. > PROCEDURE delai
  8521.   ~EVNT_TIMER(75)
  8522. RETURN
  8523. > PROCEDURE v_hide_c
  8524.   CONTRL(0)=123
  8525.   CONTRL(1)=0
  8526.   CONTRL(3)=0
  8527.   CONTRL(6)=vdi_handle&
  8528.   VDISYS
  8529. RETURN
  8530. > PROCEDURE v_show_c
  8531.   CONTRL(0)=122
  8532.   CONTRL(1)=0
  8533.   CONTRL(3)=1
  8534.   CONTRL(6)=vdi_handle&
  8535.   INTIN(0)=1
  8536.   VDISYS
  8537. RETURN
  8538. > PROCEDURE ferme_multi
  8539.   IF multi!=FALSE
  8540.     tout_fermer
  8541.     ~MENU_BAR(adtree%(0),0)
  8542.   ENDIF
  8543. RETURN
  8544. > PROCEDURE ouvre_multi
  8545.   num_drive&=SUB(ASC(folder_home$),65)
  8546.   ~GEMDOS(14,W:num_drive&)
  8547.   CHDIR folder_home$+c0$
  8548.   IF multi!=FALSE
  8549.     ~MENU_BAR(adtree%(0),1)
  8550.     ~FORM_DIAL(3,0,0,0,0,screenx&,screeny&,screenl&,screenh&)
  8551.   ENDIF
  8552. RETURN
  8553. > PROCEDURE key_repeat_off
  8554.   IF freeze_keyboard_buffer!
  8555.     IF NOT key_repeat_off!
  8556.       key_ptr%=XBIOS(14,1)
  8557.       key_buffersize&=INT{ADD(key_ptr%,4)}
  8558.       INT{ADD(key_ptr%,4)}=0
  8559.       key_repeat_off!=TRUE
  8560.     ENDIF
  8561.   ENDIF
  8562. RETURN
  8563. > PROCEDURE key_repeat_on
  8564.   IF freeze_keyboard_buffer!
  8565.     IF key_repeat_off!
  8566.       key_ptr%=XBIOS(14,1)
  8567.       INT{ADD(key_ptr%,4)}=key_buffersize&
  8568.       LONG{ADD(key_ptr%,6)}=0
  8569.       key_repeat_off!=FALSE
  8570.     ENDIF
  8571.   ENDIF
  8572. RETURN
  8573. > PROCEDURE mouse_busy
  8574.   ~GRAF_MOUSE(2,0)
  8575. RETURN
  8576. > PROCEDURE mouse_free
  8577.   ~GRAF_MOUSE(0,0)
  8578. RETURN
  8579. > PROCEDURE mouse_disk
  8580.   ~GRAF_MOUSE(255,cursor_ptr%(2))
  8581. RETURN
  8582. > PROCEDURE mouse_hand_point
  8583.   ~GRAF_MOUSE(255,cursor_ptr%(1))
  8584. RETURN
  8585. > PROCEDURE control_form(dial&)
  8586.   ~WIND_UPDATE(1)
  8587.   ~WIND_UPDATE(3)
  8588.   ~FORM_CENTER(adtree%(dial&),xd&(dial&),yd&(dial&),ld&(dial&),hd&(dial&))
  8589.   DEC xd&(dial&)
  8590.   DEC yd&(dial&)
  8591.   ADD ld&(dial&),5
  8592.   ADD hd&(dial&),5
  8593.   ~FORM_DIAL(0,0,0,0,0,xd&(dial&),yd&(dial&),ld&(dial&),hd&(dial&))
  8594.   ~OBJC_DRAW(adtree%(dial&),0,3,screenx&,screeny&,screenl&,screenh&)
  8595. RETURN
  8596. > PROCEDURE uncontrol_form(dial&)
  8597.   ~WIND_UPDATE(2)
  8598.   ~WIND_UPDATE(0)
  8599.   ~FORM_DIAL(3,0,0,0,0,xd&(dial&),yd&(dial&),ld&(dial&),hd&(dial&))
  8600. RETURN
  8601. '
  8602. > PROCEDURE get_env_bubble
  8603.   bubble_id&=APPL_FIND("BUBBLE  ")
  8604.   IF bubble_id&<1 AND (magic! OR mint!)=TRUE
  8605.     '
  8606.     dummy$="BUBBLEGEM="+c0$
  8607.     '
  8608.     IF t_buf%>0
  8609.       INT{ADD(GCONTRL,2)}=0
  8610.       INT{ADD(GCONTRL,4)}=1
  8611.       INT{ADD(GCONTRL,6)}=2
  8612.       INT{ADD(GCONTRL,8)}=0
  8613.       '
  8614.       LONG{ADDRIN}=t_buf%
  8615.       LONG{ADD(ADDRIN,4)}=V:dummy$
  8616.       '
  8617.       GEMSYS 125
  8618.       '
  8619.       IF LONG{t_buf%}>0
  8620.         dummy$=CHAR{{t_buf%}}+c0$
  8621.         IF @s_exist(dummy$)=TRUE
  8622.           num_drive&=ASC(dummy$)-65
  8623.           ~GEMDOS(14,W:num_drive&)
  8624.           CHDIR LEFT$(dummy$,RINSTR(dummy$,"\"))+c0$
  8625.           shl_write(1,1,100,c0$,dummy$)
  8626.           FOR i&=0 TO 10
  8627.             delai
  8628.           NEXT i&
  8629.           num_drive&=ASC(chemin$)-65
  8630.           ~GEMDOS(14,W:num_drive&)
  8631.           CHDIR chemin$+c0$
  8632.         ENDIF
  8633.       ENDIF
  8634.     ENDIF
  8635.   ENDIF
  8636. RETURN
  8637. > PROCEDURE get_env_guide
  8638.   '
  8639.   dummy$="STGUIDE="+c0$
  8640.   '
  8641.   IF t_buf%>0
  8642.     INT{ADD(GCONTRL,2)}=0
  8643.     INT{ADD(GCONTRL,4)}=1
  8644.     INT{ADD(GCONTRL,6)}=2
  8645.     INT{ADD(GCONTRL,8)}=0
  8646.     '
  8647.     LONG{ADDRIN}=t_buf%
  8648.     LONG{ADD(ADDRIN,4)}=V:dummy$
  8649.     '
  8650.     GEMSYS 125
  8651.     '
  8652.     IF LONG{t_buf%}>0
  8653.       dummy$=CHAR{{t_buf%}}+c0$
  8654.       IF @s_exist(dummy$)=TRUE
  8655.         env_guide$=dummy$
  8656.       ELSE
  8657.         env_guide$=c0$
  8658.       ENDIF
  8659.     ENDIF
  8660.   ENDIF
  8661.   '
  8662. RETURN
  8663. > PROCEDURE get_env_home
  8664.   home$=c0$
  8665.   IF t_buf%>0
  8666.     '
  8667.     dummy$="HOME="+c0$
  8668.     '
  8669.     INT{ADD(GCONTRL,2)}=0
  8670.     INT{ADD(GCONTRL,4)}=1
  8671.     INT{ADD(GCONTRL,6)}=2
  8672.     INT{ADD(GCONTRL,8)}=0
  8673.     '
  8674.     LONG{ADDRIN}=t_buf%
  8675.     LONG{ADD(ADDRIN,4)}=V:dummy$
  8676.     '
  8677.     GEMSYS 125
  8678.     '
  8679.     IF LONG{t_buf%}>0
  8680.       home$=CHAR{{t_buf%}}
  8681.       IF RIGHT$(home$)<>"\"
  8682.         home$=home$+"\"
  8683.       ENDIF
  8684.     ENDIF
  8685.   ENDIF
  8686.   IF LEN(home$)>0 AND home$<>c0$ AND LEFT$(home$,5)<>"/root"
  8687.     pathfile_inf$=home$+filename_inf$
  8688.   ELSE
  8689.     IF @test_writable=TRUE
  8690.       pathfile_inf$=folder_system$+filename_inf$
  8691.     ELSE
  8692.       pathfile_inf$="C:\"+filename_inf$
  8693.     ENDIF
  8694.   ENDIF
  8695. RETURN
  8696. '
  8697. > FUNCTION locksnd
  8698.   $F%
  8699.   RETURN XBIOS(128)
  8700. ENDFUNC
  8701. > FUNCTION unlocksnd
  8702.   $F%
  8703.   RETURN XBIOS(129)
  8704. ENDFUNC
  8705. > FUNCTION soundcmd(snd_mode&,snd_data&)
  8706.   $F%
  8707.   RETURN XBIOS(130,W:snd_mode&,W:snd_data&)
  8708. ENDFUNC
  8709. > FUNCTION setbuffer(snd_reg&,snd_begaddr%,snd_endaddr%)
  8710.   $F%
  8711.   RETURN XBIOS(131,W:snd_reg&,L:snd_begaddr%,L:snd_endaddr%)
  8712. ENDFUNC
  8713. > FUNCTION setmode(snd_mode&)
  8714.   $F%
  8715.   RETURN XBIOS(132,W:snd_mode&)
  8716. ENDFUNC
  8717. > FUNCTION setinterrrupt(snd_src_inter&,snd_cause&)
  8718.   $F%
  8719.   RETURN XBIOS(135,W:snd_src_inter&,W:snd_cause&)
  8720. ENDFUNC
  8721. > FUNCTION buffoper(snd_mode&)
  8722.   $F%
  8723.   RETURN XBIOS(136,W:snd_mode&)
  8724. ENDFUNC
  8725. > FUNCTION devconnect(snd_src&,snd_dat&,snd_srcclk&,snd_prescale&,snd_protocol&)
  8726.   $F%
  8727.   RETURN XBIOS(139,W:snd_src&,W:snd_dat&,W:snd_srcclk&,W:snd_prescale&,W:snd_protocol&)
  8728. ENDFUNC
  8729. > FUNCTION sndstatus(iph_reset&)
  8730.   $F%
  8731.   RETURN XBIOS(140,W:iph_reset&)
  8732. ENDFUNC
  8733. > FUNCTION buffptr(snd_ptr%)
  8734.   $F%
  8735.   RETURN XBIOS(141,L:snd_ptr%)
  8736. ENDFUNC
  8737.