Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

;------------------------------------------
;     Вражеский интеллект - СТРАТЕГИЯ
;------------------------------------------
;*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