?login_element?

Subversion Repositories NedoOS

Rev

Rev 583 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
73 Alone 1
        DEVICE ZXSPECTRUM128
2
        include "../../_sdk/sys_h.asm"
3
 
344 alone 4
scrbuf=0xe000 ;  0x800
170 demige 5
tilemap=0xdd00 ;0x300
344 alone 6
collisionmap=0xda00 ;0x300 (।  ~20  ࠥ)
7
validmap=0xfc00 ;0x300 (।  ~20  ࠥ)
8
VALID0=0xfb ;,   
9
VALID1=0x80 ;,  , ⠬    楤
73 Alone 10
VALID00=VALID0+256*VALID0
11
VALID01=VALID0+256*VALID1
12
VALID10=VALID1+256*VALID0
13
VALID11=VALID1+256*VALID1
14
validmaplinesize=32
344 alone 15
validmapwid=validmaplinesize-2 ;  ப  validmapnext
73 Alone 16
 
17
emptyattr=7
18
 
19
fieldwid=10
20
fieldhgt=8
21
fieldx=0
22
fieldy=0
23
 
24
coordsfactor=4
25
 
26
leftwallx=0
27
topwally=0
28
rightwallx=fieldwid*24*coordsfactor
29
bottomwally=fieldhgt*24*coordsfactor
30
 
170 demige 31
dir_r=0x09
32
dir_l=0x08
33
dir_u=0x0b
34
dir_d=0x0a
73 Alone 35
 
36
collisionmaplinesize=32
37
collisionmapwid=fieldwid*3
38
collisionmaphgt=fieldhgt*3
39
collisionmapsize=collisionmaplinesize*collisionmaphgt
40
tilemaplinesize=collisionmaplinesize
41
tilemapwid=collisionmapwid
42
tilemaphgt=collisionmaphgt
43
tilemapsize=collisionmapsize
44
 
45
maxemptytile=9
46
 
47
maxobjects=20
48
maxbullets=100
170 demige 49
TERMINATOR=0x80
73 Alone 50
 
51
tanksize=16
344 alone 52
tankdamagesize=11 ;吝 堪
73 Alone 53
tankaimsize=8
54
tankspeed=4 ;2^n!
55
bulletspeed=6
56
bulletenergy=20
57
 
58
startlives=5
59
maxlives=10
60
 
61
;timer=23672
62
 
63
        include "macro.asm"
64
 
65
        org PROGSTART
66
begin
583 alone 67
        OS_HIDEFROMPARENT
73 Alone 68
        ld e,3 ;6912
69
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
70
 
528 alone 71
        ;OS_GETSCREENPAGES
344 alone 72
;de=࠭ 0- ࠭ (d=), hl=࠭ 1- ࠭ (h=)
555 alone 73
        ld a,(user_scr0_high) ;ok
73 Alone 74
        SETPG16K
75
 
76
        ld hl,valid00
77
        ld de,VALID00
78
        ld bc,valid00_size
79
        ldir
80
        ld hl,valid01
81
        ld de,VALID01
82
        ld c,valid01_size
83
        ldir
84
        ld hl,valid10
85
        ld de,VALID10
86
        ld c,valid10_size
87
        ldir
88
        ld hl,valid11
89
        ld de,VALID11
90
        ld c,valid11_size
91
        ldir
92
 
170 demige 93
        ld a,1
94
        ld (nlevel),a
95
 
96
newlevel
73 Alone 97
        call cls
98
        call clscrbuf
99
 
100
        ld a,startlives
101
        ld (lives),a
102
        call prlives
103
 
104
        call initlevel
105
 
106
        call clearvalid
107
        call restoreobjects_clear
108
        call restorebullets_clear
109
 
110
        call prmap
111
        call fillcollisionmap
112
 
1510 alone 113
        OS_GETTIMER ;dehl=timer
73 Alone 114
        ;ld hl,(timer)
115
        ld (oldtimer),hl
116
 
117
loop
118
        call restoreobjects
119
        call restorebullets
74 Alone 120
        ;ld a,2
170 demige 121
        ;out (0xfe),a
73 Alone 122
        call probjlist
74 Alone 123
        ;ld a,4
170 demige 124
        ;out (0xfe),a
73 Alone 125
        call prbulletlist
74 Alone 126
        ;ld a,0
170 demige 127
        ;out (0xfe),a
73 Alone 128
 
129
loopdelay
1510 alone 130
        OS_GETTIMER ;dehl=timer
73 Alone 131
        ;ld hl,(timer)
132
oldtimer=$+1
133
        ld bc,0
134
        ld (oldtimer),hl
135
        ld a,l
136
        sub c
137
        jr z,loopdelay
138
        ld b,a
74 Alone 139
        ;ld a,5
170 demige 140
        ;out (0xfe),a
73 Alone 141
logicloop0
142
        push bc
143
        call control
144
        call animate
145
        call logic
146
        call bulletlogic
74 Alone 147
        ;ld a,1
170 demige 148
        ;out (0xfe),a
73 Alone 149
        call fillcollisionmap
74 Alone 150
        ;ld a,5
170 demige 151
        ;out (0xfe),a
73 Alone 152
        call bulletcollision
153
        pop bc
154
        djnz logicloop0
74 Alone 155
        ;ld a,6
170 demige 156
        ;out (0xfe),a
73 Alone 157
        call prvalid
158
        ;call displaycollisionmap
344 alone 159
;TODO ᤥ -,  ࠣ  ⠫
170 demige 160
        ld a,(nenemies)
161
        or a
162
        jp nz,loop
163
        ld hl,nlevel
164
        inc (hl)
165
        jp newlevel
73 Alone 166
 
167
initlevel
168
        call genmap
169
 
170
        ld ix,objlist
171
        call genobj_terminate
172
        ld ix,bulletlist
173
        call genbullet_terminate
174
 
170 demige 175
        ld de,0x0010 ;x
176
        ld hl,0x02b0 ;y
73 Alone 177
        ld bc,params_tank
178
        ld a,1 ;a=dir
179
        call genobj
180
 
170 demige 181
        ld a,(nlevel)
182
        inc a
183
        ld b,a
184
initlevel_addenemies0
185
        push bc
186
        ;ld de,0x0010 ;x = 0x0010..0x0370
187
        call rndxcoord ;out: hl=x
188
        ex de,hl
189
        ld hl,0x0010 ;y
73 Alone 190
        ld bc,params_tanke
191
        ld a,2 ;a=dir
192
        call genobj
170 demige 193
        ld hl,nenemies
194
        inc (hl)
73 Alone 195
 
170 demige 196
        if 1==0
197
        ld de,0x0370 ;x
198
        ld hl,0x0010 ;y
73 Alone 199
        ld bc,params_tanke
200
        ld a,2 ;a=dir
201
        call genobj
170 demige 202
        ld hl,nenemies
203
        inc (hl)
204
        endif
205
        pop bc
206
        djnz initlevel_addenemies0
73 Alone 207
reter        
208
        ret
209
 
210
attrbox  
211
;bc=yx
344 alone 212
;a=䮭
213
;d=y न  孥 㣫
214
;= न  孥 㣫
170 demige 215
;0x5800+xcoordredbox+(32*ycoordredbox)
73 Alone 216
        ld l,d  ;y
217
        ld h,0        
218
        add hl,hl    
219
        add hl,hl    
220
        add hl,hl    
221
        add hl,hl    
222
        add hl,hl
170 demige 223
        ld d,0x58
73 Alone 224
        add hl,de ;x
225
attrbox_lines
226
        ld e,l
227
        ld d,h  
228
        push bc
229
attrbox_pixels
230
        ld (de),a
231
        inc e
232
        dec c        
233
        jr nz,attrbox_pixels
234
        pop bc
235
        ld de,32
236
        add hl,de    
237
        djnz attrbox_lines
238
        ret
239
 
240
genmap
241
        ld hl,tilemap
242
        ld de,tilemap+1
243
        ld bc,tilemapsize-1
244
        ld (hl),0
245
        ldir
246
 
247
        ld hl,tilemap+(3*tilemaplinesize)
248
        ld b,fieldhgt-2
249
genmaplines
250
        push bc
251
        push hl
252
        ld b,fieldwid
253
genmapline
254
        push bc
255
        push hl
256
        push hl
257
        ld a,b ;1..fieldwid
258
        sub 2 ;n
344 alone 259
        cp fieldwid-2 ;nc=  ࠢ ࠩ
73 Alone 260
        adc a,nblocks+1 ;n + cy + (nblocks+1)
261
        sub b ;n + cy + nblocks - (n+2)
344 alone 262
        ld c,a ;nblocks  nblocks-1
73 Alone 263
        call rnd
264
        ld c,a
265
        ld b,0
266
        ld de,9
267
        call mulbcde
268
        ld bc,blocks
269
        add hl,bc
270
        ex de,hl
271
        pop hl
272
        ld bc,tilemaplinesize-2
273
        dup 3
274
        ld a,(de)
275
        ld (hl),a
276
        inc de
277
        inc hl
278
        ld a,(de)
279
        ld (hl),a
280
        inc de
281
        inc hl
282
        ld a,(de)
283
        ld (hl),a
284
        inc de
285
        add hl,bc
286
        edup
287
        pop hl
288
        inc hl
289
        inc hl
290
        inc hl
291
        pop bc
292
        djnz genmapline
293
        pop hl
294
        ld bc,tilemaplinesize*3
295
        add hl,bc
296
        pop bc
297
        djnz genmaplines
298
        ret
299
 
300
control
301
        GET_KEY
116 alone 302
        cp key_esc
73 Alone 303
        jp z,quit
344 alone 304
        call getkey ;c=%???lrduf (0=)
73 Alone 305
        ld a,c
306
        rra ;f
307
        jr nc,control_noreleasefire
308
        ld a,1
309
        ld (control_firehasbeenreleased),a
310
control_noreleasefire
311
 
344 alone 312
;  ࠡ뢠,   ⮨ । ⪨ ((x&(8*coordsfactor-1)) == 4*coordsfactor, (y&(8*coordsfactor-1)) == 4*coordsfactor)
313
        ld ix,objlist ; ꥪ - 
314
        call checkevencoords ;nz= । ⪨
73 Alone 315
        ret nz
316
 
317
        ld a,c
318
        rra ;f
319
        jr c,control_nofire
344 alone 320
        ;஢ਬ,   ⮣  ,    
73 Alone 321
control_firehasbeenreleased=$+1
322
        ld a,0
323
        or a
344 alone 324
        jr z,control_nofire ; 뫮 ,    
73 Alone 325
        xor a
326
        ld (control_firehasbeenreleased),a
344 alone 327
        ;ld ix,objlist ; ꥪ - 
73 Alone 328
        push bc
329
        call shoot
330
        pop bc
331
control_nofire
332
 
344 alone 333
        ld ix,objlist ; ꥪ - 
334
        ;᫨       ,  ⠭
73 Alone 335
        rr c
336
        ld a,c
337
        cpl
170 demige 338
        and 0x0f
73 Alone 339
        jr nz,control_nokeysreleased
340
        ld a,(ix+obj_anim)
341
        cp ANIM_GO
342
        jr nz,control_nokeysreleased
343
        SETANIM ANIM_STOP
344
control_nokeysreleased
345
 
346
        ld a,c
347
        rra ;u
348
        jr c,control_nou
349
        call goifpossible
350
        ld (ix+obj_dir),0
351
control_nou
352
        rra ;d
353
        jr c,control_nod
354
        call goifpossible
355
        ld (ix+obj_dir),2
356
control_nod
357
        rra ;r
358
        jr c,control_nor
359
        call goifpossible
360
        ld (ix+obj_dir),1
361
control_nor
362
        rra ;l
363
        jr c,control_nol
364
        call goifpossible
365
        ld (ix+obj_dir),3
366
control_nol
367
 
368
        ret
369
 
370
goifpossible
371
        ld c,a
372
        ld a,(ix+obj_anim)
373
        cp ANIM_APPEAR
374
        jr nz,$+4
375
        ld a,ANIM_STOP
376
        cp ANIM_STOP
377
        ld a,c
344 alone 378
        ret nz ; ⮨, ⠪    
73 Alone 379
        SETANIM ANIM_GO
380
        ret
381
 
382
checkevencoords
344 alone 383
;out: nz= । ⪨
73 Alone 384
        ld a,(ix+obj_x)
385
        and 8*coordsfactor-1
386
        cp 4*coordsfactor
387
        ret nz
388
        ld a,(ix+obj_y)
389
        and 8*coordsfactor-1
390
        cp 4*coordsfactor
391
        ret
392
 
393
shoot
394
        SETANIM ANIM_SHOOT
395
        ld c,(ix+obj_dir)
396
        ld b,0
397
        ld hl,tankbulletcoords
398
        add hl,bc
399
        add hl,bc
400
        ld a,(hl) ;dx
401
        ld c,a ;%sxxxxxxx
402
        rla    ;%xxxxxxx?, CY=s
403
        sbc a,a;%ssssssss
404
        ld b,a ;dx
405
        inc hl
406
        ld a,(hl) ;dy
407
        GETXDE_YHL
408
        ex de,hl ;hl=x
409
        add hl,bc ;x+dx
410
        push hl ;x+dx
411
        push de ;y
412
        ld e,a
413
        rla
414
        sbc a,a
415
        ld d,a ;dy
416
        pop hl ;y
417
        add hl,de ;hl = y+dy
418
        pop de ;de = x+dx
419
        ld a,(ix+obj_dir) ;a=dir
420
        ld bc,params_bullet
421
curbulletlistend=$+2
422
        ld ix,bulletlist
423
        call genobjorbullet
424
genbullet_terminate
425
        ld bc,objterminator
426
        ld (ix+obj_objaddr),c
427
        ld (ix+(obj_objaddr+1)),b
428
        ld (ix+(obj_x+1)),TERMINATOR
429
        ld (curbulletlistend),ix
430
        ret
431
 
432
genobjorbullet
433
;de=x
434
;hl=y
435
;bc=params (obj(16),energy(8),speed(8))
436
;a=dir
437
        ld (ix+obj_dir),a
438
        PUTXDE_YHL
439
        SETANIM ANIM_APPEAR
440
        ld (ix+obj_delaycounter),1
441
        ld (ix+obj_gundelaycounter),0
442
        ld a,(bc)
443
        ld (ix+obj_objaddr),a
444
        inc bc
445
        ld a,(bc)
446
        ld (ix+(obj_objaddr+1)),a
447
        inc bc
448
        ld a,(bc)
449
        ld (ix+obj_energy),a
450
        inc bc
451
        ld a,(bc)
452
        ld (ix+obj_speed),a
453
        ld bc,objsize
454
        add ix,bc
455
        ret
456
 
457
genobj
458
;de=x
459
;hl=y
460
;bc=params (obj(16),energy(8),speed(8))
461
;a=dir
462
curobjlistend=$+2
463
        ld ix,objlist
464
        call genobjorbullet
465
genobj_terminate
466
        ld bc,objterminator
467
        ld (ix+obj_objaddr),c
468
        ld (ix+(obj_objaddr+1)),b
469
        ld (ix+(obj_x+1)),TERMINATOR
470
        ld (curobjlistend),ix
471
        ret
472
 
473
animate
474
        ld ix,objlist-objsize
475
animate0_prepareregs
476
        ld a,TERMINATOR
477
        ld bc,objsize
478
animate0
479
        add ix,bc
480
animate0_afterdel
481
        cp (ix+(obj_x+1))
482
        ret z
483
        dec (ix+obj_animcounter)
484
        jp nz,animate0
344 alone 485
        ;⥪ 䠧 樨 稫, 饬 ᫥
73 Alone 486
        ld l,(ix+obj_objaddr)
344 alone 487
        ld h,(ix+(obj_objaddr+1)) ;hl= ⥫ ꥪ ( 砫  㪠⥫  ᯨ᮪ 権)
73 Alone 488
        ld a,(hl)
489
        inc hl
490
        ld h,(hl)
344 alone 491
        ld l,a ;hl=㪠⥫  ᯨ᮪ 権
492
        ld e,(ix+obj_anim) ; 樨
73 Alone 493
        ld d,0
494
        add hl,de
495
        add hl,de
496
        ld a,(hl)
497
        inc hl
498
        ld h,(hl)
344 alone 499
        ld l,a ;hl=㪠⥫  
500
        ld e,(ix+obj_animphase) ; 䠧 樨
501
        inc e ;᫥ 䠧 樨
73 Alone 502
        ld (animate_pointer),hl
503
        add hl,de
504
        add hl,de
505
        add hl,de
344 alone 506
        ld a,(hl) ;६ 䠧
507
        or a ;᫨ 0,    樨
73 Alone 508
        jr nz,animate_noend
509
        inc hl
344 alone 510
        ld a,(hl) ;० 横 (0=室  㫥 , 1=横 , 2=㤠)
511
        cp 2 ;ਧ ANIMENDDIE
73 Alone 512
        jr z,animate_delete
513
        or a
514
        jr nz,animate_no0
344 alone 515
        ld (ix+obj_anim),a ;0- 
73 Alone 516
animate_no0
517
        ld e,0
518
animate_pointer=$+1
519
        ld hl,0
520
        add hl,de
521
        add hl,de
522
        add hl,de
344 alone 523
        ld a,(hl) ;६ 䠧
73 Alone 524
animate_noend
525
        ld (ix+obj_animcounter),a
344 alone 526
        ld (ix+obj_animphase),e ;᫥ 䠧 樨
73 Alone 527
        jp animate0_prepareregs
528
 
529
animate_delete
530
        push ix
531
        pop hl
532
        ld de,objlist
533
        or a
534
        sbc hl,de
535
        jr z,animate_delete_player
536
        ld hl,curobjlistend
344 alone 537
        call delobj ;㥬  ix+objsize  ix
170 demige 538
 
539
        ld hl,nenemies
540
        dec (hl)
541
 
73 Alone 542
        ld a,TERMINATOR
543
        ld bc,objsize
544
        jp animate0_afterdel
545
animate_delete_player
546
        call decreaselives
547
        call rndbottomcoords ;bc=x, de=y
548
        SETANIM ANIM_APPEAR
549
        ld (ix+obj_dir),1 ;a=dir
550
        jp animate0_prepareregs
551
 
552
bulletlogic
553
        ld ix,bulletlist-objsize
554
        jr logic0
555
logic
556
        ld ix,objlist-objsize
557
logic0
558
        ld bc,objsize
559
        add ix,bc
560
logic0_afterdel
561
        ld l,(ix+obj_objaddr)
344 alone 562
        ld h,(ix+(obj_objaddr+1)) ;hl= ⥫ ꥪ ( 砫  㪠⥫  ᯨ᮪ 権)
73 Alone 563
        inc hl
564
        inc hl
344 alone 565
        jp (hl) ;hl= ࠡ稪 ꥪ
73 Alone 566
 
567
rndbottomcoords
568
;out: bc=x, de=y
569
rndbottomcoords_retry
170 demige 570
        call rndxcoord
571
        ex de,hl
572
        ld hl,0x02b0 ;y
573
        PUTXDE_YHL
344 alone 574
        call checkobstacles_tank ;nc=९⢨
170 demige 575
        jr nc,rndbottomcoords_retry
576
        ret
577
 
578
rndxcoord
579
;out: hl=x
73 Alone 580
        ld c,fieldwid
581
        call rnd
582
        ld c,a
583
        ld b,0
584
        ld de,8*coordsfactor*3
585
        call mulbcde
586
        ld bc,4*coordsfactor
587
        add hl,bc ;x
588
        ret
589
 
590
delobj
344 alone 591
;hl= 㪠⥫   ᯨ᪠ ( ନ)
592
;㥬  ix+objsize  ix
73 Alone 593
        ld (delobj_curlistend1),hl
594
        ld (delobj_curlistend2),hl
595
        ld c,(hl)
596
        inc hl
344 alone 597
        ld b,(hl) ;㪠⥫   ᯨ᪠ ( ନ)
73 Alone 598
        ld hl,objsize
599
        add hl,bc
600
        ld b,h
344 alone 601
        ld c,l ;㪠⥫   ᯨ᪠ (᫥ ꥪ-ନ)
73 Alone 602
        ld d,hx
603
        ld e,lx ;de=ix
604
        ld a,e
605
        add a,objsize
606
        ld l,a
607
        adc a,d
608
        sub l
609
        ld h,a ;hl=ix+objsize
610
        ld a,c
611
        sub l
612
        ld c,a
613
        ld a,b
614
        sbc a,h
615
        ld b,a ;bc=objlistend-hl
616
        ld a,b
617
        or c
344 alone 618
        ret z ;祬 㤠塞 ନ ᫥   ??? TODO
619
        ldir ;㥬  ᫥騥 ꥪ,  ନ
73 Alone 620
delobj_curlistend1=$+1
621
        ld hl,(curobjlistend)
622
        ld bc,-objsize
623
        add hl,bc
624
delobj_curlistend2=$+1
625
        ld (curobjlistend),hl
626
        push ix
627
        call fillcollisionmap
628
        pop ix
629
        ret
630
 
631
movetank
632
        ld a,(ix+obj_anim)
633
        cp ANIM_GO
634
        ret nz
635
moveobj
636
        GETXDE_YHL
637
        ld b,(ix+obj_speed)
638
        ld c,(ix+obj_dir)
639
        inc c
640
        dec c
641
        call z,moveobj_u
642
        dec c
643
        call z,moveobj_r
644
        dec c
645
        call z,moveobj_d
646
        dec c
647
        call z,moveobj_l
648
        PUTXDE_YHL
649
        ret
650
moveobj_u
651
        dec hl
652
        djnz $-1
653
        ret
654
moveobj_r
655
        inc de
656
        djnz $-1
657
        ret
658
moveobj_d
659
        inc hl
660
        djnz $-1
661
        ret
662
moveobj_l
663
        dec de
664
        djnz $-1
665
        ret
666
 
667
objtank
668
        dw anims_tank
669
objtank_move
670
        GETXDE_YHL
671
        push de
672
        push hl
673
        call movetank
344 alone 674
        call checkobstacles_tank ;nc=
73 Alone 675
        jr nc,objtank_collided
344 alone 676
        ld c,tanksize ;ࠧ
677
        call checkwalls ;nc=⥭
678
        ;TODO - ⪭ checkwalls  moveobj,     
73 Alone 679
objtank_collided
680
        pop hl
681
        pop de
344 alone 682
        jp c,logic0 ; ⥭
683
        PUTXDE_YHL ;⥭ - ⠭  न
73 Alone 684
        jp logic0
685
 
686
objtanke
687
        dw anims_tanke
688
        dec (ix+obj_gundelaycounter)
689
        jr nz,objtanke_nogundelaystop
690
        inc (ix+obj_gundelaycounter)
691
        ld a,(ix+obj_anim)
692
        cp ANIM_PREPARESHOOT
693
        jr nz,objtanke_noshoot
694
        push ix
695
        call shoot
696
        pop ix
697
        ld (ix+obj_gundelaycounter),50
698
        jr objtanke_stop
699
objtanke_noshoot
700
objtanke_nogundelaystop
701
        ld a,(ix+obj_anim)
702
        cp ANIM_DIE
703
        jp z,objtanke_nologic
344 alone 704
;  ࠡ뢠,   ⮨ । ⪨ ((x&(8*coordsfactor-1)) == 4*coordsfactor, (y&(8*coordsfactor-1)) == 4*coordsfactor)
705
        call checkevencoords ;nz= । ⪨
73 Alone 706
        jp nz,objtanke_nologic
344 alone 707
;  ﭨ, ⮬ 砩 塞 ࠢ  
73 Alone 708
        dec (ix+obj_delaycounter)
709
        jr nz,objtanke_nonewmove
710
        ld (ix+obj_delaycounter),20
711
        ld c,5
712
        call rnd
713
        cp 4
714
        jr z,objtanke_stop
715
        ld (ix+obj_dir),a
716
        SETANIM ANIM_GO
717
        jr objtanke_nonewmove
718
objtanke_stop
719
        SETANIM ANIM_STOP
720
objtanke_nonewmove
344 alone 721
;᫨   न   襩 (x-(tanksize/2*coordsfactor) > xe >= x+(tanksize/2*coordsfactor)),  , ঠ  ५
73 Alone 722
        GETXDE_YHL
723
        push hl ;y
344 alone 724
        ld hl,(objlist+obj_x) ; न
73 Alone 725
        ld bc,-(tankaimsize/2*coordsfactor)
726
        add hl,bc
727
        or a
344 alone 728
        sbc hl,de ; -tanksize*coordsfactor..-1
73 Alone 729
        ld bc,tankaimsize*coordsfactor
344 alone 730
        add hl,bc ;cy=न   襩
73 Alone 731
        pop hl ;y
732
        ex de,hl ;de=y, hl=x
733
        jr z,$+4
734
        jr nc,objtanke_noprepareshootx
344 alone 735
        ld hl,(objlist+obj_y) ; न
73 Alone 736
        or a
344 alone 737
        sbc hl,de ;y >= ye? ⮣ d,  u
73 Alone 738
        ld a,2 ;d
739
        jr nc,$+4 ;y >= xe
740
        ld a,0 ;u
741
        ld (ix+obj_dir),a
742
        jr objtanke_prepareshoot
743
objtanke_noprepareshootx
744
        push hl ;x
344 alone 745
        ld hl,(objlist+obj_y) ; न
73 Alone 746
        ld bc,-(tankaimsize/2*coordsfactor)
747
        add hl,bc
748
        or a
344 alone 749
        sbc hl,de ; -tanksize*coordsfactor..-1
73 Alone 750
        ld bc,tankaimsize*coordsfactor
344 alone 751
        add hl,bc ;cy=न   襩
73 Alone 752
        pop de ;x
753
        jr z,$+4
754
        jr nc,objtanke_noprepareshoot
344 alone 755
        ld hl,(objlist+obj_x) ; न
73 Alone 756
        or a
344 alone 757
        sbc hl,de ;x >= xe? ⮣ r,  l
73 Alone 758
        ld a,1 ;r
759
        jr nc,$+4 ;x >= xe
760
        ld a,3 ;l
761
        ld (ix+obj_dir),a
762
objtanke_prepareshoot
763
        SETANIM ANIM_PREPARESHOOT
764
        ;ld (ix+obj_delaycounter),1
765
objtanke_noprepareshoot
766
objtanke_nologic
767
        jp objtank_move
768
 
769
objbullet
770
        dw 0
771
        call moveobj
344 alone 772
        ld c,0 ;ࠧ
773
        call checkwalls ;nc=⥭
774
        jp c,logic0 ; ⥭
73 Alone 775
        ld hl,curbulletlistend
344 alone 776
        call delobj ;㥬  ix+objsize  ix
73 Alone 777
        ld bc,-objsize
778
        add ix,bc
779
        jp logic0
780
 
781
bulletcollision
782
        ld ix,bulletlist-objsize
783
        ld ly,-(128-1)
784
bulletcollision0
785
        dec ly
786
        ld bc,objsize
787
        add ix,bc
788
bulletcollision0_afterdel
789
        ld a,(ix+(obj_x+1))
790
        cp TERMINATOR
791
        ret z
792
        GETXDE_YHL
793
        call calctilemapaddr_de_hl
794
        ld a,(hl)
795
        cp maxemptytile+1
796
        jr nc,bulletcollision_collided
797
        call calccollisionmapaddr
798
        ld a,(hl)
344 alone 799
        add a,ly ; ⥪饩 㫨 ;CY=1  ᮢ
73 Alone 800
        call nz,checkbulletcollision
344 alone 801
        jp c,bulletcollision0 ; 
73 Alone 802
bulletcollision_delete
803
        ld hl,curbulletlistend
344 alone 804
        call delobj ;㥬  ix+objsize  ix
73 Alone 805
        jp bulletcollision0_afterdel
806
bulletcollision_collided
807
        ;ld c,l
808
        GETXDE_YHL
809
        push hl
810
        ex de,hl
811
        ld a,(ix+obj_dir)
812
        rra ;nc=vertical direction
813
        ccf
344 alone 814
        call divmul3 ;hl=x ⪨ 
815
        ex (sp),hl ;࠭ x ⪨  ;hl=y
73 Alone 816
        ld a,(ix+obj_dir)
817
        rra ;nc=vertical direction
344 alone 818
        call divmul3 ;hl=y ⪨ 
819
        pop bc ;x ⪨ 
820
        ld b,l ;y ⪨ 
73 Alone 821
        ld a,c
822
        call calctilemapaddr_a_l
823
        ld a,(ix+obj_dir)
824
        dec a
825
        jr z,objbullet_collided_ver ;r
826
        dec a
827
        jr z,objbullet_collided_hor ;d
828
        dec a
829
        jr z,objbullet_collided_ver ;l
830
                                    ;u
831
objbullet_collided_hor
832
        call degradetile
833
        inc c
834
        inc hl
835
        call degradetile
836
        inc c
837
        inc hl
838
        call degradetile
839
        jp bulletcollision_delete
840
objbullet_collided_ver
841
        ld de,tilemaplinesize
842
        call degradetile
843
        inc b
844
        add hl,de
845
        call degradetile
846
        inc b
847
        add hl,de
848
        call degradetile
849
        jp bulletcollision_delete
850
 
851
divmul3
344 alone 852
;᫨ CY=1,      㣫塞  3
853
;    
73 Alone 854
        ld de,8*coordsfactor
344 alone 855
        jp nc,divhlde ;hl=x(y) ⪨  ( 㣫)
73 Alone 856
        ld de,8*coordsfactor*3
344 alone 857
        call divhlde ;hl=x(y) ⪨ 
73 Alone 858
        ld c,l
859
        ld b,h
860
        add hl,hl
861
        add hl,bc
344 alone 862
        ret ;hl=x(y) ⪨ 
73 Alone 863
 
864
degradetile
344 alone 865
;bc=yx ⪨ 
73 Alone 866
;hl=tilemap+
867
        ;push bc
868
        push de
869
        ;push hl
870
        call degradetile_changetile
871
        call calcscrbufaddr ;de=scrbuf+
872
        call restoretile
873
        ;pop hl
874
        pop de
875
        ;pop bc
876
        ret
877
degradetile_changetile
878
        ld a,(hl)
879
        cp tilem
880
        ret z
881
        cp tileb
882
        ld (hl),tile0
883
        ret z
884
        cp tilec
885
        ld (hl),tileb
886
        ret z
887
        ld (hl),tile0
888
        ret
889
 
890
objterminator
891
        dw 0
892
        ret
893
 
894
decreaselives
895
lives=$+1
896
        ld a,0
897
        dec a
898
        ld (lives),a
899
        push af
900
        call prlives
901
        pop af
902
        ret nz
903
 
904
gameover    
905
fieldEx=32
906
fieldEy=24
907
centr=(fieldEx/2)-(10/2)+(256*fieldEy/2)
908
;bc=yx
344 alone 909
;a=䮭
910
;d=y न  孥 㣫
911
;= न  孥 㣫
170 demige 912
;0x5800+xcoordredbox+(32*ycoordredbox)
73 Alone 913
        ld c,12
914
        ld b,3
170 demige 915
        ld de,centr-0x0101
916
        ld a,0x57        
73 Alone 917
        ld (curattr),a
918
        call attrbox
919
        ld hl,endtext
920
        ld bc,centr
921
        call prtext
922
gameoverloop
923
        YIELD
924
        GET_KEY
116 alone 925
        cp key_esc
73 Alone 926
        jr nz,gameoverloop
927
quit
928
        QUIT
929
 
930
endtext
931
        db "Game over!",0
74 Alone 932
 
933
font
934
        incbin "zx.fnt"
73 Alone 935
 
77 Alone 936
        include "collisio.asm"
73 Alone 937
        include "tankgfx.asm"
938
        include "tankdata.asm"
939
        include "math.asm"
940
        include "input.asm"
170 demige 941
 
942
nlevel
943
        db 0 ;1..
944
nenemies
945
        db 0
73 Alone 946
end
947
 
948
reobjlist
949
        ds 2*(maxobjects+1)
950
rebulletlist
951
        ds 2*(maxbullets+1)
952
 
953
objlist
954
        ds objsize*(maxobjects+1)
955
objlistend
956
 
957
bulletlist
958
        ds objsize*(maxbullets+1)
959
bulletlistend
960
 
961
 
289 dimkam 962
        ;display "End=",end
170 demige 963
        ;display "Free after end=",/d,0xc000-end
289 dimkam 964
        ;display "Size ",/d,end-begin," bytes"
73 Alone 965
 
966
        savebin "tank.com",begin,end-begin
967
 
968
        ;LABELSLIST "..\us\user.l"