;MAIN "VERA",8
 
 
 
;Для компиляции раздела "Об..."
 
;раскоментировать строку, но
 
;закоментировать вышестоящие INCBIN
 
        ;INCLUDE "B:ABOUT"
 
 
 
VUSE1   CALL CLRMK
 
        CALL MANAGE
 
        LD A,B
 
        CP 5
 
        RET NZ
 
 
 
;Выкладыв. вещей на поле/разговор
 
VUSE2
 
        LD A,(RunHero+1)
 
        AND A
 
        RET NZ
 
        LD A,B
 
 
 
        DEC A
 
        LD (VUSE3+1),A
 
        JP Z,VSHERO
 
 
 
        LD (RunHero+1),A
 
        LD (VUS+1),A
 
        LD A,ROTSPD     ;скорость при повороте и выклад. вещи
 
        LD (SPH+1),A
 
        LD DE,(HEROCRD)
 
CURSCRD LD BC,0         ;крд. курс. на карте в сис-ме 2*2 знак.
 
        CALL ROTATOR    ;поворот героя к месту применения вещи
 
 
 
VUSE3   LD A,0
 
        DEC A
 
        JP Z,GIVE      ;Отдаем вещь персонажу
 
        DEC A
 
        JP Z,TALK      ;Говорим с персонажем
 
        DEC A
 
        JP Z,MANIP     ;Применяем вещь на объект
 
        DEC A
 
        LD (PUT_GET+1),A
 
                       ;0-Выкладываем вещь рядом с героем
 
                       ;1-Берем вещь
 
VUSE4   LD HL,VeraTab2
 
        LD A,0
 
        LD C,A
 
        AND A
 
        JR NZ,VS1
 
 
 
        LD A,(ROTATE+1)
 
        ADD A,A         ;A=A*12
 
        ADD A,A
 
        LD B,A
 
        ADD A,A
 
        ADD A,B
 
        LD E,A
 
        LD D,0
 
        ADD HL,DE
 
VS1     LD A,C
 
        INC A
 
        CP 3
 
        CALL Z,VS3
 
        CP 7
 
        JR NC,VS2
 
        LD (VUSE4+4),A
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL)
 
        INC HL
 
        LD (SprHero+1),DE
 
        JR VS2_
 
 
 
;Выкладыв. закончено
 
VS2     XOR A
 
        LD (VUS+1),A
 
        LD (VUSE4+4),A
 
        LD (RunHero+1),A
 
        LD A,SPD_HERO
 
        LD (SPH+1),A
 
        LD HL,VeraTab2
 
VS2_    LD (VUSE4+1),HL
 
        RET 
 
 
 
;Непосредств. выкладывание вещи
 
VS3     EX AF,AF' ;'
 
        PUSH HL
 
 
 
        LD HL,SND_TK
 
        LD (SAMPLE+1),HL
 
 
 
        LD A,PG_MAP
 
        CALL PAGE
 
 
 
PUT_GET LD B,0     ;0-выкладываем,1-берем
 
        DJNZ VS5
 
;берем
 
        LD A,(UNDER+1)
 
        AND %01111111
 
        LD D,A
 
        CALL SVOYST
 
       if EGA
 
       ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
 
       LD (MAPFLAG+1),A ;обновить весь экран
 
       endif
 
        LD H,B
 
        LD L,C
 
        INC HL,HL,HL,HL
 
        LD C,(HL)
 
        INC HL
 
        LD A,(HL)
 
        CP #F8          ;если под вещью лежал
 
        JR NC,P_G       ;спрайт из последних 32-х
 
                        ;то поле под ним не делаем проходимым
 
        LD HL,(ADRELM)
 
        LD (HL),0
 
 
 
P_G     LD HL,(ADRSPRT) ;восст. фон
 
        LD (HL),C
 
        INC HL
 
        LD (HL),A
 
        LD A,D
 
        ADD A,7
 
        JR VS4
 
 
 
;выкладываем
 
VS5     LD A,(KARM)
 
        LD BC,SPR
 
        ADD A,143
 
        LD L,A
 
        LD H,C   ;C=0
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,HL
 
        ADD HL,BC
 
        EX DE,HL
 
        LD HL,(ADRSPRT)
 
        LD C,(HL)   ;запоминаем фон
 
        LD (HL),E
 
        INC HL
 
        LD B,(HL)
 
        LD (HL),D
 
        LD D,B
 
        LD E,C
 
        SUB 150
 
 
 
        CALL SVOYST
 
        LD H,B
 
        LD L,C
 
        INC HL,HL,HL,HL
 
 
 
        LD (HL),E
 
        INC HL
 
        LD (HL),D
 
        LD HL,(ADRELM)
 
        LD (HL),1
 
        XOR A
 
        LD (DISTV),A
 
        LD (CCURS+1),A
 
VS4     LD (KARM),A
 
        EX AF,AF' ;'
 
        POP HL
 
        RET 
 
 
 
;Поворот героя к персон./вещи
 
;IN: DE-коорд. героя, BC-персон./вещи
 
ROTATOR
 
        LD A,D          ;Расчет направления движения
 
        SUB B           ;Оно получается из разности
 
        RRA             ;нужно если разность >1
 
        JR NC,PTH1
 
        RLA 
 
PTH1    LD H,A          ;первоначальной координаты
 
        LD A,E          ;и следующей коорд.
 
        SUB C
 
        RRA 
 
        JR NC,PTH2
 
        RLA 
 
PTH2    LD L,A          ;HL-направление
 
 
 
;       LD A,L          ;by Pulsar
 
        ADD A,A
 
        ADD A,L
 
        ADD A,H
 
        ADD A,4
 
        ADC A,-1
 
        LD B,A
 
        JP ROTAT
 
 
 
ONESYM  DB 0,0 ;для печати одного символа
 
ADRELM  DW 0 ;адрес элемента
 
ADRSPRT DW 0 ;Адрес спрайта на карте под курсором
 
 
 
;Процедуры обслуживающие диалоги, скрипты
 
 
 
;нельзя применить
 
NOTUSE  ;LD B,64   ;номер сообщ.
 
        LD A,#20
 
        LD (PRJR),A
 
        ADD A,A
 
        LD (PRTIME+1),A
 
        LD B,A
 
        LD HL,SND_END
 
        LD (SAMPLE+1),HL
 
        JP SVER    ;печ. сообщения
 
 
 
;Применяем вещь на героя
 
VSHERO  LD A,(KARM)
 
        SUB 7
 
        CALL SVOYST
 
        LD A,(BC)
 
        AND A
 
        JR Z,NOTUSE
 
 
 
;Вещь применяется
 
        LD HL,SND_HR
 
        LD A,(BC)
 
        BIT 7,A
 
        JR Z,TLSN-3 ;только реплика
 
        AND %01111111
 
        PUSH HL
 
        CALL SCRIPT;скрипт
 
        POP HL
 
        EX AF,AF' ;'
 
        JR TLSN-3
 
 
 
XF      EQU (SCRHG/2-4)*256+SCRHG-8+(SHADSCR/256)
 
XF2     EQU (SCRHG/2)*256+SCRHG+(SHADSCR/256)
 
 
 
;Разговор с персонажем (открываем окно диалога)
 
TALK
 
        ;jr $
 
        LD HL,SND_SPK
 
        LD (SAMPLE+1),HL
 
TLSN
 
        LD (TLK+1),A ;номер реплики или 0-диалог
 
       if !EGA
 
        AND A
 
        JR Z,TL0
 
        LD A,201
 
TL0     LD (DLG),A
 
       endif
 
        XOR A
 
        LD (TILED+1),A
 
        LD A,(KARM)
 
        LD (KARMBK+1),A
 
        LD A,SCRHG-8
 
        LD BC,XF
 
        LD E,1
 
        HALT 
 
        DI 
 
        CALL FIX2
 
       if EGA
 
        CALL PRW
 
       else
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        CALL ARROFF
 
        CALL PRW
 
        CALL ARRON
 
       endif
 
        EI 
 
       halt
 
 
 
TLK     LD A,0        ;0-диалог с кем-то, 1-X номер реплики
 
        AND A
 
        LD B,A
 
        LD HL,#0A11   ;H-X,L-Y текущ. позиции печати
 
        JR Z,TL1
 
        LD H,2
 
TL1     LD (TXT1+1),HL
 
        LD A,H
 
        LD (TXT2+1),A
 
        JR Z,TL2
 
 
 
        LD A,B
 
        DEC A
 
        PUSH AF
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        LD HL,RP
 
        LD DE,TEXT
 
        PUSH DE
 
       if MEGALZ
 
       ;jr $
 
        call DEC40
 
       else
 
        CALL DEHRUST
 
       endif
 
        POP HL
 
        POP AF
 
        CALL SVOYST+3 ;расчет адреса реплики
 
        XOR A
 
        JR TL3
 
 
 
TL2     CALL PDIAL
 
        LD (TNN_+1),DE
 
        ADD A,39
 
        LD (WHO+1),A
 
 
 
        LD A,1
 
TL3     LD (DIAL+1),A
 
        XOR A
 
        LD H,A
 
        LD L,A
 
        LD (DISTV),HL
 
        LD (CCURS+1),A
 
        LD (UNDER+1),A
 
        LD (KARM),A
 
        LD (F3+1),A
 
        LD (TXT+1),BC ;адрес диалога/реплики
 
        JP VS2+4
 
 
 
;Продолжение диалога (окно диалога открыто)
 
TALKING
 
        LD HL,(mouse_crd);L-Y,H-X
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        CALL NP2 ;вид курсора
 
        CALL DIV8
 
        LD A,H
 
        CP 22   ;X
 
        JR NZ,TLKNG ;не попали в кнопочку
 
        LD A,L  ;Y
 
        CP 17
 
        JP Z,SKIP ;попали в кнопочку
 
 
 
TLKNG
 
        LD A,(DIALOG+1) ;проверяем для клав. Enter
 
        AND A
 
        RET Z
 
 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
 
 
        LD HL,(TXT+1);текущ. напеч. байт
 
        LD B,(HL)
 
        INC HL
 
        LD A,(HL)
 
        LD (SCRP+1),A
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
        LD A,B
 
        CP TOKEN
 
        RET NC ;фраза все еще печатается
 
 
 
;Продолжение диалога
 
;       LD A,B
 
        AND A
 
        JR Z,TLKEND ;конец диалога - выход
 
        HALT 
 
        LD DE,#0A14 ;H-X,L-Y
 
        LD BC,#1106;#1006 ;fix Sergio
 
        DEC A
 
        JR Z,TN1    ;1 на собес.
 
        DEC A
 
        JR Z,TN0    ;2 на героя
 
        DEC A
 
        JR Z,TNN    ;3 на другой диалог
 
        DEC A       ;4 скрипт
 
        JR Z,SCRP
 
 
 
;       DEC A
 
;       JR Z,SCRP5  ;5 особый скрипт (см. формат)
 
 
 
;6 продолж. реплики
 
        LD A,(TXT1+1)
 
        CP #13
 
        JR Z,TN0
 
        JR TN1
 
 
 
TNN     LD A,(SCRP+1)
 
TNN_    LD (0),A    ;текущий диалог текущего персонажа
 
        JR TLKEND
 
 
 
TN0     LD E,#11
 
TN1
 
       if EGA
 
        push de
 
        push hl
 
        LD L,#25
 
        LD A,201
 
        CALL FIX3
 
        call CLW
 
        pop hl
 
        pop de
 
       endif
 
        LD (TXT1+1),DE
 
        LD (TXT+1),HL
 
 
 
        LD HL,SND_NXT
 
        LD (SAMPLE+1),HL
 
 
 
       if EGA
 
        ret
 
       else
 
        LD L,#25
 
        LD A,201
 
        CALL FIX3
 
        CALL ARROFF
 
        CALL CLW
 
        JP ARRON
 
       endif
 
 
 
SCRP    LD A,0
 
        CALL SCRIPT ;выполняем скрипт
 
 
 
        CALL PAGE_PG_VIEW
 
 
 
;Выход из диалога
 
TLKEND
 
        LD HL,ONESYM+1
 
        LD (TXT+1),HL
 
        XOR A
 
        LD E,A
 
       if EGA
 
       ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
 
       endif
 
        LD (MAPFLAG+1),A
 
        LD A,SCRHG
 
        LD BC,XF2
 
        CALL FIX2
 
        XOR A
 
        LD BC,#1506
 
        LD L,#21
 
        CALL FIX3
 
 
 
        CALL FONE
 
KARMBK  LD A,0      ;восстан. то, что было в кармане
 
        LD (KARM),A
 
        XOR A
 
        LD (PDMOD),A
 
 
 
        LD A,(SAMPLE+2)
 
        AND A
 
        JR NZ,TEND
 
        LD HL,SND_END
 
        LD (SAMPLE+1),HL
 
TEND    JP VS2
 
 
 
;Промотка/пропуск диалога
 
SKIP
 
        LD A,(DIALOG+1) ;открыто ли окно диалога?
 
        AND A
 
        JP Z,KOF
 
 
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        HALT 
 
        LD DE,(TXT+1)   ;текущ. напеч. байт
 
 
 
        LD HL,ONESYM+1  ;останавливаем печать
 
        LD (TXT+1),HL
 
 
 
        LD HL,KOF       ;сюда пойдет переход
 
        PUSH HL         ;по RET
 
 
 
LPSKIP1 LD A,(DE)
 
        INC DE
 
        CP TOKEN
 
        JR NC,LPSKIP1
 
        AND A
 
        JR Z,TLKEND-3   ;завершение диалога
 
        CP 3
 
        JR Z,LPSKIP3
 
        CP 4
 
        JR Z,LPSKIP2
 
        CP 5
 
        JR NZ,LPSKIP1
 
        LD A,(DE)
 
        CALL SCRIPT ;выполняем скрипт, который выдаст
 
                    ;след. адрес диалога
 
        EX DE,HL
 
        JR LPSKIP1
 
 
 
;выполнение скрипта
 
LPSKIP2 LD A,(DE)
 
        JR SCRP+2
 
 
 
;переход на другой диалог с персонажем и
 
;завершение текущего диалога
 
LPSKIP3 LD A,(DE)
 
        LD HL,(TNN_+1)
 
        LD (HL),A
 
        JR TLKEND-3
 
 
 
;Отдаем персонажу вещь
 
GIVE
 
        LD A,(PERSON)
 
        LD B,A
 
        LD A,(KARM)
 
        SUB 7
 
        LD C,A
 
        PUSH BC
 
        CALL FOR
 
        POP DE
 
        DJNZ GV1
 
        JR GV3  ;реплика
 
;диалог
 
GV1     AND A
 
        JR Z,GV2
 
        EX AF,AF' ;'
 
        CALL PDIAL2
 
        LD A,(HL)   ;запом. диалог
 
        LD (PREV),A
 
        LD (PREV+1),HL
 
        EX AF,AF' ;'
 
        LD (HL),A
 
        JR GV3-1
 
;Вещь не нужна
 
GV2     LD A,#23
 
        LD (PDMOD),A
 
        XOR A
 
GV3     JP TALK
 
 
 
;Применение вещей на объекты
 
MANIP
 
        LD A,(ITEM)
 
        LD B,A
 
        LD A,(KARM)
 
        SUB 7
 
        LD C,A
 
        LD HL,FORTAB2
 
        LD A,LENTAB2
 
        CALL FO1
 
        AND A
 
        JR NZ,MN1
 
        CALL VS2
 
        JP NOTUSE
 
MN1     LD B,A
 
 
 
        LD HL,SND_OBJ
 
        LD (SAMPLE+1),HL
 
 
 
        LD A,B
 
        JP TLSN
 
 
 
;Вывод горизонтальных линий окна
 
;работа со стеком, но без запрета прерываний
 
PRW
 
       if EGA
 
        ;ld a,PGHUD
 
        ;call setpg
 
        ld de,hudmsg
 
        ld bc,64*256+96
 
        ld hl,scrbase+(40*128)
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        jp primgega_pghud
 
       else
 
        LD (BACK+1),SP
 
        LD HL,WIN_SPR
 
        LD C,(HL)
 
        INC HL
 
        LD B,(HL)
 
        DEC HL
 
        LD SP,HL
 
 
 
        LD HL,#5000+#8000
 
        LD DE,#50E0+#8000
 
 
 
        LD A,2
 
        EX AF,AF' ;'
 
        LD A,4
 
PRWIN   ;
 
        DUP 11
 
        POP BC
 
        LD (HL),C
 
        INC L
 
        LD (HL),B
 
        INC L
 
        EDUP 
 
 
 
        POP BC
 
        LD (HL),C
 
        INC L
 
        LD (HL),B
 
        INC H
 
 
 
        DUP 11
 
        POP BC
 
        LD (HL),C
 
        DEC L
 
        LD (HL),B
 
        DEC L
 
        EDUP 
 
 
 
        POP BC
 
        LD (HL),C
 
        DEC L
 
        LD (HL),B
 
        INC H
 
 
 
        DEC A
 
        JR NZ,PRWIN
 
        EX DE,HL
 
        EX AF,AF' ;'
 
        DEC A
 
        JP NZ,PRWIN-3
 
BACK    LD SP,0
 
 
 
;Вывод вертикальных линий окна
 
PRW2    LD HL,WIN_SPR+(24*16)
 
        LD DE,#5020+#8000
 
        LD BC,#5037+#8000
 
 
 
        LD A,6
 
PW2     EX AF,AF' ;'
 
        DUP 8
 
        LD A,(HL)
 
        LD (DE),A
 
        INC HL
 
        INC D
 
        LD A,(HL)
 
        INC HL
 
        LD (BC),A
 
        INC B
 
        EDUP 
 
 
 
        LD D,#50+#80
 
        LD B,D
 
 
 
        LD A,E
 
        ADD A,32
 
        LD E,A
 
 
 
        LD A,C
 
        ADD A,32
 
        LD C,A
 
 
 
        EX AF,AF' ;'
 
        DEC A
 
        JR NZ,PW2
 
       endif
 
 
 
;стираем само окно
 
CLW
 
        LD HL,#D021
 
CLP     LD DE,#1506 ;ширина,высота
 
       if EGA
 
        ld bc,scrbase+(40*136)+1-#d021
 
        add hl,bc
 
        ;ld bc,64*256+96
 
        ld a,d
 
        inc a
 
        add a,a
 
        add a,a
 
        ld c,a ;wid/2
 
        ld a,e
 
        add a,a
 
        add a,a
 
        add a,a
 
        ld b,a ;hgt
 
        ld e,0xc9 ;color 9
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        push bc
 
        push de
 
        push hl
 
       ld a,55
 
       ld (im_arroff),a
 
       call ARROFF
 
        call setpgsscr40008000;_current ;visible
 
        pop hl
 
        pop de
 
        pop bc
 
        push bc
 
        push de
 
        push hl
 
        call climgega_onescreen
 
       call ARRON
 
       ld a,55+128 ;"or a"
 
       ld (im_arroff),a
 
        call setpgsscr40008000_current ;shadow
 
        pop hl
 
        pop de
 
        pop bc
 
        ld a,55 ;"scf"
 
        ld (wasdrawimg),a
 
        jp climgega_onescreen
 
       else
 
        XOR A
 
        LD C,4
 
CLP_    LD B,D
 
        LD (HL),A
 
        INC L
 
        DJNZ $-2
 
        LD (HL),A
 
        INC H
 
        LD B,D
 
        LD (HL),A
 
        DEC L
 
        DJNZ $-2
 
        LD (HL),A
 
        INC H
 
        DEC C
 
        JR NZ,CLP_
 
        CALL LINE_HL+1
 
        DEC E
 
        JR NZ,CLP+3
 
 
 
CLP3    NOP ;RET
 
 
 
;цвет
 
        LD HL,#DA00
 
        LD E,8
 
        LD A,#60
 
        CALL FNLP
 
 
 
        LD A,#68
 
        LD H,A
 
        LD L,A
 
        LD (#DA00),HL
 
        LD (#DA16),HL
 
        LD (#DAEB),HL
 
        LD (#DAF7),A
 
        LD (#DAE0),A
 
 
 
DLG     NOP ;/RET ;есть ли диалог?
 
 
 
        LD A,29
 
        LD B,3
 
        CALL FIX
 
 
 
        LD A,#78
 
        LD HL,#5A21+#8000
 
        LD E,6
 
        CALL FNLP
 
 
 
        LD A,8
 
        LD B,24
 
;Измен. проц. вывода атрибутов
 
FIX
 
        LD (FNLPp1),A
 
        LD A,B
 
        LD (FNLPp3),A
 
        RET 
 
       endif
 
 
 
;Изменяем высоту выводимого экрана
 
;убираем курсор
 
;измен. проц-ры вывода курсора и др.
 
FIX2
 
        LD (HMOVEp1),A ;высота видимой части карты/8
 
        LD (FNLPm1),A
 
        LD A,B
 
        LD (HMAP+1),A
 
        LD A,C
 
        LD (ARO+1),A
 
        LD (ARO2+1),A
 
        LD A,E
 
        LD (DIALOG+1),A
 
        LD (VUS+1),A
 
        RET 
 
 
 
;Измен, пр-ру стирания окна
 
FIX3
 
       if !EGA
 
        LD (CLP3),A ;0(TLKEND)/201(TN1)
 
       endif
 
        LD A,L ;#21(TLKEND)/#25(TN1) scraddr начала, где стирать
 
        LD (CLW+1),A
 
        LD (CLP+1),BC
 
        RET 
 
 
 
;Колдовство Зловета (не туда идет герой)
 
MAG1
 
        CALL RND2
 
        AND 15
 
        LD B,A
 
        LD A,L
 
        XOR B
 
        LD L,A
 
        LD A,H
 
        XOR B
 
        LD H,A
 
        RET 
 
 
 
;Колдовство Зловета (герой не движется)
 
MAG2    LD D,L
 
        LD E,H
 
        LD HL,(DispMapX)
 
        ADD HL,DE
 
        LD (OLDC+1),HL
 
        LD H,E
 
        LD L,D
 
        RET 
 
 
 
;Отложенное выполнение задания
 
;Когда герой еще далеко от предмета/персонажа
 
;Как только герой подойдет, задание будет выполняться
 
;говорить/брать/применять
 
FTASK
 
        RET ;/nop
 
        CALL F7
 
FTSK    LD HL,0
 
        LD A,201
 
        LD (CLC48_),A
 
        CALL CALC1
 
        XOR A
 
        LD (CLC48_),A
 
        PUSH DE
 
        CALL MANAGE
 
        POP DE
 
        LD A,B
 
        CP 2
 
        RET C
 
        CP 5
 
        RET Z
 
        PUSH BC
 
        CP 4
 
        CALL C,CLC48_
 
        POP BC
 
        LD HL,#FFFF
 
        LD (OLDC+1),HL
 
        JP VUSE2
 
 
 
;Вывод спрайта течения дня-ночи
 
DAYS
 
        RET 
 
        LD (D_SP+1),SP
 
        LD SP,REZULT
 
 
 
DADR=#D039
 
        DUP 8
 
        POP HL
 
        LD (DADR),HL
 
        POP HL
 
        LD (DADR+2),HL
 
        POP HL
 
        LD (DADR+4),HL
 
DADR=DADR+256
 
        EDUP 
 
 
 
DADR=#D059
 
        DUP 8
 
        POP HL
 
        LD (DADR),HL
 
        POP HL
 
        LD (DADR+2),HL
 
        POP HL
 
        LD (DADR+4),HL
 
DADR=DADR+256
 
        EDUP 
 
 
 
DADR=#D079
 
        DUP 8
 
        POP HL
 
        LD (DADR),HL
 
        POP HL
 
        LD (DADR+2),HL
 
        POP HL
 
        LD (DADR+4),HL
 
DADR=DADR+256
 
        EDUP 
 
 
 
DADR=#D099
 
        DUP 8
 
        POP HL
 
        LD (DADR),HL
 
        POP HL
 
        LD (DADR+2),HL
 
        POP HL
 
        LD (DADR+4),HL
 
DADR=DADR+256
 
        EDUP 
 
D_SP    LD SP,0
 
        LD A,201
 
setDAYS_a
 
        LD (DAYS),A
 
        RET 
 
 
 
;OUT:
 
;BC-адрес текущ. диалога с персонажем
 
;DE-адрес текущ. номера диалога с персонажем
 
; A-номер собеседника
 
PDIAL
 
        CALL PDIAL2
 
        PUSH AF,HL,HL
 
        INC HL
 
        INC HL
 
        LD A,(HL)
 
        INC HL
 
        LD H,(HL)
 
        LD L,A
 
        LD A,PG_MUZ
 
        CALL PAGE
 
        LD DE,TEXT
 
        PUSH DE
 
       if MEGALZ
 
       ;jr $
 
        call DEC40
 
       else
 
        CALL DEHRUST ;распак. текст
 
       endif
 
        POP DE,HL
 
PDMOD   NOP          ;0-текущ. диалог
 
                     ;INC HL - реакция на ненужную вещь
 
        LD A,(HL)    ;номер текущ. диалога
 
        EX DE,HL
 
        CALL SVOYST+3
 
        POP DE,AF
 
        RET 
 
 
 
;OUT: A-персонаж
 
;     HL-адрес номера текущего диалога
 
PDIAL2  LD A,(PERSON) ;с кем разговариваем
 
        DEC A   ;
 
        SUB 2   ;Этюд!
 
        ADC A,1 ;
 
        LD B,A
 
        ADD A,A
 
        ADD A,A
 
        LD L,A
 
        LD H,0
 
        LD DE,GLB
 
        ADD HL,DE
 
        LD A,B
 
        RET 
 
 
 
;Мигание стрелочек мешка
 
FL_MESH
 
        LD A,(gamemenucolorline);(#DAD9) ;если выделена кнопка главного меню
 
        CP 56+64
 
        RET Z
 
 
 
        LD HL,(mouse_crd);L-Y,H-X
 
        LD A,L
 
        CP 30
 
        JR NC,FM2
 
        CALL DIV8
 
        LD A,L
 
        CP 3
 
        JR NZ,FM2
 
        LD A,H
 
        SUB 27
 
 
 
        JR C,FM2
 
        CP 2
 
        JR NC,FM2
 
 
 
;счетчик
 
        LD HL,FMCNT
 
        DEC (HL)
 
        RET NZ
 
        LD (HL),FRM
 
 
 
       if EGA
 
;рисуем на двух экранах, как PR64
 
curbagarr=$+1
 
        ld de,bagarr0
 
        ld hl,0xffff&(bagarr0+bagarr1)
 
        or a
 
        sbc hl,de
 
FL_MESH_drawhl
 
        ld (curbagarr),hl
 
        ex de,hl
 
        ld hl,scrbase+(24*40)+27
 
        ld a,PGHUD
 
        call setpg
 
        ld bc,0x0808
 
;b=hgt,c=wid (/2)
 
;de=gfx
 
;hl=scr
 
        ;ld a,55 ;"scf"
 
        ;ld (wasdrawimg),a ;не надо, т.к. мы в прерывании
 
        jp primgega
 
       endif
 
 
 
FM0     LD HL,#C37B
 
        LD DE,#C17C
 
 
 
        LD A,(HL)
 
        CP %11110110
 
        JR Z,FM1
 
;стрелки мешка по умолчанию
 
        LD (HL),%11110110
 
        INC H
 
        LD (HL),%11100011
 
        INC H
 
        LD (HL),%11000001
 
        EX DE,HL
 
        LD (HL),%11100000
 
        INC H
 
        LD (HL),%11110001
 
        INC H
 
        LD (HL),%01111011
 
        RET 
 
 
 
FM1
 
;стрелки мешка нажаты
 
        LD (HL),%11111110
 
        INC H
 
        LD (HL),%11111111
 
        INC H
 
        LD (HL),%11111111
 
        EX DE,HL
 
        LD (HL),%11111111
 
        INC H
 
        LD (HL),%11111111
 
        INC H
 
        LD (HL),%01111111
 
        RET 
 
 
 
FM2
 
;рисуем стрелки мешка по умолчанию
 
       if EGA
 
        ld de,bagarr0
 
        ld hl,(curbagarr)
 
        or a
 
        sbc hl,de
 
        ret z
 
        ex de,hl ;hl=bagarr0
 
        jr FL_MESH_drawhl
 
       else
 
 
 
        LD A,(#C37B)
 
        CP %11110110
 
        RET Z
 
        JR FM0
 
       endif
 
 
 
FMCNT   DB FRM   ;счетчик для мигания стрелочек
 
 
 
;Скролл карты от клавиш
 
MOVMAP
 
        CALL SCRLMAP
 
        RET NC
 
 
 
;      LD A,PG_VIEW
 
        CALL PAGE_PG_VIEW
 
 
 
        POP DE ;выход из CALL MOVMAP
 
               ;т.к. будет переход в другое место
 
MVM0    LD HL,(NEW_CRD)
 
        LD DE,(OLD_CRD+1)
 
        LD A,H
 
        SUB D
 
        LD H,A
 
        JR Z,MVM1
 
        LD A,1
 
        LD H,-16
 
        JR NC,MVM1
 
        LD A,-1
 
        LD H,16
 
MVM1    LD C,A
 
        LD A,L
 
        SUB E
 
        LD L,A
 
        JR Z,MVM2
 
        LD A,1
 
        LD L,-16
 
        JR NC,MVM2
 
        LD A,-1
 
        LD L,16
 
MVM2    LD B,A
 
        OR C
 
        JP Z,CURSR  ;карту не скроллим,
 
                    ;но курсор показываем
 
        LD D,L
 
        LD E,H
 
WWW
 
        JP SCROLL
 
 
 
;Процедуры обслуживания скриптов и пр.
 
 
 
;Положить отложенное задание в очередь (таск)
 
;IN: BC-кол-во фреймов через кот. выполнится скрипт (таск)
 
;    DE-адрес задания (скрипта)
 
 
 
        LD BC,1500
 
INSERT
 
        PUSH AF
 
        LD A,MAXTASK
 
        LD HL,TASKS
 
INSTLP  EXA 
 
        LD A,(HL)
 
        INC HL
 
        OR (HL)
 
        JR Z,INSRT
 
        INC HL
 
        INC HL
 
        INC HL
 
        EXA 
 
        DEC A
 
        JR NZ,INSTLP
 
        POP AF
 
        RET 
 
 
 
INSRT   DI 
 
        DEC  HL
 
        LD (HL),C
 
        INC HL
 
        LD (HL),B
 
        INC HL
 
        LD (HL),E
 
        INC HL
 
        LD (HL),D
 
        POP AF
 
        EI 
 
        RET 
 
 
 
;Выполнение отложенных задач
 
;выполняется только внутри прерывания
 
;поэтому нужно все делать быстро!
 
GOTASK
 
        LD B,MAXTASK
 
        LD HL,TASKS
 
TSKLOOP LD A,(HL)
 
        LD E,A
 
        INC HL
 
        OR (HL)
 
        JR Z,NXTASK
 
        LD D,(HL)
 
        DEC DE
 
        LD (HL),D
 
        DEC HL
 
        LD (HL),E
 
        INC HL
 
        LD A,D
 
        OR E
 
        CALL Z,GT0  ;время пришло
 
                    ;выполнить таск!
 
NXTASK  INC HL
 
        INC HL
 
        INC HL
 
        DJNZ TSKLOOP
 
        RET 
 
 
 
;само выполнение
 
GT0
 
        PUSH BC
 
        PUSH HL
 
 
 
        INC HL
 
        LD C,(HL)
 
        INC HL
 
        LD H,(HL)
 
        LD L,C
 
        LD (GT1+1),HL
 
 
 
        LD HL,SND_TSK    ;после выполнения
 
                         ;таска будет звук
 
        LD (SAMPLE+1),HL
 
 
 
        LD A,PG_MAP
 
        CALL PAGE
 
GT1     CALL 0      ;выполняем таск
 
        POP HL
 
        POP BC
 
        RET 
 
 
 
;Выполнение скриптов
 
;IN: A-номер скрипта
 
SCRIPT
 
        ADD A,A
 
        LD E,A
 
        LD D,0
 
        LD A,PG_MAP
 
        CALL PAGE
 
        LD HL,SCRPTB
 
        ADD HL,DE
 
        LD E,(HL)
 
        INC HL
 
        LD D,(HL)
 
        EX DE,HL
 
        LD (JPSC+1),HL
 
JPSC    CALL 0
 
        EX AF,AF' ;'
 
;      LD A,PG_VIEW
 
        JP PAGE_PG_VIEW
 
 
 
;Нужна ли отдаваемая вещь персонажу
 
; IN:B-персонаж, C-вещь
 
;OUT:A<>0-номер диалога с персонажем, если ему вещь нужна
 
;    A=0, если вещь не нужна
 
;    Выполняется скрипт, если нужно
 
 
 
;    B=0-идет диалог
 
;    B=1-реплика, A-номер реплики
 
FOR
 
        LD HL,FORTAB
 
        LD A,LENTAB
 
FO1     LD D,(HL)
 
        INC HL
 
        LD E,(HL)
 
        INC HL
 
        AND A
 
        EX DE,HL
 
        SBC HL,BC
 
        EX DE,HL
 
        JR Z,FO2
 
        INC HL
 
        INC HL
 
        DEC A
 
        JR NZ,FO1
 
        LD B,A ;B=0
 
        RET 
 
FO2     LD A,(HL)   ;диалог
 
        INC HL
 
        LD B,(HL)   ;скрипт
 
        INC A
 
        JR Z,FO4    ;доп. команда
 
        DEC A
 
        DJNZ FO3
 
        RET 
 
FO3     PUSH AF
 
        LD A,B
 
        CALL SCRIPT
 
        POP AF
 
        LD B,0
 
        RET 
 
FO4     LD A,B   ;номер реплики
 
        LD B,1
 
        RET 
 
 
 
;---
 
 
 
;Формат анимации на карте
 
;1-й байт - номер группы*2 и вкл. 0-й бит
 
;2-й байт - номер спрайта*2 из группы
 
 
 
;Адреса групп
 
AdrGrps DW LEO1 ;0
 
        DW MELN ;1
 
        DW FIRS ;2
 
        DW SKEL1;3
 
        DW SKEL2;4
 
        DW SKEL3;5
 
        DW SKEL4;6
 
        DW MOUS ;7
 
        DW PBOY ;8
 
        DW RUMB ;9
 
        DW PIAN1;10
 
        DW PIAN2;11
 
        DW KOST1;12
 
        DW LEO2 ;13
 
        DW INVT ;14
 
        DW INVT2;15
 
        DW INVT3;16
 
 
 
;Количество анимационных групп во всей игре
 
;(например, мельница, костер и т.п.)
 
QGRPS   EQU ($-AdrGrps)/2
 
 
 
;Таблица анимационных групп, в которой выставляются флаги
 
;видимости группы на экране.
 
;Обнуляется после каждой печати видимой части экрана
 
;Состоит из единичек или ноликов.
 
;1-если группа уже появилась на экране,
 
;0-если группы еще небыло. На одну группу - один байт.
 
 
 
AnimGrps DS QGRPS
 
 
 
;Заголовки анимированных групп
 
;5 байт+кол-во спрайтов в группе*2
 
;Все остальное "тело" группы
 
;Можно делать разные заголовки,
 
;со ссылкой на одно и тоже "тело"
 
;Например, это нужно для того чтобы рассинхронизировать
 
;одинаковые анимации (у меня это скелеты)
 
 
 
;Мельница
 
MELN    DB 2   ;Скорость вывода (для восстановления)
 
        DB 2   ;Скорость вывода (счетчик)
 
        DB 1   ;Тип анимации:
 
               ;1-Зацикленная (0.1.2.X.0.1.2...)
 
               ;2-Угасающая (0-X-X-X...),Кол-во фаз в группе
 
               ;должно быть >на 1, где послед. спрайт тот,
 
               ;который будет поставлен на карту (см. LEO2)
 
               ;>=3-Реверсивная, где данное число-2 означает
 
               ;новую стартовую фазу (см. LEO)
 
        DB 3   ;Кол-во фаз в группе-1 (1-X)
 
               ;Если =0, то анимация заморожена
 
        DB 0   ;Смещение от стартовой фазы для всей группы
 
 
 
        DW MEL1;Ссылки на фазы каждого спрайта группы
 
        DW MEL2
 
        DW MEL3
 
        DW MEL4
 
        DW MEL5
 
        DW MEL6
 
        DW MEL7
 
        DW MEL8
 
        DW MEL9
 
 
 
MEL1    DW (80*32)+SPR,(87*32)+SPR,(96*32)+SPR,(105*32)+SPR
 
MEL2    DW (81*32)+SPR,(88*32)+SPR,(97*32)+SPR,(106*32)+SPR
 
MEL3    DW SPR,(89*32)+SPR,(98*32)+SPR,(107*32)+SPR
 
MEL4    DW (82*32)+SPR,(90*32)+SPR,(99*32)+SPR,(108*32)+SPR
 
MEL5    DW (83*32)+SPR,(91*32)+SPR,(100*32)+SPR,(109*32)+SPR
 
MEL6    DW (84*32)+SPR,(92*32)+SPR,(101*32)+SPR,(110*32)+SPR
 
MEL7    DW (85*32)+SPR,(93*32)+SPR,(102*32)+SPR,(111*32)+SPR
 
MEL8    DW (86*32)+SPR,(94*32)+SPR,(103*32)+SPR,(112*32)+SPR
 
MEL9    DW SPR,(95*32)+SPR,(104*32)+SPR,SPR
 
 
 
;Костер
 
FR1     DW (64*32)+SPR,(68*32)+SPR,(72*32)+SPR,(76*32)+SPR,SPR
 
FR2     DW (65*32)+SPR,(69*32)+SPR,(73*32)+SPR,(77*32)+SPR,SPR
 
FR3     DW (66*32)+SPR,(70*32)+SPR,(74*32)+SPR,(78*32)+SPR
 
        DW (314*32)+SPR
 
FR4     DW (67*32)+SPR,(71*32)+SPR,(75*32)+SPR,(79*32)+SPR
 
        DW (315*32)+SPR
 
 
 
;Скелет
 
SKEL1   DB 5,5
 
        DB 1,15,0
 
        DW SK1
 
        DW SK2
 
SK1     DW (123*32)+SPR,(123*32)+SPR,(123*32)+SPR,(123*32)+SPR
 
        DW (123*32)+SPR,(125*32)+SPR,(127*32)+SPR,(129*32)+SPR
 
        DW (131*32)+SPR,(129*32)+SPR,(131*32)+SPR,(129*32)+SPR
 
        DW (131*32)+SPR,(129*32)+SPR,(127*32)+SPR,(125*32)+SPR
 
SK2     DW (124*32)+SPR,(124*32)+SPR,(124*32)+SPR,(124*32)+SPR
 
        DW (124*32)+SPR,(126*32)+SPR,(128*32)+SPR,(130*32)+SPR
 
        DW (132*32)+SPR,(130*32)+SPR,(132*32)+SPR,(130*32)+SPR
 
        DW (132*32)+SPR,(130*32)+SPR,(128*32)+SPR,(126*32)+SPR
 
 
 
SKEL2   DB 6,6
 
        DB 1,15,3
 
        DW SK1
 
        DW SK2
 
 
 
SKEL3   DB 7,7
 
        DB 1,15,8
 
        DW SK1
 
        DW SK2
 
 
 
SKEL4   DB 9,9
 
        DB 1,15,5
 
        DW SK1
 
        DW SK2
 
 
 
;Летучие мыши
 
MOUS    DB 4,4
 
        DB 1,3,0
 
        DW MS1
 
MS1     DW (148*32)+SPR,(149*32)+SPR,(150*32)+SPR,(149*32)+SPR
 
 
 
;Пьяницы
 
PIAN1   DB 10,10
 
        DB 1,6,0
 
        DW PI1,PI2
 
PI1     DW (113*32)+SPR,(113*32)+SPR,(115*32)+SPR,(117*32)+SPR
 
        DW (117*32)+SPR
 
        DW (115*32)+SPR,(113*32)+SPR
 
PI2     DW (114*32)+SPR,(114*32)+SPR,(116*32)+SPR,(118*32)+SPR
 
        DW (118*32)+SPR
 
        DW (116*32)+SPR,(114*32)+SPR
 
 
 
;тело анимации одно на 2-х пьяниц
 
PIAN2   DB 13,13
 
        DB 1,6,4
 
        DW PI1,PI2
 
 
 
;Писающий мальчик
 
PB1     DW (24*32)+SPR,(30*32)+SPR,(30*32)+SPR,(30*32)+SPR
 
PB2     DW (25*32)+SPR,(31*32)+SPR,(36*32)+SPR,(31*32)+SPR
 
PB3     DW (26*32)+SPR,(32*32)+SPR,(37*32)+SPR,(32*32)+SPR
 
PB4     DW (27*32)+SPR,(33*32)+SPR,(38*32)+SPR,(33*32)+SPR
 
PB5     DW (28*32)+SPR,(34*32)+SPR,(39*32)+SPR,(34*32)+SPR
 
PB6     DW (29*32)+SPR,(35*32)+SPR,(40*32)+SPR,(35*32)+SPR
 
 
 
;Замок Зловета
 
RU1     DW (41*32)+SPR,(57*32)+SPR,(41*32)+SPR,(50*32)+SPR
 
RU2     DW (42*32)+SPR,(58*32)+SPR,(42*32)+SPR,(51*32)+SPR
 
RU3     DW (43*32)+SPR,(59*32)+SPR,(43*32)+SPR,(52*32)+SPR
 
RU4     DW (44*32)+SPR,(60*32)+SPR,(44*32)+SPR,(53*32)+SPR
 
RU5     DW (45*32)+SPR,(61*32)+SPR,(45*32)+SPR,(54*32)+SPR
 
RU6     DW (46*32)+SPR,(62*32)+SPR,(46*32)+SPR,(55*32)+SPR
 
RU7     DW (47*32)+SPR,(47*32)+SPR,(47*32)+SPR,(47*32)+SPR
 
RU8     DW (48*32)+SPR,(63*32)+SPR,(48*32)+SPR,(56*32)+SPR
 
RU9     DW (49*32)+SPR,(49*32)+SPR,(49*32)+SPR,(49*32)+SPR
 
 
 
;Кости скелета
 
KOST1   DB 4,4
 
        DB 2,4,0
 
        DW KS1,KS2
 
KS1     DW (135*32)+SPR,(137*32)+SPR,(139*32)+SPR,SPR,SPR,SPR
 
KS2     DW (136*32)+SPR,(138*32)+SPR,(140*32)+SPR,(141*32)+SPR
 
        DW (142*32)+SPR
 
        DW (142*32)+SPR
 
 
 
ONESYM2 DB 0,0,0
 
 
 
;для вещей
 
RNDTB1  DB 30,59,47,2,14,1,18,8,23,17,2,4,35,27,2,35,18,57,25,41
 
        DB 61,51,45,47,14,29,4,46,34,52,53,33
 
PREV    DS 3 ;предыд. диалог до отдачи вещи