?login_element?

Subversion Repositories NedoOS

Rev

Rev 1542 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;вместо dy могут стоять значения:
  2. SPRLIST_STAYING=99 ;мёртвый (xhigh=INVISIBLEX) или уже впечатанный в карту, не обрабатывается логикой
  3. SPRLIST_END=100 ;в конце списка ещё spritehsb=1!
  4. SPRLIST_PRINTED=101
  5. SPRLIST_IMPOSSIBLE=102
  6.  
  7. ;в каких регистрах хранить данные при обработке:
  8. ;lc=x16 ;XXXXXXXX XXx????? (могут быть проблемы с точностью X при скольжении)
  9. ;e=dx8 ;sXXXXXXx (не более +-4)
  10. ;h=y8
  11. ;d=dy8
  12. ;c=phase5 (в физике используются только первые несколько фаз)
  13.  
  14. NEWREGS=0 ;TODO de=x16 (00XXXXXX XXXXxxxx), l=y8, h=dy8, b=dx8 (sXXXxxxx); c=phase (>600*2 фаз не влезет! придётся использовать поле dx8 (или ст. биты h и мл. биты l?) у стоячих червей)
  15.  
  16. ;фазы (черви и мины отличаются регистром B - а у зафиксированных червей больше допустимых комбинаций BC):
  17. ;0 - стоим (TODO 8 в другую сторону)
  18. ;TODO 1 - скользим (TODO 9 в другую сторону)
  19. ;TODO 2..7 - втыкаемся и вылезаем (TODO 10..15 в другую сторону)
  20. ;16..23 - крутимся (TODO 24..31 в другую сторону) - или стоим/крутимся/сторона - это разные B? тогда всего 3 бита на фазу и 3 на xxx?
  21.  
  22.  
  23. ;CHECKMASK не должна портить эти регистры!
  24. ;ADDCOORDS не должна портить dx,dy!
  25.  
  26.         macro GETCOORDS
  27.        if 1
  28.         ld c,(hl)
  29.         inc l
  30.         ld b,(hl)
  31.         inc l
  32.        push hl
  33.         ld e,(hl)
  34.         inc l
  35.         ld d,(hl)
  36.         inc l
  37.         ld a,(hl)
  38.         inc l
  39.         ld h,(hl)
  40.         ld l,a
  41.         ex de,hl
  42.        else
  43.         POP BC ;SPRITE
  44.         POP HL ;COORDS
  45.         POP DE ;SPEED
  46.        endif
  47.         endm
  48.  
  49.         macro REGETCOORDS
  50.        if 1 ;TODO NEWREGS
  51.        pop hl
  52.        push hl
  53.         ld a,(hl)
  54.         inc l
  55.         ld h,(hl)
  56.         ld l,a
  57.        else
  58.         DUP 4
  59.         DEC SP
  60.         EDUP
  61.         POP HL ;OLD COORDS
  62.         pop af ;POP DE ;OLD SPEED
  63.        endif
  64.         endm
  65.  
  66.         macro PUTCOORDS
  67.        if 1
  68.        ex (sp),hl
  69.         dec l
  70.         dec l
  71.         ld (hl),c
  72.         inc l
  73.         ld (hl),b
  74.         inc l
  75.        pop bc
  76.         ld (hl),c
  77.         inc l
  78.         ld (hl),b
  79.         inc l
  80.         ld (hl),e
  81.         inc l
  82.         ld (hl),d
  83.         inc l
  84.        else
  85.         PUSH de
  86.         PUSH hl
  87.         PUSH BC
  88.         DUP 3
  89.         POP BC
  90.         EDUP
  91.        endif
  92.         endm
  93.  
  94.         macro ADDCOORDS
  95.        if NEWREGS
  96.         ld a,l ;dx
  97.         or a
  98.         jp p,$+4 ;a>=0
  99. ;a<0,C: значит e>|a|, т.е. фактически нет переноса
  100.         dec d ;a<0,NC: d-- (иначе будет компенсирующий инкремент) ;+20
  101.         add a,e
  102.         jr nc,$+3
  103.         inc d ;a>=0,C: d++ (или a<0,C: компенсирующий инкремент) ;+15.5
  104.         ld e,a
  105.         ld a,h ;dy
  106.         add a,l ;y
  107.         ld l,a ;y                                                ;+16 = 51.5t (можно x=de, так проще CHECKMASK)
  108.        else
  109.          ld lx,e
  110.         XOR A
  111.         SRA E
  112.         RRA
  113.         SRA E
  114.         RRA
  115.          sra e
  116.          rra
  117.         ADD A,C ;xlow, phase
  118.         ADC HL,DE ;y,xhigh
  119.          ld c,a ;xlow, phase
  120.          ld e,lx
  121.        endif
  122.         endm
  123.  
  124.         macro NEGDX
  125.         XOR A
  126.        if NEWREGS
  127.         sub b ;dx
  128.         ld b,a
  129.        else
  130.         SUB E
  131.         LD E,A
  132.        endif
  133.         endm
  134.  
  135.         macro NEGDY
  136.         XOR A
  137.        if NEWREGS
  138.         sub h ;dy
  139.         ld h,a
  140.        else
  141.         SUB D
  142.         LD D,A
  143.        endif
  144.         endm
  145.  
  146.         macro CHECKMASK
  147.        if NEWREGS
  148. ;l=y, de=x (00XXXXXX XXXXxxxx) (ст. биты X использовать только для разных фаз стоячих червей)
  149.         push hl
  150.          ld a,d ;xhigh>>2
  151.          ld h,TMASKLN/256
  152.          add a,(hl)
  153.          inc h
  154.          ld h,(hl)
  155.          ld l,a
  156.         jr nc,$+3
  157.         inc h
  158.          ld a,(hl) ;mask byte
  159.          ld l,e ;xlow>>2
  160.          ld h,TABROLL/256
  161.          and (hl) ;bit(x)
  162.         pop hl
  163.        else
  164. ;l=xhigh, c=xlow (XXXXXXXX XXx?????), h=y
  165.         push hl
  166.          ld a,c ;xlow
  167.          srl l
  168.          rra
  169.          srl l
  170.          rra
  171.          ex af,af' ;' ;xlow>>2
  172.         ld a,l ;xhigh>>2
  173.         LD L,h ;y
  174.         LD H,TMASKLN/256
  175.         ADD A,(HL)
  176.         INC H
  177.         LD H,(HL)
  178.         LD L,A
  179.        JR NC,$+3
  180.        INC H
  181.          ex af,af' ;' ;xlow>>2
  182.          LD h,(HL) ;mask byte
  183.          ld l,a ;xlow>>2
  184.          ld a,h ;mask byte
  185.          LD H,TABROLL/256
  186.          AND (HL) ;bit(x)
  187.         pop hl
  188.        endif
  189.         endm
  190.        
  191.         macro CHECKX deadaddr
  192.        if NEWREGS
  193.         ld a,d ;x HSB
  194.        else
  195.         LD A,L ;x HSB
  196.        endif
  197.         CP XWID
  198.         JP NC,deadaddr;WMDEAD
  199.         endm
  200.  
  201. WRMOVEQ
  202.        pop hl
  203.         RET
  204. WRMOVE
  205.         ld hl,WORMXY
  206.        call SetPgMask
  207. DOGRAVa=$+1
  208.         LD A,0
  209.         ADD A,64
  210.         LD (DOGRAVa),A
  211.         SBC A,A
  212.         and 20 ;"inc d"
  213.         LD (WMGRAV_patch),A
  214. WM0
  215.         GETCOORDS
  216.        ld a,d ;dy
  217.        cp SPRLIST_PRINTED
  218.        jp z,NEWSPD_nogravity;WM0 ;стоячий червь (уже напечатанный) или пустышка
  219.        cp SPRLIST_END
  220.        jr z,WRMOVEQ ;конец списка
  221.        cp SPRLIST_STAYING
  222.        jp z,NEWSPD_nogravity;WM0 ;стоячий червь или пустышка
  223.         ADDCOORDS
  224.         BIT 7,D
  225.         jp NZ,WMGOUP
  226.         JP C,WMDEAD
  227. ;движение вниз
  228.         CHECKX WMDEAD
  229.         CHECKMASK
  230.         JP Z,NEWSPD ;проходимо, выходим с новыми координатами
  231.         REGETCOORDS
  232.         NEGDX ;непроходимо, делаем dx=-dx
  233.         ADDCOORDS
  234.         JP C,WMDEAD
  235.         CHECKX WMDEAD
  236.         CHECKMASK
  237.         JP Z,NEWSPD_rotate ;проходимо, выходим с новыми координатами
  238. ;с dx=-dx тоже непроходимо
  239.          REGETCOORDS
  240.         DEC d ;делаем dy=1 или останавливаем, если уже dy=1
  241.         LD de,256
  242.         jp nz,NEWSPD_nogravity
  243.         ld a,c
  244.         and 7
  245.         jp nz,NEWSPD_nogravity;nostoprot
  246.         ld a,c
  247.         and 0xe8 ;8=right
  248.         ;or 0;16
  249.         ld c,a
  250. ;nostoprot
  251.         LD de,SPRLIST_STAYING*256 ;когда напечатается, будет e!=0
  252.        jp NEWSPD_nogravity
  253. WMGOUP
  254. ;движение вверх
  255.         jp NC,WMDEAD
  256.         CHECKX WMDEAD
  257.         CHECKMASK
  258.         JP Z,NEWSPD ;проходимо, выходим с новыми координатами
  259.         REGETCOORDS
  260.         NEGDX ;непроходимо, делаем dx=-dx
  261.         ADDCOORDS
  262.         jp NC,WMDEAD
  263.         CHECKX WMDEAD
  264.         CHECKMASK
  265.         JP Z,NEWSPD ;проходимо, выходим с новыми координатами
  266.         REGETCOORDS
  267.          NEGDX ;dx как было
  268.         ld d,0;NEGDY ;непроходимо, делаем dy=-dy (отскочили от потолка)
  269.         ADDCOORDS
  270.         ;JR  C,WMDEAD
  271.         CHECKX WMDEAD
  272.         CHECKMASK
  273.         JR Z,NEWSPD_rotate ;проходимо, выходим с новыми координатами
  274.         REGETCOORDS
  275.         LD de,0 ;с dy=-dy тоже непроходимо, делаем dx=0, dy=0
  276.         ;JR NEWSPDgode
  277. NEWSPD
  278. WMGRAV_patch=$
  279.         INC d ;/nop ;dy
  280. NEWSPD_nogravity
  281.        bit 4,c
  282.        jr z,NEWSPD_skiprot
  283.         ld a,c
  284.         inc a
  285.         xor c
  286.         and 7
  287.         xor c
  288.         ld c,a
  289. NEWSPD_skiprot
  290.         PUTCOORDS
  291.         JP WM0
  292.  
  293. NEWSPD_rotate
  294.         ld a,c
  295.         and 0xe8 ;8=right
  296.         or 16
  297.         ld c,a
  298.        ;set 4,c
  299.         jp NEWSPD
  300.  
  301. WMDEAD
  302.       if 1
  303.       pop hl
  304.       push hl
  305.        ld a,l
  306.        add a,4
  307.        ld l,a
  308.       else
  309.         ld hl,0
  310.         add hl,sp
  311.         LD (WMsp),HL
  312.        ld d,SPRLIST_STAYING ;don't move
  313.        push de
  314.        ld e,INVISIBLEX ;invisible x
  315.        push de
  316.        ;ld a,-1
  317.        ;push af ;пустышка
  318.       endif
  319.        ld a,b
  320.        cp sprmine_0/256
  321.        jp z,WMDEAD_noworm
  322.         ld h,0
  323.         add hl,hl
  324.         LD DE,NAMES
  325.         ADD HL,DE ;name+12
  326.       if 1
  327.       else
  328.         LD SP,iy
  329.       endif
  330.         CALL MTIDEAD
  331. WMDEAD_noworm
  332.       if 1
  333.        ld d,SPRLIST_STAYING ;don't move
  334.        ld l,INVISIBLEX ;invisible x
  335.        jp NEWSPD_nogravity
  336.       else
  337. WMsp=$+1
  338.         LD SP,0
  339.        JP WM0
  340.       endif
  341.  
  342. ControlCurWorm ;в это время logic вызывать не надо
  343.         ld a,(cursorkeys) ;11LRDUef cursor
  344.         ld b,a
  345.         ld hl,crossalpha ;-64..+64 вправо (-64 самый нижний)
  346.         bit 2,b
  347.         jr nz,ControlCurWorm_noup
  348.         ld a,(hl)
  349.         add a,64
  350.         jp m,ControlCurWorm_noup
  351.         inc (hl)
  352. ControlCurWorm_noup
  353.         bit 3,b
  354.         jr nz,ControlCurWorm_nodown
  355.         ld a,(hl)
  356.         add a,64-1
  357.         jp m,ControlCurWorm_nodown
  358.         dec (hl)
  359. ControlCurWorm_nodown
  360.         ld hl,(curwormxy)
  361.         bit 5,b
  362.         jr nz,ControlCurWorm_noleft
  363.         call UnDrawCurWorm_ifprinted ;nz=not printed
  364.         ret nz
  365.         res 3,(hl)
  366.         ret
  367. ControlCurWorm_noleft
  368.         bit 4,b
  369.         jr nz,ControlCurWorm_noright
  370.         call UnDrawCurWorm_ifprinted ;nz=not printed
  371.         ret nz
  372.         set 3,(hl)
  373.         ret
  374. ControlCurWorm_noright
  375.  
  376.         bit 1,b
  377.         ret nz ;no jump
  378.  
  379.         call UnDrawCurWorm_ifprinted ;nz=not printed
  380.         ret nz
  381.  
  382.         GETCOORDS
  383.         ld d,-5 ;dy
  384.         ld e,1 ;dx
  385.         bit 3,c
  386.         jr nz,$+5
  387.          dec d ;NEWREGS=0
  388.          ld e,-1 ;dx
  389.         PUTCOORDS
  390.         call DrawCurWormData
  391.        ld a,STATE_FLYCURWORM
  392.        ld (gamestate),a
  393.         ret
  394.  
  395. WormsVsMines
  396.         ret
  397.  
  398. StayingWormsVsMovingWorms ;столкновение летящего со стоящим
  399.         ret
  400.        
  401. CheckFlyingWorms
  402. ;проверить, есть ли живые не стоящие (логика не дожна зависеть от разницы STAYING/PRINTED!)
  403. ;z=нету
  404.         ld hl,WORMXY
  405. CheckFlyingWorms0
  406.         ;POP BC ;SPRITE (lsb=xlow*64;32)
  407.         ;POP HL ;COORDS
  408.         ;POP DE ;SPEED
  409.         inc l
  410.         inc l
  411.         ld a,(hl) ;xhigh
  412.         inc l
  413.         inc l
  414.         inc l
  415.        cp XWID
  416.        jr nc,CheckFlyingWorms_skip
  417.         ld a,(hl) ;dy
  418.         cp SPRLIST_END
  419.         ret z
  420.         cp SPRLIST_PRINTED
  421.         jr z,CheckFlyingWorms_skip
  422.         cp SPRLIST_STAYING
  423.         ret nz
  424. CheckFlyingWorms_skip
  425.         inc l
  426.         jr CheckFlyingWorms0
  427.