;-------РАБОТА СО СНАРЯДАМИ/ВЗРЫВАМИ/ЗАКЛИНАНИЯМИ/ДЫМОМ------
 
 
 
;----------СНАРЯД ПЕРЕМЕЩАЕТСЯ/ДОСТИГ ЦЕЛИ---
 
VV14    ;огн кольцо
 
        LD A,(IY+7)
 
        CALL N_IX
 
        CALL HL_IX0
 
        EX DE,HL
 
        ;ударить по врагам
 
        LD B,8 ;8 кв вокруг
 
        LD HL,GO_Ntb-2
 
VV14c   LD A,B
 
        PUSHs
 
        CALL WT
 
        LD A,E
 
        ADD A,L
 
        LD L,A
 
        LD A,D
 
        ADD A,H
 
        LD H,A
 
        CALL _sMPAC
 
        POPs
 
        DJNZ VV14c
 
VV13    ;закл "хрст шар"
 
        PUSH IY
 
        LD A,(IY+7)
 
        CALL N_IXIY
 
        LD L,(IY+0)
 
        LD H,(IY+1)
 
        LD E,(IY+2)
 
        LD D,(IY+3)
 
        POP IY
 
        LD (IY+0),L
 
        LD (IY+1),H
 
        LD (IY+2),E
 
        LD (IY+3),D
 
        LD A,(IX+0)
 
        OR A
 
        JR Z,VVx_ ;цель уже погибла
 
        LD A,(IY+9)
 
        OR A
 
        JR NZ,brrX
 
        LD A,(IX+7) ;кончилось заклинание
 
        AND %111
 
        LD (IX+7),A
 
        JR VVx_
 
 
 
VV11    ;облако после пожара
 
        JR Z,VVx_
 
        LD A,(IY+2)
 
        DEC (IY+2)
 
        OR A
 
        JR NZ,brrX
 
        DEC (IY+3)
 
        JR brrX
 
 
 
 
 
VV4     ;взр влш огня
 
VV10    ;взр снр катап
 
VV9     ;звeзды
 
        JR NZ,brrX
 
        JR Z,VVx_
 
 
 
 
 
VV1     ;стрелы л
 
VV2     ;cтрелы к
 
        JR NZ,VVmov
 
        ;разить врага N
 
        CALL BMPACT
 
        JR VVx_
 
 
 
vv5     ;огонь волш
 
VV3     ;огонь свящ
 
        JR NZ,VVmov
 
        ;обжечь врага
 
        CALL BMPACT
 
        LD (IY+4),4
 
        LD (IY+9),2;time
 
        JR brrX
 
 
 
BULLty  ;п/п обр пуль/взр
 
        DEFW VV1,VV2,VV3,VV4,vv5,VV6,VV7,VV8
 
        DEFW VV9,VV10,VV11,VV12,VV13,VV14
 
BULLER  ;-----обработчик пуль
 
        LD IY,BULL
 
        LD B,24
 
        LD DE,12
 
brr0    LD A,(IY+4)
 
        OR A
 
        JR Z,brr1
 
        PUSH BC
 
        PUSH DE
 
        LD HL,BULLty-2
 
        CALL WT
 
        DEC (IY+9) ;уменьшить time
 
        JP (HL)
 
VVx_    LD (IY+4),0 ;исчезнов. снар
 
        JR brrX
 
VVmov   LD E,(IY+10) ;перемещ снар
 
        LD D,(IY+11)
 
        CALL CORiy_
 
brrX    POP DE
 
        POP BC
 
brr1    ADD IY,DE
 
        DJNZ brr0
 
        RET
 
 
 
VV6     ;снр катап
 
        JR NZ,VVmov
 
        ;взрыв
 
         LD A,2
 
         CALL SOUNDy ;FX
 
        CALL cMPACT
 
        CALL sMPACT ;для второго удара в эпицентр
 
        JR VV8a ;для третьего удара в эпицентр
 
 
 
VV8     ;огн.дождинка
 
        JR Z,VV8r
 
        LD DE,#0A01
 
        CALL CORiy_
 
        JR brrX
 
VV8r    ;случайная сила удара дождя
 
        CALL RND
 
        AND 127
 
        ADD A,30
 
        LD (BFORCE-1+8),A
 
        ;удар по врагу
 
VV8a    CALL sMPACT
 
VV8c    LD DE,#8F8
 
        CALL CORiy_
 
        LD (IY+4),10
 
        LD (IY+9),3
 
         LD A,8
 
         CALL SOUNDy
 
        JR brrX
 
 
 
VV7     ;плевок стеногрыза
 
        JR NZ,VVmov
 
        ;удар
 
        CALL BMPACT
 
         LD IX,(en_IX)
 
         LD A,8
 
         CALL SOUNDn
 
        JR VV8c
 
 
 
VV12    ;cмерчь
 
        JR Z,VVx_
 
        LD A,(IY+8) ;фаза 0..2
 
        INC A
 
        CP 3
 
        JR C,VV12i
 
        XOR A
 
VV12i   LD (IY+8),A
 
        JR NZ,brrX ;скорость 1/3
 
        LD L,(IY+0) ;выч коорд смерча
 
        LD H,(IY+1)
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        LD E,H
 
        LD L,(IY+2)
 
        LD H,(IY+3)
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        LD L,E
 
        INC L
 
        DEC H ;<-H точка удара
 
        PUSH HL
 
        CALL GMAP
 
        LD A,(HL)
 
        OR A
 
        POP HL
 
        JP Z,VVx_ ;вышел на бордюр
 
        CALL _sMPAC;гасить врагов внизу
 
        JP VVmov
 
 
 
;--------расчёты перемещения снарядов----
 
SHFpre  LD BC,0 ;подготовка расчёта траектории
 
        LD A,E
 
        SUB L
 
        JR NC,sgg0
 
        NEG
 
        INC C
 
sgg0    LD E,A
 
        LD A,D
 
        SUB H
 
        JR NC,sgg1
 
        NEG
 
        INC B
 
sgg1    LD D,A
 
        CP E
 
        RET
 
 
 
SHFT8   ;выч смещения-8 для снарядов
 
        ;hl--->de  вых:iy10,11
 
        CALL SHFpre
 
        LD A,8
 
        PUSH AF
 
        JR NC,s8g2
 
        LD A,E
 
        LD E,D
 
        LD D,A
 
s8g2    LD A,E  ;E-меньший
 
        JR s8_16
 
 
 
SHFT16  ;выч смещения-16 для снарядов
 
        ;hl--->de  вых:iy10,11
 
        CALL SHFpre
 
        LD A,16
 
        PUSH AF
 
        JR NC,s16g2
 
        LD A,E
 
        LD E,D
 
        LD D,A
 
s16g2   LD A,E  ;E-меньший
 
        ADD A,A
 
s8_16   ADD A,A
 
        ADD A,A
 
        ADD A,A ;x16/x8
 
        INC A
 
        LD E,A
 
        LD L,D
 
        CALL DIVB
 
        POP AF
 
        LD D,A
 
        JR NC,s16g3
 
        LD A,E
 
        LD E,D
 
        LD D,A
 
s16g3   LD A,C
 
        OR A
 
        JR Z,s16g4
 
        LD A,E
 
        NEG
 
        LD E,A
 
s16g4   LD A,B
 
        OR A
 
        JR Z,s16g5
 
        LD A,D
 
        NEG
 
        LD D,A
 
s16g5   LD (IY+10),E
 
        LD (IY+11),D
 
exIY    POP IY
 
        RET
 
 
 
DISTde  ;расст по ф-ле: max(|E-L|,|D-H|) ;Вых.A
 
        LD A,L
 
        SUB E
 
        JR NC,d2e1
 
        NEG
 
d2e1    LD B,A
 
        LD A,H
 
        SUB D
 
        JR NC,d2e2
 
        NEG
 
d2e2    CP B
 
        RET NC
 
        LD A,B
 
        RET
 
 
 
DIRF    ;dir с равномерными секторами
 
        CALL DIR
 
        BIT 0,A
 
        RET Z
 
        PUSH AF
 
        LD A,E
 
        SUB L
 
        JR NC,RF1
 
        NEG
 
RF1     LD L,A
 
        LD A,D
 
        SUB H
 
        JR NC,RF2
 
        NEG
 
RF2     LD H,A
 
        SLA A
 
        CP L
 
        JR C,RFM1
 
        LD A,L
 
        SLA A
 
        CP H
 
        JR C,RFM2
 
        POP AF
 
        RET
 
RFT1    DEFB 2,2,6,6
 
RFT2    DEFB 0,4,4,0
 
RFM1    LD HL,RFT1
 
        JR RFM0
 
RFM2    LD HL,RFT2
 
RFM0    POP AF
 
        SRA A
 
        JP BA
 
 
 
 
 
;---------выделение места в памяти под снаряд-----
 
NEWBUL  ;--нов пуля/взр/закл ->IY! (Z/NZ - оК/нет места)
 
        EXX
 
        LD HL,BULL+4
 
        LD DE,12
 
        LD B,24
 
nwb0    LD A,(HL)
 
        OR A
 
        JR Z,nwb2
 
        ADD HL,DE
 
        DJNZ nwb0
 
        EXX
 
        RET ;NZ-noOK
 
nwb2    DEC HL
 
        DEC HL
 
        DEC HL
 
        DEC HL
 
        PUSH HL
 
        POP IY
 
        EXX
 
        RET ;Z-ok
 
 
 
;---------------ПОРОЖДЕНИЕ--СНАРЯДОВ-----------
 
 
 
NEWB06  ;снаряд катапульты (DE-цель)
 
        LD C,6
 
        JR sgg11
 
newb05  ;огонь волш
 
        LD C,5
 
        JR sgg11
 
NEWB03  ;огонь свящ (DE-цель)
 
        LD C,3
 
        JR sgg11
 
NEWB07  ;плевок стеногр
 
        LD C,7
 
        JR sgg11
 
NEWB01  LD C,1
 
        JR sgg11
 
NEWB02  ;нов стрела (DE-цель)
 
        LD C,2
 
sgg11   PUSH IY
 
        CALL NEWBUL
 
        JP NZ,exIY
 
sgg12   LD (IY+4),C
 
        LD A,(HER_N)
 
        LD (IY+7),A
 
        LD A,(IX+12)
 
        LD (IY+5),A
 
        CALL HL_IX0
 
        PUSH HL
 
        XOR A
 
        CALL NEWiy_
 
        PUSH DE
 
        LD DE,#FC04
 
        CALL CORiy_
 
        POP DE
 
        POP HL
 
        LD A,(IX+2)
 
        LD (IY+8),A
 
        LD A,C
 
        CP 3
 
        JR Z,sgg36 ;для свящ
 
        CP 5
 
        JR Z,sgg36 ;для волш
 
        CP 6
 
        JR Z,sggk6 ;для кат
 
        CALL DISTde
 
        INC A
 
        LD (IY+9),A
 
        JP SHFT16
 
sggk6   LD (IY+5),E
 
        LD (IY+6),D
 
sgg36   CALL DISTde
 
        ADD A,A
 
        INC A
 
        LD (IY+9),A
 
        JP SHFT8
 
 
 
NEWB09  ;нов звёзды в HL ;портит IY
 
        CALL NEWBUL
 
        RET NZ
 
        PUSH IX
 
        PUSH HL
 
        CALL NEWiy_ ;A=0
 
        LD (IY+4),9
 
        LD (IY+9),6 ;time
 
         LD A,5
 
         POP HL
 
         PUSH HL
 
         LD (sIY56),HL
 
         CALL SOUND9
 
        POP HL
 
        POP IX
 
        RET
 
 
 
NEWB08  ;огн.дождинка (AL)
 
        CALL NEWBUL
 
        RET NZ
 
        LD (IY+5),L
 
        LD (IY+6),H
 
        LD A,H
 
        SUB 4  ;высота падения
 
        LD H,A
 
        XOR A
 
        CALL NEWiy_
 
        LD A,(HER_N)
 
        OR #80 ;бит7=1 для заклинаний
 
        LD (IY+7),A
 
        LD (IY+4),8
 
        LD (IY+9),7 ;time
 
        RET
 
 
 
NEWB11  ;взр здания IX
 
        CALL NEWBUL
 
        RET NZ
 
        CALL HL_IX0
 
        CALL NEWiy_ ;A=0
 
        LD DE,#FCF0
 
        LD A,(IX+2)
 
        LD C,20
 
        CP 8
 
        JR Z,n11w0
 
        CP 18
 
        JR Z,n11w0
 
        LD DE,#0CF8
 
        LD C,36
 
n11w0   CALL CORiy_
 
        LD (IY+4),11
 
        LD (IY+9),C ;time
 
        RET
 
 
 
NEWB14  ;ВХ: C=14/13 -огн кольцо/хруст шар (вых Z/NZ -ок/no mem)
 
        PUSH IY
 
        CALL NEWBUL
 
        JP NZ,exIY
 
        LD (IY+4),C
 
        LD A,(IX+12)
 
        LD (IY+7),A
 
        LD (IY+9),150 ;время жизни заклинания
 
        JP exIY
 
 
 
NEWB12  ;смерчь в HL
 
        PUSH IY
 
        CALL NEWBUL
 
        JP NZ,exIY
 
        LD C,L
 
        CALL rn3
 
        LD L,A
 
        LD C,H
 
        CALL rn3
 
        LD H,A
 
        CALL NEWiy_ ;A=0
 
        LD DE,#8F8
 
        CALL CORiy_
 
        LD (IY+4),12
 
        LD (IY+8),0
 
        CALL RND
 
        AND 63
 
        ADD A,64
 
        LD (IY+9),A ;время жизни заклинания
 
        LD A,(HER_N)
 
        OR #80 ;бит7=1 для заклинаний
 
        LD (IY+7),A
 
        CALL rn5
 
        LD (IY+10),A
 
        CALL rn5
 
        LD (IY+11),A
 
        JP exIY
 
        ;
 
rn5     ;rnd(-2..+2)
 
        CALL RND
 
        AND 7
 
        CP 5
 
        JR NC,rn5
 
        DEC A
 
        DEC A
 
        RET
 
        ;
 
rn3     ;rnd C+(-1,0,0,+1)
 
        CALL RND
 
        AND 3
 
        JR Z,rn3a
 
        DEC A
 
        DEC A
 
rn3a    ADD A,C
 
        JR Z,rn3b
 
        CP 63
 
        RET C
 
        LD A,62
 
        RET
 
rn3b    INC A
 
        RET
 
 
 
;------------ВЫВОД ПУЛЬ/ВЗРЫВОВ--------
 
WYbT    DEFW YU1,YU1,YU3,YU4,yu5,YU6,YU7,YU8,YU9
 
        DEFW YU10,YU11,YU12,YU13,YU14,0,YU16,YU17,YU18
 
 
 
WYbull  ;получить Wh(C),Hh(B),IMGh(DE),выбрать страницу
 
 
 
        if EGA
 
;для EGA не надо тут узнавать размер, это сделает HeF1
 
        
 
        ld a,25
 
        call _128
 
        LD A,(IY+4)
 
        LD HL,WYbT-2
 
        CALL WT
 
        JP (HL)
 
YU1     ;стрелы
 
        LD A,(IY+8)
 
        AND 3
 
        add a,18
 
YU1a
 
        add a,a
 
        ld ($+3+2),a
 
        ld iy,(0xc000)
 
        JP HeF1
 
yu5     ;огонь волшебников
 
YU3     ;огонь свящ
 
        LD A,(TIC)
 
        AND 1
 
        add a,22
 
        JR YU1a
 
YU4     ;взрыв огня волш
 
        LD A,(IY+9)
 
        AND 1
 
        add a,24
 
        JR YU1a
 
YU6     ;снаряд катап
 
        LD A,(IY+8)
 
        add a,26
 
        JR YU1a
 
YU7     ;cнаряд стеногрыза
 
        ld iy,(0xc000+(2*34))
 
        JP HeF1
 
YU8     ;огн дождь
 
        ld iy,(0xc000+(2*35))
 
        JP HeF1
 
YU9     ;волш звзды
 
        LD A,(TIC3)
 
        add a,9;37
 
        JR YU1a
 
YU10    ;взр катап снаряда
 
        LD A,3
 
        SUB (IY+9)
 
        add a,40
 
        JR YU1a
 
YU13    ;хруст шар
 
        ld iy,(0xc000+(2*36))
 
        JP HeF1
 
YU14    ;огн пояс
 
        LD A,(TIC3)
 
        add a,37;12
 
        JR YU1a
 
YU11    ;взрыв здания
 
        LD A,(TIC3)
 
        add a,15
 
        JR YU1a
 
YU12    ;cмерч
 
        LD A,(IY+8)
 
        add a,12
 
        JR YU1a
 
YU16    ;дым,низ50%
 
        LD A,(TIC3)
 
        add a,3
 
        JR YU1a
 
YU17    ;дым,низ25%
 
        LD A,(TIC3)
 
        add a,6
 
        JR YU1a
 
YU18    ;дым,верх
 
        LD A,(TIC3)
 
        JR YU1a        
 
        
 
        else ;~EGA
 
 
 
        CALL MEM1
 
        LD A,(IY+4)
 
        LD HL,WYbT-2
 
        CALL WT
 
        JP (HL)
 
YU1     ;стрелы
 
        LD DE,WMISC1
 
        LD A,(IY+8)
 
        AND 3
 
YU1a    ADD A,A
 
        ADD A,A
 
        ADD A,A
 
        ADD A,A ;x16
 
        LD L,A
 
        LD H,0
 
        ADD HL,DE
 
        EX DE,HL
 
YU1b    LD BC,#801
 
        JP HeF1
 
yu5     ;огонь волшебников
 
YU3     ;огонь свящ
 
        LD DE,4*16+WMISC1
 
        LD A,(TIC)
 
        AND 1
 
        JR YU1a
 
YU4     ;взрыв огня волш
 
        LD DE,6*16+WMISC1
 
        LD A,(IY+9)
 
        AND 1
 
        JR YU1a
 
YU6     ;снаряд катап
 
        LD A,(IY+8)
 
        LD DE,8*16+WMISC1
 
        JR YU1a
 
YU7     ;cнаряд стеногрыза
 
        LD DE,16*16+WMISC1
 
        JR YU1b
 
YU8     ;огн дождь
 
        LD DE,17*16+WMISC1
 
        JR YU1b
 
YU9     ;волш звзды
 
        LD DE,25*64+WMISC2
 
YU9a    LD A,(TIC3)
 
        RRCA
 
        RRCA ;x64
 
        LD L,A
 
        LD H,0
 
        ADD HL,DE
 
        EX DE,HL
 
        LD BC,#1002
 
        JP HeF1
 
YU10    ;взр катап снаряда
 
        LD DE,5*144+WMISC3
 
        LD A,3
 
        SUB (IY+9)
 
YU10a   JR Z,YU10c
 
        CP 1
 
        LD HL,144
 
        JR Z,YU10b
 
        ADD HL,HL
 
YU10b   ADD HL,DE
 
        EX DE,HL
 
YU10c   CALL MEM6
 
        LD BC,#1803
 
        JP HeF1
 
YU13    ;хруст шар
 
        LD DE,144+WMISC3
 
        JR YU10c
 
YU14    ;огн пояс
 
        LD DE,288+WMISC3
 
        LD A,(TIC3)
 
        OR A
 
        JR YU10a
 
YU11    ;взрыв здания
 
        LD DE,WMISC4+768
 
        LD A,(TIC3)
 
YU11a   LD BC,#2004
 
        OR A
 
        JP Z,HeF1
 
        INC D
 
        DEC A
 
        JP Z,HeF1
 
        INC D
 
        JP HeF1
 
YU12    ;cмерч
 
        LD DE,WMISC4
 
        LD A,(IY+8)
 
        JR YU11a
 
YU16    ;дым,низ50%
 
        LD DE,19*64+WMISC2
 
        JR YU9a
 
YU17    ;дым,низ25%
 
        LD DE,22*64+WMISC2
 
        JR YU9a
 
YU18    ;дым,верх
 
        LD DE,16*64+WMISC2
 
        JR YU9a
 
        
 
        endif ;~EGA
 
 
 
vBULL   ;-------выв.пуль/закл/взр-----------------------
 
        LD IY,BULL
 
        LD B,24
 
        LD DE,12
 
vbu0    LD A,(IY+4)
 
        OR A
 
        JR Z,vbu1
 
        PUSH BC
 
        PUSH DE
 
        CP 13
 
        CALL NC,vbuCRR
 
        INC A
 
         if EGA
 
         push iy
 
         endif
 
        CALL _XPUT
 
         if EGA
 
         pop iy
 
         endif
 
        POP DE
 
        POP BC
 
vbu1    ADD IY,DE
 
        DJNZ vbu0
 
        RET
 
 
 
vbuCRR  ;получить IY для 13,14
 
        LD A,(IY+7)
 
        PUSH IY
 
        CALL N_IXIY
 
        LD A,(IX+4)
 
        LD HL,AT_TY_
 
        CALL BA
 
        DEC A
 
        LD BC,0
 
        JR Z,vuc1
 
        LD C,4
 
vuc1    POP IX
 
        PUSH IX
 
        LD L,(IY+0)
 
        LD H,(IY+1)
 
        XOR A
 
        SBC HL,BC
 
        CALL IX0_HL
 
        LD L,(IY+2)
 
        LD H,(IY+3)
 
        ADD HL,BC
 
        LD (IX+2),L
 
        LD (IX+3),H
 
        POP IY
 
        INC A
 
        RET
 
 
 
 
 
vFLAME  ;--------дым пожарищ------------
 
        LD IY,BUF512 ;врем данные
 
        LD HL,brNUM
 
        LD A,(HL)
 
        OR A
 
        RET Z
 
        LD B,A
 
vff0    INC HL
 
        PUSH BC
 
        PUSH HL
 
        LD A,(HL)
 
        CALL B_IX
 
        CALL HL_IX0
 
        DEC H
 
        XOR A
 
        CALL NEWiy_
 
        LD A,(IX+2)
 
        INC A
 
        LD HL,vffDT
 
        CALL WT
 
        EX DE,HL
 
        LD HL,BUF512
 
        CALL cii_
 
        LD A,(IX+6)
 
        SRL A
 
        CP (IX+3)
 
        LD A,16
 
        JR C,vff5
 
        INC A
 
vff5    LD (BUF512+4),A
 
        OR A
 
         if EGA
 
         push iy
 
         endif
 
        CALL _XPUT
 
         if EGA
 
         pop iy
 
         endif
 
        LD HL,(BUF512+2)
 
        LD DE,-16
 
        ADD HL,DE
 
        LD (BUF512+2),HL
 
        LD A,18
 
        LD (BUF512+4),A
 
        OR A
 
         if EGA
 
         push iy
 
         endif
 
        CALL _XPUT
 
         if EGA
 
         pop iy
 
         endif
 
        POP HL
 
        POP BC
 
        DJNZ vff0
 
        RET
 
        ;
 
vffDT   ;сдвиг огня по X,Y
 
        DEFB 0,4
 
        DEFB 0,5, 0,8, 0,7, -1,0, -2,2, 0,-2, 0,4, 0,0, -4,0
 
        DEFB 0,0
 
        DEFB 0,0, 0,8, 6,10, 0,0, 0,10, 0,0, 0,6, 10,-3, -9,-3