;------------------------------------------
 
;     Вражеский интеллект - СТРАТЕГИЯ
 
;------------------------------------------
 
;*L+
 
pntINI  ;инициализация параметров точки сбора
 
        if 1==0
 
        LD H,WX_BAD/256 ;[--10]
 
        LD A,3
 
        LD L,WX_BAD&255
 
        PUSH HL
 
        CALL BA
 
        ADD A,63
 
        LD C,A
 
        LD A,10
 
        POP HL
 
        CALL BA
 
        CP C
 
        JR Z,crc10
 
        ;
 
       LD HL,#FFF0
 
       LD (KUNGE+16),HL
 
crc10   ;
 
        endif
 
        LD A,(DIFFIC)
 
        OR A
 
        PUSH AF
 
         JR NZ,pniMR ;%1
 
         LD A,%1101
 
pniMR    LD (deMRCH),A ;скр.отступ.влш
 
        POP AF
 
        CALL NZ,UP_DIF
 
        LD A,#FF ;нач задержка
 
        LD (pntNUM),A
 
        LD A,(lev1ST)
 
        LD (pntDEL),A
 
        ;/опред. возможности пр-ва типов
 
        LD HL,pntEN+1 ;очистка
 
        LD B,5
 
pni0    LD (HL),0
 
        INC HL
 
        DJNZ pni0
 
        LD A,(kTOWER)
 
        CP 4
 
        JR NC,pni4
 
        CP 3
 
        JR NC,pni3
 
        CP 2
 
        JR NC,pni2
 
        JR pni1
 
pni4    LD (pntEN+4),A;кат
 
pni3    LD (pntEN+5),A;конн
 
pni2    LD (pntEN+0),A;луч
 
pni1    LD (pntEN+1),A;пех
 
        LD A,(kmaxC) ;по налич закл
 
        LD (pntEN+2),A
 
        LD A,(kmaxW) ;по налич закл
 
        LD (pntEN+3),A
 
        ;опред нач точки сбора
 
        LD HL,(KBUILD) ;перв. здание
 
pniP0   LD A,L
 
        OR A
 
        JR Z,pniP
 
pniPX   LD (pntX),HL
 
        RET
 
pniP    LD HL,(KUNGE) ;перв. воин /иначе error
 
        JR pniP0
 
 
 
 
 
pntACT  ;-----обработка точки сбора (1 раз в 8 тик)
 
        LD A,(TIC)
 
        AND %111
 
        CP %101
 
        RET NZ ; раз в 8 кадров (~в секунду)
 
        LD HL,pntDEL
 
        LD A,(HL)
 
        DEC (HL)
 
        OR A
 
        RET NZ ;задержка не окончена
 
        LD HL,pntNUM
 
        LD A,(HL)
 
        DEC (HL)
 
        OR A
 
        JP Z,pntATA  ;послать в атаку
 
        CP 128
 
        JP NC,pntNEW  ;новый сбор
 
        ;
 
pntNXT  ;--------произвести следующего члена отряда
 
        LD A,(pntUNI)
 
        OR A
 
        JR NZ,pnx1
 
        CALL pnxNXT
 
pnx1    LD C,A
 
        LD A,(MASTER)
 
        OR A
 
        JR Z,pnx11
 
        LD HL,pnxBLT-3
 
        LD A,C
 
        CP 5
 
        JR Z,pnxW
 
        CP 6
 
        JR NZ,pnx2
 
        ;
 
pnxW    ;если волшебник есть - не производить его, а отозвать
 
        PUSH AF
 
        CALL loop_K
 
pnxW0   LD A,(IX+0)
 
        OR A
 
        JR Z,pnxW1
 
        LD A,(IX+4) ;волш?
 
        CP C
 
        JR NZ,pnxW1
 
        LD A,(IX+13) ;не охр?
 
        CP 12
 
        JP NC,pnxFRW ;нашли волш, вернуть на базу
 
pnxW1   ADD IX,DE
 
        DJNZ pnxW0
 
        POP AF
 
        JR pnx2
 
        ;
 
pnx11   LD HL,pnxBLT-6 ;для кунгов
 
        LD A,C
 
        ADD A,9
 
        LD C,A
 
        CP 14
 
        JR Z,pnxW
 
        CP 15
 
        JR Z,pnxW
 
pnx2    LD (pntMAN),A
 
        CALL BA
 
        ;//опред здания для пр-ва
 
        LD C,A
 
        LD B,#28
 
        LD IX,KBUILD
 
        LD HL,(pntX)
 
        LD DE,#FFFF ;номер/расст
 
        EXX
 
        LD B,32
 
        LD DE,8
 
pnx0    EXX
 
        LD A,(IX+0)
 
        OR A
 
        JR Z,pnx4
 
        LD A,(IX+2)
 
        CP C
 
        JR NZ,pnx4
 
        PUSH BC
 
        CALL DIST2 ;искать ближайшее
 
        POP BC
 
        CP E
 
        JR NC,pnx4
 
        LD E,A
 
        LD D,B
 
pnx4    INC B
 
        EXX
 
        ADD IX,DE
 
        DJNZ pnx0
 
        EXX
 
        LD A,D
 
        CP #FF
 
        JR NZ,pnxOK
 
        ;//не найдено здание :(
 
pnxNIL  LD A,2
 
        LD (pntDEL),A
 
        RET
 
pnxOK   ;//дать задержку на пр-во
 
        LD A,D
 
        CALL B_IX
 
        LD A,(IX+2)
 
        LD HL,hcTIME
 
        CALL BA
 
        SRL A
 
        SRL A
 
        SRL A
 
        LD (pntDEL),A
 
        ;//произвести воина
 
        CALL HL_IX0
 
        CALL stayON
 
        LD A,(pntMAN)
 
        PUSH AF
 
        EX AF,AF
 
        LD A,1
 
        CALL NEWHER
 
        JR NZ,pnoMEM
 
pnxOK1  LD (IX+13),2 ;ждущий
 
        LD HL,(pntX)
 
        CALL IXt_HL
 
        CALL IX_93
 
        POP AF
 
        CP 7
 
        JR Z,pnxKT
 
        CP 16
 
        RET NZ
 
pnxKT   ;катапульты - сразу в бой
 
        LD (IX+13),3
 
        JP IX_98
 
pnoMEM  POP AF ;нет памяти
 
        RET
 
pnxFRW  CALL pnxNIL ;волш уже есть
 
        JR pnxOK1
 
        ;
 
pnxBLT  ;тип производящего здания (3..8, 12..17)
 
        DEFB 1,1,3,6,1,1, 11,11,13,16,11,11
 
 
 
 
 
pntATA  ;--------послать отряд в атаку
 
         LD A,(levTYP)
 
         CP 2
 
         JR NZ,pnaa ;для типа 2 выбрать охранника и послать в атаку
 
         LD B,10 ;число попыток
 
att1     CALL RND
 
         AND #3F
 
         CP 48
 
         JR NC,att1
 
         ADD A,48
 
         CALL N_IX
 
         LD A,(IX+0)
 
         OR A
 
         JR Z,attx
 
         LD (IX+13),3
 
         LD B,1
 
attx     DJNZ att1
 
pnaa    ;подать всем команду атаковать поз HL
 
        CALL loop_K
 
pna0    LD A,(IX+0)
 
        OR A
 
        JR Z,pna1
 
        LD A,(IX+13)
 
        CP 2
 
        JR NZ,pna1
 
        LD (IX+13),3 ;ждущий->атакующий
 
        ;
 
        LD A,(IX+4)
 
        CP 9
 
        JR C,pna50
 
        SUB 9
 
pna50   CP 5
 
        JR Z,pna66
 
        CP 6
 
        JR NZ,pna60
 
        LD C,15 ;волш-атак
 
        JR pna77
 
pna66   LD C,12 ;свящ-атак
 
pna77   CALL pnMAGI
 
        LD (IX+13),C
 
        ;
 
pna60   LD A,(IX+3) ;неодновр. старт
 
        OR A
 
        JR NZ,pna0a
 
        CALL RND
 
        AND %00000111
 
        OR  %10000000
 
        LD (IX+3),A
 
pna0a   CALL IX_98
 
pna1    ADD IX,DE
 
        DJNZ pna0
 
        ;/расч del до след сбора = levDEL+RND(32)
 
        CALL RND
 
        AND %11111
 
        LD HL,(levDEL)
 
        ADD A,L
 
        LD (pntDEL),A
 
        RET
 
        ;
 
pnMAGI  ;вх: C=нач уровень магии вых: C+=0..2
 
        LD A,R
 
        RRCA
 
        RET C ;+0 /50%
 
        INC C
 
        RRCA
 
        RET C;+1 /25%
 
        INC C
 
        RET ;+2 /25%
 
 
 
 
 
 
 
pntNEW  ;--------начать новый сбор
 
        if 1==0
 
        CALL _TST#5
 
        endif
 
        ;выбор базового здания
 
        LD B,16
 
pnw0    CALL RND
 
        AND #1F
 
        ADD A,#28
 
        CALL B_IX
 
        LD A,(IX+0)
 
        OR A
 
        JR NZ,pnw1
 
        DJNZ pnw0
 
        JR pnwX ;нет зданий
 
pnw1    ;//выбрать базовую точку (+7..-8)
 
        if 1==0
 
         LD HL,isTST8 ;[**]
 
         DEC (HL)
 
        endif
 
        CALL HL_IX0
 
        EX DE,HL
 
        LD B,16
 
pnw2    LD C,E
 
        CALL RNDshf
 
        LD L,A
 
        LD C,D
 
        CALL RNDshf
 
        LD H,A
 
        PUSH HL
 
        CALL GMAP2
 
        LD A,(HL)
 
        POP HL
 
        OR A
 
        JR Z,pnw3
 
        DJNZ pnw2
 
        JR pnwX ;вокруг нет своб места
 
pnw3    LD (pntX),HL ;нов место сбора
 
pnwX    ;//выбрать число воинов
 
        LD A,(levMAX)
 
        CP 2
 
        JR C,pnwM0
 
        DEC A
 
        LD B,A
 
        LD C,1
 
pnwM1   CALL RND
 
        RLCA
 
        JR C,pnwM3
 
        INC C
 
pnwM3   DJNZ pnwM1
 
        LD A,C
 
pnwM0   LD (pntNUM),A
 
        ;//выбрать тип отряда (в 20% - однородный)
 
        CALL RND
 
        CP 201
 
        LD A,0
 
        JR C,pnwU0
 
        ;отряд однородный
 
pnwNU   CALL pnxNXT
 
        CP 5
 
        JR Z,pnwNU ;не волш/свящ
 
        CP 6
 
        JR Z,pnwNU
 
pnwU0   LD (pntUNI),A
 
        ;//задержка=1
 
        LD A,1
 
        LD (pntDEL),A
 
        ;--иногда смена цели
 
        LD A,R
 
        AND %10100
 
        RET NZ
 
        JR Z,selNEW
 
 
 
pnxNXT  CALL pnxNX1 ;тип след члена отряда ->A
 
        LD A,C
 
        LD HL,pntEN-3
 
        CALL BA
 
        OR A
 
        JR Z,pnxNXT
 
        LD A,C
 
        RET
 
        ;
 
pnxNX1  CALL RND ;вероятн появл
 
        LD C,3
 
        SUB 70
 
        RET C ;луч (3)
 
        INC C
 
        SUB 50
 
        RET C ;воин (4)
 
        INC C
 
        SUB 20
 
        RET C ;свящ (5)
 
        INC C
 
        SUB 25
 
        RET C ;волш (6)
 
        INC C
 
        SUB 10
 
        RET C ;катап (7)
 
        INC C
 
        ;sub 75
 
        RET ;конник (8)
 
 
 
selTAR  ;выбор/коррекция общей цели
 
        LD A,(pntTAR)
 
        CP #FF
 
        JR Z,selNEW
 
        CP #80
 
        JR NC,sttBU
 
        ;цель-воин - жив?
 
        CALL N_IX
 
        LD A,(IX+0)
 
        OR A
 
        JR Z,selNEW ;мёртв
 
        LD A,(IX+1)
 
        CP #80
 
        JR NC,selNEW ;в здании
 
        RET
 
sttBU   ;цель-здание
 
        AND #7F
 
        CALL B_IX
 
        LD A,(IX+0)
 
        OR A
 
        RET NZ ;цело
 
        ;
 
selNEW  ;----нов цель
 
        ;поиск здания
 
        LD B,16 ;число попыток
 
stt0    CALL RND
 
        AND #1F
 
        ADD A,8
 
        LD C,A
 
        CALL B_IX
 
        LD A,(IX+0)
 
        OR A
 
        JR NZ,sttNB
 
        DJNZ stt0
 
        ;поиск человека
 
        LD B,24 ;число попыток
 
stt1    CALL RND
 
        AND #3F
 
        CP 48
 
        JR NC,stt1
 
        LD C,A
 
        CALL N_IX
 
        LD A,(IX+0)
 
        OR A
 
        JR NZ,sttx
 
        DJNZ stt1
 
        LD C,#FF ;цель не найдена
 
        JR sttx
 
sttNB   SET 7,C
 
sttx    LD A,C
 
        LD (pntTAR),A
 
        RET