Login

Subversion Repositories NedoOS

Rev

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

;-------РАБОТА СО СНАРЯДАМИ/ВЗРЫВАМИ/ЗАКЛИНАНИЯМИ/ДЫМОМ------

;----------СНАРЯД ПЕРЕМЕЩАЕТСЯ/ДОСТИГ ЦЕЛИ---
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