?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. ;интеллект воинов компьютера и играющего (28.05.97)
  2.  
  3. ;BUF512 array[64], где [i = X/8+Y%8], array[i]={ссылка на первого врага
  4. ;       в квадранте|#00,если квадрант пуст}
  5. ;+256   список врагов (номер врага)(ссылка на следующего|#00}
  6.  
  7. ;----------2D-сортировка наших (обычная)
  8.  
  9. QH1SRT  LD DE,HBUILD ;сортировка наших зданий
  10.         LD BC,#2088
  11.         LD A,7
  12.         LD (qad__+1),A
  13.         CALL QAD_
  14.         LD A,15
  15.         LD (qad__+1),A
  16.         RET
  17.  
  18. Q1SORT  LD DE,HUMAN ;сортировка наших воинов --""--
  19.         LD BC,#3000
  20. QAD_    LD HL,BUF512+64
  21.         XOR A
  22. qadC    DEC L ;очистка
  23.         LD (HL),A
  24.         JR NZ,qadC
  25.         PUSH BC
  26.         EXX
  27.         POP BC
  28.         LD HL,BUF512+256
  29. qad1    EXX
  30.         LD A,(DE)
  31.         INC E
  32.         OR A
  33.         JR Z,qad0 ;мёртв
  34.         LD L,A
  35.         ;выч адр
  36.         SRA L
  37.         SRA L
  38.         SRA L
  39.         LD A,(DE)
  40.         CP #80
  41.         JR NC,qad0 ;в здании
  42.         AND %00111000
  43.         OR L
  44.         LD L,A
  45.         LD H,BUF512/256
  46.         LD A,(HL)
  47.         OR A
  48.         JR Z,qad5
  49.         LD H,BUF512/256+1
  50. qad6    LD L,A
  51.         LD A,(HL)
  52.         OR A
  53.         JR NZ,qad6
  54. qad5    EXX
  55.         LD (HL),C
  56.         INC L
  57.         LD (HL),0
  58.         LD A,L
  59.         INC L
  60.         EXX
  61.         LD (HL),A
  62. qad0    LD A,E
  63. qad__   ADD A,15
  64.         LD E,A
  65.         JR NC,qad10
  66.         INC D
  67. qad10   EXX
  68.         INC C
  69.         DJNZ qad1
  70.         RET
  71.  
  72. ;--------------- 2D-cортировка врагов с учётом видимости
  73.  
  74. QH2SRT  LD DE,KBUILD ;сортировка вражих зданий
  75.         LD BC,#20A8
  76.         LD A,7
  77.         LD (qvd__+1),A
  78.         CALL QVD_
  79.         LD A,15
  80.         LD (qvd__+1),A
  81.         RET
  82.  
  83. Q2SORT  LD DE,KUNGE ;сортировка врагов по квадратам 8х8
  84.         LD BC,#3030
  85. QVD_    LD HL,BUF512+64
  86.         XOR A
  87. qvdC    DEC L ;очистка
  88.         LD (HL),A
  89.         JR NZ,qvdC
  90.         PUSH BC
  91.         EXX
  92.         POP BC
  93.         LD HL,BUF512+256
  94. qvd1    EXX
  95.         LD A,(DE)
  96.         INC E
  97.         OR A
  98.         JR Z,qvd0 ;мёртв
  99.         LD L,A
  100.         LD A,(DE)
  101.         CP #80
  102.         JR NC,qvd0 ;в здании
  103.         LD H,A
  104.         PUSH HL
  105.         CALL GMAP ;пров видим
  106.         LD A,(HL)
  107.         POP HL
  108.         RLA
  109.         JR C,qvd0
  110.         ;выч адр
  111.         SRA L
  112.         SRA L
  113.         SRA L
  114.         LD A,H
  115.         AND %00111000
  116.         OR L
  117.         LD L,A
  118.         LD H,BUF512/256
  119.         LD A,(HL)
  120.         OR A
  121.         JR Z,qvd5
  122.         LD H,BUF512/256+1
  123. qvd6    LD L,A
  124.         LD A,(HL)
  125.         OR A
  126.         JR NZ,qvd6
  127. qvd5    EXX
  128.         LD (HL),C
  129.         INC L
  130.         LD (HL),0
  131.         LD A,L
  132.         INC L
  133.         EXX
  134.         LD (HL),A
  135. qvd0    LD A,E
  136. qvd__   ADD A,15
  137.         LD E,A
  138.         JR NC,qvd10
  139.         INC D
  140. qvd10   EXX
  141.         INC C
  142.         DJNZ qvd1
  143.         RET
  144.  
  145. QNUM    LD L,(IX+0) ;найти номер квадрата
  146.         SRA L
  147.         SRA L
  148.         SRA L
  149.         LD A,(IX+1)
  150.         AND %00111000
  151.         OR L
  152.         LD L,A
  153.         LD H,BUF512/256
  154.         RET
  155.  
  156. ;--------- СКАНИРОВАНИЕ ---------------------------
  157.  
  158. ;номера П/П сканирования QSC_N
  159. ;12223
  160. ;40005
  161. ;40005
  162. ;67778
  163.  
  164. SCAN    LD A,(TIC)
  165.         RRCA
  166. ;       JP NC,kSCAN
  167.  
  168. ;--------- СКАНИРОВАНИЕ ДЛЯ ЛЮДЕЙ ------------
  169.  
  170. hSCAN   ;*** наши сканируют врага ***
  171.         CALL Q2SORT ;сканирование воинов
  172.         LD HL,QSCt2
  173.         LD (QSC+1),HL
  174.         CALL loop_H
  175. hww0    LD A,(IX+0)
  176.         OR A
  177.         JR Z,hww1
  178.         LD A,(IX+9)
  179.         CP 28
  180.         JR Z,hww3
  181.         CP 2
  182.         JR NC,hww1
  183. hww3    LD E,#FF ;E=мин дист
  184.         CALL hwwSCA ;cканировать, если тек действия 0 или 1 или 28
  185.         LD A,E
  186.         CP #FF
  187.         JR NC,hww1a ;в поле зрения не было никого
  188.         ;иначе атаковать цель D
  189.         LD A,(IX+9)
  190.         DEC A
  191.         LD A,4 ;норм.атака
  192.         JR NZ,hww4
  193.         LD A,26 ;атака не сходя с места
  194. hww4    LD (IX+9),A
  195.         LD (IX+12),D
  196.         CALL HL_IX0
  197.         CALL IXt_HL
  198. hww1a   LD DE,16
  199. hww1    ADD IX,DE
  200.         DJNZ hww0
  201.         ;;
  202. hwwH    LD A,(TIC) ;50%
  203.         RRCA
  204.         RET C
  205.         CALL QH2SRT;сканирование зданий
  206.         LD HL,QSCt2H
  207.         LD (QSC+1),HL
  208.         CALL loop_H
  209. hww50   LD A,(IX+0)
  210.         OR A
  211.         JR Z,hww51
  212.         LD A,(IX+9)
  213.         CP 2
  214.         JR NC,hww51
  215.         LD E,#FF ;E=мин дист
  216.         CALL hwwSCA ;cканировать, если текущ действия 0 или 1
  217.         LD A,E
  218.         CP #FF
  219.         JR NC,hww51a ;в поле зрения не было никого
  220.         ;иначе атаковать цель D
  221.         LD A,(IX+9)
  222.         OR A
  223.         LD A,28 ;норм.атака (м.быть прервана)
  224.         JR Z,hww54
  225.         LD A,26 ;атака не сходя с места
  226. hww54   LD (IX+9),A
  227.         LD (IX+12),D
  228.         CALL HL_IX0
  229.         CALL IXt_HL
  230. hww51a  LD DE,16
  231. hww51   ADD IX,DE
  232.         DJNZ hww50
  233.         RET
  234.  
  235. ;------------ СКАНИРОВАНИЕ ДЛЯ ВРАГА --------
  236.  
  237. kSCAN   ;*** сканируet враг ***
  238.         CALL Q1SORT ;сканирование воинов
  239.         CALL loop_K
  240. kww0    LD A,(IX+0)
  241.         OR A
  242.         JR Z,kww1
  243.         LD A,(IX+9) ;сканировать для 0,3,28
  244.         OR A
  245.         JR Z,kww3c
  246.         CP 3
  247.         JR Z,kww3a
  248.         CP 28
  249.         JR NZ,kww1
  250. kww3a   LD HL,QSCt1m ;п/п для атакующих
  251.         LD A,(IX+13)
  252.         CP 6
  253.         JR C,kww3
  254.         CALL kwwMAG
  255.         JR kww1a
  256. kww3c   LD A,(IX+4) ;катапульты - всегда максимальн скан
  257.         CP 7
  258.         JR Z,kww3a
  259.         CP 16
  260.         JR Z,kww3a
  261.         LD HL,QSCt1 ;п/п для охраны
  262. kww3    LD (QSC+1),HL
  263.         LD E,#FF ;E=мин дист
  264.         CALL hwwSCA
  265.         LD A,E
  266.         CP #FF
  267.         JR NC,kww1a ;в поле зрения не было никого
  268.         ;иначе атаковать цель D
  269.         CALL HELPme ;норм.атака + помощь
  270. kww1a   LD DE,16
  271. kww1    ADD IX,DE
  272.         DJNZ kww0
  273.         ;;
  274. kwwH    LD A,(TIC) ;50%
  275.         RRCA
  276.         RET NC
  277.         CALL QH1SRT;сканирование зданий
  278.         LD HL,QSCt1H
  279.         LD (QSC+1),HL
  280.           CALL loop_K
  281. kww50   LD A,(IX+0)
  282.         OR A
  283.         JR Z,kww51
  284.         LD A,(IX+9)
  285.         OR A
  286.         JR NZ,kww51
  287.         LD A,(IX+13)
  288.         CP 6
  289.         JR NC,kww51 ;волшебники/крестьяне не атакуют
  290.         LD E,#FF ;E=мин дист
  291.         CALL hwwSCA ;cканировать, если текущ действия 0
  292.         LD A,E
  293.         CP #FF
  294.         JR NC,kww51a ;в поле зрения не было никого
  295.         ;иначе атаковать цель D
  296.         LD (IX+9),28 ;норм.атака (м.быть прервана)
  297.         LD (IX+12),D
  298.         CALL HL_IX0
  299.         CALL IXt_HL
  300. kww51a  LD DE,16
  301. kww51   ADD IX,DE
  302.         DJNZ kww50
  303.         RET
  304.  
  305. kwwMAG  CP 10 ;IX+13
  306.         RET C ;крестьяне не сканируют
  307.         LD HL,QSCt1W ;п/п для волшебников
  308.         LD (QSC+1),HL
  309.         LD E,#FF ;E=мин дист
  310.         CALL hwwSCA
  311.         LD A,E
  312.         CP #FF
  313.         JR Z,kwwM1
  314.         CP 10 ;миним. расст. сближения
  315.         JP NC,IX_98 ;близко - никого
  316.         LD A,R
  317.         LD HL,deMRCH ;ск.отступл - зависит от DIFFIC
  318.         AND (HL)
  319.         JP NZ,IX_98
  320.         LD HL,(pntX)
  321.         CALL IXt_HL
  322.         JP IX_93
  323. kwwM1   LD A,R
  324.         AND %11101 ;компенс глюков 8х8 :-(
  325.         RET NZ
  326.         JP IX_98
  327.  
  328. HELPme  ;позвать на помощь врагов
  329.         LD A,(DIFFIC)
  330.         ADD A,A
  331.         ADD A,A
  332.         ADD A,6
  333.         LD (HLPrng+1),A
  334.         PUSH BC
  335.         PUSH IX
  336.         CALL HL_IX0 ;коор ц
  337.         LD C,D      ;N ц
  338.         CALL loop_K
  339. hme0    LD A,(IX+0)
  340.         OR A
  341.         JR Z,hme1
  342.          LD A,(IX+13) ;не звать волшебников/крестьян
  343.          CP 6
  344.          JR C,hme7
  345.          LD A,(IX+9)
  346.          CP 4
  347.          JR NC,hme1 ;0..3->0, остальные действуют
  348.          CALL IX_98
  349.          JR hme1
  350. hme7    LD A,(IX+9) ;звать на помощь, если тек действия 0,3,28
  351.         OR A
  352.         JR Z,hme2
  353.         CP 3
  354.         JR Z,hme2
  355.         CP 28
  356.         JR NZ,hme1
  357. hme2    PUSH BC
  358.         CALL DIST2
  359.         CALL HLPrng ;дальность
  360.         JR NC,hme10
  361.         LD (IX+12),C
  362.         LD (IX+9),4 ;немедл нападение
  363.         PUSH HL
  364.         CALL HL_IX0
  365.         CALL IXt_HL
  366.         POP HL
  367.         LD A,(IX+13)
  368.         CP 1
  369.         CALL Z,ZAMENA
  370.          LD A,(levTYP) ;на нач уровнях засада переходит в атаку
  371.          OR A
  372.          JR Z,hme10
  373.          LD (IX+13),3
  374. hme10   POP BC
  375. hme1    ADD IX,DE
  376.         DJNZ hme0
  377.         POP IX
  378.         POP BC
  379.         RET
  380.  
  381. actRUN  ;атакующим убегать?
  382.         LD A,(levTYP)
  383.         OR A
  384.         RET NZ ;только на обычн уровнях
  385.         LD A,(DIFFIC)
  386.         XOR %110111
  387.         LD L,A
  388.         LD A,R
  389.         AND L
  390.         RET NZ
  391.         JR OUTme
  392.  
  393. isRUN   ;охране убегать?
  394.         LD A,(TIC)
  395.         AND 63
  396.         CP 48
  397.         RET NC
  398.         ADD A,48
  399.         CALL N_IX
  400.         LD A,(IX+0)
  401.         OR A
  402.         RET Z
  403.         LD A,(IX+13)
  404.         CP 1
  405.         RET NZ
  406.         ;охр
  407.         LD L,(IX+14)
  408.         LD H,(IX+15)
  409.         CALL DIST2
  410.         CP 6
  411.         RET C
  412.         LD A,R
  413.         AND %101110
  414.         RET NZ
  415.         ;
  416. OUTme   ;отступаем!!!
  417.         PUSH IX
  418.         CALL HL_IX0 ;коор ц
  419.         CALL loop_K
  420. ome0    LD A,(IX+0)
  421.         OR A
  422.         JR Z,ome1
  423.         LD A,(IX+4)
  424.         CP 18
  425.         JR NC,ome1 ;магические - не отступают
  426.         PUSH BC
  427.         CALL DIST2
  428.         CP 9 ;радиус оповещения об отступлении
  429.         JR NC,ome10
  430.          LD A,(IX+13)
  431.          CP 6
  432.          JR NC,ome10 ;не звать пеонов/волш
  433.         PUSH HL
  434.         CP 1
  435.         JR NZ,ome3
  436.         ;охр. бегут
  437.         LD L,(IX+14)
  438.         LD H,(IX+15)
  439.         JR ome31
  440. ome3    ;атакующ бегут
  441.         LD (IX+13),2
  442.         LD HL,(pntX)
  443. ome31   CALL IXt_HL
  444.         POP HL
  445.         CALL IX_92
  446. ome10   POP BC
  447. ome1    ADD IX,DE
  448.         DJNZ ome0
  449.         POP IX
  450.         RET
  451.  
  452. ZAMENA  ;по возможности замени охранника
  453.         PUSH IX
  454.         LD L,(IX+14)
  455.         LD H,(IX+15)
  456.         LD C,(IX+4)
  457.         CALL loop_K
  458. zmn0    LD A,(IX+0)
  459.         OR A
  460.         JR Z,zmn1
  461.         LD A,(IX+4) ;такой же?
  462.         CP C
  463.         JR NZ,zmn1
  464.         LD A,(IX+13) ;из нов отряда?
  465.         CP 2
  466.         JR NZ,zmn1
  467.         LD (IX+14),L
  468.         LD (IX+15),H
  469.         DEC (IX+13) ; -> охр
  470.         POP IX
  471.         LD (IX+13),3 ;охр -> атак
  472.         RET
  473. zmn1    ADD IX,DE
  474.         DJNZ zmn0
  475.         POP IX
  476.         RET
  477.  
  478. ;----сканир: вспом.процедуры ----------------
  479.  
  480. QSCt1H  ;cкан одного квадрата 8Х8 (поиск наших зданий)
  481.         PUSH HL ;\\ в квадрате враг
  482.         PUSH BC
  483.         INC H ;=BUF512/256
  484. qskh10  LD L,A
  485.         PUSH HL ;\\\
  486.         DEC L
  487.         LD A,(HL) ;=номер врага
  488.         LD C,A
  489.         PUSH IX
  490.         AND #7F
  491.         CALL B_IX
  492.         CALL HL_IX0
  493.         LD A,(IX+2)
  494.         POP IX
  495.         CALL DISTsH
  496.         CP E
  497.         JR NC,qskh20
  498.         CP 7 ;радиус сканирования здания!
  499.         JR NC,qskh20 ;вне досягаемости
  500. qskh11  LD E,A
  501.         LD D,C
  502. qskh20  POP HL  ;///
  503.         LD A,(HL)
  504.         OR A
  505.         JR NZ,qskh10
  506.         POP BC
  507.         POP HL ;//
  508.         RET
  509.  
  510. QSCt1   ;cкан одного квадрата 8Х8 (поиск наших вражеской охраной)
  511.         PUSH HL ;\\ в квадрате враг
  512.         PUSH BC
  513.         INC H ;=BUF512/256
  514. qsk10   LD L,A
  515.         PUSH HL ;\\\
  516.         DEC L
  517.         LD A,(HL) ;=номер врага
  518.         LD C,A
  519.         PUSH IX
  520.         CALL N_IX
  521.         LD HL,ksSCAN
  522.         CALL gPAR
  523.         LD B,A
  524.         CALL HL_IX0
  525.         POP IX
  526.         PUSH BC
  527.         CALL DIST2
  528.         POP BC
  529.         CP B ; Зона досяг врага (зависит от типа обнаруженного воина)
  530.         JR NC,qsk20 ;вне досягаемости
  531.         CP E
  532.         JR NC,qsk20
  533.         LD E,A
  534.         LD D,C
  535. qsk20   POP HL  ;///
  536.         LD A,(HL)
  537.         OR A
  538.         JR NZ,qsk10
  539.         POP BC
  540.         POP HL ;//
  541.         RET
  542.  
  543. QSCt1W  ;cкан одного квадрата 8Х8 (поиск волшебниками врага)
  544.         PUSH HL ;\\ в квадрате враг
  545.         PUSH BC
  546.         LD B,11 ;величина зоны+1 сканирования
  547.         JR qsk10w
  548. QSCt1m  ;cкан одного квадрата 8Х8 (поиск наших идущими в атаку)
  549.         PUSH HL ;\\ в квадрате враг
  550.         PUSH BC
  551.         LD B,9  ;величина зоны+1 сканирования
  552. qsk10w  INC H ;=BUF512/256
  553. qsk10m  LD L,A
  554.         PUSH HL ;\\\
  555.         DEC L
  556.         LD A,(HL) ;=номер врага
  557.         LD C,A
  558.         PUSH IX
  559.         CALL N_IX
  560.         CALL HL_IX0
  561.         POP IX
  562.         PUSH BC
  563.         CALL DIST2
  564.         POP BC
  565.         CP B ; Зона досяг врага
  566.         JR NC,qsk20m ;вне досягаемости
  567.         CP E
  568.         JR NC,qsk20m
  569.         LD E,A
  570.         LD D,C
  571. qsk20m  POP HL  ;///
  572.         LD A,(HL)
  573.         OR A
  574.         JR NZ,qsk10m
  575.         POP BC
  576.         POP HL ;//
  577.         RET
  578.  
  579.  
  580. QSCt2H  ;cкан одного квадрата 8Х8 (поиск вражих зданий)
  581.         PUSH HL ;\\ в квадрате враг
  582.         PUSH BC
  583.         INC H ;=BUF512/256
  584. qsch10  LD L,A
  585.         PUSH HL ;\\\
  586.         DEC L
  587.         LD A,(HL) ;=номер врага
  588.         LD C,A
  589.         PUSH IX
  590.         AND #7F
  591.         CALL B_IX
  592.         CALL HL_IX0
  593.         LD A,(IX+2)
  594.         POP IX
  595.         CALL DISTsH
  596.         CP E
  597.         JR NC,qsch20
  598.         LD B,A
  599.         LD A,(IX+4)
  600.         LD HL,sSCAN
  601.         CALL BA
  602.         CP 8
  603.         JR NC,qschkt
  604.         CP B
  605.         JR C,qsch20 ;вне досягаемости
  606. qsch11  LD E,B
  607.         LD D,C
  608. qsch20  POP HL  ;///
  609.         LD A,(HL)
  610.         OR A
  611.         JR NZ,qsch10
  612.         POP BC
  613.         POP HL ;//
  614.         RET
  615.         ;
  616. qschkt  ;для катап
  617.         LD A,B
  618.         CP 3
  619.         JR C,qsch20 ;слишком близко
  620.         CP 9
  621.         JR NC,qsch20 ;слишком далеко
  622.         JR qsch11
  623.  
  624.  
  625. QSCt2   ;cкан одного квадрата 8Х8 (поиск врагов)
  626.         PUSH HL ;\\ в квадрате враг
  627.         PUSH BC
  628.         INC H ;=BUF512/256
  629. qsc10   LD L,A
  630.         PUSH HL ;\\\
  631.         DEC L
  632.         LD A,(HL) ;=номер врага
  633.         LD C,A
  634.         PUSH IX
  635.         CALL N_IX
  636.         CALL HL_IX0
  637.         LD (en_IX),HL
  638.         POP IX
  639.         CALL DIST2
  640.         CP E
  641.         JR NC,qsc20
  642.         LD B,A
  643.         LD A,(IX+4)
  644.         LD HL,sSCAN
  645.         CALL BA
  646.         CP 8
  647.         JR NC,qcs_kt
  648.         CP B
  649.         JR C,qsc20 ;вне досягаемости
  650. qsc11   LD E,B
  651.         LD D,C
  652. qsc20   POP HL  ;///
  653.         LD A,(HL)
  654.         OR A
  655.         JR NZ,qsc10
  656.         POP BC
  657.         POP HL ;//
  658.         RET
  659.         ;
  660. qcs_kt  ;для катап
  661.         LD A,B
  662.         CP 3
  663.         JR C,qsc20 ;слишком близко
  664.         CP 9
  665.         JR NC,qsc20 ;слишком далеко
  666.         PUSH DE
  667.         CALL qscOWN
  668.         POP DE
  669.         JR Z,qsc20 ;наши рядом
  670.         JR NZ,qsc11
  671.  
  672.  
  673. DISTsH  ;DIST2 для здания при сканировании (A-тип здания)
  674.         CP 8
  675.         JR Z,dhh1
  676.         CP 18
  677.         JR Z,dhh1
  678.         ;для обычн зданий
  679. dhh0    CALL DIST2
  680.         DEC A
  681.         RET
  682. dhh1    ;для хибар и изб
  683.         LD A,L
  684.         CP (IX+0)
  685.         JP C,DIST2
  686.         LD A,H
  687.         CP (IX+1)
  688.         JP C,DIST2
  689.         JR dhh0
  690.  
  691. qscOWN  LD HL,(en_IX) ;есть ли рядом наши (NZ/Z-нет/есть)
  692. humOWN  DEC H ;для катапульты
  693.         DEC L
  694.         CALL GMAP2
  695.         CALL qscOW1
  696.         CALL qscOW1
  697.         CALL qscOW1
  698.         LD DE,61
  699.         ADD HL,DE
  700.         CALL qscOW1
  701.         INC L
  702.         CALL qscOW1
  703.         ADD HL,DE
  704.         CALL qscOW1
  705.         CALL qscOW1
  706.         CALL qscOW1
  707.         INC A ;nz
  708.         RET ;!!
  709.  
  710. qscOW1  LD A,(HL)
  711.         INC L
  712.         CP #80
  713.         RET C
  714.         CP #B0
  715.         RET NC
  716.         POP HL ;!!
  717.         XOR A
  718.         RET ; z- нельзя стрелять
  719.  
  720.  
  721.         macro qsKs
  722.         LD A,(HL)
  723.         CP #B0
  724.         RET NC ;nc-нельзя стрелять
  725.         ENDM
  726.  
  727. qkkOWN  LD HL,(en_IX) ;есть ли рядом враги (С/NC-нет/есть)
  728. kunOWN  DEC H ;для катапульты
  729.         DEC L
  730.         CALL GMAP2
  731.         qsKs
  732.         INC L
  733.         qsKs
  734.         INC L
  735.         qsKs
  736.         LD DE,62
  737.         ADD HL,DE
  738.         qsKs
  739.         INC L
  740.         INC L
  741.         qsKs
  742.         ADD HL,DE
  743.         qsKs
  744.         INC L
  745.         qsKs
  746.         INC L
  747.         LD A,(HL)
  748.         CP #B0
  749.         RET ;nc/C
  750.  
  751. ;-------скан с соблюд граничн условий
  752.  
  753.         macro QSCs
  754.         LD A,(HL)
  755.         OR A
  756.         CALL NZ,QSC
  757.         ENDM
  758.  
  759. QSC_0   LD A,L
  760.         SUB 9
  761.         LD L,A
  762.         QSCs
  763.         INC L
  764.         QSCs
  765.         INC L
  766.         QSCs
  767.         LD A,L
  768.         ADD A,6
  769.         LD L,A
  770.         QSCs
  771.         INC L
  772.         QSCs
  773.         INC L
  774.         QSCs
  775.         LD A,L
  776.         ADD A,6
  777.         LD L,A
  778.         QSCs
  779.         INC L
  780.         QSCs
  781.         INC L
  782.         QSCs
  783.         RET
  784.         ;
  785. hwwSCA  CALL QNUM ;выбор П/П сканирования
  786.         CP 8
  787.         JR C,hwwTOP
  788.         CP 56
  789.         JR NC,hwwBOT
  790.         AND 7
  791.         JR Z,QSC_4
  792.         CP 7
  793.         JR NZ,QSC_0
  794.         JR QSC_5
  795. hwwTOP  OR A
  796.         JP Z,QSC_1
  797.         CP 7
  798.         JR NZ,QSC_2
  799.         JR QSC_3
  800. hwwBOT  JR Z,QSC_6
  801.         CP 63
  802.         JR C,QSC_7
  803.         JR QSC_8
  804.         ;
  805. QSC_5   LD A,L
  806.         SUB 9
  807.         JR QSC_4a
  808. QSC_4   LD A,L
  809.         SUB 8
  810. QSC_4a  LD L,A
  811.         QSCs
  812.         INC L
  813.         QSCs
  814.         LD A,L
  815.         ADD A,7
  816.         LD L,A
  817.         QSCs
  818.         INC L
  819.         QSCs
  820.         LD A,L
  821.         ADD A,7
  822.         LD L,A
  823.         QSCs
  824.         INC L
  825.         QSCs
  826.         RET
  827.         ;
  828. QSC_2   DEC L
  829.         JR QSC_7a
  830. QSC_7   SUB 9
  831.         LD L,A
  832. QSC_7a  QSCs
  833.         INC L
  834.         QSCs
  835.         INC L
  836.         QSCs
  837.         LD A,L
  838.         ADD A,6
  839.         LD L,A
  840.         QSCs
  841.         INC L
  842.         QSCs
  843.         INC L
  844.         QSCs
  845.         RET
  846.  
  847. QSC_8   SUB 9
  848.         LD L,A
  849.         JR QSC_1
  850. QSC_6   SUB 8
  851.         LD L,A
  852.         JR QSC_1
  853. QSC_3   DEC L
  854. QSC_1   QSCs
  855.         INC L
  856.         QSCs
  857.         LD A,L
  858.         ADD A,7
  859.         LD L,A
  860.         QSCs
  861.         INC L
  862.         QSCs
  863.         RET
  864.  
  865. ;-------------------------------------------------
  866. ;--------- ВРАЖЕСКИЙ ИНТЕЛЛЕКТ -------------------
  867. ;-------------------------------------------------
  868. kPROF   DEFW AI00,AI01,AI02,AI03,AI04,AI05,AI06,AI07,AI08
  869.         DEFW AI09
  870.         DEFW AI10,AI11, AI12,AI13,AI14, AI15,AI16,AI17
  871.  
  872. kINTEL  LD A,(IX+13) ;занять работой
  873.         LD HL,kPROF
  874.         CALL WT
  875.         JP (HL)
  876.  
  877. AI00    ;none
  878.         ;\
  879. AI01    ;охранник возвращается на старт-позицию
  880.         LD L,(IX+14)
  881.         LD H,(IX+15)
  882.         CALL DIST2
  883.         OR A
  884.         RET Z
  885.         ;go home
  886.         CALL IXt_HL
  887.         JP IX_93
  888.  
  889. AI09    ;
  890. AI04    ;
  891. AI05    ;
  892. AI02    ;произведённый воин - идёт к точке сбора
  893.         RET
  894.  
  895. AI03    ;воин идёт к цели
  896.         CALL AI03_
  897.         RET Z
  898.         JP ZZ3
  899.         ;
  900. AI03_   LD A,(pntTAR)
  901.         CP #FF
  902.         RET Z ;цель не выбрана
  903.         PUSH IX
  904.         CP #80
  905.         JR NC,ai03a
  906.         CALL N_IX ;цель-человек
  907.         JR ai03b
  908. ai03a   AND #7F
  909.         CALL B_IX ;цель-здание
  910. ai03b   CALL HL_IX0
  911.         LD A,L
  912.         OR A
  913.         POP IX
  914.         RET Z; цель погибла
  915.         CALL IXt_HL
  916.         JP IX_93 ;nz
  917.  
  918.  
  919. AI08    ;peмонтник
  920.         RET
  921.  
  922.  
  923. AI06    ;рубка леса
  924.         LD A,(IX+4)
  925.         CP 9
  926.         JR C,ai06a
  927.         SUB 9
  928. ai06a   OR A
  929.         JP NZ,basTAR ;с дровами _ вали на базу
  930.         ;ищи лес
  931.         LD B,8 ;-к-во попыток поиска
  932. ai060   CALL R_awa_
  933.         CALL HL_IXt
  934.         CALL GMAP
  935.         LD A,(HL)
  936.         AND #7F
  937.         CP 61
  938.         JR C,ai06b
  939.         CP 63
  940.         JR C,ai06C
  941. ai06b   DJNZ ai060
  942. ai06C   LD (IX+9),6
  943.         RET
  944.  
  945. AI07    ;поход за золотом
  946.         LD A,(IX+4)
  947.         CP 9
  948.         JR C,ai07a
  949.         SUB 9
  950. ai07a   OR A
  951.         JP NZ,basTAR ;c мешком - вали на базу
  952.         ;ищи шахту поближе
  953.         CALL HL_IX0
  954.         LD C,#FF ;миним расст
  955.         PUSH IX
  956.         LD B,8
  957.         LD DE,8
  958.         LD IX,MINE
  959. ai070   LD A,(IX+0)
  960.         OR A
  961.         JR Z,ai071
  962.         ;расст меньше минимального?
  963.         PUSH BC
  964.         CALL DIST2
  965.         POP BC
  966.         CP C
  967.         JR NC,ai071
  968.         LD C,A
  969.         LD (en_IX),IX
  970. ai071   ADD IX,DE
  971.         DJNZ ai070
  972.         LD A,C
  973.         CP #FF
  974.         JR NZ,ai072
  975.         ;некуда идти
  976.         POP IX
  977.         LD (IX+13),6 ;стань лесорубом
  978.         JP IX_98
  979. ai072   ;идти на ближайшую шахту
  980.         LD IX,(en_IX)
  981.         CALL HL_IX0
  982.         POP IX
  983.         CALL IXt_HL
  984.         LD (IX+9),7
  985.         LD (IX+8),#80
  986.         RET
  987.  
  988.