]> 4ch.mooo.com Git - 16.git/blob - src/lib/bakapee.c
p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I...
[16.git] / src / lib / bakapee.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 \r
23 #include "src/lib/bakapee.h"\r
24 \r
25 struct glob_game_vars   *ggvv;\r
26 //static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */\r
27 char global_temp_status_text[512];\r
28 char global_temp_status_text2[512];\r
29 \r
30 //==========================================================================\r
31 \r
32 /*\r
33 ===================\r
34 =\r
35 = FizzleFade\r
36 =\r
37 = returns true if aborted\r
38 =\r
39 ===================\r
40 */\r
41 \r
42 //extern        ControlInfo     c;\r
43 #define PIXPOSX                 gvar->video.page[0].sw/2\r
44 #define PIXPOSY                 gvar->video.page[0].sh/2\r
45 \r
46 boolean baka_FizzleFade (page_t *source, page_t *dest, unsigned frames, boolean abortable, global_game_variables_t *gvar)\r
47 {\r
48         dword           p,pixperframe;\r
49         unsigned        drawofs,pagedelta;\r
50         byte            mask,maskb[8] = {1,2,4,8};\r
51         unsigned        x,y,frame               ,esorig;\r
52         dword           rndval;\r
53 //      word TimeCount = *clockw;\r
54         word screenseg = SCREENSEG;\r
55 \r
56         pagedelta = (word)dest->sw*dest->sh;//(word)(source->data - dest->data);//(dest->data - source->data)\r
57         rndval = 1;     esorig = 0;\r
58         x = y = dest->dx;\r
59         pixperframe = 76800/(dword)frames;\r
60 \r
61 //      IN_StartAck ();\r
62 \r
63 //      VL_ShowPage(dest, 1, 0);\r
64 //      VL_ShowPage(source, 1, 0);\r
65 \r
66 //      modexClearRegion(dest, 0, 0, (dest->width), (dest->height), 12);\r
67         modexClearRegion(source, 0, 0, (source->width), (source->height), 64);\r
68 \r
69         __asm {\r
70                 mov     [esorig],es\r
71         }\r
72 //      TimeCount=\r
73         frame=0;\r
74         do      // while (1)\r
75         {\r
76 sprintf(global_temp_status_text, "%u", frame);\r
77 modexprint(dest, PIXPOSX, PIXPOSY, 1, 0, 47, 0, 1, global_temp_status_text);\r
78                 if (abortable && kbhit())//IN_CheckAck () )\r
79                         return true;\r
80 \r
81                 __asm {\r
82                         mov     es,[screenseg]\r
83                 }\r
84 \r
85                 for (p=0;p<pixperframe;p++)\r
86                 {\r
87                         __asm {\r
88                                 //\r
89                                 // seperate random value into x/y pair\r
90                                 //\r
91                                 mov     ax,[WORD PTR rndval]\r
92                                 mov     dx,[WORD PTR rndval+2]\r
93                                 mov     bx,ax\r
94                                 dec     bl\r
95                                 mov     [BYTE PTR y],bl                 // low 8 bits - 1 = y xoordinate\r
96                                 mov     bx,ax\r
97                                 mov     cx,dx\r
98                                 mov     [BYTE PTR x],ah                 // next 9 bits = x xoordinate\r
99                                 mov     [BYTE PTR x+1],dl\r
100                                 //\r
101                                 // advance to next random element\r
102                                 //\r
103                                 shr     dx,1\r
104                                 rcr     ax,1\r
105                                 jnc     noxor\r
106                                 xor     dx,0x0001\r
107                                 xor     ax,0x2000\r
108 #ifdef __BORLANDC__\r
109                         }\r
110 #endif\r
111 noxor:\r
112 #ifdef __BORLANDC__\r
113                         __asm {\r
114 #endif\r
115                                 mov     [WORD PTR rndval],ax\r
116                                 mov     [WORD PTR rndval+2],dx\r
117                         }\r
118 \r
119                         if (x>dest->sw || y>dest->sh)\r
120                                 continue;\r
121                         drawofs = (word)(source->data)+gvar->video.ofs.ylookup[y] + (x>>2);\r
122 sprintf(global_temp_status_text, "draw - %Fp", drawofs);\r
123 modexprint(dest, PIXPOSX, 16+PIXPOSY, 1, 0, 47, 0, 1, global_temp_status_text);\r
124 sprintf(global_temp_status_text, "pdet - %Fp", pagedelta);\r
125 modexprint(dest, PIXPOSX, 24+PIXPOSY, 1, 0, 47, 0, 1, global_temp_status_text);\r
126 sprintf(global_temp_status_text, "srce - %Fp", source->data);\r
127 modexprint(dest, PIXPOSX, 32+PIXPOSY, 1, 0, 47, 0, 1, global_temp_status_text);\r
128 sprintf(global_temp_status_text, "dest - %Fp", dest->data);\r
129 modexprint(dest, PIXPOSX, 40+PIXPOSY, 1, 0, 47, 0, 1, global_temp_status_text);\r
130 \r
131                         //\r
132                         // copy one pixel\r
133                         //\r
134                         mask = x&3;\r
135                         VGAREADMAP(mask);\r
136                         mask = maskb[mask];\r
137                         VGAMAPMASK(mask);\r
138 \r
139                         __asm {\r
140                                 mov     di,[drawofs]\r
141                                 mov     al,[es:di]\r
142                                 add     di,[pagedelta]\r
143                                 mov     [es:di],al\r
144                         }\r
145 \r
146                         if (rndval == 1)                // entire sequence has been completed\r
147                                 return false;\r
148                 }\r
149                 frame++;\r
150 //--            while (TimeCount<frame){}//;            // don't go too fast\r
151         } while (1);\r
152         __asm {\r
153                 mov     es,[esorig]\r
154         }\r
155         return false;\r
156 }\r
157 #if 0\r
158 boolean baka_FizzleFade (unsigned source, unsigned dest, unsigned width,unsigned height, unsigned frames, boolean abortable, global_game_variables_t *gvar)\r
159 {\r
160         int                     pixperframe;\r
161         unsigned        drawofs,pagedelta;\r
162         byte            mask,maskb[8] = {1,2,4,8};\r
163         unsigned        x,y,p,frame;\r
164         dword           rndval;\r
165         word TimeCount = *clockw;\r
166         word screenseg = SCREENSEG;\r
167 \r
168         pagedelta = dest-source;\r
169         rndval = 1;\r
170         x = y = 0;\r
171         pixperframe = 64000/frames;\r
172 \r
173         VGAmodeX(0, 0, gvar);\r
174 //      IN_StartAck ();\r
175 //      VL_ShowPage((page_t *)dest, 1, 0);\r
176         VGAmodeX(1, 0, gvar);\r
177 \r
178         TimeCount=frame=0;\r
179         do      // while (1)\r
180         {\r
181                 if (abortable && !kbhit())//IN_CheckAck () )\r
182                         return true;\r
183 \r
184                 __asm {\r
185                         mov     es,[screenseg]\r
186                 }\r
187 \r
188                 for (p=0;p<pixperframe;p++)\r
189                 {\r
190                         __asm {\r
191                                 //\r
192                                 // seperate random value into x/y pair\r
193                                 //\r
194                                         mov     ax,[WORD PTR rndval]\r
195                                         mov     dx,[WORD PTR rndval+2]\r
196                                         mov     bx,ax\r
197                                         dec     bl\r
198                                         mov     [BYTE PTR y],bl                 // low 8 bits - 1 = y xoordinate\r
199                                         mov     bx,ax\r
200                                         mov     cx,dx\r
201                                         mov     [BYTE PTR x],ah                 // next 9 bits = x xoordinate\r
202                                         mov     [BYTE PTR x+1],dl\r
203                                 //\r
204                                 // advance to next random element\r
205                                 //\r
206                                         shr     dx,1\r
207                                         rcr     ax,1\r
208                                         jnc     noxor\r
209                                         xor     dx,0x0001\r
210                                         xor     ax,0x2000\r
211 noxor:\r
212                                         mov     [WORD PTR rndval],ax\r
213                                         mov     [WORD PTR rndval+2],dx\r
214                         }\r
215 \r
216                         if (x>width || y>height)\r
217                                 continue;\r
218                         drawofs = source+gvar->video.ofs.ylookup[y] + (x>>2);\r
219 \r
220                         //\r
221                         // copy one pixel\r
222                         //\r
223                         mask = x&3;\r
224                         VGAREADMAP(mask);\r
225                         mask = maskb[mask];\r
226                         VGAMAPMASK(mask);\r
227 \r
228                         __asm {\r
229                                 mov     di,[drawofs]\r
230                                 mov     al,[es:di]\r
231                                 add     di,[pagedelta]\r
232                                 mov     [es:di],al\r
233                         }\r
234 \r
235                         if (rndval == 1)                // entire sequence has been completed\r
236                                 return false;\r
237                 }\r
238                 frame++;\r
239 //              while (TimeCount<frame){}//;            // don't go too fast\r
240         } while (1);\r
241         return false;\r
242 }\r
243 #endif\r
244 /* clrstdin() clear any leftover chars tha may be in stdin stream */\r
245 void clrstdin()\r
246 {\r
247    int ch = 0;\r
248    while( ( ch = getchar() ) != '\n' && ch != EOF );\r
249 }\r
250 \r
251 //color \82Ä\82·\82Æ\r
252 void colortest(page_t *page, bakapee_t *pee)\r
253 {\r
254         //if(pee->coor < 256)\r
255         //{\r
256 //              modexcls(page, pee->coor, VGA);\r
257                 VL_ClearVideo (pee->coor);\r
258                 pee->coor++;\r
259         //}else pee->coor = 0;\r
260 }\r
261 \r
262 //color \82Ä\82·\82Æ\r
263 void colorz(page_t *page, bakapee_t *pee)\r
264 {\r
265         if(pee->coor <= pee->hgq)\r
266         {\r
267 //              modexcls(page, pee->coor, VGA);\r
268                 VL_ClearVideo (pee->coor);\r
269                 pee->coor++;\r
270         }else pee->coor = pee->lgq;\r
271 }\r
272 \r
273 //slow spectrum down\r
274 void ssd(page_t *page, bakapee_t *pee, word svq)\r
275 {\r
276         if(pee->sy < page->sh+1)\r
277         {\r
278                 if(pee->sx < page->sw+1)\r
279                 {\r
280                         //mxPutPixel(sx, sy, coor);\r
281                         //printf("%d %d %d %d\n", pee->sx, pee->sy, svq, pee->coor);\r
282                         dingpp(page, pee);\r
283                         pee->sx++;\r
284                 }else pee->sx = 0;\r
285                 if(pee->sx == page->sw)\r
286                 {\r
287                         pee->sy++;\r
288                         if(svq == 7) pee->coor++;\r
289                         if(pee->sy == page->sh && svq == 8) pee->coor = rand()%256;\r
290                 }\r
291         }else pee->sy = 0;\r
292 }\r
293 \r
294 //plot pixel or plot tile\r
295 void dingpp(page_t *page, bakapee_t *pee)\r
296 {\r
297         if(pee->tile)\r
298         {\r
299                 modexClearRegion(page, pee->xx, pee->yy, TILEWH, TILEWH, pee->coor);\r
300         }\r
301         else\r
302                 modexputPixel(page, pee->xx, pee->yy, pee->coor);\r
303 }\r
304 \r
305 void dingo(page_t *page, bakapee_t *pee)\r
306 {\r
307         if(pee->tile)\r
308         {\r
309                 if(pee->xx<0) pee->xx=(page->sw-TILEWH);\r
310                 if(pee->yy<0) pee->yy=(page->sh-TILEWH);\r
311                 if(pee->xx>(page->sw-TILEWH)) pee->xx=0;\r
312                 if(pee->yy>(page->sh-TILEWH)/*+(TILEWH*BUFFMX)*/) pee->yy=0;\r
313         }\r
314                 else\r
315         {\r
316                 if(pee->xx<0) pee->xx=page->sw;\r
317                 if(pee->yy<0) pee->yy=page->sh;\r
318                 if(pee->xx>page->sw) pee->xx=0;\r
319                 if(pee->yy>page->sh) pee->yy=0;\r
320         }\r
321 }\r
322 \r
323 //assigning values from randomizer\r
324 void dingas(bakapee_t *pee)\r
325 {\r
326         if(pee->gq == pee->bonk) dingu(pee);\r
327         if(!pee->bakax)\r
328         {\r
329                 if(pee->tile)\r
330                 pee->xx-=TILEWH;\r
331                 else pee->xx--;\r
332         }\r
333         else if(pee->bakax>1)\r
334         {\r
335                 if(pee->tile)\r
336                 pee->xx+=TILEWH;\r
337                 else pee->xx++;\r
338         }\r
339         if(!pee->bakay)\r
340         {\r
341                 if(pee->tile)\r
342                 pee->yy-=TILEWH;\r
343                 else pee->yy--;\r
344         }\r
345         else if(pee->bakay>1)\r
346         {\r
347                 if(pee->tile)\r
348                 pee->yy+=TILEWH;\r
349                 else pee->yy++;\r
350         }\r
351 }\r
352 \r
353 void dingaso(bakapee_t *pee)\r
354 {\r
355         if(pee->gq == pee->bonk) dingu(pee);\r
356         if(!pee->bakax)\r
357         {\r
358                 if(pee->tile)\r
359                 pee->xx-=TILEWH;\r
360                 else pee->xx--;\r
361         }\r
362         else\r
363         {\r
364                 if(pee->tile)\r
365                 pee->xx+=TILEWH;\r
366                 else pee->xx++;\r
367         }\r
368         if(!pee->bakay)\r
369         {\r
370                 if(pee->tile)\r
371                 pee->yy-=TILEWH;\r
372                 else pee->yy--;\r
373         }\r
374         else\r
375         {\r
376                 if(pee->tile)\r
377                 pee->yy+=TILEWH;\r
378                 else pee->yy++;\r
379         }\r
380 }\r
381 \r
382 void dingu(bakapee_t *pee)\r
383 {\r
384         if(pee->coor < pee->hgq && pee->coor < pee->lgq) pee->coor = pee->lgq;\r
385         if(pee->coor < pee->hgq)\r
386         {\r
387                 pee->coor++;\r
388         }else{\r
389                 pee->coor = pee->lgq;\r
390         }\r
391 }\r
392 \r
393 //randomizer\r
394 void dingq(bakapee_t *pee)\r
395 {\r
396         if(pee->gq<pee->bonk)\r
397         {\r
398                 pee->gq++;\r
399         }\r
400         else\r
401         {\r
402                 dingu(pee);\r
403                 pee->gq = 0;\r
404         }\r
405         pee->bakax = rand()%3; pee->bakay = rand()%3;\r
406 }\r
407 \r
408 void dingqo(bakapee_t *pee)\r
409 {\r
410         if(pee->gq<pee->bonk)\r
411         {\r
412                 pee->gq++;\r
413                 pee->bakax = rand()%3; pee->bakay = rand()%3;\r
414         }\r
415         else\r
416         {\r
417                 dingu(pee);\r
418                 pee->gq = 0;\r
419         }\r
420         //either one will do wwww --4\r
421         pee->bakax = rand()&0x1; pee->bakay = rand()&0x1;\r
422         //pee->bakax = rand()%2; pee->bakay = rand()%2;\r
423 }\r
424 \r
425 /*-----------ding-------------*/\r
426 void ding(page_t *page, bakapee_t *pee, word q)\r
427 {\r
428         word tx=0,ty=0;//d3y,\r
429 \r
430 //++++  if(q <= 4 && q!=2 && gq == pee->bonk-1) coor = rand()%pee->hgq;\r
431         switch(q)\r
432         {\r
433                 case 1:/*\r
434                         dingq(pee);\r
435                         if(pee->xx==page->sw){pee->bakax=0;}\r
436                         if(pee->xx==0){pee->bakax=1;}\r
437                         if(pee->yy==page->sh){pee->bakay=0;}\r
438                         if(pee->yy==0){pee->bakay=1;}*/\r
439                         dingqo(pee);\r
440                         dingaso(pee);\r
441                         dingo(page, pee);\r
442                         dingpp(page, pee);      //plot the pixel/tile\r
443                         if(pee->tile)\r
444                         modexClearRegion(page, (rand()*TILEWH)%page->width, (rand()*TILEWH)%(page->height), TILEWH, TILEWH, 0);\r
445                         else\r
446                         modexputPixel(page, rand()%page->width, rand()%page->height, 0);\r
447                 break;\r
448                 case 2:\r
449                         dingq(pee);\r
450                         dingas(pee);\r
451                         dingo(page, pee);\r
452                         dingpp(page, pee);      //plot the pixel/tile\r
453                         if(pee->tile)\r
454                         modexClearRegion(page, (rand()*TILEWH)%page->width, (rand()*TILEWH)%(page->height), TILEWH, TILEWH, 0);\r
455                         else\r
456                         modexputPixel(page, rand()%page->width, rand()%page->height, 0);\r
457                 break;\r
458                 case 3:\r
459                         /*dingq(pee);\r
460                         if(pee->xx!=page->sw||pee->yy!=page->sh)\r
461                         {\r
462                                 if(pee->xx==0){pee->bakax=1;pee->bakay=-1;d3y=1;}\r
463                                 if(pee->yy==0){pee->bakax=1;pee->bakay=0;d3y=1;}\r
464                                 if(pee->xx==page->sw){pee->bakax=-1;pee->bakay=-1;d3y=1;}\r
465                                 if(pee->yy==page->sh){pee->bakax=1;pee->bakay=0;d3y=1;}\r
466                         }else if(pee->xx==page->sw&&pee->yy==page->sh) pee->xx=pee->yy=0;\r
467                         if(d3y)\r
468                         {\r
469                                 if(pee->bakay<0)\r
470                                 {\r
471                                         pee->yy--;\r
472                                         d3y--;\r
473                                 }else\r
474                                 if(pee->bakay>0)\r
475                                 {\r
476                                         pee->yy++;\r
477                                         d3y--;\r
478                                 }\r
479                         }\r
480                         if(pee->bakax<0)\r
481                         {\r
482                                 pee->xx--;\r
483                         }else\r
484                         if(pee->bakax>0)\r
485                         {\r
486                                 pee->xx++;\r
487                         }\r
488                         dingpp(page, pee);      //plot the pixel/tile*/\r
489                         dingqo(pee);\r
490                         dingaso(pee);\r
491                         dingo(page, pee);\r
492                         dingpp(page, pee);      //plot the pixel/tile\r
493                 break;\r
494                 case 4:\r
495                         dingq(pee);\r
496                         dingas(pee);\r
497                         dingo(page, pee);\r
498                         dingpp(page, pee);      //plot the pixel/tile\r
499                 break;\r
500                 case 5:\r
501                         colortest(page, pee);\r
502                 break;\r
503                 case 6:\r
504 //                      pee->coor = rand()%256;\r
505 //                      modexcls(page, pee->coor, VGA);\r
506                         colorz(page, pee);\r
507                         modexprint(page, page->sw/2, page->sh/2, 1, 0, 47, 0, 1, "bakapi");\r
508                 break;\r
509                 case 7:\r
510                         if(pee->coor <= pee->hgq)\r
511                         {\r
512                                 ssd(page, pee, q);\r
513                                 pee->coor++;\r
514                         }else pee->coor = pee->lgq;\r
515                 break;\r
516                 case 8:\r
517                         colorz(page, pee);\r
518                         modexprint(page, page->sw/2, page->sh/2, 1, 0, 47, 0, 1, "bakapi");\r
519                 break;\r
520                 case 9:\r
521                         //baka_FizzleFade (ggvv->video.ofs.bufferofs, ggvv->video.ofs.displayofs, page->sw, page->sh, false, ggvv);\r
522 //                      modexprint(page, page->sw/2, page->sh/2, 1, 0, 47, 0, 1, "bakapi start");\r
523 //                      if(!baka_FizzleFade ((unsigned)page, (unsigned)page, page->width, page->height, 70, false, ggvv))\r
524                 break;\r
525                 case 10:\r
526                         ssd(page, pee, q); /*printf("%d\n", pee->coor);*/\r
527                 break;\r
528                 case 11:\r
529                         colorz(page, pee); delay(100);\r
530                 break;\r
531 \r
532                 case 16:        //interesting effects\r
533                         dingq(pee);\r
534                         if(!pee->bakax){ pee->xx--;}\r
535                         else if(pee->bakax>0){ pee->xx++; }\r
536                         if(!pee->bakay){ pee->yy--;}\r
537                         else if(pee->bakay>0){ pee->yy++; }\r
538                         dingas(pee);\r
539                         tx+=pee->xx+TILEWH+4;\r
540                         ty+=pee->yy+TILEWH+4;\r
541                         modexClearRegion(page, tx, ty, 4, 4, pee->coor);\r
542                         if(pee->tile)\r
543                         modexClearRegion(page, (rand()*4)%page->width, (rand()*4)%(page->height), 4, 4, 0);\r
544                         else\r
545                         modexputPixel(page, rand()%page->width, rand()%(page->height), 0);\r
546                         //printf("%d %d %d %d %d %d\n", pee->xx, pee->yy, tx, ty, TILEWH);\r
547                 break;\r
548                 default:\r
549                 break;\r
550         }\r
551         //printf("      %dx%d   %dx%d\n", pee->xx, pee->yy, tx, ty);\r
552         //pee->coor++;\r
553 }\r