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