?login_element?

Subversion Repositories NedoOS

Rev

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

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