Login

Subversion Repositories NedoOS

Rev

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

        ;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 ;предыд. диалог до отдачи вещи