3 #include <intuition/intuition.h>
4 #include <graphics/gfx.h>
5 #include <cybergraphx/cybergraphics.h>
6 #include <proto/exec.h>
8 #include <proto/graphics.h>
9 #include <proto/cybergraphics.h>
10 #include <proto/intuition.h>
19 /***********************************************************************************/
21 struct IntuitionBase
*IntuitionBase
;
22 struct GfxBase
*GfxBase
;
23 struct Library
*CyberGfxBase
;
27 ULONG cgfx_coltab
[256];
28 UBYTE remaptable
[256];
31 WORD winx
= -1, winy
= -1;
32 BOOL forcescreen
, forcewindow
;
33 BOOL mustremap
, truecolor
, remapped
, wbscreen
= TRUE
;
35 static void cleanup(char *msg
);
37 /***********************************************************************************/
44 /***********************************************************************************/
46 unsigned char * buffy256
, *buffy256_remapped
;
47 unsigned int pal
[256];
54 struct particle
*next
;
57 typedef struct particle particle
;
59 particle
* firstparticle
;
61 void initdawafire(void)
67 for ( i
=0 ; i
<256 ; i
++ ) {
73 if ( (i
> 7) && (i
< 32) )
78 if ( (i
> 32 ) && (i
< 57 ) )
85 if ( (i
> 7) && (i
< 17) )
87 if ( (i
> 57) && (i
< 82) )
94 cgfx_coltab
[i
] = (r
<<16) + (g
<<8) + (b
);
98 ULONG red
= r
* 0x01010101;
99 ULONG green
= g
* 0x01010101;
100 ULONG blue
= b
* 0x01010101;
102 remaptable
[i
] = ObtainBestPen(scr
->ViewPort
.ColorMap
,
106 OBP_Precision
, PRECISION_IMAGE
,
107 OBP_FailIfBad
, FALSE
,
114 ULONG red
= r
* 0x01010101;
115 ULONG green
= g
* 0x01010101;
116 ULONG blue
= b
* 0x01010101;
118 SetRGB32(&scr
->ViewPort
, i
, red
, green
, blue
);
123 buffy256
= (unsigned char *) calloc ( W
*H
, 1 );
124 if (!buffy256
) cleanup("Out of memory!");
128 buffy256_remapped
= (unsigned char *) calloc ( W
*H
, 1 );
129 if (!buffy256_remapped
) cleanup("Out of memory!");
141 unsigned char * blur
= buffy256
;
143 particle
* precurrentparticle
;
144 particle
* currentparticle
;
146 /* Add new particles */
148 for (i
=0; i
<8; i
++) {
152 for (ii
=0; ii
<8; ii
++) {
154 precurrentparticle
= (particle
*) malloc (sizeof(particle
));
156 precurrentparticle
->V0x
= (random() & 31) - 16;
157 precurrentparticle
->V0y
= (random() & 31);
159 precurrentparticle
->X0
= W
/2+
161 sin((20*sin(k
/20))+i
*70)*
162 (sin(10+k
/(10+i
))+0.2)*
164 precurrentparticle
->Y0
= H
/2+
166 cos((20*sin(k
/(20+i
)))+i
*70)*
170 precurrentparticle
->power
= 110+50*sin(k
/3);
171 precurrentparticle
->time
= 0;
172 precurrentparticle
->next
= firstparticle
;
174 firstparticle
= precurrentparticle
;
189 * Y(t) = Y0 + V0y.t - G.t^2
193 currentparticle
= firstparticle
->next
;
195 while (currentparticle
!= NULL
) {
201 time
= currentparticle
->time
/ 16;
204 (currentparticle
->X0
) +
205 time
*(currentparticle
->V0x
);
207 (currentparticle
->Y0
) +
208 time
*(currentparticle
->V0y
) -
213 if ((tx
<W
) && (ty
>3) && (ty
<H
)) {
214 dawa
= buffy256
[ty
*W
+tx
];
215 dawa
+= currentparticle
->power
;
218 buffy256
[ty
*W
+tx
] = dawa
;
221 currentparticle
->time
+= 1;
223 currentparticle
->power
-= ((currentparticle
->power
>> 4) + 1);
225 if (currentparticle
->power
<= 1) {
226 precurrentparticle
->next
= currentparticle
->next
;
227 free (currentparticle
);
229 precurrentparticle
= currentparticle
;
231 currentparticle
= precurrentparticle
->next
;
245 for (i
=0; i
<W
*(H
-3); i
++)
262 WriteLUTPixelArray(buffy256
,
277 UBYTE
*src
= buffy256
;
278 UBYTE
*dest
= buffy256_remapped
;
280 for(i
= 0; i
< W
* H
; i
++)
282 *dest
++ = remaptable
[*src
++];
284 WriteChunkyPixels(rp
,
287 win
->BorderLeft
+ W
- 1,
288 win
->BorderTop
+ H
- 1,
295 WriteChunkyPixels(rp
,
298 win
->BorderLeft
+ W
- 1,
299 win
->BorderTop
+ H
- 1,
306 /***********************************************************************************/
308 static void cleanup(char *msg
)
313 printf("DawaFire: %s\n",msg
);
316 if (win
) CloseWindow(win
);
322 for(i
= 0; i
< 256; i
++)
324 ReleasePen(scr
->ViewPort
.ColorMap
, remaptable
[i
]);
331 UnlockPubScreen(0, scr
);
336 if (CyberGfxBase
) CloseLibrary(CyberGfxBase
);
337 if (GfxBase
) CloseLibrary((struct Library
*)GfxBase
);
338 if (IntuitionBase
) CloseLibrary((struct Library
*)IntuitionBase
);
343 /***********************************************************************************/
345 #define ARG_TEMPLATE "WINPOSX=X/N/K,WINPOSY=Y/N/K,FORCESCREEN=SCR/S,FORCEWINDOW=WIN/S"
352 static IPTR args
[NUM_ARGS
];
354 static void getarguments(void)
356 struct RDArgs
*myargs
;
358 if ((myargs
= ReadArgs(ARG_TEMPLATE
, args
, NULL
)))
362 else if (args
[ARG_WIN
])
365 if (args
[ARG_X
]) winx
= *(IPTR
*)args
[ARG_X
];
366 if (args
[ARG_Y
]) winy
= *(IPTR
*)args
[ARG_Y
];
372 /***********************************************************************************/
374 static void openlibs(void)
376 if (!(IntuitionBase
= (struct IntuitionBase
*)OpenLibrary("intuition.library", 39)))
378 cleanup("Can't open intuition.library V39!");
381 if (!(GfxBase
= (struct GfxBase
*)OpenLibrary("graphics.library", 39)))
383 cleanup("Can't open graphics.library V39!");
386 if (!(CyberGfxBase
= OpenLibrary("cybergraphics.library",0)))
388 cleanup("Can't open cybergraphics.library!");
393 /***********************************************************************************/
395 static void getvisual(void)
402 scr
= OpenScreenTags(NULL
, SA_Width
, W
,
406 if (!scr
) cleanup("Failed to open specified screen!");
408 else if (!(scr
= LockPubScreen(NULL
)))
410 cleanup("Failed to lock pub screen (workbench)!");
413 truecolor
= (GetBitMapAttr(scr
->RastPort
.BitMap
, BMA_DEPTH
) >= 15) ? TRUE
: FALSE
;
415 if ((!truecolor
) && (wbscreen
))
419 /***********************************************************************************/
421 static void makewin(void)
423 struct TagItem winonwbtags
[] =
425 {WA_DragBar
, TRUE
},
426 {WA_DepthGadget
, TRUE
},
427 {WA_CloseGadget
, TRUE
},
428 {WA_Title
, (IPTR
)"DawaFire" },
432 struct TagItem winonscrtags
[] =
434 {WA_Borderless
, TRUE
},
438 if (winx
== -1) winx
= (scr
->Width
- W
- scr
->WBorLeft
- scr
->WBorRight
) / 2;
439 if (winy
== -1) winy
= (scr
->Height
- H
- scr
->WBorTop
- scr
->WBorTop
- scr
->Font
->ta_YSize
- 1) / 2;
441 win
= OpenWindowTags(NULL
, WA_CustomScreen
, (IPTR
)scr
,
446 WA_AutoAdjust
, TRUE
,
448 WA_IDCMP
, IDCMP_CLOSEWINDOW
|
450 TAG_MORE
, wbscreen
? winonwbtags
: winonscrtags
);
452 if (!win
) cleanup("Can't open window");
457 /***********************************************************************************/
460 #define KC_RIGHT 0x4E
465 /***********************************************************************************/
467 static void getevents(void)
469 struct IntuiMessage
*msg
;
471 while ((msg
= (struct IntuiMessage
*)GetMsg(win
->UserPort
)))
475 case IDCMP_CLOSEWINDOW
:
481 WORD code
= msg
->Code
& ~IECODE_UP_PREFIX
;
483 Keys
[code
] = (code
== msg
->Code
) ? 1 : 0;
489 ReplyMsg((struct Message
*)msg
);
494 /***********************************************************************************/
496 static void action(void)
502 firstparticle
= NULL
;
508 while (!Keys
[KC_ESC
])
524 /***********************************************************************************/
538 /***********************************************************************************/