Login

Subversion Repositories NedoOS

Rev

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

;------ПЕРЕМЕЩЕНИЯ
;---------п/п перемещения и поиска маршрута

DIR     ;напр HL->DE
        LD A,L
        CP E
        LD A,H
        JR C,di1
        JR NZ,di2
        CP D
        LD A,0
        RET C
        LD A,4
;//     RET NZ
;//     LD A,#FF
        RET
di1     CP D
        LD A,1
        RET C
        LD A,3
        RET NZ
        DEC A
        RET
di2     CP D
        LD A,7
        RET C
        LD A,5
        RET NZ
        INC A
        RET

DIR_F   ;напр HL->DE  с учётом наклона
        PUSH HL
        LD A,L
        SUB E
        JR C,df1
        JP NZ,df2
        POP HL
        LD A,H
        CP D
        LD A,0
        RET C
        LD A,4
;//     RET NZ
;//     LD A,#FF
        RET
df1     NEG
        LD L,A
        LD A,H
        SUB D
        LD H,2
        JR Z,df0
        JR C,df11
        CP L
        LD H,3
        JR Z,df0
        JR NC,df12
        ADD A,A ;--3|2
        CP L
        POP HL
        JR C,df14
        LD A,R
        RRA
        LD A,3
        RET C
        DEC A
        RET
df14    LD A,R
        AND %11
        LD A,3
        RET Z
        DEC A
        RET
df12    SLA L  ;--3|4
        CP L
        POP HL
        JR NC,df15
        LD A,R
        RRA
        LD A,3
        RET C
        INC A
        RET
df15    LD A,R
        AND %11
        LD A,3
        RET Z
        INC A
        RET
df11    NEG
        CP L
        LD H,1
        JR Z,df0
        JR NC,df32
        ADD A,A ;--1|2
        CP L
        POP HL
        JR C,df34
        LD A,R
        RRA
        LD A,1
        RET C
        INC A
        RET
df34    LD A,R
        AND %11
        LD A,1
        RET Z
        INC A
        RET
df32    SLA L  ;--1|0
        CP L
        POP HL
        JR NC,df35
        LD A,R
        RRA
        LD A,1
        RET C
        XOR A
        RET
df35    LD A,R
        AND %11
        LD A,1
        RET Z
        XOR A
        RET
df0     LD A,H
        POP HL
        RET
df2     LD L,A
        LD A,H
        SUB D
        LD H,6
        JR Z,df0
        JR C,df21
        CP L
        LD H,5
        JR Z,df0
        JR NC,df22
        ADD A,A ;--5|6
        CP L
        POP HL
        JR C,df24
        LD A,R
        RRA
        LD A,5
        RET C
        INC A
        RET
df24    LD A,R
        AND %11
        LD A,5
        RET Z
        INC A
        RET
df22    SLA L  ;--5|4
        CP L
        POP HL
        JR NC,df25
        LD A,R
        RRA
        LD A,5
        RET C
        DEC A
        RET
df25    LD A,R
        AND %11
        LD A,5
        RET Z
        DEC A
        RET
df21    NEG
        CP L
        LD H,7
        JR Z,df0
        JR NC,df42
        ADD A,A ;--7|6
        CP L
        POP HL
        JR C,df44
        LD A,R
        RRA
        LD A,7
        RET C
        DEC A
        RET
df44    LD A,R
        AND %11
        LD A,7
        RET Z
        DEC A
        RET
df42    SLA L  ;--7|0
        CP L
        POP HL
        JR NC,df45
        LD A,R
        RRA
        LD A,7
        RET C
        XOR A
        RET
df45    LD A,R
        AND %11
        LD A,7
        RET Z
        XOR A
        RET

DIST    ;расст по ф-ле max(|X-Xt|,|Y-Yt|) Вх.XY-HL;Вых.A
        LD A,L
        SUB (IX+10)
        JR NC,dt1
        NEG
dt1     LD B,A
        LD A,H
        SUB (IX+11)
        JR NC,dt2
        NEG
dt2     CP B
        RET NC
        LD A,B
        RET

nxtTRY  LD (IX+8),#80 ;нет времени, попытайся потом
        RET

MAKE_R  ;Выбор направления обхода Вх:hl-start
        LD A,(makTRY)
        OR A
        JR Z,nxtTRY
        DEC A
        LD (makTRY),A
        PUSH HL
        LD A,L ; вхHL-XY, выхHL-pos in map
        RLCA
        RLCA
        SRL H
        RRA
        SRL H
        RRA
        LD E,A
        LD A,H
        ADD A,MAP2/256
        LD D,A
        LD B,8 ;нач поз окружена?
MKstr   LD HL,inMAP ;выровн
        LD A,B
        DEC A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        OR A  ;пров на прох
        JR Z,MKst0
        DJNZ MKstr
        LD B,8 ;есть ли рядом движущиеся?
MKany   LD HL,inMAP ;выровн
        LD A,B
        DEC A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        CP #80  ;пров движ обj рядом
        JR C,MKan1
        CALL GO_NXe
        JR NZ,MKst0
MKan1   DJNZ MKany
        POP HL
        JP G_stop ;поз окружена - стоп
MKst0   POP HL
        LD A,(DE)
        LD (ss_num),A
        LD (ss_pos),DE
        XOR A
        LD (DE),A
        LD (MINLEN),A
        CALL DIST
        LD (MINDIS),A
        PUSH HL
        PUSH DE
        EXX
        LD A,(IX+2)
        LD C,A
        BIT 0,A
        JR NZ,Mk1
        DEC C
        INC A
Mk1     DEC C
        INC A
        POP DE
        POP HL
        EXX
        LD C,A
        ;HL-коорд DE-адр C-cdir/exx-против часовой
        LD A,1
        EX AF,AF ;A'-текущ. длина обхода
MkLOOP  ;обх в 2 стороны
Mk_cw   BIT 0,C
        JR Z,Mk7
        DEC C
Mk7     DEC C
        PUSH HL
CWrep   LD HL,inMAP ; (выровн)
        LD A,C
        AND 7
        LD C,A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        CP 1   ;пров на прох
        JR C,Mk4
        JP Z,CWstop
         RLCA
         JR NC,Mk4n
         CALL Mk_her
         JR C,Mk4
Mk4n    INC C
        JR CWrep
Mk4     EX (SP),HL
        LD DE,GO_Ntb
        LD A,C
        ADD A,A
        ADD A,E
        LD E,A
        LD A,(DE)
        ADD A,L
        LD L,A
        INC DE
        LD A,(DE)
        ADD A,H
        LD H,A
        POP DE
        EXX
        CP H
        EXX
        JR NZ,Mk5
        EXX
        LD A,L
        EXX
        CP L
        JR NZ,Mk5
         LD A,(MINLEN) ;узкий проход?
         OR A
         JP NZ,MK_RET
Mk5     CALL DIST
        LD B,A
        LD A,(MINDIS)
        CP B
        JR C,Mk_ccw
        JR Z,Mk_ccw
        LD A,B
        LD (MINDIS),A
        EX AF,AF
        LD (MINLEN),A
        EX AF,AF
        XOR A
        LD (NROUND),A
Mk_ccw  EXX
        BIT 0,C
        JR Z,M1k7
        INC C
M1k7    INC C
        PUSH HL
CCWrep  LD HL,inMAP ;(выровн)
        LD A,C
        AND 7
        LD C,A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        CP 1   ;пров на прох
        JR C,M1k4
        JP Z,CCWstp
         RLCA
         JR NC,M1k4n
         CALL Mk_her
         JR C,M1k4
M1k4n   DEC C
        JR CCWrep
M1k4    EX (SP),HL
        LD DE,GO_Ntb
        LD A,C
        ADD A,A
        ADD A,E
        LD E,A
        LD A,(DE)
        ADD A,L
        LD L,A
        INC DE
        LD A,(DE)
        ADD A,H
        LD H,A
        POP DE
        EXX
        CP H
        JR NZ,M1k5
        EXX
        LD A,L
        EXX
        CP L
        JR NZ,M1k5
         LD A,(MINLEN) ;узкий проход?
         OR A
         JR NZ,MK_RET
M1k5    EXX
        CALL DIST
        LD B,A
        LD A,(MINDIS)
        CP B
        JR C,Mk_eol
        JR Z,Mk_eol
        LD A,B
        LD (MINDIS),A
        EX AF,AF
        LD (MINLEN),A
        EX AF,AF
        LD A,#80
        LD (NROUND),A
Mk_eol  EXX
        EX AF,AF
        INC A
        LD B,A
        EX AF,AF
        LD A,(MAXLEN)
        CP B
        JP NC,MkLOOP
MK_RET  LD HL,(ss_pos)
        LD A,(ss_num)
        LD (HL),A
        LD A,(MINLEN)
        OR A
        JP NZ,Mkr1
         LD A,(IX+8) ;обхода нет или слишком далеко
         OR A
         JP NZ,G_stop
         JP G_free ;если остановка при ложном обходе
Mkr1    CP 127
        JR C,Mkr2
        LD A,127
Mkr2    LD B,A
         LD A,(IX+8)
         OR A
         JR NZ,Mkr2a
         LD B,1
Mkr2a    ;^если (IX+8)==0, уменьшить длину прохода до 1 (против ложного обхода)
        LD A,(NROUND)
        LD C,A
        OR B
        LD (IX+8),A
        LD A,C
        OR A
        LD A,(IX+2)
        JR NZ,Mkr3
        INC A
        BIT 0,A
        JR Z,Mkr4
        INC A
        JR Mkr4
Mkr3    DEC A
        BIT 0,A
        JR Z,Mkr4
        DEC A
Mkr4    AND 7
        LD (IX+2),A
        JP GO_MAN;!

MK_REp  POP HL
        JR MK_RET

CWstop  POP HL
        EXX
        EX AF,AF
        LD B,A
        LD A,(MAXLEN)
        ADD A,A
        SUB B
        LD (MAX_II),A
        LD A,B
        EX AF,AF
MkLOO3  BIT 0,C
        JR Z,M3k7
        INC C
M3k7    INC C
        PUSH HL
CCWre1  LD HL,inMAP ;выровн
        LD A,C
        AND 7
        LD C,A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        CP 1   ;пров на прох
        JR C,M3k4
        JR Z,MK_REp
         RLCA
         JR NC,M3k4n
         CALL Mk_her
         JR C,M3k4
M3k4n   DEC C
        JR CCWre1
M3k4    EX (SP),HL
        LD DE,GO_Ntb
        LD A,C
        ADD A,A
        ADD A,E
        LD E,A
        LD A,(DE)
        ADD A,L
        LD L,A
        INC DE
        LD A,(DE)
        ADD A,H
        LD H,A
        POP DE
        CP (IX+1)
        JR NZ,M3kk
        LD A,L
        CP (IX+0)
        JP Z,MK_RET
M3kk    CALL DIST
        LD B,A
        LD A,(MINDIS)
        CP B
        JR C,Mk_eo3
        JR Z,Mk_eo3
        LD A,B
        LD (MINDIS),A
        EX AF,AF
        LD (MINLEN),A
        EX AF,AF
        LD A,#80
        LD (NROUND),A
Mk_eo3  EX AF,AF
        INC A
        LD B,A
        EX AF,AF
        LD A,(MAX_II)
        CP B
        JP NC,MkLOO3
        JP MK_RET
        ;
CCWstp  POP HL
        EXX
        EX AF,AF
        LD B,A
        LD A,(MAXLEN)
        ADD A,A
        SUB B
        LD (MAX_II),A
        LD A,B
        EX AF,AF
MkLOO2  BIT 0,C
        JR Z,M2k7
        DEC C
M2k7    DEC C
        PUSH HL
CWrep2  LD HL,inMAP ;выровн
        LD A,C
        AND 7
        LD C,A
        ADD A,A
        ADD A,L
        LD L,A
        LD A,(HL)
        INC L
        LD H,(HL)
        LD L,A
        ADD HL,DE
        LD A,(HL)
        CP 1   ;пров на прох
        JR C,M2k4
        JP Z,MK_REp
         RLCA
         JR NC,M2k4n
         CALL Mk_her
         JR C,M2k4
M2k4n   INC C
        JR CWrep2
M2k4    EX (SP),HL
        LD DE,GO_Ntb
        LD A,C
        ADD A,A
        ADD A,E
        LD E,A
        LD A,(DE)
        ADD A,L
        LD L,A
        INC DE
        LD A,(DE)
        ADD A,H
        LD H,A
        POP DE
        CP (IX+1)
        JR NZ,M2kk
        LD A,L
        CP (IX+0)
        JP Z,MK_RET
M2kk    CALL DIST
        LD B,A
        LD A,(MINDIS)
        CP B
        JR C,Mk_eo2
        JR Z,Mk_eo2
        LD A,B
        LD (MINDIS),A
        EX AF,AF
        LD (MINLEN),A
        EX AF,AF
        XOR A
        LD (NROUND),A
Mk_eo2  EX AF,AF
        INC A
        LD B,A
        EX AF,AF
        LD A,(MAX_II)
        CP B
        JP NC,MkLOO2
        JP MK_RET

Mk_her  ;препятствие - герой
        ;(C: чужаки/движущиеся - прозрачны для трассировки)
        RRCA
        PUSH AF
        PUSH HL
        AND #7F ;/CALL N_IX
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD A,HUMAN/256
        ADD A,H
        LD H,A
        SET 3,L
        LD A,(HL) ;/LD A,(IX+8)
        POP HL
        OR A
        JR Z,Mk_h2 ;/00
        INC A
        JR Z,Mk_h2 ;/FF
        POP AF ;движущийся прозрачен
        SCF
        RET
Mk_h2   EX AF,AF
        CP 4 ;миним дальность-1 на которой враг не проходим
        JR C,Mk_h3
        EX AF,AF
        LD A,(SIDE_N)
        OR A
        JR NZ,Mk_h1
        POP AF
        SUB #B0
        CP #30
        RET  ;враг прозрачен
Mk_h1   POP AF
        SUB #80
        CP #30
        RET  ;наш прозрачен
Mk_h3   EX AF,AF ;противник близко (непрозрачен)
        POP AF
        XOR A
        RET


GO_MAN  ;перемещение
        LD A,(IX+8)
        OR A
        RET Z
        CALL HL_IXt
        EX DE,HL
        CALL HL_IX0
        PUSH HL
        SBC HL,DE
        POP HL
        JP Z,G_stop ;пришли к цели - стоп
        CP #80
        JR C,GO_CW
        JR NZ,GO_CCW
        CALL DIR_F
        LD (IX+2),A
        CALL GO_NXT
        JR C,GO_go
          BIT 7,A
          JP Z,MAKE_R
          CALL GO_NXe
          JP Z,MAKE_R
          LD (IX+8),0 ;против ложного обхода
        JP MAKE_R
        ;
GO_go   JP go_IX3
GO_CW   DEC (IX+8)
        CALL Z,G_free
        LD C,1
        LD A,(IX+2)
        DEC A
        BIT 0,A
        JR NZ,GO_rep
        DEC A
         LD B,A ;против закручивания
         DEC A
         AND 7
         CALL GO_NXT
         JR NC,GO_re2
         LD A,(IX+8)
         CP #80
         JR Z,GO_re2
         CP 2
         JR C,GO_re2
         LD (IX+8),#01
        JR GO_re2
GO_CCW  DEC (IX+8)
        LD C,-1
        LD A,(IX+2)
        INC A
        BIT 0,A
        JR NZ,GO_rep
        INC A
         LD B,A ;против закручивания
         INC A
         AND 7
         CALL GO_NXT
         JR NC,GO_re2
         LD A,(IX+8)
         CP #82
         JR C,GO_re2
         LD (IX+8),#81
GO_re2  LD A,B
GO_rep  LD B,8
GO_re1  AND 7
        LD (IX+2),A
        CALL GO_NXT
        JR C,Gx3
          BIT 7,A
          JR Z,G_re5
          CALL GO_NXe ;против заторов
          JR Z,G_re5
          LD A,B
          CP 8
          JR NC,G_re5a
          LD A,R ;для b=6..1
          AND #7
          RET NZ
G_re5a    LD (IX+8),#80 ;для b=7..8
G_re5   LD A,(IX+2)
        ADD A,C
        DJNZ GO_re1
        JR G_wait ;! временно заперт - ждать
Gx3     CALL HL_IXt
        EX DE,HL
        CALL DIR
        CP (IX+2)
        CALL Z,G_rnd
        EX DE,HL
        JP GO_go

G_rnd   LD A,R ;переходить на своб. траеторию?
        AND #7F
        CP 7  ;вер:X/128
        RET C ;антизацикливание
        ;
G_free  LD (IX+8),#80 ;своб. перемещ
        RET

G_wait  ;ждать прохода
        LD (IX+3),#80+6;величина ожидания
        JR G_free

G_stop  XOR A ;стоп
        LD (IX+8),A
        RET

GO_NXT  ;Вх:HL-исх точка, А-напр
        ;Вых: DE-след точка, NC/C - непрох/прох
        PUSH HL
        LD DE,GO_Ntb
        ADD A,A
        ADD A,E
        LD E,A
        LD A,(DE)
        ADD A,L
        LD L,A
        INC DE
        LD A,(DE)
        ADD A,H
        LD H,A
        LD D,H
        LD E,L
        LD A,L
        RLCA
        RLCA
        SRL H
        RRA
        SRL H
        RRA
        LD L,A
        LD A,H
        ADD A,MAP2/256
        LD H,A
        LD A,(HL) ;проработать!
        POP HL
        CP 1
        RET

GO_NXe   ;против заторов
         AND #7F
         PUSH IX ;впереди герой
         PUSH HL
         CALL N_IX
         LD A,(IX+8)
         POP HL
         POP IX
         OR A
         RET Z ;он стоит/00
         INC A
         RET;Z ;он стоит/FF  /NZ-двигается




;-----герои ходят и дерутся ----------------------------------
TimIMP  DEFB 1,1,1,-1,1,1,1,27,1 ;задержка удара (-1 - нет фазы)
        DEFB 1,1,1,-1,1,1,1,27,1
        DEFB 1,1,1,1,1,1, 2,2,3

TimDEL  DEFB 1,1,1,6,1,1,1, 31,2 ;задержка после удара
        DEFB 1,1,1,9,1,1,1, 31,2
        DEFB 1,1,1,1,1,1, 2,3,8

HvT1    DEFW 0,1, 1,1, 1,0, 1,-1
        DEFW 0,-1, -1,-1, -1,0, -1,1

HvA     ; %1ibttttt
        JR NZ,HvAA
        LD (IX+3),0  ;конец удара
        RET
HvAA    LD L,A
        AND %11111
        JR Z,HvAim
        DEC (IX+3)  ;задержка
        RET
HvAim   BIT 6,L
        JR Z,HvAdel
        LD A,(IX+4)
        LD HL,TimIMP
        CALL BA
        CP 255
        JR C,HvAi1
        LD HL,TimDEL ;лучники
        LD A,(IX+4)
        CALL BA
        ADD A,%10000000
        LD (IX+3),A
         LD A,3         ;FX-лук
         JP SOUNDn      ;
HvAi1   ADD A,%10100000  ;удар
        LD (IX+3),A
        LD A,(IX+2)
        JR HvA1
HvAdel   LD A,(IX+4)    ;FX-эффект удара
         LD HL,typSND   ;
         CALL BA        ;
         CALL SOUNDn    ;
        LD A,(IX+4)
        LD HL,TimDEL
        CALL BA
        ADD A,%10000000
        LD (IX+3),A
        LD A,(IX+2)
        ADD A,4
        AND 7
HvA1    EX AF,AF
        LD A,(IX+4)
        LD HL,AT_TY_
        CALL BA
        RRCA
        RET C
        EX AF,AF
        JR Hv2_

HERMOV  ;LD A,(IX+3) ;перемещение (п/п нижн. уровня)
        ;OR A
        ;RET Z
        CP #80 ;в А ix+3
        JR NC,HvA
        EX AF,AF
        DEC (IX+3)
        LD A,(IX+7)
        AND %111
        CP 2
        JR Z,Hv2
        JP C,Hv1
        CP 3
        JP NZ,Hv4
        EX AF,AF
        CP 1
        JR Z,Hv2
        CP 4
        JR Z,Hv2
Hv3     LD A,(IX+2)
        LD HL,HvT1
        CALL DA
        INC HL
        PUSH HL
        LD D,(HL)
        LD E,A
        LD L,(IY+0)
        LD H,(IY+1)
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        LD (IY+0),L
        LD (IY+1),H
        POP HL
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        LD L,(IY+2)
        LD H,(IY+3)
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        LD (IY+2),L
        LD (IY+3),H
        RET
Hv2     LD A,(IX+2)
Hv2_    LD HL,HvT1
        CALL DA
        INC HL
        PUSH HL
        LD D,(HL)
        LD E,A
        LD L,(IY+0)
        LD H,(IY+1)
        ADD HL,DE
        ADD HL,DE
        LD (IY+0),L
        LD (IY+1),H
        POP HL
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        LD L,(IY+2)
        LD H,(IY+3)
        ADD HL,DE
        ADD HL,DE
        LD (IY+2),L
        LD (IY+3),H
        RET
Hv1     LD A,(IX+2)
        LD HL,HvT1
        CALL DA
        INC HL
        PUSH HL
        LD D,(HL)
        LD E,A
        LD L,(IY+0)
        LD H,(IY+1)
        ADD HL,DE
        LD (IY+0),L
        LD (IY+1),H
        POP HL
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        LD L,(IY+2)
        LD H,(IY+3)
        ADD HL,DE
        LD (IY+2),L
        LD (IY+3),H
        RET
Hv4     LD A,(IX+2)
        LD HL,HvT1
        CALL DA
        INC HL
        PUSH HL
        LD D,(HL)
        LD E,A
        LD L,(IY+0)
        LD H,(IY+1)
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        LD (IY+0),L
        LD (IY+1),H
        POP HL
        INC HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        LD L,(IY+2)
        LD H,(IY+3)
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        ADD HL,DE
        LD (IY+2),L
        LD (IY+3),H
        RET

go_IX3  ;нач знач фазы IX+3
        CALL HL_IX0 ;сместить ук в map2 (в DE)
        CALL GMAP2
        LD C,(HL)
        LD (HL),0
        EX DE,HL
        CALL IX0_HL
        CALL GMAP2
        LD (HL),C
        LD HL,HvTHs ;нач del
        LD A,(IX+2)
        RRCA
        JR NC,gX0
        LD HL,HvTDs
gX0     CALL gPAR
        LD C,8
        CP 2
        JR Z,gX1
        LD C,16
        JR C,gX1
        CP 3
        LD C,6
        JR Z,gX1
        LD C,4
gX1     LD (IX+3),C
        LD C,A
        LD A,(IX+7)
        AND %11111000
        OR C
        LD (IX+7),A
        RET