Login

Subversion Repositories NedoOS

Rev

Rev 424 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;------главный цикл обработки персонажей

MOVZZ   ;п/п обр действий ix+9
        DEFW ZZ0,ZZ1,ZZ2,ZZ3,ZZ4,ZZ5,ZZ6,ZZ7,ZZ8,09
        DEFW ZZ10,ZZ11,ZZ12,ZZ13,ZZ14,ZZ15
        DEFW ZZ16,ZZ17,ZZ18,ZZ19,ZZ20,ZZ21
        DEFW ZZ22,ZZ23,ZZ24,ZZ25,ZZ26,ZZ27
        DEFW ZZ28

impANS  ;ответ на удар (0/х-нет/функция) при действии N
        DEFB 4,26,0,4,0,4,4,4,4,4
        DEFB 0,0,0,0,0,0
        DEFB 0,0,0,0,0,0
        DEFB 0,0,0,4,0,0
        DEFB 4


SHED_H  LD IX,HUMAN ;Л*Ю*Д*И
        LD IY,XY
        XOR A
        LD (HER_N),A
        LD (SIDE_N),A
        ;
        LD A,#C9 ;ret
        LD (ZZ00),A ;intel=off
        LD (ARCrng),A ;лучники vs катапульта=off
        LD A,9 ;дальность для наших катап=8
        LD (KATrng+1),A
        ;
She0    LD A,(IX+1)
        OR A
        JR Z,She1
        LD A,(IX+0)
        OR A
        CALL Z,SheTro
        CALL NZ,MOVING
She1    LD BC,16
        ADD IX,BC
        LD C,4
        ADD IY,BC
        LD HL,HER_N
        INC (HL)
        LD A,(HL)
        CP 48
        JP C,She0
        RET

SHED_K  ;К*У*Н*Г*И
        LD HL,SIDE_N
        INC (HL)
        LD A,#C3 ;jp: intel=ON
        LD (ZZ00),A
         LD A,(DIFFIC)
         OR A
         JR Z,Ske0x
         ;повышенная сложность (DIFFIC=1)
         LD A,7
         LD (KATrng+1),A ;дальность для катап врага=6
         LD A,#C3 ;jp
         LD (ARCrng),A ;лучники vs катап=ON
Ske0x   ;
Ske0    LD A,(IX+1)
        OR A
        JR Z,Ske1
        LD A,(IX+0)
        OR A
        CALL Z,SheTro
        CALL NZ,MOVING
Ske1    LD BC,16
        ADD IX,BC
        LD C,4
        ADD IY,BC
        LD HL,HER_N
        INC (HL)
        LD A,(HL)
        CP 96
        JP C,Ske0
        RET

NxtTro  ;след  фаза трупa
        DEFB #FF,0,1,2 ,#FF,4,5,6, #FF,9,8, 12,#FF,12,12,12, #FF,#FF
SheTro  ;гниение трупов
        DEC (IX+3)
        JR NZ,ShtRt
        LD HL,NxtTro
        CALL gPAR
        CP #FF
        JR NZ,SheT1
        LD (IX+1),0
        JR ShtRt
SheT1   CALL NZ,TrooTi
ShtRt   XOR A
        RET

;------------обработка пленников
SHED_p  ;П*Л*Е*Н*Н*И*К*И
        LD A,#C9 ;ret - intel off
        LD (ZZ00),A
        ;
        LD A,(TIC)
        DEC A
        AND %11
        RET NZ ;раз в 4 такта
Spe0    LD A,(IX+1)
        OR A
        JR Z,Spe1
        LD A,(IX+0)
        OR A
        CALL Z,SheTro
        CALL NZ,PRISON
Spe1    LD BC,16
        ADD IX,BC
        LD HL,HER_N
        INC (HL)
        LD A,(HL)
        CP 102
        JP C,Spe0
        RET

isFRND  ;по адр HL в GMAP2 - свой? (вых через POP)
        LD A,(HL)
        INC L
        CP #80
        RET C
        CP #B0
        RET NC
        POP AF ;!!
        LD C,(IX+5)
        LD B,(IX+2)
        PUSH IX
        PUSH BC
        LD A,(HER_N)
        CALL deSEL
        LD A,(IX+4)
        EX AF,AF
        CALL HL_IX0
        CALL IXt_HL
        XOR A
        CALL NEWHER
        POP BC
        JR NZ,iFRn ;mem?
        LD (IX+5),C
        LD (IX+2),B
iFRn    POP IX
        RET NZ ;нет памяти
        ;звёзды-пленник свободен
        PUSH IY
        CALL HL_IX0
        PUSH HL
        LD HL,00
        CALL IX0_HL
        POP HL
        CALL NEWB09
        POP IY
        JP EVENT

PRISON  LD L,A
        LD H,(IX+1)
        LD A,(IX+5)
        OR A
        JR Z,Kill ;убитый
        DEC L
        DEC H
        CALL GMAP2
        CALL isFRND
        CALL isFRND
        CALL isFRND
        LD DE,61
        ADD HL,DE
        CALL isFRND
        INC L
        CALL isFRND
        ADD HL,DE
        CALL isFRND
        CALL isFRND
        CALL isFRND ;!!
        RET

;---------------------------
KilNxt  DEFB 3,3,3,3,3,3,3,17,3
        DEFB 7,7,7,7,7,7,7,17,7
        DEFB 13,15,14,11,3,7, 10,10,10
Kill    ;убить героя по состоянию здоровья
        LD A,(IX+7);проверить магию 'хруст. шара'
        AND %11111000
        CP  %00010000
        JR Z,noKill
         ;труп деморализует - убегать?
         LD A,(SIDE_N)
         OR A
         CALL NZ,actRUN
        LD A,(HER_N)
        CALL deSEL ;отменить пометку
        CALL EVENT ;событие
        CALL HL_IX0
        RES 7,H ;если смерть наступила в здании
        CALL IXt_HL
        CALL GMAP2
        XOR A
        LD (HL),A
        LD (IX+0),A
        LD A,(IX+4)
        CP 8
        JR Z,Ki33
        CP 17
        JR NZ,Ki2
Ki33    PUSH IY
        POP HL
        LD A,(HL)
        ADD A,4 ;сдвинуть изобр трупа конников
        LD (HL),A
        JR NC,Ki1
        INC HL
        INC (HL)
Ki1     LD A,(IX+4)
Ki2     LD HL,KilNxt ;нач ф гниения
        CALL BA
        ;
TrooTi  ;время гниения фазы A
        LD (IX+4),A
        LD HL,TimTro
        CALL BA
        LD (IX+3),A
        RET
TimTro  ;время гниения фазы
        DEFB 50,60,60,70, 50,60,60,70, 1,1,1, 50,40,50,50,50, #1,80

;------------------------------
MOVING  ;обр.команд живых людей
        LD A,(IX+5)
        OR A
        JR Z,Kill ;убитый
noKill  LD A,(IX+3)  ;
        OR A         ;
        JR Z,IX3_0   ;
        CALL HERMOV  ;
        LD A,(IX+3)
        OR A
        RET NZ
IX3_0   LD A,(IX+9)
        LD HL,MOVZZ
        CALL WT
        JP (HL)

;-----параметры удара/защиты--

gB_FRC  ;получить силу снаряда
        LD HL,BFORCE-1
        LD A,(IY+4)
        JP  BA
gFORCE  ;получить знач силы удара
        LD HL,FORCE
gPAR    LD A,(IX+4)
        JP BA

gDEFEN  ;получить знач защиты  (Вх/вых: C-удар)
        LD HL,DEFENC
        CALL gPAR
        LD L,A
        LD A,R
        AND %11
        CP L
        RET NC
        INC C ;уменьш силу удара на 50%
        SRA C
        RET

;------нанесение ударов ---
cMPACT  ;удар катапульты (9клеток)
        LD L,(IY+5)
        LD H,(IY+6)
        PUSH HL
        CALL GMAP2
        LD A,(HL)
        POP HL
        CP #38
        JR C,ccM0
        CP #80
        RET C ;при ударе в здание - только в центр
ccM0    DEC L
        DEC H
        LD C,3
ccM1    PUSH HL
        LD B,3
ccM2    PUSH BC
        PUSH HL
        CALL _sMPAC
        POP HL
        POP BC
        INC L
        DJNZ ccM2
        POP HL
        INC H
        DEC C
        JR NZ,ccM1
        RET Z

buPACT  ;удар по зданию
        CALL gFORCE
        LD C,A
        PUSH IX
        LD IX,(en_IX)
_uPACT  ;уменьш энергии здания на С/8 .. (C+7)/8
        LD A,R
        AND #7
        ADD A,C
        LD C,A
        SRL C
        SRL C
        SRL C
        LD A,(IX+3)
        SUB C
        JR NC,smpi0
        XOR A
smpi0   LD (IX+3),A
         LD A,(HER_N) ;on индик0|3
          LD D,A
         AND #7F
         CP #30
         LD A,1
         JR NC,smpi31
         LD (LED+3),A
          LD A,R
          AND %1111
          CALL Z,HELPme ;обижают здание врага
          JR smpi3
smpi31   LD (LED+0),A
smpi3   POP IX
        RET

sMPACT  ;огн.дождь наносит удар
        LD L,(IY+5)
        LD H,(IY+6)
_sMPAC  LD A,(IY+7)
        LD (HER_N),A
        CALL GMAP2
        LD A,(HL)
        CP #80
        JR C,smpp1
        SUB #80 ;для врагов
        JR IMPB_
smpp1   CP 2
        RET C ;нельзя атаковать бордюр
        SUB #38
        JR C,smww1
smpp2   ;(для враж.зданий)
        display "sMPACT=",sMPACT
        display "smpp2=",$
        PUSH IX
        CALL B_IX
        LD (en_IX),IX ;/для FX
        CALL gB_FRC
        LD C,A
        JR _uPACT
        ;
smww1   ;возможно стена (видимая)
        RES 4,H
        LD A,(HL)
        AND #7F
        CP 64
        RET C
        CP 78
        RET NC
        CP 71
        JR C,smww2
        CALL RND
        RLCA
        RET NC ;50%
        LD DE,64
        PUSH HL
        ADD HL,DE ;удалить хвостик забора
        LD A,(HL)
        AND #7F
        CP 51
        JR NZ,smww3
        LD A,(HL)
        SUB 50
        LD (HL),A
smww3   POP HL
        LD DE,-64
        LD C,1
        PUSH HL ;если сверху забор - поставить хвостик
        ADD HL,DE
        LD A,(HL)
        AND #7F
        CP 64
        JR C,smww4
        CP 78
        JR NC,smww4
        LD C,51
smww4   POP HL
        LD A,(HL)
        AND #80
        ADD A,C
        LD (HL),A ;добить полуразрушенную
        SET 4,H
        LD (HL),0
        RET
smww2   CALL RND ;частично разрушить
        RLCA
        RET C ;50%
        LD A,(HL)
        ADD A,7
        LD (HL),A
        RET

BMPACT  ;пуля наносит удар
        LD A,(IY+7)
        LD (HER_N),A
        CALL N_IX
        LD A,(IY+5)
        BIT 7,A
        JR NZ,smpp2
IMPB_   PUSH IX
        LD (en_A),A
        CALL N_IX
        LD (en_IX),HL
        CALL gB_FRC
        LD C,A
        JR IMPA_
        ;
IMPACT  ;наносится удар
        LD A,(en_A)
        CP #80       ;здание?
        JP NC,buPACT
        ;наносится удар врагу (en_IX)
        ;c учётом защиты
        CALL RND
        AND 7
        JR Z,ipt0 ;1/8 - промах
        CALL gFORCE
ipt0    LD C,A
        PUSH IX
        ;учесть защиту
        LD IX,(en_IX)
IMPA_   CALL gDEFEN     ; - защита
        ;понизить здоровье
        LD A,(IX+5)
        SUB C
        JR NC,ipt1
        XOR A
ipt1    LD (IX+5),A
        POP IX
        ;следует ли отвечать потерпевшему?
        RET Z ;трупы не отвечают
        LD A,(en_A)
        CP #30
        LD A,(HER_N)
        JR NC,K_ANSW
        ;ударили нашего
        CP #30
        RET C ;ударил наш нашего
        PUSH IX
        LD IX,(en_IX)
        CP #80
         LD A,1
         LD (LED+0),A ;индик0 on
        JR C,H_ANSW
        ; ударило заклинание - убегать
        LD A,(IX+9)
        CP 2
        JR Z,ipt11 ;уже убегает
        LD A,R
        RRCA ;in 50%
        CALL C,R_away
        JR ipt11
H_ANSW  ; ответн удар нашего
        CALL _ANSW
        CALL HL_IX0
        DEC L
        DEC H
        CALL GMAP2
        CALL ANSW1
        CALL ANSW1
        CALL ANSW1
        LD DE,61
        ADD HL,DE
        CALL ANSW1
        INC L
        CALL ANSW1
        ADD HL,DE
        CALL ANSW1
        CALL ANSW1
        CALL ANSW1
ipt11   POP IX
        RET
K_ANSW  ;ответ врага
        AND #7F ;%1...
        CP #30
        RET NC ;враг ударил врага
         LD A,1
         LD (LED+3),A ;индик3 on
        CALL HL_IX0
        PUSH IX
        LD IX,(en_IX)
        LD A,(IX+9)
        CP 4
        JR NZ,kans2
        ;cравнить с текущей целью и ударить
        CALL DIST2 ;до нового обидчика+1
        INC A
        LD C,A
        CALL HL_IXt
        CALL DIST2 ;до старой цели
        CP C
        JR C,ipt11
        CALL answ10
        JR ipt11
kans2   CALL answ09
        JR ipt11


ANSW1   ;по адр HL в GMAP2 - свой? (вых через POP)
        LD A,(HL)
        INC L
        SUB #80
        RET C  ;нет (здание)
        CP #30
        RET NC ;нет (чужак)
        EXX ;сохр hl
        CALL N_IX
_ANSW   ;направить ответный удар на обидчика (HER_N)
        LD A,(IX+9)
answ09  LD HL,impANS
        CALL BA
        OR A
        JR Z,answ11 ;возможен ответ на удар?
        LD (IX+9),A
answ10  LD A,(HER_N)
        AND #7F  ;%1...
        LD (IX+12),A
        LD (IX+8),#80
        CALL HL_IX0
        CALL IXt_HL
answ11  EXX
        RET


;ZZxx-----собств обработка
ZZ0     ;cтоять
        CALL ZZsee0
        JP ZZ00 ;вызов интеллекта врагов
ZZ1     ;стоять насмерть
        CALL ZZsee0
        RET

ZZsee0  LD A,#FF ;осмотреться после останова
        CP (IX+8)
        RET Z
        LD (IX+8),A
        JP ONSEE

ZZ27    ;капульта атакует пустое место
        LD HL,WW07
        LD (JP_SUB+1),HL
        CALL HL_IXt
        JP ZZ4_
ZZ3     ;идти в атаку
ZZ2     ;просто идти
        CALL GO_MAN
        LD A,(IX+8)
        OR A
        JP NZ,ONSEE2
        LD (IX+9),A
        RET Z

WATACK  ;адреса П/П обработки
        DEFW WW00,WW01,WW02,WW03,WW04,WW05,WW06,WW07,WW08
        DEFW WW09,WW10,WW11,WW12,WW13,WW14,WW15,WW16,WW17
        DEFW WW18,WW19,WW20,WW21,WW22,WW23,WW24,WW25,WW26

ZZ26    ;Атака на цель, не покидая позиции
        ;\
ZZ28    ;Атака на цель, которая м.быть прервана
        ;\
ZZ4     ;Атака на цель
        LD A,(IX+4)
        LD HL,WATACK
        CALL WT
        LD (JP_SUB+1),HL
        LD A,(IX+12)
        ;атака на врага
        PUSH IX
        LD (en_A),A
        BIT 7,A
        JR Z,ZZ4a
        CALL B_IX ;параметры вражеского здания
        LD (en_IX),IX
        CALL HL_IX0
        POP IX
        CALL DIST_H
        LD B,A
        JR ZZ4b
ZZ4a    CALL N_IX ;параметры врага
        LD (en_IX),HL
        CALL HL_IX0
        POP IX
        BIT 7,H
        JR NZ,IX_98a ;враг в здании
ZZ4_    CALL DIST2
        LD B,A
ZZ4b    LD A,L
        AND A
        JR Z,IX_98a ;враг мёртв
        LD A,B
        ;в A-дистанция, в HL-коорд цели
        CALL JP_SUB ;!! м.быть вых.через POP, если враг рядом (оружие применено)
        LD A,(IX+9)
        CP 26
        JR Z,ZZ4_26
        PUSH HL ;преследовать,ecли цель далеко
        CALL GO_MAN
        POP HL
        CALL IXt_HL  ; "я умный!"
        LD A,(IX+8)
        OR A
        JP NZ,ONSEE2
        LD (IX+8),#80
        CALL GO_MAN
        LD A,(IX+8)
        OR A
        JP NZ,ONSEE2
        ;цель слишком далеко и дороги к ней нет
        ;
IX_98a  LD A,(IX+9)
        CP 26
        JP NZ,IX_98
ZZ4_26  ;конец атаки на месте (26)
        ;если цель мертва или далеко - снова стоять насмерть
        CALL IX_98
        INC (IX+9)
        RET


;WWxx - обработка действия 4 - атака
;........................
WW09    ;пеоны
WW10
WW11
WW00    ;крестьяне
WW01
WW02    LD A,(SIDE_N)
        OR A
        JR Z,R_away
        LD A,(DIFFIC)
        OR A
        JR Z,R_away
        LD HL,(pntX) ;бежать к точке сбора
        CALL IXt_HL
        JP IX_92
R_away  LD (IX+9),2 ;убегать случайно
R_awa_  LD (IX+8),#80
        LD C,(IX+0)
        CALL RNDshf
        LD (IX+10),A
        LD C,(IX+1)
        CALL RNDshf
        LD (IX+11),A
        RET

RNDshf  CALL RND ;нов коорд при убегании (C->A)
        AND %1111
        SUB 7 ;-7..8
        ADD A,C
        CP 63
        JR NC,RNDshf
        RET

WW22    ;князь
WW23    ;гризольда
        LD (IX+9),0
        RET
;........................
WW13    ;кунг
WW17    ;грюнвер
WW18    ;паук
WW19    ;скелет
WW20    ;скорп
WW21    ;звезда
WW24    ;костолом
WW25    ;демон
WW08    ;всадник
WW04    ;воин
        CP 2 ;дальность оружия
        RET NC
        EX DE,HL ;применить оружие
        CALL HL_IX0
        CALL DIR
        LD (IX+2),A
        CALL IMPIX3
        LD (IX+8),0
        CALL IMPACT
        POP AF
        JP ONSEE ;надо бы один раз :(

;........................
WW03    ;лучник
        LD C,A
        LD A,(sRANGE+3)
        INC A
        INC A
        CALL ARCrng
        CP C
        RET C
        CALL WWFire
        CALL NEWB01
        POP HL ;dec sp
        RET

WW12    ;лангольер c луком
        LD C,A
        LD A,(sRANGE+12)
        INC A
        INC A
        CALL ARCrng
        CP C
        RET C
        CALL WWFire
        CALL NEWB02
        POP HL ;dec sp
        RET

ARvsKT  ;лучники врага против наших катап (если да и DIFFIC=1, то A=2)
        PUSH AF
        LD A,(IX+12)
        BIT 7,A
        JR NZ,arv1
        PUSH IX
        PUSH HL
        CALL N_IX
        LD A,(IX+4)
        POP HL
        POP IX
        CP 7
        JR Z,arv2
        CP 16
        JR Z,arv2
arv1    POP AF ;норм дист
        RET
arv2    POP AF
        LD A,2 ;катап - короткая дистанция
        RET

WWFire  EX DE,HL ;подготовиться применить оружие
        PUSH DE
        CALL HL_IX0
        PUSH HL
        CALL DIRF
        LD (IX+2),A
        CALL Z,ONSEE ;надо бы один раз :(
        POP HL
        CALL IMPIX3
        LD (IX+8),0
        POP DE
        RET

WW14    ;\
WW05    ;свящ/некром
        CP 3
        RET NC
        CALL WWmana
        CALL WWFire
        CALL NEWB03
        JR WW06a
WW15    ;\
WW06    ;волш/варлок
        CP 5
        RET NC
        CALL WWmana
        CALL WWFire
        CALL newb05
WW06a    LD A,6      ;FX
         CALL SOUNDn ;
        POP HL;dec sp
        RET

WWmana  ;уменьш маны при стрельбе (no mana - 2xPOP,RET)
        LD A,(IX+6)
        SUB 3 ;декремент mana
        JR C,WWma1
        LD (IX+6),A
        RET
WWma1   POP HL ;!!
        POP DE ;!!
        RET

WW16    ;\
WW07    ;катапульта
        CALL KATrng
        RET NC
        CP 3
        LD A,(SIDE_N)
        JR C,WW07b
        ;(проверь вокруг)
        OR A
        JR NZ,WW07d
        ;наша кат не порань наших
        BIT 7,(IX+12)
        JR NZ,WW07c
        PUSH HL
        CALL humOWN ;nz - можно стрелять
        POP HL
        JR NZ,WW07c
        JR Z,WW07a1 ;смени цель
WW07d   ;враг не порань врага
        BIT 7,(IX+12)
        JR NZ,WW07c  ;огонь по зданию
        PUSH HL
        CALL kunOWN ;C - можно стрелять
        POP HL
        CALL NC,IX_98
        JR NC,WW07a ;cмени цель
WW07c   CALL WWFire
        CALL NEWB06
        CALL onsee2
          LD A,4      ;FX
          CALL SOUNDn ;
        LD A,(IX+9)
        CP 27 ;режим одиночного выстрела?
WW07a1  CALL Z,IX_98a
WW07a   POP HL ;dec sp
        RET
WW07b   OR A
        JR Z,WW07a
        LD A,(IX+8)
        OR A
        RET NZ
        JP R_awa_ ;вражеская катапульта умеет отъезжать

WW26    ;стеногр
        CP 4
        RET NC
        CALL WWFire
        CALL NEWB07
         LD A,5         ;FX
         CALL SOUNDn    ;
        POP DE ;dec sp
        RET

;---ix+9-ф-ции-крестьян---
ZZ5     ;идти на базу
        CALL HL_IXt
        CALL DIST2
        CP 3
        JP NC,ZZ2
        CALL GMAP
        LD A,(HL)
        AND #7F
        ;база ещё не разрушена?
        CP 86
        JR Z,ZZ5a
        CP 100
        JP NZ,IX_98
ZZ5a    ;чья база?
        LD A,(SIDE_N)
        OR A
        JR Z,ZZ5hum
        ;кунгов
        CALL deGRUZ
        ;(принять ресурсы врага)
        JR ZZ5ex
ZZ5hum  ;людей
        CALL deGRUZ
        LD DE,#100
        PUSH AF
        CALL Z,aWOOD
        POP AF
        CALL NZ,aMONEY
ZZ5ex   LD (IX+9),24
        LD (IX+3),#80+10;время нахожд. на базе
ZZ57    CALL HL_IX0
        CALL GMAP2
        LD (HL),0
        LD A,(HER_N)
        CALL deSEL
        CALL EVENT
        JP unseeM


deGRUZ  ;разгрузить (Z/NZ - был лес/золото)
        LD A,(IX+4)
        CP 9
        JR C,dgu1
        SUB 9
dgu1    DEC A
        RET

ZZ6     ;идти за лесом
ZZ61    CALL GO_MAN
        LD A,(IX+8)
        OR A
        PUSH AF
        CALL NZ,ONSEE2
        POP AF
        JR Z,ZZ6A
        BIT 7,(IX+3)
        RET Z
        CALL HL_IXt
        CALL DIST2
        CP 6 ;макс дистанция до леса
        RET NC
ZZ6A    ;есть ли рядом лес?
        LD (IX+3),0
        LD A,(IX+2)
        CALL isTREE
        JR C,ZZ6B ;он перед носом
        LD B,8
ZZ6a1   LD A,B
        DEC A
        CALL isTREE
        JR C,ZZ6B_
        DJNZ ZZ6a1
        ;поискать поблизости
        LD BC,60*256+8
ZZ6a2   LD A,C
        CALL isTREE
        JR C,ZZ6a4
ZZ6a6   INC C
        DJNZ ZZ6a2
        ;не нашли - стоп
        JP IX_98
ZZ6a4   LD A,C ;нашли рядом - идти
        LD HL,GO_Ntb
        CALL WT
        LD A,(IX+0)
        ADD A,L
        LD L,A
        CP 63
        JR NC,ZZ6a6 ;вне карты
        LD A,(IX+1)
        ADD A,H
        LD H,A
        CP 63
        JR NC,ZZ6a6 ;вне карты
        CALL IXt_HL
        LD (IX+8),#80
        CALL GO_MAN
        LD A,(IX+8) ;перед лесом препятствие
        OR A
        JP Z,IX_98
        RET NZ
ZZ6B_   DEC B
        LD (IX+2),B
ZZ6B    ;приступить к рубке леса
        CALL ONSEE
        LD (IX+9),25
        LD (IX+8),0
        LD A,(BrWOOD) ;кол_во ударов по дереву
        LD (IX+12),A
        RET

ZZ7     ;идти за золотом в шахту
        CALL HL_IXt
        CALL DIST2
        CP 3
        JP NC,ZZ2
        CALL GMAP
        LD A,(HL)
        AND #7F
        ;шахта ещё не разрушена?
        CP 78
        JP NZ,IX_98
ZZ7a    ;вычет денег из шахты
        SET 4,H
        PUSH IX
        LD A,(HL)
        SUB #38
        CALL B_IX
        LD L,(IX+4)
        LD H,(IX+5)
        DEC HL
        LD (IX+4),L
        LD (IX+5),H
        LD A,L
        OR H
        JR NZ,ZZ7b
        LD (IX+3),A ;разрушЬ шахту
ZZ7b    CALL HL_IX0
        POP IX
        LD (IX+14),L ;запомнить коорд шахты
        LD (IX+15),H
        LD (IX+9),23
        LD (IX+3),#80+15;время нахожд. в шахте
        JP ZZ57

ZZ8     ;идти на стр-во
        CALL DISTpH
        ;подошли к зданию?
        CP 2
        JP NC,ZZ2
        ;начать стройку/ремонт
        PUSH IX
        CALL HL_IXt
        CALL GMAP2
        LD A,(HL)
        SUB #40 ;шахты не чинить
        JR C,ZZ8_0
        CP 64
        JR NC,ZZ8_0
        ADD A,8
        CALL B_IX
        LD A,(IX+0)
        OR A
        JR NZ,ZZ8_1
        ;здания нет
ZZ8_0   POP IX
        JP IX_98
ZZ8_1   LD A,(IX+4)
        CP 253
        JR Z,ZZ8_2
        CP 254
        JR Z,ZZ8_2
        ;ремонт
        LD A,(IX+2)
        LD HL,bHEALT
        CALL BA
        CP (IX+3)
        JR Z,ZZ8_0 ;ремонт не нужен
        LD A,(SIDE_N)
        OR A
        JR NZ,ZZ8k ;для врага - бесплатно
        LD DE,#02
        LD BC,#03
        CALL dMN_WD ;для наших - уменьшить MN/WD
        JP C,ZZ8n
ZZ8k    INC (IX+3)
        POP IX
        CALL HL_IXt ;направить удар ремонтника
        EX DE,HL
        CALL HL_IX0
        CALL DIR
        LD (IX+2),A
        JP IMPIX3
ZZ8n    POP IX;нет средств на ремонт
         if EGA
         push ix
         endif
        CALL nMN_WD ;при EGA портит ix!!!
         if EGA
         pop ix
         endif
        JP IX_98
ZZ8_2   ;cтройка
        LD A,(IX+7)
        INC A
        JR NZ,ZZ8_0 ;строитель уже есть
        LD A,(HER_N)
        LD (IX+7),A
        POP IX
        CALL HL_IX0
        CALL GMAP2
        LD (HL),0
        CALL HL_IXt
        CALL IX0_HL
        LD (IX+9),22
unseeM  ;сделать человека невидимым
        SET 7,(IX+1)
        SET 7,(IY+1)
        RET

DISTpH  ;расст до здания для крестьян
        CALL HL_IXt
DIST_H  CALL DIST2 ;-""- для воинов
        CP 3
        RET NC
        PUSH HL
        PUSH AF
        CALL GMAP2
        LD A,(HL)
        SUB #38
        PUSH IX
        CALL B_IX
        CALL HL_IX0
        LD A,(IX+2)
        POP IX
        CP 8
        JR Z,ddp1
        CP 18
        JR Z,ddp1
ddp_0   POP AF
        POP HL
        DEC A
        RET
ddp1    LD A,L
        CP (IX+0)
        JR C,ddp_1
        LD A,H
        CP (IX+1)
        JR NC,ddp_0
ddp_1   POP AF
        POP HL
        RET

;----допустимость применения магии---

ZZddin  ;опред дистанции до движ цели
        LD A,(IX+12)
        PUSH IX
        CALL N_IX ;параметры врага
        LD (en_IX),HL
        CALL HL_IX0
        POP IX
        CALL IXt_HL
        LD A,L
        OR A
        JR Z,_ex98 ;цель погибла
        BIT 7,H
        JR NZ,_ex98 ;цель в здании
        CALL DIST2
        JR ZZd1

ZZdist  CALL HL_IXt ;опредление дистанции
        CALL DIST2
        OR A
        JR Z,_ex98
ZZd1    CP 9 ;дистанция до объекта магии-1
        RET C
        POP HL ;!!
        JP NC,ZZ2 ;цель далеко

isMANA  ;есть волш энергия? (С)
        LD A,(IX+6)
        SUB C
        JR C,noMANA
        LD (IX+6),A
        RET
noMANA  LD A,(SIDE_N)
        OR A
        CALL Z,pb07
_ex98   POP HL ;!!
        JP IX_98

;------ix+9---магия волш-------

ZZ12    ;cтеногрыз
        LD BC,MANA-1+#1A00
        JR ZZ10a
ZZ13    ;паук
        LD BC,MANA/4+#1200
        JR ZZ10a
ZZ15    ;демон
        LD BC,MANA-1+#1900
        JR ZZ10a

ZZ10    ;cкорп
        LD BC,MANA/4+#1400
ZZ10a   ;пров. возможность
        LD A,(IX+6)
        SUB C
        JP C,IX_98
        LD (IX+6),A
        ;родить чудище
        PUSH IX
        PUSH IY
        LD A,B
        EX AF,AF
        CALL HL_IX0
        CALL stayON
        CALL NEWB09 ;звёзды
        LD A,(SIDE_N)
        CALL NEWHER
        JR NZ,ZZ10b ;mem?
        LD (IX+13),3;чудище->в атаку
        CALL HL_IX0
ZZ10b   POP IY
        POP IX
        JP NZ,IX_98 ;нет памяти
        JR ZZ_En2

ZZ14    ;смерч
        CALL ZZdist
        LD A,(TIC)
        AND 7
        RET NZ
        LD C,MANA/6
        CALL isMANA
        CALL NEWB12
        CALL HL_IXt
        JR ZZ_En2

ZZ11    ;огненый дождь
        CALL ZZdist
        LD C,MANA/14 ;часть дождя
        CALL isMANA
        PUSH IY
        EX DE,HL
        LD B,4 ;кол-во дождинок
ZZ11a   CALL RND
        RRA
        LD C,31 ;в 50% - более точное прицеливание
        JR C,ZZ11c
        LD C,63
ZZ11c   CALL RND
        AND C
        LD HL,GO_Ntb
        CALL WT
        LD A,L
        ADD A,E
        CP 63
        JR NC,ZZ11b
        LD L,A
        LD A,H
        ADD A,D
        CP 63
        JR NC,ZZ11b
        LD H,A
        CALL NEWB08
ZZ11b   DJNZ ZZ11a
        POP IY
        CALL HL_IXt
        JR ZZ_En2


ZZ_EnV  LD HL,(PX)
ZZ_End  ;конец действия
        CALL IX_98
ZZ_En2  ;HL-напр колд
        EX DE,HL
        CALL HL_IX0
        CALL DIR_F
        LD (IX+2),A
        JP IMPIX3


;------магия свящ

ZZ16    ;дать здоровье
        CALL ZZddin
        LD A,(IX+6)
        CP MANA/32 ;нижний придел
        JP C,IX_98
        LD HL,(en_IX)
        LD DE,4
        ADD HL,DE
        LD A,(HL) ;тип объекта
        INC HL
        EX DE,HL
        LD HL,HEALTH
        CALL WA
        LD C,A
        EX DE,HL
        LD A,(HL) ;текущ здоровье
        CP C
        JR NC,ZZ_EnV
        LD B,64 ;количество попыток передачи здоровья
ZZ16a   LD A,(HL)
        CP C
        JR NC,ZZ16b ;уже полностью здоров
        LD A,(IX+6)
        SUB 2
        JR C,ZZ16b ;кончилась мана
        LD (IX+6),A
        INC (HL) ;добавить здоровья (1HP for 2MANA)
        DJNZ ZZ16a
ZZ16b   PUSH IY
        LD HL,(en_IX);звёздочки
        LD A,(HL)
        INC HL
        LD H,(HL)
        LD L,A
        PUSH HL
        CALL NEWB09
        POP HL
        POP IY
        JR ZZ_End

ZZ20    ;чёрное зрение
ZZ17    ;белое зрение
        LD HL,(PX)
        PUSH HL
        CALL GMAP
        LD A,(HL)
        POP HL
        OR A
        JP Z,IX_98 ;на границе
        LD C,MANA/2
        CALL isMANA
        PUSH IY
        PUSH HL
        CALL ONSEEm
        POP HL
        PUSH HL
        INC L
        ;звёзды
        CALL NEWB09
        POP HL
        PUSH HL
        DEC L
        CALL NEWB09
        POP HL
        PUSH HL
        INC H
        CALL NEWB09
        POP HL
        DEC H
        CALL NEWB09
        POP IY
        JP ZZ_EnV

ZZ19    ;оживление скелетов
        CALL ZZdist
        JP NC,ZZ2
        LD (ZZ_tar),HL
        LD HL,HUMAN
        LD B,102
ZZ19a   LD A,(HL)
        OR A
        JR NZ,ZZ19b
        INC L
        LD A,(HL)
        DEC L
        OR A
        JR Z,ZZ19b
        LD A,(IX+6) ;маны достаточно?
        CP MANA/4
        JR C,ZZ19x
        PUSH BC
        PUSH HL
        PUSH IX
         PUSH HL
         POP IX
        LD A,(IX+4)
        CP 8 ;труп оживляем (0..7) ?
        JR NC,ZZ19c
        LD HL,(ZZ_tar)
        CALL DIST
        CP 4 ;радиус оживления -1
        JR NC,ZZ19c
        ;убрать труп
        LD (IX+1),0
        ;поднять скелета
        PUSH IY
        CALL HL_IXt
        CALL stayON
        CALL NEWB09 ;звёзды
        LD A,19
        EX AF,AF
        LD A,(SIDE_N)
        CALL NEWHER
        JR NZ,ZZ19z ;нет памяти
        LD (IX+13),3
ZZ19z   POP IY
        POP IX
        LD A,(IX+6)
        SUB MANA/4
        LD (IX+6),A
        JR ZZ19d
ZZ19c   POP IX
ZZ19d   POP HL
        POP BC
ZZ19b   LD DE,16
        ADD HL,DE
        DJNZ ZZ19a
ZZ19x   ;мана кончилась
        LD HL,(ZZ_tar)
        JP ZZ_End


ZZ18    ;огн пояс
        LD A,%00001000 ;(1)
        JR ZZ21a
ZZ21    ;хруст сфера
        LD A,%00010000 ;(2)
ZZ21a   EX AF,AF
        CALL ZZddin
        LD C,MANA-1
        CALL isMANA
        PUSH IX
        LD HL,(en_IX)
        LD DE,7
        ADD HL,DE
        POP IX
        LD A,(HL)
        AND %11111000
        JP NZ,IX_98 ;уже есть заклинание
        EX AF,AF
        LD C,A
        LD A,(HL)
        AND %00000111
        OR C
        LD (HL),A
        LD A,C
        CP %00001000
        LD C,14
        JR Z,ZZ21b
        DEC C
ZZ21b   CALL NEWB14
        JP Z,ZZ16b
        LD A,(HL) ;неудача - нет места
        AND %111
        LD (HL),A
        JP ZZ16b

;-----ix+9---крестьяне работают---------------
ZZ22    ;строит дом
        RET ;none
ZZ23    ;выйти из шахты
        INC (IX+4)
        INC (IX+4)
        LD C,5
        CALL basOUT
        JP basTAR

ZZ24    ;выйти из базы
        LD A,(IX+4)
        LD C,6
        CP 9
        JR NC,ZZ24a
        LD (IX+4),0
        DEC A
        JR ZZ24ex
ZZ24a   LD (IX+4),9
        SUB 10
ZZ24ex  JR Z,ZZ24c
        INC C
ZZ24c   ;\
basOUT  ;выйти из базы/шахты (C-нов действие)
        LD (IX+9),C
        LD (IX+8),#80
        LD A,(IX+2) ;развернись
        ADD A,4
        AND 7
        LD (IX+2),A
        ;попробуй выйти, где вошёл
        RES 7,(IX+1)
        RES 7,(IY+1)
        CALL HL_IX0
        CALL GMAP2
        LD A,(HL)
        OR A
        JR Z,bos11
        ;найти другую позицию
        CALL HL_IXt
        CALL stayON
        CALL IX0_HL
        PUSH HL
        XOR A
        CALL NEWiy_
        POP HL
        CALL GMAP2
bos11   LD A,(HER_N)
        ADD A,#80
        LD (HL),A
        LD L,(IX+14)
        LD H,(IX+15)
        JP IXt_HL


ZZ25    ;pубит лес
        LD A,(IX+2)
        CALL isTREE
        JR NC,noWOOD
        DEC (IX+12)
        ;удар по дереву
        JP NZ,IMPIX3
ZZ25a   ;повалить дерево
        CALL deTREE
        CALL HL_IXt
        LD (IX+14),L
        LD (IX+15),H
        LD A,(LEV_T)
        OR A
        JP NZ,IX_98 ;для подземелий
        ;идти на базу
        CALL basTAR
        INC (IX+4)
        JP EVENT
noWOOD  ;нет леса перед носом
        LD (IX+9),6
        LD (IX+8),#80
        RET

basTAR ;найти базу и направить на неё
        CALL HL_IX0
        LD C,#FF ;миним расст
        PUSH IX
        LD B,32
        LD DE,8
        LD IX,HBUILD
        LD A,(SIDE_N)
        OR A
        JR Z,bst0
        LD IX,KBUILD
bst0    LD A,(IX+2)
        ;это база?
        OR A
        JR Z,bst1
        CP 10
        JR NZ,bst2
        ;расст меньше минимального?
bst1    LD A,(IX+0)
        OR A
        JR Z,bst2
        PUSH BC
        CALL DIST2
        POP BC
        CP C
        JR NC,bst2
        LD C,A
        LD (en_IX),IX
bst2    ADD IX,DE
        DJNZ bst0
        LD A,C
        CP #FF
        JR NZ,bstt
        ;некуда идти
        POP IX
        JP IX_98
bstt    ;идти на ближайшую базу
        LD IX,(en_IX)
        CALL HL_IX0
        POP IX
        CALL IXt_HL
        LD (IX+9),5
        LD (IX+8),#80
        RET

isTREE  ;в направлении A - дерево? (С-да/NC-нет)
        LD HL,GO_Ntb
        CALL WT
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD A,(IX+1)
        ADD A,H
        LD H,A
isTRE_  CALL GMAP
        LD A,(HL)
        AND #7F
        SUB 61  ;деревья 61,62,63
        CP 3
        RET

deTREE  ;повалить дерево ;HL-адр в мап
        LD A,(HL)
        LD C,A
        AND #80
        ADD A,6
        LD (HL),A
        CALL deT1
        LD A,C
        AND #7F
        CP 62
        JR C,deTTOP
        JR Z,deTMID
deTBOT  LD DE,-64 ;низ
        ADD HL,DE
        LD A,(HL)
        OR A
        RET Z
        LD C,A
        AND #7F
        CP 62
        LD A,63
detb0   JR Z,detb1
        LD A,6
detb1   LD (HL),A
        BIT 7,C
        JR Z,detb2
        SET 7,(HL)
detb2   CP 6
        JR Z,deT1
        RET
        ;
deTTOP  LD DE,64 ;верх
deTTO2  ADD HL,DE
        LD A,(HL)
        OR A
        RET Z
        LD C,A
        AND #7F
        CP 62
        LD A,61
        JR detb0
deTMID  CALL deTBOT
        LD DE,128
        JR deTTO2
        ;
deT1    SET 4,H
        LD A,(HL)
        CP 2
        JR NZ,deT11
        LD (HL),0
deT11   RES 4,H
        RET

;------главный цикл обработки шахт-------
MINER   XOR A
        LD (brNUM),A ;очистить список погорельцев
        LD IX,MINE
        LD BC,#800
        LD E,B ;LD DE,8
        LD D,C ;
Mim0    LD A,(IX)
        OR A
        JR Z,Mim1
        LD A,(IX+3)
        OR A
        JR Z,KilMim
        CP (IX+6)
        CALL C,HomBrk
        LD A,(IX+4)
        OR (IX+5)
        JR Z,KilMim
Mim1    ADD IX,DE
        INC C
        DJNZ Mim0
        RET

KilMim  ;разрушить шахту
        CALL DESTRY
        JR Mim1

;------главный цикл обработки зданий ------------------------
HOMER   LD HL,SIDE_N
        LD (HL),0 ;свои здания
        PUSH HL
        CALL HOMER_
        POP HL
        INC (HL)  ;здания врага
HOMER_  LD B,32 ;в С - номер
Hom0    LD A,(IX)
        OR A
        JR Z,Hom1
        LD A,(IX+3)
        OR A
        JR Z,KilHom
        CP (IX+6)
        CALL C,HomBrk
        LD A,(IX+4)
        INC A
        JR Z,Hom1
        CP #80
        PUSH AF
        CALL NC,HomBld
        POP AF
        CALL C,HomFct
Hom1    ADD IX,DE
        INC C
        DJNZ Hom0
        RET

HomBrk  ;занести повреждённое здание в список brHom для vFLAME
        LD HL,brNUM
        LD A,(HL)
        CP 24
        RET NC
        INC (HL)
        INC HL
        CALL BA
        LD (HL),C
        LD A,(SIDE_N)
        OR A
        RET NZ
        LD A,(DIFFIC) ;индикация/горение
        OR A
        JR Z,Hmbr1
        LD A,(TIC)
        AND #7
        JR NZ,Hmbr1
        DEC (IX+3) ;наши здания сгорают :( при DIFFIC=1
Hmbr1    LD A,1
         LD (LED+5),A ;on индик5
        RET

KilHom  ;разрушть здание
        CALL DESTRY
        JR Hom1

DESTRY  ;разрушить объект IX (C-его номер)
        PUSHs
         LD A,21
         LD (LED+2),A ;on индик2
         LD A,2
         CALL SOUNDn  ;FX
        CALL EVENT
        ;отменить пометку
        LD HL,SEL_T
        LD A,(HL)
        CP 8
        JR C,pec4
        INC HL
        LD A,(HL)
        CP C
        JR NZ,pec4
        DEC HL
        LD (HL),0
pec4    ;выпустить строителя, если он там
        LD A,(IX+4)
        CP 253
        JR C,pec0
        INC A
        JR Z,pec0
        LD A,(IX+7)
        INC A
        CALL NZ,outMAN
pec0    ;вызвать облако
        CALL NEWB11
        ;разрушить зд
        CALL HL_IX0
        LD (IX+0),0
        CALL GMAP
        LD A,(IX+2)
        CP 8
        JR Z,pec1
        CP 18
        JR Z,pec1
        LD C,17
        CALL pecDES
        DEC HL
        CALL pecDES
        LD DE,-64
        ADD HL,DE
        CALL pecDES
        INC HL
        CALL pecDES
        INC HL
        CALL pecDES
        LD DE,64
        ADD HL,DE
        CALL pecDES
        ADD HL,DE
        CALL pecDES
        DEC HL
        CALL pecDES
        DEC HL
        CALL pecDES
        JR pec2
pec1    LD C,23
        CALL pecDES
        DEC HL
        LD C,25
        CALL pecDES
        LD DE,-64
        ADD HL,DE
        LD C,19
        CALL pecDES
        INC HL
        LD C,21
        CALL pecDES
pec2    POPs
        RET
        ;
pecDES  ;уничт кусочек здания с учётом видим
        SET 4,H
        LD (HL),0
        RES 4,H
        LD A,(HL)
        AND #80
        OR C
        LD (HL),A
        INC C
        RET

HomBld  ;строительство
        LD A,(IX+7)
        INC A
        RET Z ;нет строителя
        DEC (IX+5)
        RET NZ
        PUSH BC
        PUSH DE
        INC (IX+4)
        LD A,(IX+4)
        INC A
        CALL Z,outMA_
        LD A,(IX+2)
        LD HL,bcTIME
        CALL BA
        LD (IX+5),A
        LD A,C
        CALL placeB
        POP DE
        POP BC
        JP EVENT

outMA_   LD A,15
         LD (LED+1),A ;on индик1
outMAN  CALL HL_IX0
        PUSH IX  ;отпусти строителя
        PUSH BC
        LD A,(IX+7)
        PUSH AF
        PUSH HL
        CALL N_IXIY
        POP HL
        CALL stayON
        CALL IX0_HL
        CALL IX_98
        PUSH HL
        XOR A
        CALL NEWiy_
        POP HL
        CALL GMAP2
        POP AF
        ADD A,#80
        LD (HL),A
        POP BC
        POP IX
        RET

HomFct  ;пр_во/иссл
        DEC (IX+5)
        RET NZ
        CALL EVENT
        LD A,(IX+4)
        LD (IX+4),255
        CP 18
        JR C,HFChum
        SUB 20
        PUSH AF
        LD HL,HFCvar
        CALL WT
        LD A,(SIDE_N)
        OR A
        JR Z,HoFc1
        LD DE,kTOWER-hTOWER ;теперь неверно
        ADD HL,DE
HoFc1   POP AF
        PUSH HL
        LD HL,HFCdat
        CALL BA
        POP HL
        LD (HL),A
        RET

HFChum  ;появляется новый член общества A
        EX AF,AF
        CALL HL_IX0
        PUSH IX
        PUSHs
        CALL stayON
        LD A,(SIDE_N)
        OR A
        JR NZ,hFC1
         LD A,11
         LD (LED+4),A ;on индик4
         XOR A
hFC1    CALL NEWHER
        POPs
        POP IX
        RET


HFCvar  DEFW hARC,hARC, hBLADE,hBLADE, hHORSE,hHORSE,hHORSE
        DEFW hSHILD,hSHILD, hCLRIC+0,hCLRIC+1,hCLRIC+2
        DEFW hWIZRD+0,hWIZRD+1,hWIZRD+2
HFCdat  DEFB 1,2, 1,2, 1,2,3
        DEFB 1,2, 1,1,1, 1,1,1
        ;(за врагов можно проводить исследования)