Subversion Repositories Kolibri OS

Rev

Rev 485 | Rev 3905 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
;
2
;   pipes for menuet {and now kolibri}
3
;   v1.2
4
;   2006 by Mario Birkner
5
;
6
;   l.mod. 27.08.06/15:11
7
;
8
;   Compile with FASM
9
;
10
bgcolor  equ  0x0074744A      ;thx
11
fgcolor  equ  0x00E7C750      ;to
12
fg2color equ  0x00E0B0A0      ;colorref
13
fg3color equ  0x007F7F55
14
btcolor  equ  0x005B6200
15
 
485 heavyiron 16
include '..\..\macros.inc'
205 heavyiron 17
 
18
use32
19
 
20
	       org    0x0
21
 
22
	       db     'MENUET01'	      ; 8 byte id
23
	       dd     0x01		      ; header version
24
	       dd     START		      ; start of code
25
	       dd     I_END		      ; size of image
26
	       dd     0x100000		      ; memory for app
27
	       dd     0x7fff0		      ; esp
28
	       dd     0x0 , 0x0 	      ; I_Param , I_Icon
29
 
30
START:				; start of execution
31
 
32
     call draw_window
33
     call draw_board
34
 
35
still:
36
 
37
    mov  eax,10 		; wait here for event
485 heavyiron 38
    mcall
205 heavyiron 39
 
40
    cmp  eax,1			; redraw request ?
41
     je  red
42
    cmp  eax,2			; key in buffer ?
43
     je  key
44
    cmp  eax,3			; button in buffer ?
45
     je  button
46
 
47
    jmp  still
48
 
49
  red:				; redraw
50
    call draw_window
51
    call draw_board
52
    call draw_message
53
    jmp  still
54
 
55
  key:				; key
56
    mov  eax,2			; just read it and ignore
485 heavyiron 57
    mcall
205 heavyiron 58
    jmp  still
59
  button:			; button
60
    call get_input
61
    jmp  still
62
 
63
 
64
 
65
get_input:
66
pusha
67
    mov  eax,17 		; get id
485 heavyiron 68
    mcall
205 heavyiron 69
 
70
    cmp  ah,1			; button id=1 ?
71
    jne  .noclose
72
 
73
    mov  eax,-1 		; close this program
485 heavyiron 74
    mcall
205 heavyiron 75
  .noclose:
76
    cmp  ah,4
77
    jne  .moderate
78
    mov  [diffic],1
79
    jmp  .enddiffic
80
   .moderate:
81
    cmp  ah,3
82
    jne  .easy
83
    mov  [diffic],3
84
    jmp  .enddiffic
85
   .easy:
86
    cmp  ah,2
87
    jne  .board
88
    mov  [diffic],5
89
   .enddiffic:
90
    mov  [score],0
91
    mov  [speed],40
92
    mov  [level],1
93
    mov  [stat],0
94
    mov  [time],0
95
    call draw_window
96
    call scramble_board
97
    call draw_board
98
    call countdown
99
    call wassermarsch
100
    jmp  .getno
101
  .board:
102
    cmp  [stat],2
103
    jge  .getno
104
    shr  eax,8			; -> 24bit id
105
    cmp  eax,10
106
    jle  .getno
107
    cmp  eax,150
108
    jg	 .getno
109
    sub  eax,10
110
    mov  edi,eax
111
    add   edi,map
112
    cmp   [edi], byte 1
113
    jg	  .nogerade
114
    xor   byte [edi], 1
115
    call  draw_board
116
    jmp   .getno
117
  .nogerade:
118
    cmp   [edi], byte 6
119
    jge   .getno
120
    cmp   [edi], byte 5
121
    jne   .rota
122
    sub   byte [edi],4
123
  .rota:
124
    inc   byte [edi]
125
    call  draw_board
126
  .getno:
127
popa
128
ret
129
;//// end of event detection
130
get_direction:		    ;Setzt Richtungs-Konstanten
131
pusha			    ;IN:
132
mov eax,[esp+28]	    ;eax  -  Richtung IN
133
mov ebx,[esp+16]	    ;ebx  -  Teilchen (Map-Wert)
134
cmp ebx,0		    ;OUT:
135
jne .no0		    ;eax  -  Richtung OUT
136
  cmp eax,14
137
  jne .o0
138
  jmp .setout
139
  .o0:
140
  cmp eax,-14
141
  jne .col
142
  jmp .setout
143
.no0:
144
cmp ebx,1
145
jne .no1
146
  cmp eax,1
147
  jne .o1
148
  jmp .setout
149
  .o1:
150
  cmp eax,-1
151
  jne .col
152
  jmp .setout
153
.no1:
154
cmp ebx,2
155
jne .no2
156
  cmp eax,14
157
  jne .o2
158
  sub eax,13
159
  jmp .setout
160
 .o2:
161
  cmp eax,-1
162
  jne .col
163
  sub eax,13
164
  jmp .setout
165
.no2:
166
cmp ebx,3
167
jne .no3
168
  cmp eax,-14
169
  jne .o3
170
  add eax,15
171
  jmp .setout
172
 .o3:
173
  cmp eax,-1
174
  jne .col
175
  add eax,15
176
  jmp .setout
177
.no3:
178
cmp ebx,4
179
jne .no4
180
  cmp eax,-14
181
  jne .o4
182
  add eax,13
183
  jmp .setout
184
 .o4:
185
  cmp eax,1
186
  jne .col
187
  add eax,13
188
  jmp .setout
189
.no4:
190
cmp ebx,5
191
jne .no5
192
  cmp eax,14
193
  jne .o5
194
  sub eax,15
195
  jmp .setout
196
 .o5:
197
  cmp eax,1
198
  jne .col
199
  sub eax,15
200
  jmp .setout
201
.no5:
202
cmp ebx,6
203
jne .no6
204
  jmp .setout
205
.no6:
206
cmp ebx,7
207
jne .no7
208
  mov eax,14
209
  jmp .setout
210
.no7:
211
cmp ebx,8
212
jne .no8
213
  cmp eax,14
214
  jne .col
215
  mov [stat],1
216
  jmp .setout
217
.no8:
218
cmp ebx,16	  ; cross 2x
219
jne .col
220
  add [score],10  ; + 10 bonus points
221
  jmp .setout
222
.col:
223
xor eax,eax
224
.setout:
225
xor ebx,ebx
226
mov [esp+28],eax
227
mov [esp+16],ebx
228
popa
229
ret
230
 
231
countdown:
232
pusha
233
xor  eax,eax
234
mov  al,[diffic]
235
imul eax,10
236
mov  [time],eax
237
.udown:
238
call show_score
239
mov  ecx,10
240
.down:
241
mov  eax,5
242
mov  ebx,10
485 heavyiron 243
mcall
205 heavyiron 244
mov  eax,11
485 heavyiron 245
mcall
205 heavyiron 246
cmp  eax,1
247
jne  .nored
248
call draw_window
249
call draw_board
250
jmp  .nothing
251
.nored:
252
cmp  eax,3
253
jne  .nothing
254
call get_input
255
.nothing:
256
cmp  [stat],0	      ;bugfix 210806
257
jnz  .exitsub	      ;bugfix 210806
258
dec  ecx
259
jnz  .down
260
dec  [time]
261
jnz   .udown
262
.exitsub:	      ;bugfix 210806
263
popa
264
ret
265
 
266
wassermarsch:
267
pusha
268
   .restart:
269
     mov  esi,map+16	      ;start position
270
     mov  eax, 14	      ;start-richtung
271
   .findway:
272
     movzx ebx, byte [esi]
273
     call  get_direction
274
     test  eax,eax
275
     jz   .collision
276
     push  eax
277
      xor   eax,eax
278
      mov   al,6
279
      sub   al,[diffic]
280
      add   [score],eax 	 ;points/item = 6 - difficulty
281
      mov   ecx,dword [speed]
282
      add   byte [esi],10
283
      .down:
284
      mov   eax,5
285
      mov   ebx,2
485 heavyiron 286
      mcall
205 heavyiron 287
      mov   eax,11
485 heavyiron 288
      mcall
205 heavyiron 289
      cmp   eax,1
290
      jne   .nored
291
      call  draw_window
292
      .nored:
293
      cmp   eax,3
294
      jne   .noevnt
295
      call  get_input
296
      .noevnt:
297
      dec   ecx
298
      jnz   .down
299
     pop   eax
300
 
301
     add   esi,eax
302
     call  draw_board
303
     call  show_score
304
     jmp   .findway
305
   .collision:
306
    cmp [stat],1
307
    jne .loose
308
    call draw_message
309
    mov   eax,5
310
    mov   ebx,500
485 heavyiron 311
    mcall
205 heavyiron 312
    mov [stat],0
313
    inc [level]
314
    cmp [speed],6		 ;waterflowdelay < 6 ?
315
    jle .skipsub
316
    sub [speed],2
317
   .skipsub:
318
    call draw_window
319
    call scramble_board
320
    call draw_board
321
    call countdown
322
    jmp  .restart
323
   .loose:
324
    mov  [stat],2
325
    call draw_message
326
popa
327
ret
328
 
329
show_score:
330
pusha
331
mov  eax,13			 ;clear time and score area
332
mov  ebx,50 shl 16 +15
333
mov  ecx,395 shl 16 +15
334
mov  edx,bgcolor
485 heavyiron 335
mcall
205 heavyiron 336
add  ebx,60 shl 16 + 20
485 heavyiron 337
mcall
205 heavyiron 338
add  ebx,80 shl 16
485 heavyiron 339
mcall
205 heavyiron 340
mov  eax,47
341
mov  ebx,0x20000
342
mov  ecx,[time]
343
mov  edx,50*65536+398
344
mov  esi,fg2color
485 heavyiron 345
mcall
205 heavyiron 346
mov  ebx,0x50000
347
mov  ecx,[score]
348
add  edx,60 shl 16
485 heavyiron 349
mcall
205 heavyiron 350
mov  ebx,0x20000
351
mov  ecx,[level]
352
add  edx,80 shl 16
485 heavyiron 353
mcall
205 heavyiron 354
 
355
popa
356
ret
357
 
358
 
359
 
360
scramble_board:
361
pusha
362
mov edi,map+16 ;startpunkt
363
mov eax,7      ;wieder-
364
stosb	       ;herstellen
365
 
366
mov ebx, 0x00000007  ;modul         m max-wert
367
.loop_through:
368
mov   esi,edi
369
lodsb
370
cmp   eax, 9
371
 je   .skip
372
inc   eax
373
xor   edx, edx
374
div   ebx	    ;modulo -> edx
375
mov   eax, edx
376
cmp   eax,6
377
jne   .skip
378
dec   [half]
379
movzx eax, byte [half]
380
jnz   .skip
381
mov   [half], byte 7
382
.skip:
383
stosb
384
cmp edi,map+125 ;endpunkt erhalten
385
jge .exit
386
jmp .loop_through
387
.exit:
388
mov  eax,8
389
stosb
390
popa
391
ret
392
 
393
 
394
gen_image:
395
pusha
396
    xor   ebx,ebx	   ;default: kein wasser
397
    movzx eax,byte [map]   ;erstes byte der map lesen (position)
398
    inc   byte [map]	   ;position inkrementieren
399
    add   eax,map	   ;zur position die map-adresse addieren
400
    movzx  esi,byte [eax]
401
    cmp   esi,10
402
    jl	  .nowater
403
    sub   esi,10	  ;map-werte+10 sind mit wasser gefuellt
404
    mov   ebx,1
405
    cmp   esi,16
406
    jne   .nowater
407
    sub   esi,10
408
 .nowater:
409
   imul  esi,3072	  ;mapwert * 32*32*3 = image-adresse
410
    add  esi,images
411
    mov  edi,0x10000
412
    mov  ecx,32*32*3
413
 .gendd:		  ;RGB-Image im Speicher generieren
414
    mov   eax,dword [esi] ;byte aus imagemap lesen
415
    shl   eax,8
416
    shr   eax,8
417
    cmp   ebx,0
418
    jz	  .nowcolor
419
    mov   ebx,eax
420
    cmp   ebx,0x00B0B5B0
421
    jne   .nog1
422
    jmp   .wcolor
423
 .nog1:
424
    cmp   ebx,0x00A0A5A0
425
    jne   .nog2
426
    jmp   .wcolor
427
 .nog2:
428
    cmp   ebx,0x00909590
429
    jne   .nog3
430
    jmp   .wcolor
431
 .nog3:
432
    cmp   ebx,0x00808580
433
    jne   .nog4
434
    jmp   .wcolor
435
 .nog4:
436
    cmp   ebx,0x00707570
437
    jne   .nowcolor
438
    jmp   .wcolor
439
 .wcolor:
440
    add   eax,0x40
441
 .nowcolor:
442
    add  esi,3
443
    stosd
444
    dec  edi
445
    loop .gendd
446
popa
447
ret
448
 
449
 
450
 
451
;   *********************************************
452
;   *******  WINDOW DEFINITIONS AND DRAW ********
453
;   *********************************************
454
draw_message:
455
pusha
456
    cmp  [stat],0
457
    je	.nomessage
458
    cmp  [stat],3
459
    je	.nomessage
460
    mov  eax,13
461
    mov  ebx,146 shl 16 + 200
462
    mov  ecx,190 shl 16 + 40
463
    mov  edx,0x0
485 heavyiron 464
    mcall
205 heavyiron 465
    add  ebx,2 shl 16 - 4
466
    add  ecx,2 shl 16 - 4
467
    mov  edx,fgcolor
485 heavyiron 468
    mcall
205 heavyiron 469
 
470
    cmp   [stat],1
471
     je   .winmessage
472
    mov   eax,4
473
    mov   ebx,186 shl 16 +200
474
    mov   edx,lbl_gameover+1
475
    movzx esi,byte [lbl_gameover]
476
    mov   ecx,btcolor
477
    add   ecx,0x10000000
485 heavyiron 478
    mcall
205 heavyiron 479
    add   ebx,8 shl 16 +17
480
    mov   edx,lbl_yscore+1
481
    movzx esi,byte [lbl_yscore]
482
    mov   ecx,btcolor
485 heavyiron 483
    mcall
205 heavyiron 484
    mov   esi,ecx	;color
485
    mov   edx,ebx	;pos
486
    add   edx,80 shl 16
487
    mov   ebx,0x50000	 ;type
488
    mov   ecx,[score]	 ;inp
489
    mov   eax,47
485 heavyiron 490
    mcall
205 heavyiron 491
    jmp   .nomessage
492
   .winmessage:
493
    mov   eax,4
494
    mov   ebx,152 shl 16 +200
495
    mov   edx,lbl_win+1
496
    movzx esi,byte [lbl_win]
497
    mov   ecx,btcolor
498
    add   ecx,0x10000000
485 heavyiron 499
    mcall
205 heavyiron 500
    mov   ebx,152 shl 16 +217
501
    add   edx,esi
502
    mov   ecx,btcolor
485 heavyiron 503
    mcall
205 heavyiron 504
   .nomessage:
505
popa
506
ret
507
 
508
draw_board:
509
pusha
510
 mov  ebx,15*65536+32
511
 mov  ecx,50*65536+32
512
 mov  edx,15*65536+50		 ;Spielfeldposition
513
 mov  esi,10			  ;Spielfeldgroesse Y
514
 .vloop:
515
  mov  edi,14			 ;Spielfeldgroesse X
516
  .hloop:
517
    call gen_image
518
    push edx
519
    mov  eax,8
520
    movsx edx, byte [map]
521
    add  edx,9		    ;button-id = map-pos + 10;gen_image inkrements
522
    add  edx,0x50000000     ;no button image - no esi need
485 heavyiron 523
    mcall
205 heavyiron 524
    pop  edx
525
    push ebx
526
    push ecx
527
    mov  eax,7
528
    mov  ebx,0x10000
529
    mov  ecx,32 shl 16 +32
485 heavyiron 530
    mcall
205 heavyiron 531
    pop  ecx
532
    pop  ebx
533
    add  edx,33 shl 16
534
    add  ebx,33 shl 16
535
    dec  edi
536
    jnz  .hloop
537
  sub  edx,14*(33 shl 16)	 ;Spielfeldgroesse X
538
  sub  ebx,14*(33 shl 16)
539
  add  edx,33
540
  add  ecx,33 shl 16
541
  dec  esi
542
  jnz  .vloop
543
  mov  [map], byte 1		 ;Map-Position zuruecksetzen
544
popa
545
ret
546
 
547
 
548
draw_window:
549
pusha
550
 
551
    mov  eax,12 		   ; function 12:tell os about windowdraw
552
    mov  ebx,1			   ; 1, start of draw
485 heavyiron 553
    mcall
205 heavyiron 554
 
555
				   ; DRAW WINDOW
556
    mov  eax,0			   ; function 0 : define and draw window
557
    mov  ebx,100*65536+492	   ; [x start] *65536 + [x size]
558
    mov  ecx,100*65536+420	   ; [y start] *65536 + [y size]
559
    mov  edx,bgcolor		   ; color of work area RRGGBB,8->color gl
551 spraid 560
    or   edx,0x14000000
485 heavyiron 561
    mov  edi,title
562
    mcall
205 heavyiron 563
 
564
    mov   eax,8
565
    mov   ebx,84*65536+72
566
    mov   ecx,28*65536+15
567
    mov   edx,2
568
    mov   esi,btcolor
485 heavyiron 569
    mcall
205 heavyiron 570
    add   ebx,76 shl 16
571
    inc   edx
485 heavyiron 572
    mcall
205 heavyiron 573
    add   ebx,76 shl 16
574
    inc   edx
485 heavyiron 575
    mcall
205 heavyiron 576
 
577
    mov   eax,4
578
    mov   ebx,26 shl 16 +32
579
    mov   ecx,fgcolor
580
    mov   edx,lbl_toolbar+1
581
    movsx esi, byte [lbl_toolbar]
485 heavyiron 582
    mcall
205 heavyiron 583
    mov   ebx,18 shl 16 +398
584
    mov   edx,lbl_score+1
585
    movsx esi, byte [lbl_score]
485 heavyiron 586
    mcall
205 heavyiron 587
    mov   ebx,350 shl 16 +405
588
    mov   ecx,fg3color
589
    mov   edx,lbl_copy+1
590
    movsx esi,byte [lbl_copy]
485 heavyiron 591
    mcall
205 heavyiron 592
 
593
    mov  eax,12 		   ; function 12:tell os about windowdraw
594
    mov  ebx,2			   ; 2, end of draw
485 heavyiron 595
    mcall
205 heavyiron 596
 
597
    popa
598
    ret
599
 
600
 
601
; DATA AREA
602
 
603
 
485 heavyiron 604
title  db   'PIPES',0
205 heavyiron 605
lbl_gameover:
606
     db 19
607
     db 'G a m e   O v e r !'
608
lbl_win:
609
     db 32
610
     db '          G r e a t !           '
611
     db "        Let's goin'on!          "
612
lbl_yscore:
613
     db 11
614
     db 'Your Score:'
615
lbl_toolbar:
616
     db 43
617
     db 'New Game:     Easy       Moderate      Hard'
618
lbl_copy:
619
     db 23
620
     db 'v1.2 2006,Mario Birkner'
621
lbl_score:
622
     db 28
623
     db   'Time:    Score:       Level:'
624
stat	db 3  ;0=gameplay 1=won 2-lost 3=stopped
625
speed	db 0
626
time	dd 0
627
diffic	db 0  ;1=hard 3=moderate 5=easy 8=dedicated to Wildwest - try it out!
628
score	dd 0
629
level	dd 1
630
half	db 1  ;reduces the random-crosses
631
 
632
map:	   ;14*10 blocks + position
633
     db 1  ;<- act. position
634
     db 9,9,9,9,9,9,9,9,9,9,9,9,9,9
635
     db 9,7,1,3,2,0,1,1,0,3,4,4,3,9
636
     db 9,5,0,2,2,1,3,0,3,1,1,6,4,9
637
     db 9,4,0,4,6,0,3,3,2,6,0,1,2,9
638
     db 9,3,0,1,2,4,6,4,5,1,2,4,1,9
639
     db 9,5,3,2,6,3,2,1,2,1,2,6,0,9
640
     db 9,4,0,2,3,0,4,1,2,3,2,3,4,9
641
     db 9,2,0,4,5,6,3,1,3,0,4,1,0,9
642
     db 9,1,0,3,5,4,2,2,4,1,6,0,8,9
643
     db 9,9,9,9,9,9,9,9,9,9,9,9,9,9
644
images:
645
file 'pipes.raw'
646
I_END:
647