Subversion Repositories NedoOS

Rev

Rev 918 | Rev 967 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.         ;MAIN "VERA",8
  2.  
  3. ;Для компиляции раздела "Об..."
  4. ;раскоментировать строку, но
  5. ;закоментировать вышестоящие INCBIN
  6.         ;INCLUDE "B:ABOUT"
  7.  
  8. VUSE1   CALL CLRMK
  9.         CALL MANAGE
  10.         LD A,B
  11.         CP 5
  12.         RET NZ
  13.  
  14. ;Выкладыв. вещей на поле/разговор
  15. VUSE2
  16.         LD A,(RunHero+1)
  17.         AND A
  18.         RET NZ
  19.         LD A,B
  20.  
  21.         DEC A
  22.         LD (VUSE3+1),A
  23.         JP Z,VSHERO
  24.  
  25.         LD (RunHero+1),A
  26.         LD (VUS+1),A
  27.         LD A,ROTSPD     ;скорость при повороте и выклад. вещи
  28.         LD (SPH+1),A
  29.         LD DE,(HEROCRD)
  30. CURSCRD LD BC,0         ;крд. курс. на карте в сис-ме 2*2 знак.
  31.         CALL ROTATOR    ;поворот героя к месту применения вещи
  32.  
  33. VUSE3   LD A,0
  34.         DEC A
  35.         JP Z,GIVE      ;Отдаем вещь персонажу
  36.         DEC A
  37.         JP Z,TALK      ;Говорим с персонажем
  38.         DEC A
  39.         JP Z,MANIP     ;Применяем вещь на объект
  40.         DEC A
  41.         LD (PUT_GET+1),A
  42.                        ;0-Выкладываем вещь рядом с героем
  43.                        ;1-Берем вещь
  44. VUSE4   LD HL,VeraTab2
  45.         LD A,0
  46.         LD C,A
  47.         AND A
  48.         JR NZ,VS1
  49.  
  50.         LD A,(ROTATE+1)
  51.         ADD A,A         ;A=A*12
  52.         ADD A,A
  53.         LD B,A
  54.         ADD A,A
  55.         ADD A,B
  56.         LD E,A
  57.         LD D,0
  58.         ADD HL,DE
  59. VS1     LD A,C
  60.         INC A
  61.         CP 3
  62.         CALL Z,VS3
  63.         CP 7
  64.         JR NC,VS2
  65.         LD (VUSE4+4),A
  66.         LD E,(HL)
  67.         INC HL
  68.         LD D,(HL)
  69.         INC HL
  70.         LD (SprHero+1),DE
  71.         JR VS2_
  72.  
  73. ;Выкладыв. закончено
  74. VS2     XOR A
  75.         LD (VUS+1),A
  76.         LD (VUSE4+4),A
  77.         LD (RunHero+1),A
  78.         LD A,SPD_HERO
  79.         LD (SPH+1),A
  80.         LD HL,VeraTab2
  81. VS2_    LD (VUSE4+1),HL
  82.         RET
  83.  
  84. ;Непосредств. выкладывание вещи
  85. VS3     EX AF,AF' ;'
  86.         PUSH HL
  87.  
  88.         LD HL,SND_TK
  89.         LD (SAMPLE+1),HL
  90.  
  91.         LD A,PG_MAP
  92.         CALL PAGE
  93.  
  94. PUT_GET LD B,0     ;0-выкладываем,1-берем
  95.         DJNZ VS5
  96. ;берем
  97.         LD A,(UNDER+1)
  98.         AND %01111111
  99.         LD D,A
  100.         CALL SVOYST
  101.        if EGA
  102.        ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
  103.        LD (MAPFLAG+1),A ;обновить весь экран
  104.        endif
  105.         LD H,B
  106.         LD L,C
  107.         INC HL,HL,HL,HL
  108.         LD C,(HL)
  109.         INC HL
  110.         LD A,(HL)
  111.         CP #F8          ;если под вещью лежал
  112.         JR NC,P_G       ;спрайт из последних 32-х
  113.                         ;то поле под ним не делаем проходимым
  114.         LD HL,(ADRELM)
  115.         LD (HL),0
  116.  
  117. P_G     LD HL,(ADRSPRT) ;восст. фон
  118.         LD (HL),C
  119.         INC HL
  120.         LD (HL),A
  121.         LD A,D
  122.         ADD A,7
  123.         JR VS4
  124.  
  125. ;выкладываем
  126. VS5     LD A,(KARM)
  127.         LD BC,SPR
  128.         ADD A,143
  129.         LD L,A
  130.         LD H,C   ;C=0
  131.         ADD HL,HL
  132.         ADD HL,HL
  133.         ADD HL,HL
  134.         ADD HL,HL
  135.         ADD HL,HL
  136.         ADD HL,BC
  137.         EX DE,HL
  138.         LD HL,(ADRSPRT)
  139.         LD C,(HL)   ;запоминаем фон
  140.         LD (HL),E
  141.         INC HL
  142.         LD B,(HL)
  143.         LD (HL),D
  144.         LD D,B
  145.         LD E,C
  146.         SUB 150
  147.  
  148.         CALL SVOYST
  149.         LD H,B
  150.         LD L,C
  151.         INC HL,HL,HL,HL
  152.  
  153.         LD (HL),E
  154.         INC HL
  155.         LD (HL),D
  156.         LD HL,(ADRELM)
  157.         LD (HL),1
  158.         XOR A
  159.         LD (DISTV),A
  160.         LD (CCURS+1),A
  161. VS4     LD (KARM),A
  162.         EX AF,AF' ;'
  163.         POP HL
  164.         RET
  165.  
  166. ;Поворот героя к персон./вещи
  167. ;IN: DE-коорд. героя, BC-персон./вещи
  168. ROTATOR
  169.         LD A,D          ;Расчет направления движения
  170.         SUB B           ;Оно получается из разности
  171.         RRA             ;нужно если разность >1
  172.         JR NC,PTH1
  173.         RLA
  174. PTH1    LD H,A          ;первоначальной координаты
  175.         LD A,E          ;и следующей коорд.
  176.         SUB C
  177.         RRA
  178.         JR NC,PTH2
  179.         RLA
  180. PTH2    LD L,A          ;HL-направление
  181.  
  182. ;       LD A,L          ;by Pulsar
  183.         ADD A,A
  184.         ADD A,L
  185.         ADD A,H
  186.         ADD A,4
  187.         ADC A,-1
  188.         LD B,A
  189.         JP ROTAT
  190.  
  191. ONESYM  DB 0,0 ;для печати одного символа
  192. ADRELM  DW 0 ;адрес элемента
  193. ADRSPRT DW 0 ;Адрес спрайта на карте под курсором
  194.  
  195. ;Процедуры обслуживающие диалоги, скрипты
  196.  
  197. ;нельзя применить
  198. NOTUSE  ;LD B,64   ;номер сообщ.
  199.         LD A,#20
  200.         LD (PRJR),A
  201.         ADD A,A
  202.         LD (PRTIME+1),A
  203.         LD B,A
  204.         LD HL,SND_END
  205.         LD (SAMPLE+1),HL
  206.         JP SVER    ;печ. сообщения
  207.  
  208. ;Применяем вещь на героя
  209. VSHERO  LD A,(KARM)
  210.         SUB 7
  211.         CALL SVOYST
  212.         LD A,(BC)
  213.         AND A
  214.         JR Z,NOTUSE
  215.  
  216. ;Вещь применяется
  217.         LD HL,SND_HR
  218.         LD A,(BC)
  219.         BIT 7,A
  220.         JR Z,TLSN-3 ;только реплика
  221.         AND %01111111
  222.         PUSH HL
  223.         CALL SCRIPT;скрипт
  224.         POP HL
  225.         EX AF,AF' ;'
  226.         JR TLSN-3
  227.  
  228. XF      EQU (SCRHG/2-4)*256+SCRHG-8+(SHADSCR/256)
  229. XF2     EQU (SCRHG/2)*256+SCRHG+(SHADSCR/256)
  230.  
  231. ;Разговор с персонажем (открываем окно диалога)
  232. TALK
  233.         ;jr $
  234.         LD HL,SND_SPK
  235.         LD (SAMPLE+1),HL
  236. TLSN
  237.         LD (TLK+1),A ;номер реплики или 0-диалог
  238.        if !EGA
  239.         AND A
  240.         JR Z,TL0
  241.         LD A,201
  242. TL0     LD (DLG),A
  243.        endif
  244.         XOR A
  245.         LD (TILED+1),A
  246.         LD A,(KARM)
  247.         LD (KARMBK+1),A
  248.         LD A,SCRHG-8
  249.         LD BC,XF
  250.         LD E,1
  251.         HALT
  252.         DI
  253.         CALL FIX2
  254.        if EGA
  255.         CALL PRW
  256.        else
  257. ;      LD A,PG_VIEW
  258.         CALL PAGE_PG_VIEW
  259.         CALL ARROFF
  260.         CALL PRW
  261.         CALL ARRON
  262.        endif
  263.         EI
  264.        halt
  265.  
  266. TLK     LD A,0        ;0-диалог с кем-то, 1-X номер реплики
  267.         AND A
  268.         LD B,A
  269.         LD HL,#0A11   ;H-X,L-Y текущ. позиции печати
  270.         JR Z,TL1
  271.         LD H,2
  272. TL1     LD (TXT1+1),HL
  273.         LD A,H
  274.         LD (TXT2+1),A
  275.         JR Z,TL2
  276.  
  277.         LD A,B
  278.         DEC A
  279.         PUSH AF
  280.         LD A,PG_MUZ
  281.         CALL PAGE
  282.         LD HL,RP
  283.         LD DE,TEXT
  284.         PUSH DE
  285.         CALL DEHRUST
  286.         POP HL
  287.         POP AF
  288.         CALL SVOYST+3 ;расчет адреса реплики
  289.         XOR A
  290.         JR TL3
  291.  
  292. TL2     CALL PDIAL
  293.         LD (TNN_+1),DE
  294.         ADD A,39
  295.         LD (WHO+1),A
  296.  
  297.         LD A,1
  298. TL3     LD (DIAL+1),A
  299.         XOR A
  300.         LD H,A
  301.         LD L,A
  302.         LD (DISTV),HL
  303.         LD (CCURS+1),A
  304.         LD (UNDER+1),A
  305.         LD (KARM),A
  306.         LD (F3+1),A
  307.         LD (TXT+1),BC ;адрес диалога/реплики
  308.         JP VS2+4
  309.  
  310. ;Продолжение диалога (окно диалога открыто)
  311. TALKING
  312.         LD HL,(mouse_crd);L-Y,H-X
  313. ;      LD A,PG_VIEW
  314.         CALL PAGE_PG_VIEW
  315.         CALL NP2 ;вид курсора
  316.         CALL DIV8
  317.         LD A,H
  318.         CP 22   ;X
  319.         JR NZ,TLKNG ;не попали в кнопочку
  320.         LD A,L  ;Y
  321.         CP 17
  322.         JP Z,SKIP ;попали в кнопочку
  323.  
  324. TLKNG
  325.         LD A,(DIALOG+1) ;проверяем для клав. Enter
  326.         AND A
  327.         RET Z
  328.  
  329.         LD A,PG_MUZ
  330.         CALL PAGE
  331.  
  332.         LD HL,(TXT+1);текущ. напеч. байт
  333.         LD B,(HL)
  334.         INC HL
  335.         LD A,(HL)
  336.         LD (SCRP+1),A
  337. ;      LD A,PG_VIEW
  338.         CALL PAGE_PG_VIEW
  339.         LD A,B
  340.         CP TOKEN
  341.         RET NC ;фраза все еще печатается
  342.  
  343. ;Продолжение диалога
  344. ;       LD A,B
  345.         AND A
  346.         JR Z,TLKEND ;конец диалога - выход
  347.         HALT
  348.         LD DE,#0A14 ;H-X,L-Y
  349.         LD BC,#1006
  350.         DEC A
  351.         JR Z,TN1    ;1 на собес.
  352.         DEC A
  353.         JR Z,TN0    ;2 на героя
  354.         DEC A
  355.         JR Z,TNN    ;3 на другой диалог
  356.         DEC A       ;4 скрипт
  357.         JR Z,SCRP
  358.  
  359. ;       DEC A
  360. ;       JR Z,SCRP5  ;5 особый скрипт (см. формат)
  361.  
  362. ;6 продолж. реплики
  363.         LD A,(TXT1+1)
  364.         CP #13
  365.         JR Z,TN0
  366.         JR TN1
  367.  
  368. TNN     LD A,(SCRP+1)
  369. TNN_    LD (0),A    ;текущий диалог текущего персонажа
  370.         JR TLKEND
  371.  
  372. TN0     LD E,#11
  373. TN1
  374.        if EGA
  375.         push de
  376.         push hl
  377.         LD L,#25
  378.         LD A,201
  379.         CALL FIX3
  380.         call CLW
  381.         pop hl
  382.         pop de
  383.        endif
  384.         LD (TXT1+1),DE
  385.         LD (TXT+1),HL
  386.  
  387.         LD HL,SND_NXT
  388.         LD (SAMPLE+1),HL
  389.  
  390.        if EGA
  391.         ret
  392.        else
  393.         LD L,#25
  394.         LD A,201
  395.         CALL FIX3
  396.         CALL ARROFF
  397.         CALL CLW
  398.         JP ARRON
  399.        endif
  400.  
  401. SCRP    LD A,0
  402.         CALL SCRIPT ;выполняем скрипт
  403.  
  404.         CALL PAGE_PG_VIEW
  405.  
  406. ;Выход из диалога
  407. TLKEND
  408.         LD HL,ONESYM+1
  409.         LD (TXT+1),HL
  410.         XOR A
  411.         LD E,A
  412.        if EGA
  413.        ld a,3 ;3,2 - печатаем, 1 - не печатаем (кроме как под героем)
  414.        endif
  415.         LD (MAPFLAG+1),A
  416.         LD A,SCRHG
  417.         LD BC,XF2
  418.         CALL FIX2
  419.         XOR A
  420.         LD BC,#1506
  421.         LD L,#21
  422.         CALL FIX3
  423.  
  424.         CALL FONE
  425. KARMBK  LD A,0      ;восстан. то, что было в кармане
  426.         LD (KARM),A
  427.         XOR A
  428.         LD (PDMOD),A
  429.  
  430.         LD A,(SAMPLE+2)
  431.         AND A
  432.         JR NZ,TEND
  433.         LD HL,SND_END
  434.         LD (SAMPLE+1),HL
  435. TEND    JP VS2
  436.  
  437. ;Промотка/пропуск диалога
  438. SKIP
  439.         LD A,(DIALOG+1) ;открыто ли окно диалога?
  440.         AND A
  441.         JP Z,KOF
  442.  
  443.         LD A,PG_MUZ
  444.         CALL PAGE
  445.         HALT
  446.         LD DE,(TXT+1)   ;текущ. напеч. байт
  447.  
  448.         LD HL,ONESYM+1  ;останавливаем печать
  449.         LD (TXT+1),HL
  450.  
  451.         LD HL,KOF       ;сюда пойдет переход
  452.         PUSH HL         ;по RET
  453.  
  454. LPSKIP1 LD A,(DE)
  455.         INC DE
  456.         CP TOKEN
  457.         JR NC,LPSKIP1
  458.         AND A
  459.         JR Z,TLKEND-3   ;завершение диалога
  460.         CP 3
  461.         JR Z,LPSKIP3
  462.         CP 4
  463.         JR Z,LPSKIP2
  464.         CP 5
  465.         JR NZ,LPSKIP1
  466.         LD A,(DE)
  467.         CALL SCRIPT ;выполняем скрипт, который выдаст
  468.                     ;след. адрес диалога
  469.         EX DE,HL
  470.         JR LPSKIP1
  471.  
  472. ;выполнение скрипта
  473. LPSKIP2 LD A,(DE)
  474.         JR SCRP+2
  475.  
  476. ;переход на другой диалог с персонажем и
  477. ;завершение текущего диалога
  478. LPSKIP3 LD A,(DE)
  479.         LD HL,(TNN_+1)
  480.         LD (HL),A
  481.         JR TLKEND-3
  482.  
  483. ;Отдаем персонажу вещь
  484. GIVE
  485.         LD A,(PERSON)
  486.         LD B,A
  487.         LD A,(KARM)
  488.         SUB 7
  489.         LD C,A
  490.         PUSH BC
  491.         CALL FOR
  492.         POP DE
  493.         DJNZ GV1
  494.         JR GV3  ;реплика
  495. ;диалог
  496. GV1     AND A
  497.         JR Z,GV2
  498.         EX AF,AF' ;'
  499.         CALL PDIAL2
  500.         LD A,(HL)   ;запом. диалог
  501.         LD (PREV),A
  502.         LD (PREV+1),HL
  503.         EX AF,AF' ;'
  504.         LD (HL),A
  505.         JR GV3-1
  506. ;Вещь не нужна
  507. GV2     LD A,#23
  508.         LD (PDMOD),A
  509.         XOR A
  510. GV3     JP TALK
  511.  
  512. ;Применение вещей на объекты
  513. MANIP
  514.         LD A,(ITEM)
  515.         LD B,A
  516.         LD A,(KARM)
  517.         SUB 7
  518.         LD C,A
  519.         LD HL,FORTAB2
  520.         LD A,LENTAB2
  521.         CALL FO1
  522.         AND A
  523.         JR NZ,MN1
  524.         CALL VS2
  525.         JP NOTUSE
  526. MN1     LD B,A
  527.  
  528.         LD HL,SND_OBJ
  529.         LD (SAMPLE+1),HL
  530.  
  531.         LD A,B
  532.         JP TLSN
  533.  
  534. ;Вывод горизонтальных линий окна
  535. ;работа со стеком, но без запрета прерываний
  536. PRW
  537.        if EGA
  538.         ;ld a,PGHUD
  539.         ;call setpg
  540.         ld de,hudmsg
  541.         ld bc,64*256+96
  542.         ld hl,scrbase+(40*128)
  543. ;b=hgt,c=wid (/2)
  544. ;de=gfx
  545. ;hl=scr
  546.         jp primgega_pghud
  547.        else
  548.         LD (BACK+1),SP
  549.         LD HL,WIN_SPR
  550.         LD C,(HL)
  551.         INC HL
  552.         LD B,(HL)
  553.         DEC HL
  554.         LD SP,HL
  555.  
  556.         LD HL,#5000+#8000
  557.         LD DE,#50E0+#8000
  558.  
  559.         LD A,2
  560.         EX AF,AF' ;'
  561.         LD A,4
  562. PRWIN   ;
  563.         DUP 11
  564.         POP BC
  565.         LD (HL),C
  566.         INC L
  567.         LD (HL),B
  568.         INC L
  569.         EDUP
  570.  
  571.         POP BC
  572.         LD (HL),C
  573.         INC L
  574.         LD (HL),B
  575.         INC H
  576.  
  577.         DUP 11
  578.         POP BC
  579.         LD (HL),C
  580.         DEC L
  581.         LD (HL),B
  582.         DEC L
  583.         EDUP
  584.  
  585.         POP BC
  586.         LD (HL),C
  587.         DEC L
  588.         LD (HL),B
  589.         INC H
  590.  
  591.         DEC A
  592.         JR NZ,PRWIN
  593.         EX DE,HL
  594.         EX AF,AF' ;'
  595.         DEC A
  596.         JP NZ,PRWIN-3
  597. BACK    LD SP,0
  598.  
  599. ;Вывод вертикальных линий окна
  600. PRW2    LD HL,WIN_SPR+(24*16)
  601.         LD DE,#5020+#8000
  602.         LD BC,#5037+#8000
  603.  
  604.         LD A,6
  605. PW2     EX AF,AF' ;'
  606.         DUP 8
  607.         LD A,(HL)
  608.         LD (DE),A
  609.         INC HL
  610.         INC D
  611.         LD A,(HL)
  612.         INC HL
  613.         LD (BC),A
  614.         INC B
  615.         EDUP
  616.  
  617.         LD D,#50+#80
  618.         LD B,D
  619.  
  620.         LD A,E
  621.         ADD A,32
  622.         LD E,A
  623.  
  624.         LD A,C
  625.         ADD A,32
  626.         LD C,A
  627.  
  628.         EX AF,AF' ;'
  629.         DEC A
  630.         JR NZ,PW2
  631.        endif
  632.  
  633. ;стираем само окно
  634. CLW
  635.         LD HL,#D021
  636. CLP     LD DE,#1506 ;ширина,высота
  637.        if EGA
  638.         ld bc,scrbase+(40*136)+1-#d021
  639.         add hl,bc
  640.         ;ld bc,64*256+96
  641.         ld a,d
  642.         inc a
  643.         add a,a
  644.         add a,a
  645.         ld c,a ;wid/2
  646.         ld a,e
  647.         add a,a
  648.         add a,a
  649.         add a,a
  650.         ld b,a ;hgt
  651.         ld e,0xc9 ;color 9
  652. ;b=hgt,c=wid (/2)
  653. ;de=gfx
  654. ;hl=scr
  655.         push bc
  656.         push de
  657.         push hl
  658.        ld a,55
  659.        ld (im_arroff),a
  660.        call ARROFF
  661.         call setpgsscr40008000;_current ;visible
  662.         pop hl
  663.         pop de
  664.         pop bc
  665.         push bc
  666.         push de
  667.         push hl
  668.         call climgega_onescreen
  669.        call ARRON
  670.        ld a,55+128 ;"or a"
  671.        ld (im_arroff),a
  672.         call setpgsscr40008000_current ;shadow
  673.         pop hl
  674.         pop de
  675.         pop bc
  676.         ld a,55 ;"scf"
  677.         ld (wasdrawimg),a
  678.         jp climgega_onescreen
  679.        else
  680.         XOR A
  681.         LD C,4
  682. CLP_    LD B,D
  683.         LD (HL),A
  684.         INC L
  685.         DJNZ $-2
  686.         LD (HL),A
  687.         INC H
  688.         LD B,D
  689.         LD (HL),A
  690.         DEC L
  691.         DJNZ $-2
  692.         LD (HL),A
  693.         INC H
  694.         DEC C
  695.         JR NZ,CLP_
  696.         CALL LINE_HL+1
  697.         DEC E
  698.         JR NZ,CLP+3
  699.  
  700. CLP3    NOP ;RET
  701.  
  702. ;цвет
  703.         LD HL,#DA00
  704.         LD E,8
  705.         LD A,#60
  706.         CALL FNLP
  707.  
  708.         LD A,#68
  709.         LD H,A
  710.         LD L,A
  711.         LD (#DA00),HL
  712.         LD (#DA16),HL
  713.         LD (#DAEB),HL
  714.         LD (#DAF7),A
  715.         LD (#DAE0),A
  716.  
  717. DLG     NOP ;/RET ;есть ли диалог?
  718.  
  719.         LD A,29
  720.         LD B,3
  721.         CALL FIX
  722.  
  723.         LD A,#78
  724.         LD HL,#5A21+#8000
  725.         LD E,6
  726.         CALL FNLP
  727.  
  728.         LD A,8
  729.         LD B,24
  730. ;Измен. проц. вывода атрибутов
  731. FIX
  732.         LD (FNLPp1),A
  733.         LD A,B
  734.         LD (FNLPp3),A
  735.         RET
  736.        endif
  737.  
  738. ;Изменяем высоту выводимого экрана
  739. ;убираем курсор
  740. ;измен. проц-ры вывода курсора и др.
  741. FIX2
  742.         LD (HMOVEp1),A ;высота видимой части карты/8
  743.         LD (FNLPm1),A
  744.         LD A,B
  745.         LD (HMAP+1),A
  746.         LD A,C
  747.         LD (ARO+1),A
  748.         LD (ARO2+1),A
  749.         LD A,E
  750.         LD (DIALOG+1),A
  751.         LD (VUS+1),A
  752.         RET
  753.  
  754. ;Измен, пр-ру стирания окна
  755. FIX3
  756.        if !EGA
  757.         LD (CLP3),A ;0(TLKEND)/201(TN1)
  758.        endif
  759.         LD A,L ;#21(TLKEND)/#25(TN1) scraddr начала, где стирать
  760.         LD (CLW+1),A
  761.         LD (CLP+1),BC
  762.         RET
  763.  
  764. ;Колдовство Зловета (не туда идет герой)
  765. MAG1
  766.         CALL RND2
  767.         AND 15
  768.         LD B,A
  769.         LD A,L
  770.         XOR B
  771.         LD L,A
  772.         LD A,H
  773.         XOR B
  774.         LD H,A
  775.         RET
  776.  
  777. ;Колдовство Зловета (герой не движется)
  778. MAG2    LD D,L
  779.         LD E,H
  780.         LD HL,(DispMapX)
  781.         ADD HL,DE
  782.         LD (OLDC+1),HL
  783.         LD H,E
  784.         LD L,D
  785.         RET
  786.  
  787. ;Отложенное выполнение задания
  788. ;Когда герой еще далеко от предмета/персонажа
  789. ;Как только герой подойдет, задание будет выполняться
  790. ;говорить/брать/применять
  791. FTASK
  792.         RET ;/nop
  793.         CALL F7
  794. FTSK    LD HL,0
  795.         LD A,201
  796.         LD (CLC48_),A
  797.         CALL CALC1
  798.         XOR A
  799.         LD (CLC48_),A
  800.         PUSH DE
  801.         CALL MANAGE
  802.         POP DE
  803.         LD A,B
  804.         CP 2
  805.         RET C
  806.         CP 5
  807.         RET Z
  808.         PUSH BC
  809.         CP 4
  810.         CALL C,CLC48_
  811.         POP BC
  812.         LD HL,#FFFF
  813.         LD (OLDC+1),HL
  814.         JP VUSE2
  815.  
  816. ;Вывод спрайта течения дня-ночи
  817. DAYS
  818.         RET
  819.         LD (D_SP+1),SP
  820.         LD SP,REZULT
  821.  
  822. DADR=#D039
  823.         DUP 8
  824.         POP HL
  825.         LD (DADR),HL
  826.         POP HL
  827.         LD (DADR+2),HL
  828.         POP HL
  829.         LD (DADR+4),HL
  830. DADR=DADR+256
  831.         EDUP
  832.  
  833. DADR=#D059
  834.         DUP 8
  835.         POP HL
  836.         LD (DADR),HL
  837.         POP HL
  838.         LD (DADR+2),HL
  839.         POP HL
  840.         LD (DADR+4),HL
  841. DADR=DADR+256
  842.         EDUP
  843.  
  844. DADR=#D079
  845.         DUP 8
  846.         POP HL
  847.         LD (DADR),HL
  848.         POP HL
  849.         LD (DADR+2),HL
  850.         POP HL
  851.         LD (DADR+4),HL
  852. DADR=DADR+256
  853.         EDUP
  854.  
  855. DADR=#D099
  856.         DUP 8
  857.         POP HL
  858.         LD (DADR),HL
  859.         POP HL
  860.         LD (DADR+2),HL
  861.         POP HL
  862.         LD (DADR+4),HL
  863. DADR=DADR+256
  864.         EDUP
  865. D_SP    LD SP,0
  866.         LD A,201
  867. setDAYS_a
  868.         LD (DAYS),A
  869.         RET
  870.  
  871. ;OUT:
  872. ;BC-адрес текущ. диалога с персонажем
  873. ;DE-адрес текущ. номера диалога с персонажем
  874. ; A-номер собеседника
  875. PDIAL
  876.         CALL PDIAL2
  877.         PUSH AF,HL,HL
  878.         INC HL
  879.         INC HL
  880.         LD A,(HL)
  881.         INC HL
  882.         LD H,(HL)
  883.         LD L,A
  884.         LD A,PG_MUZ
  885.         CALL PAGE
  886.         LD DE,TEXT
  887.         PUSH DE
  888.         CALL DEHRUST ;распак. текст
  889.         POP DE,HL
  890. PDMOD   NOP          ;0-текущ. диалог
  891.                      ;INC HL - реакция на ненужную вещь
  892.         LD A,(HL)    ;номер текущ. диалога
  893.         EX DE,HL
  894.         CALL SVOYST+3
  895.         POP DE,AF
  896.         RET
  897.  
  898. ;OUT: A-персонаж
  899. ;     HL-адрес номера текущего диалога
  900. PDIAL2  LD A,(PERSON) ;с кем разговариваем
  901.         DEC A   ;
  902.         SUB 2   ;Этюд!
  903.         ADC A,1 ;
  904.         LD B,A
  905.         ADD A,A
  906.         ADD A,A
  907.         LD L,A
  908.         LD H,0
  909.         LD DE,GLB
  910.         ADD HL,DE
  911.         LD A,B
  912.         RET
  913.  
  914. ;Мигание стрелочек мешка
  915. FL_MESH
  916.         LD A,(gamemenucolorline);(#DAD9) ;если выделена кнопка главного меню
  917.         CP 56+64
  918.         RET Z
  919.  
  920.         LD HL,(mouse_crd);L-Y,H-X
  921.         LD A,L
  922.         CP 30
  923.         JR NC,FM2
  924.         CALL DIV8
  925.         LD A,L
  926.         CP 3
  927.         JR NZ,FM2
  928.         LD A,H
  929.         SUB 27
  930.  
  931.         JR C,FM2
  932.         CP 2
  933.         JR NC,FM2
  934.  
  935. ;счетчик
  936.         LD HL,FMCNT
  937.         DEC (HL)
  938.         RET NZ
  939.         LD (HL),FRM
  940.  
  941.        if EGA
  942. ;рисуем на двух экранах, как PR64
  943. curbagarr=$+1
  944.         ld de,bagarr0
  945.         ld hl,0xffff&(bagarr0+bagarr1)
  946.         or a
  947.         sbc hl,de
  948. FL_MESH_drawhl
  949.         ld (curbagarr),hl
  950.         ex de,hl
  951.         ld hl,scrbase+(24*40)+27
  952.         ld a,PGHUD
  953.         call setpg
  954.         ld bc,0x0808
  955. ;b=hgt,c=wid (/2)
  956. ;de=gfx
  957. ;hl=scr
  958.         ;ld a,55 ;"scf"
  959.         ;ld (wasdrawimg),a ;не надо, т.к. мы в прерывании
  960.         jp primgega
  961.        endif
  962.  
  963. FM0     LD HL,#C37B
  964.         LD DE,#C17C
  965.  
  966.         LD A,(HL)
  967.         CP %11110110
  968.         JR Z,FM1
  969. ;стрелки мешка по умолчанию
  970.         LD (HL),%11110110
  971.         INC H
  972.         LD (HL),%11100011
  973.         INC H
  974.         LD (HL),%11000001
  975.         EX DE,HL
  976.         LD (HL),%11100000
  977.         INC H
  978.         LD (HL),%11110001
  979.         INC H
  980.         LD (HL),%01111011
  981.         RET
  982.  
  983. FM1
  984. ;стрелки мешка нажаты
  985.         LD (HL),%11111110
  986.         INC H
  987.         LD (HL),%11111111
  988.         INC H
  989.         LD (HL),%11111111
  990.         EX DE,HL
  991.         LD (HL),%11111111
  992.         INC H
  993.         LD (HL),%11111111
  994.         INC H
  995.         LD (HL),%01111111
  996.         RET
  997.  
  998. FM2
  999. ;рисуем стрелки мешка по умолчанию
  1000.        if EGA
  1001.         ld de,bagarr0
  1002.         ld hl,(curbagarr)
  1003.         or a
  1004.         sbc hl,de
  1005.         ret z
  1006.         ex de,hl ;hl=bagarr0
  1007.         jr FL_MESH_drawhl
  1008.        else
  1009.  
  1010.         LD A,(#C37B)
  1011.         CP %11110110
  1012.         RET Z
  1013.         JR FM0
  1014.        endif
  1015.  
  1016. FMCNT   DB FRM   ;счетчик для мигания стрелочек
  1017.  
  1018. ;Скролл карты от клавиш
  1019. MOVMAP
  1020.         CALL SCRLMAP
  1021.         RET NC
  1022.  
  1023. ;      LD A,PG_VIEW
  1024.         CALL PAGE_PG_VIEW
  1025.  
  1026.         POP DE ;выход из CALL MOVMAP
  1027.                ;т.к. будет переход в другое место
  1028. MVM0    LD HL,(NEW_CRD)
  1029.         LD DE,(OLD_CRD+1)
  1030.         LD A,H
  1031.         SUB D
  1032.         LD H,A
  1033.         JR Z,MVM1
  1034.         LD A,1
  1035.         LD H,-16
  1036.         JR NC,MVM1
  1037.         LD A,-1
  1038.         LD H,16
  1039. MVM1    LD C,A
  1040.         LD A,L
  1041.         SUB E
  1042.         LD L,A
  1043.         JR Z,MVM2
  1044.         LD A,1
  1045.         LD L,-16
  1046.         JR NC,MVM2
  1047.         LD A,-1
  1048.         LD L,16
  1049. MVM2    LD B,A
  1050.         OR C
  1051.         JP Z,CURSR  ;карту не скроллим,
  1052.                     ;но курсор показываем
  1053.         LD D,L
  1054.         LD E,H
  1055. WWW
  1056.         JP SCROLL
  1057.  
  1058. ;Процедуры обслуживания скриптов и пр.
  1059.  
  1060. ;Положить отложенное задание в очередь (таск)
  1061. ;IN: BC-кол-во фреймов через кот. выполнится скрипт (таск)
  1062. ;    DE-адрес задания (скрипта)
  1063.  
  1064.         LD BC,1500
  1065. INSERT
  1066.         PUSH AF
  1067.         LD A,MAXTASK
  1068.         LD HL,TASKS
  1069. INSTLP  EXA
  1070.         LD A,(HL)
  1071.         INC HL
  1072.         OR (HL)
  1073.         JR Z,INSRT
  1074.         INC HL
  1075.         INC HL
  1076.         INC HL
  1077.         EXA
  1078.         DEC A
  1079.         JR NZ,INSTLP
  1080.         POP AF
  1081.         RET
  1082.  
  1083. INSRT   DI
  1084.         DEC  HL
  1085.         LD (HL),C
  1086.         INC HL
  1087.         LD (HL),B
  1088.         INC HL
  1089.         LD (HL),E
  1090.         INC HL
  1091.         LD (HL),D
  1092.         POP AF
  1093.         EI
  1094.         RET
  1095.  
  1096. ;Выполнение отложенных задач
  1097. ;выполняется только внутри прерывания
  1098. ;поэтому нужно все делать быстро!
  1099. GOTASK
  1100.         LD B,MAXTASK
  1101.         LD HL,TASKS
  1102. TSKLOOP LD A,(HL)
  1103.         LD E,A
  1104.         INC HL
  1105.         OR (HL)
  1106.         JR Z,NXTASK
  1107.         LD D,(HL)
  1108.         DEC DE
  1109.         LD (HL),D
  1110.         DEC HL
  1111.         LD (HL),E
  1112.         INC HL
  1113.         LD A,D
  1114.         OR E
  1115.         CALL Z,GT0  ;время пришло
  1116.                     ;выполнить таск!
  1117. NXTASK  INC HL
  1118.         INC HL
  1119.         INC HL
  1120.         DJNZ TSKLOOP
  1121.         RET
  1122.  
  1123. ;само выполнение
  1124. GT0
  1125.         PUSH BC
  1126.         PUSH HL
  1127.  
  1128.         INC HL
  1129.         LD C,(HL)
  1130.         INC HL
  1131.         LD H,(HL)
  1132.         LD L,C
  1133.         LD (GT1+1),HL
  1134.  
  1135.         LD HL,SND_TSK    ;после выполнения
  1136.                          ;таска будет звук
  1137.         LD (SAMPLE+1),HL
  1138.  
  1139.         LD A,PG_MAP
  1140.         CALL PAGE
  1141. GT1     CALL 0      ;выполняем таск
  1142.         POP HL
  1143.         POP BC
  1144.         RET
  1145.  
  1146. ;Выполнение скриптов
  1147. ;IN: A-номер скрипта
  1148. SCRIPT
  1149.         ADD A,A
  1150.         LD E,A
  1151.         LD D,0
  1152.         LD A,PG_MAP
  1153.         CALL PAGE
  1154.         LD HL,SCRPTB
  1155.         ADD HL,DE
  1156.         LD E,(HL)
  1157.         INC HL
  1158.         LD D,(HL)
  1159.         EX DE,HL
  1160.         LD (JPSC+1),HL
  1161. JPSC    CALL 0
  1162.         EX AF,AF' ;'
  1163. ;      LD A,PG_VIEW
  1164.         JP PAGE_PG_VIEW
  1165.  
  1166. ;Нужна ли отдаваемая вещь персонажу
  1167. ; IN:B-персонаж, C-вещь
  1168. ;OUT:A<>0-номер диалога с персонажем, если ему вещь нужна
  1169. ;    A=0, если вещь не нужна
  1170. ;    Выполняется скрипт, если нужно
  1171.  
  1172. ;    B=0-идет диалог
  1173. ;    B=1-реплика, A-номер реплики
  1174. FOR
  1175.         LD HL,FORTAB
  1176.         LD A,LENTAB
  1177. FO1     LD D,(HL)
  1178.         INC HL
  1179.         LD E,(HL)
  1180.         INC HL
  1181.         AND A
  1182.         EX DE,HL
  1183.         SBC HL,BC
  1184.         EX DE,HL
  1185.         JR Z,FO2
  1186.         INC HL
  1187.         INC HL
  1188.         DEC A
  1189.         JR NZ,FO1
  1190.         LD B,A ;B=0
  1191.         RET
  1192. FO2     LD A,(HL)   ;диалог
  1193.         INC HL
  1194.         LD B,(HL)   ;скрипт
  1195.         INC A
  1196.         JR Z,FO4    ;доп. команда
  1197.         DEC A
  1198.         DJNZ FO3
  1199.         RET
  1200. FO3     PUSH AF
  1201.         LD A,B
  1202.         CALL SCRIPT
  1203.         POP AF
  1204.         LD B,0
  1205.         RET
  1206. FO4     LD A,B   ;номер реплики
  1207.         LD B,1
  1208.         RET
  1209.  
  1210. ;---
  1211. V39     DB "Провидец",13,"Глеб",0
  1212. V40     DB "Коварный",13,"Зловет",0
  1213. V41     DB "Зловет",13,"без посоха",0
  1214. V42     DB "Старейшина",13
  1215.         DB "Хевор",0
  1216. V43     DB "Библиотекарь",13
  1217.         DB "Буквин",0
  1218. V44     DB "Волк Жора",0
  1219. V45     DB "Бармен Петро",0
  1220. V46     DB "Аленушка",0
  1221. V47     DB "Ф",241,"кла",13
  1222.         DB "Девурдалак",0
  1223. V48     DB "Кузнец",13
  1224.         DB "Задолбайло",0
  1225.  
  1226. V49     DB "Мельница",0
  1227. V50     DB "Кострище",0
  1228. V51     DB "Скелет",0
  1229. V52     DB "Летучая мышь",0
  1230. V53     DB "Фонтан",0
  1231. V54     DB "Хмель",0
  1232. V55     DB "Пшеница",0
  1233. V56     DB "Улей",0
  1234. V57     DB "Колодец",13,"с водой",0
  1235. V58     DB "Храм",0
  1236. V59     DB "Козленок",0
  1237. V60     DB "Колодец с",13,"живой водой",0
  1238. V64     DB "Ничего",13
  1239.         DB "не вышло",0
  1240. V65     DB "Костер",0
  1241.  
  1242. ;Формат анимации на карте
  1243. ;1-й байт - номер группы*2 и вкл. 0-й бит
  1244. ;2-й байт - номер спрайта*2 из группы
  1245.  
  1246. ;Адреса групп
  1247. AdrGrps DW LEO1 ;0
  1248.         DW MELN ;1
  1249.         DW FIRS ;2
  1250.         DW SKEL1;3
  1251.         DW SKEL2;4
  1252.         DW SKEL3;5
  1253.         DW SKEL4;6
  1254.         DW MOUS ;7
  1255.         DW PBOY ;8
  1256.         DW RUMB ;9
  1257.         DW PIAN1;10
  1258.         DW PIAN2;11
  1259.         DW KOST1;12
  1260.         DW LEO2 ;13
  1261.         DW INVT ;14
  1262.         DW INVT2;15
  1263.         DW INVT3;16
  1264.  
  1265. ;Количество анимационных групп во всей игре
  1266. ;(например, мельница, костер и т.п.)
  1267. QGRPS   EQU ($-AdrGrps)/2
  1268.  
  1269. ;Таблица анимационных групп, в которой выставляются флаги
  1270. ;видимости группы на экране.
  1271. ;Обнуляется после каждой печати видимой части экрана
  1272. ;Состоит из единичек или ноликов.
  1273. ;1-если группа уже появилась на экране,
  1274. ;0-если группы еще небыло. На одну группу - один байт.
  1275.  
  1276. AnimGrps DS QGRPS
  1277.  
  1278. ;Заголовки анимированных групп
  1279. ;5 байт+кол-во спрайтов в группе*2
  1280. ;Все остальное "тело" группы
  1281. ;Можно делать разные заголовки,
  1282. ;со ссылкой на одно и тоже "тело"
  1283. ;Например, это нужно для того чтобы рассинхронизировать
  1284. ;одинаковые анимации (у меня это скелеты)
  1285.  
  1286. ;Мельница
  1287. MELN    DB 2   ;Скорость вывода (для восстановления)
  1288.         DB 2   ;Скорость вывода (счетчик)
  1289.         DB 1   ;Тип анимации:
  1290.                ;1-Зацикленная (0.1.2.X.0.1.2...)
  1291.                ;2-Угасающая (0-X-X-X...),Кол-во фаз в группе
  1292.                ;должно быть >на 1, где послед. спрайт тот,
  1293.                ;который будет поставлен на карту (см. LEO2)
  1294.                ;>=3-Реверсивная, где данное число-2 означает
  1295.                ;новую стартовую фазу (см. LEO)
  1296.         DB 3   ;Кол-во фаз в группе-1 (1-X)
  1297.                ;Если =0, то анимация заморожена
  1298.         DB 0   ;Смещение от стартовой фазы для всей группы
  1299.  
  1300.         DW MEL1;Ссылки на фазы каждого спрайта группы
  1301.         DW MEL2
  1302.         DW MEL3
  1303.         DW MEL4
  1304.         DW MEL5
  1305.         DW MEL6
  1306.         DW MEL7
  1307.         DW MEL8
  1308.         DW MEL9
  1309.  
  1310. MEL1    DW (80*32)+SPR,(87*32)+SPR,(96*32)+SPR,(105*32)+SPR
  1311. MEL2    DW (81*32)+SPR,(88*32)+SPR,(97*32)+SPR,(106*32)+SPR
  1312. MEL3    DW SPR,(89*32)+SPR,(98*32)+SPR,(107*32)+SPR
  1313. MEL4    DW (82*32)+SPR,(90*32)+SPR,(99*32)+SPR,(108*32)+SPR
  1314. MEL5    DW (83*32)+SPR,(91*32)+SPR,(100*32)+SPR,(109*32)+SPR
  1315. MEL6    DW (84*32)+SPR,(92*32)+SPR,(101*32)+SPR,(110*32)+SPR
  1316. MEL7    DW (85*32)+SPR,(93*32)+SPR,(102*32)+SPR,(111*32)+SPR
  1317. MEL8    DW (86*32)+SPR,(94*32)+SPR,(103*32)+SPR,(112*32)+SPR
  1318. MEL9    DW SPR,(95*32)+SPR,(104*32)+SPR,SPR
  1319.  
  1320. ;Костер
  1321. FR1     DW (64*32)+SPR,(68*32)+SPR,(72*32)+SPR,(76*32)+SPR,SPR
  1322. FR2     DW (65*32)+SPR,(69*32)+SPR,(73*32)+SPR,(77*32)+SPR,SPR
  1323. FR3     DW (66*32)+SPR,(70*32)+SPR,(74*32)+SPR,(78*32)+SPR
  1324.         DW (314*32)+SPR
  1325. FR4     DW (67*32)+SPR,(71*32)+SPR,(75*32)+SPR,(79*32)+SPR
  1326.         DW (315*32)+SPR
  1327.  
  1328. ;Скелет
  1329. SKEL1   DB 5,5
  1330.         DB 1,15,0
  1331.         DW SK1
  1332.         DW SK2
  1333. SK1     DW (123*32)+SPR,(123*32)+SPR,(123*32)+SPR,(123*32)+SPR
  1334.         DW (123*32)+SPR,(125*32)+SPR,(127*32)+SPR,(129*32)+SPR
  1335.         DW (131*32)+SPR,(129*32)+SPR,(131*32)+SPR,(129*32)+SPR
  1336.         DW (131*32)+SPR,(129*32)+SPR,(127*32)+SPR,(125*32)+SPR
  1337. SK2     DW (124*32)+SPR,(124*32)+SPR,(124*32)+SPR,(124*32)+SPR
  1338.         DW (124*32)+SPR,(126*32)+SPR,(128*32)+SPR,(130*32)+SPR
  1339.         DW (132*32)+SPR,(130*32)+SPR,(132*32)+SPR,(130*32)+SPR
  1340.         DW (132*32)+SPR,(130*32)+SPR,(128*32)+SPR,(126*32)+SPR
  1341.  
  1342. SKEL2   DB 6,6
  1343.         DB 1,15,3
  1344.         DW SK1
  1345.         DW SK2
  1346.  
  1347. SKEL3   DB 7,7
  1348.         DB 1,15,8
  1349.         DW SK1
  1350.         DW SK2
  1351.  
  1352. SKEL4   DB 9,9
  1353.         DB 1,15,5
  1354.         DW SK1
  1355.         DW SK2
  1356.  
  1357. ;Летучие мыши
  1358. MOUS    DB 4,4
  1359.         DB 1,3,0
  1360.         DW MS1
  1361. MS1     DW (148*32)+SPR,(149*32)+SPR,(150*32)+SPR,(149*32)+SPR
  1362.  
  1363. ;Пьяницы
  1364. PIAN1   DB 10,10
  1365.         DB 1,6,0
  1366.         DW PI1,PI2
  1367. PI1     DW (113*32)+SPR,(113*32)+SPR,(115*32)+SPR,(117*32)+SPR
  1368.         DW (117*32)+SPR
  1369.         DW (115*32)+SPR,(113*32)+SPR
  1370. PI2     DW (114*32)+SPR,(114*32)+SPR,(116*32)+SPR,(118*32)+SPR
  1371.         DW (118*32)+SPR
  1372.         DW (116*32)+SPR,(114*32)+SPR
  1373.  
  1374. ;тело анимации одно на 2-х пьяниц
  1375. PIAN2   DB 13,13
  1376.         DB 1,6,4
  1377.         DW PI1,PI2
  1378.  
  1379. ;Писающий мальчик
  1380. PB1     DW (24*32)+SPR,(30*32)+SPR,(30*32)+SPR,(30*32)+SPR
  1381. PB2     DW (25*32)+SPR,(31*32)+SPR,(36*32)+SPR,(31*32)+SPR
  1382. PB3     DW (26*32)+SPR,(32*32)+SPR,(37*32)+SPR,(32*32)+SPR
  1383. PB4     DW (27*32)+SPR,(33*32)+SPR,(38*32)+SPR,(33*32)+SPR
  1384. PB5     DW (28*32)+SPR,(34*32)+SPR,(39*32)+SPR,(34*32)+SPR
  1385. PB6     DW (29*32)+SPR,(35*32)+SPR,(40*32)+SPR,(35*32)+SPR
  1386.  
  1387. ;Замок Зловета
  1388. RU1     DW (41*32)+SPR,(57*32)+SPR,(41*32)+SPR,(50*32)+SPR
  1389. RU2     DW (42*32)+SPR,(58*32)+SPR,(42*32)+SPR,(51*32)+SPR
  1390. RU3     DW (43*32)+SPR,(59*32)+SPR,(43*32)+SPR,(52*32)+SPR
  1391. RU4     DW (44*32)+SPR,(60*32)+SPR,(44*32)+SPR,(53*32)+SPR
  1392. RU5     DW (45*32)+SPR,(61*32)+SPR,(45*32)+SPR,(54*32)+SPR
  1393. RU6     DW (46*32)+SPR,(62*32)+SPR,(46*32)+SPR,(55*32)+SPR
  1394. RU7     DW (47*32)+SPR,(47*32)+SPR,(47*32)+SPR,(47*32)+SPR
  1395. RU8     DW (48*32)+SPR,(63*32)+SPR,(48*32)+SPR,(56*32)+SPR
  1396. RU9     DW (49*32)+SPR,(49*32)+SPR,(49*32)+SPR,(49*32)+SPR
  1397.  
  1398. ;Кости скелета
  1399. KOST1   DB 4,4
  1400.         DB 2,4,0
  1401.         DW KS1,KS2
  1402. KS1     DW (135*32)+SPR,(137*32)+SPR,(139*32)+SPR,SPR,SPR,SPR
  1403. KS2     DW (136*32)+SPR,(138*32)+SPR,(140*32)+SPR,(141*32)+SPR
  1404.         DW (142*32)+SPR
  1405.         DW (142*32)+SPR
  1406.  
  1407. ONESYM2 DB 0,0,0
  1408.  
  1409. ;для вещей
  1410. RNDTB1  DB 30,59,47,2,14,1,18,8,23,17,2,4,35,27,2,35,18,57,25,41
  1411.         DB 61,51,45,47,14,29,4,46,34,52,53,33
  1412. PREV    DS 3 ;предыд. диалог до отдачи вещи
  1413.