DEVICE ZXSPECTRUM1024
include "../../_sdk/sys_h.asm"
include "settings.ast"
SLOT 0
page 8
SLOT 3
EGA=1
FREESCROLL=1;TODO 0
PRFULLMAP=0
MEGALZ=1 ;тексты диалогов не в Hrust2
STACK=0x4000;0x61a8
GAMESTACK=0x3f80;0xFFFF
INT_IM2=0
SETIM2_TWICE=0
INT_USE_BC=1-EGA
scrbase=0x4000+4
iconsscraddr=scrbase+25+(32*40)
faceiconsscraddr=scrbase+(17*8*40)+1
sprmaxwid=48;32
sprmaxhgt=32
scrwid=128+8;160 ;double pixels
scrhgt=192;200
INTSTACK=0x3f00
tempsp=0x3f06 ;6 bytes for prspr
FIXMOUSE=0 ;так в VERAENGN, а 1 в исходнике
FILAT EQU 8*6+64 ;атриб. окна
FILAT2 EQU 8*6+1+64 ;атриб. кнопки
PGTILES0=0x20
PGTILES1=0x21
PGTILES2=0x22
PGTILES3=0x23
PGICONS=0x24
PGSPRITES0=0x25
PGSPRITES1=0x26
PGSPRTRAN0=0x27
PGSPRTRAN1=0x28
PGHUD=0x29
PGDAYNIGHT=0x2a
szARROWS=45*32
;25.08.08
;Переменные для игры
;IM2 EQU #6666 ;расположение вторых прерываний
SHADSCR EQU #4000 ;Теневой экран (линейный)
SCR EQU #C000 ;Основной экран
SCRWD EQU 24 ;ширина видимого экрана в знакоместах
SCRHG EQU 24 ;высота видимого экрана в -/-
FRAME EQU 2 ;кол-во фреймов между обновлениями экрана
MAX_X EQU 245 ;Предел для курсора по X
MAX_Y EQU 181 ;Предел для курсора по Y
QVESH EQU 18 ;кол-во вещей в мешке
SPD_HERO EQU 1 ;V перемещения героя (меньше число - больше V)
ROTSPD EQU 2 ;скорость поворота героя при взятии предметов
STEPS EQU 2 ;кол-во пикселей на кот. перемещ. герой за 1 шаг
STEP1 EQU (16/STEPS)-1
STEP2 EQU (8/STEPS)-1
DSTV EQU 1 ;На сколько близко должна наход. вещь от героя
DSTP EQU 2 ;На сколько близко должен наход. персонаж от героя
FR EQU 16 ;частота мигания курсора
SCMOD EQU 20 ;задержка перед входом в режим скролла карты
FRM EQU 25 ;частота (фреймов) мигания кнопок в диалоге
FRM2 EQU 6 ;кол-во фреймов на кот. показывается курсор пути
PERS EQU 10 ;кол-во персонажей в игре с кот. можно разговар.
TOKEN EQU 7 ;кол-во управляющих кодов (токенов) в тексте-1
MAXTASK EQU 5 ;макс. кол-во задач
SPD_NGT EQU 1200 ;кол-во фреймов, через кот. скролл. спрайт дня
;эта единица является игровым часом
VIDSPD EQU 3 ;скор. видео (MAX 2)
COUNT EQU 26 ;кол-во миганий героя
;Страницы
PG_SPR EQU 0 ;6912:спрайты 2*2 512 штук, EGA:cursors
PG_MAP EQU 1 ;карта,массив,путь,скрипты,звуки
PG_EXCH=2 ;для обмена с 0x9000 (VIDEOS)
PG_MISC EQU 3 ;распак. текст,ключевой кадр, упак.карта,массив
PG_HERO EQU 4 ;спрайты героя
PG_MUZ EQU 6 ;Плеер,музыка
PG_VIEW EQU 7 ;упак. экран
;slot 3
;page 0
org PROGSTART
begin
jp begin2 ;/prsprqwid (sprites in file are made so that they return here)
begin2
ld sp,STACK
OS_HIDEFROMPARENT
ld e,3+0x80 ;6912+keep
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
;ld e,1
;OS_SETSCREEN
ld e,0 ;color byte
OS_CLS
;ld e,0
;OS_SETSCREEN
;ld e,0 ;color byte
;OS_CLS
OS_GETMAINPAGES
;dehl=pages in 0000,4000,8000,c000
ld a,e
ld (pggfx),a
ld a,h
ld (pgcode8000),a
ld a,l
ld (pgcodec000),a
;OS_NEWPAGE
;ld a,e
ld (tpgs+0),a
OS_NEWPAGE
ld a,e
ld (tpgs+PG_EXCH),a
OS_NEWPAGE
ld a,e
ld (pgfake),a ;эту страницу можно будет запарывать при отрисовке спрайтов с клипированием
ld (pgfake2),a
;OS_NEWPAGE
;ld a,e
;ld (pgmain4000),a
ld de,res_path
OS_CHDIR
;ld de,muzfilename
;call openstream_file
;ld a,7
;call setpg
;ld de,music
;ld hl,music_sz
;call readstream_file
;call closestream_file
ld hl,levelfilenames
loadlevels0
ld a,(hl) ;pg
inc hl
cp -1
jr z,loadlevels0q
or a
jr z,loadlevels0_nonewpg
push hl
ld h,tpgs/256
ld l,a
push hl
OS_NEWPAGE
pop hl
ld (hl),e
ld a,l
pop hl
loadlevels0_nonewpg
call setpg
ld e,(hl)
inc hl
ld d,(hl)
inc hl
push hl
push de ;addr
ex de,hl
call openstream_file
pop de
ld hl,0x4000
call readstream_file
call closestream_file
pop hl
xor a
ld b,a
ld c,a
cpir ;hl=after #0
jr loadlevels0
loadlevels0q
if !EGA
ld a,(user_scr1_high) ;ok
SETPG16K
ld a,PG_VIEW
call PAGE
ld hl,0xc000
ld de,0x4000
ld bc,0x4000
ldir
ld a,(user_scr0_high) ;ok
SETPG16K
call setpggfxc000
ld hl,0xc000
ld de,0x4000
ld bc,0x4000
ldir
call setpgcodec000
endif
;call PAGE_PG_VIEW
;ld hl,wasARROWS
;ld de,ARROWS
;ld bc,szARROWS
;ldir ;TODO recode for EGA
ld a,PGDAYNIGHT
call setpg
ld hl,0xc000
ld de,0xc000+(152*32/2)
ld bc,48*32/2
ldir
ld hl,0xc000+(200*32/2)
ld de,0xc000+(200*32/2)+(152*32/2)
ld bc,48*32/2
ldir
call changescrpg_current
;ld (curscrnum_int),a
xor a
call setpg
ld hl,prsprqwid
ld (0x0101),hl ;спрайты в файле подготовлены так, что выходят в 0x0100
jp MMENU
if RUS
varsfn
db "vars.bin",0
savefn
db "vera.ini",0
else
varsfn
db "varseng.bin",0
savefn
db "veraeng.ini",0
endif
align 256
tpgs
ds 64;256
include "palev.ast" ;verapalevening
include "palnight.ast" ;verapalnight
include "paldawn.ast" ;verapaldawn
include "palday.ast" ;verapalday
standardpal
STANDARDPAL
pal
ds 32,0xff
emptypal
ds 32,0xff
egaon
db 0 ;/1
quiter
if 1==0
halt
pgmuznum=$+1
ld a,0
SETPG32KHIGH
ld hl,muz
OS_SETMUSIC
halt
endif
call swapimer
im 1
call killmuz ;because we played music not by OS
QUIT
killmuz
ld a,0xfe
call shut1ay
ld a,0xff
shut1ay
ld bc,0xfffd
out (c),a
ld de,0x0e00
shutay0
dec d
ld b,0xff
out (c),d
ld b,0xbf
out (c),e
jr nz,shutay0
ret
redattr_killable2b
dw 0
if EGA
prtileega
;Печать тайла 2*2 знакоместа в теневом экране
;DE=адрес в теневом экране (D=2*Y+SHADSCR, E=2*X)
;HL=адрес тайла (0xc000,0xc020...)
;для EGA адрес надо умножить на 4
add hl,hl
add hl,hl
ld a,h
rlca
rlca
and 3
add a,PGTILES0
call setpg
ld a,h
or 0xc0
ld h,a
ex de,hl
res 6,h ;2*Y
ld a,l ;2*X
ld l,h
ld h,0
ld b,h
ld c,l ;hl=bc=2*Y
add hl,hl
add hl,hl
add hl,bc ;10*Y
add hl,hl
add hl,hl ;40*Y
add hl,hl
add hl,hl
add hl,hl
add hl,hl ;16*40*Y
add a,scrbase&0xff
ld c,a ;2*X
ld b,0x40
add hl,bc
call setpgsscr40008000_current ;shadow
ld bc,0x1008
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
ld a,55 ;"scf"
ld (wasdrawimg),a
jp primgega_onescreen_setpgsmain40008000
;jp primgega
;Печать блока 3*3 знакоместа на основном экране (FIXME - сейчас на обоих! вызывается в IM2)
;HL-адрес спрайта
;DE-адрес в экране (а не координаты в обычных знакоместах D-X, E-Y)
BLOCK33
ld a,PGICONS
call setpg
ex de,hl
;ld hl,0x4000+24 ;TODO
ld bc,0x180c
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
primgega
push bc
call setpgsscr40008000;_current ;visible
pop bc
push bc
push de
push hl
call primgega_onescreen
call setpgsscr40008000_current ;shadow
pop hl
pop de
pop bc
jp primgega_onescreen_setpgsmain40008000
endif
if 1;!EGA
setpggfxc000
pggfx=$+1
ld a,0
SETPG32KHIGH
ret
endif
setpgcodec000
pgcodec000=$+1
ld a,0
SETPG32KHIGH
ret
setcurscr1
call setcurscr0
jr setcurscr_change
;Черный экран, текущим делаем 0-й
BLACK
ld a,(user_scr0_high) ;ok
SETPG4000
LD HL,#4000
LD DE,#4001
LD BC,6911
LD (HL),L
LDIR
; LD A,16
;CURSCR LD (PG_+1),A
setcurscr0
ld a,(curscrnum)
or a
jr z,PAGE_PG_VIEW ;nz???
setcurscr_change
call changescrpg_current
ld (curscrnum_int),a
;ld e,a
;OS_SETSCREEN
PAGE_PG_VIEW
if EGA
LD A,PG_VIEW
else
push bc
ld a,(user_scr1_high) ;ok
SETPGC000
pop bc
ret
endif
;Драйвер переключения страниц для 128-го
;A-номер нужной страницы
PAGE
setpg
push bc
;and 0xe7
;cp 2
;jr z,$
;cp 5
;jr z,$
;ld ($+4),a
;ld a,(tpgs) ;так нереентерабельно нельзя, т.к. используется и в обработчике прерываний!
ld c,a
ld b,tpgs/256
ld a,(bc)
SETPGC000
pop bc
ret
; PUSH BC
; LD (NUMPAGE),A
;PG_ OR 16+8
; LD BC,#7FFD
; OUT (C),A
; POP BC
; RET
;NUMPAGE DB 0
setpgscr7
push bc
ld a,(user_scr1_high) ;ok
SETPGC000
pop bc
ret
if EGA
swapre
arroffega_scraddr2=$+1
ld de,0
ld hl,(arroffega_scraddr)
ld (arroffega_scraddr),de
ld (arroffega_scraddr2),hl
arroffega_bufaddr2=$+1
LD de,mouse_buf2
ld hl,(arroffega_bufaddr)
ld (arroffega_bufaddr),de
ld (arroffega_bufaddr2),hl
ret
endif
FMCNT2 DB SCMOD ;счетчик
;Буфер под курсором мышки
;(он один для основного экрана и теневого)
mouse_buf
if EGA
ds 16*16/2
mouse_buf2
ds 16*16/2
else
DS 48
endif
;Спрайт курсора
ARROW DS 64
;Адреса печатаемых тайлов в теневом экране
A_TILE DS 40*2 ;max 144*2
DB 0
reter
ret
setpgmain4000
ld a,(user_scr0_high) ;ok
SETPG4000
ret
setpgsmain40008000
;pgmain4000=$+1
;ld a,0
ld a,(user_scr0_high) ;ok
SETPG4000
pgcode8000=$+1
ld a,0
SETPG8000
ret
setpgscr4000;_current
call getuser_scr_high_cur
SETPG4000
ret
setpgscr4000_scr2
call getuser_scr_high
SETPG4000
ret
setpgsscr40008000;_current
call getuser_scr_low_cur
SETPG4000
call getuser_scr_high_cur
SETPG8000
ret
setpgsscr40008000_current
call getuser_scr_low
SETPG4000
call getuser_scr_high
SETPG8000
ret
setpgc000_shadowscr
call getuser_scr_high
SETPGC000
ret
setpgc000_curscr
call getuser_scr_high_cur
SETPGC000
ret
getuser_scr_low
getuser_scr_low_patch=$+1
getuser_scr_low_patchN=0xff&(user_scr0_low^user_scr1_low)
ld a,(user_scr1_low) ;ok
ret
getuser_scr_high
getuser_scr_high_patch=$+1
getuser_scr_high_patchN=0xff&(user_scr0_high^user_scr1_high)
ld a,(user_scr1_high) ;ok
ret
getuser_scr_low_cur
getuser_scr_low_cur_patch=$+1
getuser_scr_low_cur_patchN=0xff&(user_scr0_low^user_scr1_low)
ld a,(user_scr0_low) ;ok
ret
getuser_scr_high_cur
getuser_scr_high_cur_patch=$+1
getuser_scr_high_cur_patchN=0xff&(user_scr0_high^user_scr1_high)
ld a,(user_scr0_high) ;ok
ret
changescrpg_current
ld hl,getuser_scr_low_patch
ld a,(hl)
xor getuser_scr_low_patchN
ld (hl),a
ld hl,getuser_scr_high_patch
ld a,(hl)
xor getuser_scr_high_patchN
ld (hl),a
ld hl,getuser_scr_low_cur_patch
ld a,(hl)
xor getuser_scr_low_cur_patchN
ld (hl),a
ld hl,getuser_scr_high_cur_patch
ld a,(hl)
xor getuser_scr_high_cur_patchN
ld (hl),a
ld a,1
curscrnum=$+1
xor 0
ld ($-1),a
ret
if 1==0
changescrpg
call changescrpg_current
ld (curscrnum_int),a
ret
endif
primgega_pgdaynight
ld a,PGDAYNIGHT
jr primgega_pga
primgega_pghud
ld a,PGHUD
primgega_pga
;a=pg
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
push bc
push de
push hl
push af
ld a,55
ld (im_arroff),a
call ARROFF
pop af
ld (primgega_pg),a
;ld a,PGHUD
call setpg
call setpgsscr40008000;_current ;visible
pop hl
pop de
pop bc
push bc
push de
push hl
call primgega_onescreen
call ARRON
ld a,55+128 ;"or a"
ld (im_arroff),a
primgega_pg=$+1
ld a,PGHUD
call setpg
call setpgsscr40008000_current ;shadow
pop hl
pop de
pop bc
ld a,55 ;"scf"
ld (wasdrawimg),a
primgega_onescreen_setpgsmain40008000
call primgega_onescreen
jp setpgsmain40008000
primgega_onescreen
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
;call from DAY_NGT
primgega0
push bc
ld hx,b
push hl
ld bc,40
primgegacolumn0
ld a,(de)
inc de
ld (hl),a
add hl,bc
dec hx
jr nz,primgegacolumn0
pop hl
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,primgegacolumn0q ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
primgegacolumn0q
pop bc
dec c
jr nz,primgega0
ret
getimgega_onescreen
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
;call from DAY_NGT
getimgega0
push bc
ld hx,b
push hl
ld bc,40
getimgegacolumn0
ld a,(hl)
ld (de),a
inc de
add hl,bc
dec hx
jr nz,getimgegacolumn0
pop hl
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,getimgegacolumn0q ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
getimgegacolumn0q
pop bc
dec c
jr nz,getimgega0
ret
climgega
;in IM2
;ld a,55 ;"scf"
;ld (wasdrawimg),a
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
climgega_onescreen
;b=hgt,c=wid (/2)
;e=gfx byte
;hl=scr
climgega0
push bc
ld hx,b
push hl
ld a,e
ld bc,40
climgegacolumn0
ld (hl),a
add hl,bc
dec hx
jr nz,climgegacolumn0
pop hl
ld a,0x9f;0xa0
cp h
ld bc,0x4000
adc hl,bc
jp pe,climgegacolumn0q ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
inc a
xor h
ld h,a
climgegacolumn0q
pop bc
dec c
jr nz,climgega0
;call setpgcodec000
jp setpgsmain40008000
clsega
call changescrpg_current
call clsega_onescreen
call changescrpg_current
clsega_onescreen
call setpgsscr40008000
ld hl,0x4000
ld de,0x4001
ld bc,0x7fff
ld (hl),l;0
ldir
jp setpgsmain40008000
;Работа меню при IM2
IM2MEN
LD HL,IM2MC
INC (HL)
LD A,(HL)
CP VIDSPD
JR NZ,IM2M1
LD E,0
;подкл. невидим. стр.
;LD A,(PG_+1)
;BIT 3,A
;LD A,7
;JR Z,$+4
;LD A,5
;PUSH AF
;CALL PAGE
call setpgc000_shadowscr
LD HL,(VIDEO_SP)
LD (MMENU2_1),HL
CALL VIDEO_2
LD HL,mouse_buf
LD DE,A_TILE
LD BC,48
LDIR
LD HL,(ARRTO+1)
LD (MMN2+1),HL
;невид. делаем видимой
;POP AF
;CALL PAGE
call setpgc000_shadowscr ;???
;LD A,(PG_+1)
;XOR 8
;LD (PG_+1),A
call changescrpg_current
ld (curscrnum_int),a
ld e,a
OS_SETSCREEN
JR IM2M2
IM2M1
;подкл. видим. стр.
;LD A,(PG_+1)
;BIT 3,A
;LD A,5
;JR Z,$+4
;LD A,7
;CALL PAGE
call setpgc000_curscr
CALL ARROFF
IM2M2 CALL ARRON
JP MUS
MMENU2
MMENU2_1=$+1
LD HL,VIDEOS
LD A,0 ;счетчик фреймов
IM2MC EQU $-1
CP VIDSPD+1
RET NZ
XOR A
LD (IM2MC),A
LD (VIDEO_SP),HL
;LD A,(PG_+1)
;BIT 3,A ;подкл. невидим. стр.
;LD A,7
;JR Z,$+4
;LD A,5
;CALL PAGE
call setpgc000_shadowscr
LD IX,A_TILE
MMN2 LD HL,0
CALL ARRTO+3
;Вывод 1 кадра видео
VIDEO
LD E,1
VIDEO_2
LD (VIDSP+1),SP
VIDEO_SP=$+1
VID1m2=$+1
LD SP,VIDEOS
jp VID1go
VID1
LD (HL),C ;иначе может запороть 0x01xx
VID1go
POP HL
;Если процедуру вызывать не внутри
;прерывания, то POP HL нужно заменить на
;POP BC:LD H,B:LD L,C
POP BC ;1 знакоместо
LD (HL),C
INC H
LD (HL),B
INC H
POP BC
LD (HL),C
INC H
LD (HL),B
INC H
POP BC
LD (HL),C
INC H
LD (HL),B
INC H
POP BC
LD (HL),C
INC H
LD (HL),B
POP BC ;атрибут
LD H,B
;LD (HL),C
DJNZ VID1
LD (VIDEO_SP),SP
VIDSP LD SP,0
VID2_1=$+1
LD A,0 ;счетч. кадров
ADD A,E
CP 5 ;кол-во кадров
JR C,VID4
VID3 XOR A
LD HL,VIDEOS
LD (VIDEO_SP),HL
VID4 LD (VID2_1),A
RET
;клавиши "1,2,3,4,5"
DIGKp1
db 0
KEYSp1
db 0
;клавиши мыши+колесо
MKEYSp1
db 0
include "int.asm"
include "prspr.asm"
include "saveload.asm" ;Загрузка/запись состояния игры
include "IM2.asm"
INCLUDE "PRINT.asm" ;печать спрайтов, текста и т.п.
INCLUDE "TALK.asm" ;Обслуживание диалогов
include "talktext.asm"
;Начало сохраняемых переменных
VARS INCLUDE "VARS.asm" ;реально они будут сюда распаковываться
ENDVARS
LEN_S EQU (256*6)-(ENDVARS-VARS)
display "VARS=",VARS
display "LEN_S=",LEN_S
daynightphase
db 0
if EGA
gamemenucolorline;=#DAD9
ds 6
else
gamemenucolorline=#DAD9
endif
if EGA
NEV1
xor d
NEV2
xor h
NEV3
xor l ;если в этих ячейках 0 - рисовать только силуэт
endif
DS LEN_S;-3 ;добираем до 6-ти секторов
endvars
ABOT
;DISP #4000
include "about.asm"
; ENT
;LENPR EQU $-ABOT
;DISPLAY "ABOUT=",ABOT,LENPR
display "=",$
res_path
db "vera",0
levelfilenames
db 0
dw SPR;0xc000
db "0_page.bin",0
db 1
;dw DNPK
dw 0xc000;DNPK
mapfn
if RUS
db "1_page.bin",0
else
db "1_pageng.bin",0
endif
db 3
dw 0xc000
if RUS
db "3_page.bin",0
else
db "3_pageng.bin",0
endif
db 4
dw 0xc000
db "4_page.bin",0
db 6
dw 0xc000
db "6_page.bin",0
db 7
dw 0xdb00
db "7_page.bin",0
db PGTILES0;8
dw 0xc000
db "tiles0.bin",0
db PGTILES1;9
dw 0xc000
db "tiles1.bin",0
db PGTILES2;10
dw 0xc000
db "tiles2.bin",0
db PGTILES3;11
dw 0xc000
db "tiles3.bin",0
db PGICONS;12
dw 0xc000
db "icons.bin",0
db PGSPRITES0;13
dw 0xc000
db "sprites0.bin",0
db PGSPRITES1;14
dw 0xc000
db "sprites1.bin",0
db PGSPRTRAN0;15
dw 0xc000
db "sprtran0.bin",0
db PGSPRTRAN1;16
dw 0xc000
db "sprtran1.bin",0
db PGHUD;17
dw 0xc000
db "hud.bin",0
hudmsg=0xc000+6144
db PGDAYNIGHT;18
dw 0xc000
db "daynight.bin",0
db -1
include "../../_sdk/file.asm"
ARROWS
INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
; ds szARROWS
REZULT ds 192 ;EQU #5802 ;буфер 192 б для маски дня и ночи
;в оригинале экран #4000 - линейный буфер
display "-----",$
;=============================================================
;=================== 0x6000+
ds 0x8000-$;IM2-1536-$;ORG IM2-1536
;INCLUDE "IM2.asm"
;IMVEC EQU ($/256+1)*256;вектор вторых прерываний
;START EQU IMVEC+257 ;старт основной программы
;Основная программа
GAME
LD HL,MUS
LD (IM2Nm2),HL ;иначе хочет рисовать видео
LD HL,1
LD (SPN+1),HL
if SETIM2_TWICE
CALL SETIM2
endif
if !EGA
CALL BLACK
endif
CALL EXCH ;было обменяно 9000<->c000 на время меню
;LD HL,MUSNUM
;DEC (HL) ;???
NEW_OLDp1=$+1
LD A,0
AND A
PUSH AF
JR NZ,OLD
LD A,PG_MUZ
CALL PAGE
;LD HL,VARSPK
;LD DE,VARS
;CALL DEHRUST ;теперь грузим в GAMEOVER_MMENU
LD DE,#4000
PUSH DE,DE
if 1==0
LD A,PG_MISC
CALL PAGE
ld hl,#c000
PUSH DE
LD BC,KSCR-MAPMAS
LDIR
POP HL
LD DE,#C000
LD A,PG_MAP
CALL PAGE
CALL DEHRUST
else
LD A,PG_MAP
CALL PAGE
endif
POP DE
LD HL,DNPK
CALL DEHRUST
;LD A,PG_VIEW
CALL PAGE_PG_VIEW
POP HL
LD DE,NG
LD BC,608
LDIR
OLD LD A,PG_MAP
CALL PAGE
CALL INIGAME
LD (FLASH+1),A ;A<>0
if EGA
ld a,255 ;нет стрелки
ld (curarrowtype),a
ld de,emptypal
OS_SETPAL
ld e,0+0x80 ;EGA+keep
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
ld a,1
ld (egaon),a
call clsega ;обработчик прерывания уже порывается рисовать стрелочку!
;ld de,verapalevening
;ld de,verapalnight
;ld de,verapaldawn
ld de,verapalday
OS_SETPAL
endif
;LD A,PG_VIEW
CALL PAGE_PG_VIEW
if !EGA
LD HL,VIEW
CALL LC5 ;распак. игр. экран
endif
LD A,(KARM)
CALL MSK
if EGA
;draw HUD
;ld a,PGHUD
;call setpg
ld bc,0xc020
ld de,0xc000
ld hl,scrbase+24
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call primgega_pghud
;jr $
;else
endif
CALL FONE
CALL PRMAP ;Печать видимой части карты на теневом экр.
CALL MOVE ;Обновл. основн. экрана
LD A,R
LD (RND+1),A
CALL MUSNXT
LD HL,IM2N
LD (IM2Nm2),HL
if !EGA
;LD A,16+8
;CALL CURSCR
call setcurscr1
endif
POP AF ;NEW_OLDp1
LD A,1
CALL Z,TALK
;Основной цикл
MAPING
if EGA
ld a,55
ld (im_swapscr),a
endif
MAPINGwait
HALT
MAPINGp2=$+1
LD A,0 ;timer
MAPINGp4=$+1
CP FRAME
JR C,MAPINGwait
XOR A
LD (MAPINGp2),A
MAPS CALL MOVE ;Обновл. основн. экрана
CALL PRMAP ;Печать видимой части карты на теневом экр.
SPDHERO LD A,SPD_HERO
DEC A
LD (SPDHERO+1),A
JR NZ,CrdHero
SPH LD A,SPD_HERO
LD (SPDHERO+1),A
RunHero LD A,0 ;Перемещается ли герой?
AND A
CALL NZ,RUNING
CrdHero LD DE,0 ;Текущие координаты героя в пикселях
;D-Y, E-X
SprHero LD HL,hero ;Текущий спрайт героя
LD A,PG_HERO
CALL PAGE
CLR_MAPm2=$+1
CALL HERO ;/HERO2 ;Печать героя на теневом экране
CLR_MAPp1=$+1
LD A,0
DEC A
CALL Z,CLMAP ;восстанавливаем карту после заливки (поиска маршрута)
MAINLOOP
LD HL,(mouse_crd)
CALL CALC
;KEYS
LD A,(KEYSp1)
BIT 5,A
JP NZ,STEAL ;скрытый режим (SS+CS)
BIT 7,A
CALL NZ,TLKNG ;листание диалога (Enter)
CALL MOVMAP
LD A,(DIGKp1) ;клавиши "1,2,3,4,5"
CP 31
JR NZ,CHG
XOR A
LD (CHANGE),A
CHG CALL NZ,CHANGE
LD A,PG_MAP
CALL PAGE
LD A,#FE ;"C"
IN A,(#FE)
BIT 3,A
CALL Z,CENTR ;герой по центру
;клавиши мыши+колесо
MKEYS
LD A,(MKEYSp1)
MKEYSp2
LD H,28
RLA
PUSH AF
CALL C,VLIST ;DWN
DEC H
POP AF
RLA
PUSH AF
CALL C,VLIST ;UP
POP AF
RLA
PUSH AF
CALL C,VUSE1 ;правая клавиша
POP AF
RLA
CALL C,FIRE ;левая клавиша
MKY ;LD A,PG_VIEW
CALL PAGE_PG_VIEW
;идет ли диалог?
CALL SCRLMAP
DIALOG LD A,0
DEC A
JP Z,CURS1
;Работа с мешком
LD HL,(mouse_crd) ;H-X,L-Y
CALL BOX ;Выделение кнопки меню
CALL VMESH
JP NZ,CCURS
;Скролл игр.экрана при подведении
;курсора к границам экрана
LD BC,#0000
LD D,B
LD E,B
;влево
; LD BC,#00FF
; LD DE,#0010
LD A,H ;X
AND A
JR NZ,SR
DEC C ;-1
LD E,16
;вправо
; LD BC,#0001
; LD DE,#00F0
SR CP MAX_X ;240
JR C,SD
LD C,1
LD E,-16
;вниз
; LD BC,#0100
; LD DE,#F000
SD LD A,L ;Y
CP MAX_Y
JR C,SU
INC B ;1
LD D,-16
;вверх
; LD BC,#FF00
; LD DE,#1000
SU AND A
JR NZ,SRUN
LD B,-1
LD D,16
SRUN LD A,B
OR C
JP Z,CCURS ;экран не двигаем
LD A,2 ;курсор скролла карты
;В зависимости от того в какую сторону
;тянем курсор, изменяем смещение карты и коорд. героя
;Проверка на границы карты при скролле
;проверка срабатывает и на 0
;т.к. при уменьшении 0 получаем 255
SCROLL
EXA
LD HL,(DispMapX) ;H-Y, L-X
LD A,H
ADD A,B
CP 64-(SCRHG/2-1)
JR C,SL1 ;не вышли за пределы карты
LD B,0
LD D,B
LD A,H
SL1 LD H,A
LD A,L
ADD A,C
CP 64-(SCRWD/2-1)
JR C,SL2
LD C,0
LD E,C
LD A,L
SL2 LD L,A
PUSH HL
LD HL,(CrdHero+1)
LD A,H
ADD A,D
LD H,A
LD A,L
ADD A,E
LD L,A
POP DE
EX DE,HL
;Флаг - может ли герой уходить из поля видимости
;1-может,0-нет
MODscrl LD A,0
if FREESCROLL
ld a,1
endif
AND A
JR NZ,NOBOUND
;Проверка на выход героя из поля видимости
;при скролле карты
LD A,(HEROCRD+1) ;Y героя
DEC A
SUB H
JR C,NOSCRL1
CP SCRHG/2-1
JR C,K4
BIT 7,B
JR Z,K4
LD B,0
NOSCRL1 BIT 7,B
JR NZ,K4
LD B,0
K4 LD A,(HEROCRD) ;X героя
SUB L
JR C,NOSCRL2
CP SCRWD/2
JR C,K3
BIT 7,C
JR Z,K3
LD C,0
NOSCRL2 BIT 7,C
JR NZ,K3
LD C,0
K3 LD A,C
OR B
JR Z,CURSR ;не двигаем экран
LD A,B
AND A
JR NZ,K5
LD A,(DispMapX+1) ;Y
LD H,A
LD A,(CrdHero+2)
LD D,A
K5 LD A,C
AND A
JR NZ,NOBOUND
LD A,(DispMapX) ;X
LD L,A
LD A,(CrdHero+1)
LD E,A
NOBOUND
LD (DispMapX),HL ;H-Y, L-X
LD (CrdHero+1),DE
if EGA
ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
else
XOR A
endif
LD (MAPFLAG+1),A ;обновить весь экран
EXA
CP 2
JR Z,CURS1p1
CURSR CALL SCRLMAP
JR C,CURS1
CCURS LD A,0 ;Текущий курсор
LD B,A
LD A,(F3+1) ;В мешке ли курсор?
AND A
LD A,(KARM)
JR Z,CURS0 ;Нет
LD B,6 ;курсор руки
CURS0 AND A
JR NZ,CURS1p1
LD A,(UNDER+1)
AND A
LD A,6 ;рука (берем предмет)
JR NZ,CURS1p1
CURS01 LD A,(DISTP)
AND A
JR Z,CURS1
LD B,5 ;курсор диалога
CURS1 LD A,B
CURS1p1
CALL MASK ;Делаем новый спрайт курсора, если нужно
CALL FTASK
;Конец игры
END_G_1=$+1
LD A,1
DEC A
JP NZ,ENDGAME
;jp ENDGAME
CALL DAY_NGT
CALL VOLCH ;плавное -/+ громкости мелодии
REMAP LD A,0 ;для принудительного обновления экрана
DEC A
JP NZ,MAPING
LD (REMAP+1),A
if EGA
ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
endif
LD (MAPFLAG+1),A
JP MAPING
;Главное меню игры (мельница)
GAMEOVER_MMENU
ld hl,gamemenucolorline
ld (hl),0 ;кнопка меню не активна
call SETIM1 ;чтобы не включать 2 раза SETIM2
if EGA
ld de,emptypal
OS_SETPAL
ld de,varsfn
OS_OPENHANDLE
push bc
ld de,VARS
LD hl,0x600
OS_READHANDLE
pop bc ;b=handle
OS_CLOSEHANDLE
ld a,PG_MAP
call setpg
ld de,mapfn
OS_OPENHANDLE
push bc
ld de,0xc000
LD hl,0x4000
OS_READHANDLE
pop bc ;b=handle
OS_CLOSEHANDLE
xor a
ld (curscrnum_int),a
ld e,a
OS_SETSCREEN
ld e,3+0x80 ;6912+keep
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
call BLACK
ld de,standardpal
OS_SETPAL
xor a
ld (egaon),a
endif
MMENU
DI
; LD (backsp+1),SP
LD SP,GAMESTACK;#5FFF
LD HL,MUS
LD (IM2Nm2),HL
CALL INIMOUS ;инициализация мышки
CALL BLACK
LD A,255
CALL MUSNXT+3
CALL SETIM2 ;по второму разу не делать!!!
CALL EXCH ;обмен 9000<->c000
LD A,PG_HERO
CALL PAGE
LD HL,VIDS
LD DE,VIDEOS
CALL DEHRUST ;в 9000
SKPMN
CALL VID3 ;инициализация видео?
LD (MMENU2_1),HL
LD (IM2MC),A ;время кадра видео
DEC A
LD (MCM+1),A
call setpgscr4000
LD A,PG_MISC
CALL PAGE
LD HL,KSCR
LD DE,#4000
PUSH DE,DE
LD BC,3673
LDIR
;LD A,PG_VIEW
CALL PAGE_PG_VIEW
;call setpgscr7
;call setpgc000_shadowscr
POP HL
CALL LC5
if EGA
;ld a,(tpgs+PG_VIEW)
;SETPG4000
call setpgscr4000_scr2
ld hl,0xc000
ld de,0x4000
ld bc,6912
ldir
call setpgscr4000
endif
HALT
DI
LD B,5
MMLP PUSH BC
CALL VIDEO
POP BC
DJNZ MMLP
EI
LD HL,#C000
POP DE
LD BC,6912
LDIR
call setpgmain4000
XOR A
CALL MSK
CALL ARRON
;LD A,16+8
MMENUS ;CALL CURSCR
call setcurscr1
LD HL,IM2MEN
LD (IM2Nm2),HL
LD IX,MNKEYS2
LD DE,#0905
LD HL,#5878
LD BC,#0B15
LD A,E
CALL MCYCL ;цикл работы меню, выход по enter
LD HL,NEW_OLDp1
DEC C
LD (HL),C
JP Z,GAME ;новая игра
DEC C
JR Z,OGM ;старая игра
DEC C
JR Z,ABOUT;об игре
DEC C,C
JP Z,EXIT
ABOUT
PUSH BC
LD HL,MUS
LD (IM2Nm2),HL
;LD A,16+8
;CALL CURSCR
call setcurscr1
;LD A,PG_MISC
;CALL PAGE
;LD HL,ABOUTS
;LD DE,#4000
;CALL DEHRUST
POP BC
LD D,1
CALL PRINTER;#4000
CALL BLACK
JP SKPMN
OGM ;CALL SETIM1
JP LOAD ;-> GAME
;На строку ниже в экранном файле
LINE_HL INC H
LD A,H
AND 7
RET NZ
LD A,L
ADD A,32
LD L,A
RET C
LD A,H
SUB 8
LD H,A
RET
DIV32 SRL H,L
DIV16 SRL H,L
DIV8 SRL H
SRL H
SRL H
SRL L
SRL L
SRL L
RET
;Установка вектрора IM2
if INT_IM2
SETIM2
DI
LD HL,IMVEC ;адрес вектора прерываний
LD BC,256
LD D,H
LD E,B
LD (HL),IM2/256
LD A,H
LDIR
LD I,A
IM 2
EI
RET
else
SETIM2=swapimer
endif
SETIM1
DI
;LD A,(PG_+1)
;LD (SCRNUM+1),A ;???
LD A,PG_MUZ
CALL PAGE
CALL MUTE
;LD A,16+8
;CALL CURSCR
call setcurscr1
LD A,PG_MISC
CALL PAGE
if INT_IM2
LD IY,23610
LD A,63
LD I,A
IM 1
else
call swapimer
endif
EI
;LD HL,LODSAV
;LD DE,LOAD
;LD BC,LENLS
;LDIR
RET
;Игровое меню
GMEN
if EGA
LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
CP 56+64
RET NZ
xor a
ld (curarrowtype),a
LD HL,SND_SPK
LD (SAMPLE+1),HL
POP HL ;для коррекции SP
POP HL
ld bc,0x0834
ld de,hudmenuofft
ld hl,scrbase+(5*8*40)+6
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call primgega_pgdaynight
ld de,hudmenuoff0
ld hl,scrbase+(6*8*40)+6
ld bc,0x1834
call primgega_pgdaynight
ld de,hudmenu0
ld hl,scrbase+(6*8*40)+7
ld bc,0x182c
call primgega_pgdaynight
ld de,hudmenuoff1
ld hl,scrbase+(9*8*40)+6
ld bc,0x1834
call primgega_pgdaynight
ld de,hudmenuoff2
ld hl,scrbase+(12*8*40)+6
ld bc,0x1834
call primgega_pgdaynight
ld bc,0x1034
ld de,hudmenuoffb
ld hl,scrbase+(15*8*40)+6
call primgega_pgdaynight
else
; LD A,PG_VIEW
CALL PAGE_PG_VIEW
LD A,(gamemenucolorline);(#DAD9) ;где-то в атрибутах
CP 56+64
RET NZ
LD HL,SND_SPK
LD (SAMPLE+1),HL
POP HL ;для коррекции SP
POP HL
XOR A
CALL MASK
;Вывод меню
LD HL,SPRMENU
LD DE,#C0A6
LD A,12*8 ;высота
MN2 EX AF,AF' ;'
PUSH DE
LD C,13 ;ширина
LDI
JP PE,$-2
POP DE
EX DE,HL
CALL LINE_HL
EX DE,HL
EX AF,AF' ;'
DEC A
JR NZ,MN2
;Раскрашивание
LD HL,#D8A6
LD E,12
LD A,FILAT
LD C,19
FIL LD B,13
LD (HL),A
INC L
DJNZ $-2
ADD HL,BC
DEC E
JR NZ,FIL
LD A,#68
LD H,A
LD L,A
LD (#D8A6),HL
LD (#D8B1),HL
LD (#DA0B),HL
LD (#DA0D),A
LD (#DA06),A
LD (#DA12),A
endif
XOR A
LD (MCM+1),A
LD IX,MNKEYS ;структура выделения пунктов
LD DE,#0B04
LD HL,FILAT2+(FILAT*256)
LD BC,#0B15
LD A,3
CALL MCYCL
DEC C
JR Z,GAM
DEC C
JP NZ,GAMEOVER_MMENU
SAV ;CALL SETIM1
JP SAVE
if 1==0
ERROR
CALL ERR
;LD A,PG_VIEW
CALL PAGE_PG_VIEW
LD HL,#D800
LD DE,#5800
LD BC,768
LDIR
CALL SETIM2
;SCRNUM LD A,0
JP MMENUS
ERROR2
CALL ERR
endif
SAVE_OK ;CALL SETIM2
; LD A,PG_VIEW
CALL PAGE_PG_VIEW
GAM CALL FONE
XOR A
LD H,A
LD L,A
CALL BOX ;Выделение кнопки меню
JP REMAP+6
;Работа в меню
;OUT: C-номер выбранного пункта меню (1-X)
MCYCL
;a=количество пунктов
;l=атрибут кнопки
;h=атрибут окна
;b=ширина пункта
;c=приращение для перехода на следующую строку
LD (MENLP-1),A ;кол-во пунктов
LD (SCANMOD+1),A
LD A,L
LD (MN_V1+1),A ;атриб. кнопки
LD A,H
LD (MN_V2+1),A ;атриб. окна
LD A,B
LD (MN_V3+1),A ;ширина пункта
LD A,C
LD (MN_V4+1),A ;приращение
if EGA
xor a ;несуществующий пункт
ld (oldmenuoption),a
endif
LD A,1
LD (SETCURp1),A ;текущий пункт меню - верхний
;Цикл опроса кнопок
MNLOOP PUSH IX,IX,DE
HALT
MCM LD A,0
AND A
DI
CALL NZ,MMENU2 ;show anim and arrow
EI
POP DE,IX
CALL PUNKT
if EGA
ld hl,(egaon)
dec l
jr nz,MNLOOPnoega
oldmenuoption=$+1
cp 0 ;бывший текущий пункт меню
jr z,MNLOOPnodraw ;не перерисовывать, если текущий пункт не менялся
ld (oldmenuoption),a
MNLOOPnoega
endif
EXA
LD C,1
LD A,3 ;кол-во пунктов в меню
MENLP EXA
SUB 3
CALL MNLOCK
INC C
EXA
DEC A
JR NZ,MENLP
MNLOOPnodraw
POP IX
DEC C
LD HL,MKEYSp1
LD A,(HL)
AND %00010000
LD B,A
LD A,(HL)
AND %11000000 ;колесо мышки
BIT 5,(HL) ;правую клавишу мышки
JR Z,$+3 ;делаем аналогом
SCF ;ENTER
RRA
OR B
LD B,A
LD A,(KEYSp1)
AND %11100000
OR B
LD (HL),0
ADD A,A ;7-й бит (ENTER)
JR C,FIR_K
LD B,1
ADD A,A ;6-й вниз
JR C,CDWN
ADD A,A ;5-й вверх
JR C,CDWN-3
ADD A,A ;4-й огонь
JR C,FIR_M
LD A,FRM
JR CDU
LD BC,#FF01
;Вверх/вниз по меню
CDWN LD A,FRM
DEC A
JR Z,CDWUP
CDU CP FRM-1
LD (CDWN+1),A
JR NZ,MNLOOP
CDWUP LD HL,SETCURp1
LD A,(HL)
CP C
JR Z,MNLOOP
ADD A,B
LD (HL),A
JR MNLOOP
;OUT: B-текущий пункт
; CY-курсор не на пункте
; NC-на пункте
PUNKT
LD HL,(mouse_crd)
CALL DIV8
LD A,H ;X
SUB 7
CP D ;D=ширина области
JP NC,SETCUR
PN1 LD BC,0
LD (PN1+1),HL
XOR A
SBC HL,BC
JP Z,SETCUR
ADD HL,BC
LD A,L ;Y
SUB E
JP DIV3
;Нажали огонь в меню мышкой/курсором
FIR_M ;XOR A
;LD (HL),A
LD (PN1+1),HL ;специально принуждаем неравенство
;jr $
CALL PUNKT ;OUT: B-текущий пункт
JP C,MNLOOP ;если курсор не на пункте меню, то MNLOOP
LD A,(SETCURp1)
CP B
JP NZ,MNLOOP
;Кнопка выбрана (Enter)
FIR_K LD HL,SND_NXT
LD (SAMPLE+1),HL
LD A,(SETCURp1)
LD C,A
XOR A
LD (SCANMOD+1),A
RET
;Выделение пунктов
MNLOCK
PUSH AF
PUSH BC
PUSH DE
PUSH IX
MN_V2 LD B,FILAT ;атриб. невыделенного пункта
JR NZ,MN_V1_ok
LD A,C
LD (SETCURp1),A ;текущий пункт меню - выделенный рисуемый
MN_V1 LD B,FILAT2 ;атриб. выделения
MN_V1_ok
if EGA
ld a,(egaon)
rrca
jr nc,MN_noega;MNEND
ld a,b
cp FILAT ;атриб. невыделенного пункта
jr z,MN_unselect
ld de,hudmenu2
ld hl,scrbase+(12*8*40)+7
dec c
jr nz,$+5+3
ld de,hudmenu0
ld hl,scrbase+(6*8*40)+7
dec c
jr nz,$+5+3
ld de,hudmenu1
ld hl,scrbase+(9*8*40)+7
ld bc,0x182c
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call primgega_pgdaynight
jr MNEND
MN_unselect
ld de,hudmenuoff2
ld hl,scrbase+(12*8*40)+6
dec c
jr nz,$+5+3
ld de,hudmenuoff0
ld hl,scrbase+(6*8*40)+6
dec c
jr nz,$+5+3
ld de,hudmenuoff1
ld hl,scrbase+(9*8*40)+6
ld bc,0x1834
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call primgega_pgdaynight
jr MNEND
MN_noega
endif
LD E,(IX)
LD D,(IX+1)
LD A,(DE) ;если кнопка уже выкрашена, то не красим
CP B
JR Z,MNEND
LD A,B
LD C,3 ;высота строки выделения
MNLP0 LD H,(IX+2)
LD L,(IX+3)
MN_V3 LD B,11
MNLP1 ADD HL,HL
JR NC,MNLP
LD (DE),A
MNLP INC DE
DJNZ MNLP1
MN_V4 LD HL,21
ADD HL,DE
EX DE,HL
INC IX,IX
DEC C
JR NZ,MNLP0
MNEND POP IX
LD BC,8
ADD IX,BC
POP DE
POP BC
POP AF
RET
;Выделение кнопки меню
BOX
PUSH HL
CALL DIV8
LD BC,#0638
LD A,L
CP 22
JR NZ,BX1
LD A,H
CP 25
JR C,BX1
LD C,56+64
BX1
LD HL,gamemenucolorline;#DAD9
LD A,(HL)
CP C
JR Z,BX2
LD (HL),C
INC L
DJNZ $-2
if EGA
;ld a,(egaon)
;or a
;ret nz ;TODO?
ld a,c
cp 56+64
ld de,menuline0
jr nz,$+5
ld de,menuline1
ld hl,scrbase+(176*40)+25
ld bc,0x0818
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
call primgega_pghud
endif
BX2 POP HL
RET
MNKEYS DW #D8C7
DB %11100001,%10000000
DB %11111111,%11100000
DB %11000000,%01100000
DW #D927
DB %11000001,0
DB %11111111,%11100000
DB %00110000,%11100000
DW #D987
DB %11100001,0
DB %11111111,%11100000
DB %00010000,%11100000
MNKEYS2
DW #D8E8
DB %11101100,0
DB %11111111,0
DB %00110010,0
DW #D947
DB %11000110,0
DB %11111111,128
DB %00111001,0
DW #D9A8
DB %11111000,0
DB %11111110,0
DB %00000100,0
DW #DA07
DB %11111100,0
DB %11111111,#C0
DB %00000011,0
DW #DA6A
DB %10011000,0
DB %11111000,0,0,0
;Конец игры
ENDGAME
if EGA
ld e,3+0x80 ;6912+keep
OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
ld de,emptypal;standardpal
OS_SETPAL
xor a
ld (egaon),a
inc a
ld (curscrnum_int),a
ld e,a
OS_SETSCREEN
endif
DI
LD A,PG_MUZ
CALL PAGE
CALL MUTE
; CALL BLACK
xor a
ld (MUSONp1),a ;fix (Sergio)
LD A,PG_MISC
CALL PAGE
LD HL,FINAL
LD DE,#4000
PUSH DE
LD BC,FINLEN
LDIR
RET
;Выход в ассемблер/Бейсик
EXIT
EI
HALT
DI
call swapimer
;LD A,16
;LD (PG_+1),A ;???
LD A,PG_MUZ
CALL PAGE
CALL MUTE
IM 1
EI
ld hl,0 ;result
QUIT
;Герой перемещается по карте.
;Устанавливаем в какую сторону.
RUNING
JR COUNT1 ;JR ROTATE команды меняются когда идет поворот
COUNT1 LD A,0 ;счетчик шагов героя
INC A
CP 4
JR C,RH1
XOR A
RH1 LD (COUNT1+1),A
EX AF,AF' ;'
VUS LD A,0
AND A
JP NZ,VUSE3 ;вещи
COUNT2 LD A,0 ;еще счетчик полного перемещения
;из одной клетки в другую (он=16 т.к. карта
;построена из клеток 2*2 знакоместа)
INC A
CP 16/STEPS
JR C,RH2
XOR A
RH2 LD (COUNT2+1),A
CALL Z,NxtStep
LD HL,(CrdHero+1) ;H-Y, L-X
NAPRAVL LD BC,0 ;приращение по направлению
LD A,H
DUP STEPS
SUB B ;изменение координат на опред. кол-во пикселей
EDUP
LD H,A
LD A,L ;Расчет новых координат
DUP STEPS
SUB C ;в зависимости
EDUP
LD L,A ;от направления движения героя
LD (CrdHero+1),HL ;H-Y, L-X
;Из группы одного направления героя (напрвлений всего 8)
;выбираем 1 из 4 спрайтов в зависимости от 1-го счетчика шагов
SPRHERO LD HL,Right
INC HL
EX AF,AF' ;'
ADD A,A
LD C,A
LD B,0
ADD HL,BC
SH1 LD C,(HL) ;BC=адрес нужного спрайта
INC HL
LD B,(HL)
LD (SprHero+1),BC
RET
;Поворот героя, т.е. смена его направления
ROTATE LD A,2 ;Из какого направления, сначала Вера стоит вправо
Prev LD B,2 ;в какое направление нужно придти
RotMod NOP ;в какую сторону вертимся (INC A/DEC A)
CP 255
JR NZ,R1
LD A,7
R1 CP 8
JR C,R2
XOR A
R2 LD (ROTATE+1),A
CP B
LD B,A
JR NZ,R3
XOR A ;Если предыд. значение направления
LD (RUNING+1),A ;и настоящее стали равны,
R3 LD A,B ;значит поворот закончен
ADD A,A
;Выбираем из таблички нужный спрайт и печатаем его
LD HL,RotTabl
LD C,A
LD B,0
ADD HL,BC
JR SH1
;H-y, L-x
;Расчитываем следующий шаг, а так же направление героя
NxtStep
LD A,PG_MAP
CALL PAGE
PATHadr LD HL,0 ;Путь содержит направления
;по которым перемещается герой
LD A,(HL) ;Направление
LD B,A
INC A
JP Z,EndStep ;если A=255, то герой достиг цели!
DEC HL
LD (PATHadr+1),HL ;запоминаем адрес след. направл.
LD A,(HL)
LD (OLDpath),A
LD A,B
LD D,B
CALL NAPR
LD (NAPRAVL+1),BC ;Сохраняем приращение по направлению
LD HL,(HEROCRD)
LD A,H
SUB B
LD B,D
LD D,A
LD A,L ;Расчет новых координат
SUB C ;в зависимости
LD E,A ;от направления движения героя
LD A,B
ROTAT LD HL,VeraTab
ADD A,A ;A=A*9
ADD A,A
ADD A,A
ADD A,B
LD C,A
LD B,0
ADD HL,BC ;HL=адресу таблицы группы спрайтов
LD B,(HL)
LD A,(ROTATE+1) ;Предыдущее направление героя
LD C,A
CP B
JR NZ,ROT
INIT LD (SPRHERO+1),HL
LD (HEROCRD),DE
RET
;в какую сторону вертеться
ROT AND A
LD A,B
JR Z,P1
LD A,C
SUB B
JR NC,P2
NEG
P1 CP 5
JR C,P0-2
LD E,#3D ;DEC A
JR P0
P2 CP 5
LD E,#3D ;DEC A
JR C,P0
LD E,#3C ;INC A
P0 LD A,ROTATE-RUNING-2 ;изменяем код JR
LD (RUNING+1),A
; LD A,E
;P3 XOR 0 ;0/1 для колдовства Зловетом
ld a,(P3p1) ;0/1 для колдовства Зловетом
xor e
LD (RotMod),A
LD A,B
LD (Prev+1),A
LD HL,(PATHadr+1)
INC HL
CALL ES2
POP HL ;лишний POP для выхода из NextStep
JP ROTATE
;Это был последний шаг. Герой достиг цели!
EndStep
POP AF ;лишний POP для выхода из процедуры NxtStep
XOR A
LD (RunHero+1),A
LD (FTASK),A
ES2 LD (PATHadr+1),HL
LD A,STEP1
LD (COUNT2+1),A
LD A,STEP2
LD (COUNT1+1),A
RET ;Выход из процедуры RUNING
;Приводим абсолютные координаты героя
;в пиксельные для печати на экране
;H-Y, L-X
Abs_Pix LD HL,(HEROCRD) ;координаты ног героя на карте
LD A,H
ADD A,A ;A=A*16
ADD A,A
ADD A,A
ADD A,A
SUB 16 ;т.к. нам нужно получить координаты головы героя
LD H,A
LD A,L
ADD A,A ;A=A*16
ADD A,A
ADD A,A
ADD A,A
LD L,A
RET
;курсор вне мешка
VNE LD A,(F3+1)
AND A
RET Z
XOR A
LD (F3+1),A
VNE2 LD A,(PRTIME+1)
AND A
RET NZ
LD (CLT+1),A
CPL
LD (SVER+1),A
RET
;выбор вещи курсором из мешка
VMESH
LD A,H ;X
CP MAX_X
JR NC,VNE
SUB 200
JR C,VNE
CALL DIV24 ;b=A/24
LD A,B
CP 2
JR NC,VNE
LD D,A ;X
LD A,L ;Y
CP 30
JR C,VNE
CP 94
JR NC,VNE
SUB 28
JR C,VNE
CALL DIV24 ;b=A/24
LD A,B
CP 3
JR NC,VNE
ADD A,A;Y
ADD A,D
LD E,A
LD D,0
LD HL,(MSTRT+2)
ADD HL,DE
LD (VADR+1),HL;адрес вещи на которой стоит курсор
LD A,1
LD (F3+1),A ;курсор в мешке!
LD B,(HL);номер вещи из мешка на кот. стоит курсор
;печать названия вещи:A-код вещи
PRVESH
LD A,(PRTIME+1)
AND A
RET NZ
;Чтобы одно и тоже название не печаталось дважды
SVER LD A,255 ;предыд. вещь на котор. стоял курсор
CP B
JR Z,SV2
LD A,B
LD (SVER+1),A
ADD A,A
LD E,A
LD D,0
LD HL,V
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL) ;DE-название вещи
LD (PRT+3),DE
XOR A
LD (CLT+1),A
LD (PRT+1),A
SV2 INC A
RET
;Стирание области под текстом
CLADR=#C8D9
CLADR2=#C8F9
CLTXT
;in IM2
if EGA
ld hl,scrbase+(40*112)+#19
ld bc,0x1018
ld e,0x3f ;color 7 ;0xc9 ;color 9
;b=hgt,c=wid (/2)
;de=gfx
;hl=scr
jp climgega
else
LD HL,0
DUP 8
LD (CLADR),HL
LD (CLADR+2),HL
LD (CLADR+4),HL
CLADR=CLADR+256
EDUP
DUP 8
LD (CLADR2),HL
LD (CLADR2+2),HL
LD (CLADR2+4),HL
CLADR2=CLADR2+256
EDUP
RET
endif
;Увеличение скорости обновления экрана
;Заметно ТОЛЬКО в режиме Турбо компьютера
TURBO
LD HL,MAPINGp4
LD A,FRAME
DEC (HL)
JR Z,$+4
LD A,1
LD (HL),A
JR KOF
;скрытый режим
STEAL
LD A,(CHANGE)
AND A
JP NZ,KOF
LD A,#FB
IN A,(#FE) ;SS/CS+T
BIT 4,A
JR Z,TURBO
LD H,27
LD A,#F7
IN A,(#FE) ;SS/CS+3/4-листание вверх/вниз
BIT 2,A
JR Z,VLST
INC H
BIT 3,A
JR Z,VLST
BIT 0,A
JP Z,SKIP ;промотка диалога
LD A,#BF
IN A,(#FE) ;SS/CS+J/K - перелет героя - J
;границы скролла - K
AND 12
CP 12
JR Z,RMOUS
BIT 2,A
JR Z,BORDER
LD A,(RunHero+1)
AND A
JR NZ,RMOUS
STPIN LD A,0
INC A
CP 8
JR C,STN1
XOR A
STN1 LD (STPIN+1),A
ADD A,A
LD HL,CRDJP
LD E,A
LD D,0
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD (HEROCRD),DE
STN2 LD A,PG_MAP
CALL PAGE
CALL CENTR2
JR KOF
RMOUS LD A,32 ;имит. прав. клавишу мыши
JP MKEYSp2
CRDJP DW #3906 ;Домой
DW #0537 ;к Зловету
DW #2F1B ;к Аленушке
DW #3236 ;к Хевору
DW #2807 ;к Петро
DW #1908 ;к Кузнецу
DW #0407 ;к Фекле;
DW #1E32 ;к библиотекарю
;Удаление границ скроллир. карты (герой может уходить за экран)
BORDER LD A,(MODscrl+1)
XOR 1
LD (MODscrl+1),A
JR KOF
;Листание вещей от клавиш
VLST
CALL VLIST
KOF LD A,201
LD (CHANGE),A
JP MKY
;Изменение каких-либо параметров от клавиш
CHANGE
NOP ;RET
EX AF,AF' ;'
LD A,201
LD (CHANGE),A
EX AF,AF' ;'
RRA
JR NC,MUS_ONOF ;"1"
RRA
JR NC,SNDONOF ;"2"
RRA
RET C
;Вкл/откл мышки - клавиша "3"
MS_ONOF LD HL,mouse+1
LD A,(HL)
CPL
LD (HL),A
RET
;Вкл/откл звуков
SNDONOF LD A,PG_MAP
CALL PAGE
LD HL,SOUND
LD A,201
XOR (HL)
LD (HL),A
LD HL,SND_TSK
LD (SAMPLE+1),HL
CALL NZ,AY_OFF
RET
;Вкл/откл музыки
MUS_ONOF
HALT
LD A,(MUSONp1)
XOR 1
LD (MUSONp1),A
DI
LD A,PG_MUZ
CALL PAGE
CALL MUTE
EI
RET
;Изменение громкости мелодии
VOLCH
LD B,#FF
NOP
LD A,PG_MUZ
CALL PAGE
LD HL,VOLUME
LD A,(HL)
ADD A,B
CP -16
JR Z,MUSNXT
CP 1
JR Z,STPVOL
LD (HL),A
RET
STPVOL LD HL,#C9FF
LD (VOLCH+1),HL
RET
MUSNXT2 XOR A
LD (VOLCH+2),A
RET
;Переход на след. мелодию
MUSNXT
LD A,(MUSNUM)
LD B,A
LD A,PG_MUZ
CALL PAGE
LD A,B
INC A
CP 6 ;кол-во мелодий
JR C,$+3
XOR A
LD (MUSNUM),A
LD HL,MUSTAB
ADD A,A
LD E,A
LD D,0
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD DE,MUSIC
CP 10
JR NZ,$+5
LD DE,#C000
PUSH DE
EI
HALT
CALL DEHRUST
POP HL
LD DE,100
AND A
SBC HL,DE
DI
CALL PLAY ;инициал. мелод.
EI
LD HL,#0001
JR STPVOL+3
MUSTAB DW MUSM,MUS0,MUS1,MUS2,MUS3,MUSF
CLRMK XOR A
LD (MKEYSp1),A
RET
FIRE
CALL CLRMK
CALL GMEN
LD A,(DIALOG+1) ;открыто ли окно диалога?
AND A
JP NZ,TALKING
;использование вещей
F3 LD A,0 ;если не ноль, то курсор в мешке
AND A
JR Z,F4
VADR LD HL,0
LD A,(KARM) ;если вещей в руке нет, значит берем
LD D,(HL)
AND A
JR NZ,VA1
OR D
RET Z
XOR A
JR F32 ;берем вещь
VA1 SUB 7
DEC D
INC D
JR Z,F31 ;ложим
;применяем вещь на вещь в мешке
PUSH HL
CALL SVOYST
POP HL
INC BC
LD A,(BC)
CP D
JP NZ,NOTUSE ;нельзя применить
INC BC
LD A,(BC)
CALL F31
XOR A
LD (F3+1),A
INC BC
LD A,(BC)
LD HL,SND_OBJ
LD (SAMPLE+1),HL
JP TLSN
F31 LD D,-7
F32 LD (HL),A
LD A,D
ADD A,7
LD (KARM),A
LD (CCURS+1),A
LD HL,INV+1 ;напеч. спрайты 3*3
INC (HL)
LD HL,SND_TK
LD (SAMPLE+1),HL
RET
F4 LD A,(VUS+1)
AND A
RET NZ
CALL MANAGE
LD A,B
AND A
JR Z,F41
CP 5
JP NZ,VUSE2
F41 LD HL,(mouse_crd);L-y,H-x
CALL DIV8
LD A,H ;X
CP 24
JR C,F5
LD A,L ;Y ;листание вещей в мешке
CP 3
RET NZ
VLIST
CALL CLRMK
LD A,H
LD HL,(MSTRT+2)
LD DE,6 ;шаг листания вещей: 1 вещь-1 байт
LD BC,MESHOK
SUB 27
JR Z,VESHUP ;вверх
DEC A
JP Z,VESHDW ;вниз
;reter
RET
jpix
jp (ix)
;нажали огонь на игровом поле
PATH
F5 SRL H ;X
SRL L ;Y
LD (FTSK+1),HL
;MG1 CALL MAG2-1 ;Зловет заколдовал
ld ix,(curmagic)
call jpix
LD A,(curarrowtype) ;Если уже какой-то спрайт сделан
AND A ;???по идее надо проверять на 255!!! TODO
JR NZ,F6
; LD A,PG_VIEW
CALL PAGE_PG_VIEW
PUSH HL
CALL NP
CALL Z,MASK
POP HL
F6 LD D,L
LD E,H
LD HL,(DispMapX) ;H-Y, L-X
ADD HL,DE
OLDC LD DE,0
LD (OLDC+1),HL
EX DE,HL
AND A
SBC HL,DE
RET Z ;мы уже сюда тыкали
LD HL,(HEROCRD) ;H-Y, L-X
;если герой перемещается, то останавливаем его
LD A,(RunHero+1)
AND A
JR Z,NEWpath
LD BC,OLDpath
LD (PATHadr+1),BC
NEWpath LD A,PG_MAP
;A=1
LD (CLR_MAPp1),A ;для восстановления карты
CALL PAGE
;HL=(HEROCRD) ;H=Y,L=X
;de=куда ;D=Y,E=X
CALL SRCH_PATH
LD A,(HL)
INC A
RET Z ;нет пути
LD (RunHero+1),A
LD (PATHadr+1),HL
F7
LD A,201
LD (FTASK),A
RET
VESHUP AND A
SBC HL,DE
SBC HL,BC
RET C
VSH_ ADD HL,BC
LD (MSTRT+2),HL
LD HL,INV+1
INC (HL)
LD HL,SND_LST
LD (SAMPLE+1),HL
NP
LD A,(KARM)
AND A
RET NZ
NP2 LD A,1 ;визуальное нажатие курсором
LD (CCURS+1),A
RET
VESHDW ADD HL,DE
AND A
SBC HL,BC
LD A,L
CP QVESH-4
RET NC
JR VSH_
;Упак. тексты диалогов
if MEGALZ
include "unmegalz.asm" ;DEC40
GL INCBIN "gleb.mlz"
ZL INCBIN "zlovet.mlz"
HV INCBIN "hevor.mlz"
BK_ INCBIN "bukvin.mlz"
JO INCBIN "jora.mlz"
PT INCBIN "petro.mlz"
AL INCBIN "alena.mlz"
FK INCBIN "fekla.mlz"
ZD_ INCBIN "zadolb.mlz"
RP INCBIN "replic.mlz"
else ;HRUST2
GL INCBIN "GLEB.p"
ZL INCBIN "ZLOVET.p"
HV INCBIN "HEVOR.p"
BK_ INCBIN "BUKVIN.p"
JO INCBIN "JORA.p"
PT INCBIN "PETRO.p"
AL INCBIN "ALENA.p"
FK INCBIN "FEKLA.p"
ZD_ INCBIN "ZADOLB.p"
RP INCBIN "REPLIC.p"
endif
SPRMENU
INCBIN "GAMEMEN4.C" ;спрайт меню
ENDPROG ;EQU SPRMENU+1248
page PG_MAP
MAP EQU #C000
if 1==1
org 0xc000
if EGA
incbin "map.dat"
else
incbin "map6912.dat"
endif
incbin "mapflags.dat"
endif
MASSIVE EQU MAP+8192
ORG MASSIVE+4096;,PG_MAP
DNPK
INCBIN "Day_nght.p" ;467 Упакован. спрайт дня и ночи
;page PG_MAP
;ORG DNPK+467;,PG_MAP
INCLUDE "SCRIPTS.asm" ;Скрипты
SRCH_PATH
INCLUDE "PATH-48H.asm" ;поиск пути 531 байт
stack DS 4*(DX_MAP+DY_MAP) ;+ 512 б буфер
;итого 1043 байта
;DISPLAY /H,/T,MMENU
;DISPLAY /H,/T,mouse+1
;DISPLAY /H,/T,ROLL
;DISPLAY /H,/T,SCANTYP+1
;DISPLAY /H,/T,MSPEED+1
;DISPLAY /H,/T,MUSONp1
;DISPLAY /H,/T,SOUND
LN_MISC EQU $-#C000
MISCFRE EQU #FFFF-$
LN_MAP EQU stack-DNPK
DISPLAY "PG_MISC FREE=",MISCFRE
DISPLAY "PG_MAP FREE = ",#FFFF-stack-512
;DISPLAY "Старт = ",IM2
;DISPLAY "Дл. = ",ENDPROG-IM2
; DISPLAY "Дл. текстов = ",NOTUSE-GL
; DISPLAY "Дл. Скриптов = ",SND-RUN_Q
DISPLAY "Свободно = ",#C000-ENDPROG
;DISPLAY "Переменные = ",IM2-VARS
MAPMAS EQU #C000
KSCR EQU MAPMAS+4053
BKEY EQU KSCR+3673
ABOUTS EQU BKEY+4267 ;Об игре,авторах
FINPACK EQU ABOUTS+1781
;LODSAV EQU FINPACK+1787
page PG_MISC
ORG #C000;,PG_MISC
TEXT ;куда распак. текст
INCBIN "MapMass.p" ;4053 ;упакованная карта (распаковывается в PG_MAP), потом запарывается текстом текущего диалога
INCBIN "KeyScr4.plc" ;3673
INCBIN "BELLKEY4.plc" ;4267
INCBIN "ABOUTY.p" ;1781
INCBIN "BVssVMft.p" ;1787 ;анимация финала
;DISP #5800
;INCLUDE "saveload.asm" ;Загрузка/запись состояния игры
;ENT
;LENLS EQU $-LODSAV
FINAL INCLUDE "FINAL.asm" ;Финал игры
page PG_SPR
ORG #C000;,PG_SPR
if EGA
include "cursors.ast" ;276 (0x114) байт на курсор
;include "hud.ast"
SPR=0xc000 ;чисто для вычислений по тайлам (потом при выводе пересчитываются)
else
SPR
INCBIN "SPRITEMh.C" ;16384
endif
page PG_HERO
ORG #C000;,PG_HERO
if !EGA
hero
VIDS EQU hero+6144
INCBIN "HeroSprX.C" ;6144
else
hero=0;0x8000/4
VIDS
endif
INCBIN "VIDEO.p" ;упак. видео=10202, распак.=12132
page PG_MUZ
ORG #C000+5782;,PG_MUZ
PLAY
MUTE EQU PLAY+5
VOLUME EQU PLAY+10
MUSM EQU PLAY+2139
MUS0 EQU MUSM+912
MUS1 EQU MUS0+722
MUS2 EQU MUS1+413
MUS3 EQU MUS2+1074
MUSF EQU MUS3+1161
VARSPK EQU MUSF+3099
MUSIC EQU #C000+3222
page PG_MUZ
;ORG MUSIC
;incbin "Menu.m--"
ORG PLAY-824;,PG_MUZ
INTRO
INCBIN "B1_otrez.m--";Мелодия для интро
INCBIN "PLAYERX.C" ;Плеер музыки
INCBIN "Menu.p"
INCBIN "vera_00.p"
INCBIN "vera_01.p"
INCBIN "vera_02.p"
INCBIN "vera_03.p"
INCBIN "russia80.p"
;INCBIN "VARS_PAK.p" ;1020
LN_MUZ EQU VARSPK+1020-INTRO
LN_HERO EQU 6144+10202
page PG_VIEW
ORG #C000+6912;,PG_VIEW
FNT
SPR33 EQU FNT+2048
wasARROWS EQU SPR33+3456
VIEW EQU wasARROWS+szARROWS
NG_MASK EQU VIEW+1039
WIN_SPR EQU NG_MASK+384 ;буфер 192 б
NG EQU WIN_SPR+496 ;сюда распак. спрайт дня и ночи
;REZULT EQU #5802 ;буфер 192 б
INCBIN "4AXORFIX.F" ;2048 фонт Pulsar'а
if EGA
ds 3456
else
INCBIN "spr3x3.C" ;3456 ;TODO убить в EGA
endif
ds 1440 ;INCBIN "spr2x2x.C" ;1440 ;стрелки нужны для меню
if EGA
ds 1039+384+496
else
INCBIN "IFACE.plc" ;1039 ;TODO убить в EGA
INCBIN "Ngh_arr3.C" ;384 Спрайт маски и стрелки по OR ;TODO убить в EGA
INCBIN "WIN_SPR.C" ;496 Спрайт окна диалога ;TODO убить в EGA
endif
LN_VIEW EQU NG-FNT
page PGHUD
org 0xc000
include "hud.ast"
szhud=$-0xc000
page PGDAYNIGHT
org 0xc000
include "daynight.ast"
;hudmenu
include "hudmenu.ast"
szdaynight=$-0xc000
;Для сохранения содержимого всех страниц
;раскомментировать и запустить:RUN SOBJ
; ORG SPRMENU
;SOBJ INCLUDE "SAVEOBJ"
;ORG MMENU ;start here
;savebin "VERAVARS.C",VARS,endvars-VARS
if RUS
savebin "vera.com",begin,ENDPROG-begin
savebin "vera/vars.bin",VARS,0x600
else
savebin "veraeng.com",begin,ENDPROG-begin
savebin "vera/varseng.bin",VARS,0x600
endif
page PG_SPR
savebin "vera/0_page.bin",SPR,16384
page PG_MAP
if RUS
savebin "vera/1_page.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
else
savebin "vera/1_pageng.bin",0xc000,LN_MAP+0x3000;,DNPK,LN_MAP
endif
;savebin "vera/1_page.bin",DNPK,LN_MAP
page PG_MISC
if RUS
savebin "vera/3_page.bin",0xc000,LN_MISC
else
savebin "vera/3_pageng.bin",0xc000,LN_MISC
endif
page PG_HERO
savebin "vera/4_page.bin",0xc000,LN_HERO
page PG_MUZ
savebin "vera/6_page.bin",0xc000,0x4000;INTRO,LN_MUZ
page PG_VIEW
savebin "vera/7_page.bin",FNT,LN_VIEW
page PGHUD
savebin "vera/hud.bin",0xc000,szhud
page PGDAYNIGHT
savebin "vera/daynight.bin",0xc000,szdaynight
LABELSLIST "../../../us/user.l"
display "HEROCRD=",HEROCRD