OSDN Git Service

major changes to entire project for tweaking it amd making it cleaner!! OK PNGWEN...
[proj16/16.git] / src / scroll.c
1 /* Project 16 Source Code~
2  * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669
3  *
4  * This file is part of Project 16.
5  *
6  * Project 16 is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Project 16 is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,
19  * Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  */
22
23 #include "src/lib/dos_kb.h"\r
24 #include "src/lib/mapread.h"\r
25 #include "src/lib/wcpu/wcpu.h"\r
26 #include "src/lib/planar.h"\r
27 //====#include "src\lib\ems.c"\r
28 \r
29 //word far *clock= (word far*) 0x046C; /* 18.2hz clock */\r
30 \r
31 //optimize scroll*!!!!\r
32 \r
33 typedef struct {\r
34         map_t *map;\r
35         page_t *page;\r
36         int tx; //appears to be the top left tile position on the viewable screen map\r
37         int ty; //appears to be the top left tile position on the viewable screen map\r
38         word dxThresh; //????\r
39         word dyThresh; //????\r
40 } map_view_t;\r
41 \r
42 typedef struct {\r
43         int x; //player exact position on the viewable map\r
44         int y; //player exact position on the viewable map\r
45         int tx; //player tile position on the viewable map\r
46         int ty; //player tile position on the viewable map\r
47         int triggerx; //player's trigger box tile position on the viewable map\r
48         int triggery; //player's trigger box tile position on the viewable map\r
49         int setx; //NOT USED YET! player sprite sheet set on the image x\r
50         int sety; //NOT USED YET! player sprite sheet set on the image y\r
51         word q; //loop variable\r
52         word d; //direction\r
53         bitmap_t data; //supposively the sprite sheet data\r
54         int hp; //hitpoints of the player\r
55 } actor_t;
56
57 typedef struct
58 {
59         map_view_t *mv;
60 } map_view_db_t;\r
61 \r
62 map_t allocMap(int w, int h);\r
63 void initMap(map_t *map);\r
64 void mapScrollRight(map_view_t *mv, byte offset, word id);\r
65 void mapScrollLeft(map_view_t *mv, byte offest, word id);\r
66 void mapScrollUp(map_view_t *mv, byte offset, word id);\r
67 void mapScrollDown(map_view_t *mv, byte offset, word id);\r
68 void mapGoTo(map_view_t *mv, int tx, int ty);\r
69 void mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y);\r
70 void mapDrawRow(map_view_t *mv, int tx, int ty, word y);\r
71 void mapDrawCol(map_view_t *mv, int tx, int ty, word x);\r
72 void qclean();\r
73 void pdump(map_view_t *pee);\r
74 void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp);
75 \r
76 #define TILEWH 16\r
77 #define QUADWH                  TILEWH/2\r
78 #define SPEED 4\r
79 //#define LOOPMAX (TILEWH/SPEED)\r
80 \r
81 //place holder definitions\r
82 //#define MAPX 200\r
83 //#define MAPY 150\r
84 //#define TRIGGX 10\r
85 //#define TRIGGY 9\r
86 \r
87 void main() {\r
88 //++++  size_t oldfreemem=GetFreeSize();\r
89         /*long emmhandle;\r
90         long emsavail;\r
91         char teststr[80];*/\r
92         word panswitch=0, panq=1, pand=0, panpagenum=0; //for panning!\r
93         int i;\r
94         static word paloffset=0;\r
95         bitmap_t ptmp;//, npctmp; // player sprite\r
96         planar_buf_t *p;\r
97         const char *cpus;\r
98         static int persist_aniframe = 0;    /* gonna be increased to 1 before being used, so 0 is ok for default */\r
99         page_t screen, screen2, screen3;\r
100         map_t map;\r
101         map_view_t mv[3];//mv, mv2, mv3;\r
102         map_view_t *bg, *spri, *mask;//, *tmp;
103         //map_view_db_t pgid[4];
104         byte *dpal, *gpal;\r
105         byte *ptr;\r
106         byte *mappalptr;\r
107         actor_t player;\r
108 //      bitmap_t font;\r
109         //actor_t npc0;\r
110 \r
111 //      atexit(qclean());\r
112         /*if(!emmtest())\r
113         {\r
114                 printf("Expanded memory is not present\n");\r
115                 exit(0);\r
116         }\r
117 \r
118         if(!emmok())\r
119         {\r
120                 printf("Expanded memory manager is not present\n");\r
121                 exit(0);\r
122         }\r
123 \r
124         emsavail = emmavail();\r
125         if(emsavail == -1)\r
126         {\r
127                 printf("Expanded memory manager error\n");\r
128                 exit(0);\r
129         }\r
130         printf("There are %ld pages available\n",emsavail);\r
131 \r
132         if((emmhandle = emmalloc(emsavail)) < 0)\r
133         {\r
134                 printf("Insufficient pages available\n");\r
135                 exit(0);\r
136         }*/\r
137 \r
138         /* create the map */\r
139 //0000  printf("Total used @ before map load:                   %zu\n", oldfreemem-GetFreeSize());\r
140 //0000  fprintf(stderr, "testing~\n");\r
141         loadmap("data/test.map", &map);\r
142 //0000  fprintf(stderr, "yay map loaded~~\n");\r
143 //----  map = allocMap(map.width,map.height); //20x15 is the resolution of the screen you can make maps smaller than 20x15 but the null space needs to be drawn properly\r
144         //if(isEMS()) printf("%d tesuto\n", coretotalEMS());\r
145 //----  initMap(&map);\r
146         mv[0].map = &map;\r
147         mv[1].map = &map;\r
148         mv[2].map = &map;\r
149 \r
150         /* draw the tiles */\r
151         ptr = map.data;\r
152         mappalptr = map.tiles->data->palette;\r
153         /* data */\r
154 //0000  printf("Total used @ before image loading:              %zu\n", oldfreemem-GetFreeSize());\r
155         ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite\r
156 //      font = bitmapLoadPcx("data/font.pcx");\r
157         //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite\r
158 \r
159         /* create the planar buffer */\r
160 //0000  printf("Total used @ before planar buffer creation:     %zu\n", oldfreemem-GetFreeSize());\r
161         p = planar_buf_from_bitmap(&ptmp);\r
162 //0000  printf("Total used @ after planar buffer creation:      %zu\n", oldfreemem-GetFreeSize());\r
163 \r
164         /*if(isEMS())\r
165         {\r
166                 XMOVE mm;\r
167                 mm.length=sizeof(map);\r
168                 mm.sourceH=0;\r
169                 mm.sourceOff=(long)&map;\r
170                 mm.destH=emmhandle;\r
171                 mm.destOff=1;\r
172                 //halp!\r
173                 ist = move_emem(&mm);\r
174                 printf("%d\n", coretotalEMS());\r
175                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
176                 //printf("%d\n", emmhandle);\r
177         }\r
178 \r
179         if(isEMS())\r
180         {\r
181                 XMOVE mm;\r
182                 mm.length=emmhandle;\r
183                 mm.sourceH=0;\r
184                 mm.sourceOff=(long)&ptmp;\r
185                 mm.destH=emmhandle;\r
186                 mm.destOff=0;\r
187                 //halp!\r
188                 ist = move_emem(&mm);\r
189                 printf("%d\n", coretotalEMS());\r
190                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
191                 //printf("%d\n", emmhandle);\r
192         }\r
193 */\r
194 \r
195         /* save the palette */\r
196         dpal = modexNewPal();\r
197         modexPalSave(dpal);\r
198         modexFadeOff(4, dpal);\r
199 \r
200         setkb(1);\r
201         modexEnter();\r
202         modexPalBlack();        //reset the palette~\r
203 //      printf("Total used @ before palette initiation:         %zu\n", oldfreemem-GetFreeSize());\r
204         ptmp.offset=(paloffset/3);\r
205         modexPalUpdate(&ptmp, &paloffset, 0, 0);\r
206         //printf("      %d\n", sizeof(ptmp.data));\r
207         //printf("1:    %d\n", paloffset);\r
208         map.tiles->data->offset=(paloffset/3);\r
209         //XTmodexPalUpdate(map.tiles->data, &paloffset, 0, 0);\r
210         printf("\n====\n");\r
211         printf("0       paloffset=      %d\n", paloffset/3);\r
212         printf("====\n\n");\r
213         gpal = modexNewPal();\r
214         modexPalSave(gpal);\r
215         modexSavePalFile("data/g.pal", gpal);\r
216         modexPalBlack();        //so player will not see loadings~\r
217 \r
218         /* setup camera and screen~ */\r
219         screen = modexDefaultPage();\r
220         screen.width += (TILEWH*2);\r
221         screen.height += (TILEWH*2);//+QUADWH;\r
222         mv[0].page = &screen;\r
223         screen2 = modexNextPage(mv[0].page);\r
224         mv[1].page = &screen2;\r
225         screen3 = modexNextPage0(mv[1].page, 320, 240); //(352*176)+1024 is the remaining amount of memory left wwww\r
226         //screen3 = modexNextPage0(mv2.page, 320, 192); //(352*176)+1024 is the remaining amount of memory left wwww\r
227         mv[2].page = &screen3;\r
228 \r
229         /* set up paging */\r
230         bg = &mv[0];\r
231         spri = &mv[1];\r
232         mask = &mv[2];
233 \r
234 //TODO: LOAD map data and position the map in the middle of the screen if smaller then screen\r
235         mapGoTo(bg, 0, 0);\r
236         mapGoTo(spri, 0, 0);\r
237         //mapGoTo(mask, 0, 0);\r
238 \r
239         //TODO: put player in starting position of spot\r
240         //default player position on the viewable map\r
241         player.tx = bg->tx + 10;\r
242         player.ty = bg->ty + 8;\r
243         player.x = player.tx*TILEWH;\r
244         player.y = player.ty*TILEWH;\r
245         player.triggerx = player.tx;\r
246         player.triggery = player.ty+1;\r
247         player.q=1;\r
248         player.d=0;\r
249         player.hp=4;\r
250         //npc\r
251         /*npc0.tx = bg->tx + 1;\r
252         npc0.ty = bg->ty + 1;\r
253         npc0.x = npc0.tx*TILEWH;\r
254         npc0.y = npc0.ty*TILEWH;\r
255         npc0.triggerx = npc0.tx;\r
256         npc0.triggery = npc0.ty+1;\r
257         npc0.q=1;\r
258         npc0.d=0;\r
259         modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/\r
260         modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);\r
261 \r
262         modexShowPage(spri->page);\r
263 //      printf("Total used @ before loop:                       %zu\n", oldfreemem-GetFreeSize());
264         modexClearRegion(mv[2].page, 0, 0, mv[2].page->width, mv[2].page->height, 1);\r
265         modexFadeOn(4, gpal);\r
266         while(!keyp(1) && player.hp>0)\r
267         {\r
268         //top left corner & bottem right corner of map veiw be set as map edge trigger since maps are actually square\r
269         //to stop scrolling and have the player position data move to the edge of the screen with respect to the direction\r
270         //when player.tx or player.ty == 0 or player.tx == 20 or player.ty == 15 then stop because that is edge of map and you do not want to walk of the map\r
271         #define INC_PER_FRAME if(player.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;\r
272 \r
273         //player movement\r
274         //TODO: make movement into a function!\r
275         if(!panswitch){\r
276         //right movement\r
277         if((keyp(77) && !keyp(75) && player.d == 0) || player.d == 2)\r
278         {\r
279                 if(player.d == 0){ player.d = 2; }\r
280                 if(bg->tx >= 0 && bg->tx+20 < map.width && player.tx == bg->tx + 10 &&\r
281                 !(bg->map->data[(player.tx)+(map.width*(player.ty-1))] == 0))//!(player.tx+1 == TRIGGX && player.ty == TRIGGY)) //collision detection!\r
282                 {\r
283                         if(player.q<=(TILEWH/SPEED))\r
284                         {\r
285                                 INC_PER_FRAME;\r
286                                 //animatePlayer(bg, spri, mask, 1, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
287                                 animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
288                                 mapScrollRight(mv, SPEED, 0);\r
289                                 mapScrollRight(mv, SPEED, 1);
290                                 //mapScrollRight(mask, SPEED);\r
291                                 modexShowPage(spri->page);\r
292                                 player.q++;\r
293                         } else { player.q = 1; player.d = 0; player.tx++; }\r
294                 }\r
295                 else if(player.tx < map.width && !(bg->map->data[(player.tx)+(map.width*(player.ty-1))] == 0))//!(player.tx+1 == TRIGGX && player.ty == TRIGGY))\r
296                 {\r
297                         if(player.q<=(TILEWH/SPEED))\r
298                         {\r
299                                 INC_PER_FRAME;\r
300                                 player.x+=SPEED;\r
301                                 //animatePlayer(bg, spri, mask, 1, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
302                                 animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
303                                 modexShowPage(spri->page);\r
304                                 player.q++;\r
305                         } else { player.q = 1; player.d = 0; player.tx++; }\r
306                 }\r
307                 else\r
308                 {\r
309                         modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
310                         modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 32, 24, 32, &ptmp);\r
311                         modexShowPage(spri->page);\r
312                         player.d = 0;\r
313                 }\r
314                 player.triggerx = player.tx+1;\r
315                 player.triggery = player.ty;\r
316         }\r
317 \r
318         //left movement\r
319         if((keyp(75) && !keyp(77) && player.d == 0) || player.d == 4)\r
320         {\r
321                 if(player.d == 0){ player.d = 4; }\r
322                 if(bg->tx > 0 && bg->tx+20 <= map.width && player.tx == bg->tx + 10 &&\r
323                 !(bg->map->data[(player.tx-2)+(map.width*(player.ty-1))] == 0))//!(player.tx-1 == TRIGGX && player.ty == TRIGGY))       //collision detection!\r
324                 {\r
325                         if(player.q<=(TILEWH/SPEED))\r
326                         {\r
327                                 INC_PER_FRAME;\r
328                                 //animatePlayer(bg, spri, mask, 3, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
329                                 animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
330                                 mapScrollLeft(mv, SPEED, 0);\r
331                                 mapScrollLeft(mv, SPEED, 1);\r
332                                 //mapScrollLeft(mask, SPEED);\r
333                                 modexShowPage(spri->page);\r
334                                 player.q++;\r
335                         } else { player.q = 1; player.d = 0; player.tx--; }\r
336                 }\r
337                 else if(player.tx > 1 && !(bg->map->data[(player.tx-2)+(map.width*(player.ty-1))] == 0))//!(player.tx-1 == TRIGGX && player.ty == TRIGGY))\r
338                 {\r
339                         if(player.q<=(TILEWH/SPEED))\r
340                         {\r
341                                 INC_PER_FRAME;\r
342                                 player.x-=SPEED;\r
343                                 //animatePlayer(bg, spri, mask, 3, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
344                                 animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
345                                 modexShowPage(spri->page);\r
346                                 player.q++;\r
347                         } else { player.q = 1; player.d = 0; player.tx--; }\r
348                 }\r
349                 else\r
350                 {\r
351                         modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
352                         modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 96, 24, 32, &ptmp);\r
353                         modexShowPage(spri->page);\r
354                         player.d = 0;\r
355                 }\r
356                 player.triggerx = player.tx-1;\r
357                 player.triggery = player.ty;\r
358         }\r
359 \r
360         //down movement\r
361         if((keyp(80) && !keyp(72) && player.d == 0) || player.d == 3)\r
362         {\r
363                 if(player.d == 0){ player.d = 3; }\r
364                 if(bg->ty >= 0 && bg->ty+15 < map.height && player.ty == bg->ty + 8 &&\r
365                 !(bg->map->data[(player.tx-1)+(map.width*(player.ty))] == 0))//!(player.tx == TRIGGX && player.ty+1 == TRIGGY)) //collision detection!\r
366                 {\r
367                         if(player.q<=(TILEWH/SPEED))\r
368                         {\r
369                                 INC_PER_FRAME;\r
370                                 //animatePlayer(bg, spri, mask, 2, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
371                                 animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
372                                 mapScrollDown(mv, SPEED, 0);\r
373                                 mapScrollDown(mv, SPEED, 1);\r
374                                 //mapScrollDown(mask, SPEED);\r
375                                 modexShowPage(spri->page);\r
376                                 player.q++;\r
377                         } else { player.q = 1; player.d = 0; player.ty++; }\r
378                 }\r
379                 else if(player.ty < map.height && !(bg->map->data[(player.tx-1)+(map.width*(player.ty))] == 0))//!(player.tx == TRIGGX && player.ty+1 == TRIGGY))\r
380                 {\r
381                         if(player.q<=(TILEWH/SPEED))\r
382                         {\r
383                                 INC_PER_FRAME;\r
384                                 player.y+=SPEED;\r
385                                 //animatePlayer(bg, spri, mask, 2, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
386                                 animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
387                                 modexShowPage(spri->page);\r
388                                 player.q++;\r
389                         } else { player.q = 1; player.d = 0; player.ty++; }\r
390                 }\r
391                 else\r
392                 {\r
393                         modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
394                         modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);\r
395                         modexShowPage(spri->page);\r
396                         player.d = 0;\r
397                 }\r
398                 player.triggerx = player.tx;\r
399                 player.triggery = player.ty+1;\r
400         }\r
401 \r
402         //up movement\r
403         if((keyp(72) && !keyp(80) && player.d == 0) || player.d == 1)\r
404         {\r
405                 if(player.d == 0){ player.d = 1; }\r
406                 if(bg->ty > 0 && bg->ty+15 <= map.height && player.ty == bg->ty + 8 &&\r
407                 !(bg->map->data[(player.tx-1)+(map.width*(player.ty-2))] == 0))//!(player.tx == TRIGGX && player.ty-1 == TRIGGY))       //collision detection!\r
408                 {\r
409                         if(player.q<=(TILEWH/SPEED))\r
410                         {\r
411                                 INC_PER_FRAME;\r
412                                 //animatePlayer(bg, spri, mask, 0, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
413                                 animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);
414                                 mapScrollUp(mv, SPEED, 0);\r
415                                 mapScrollUp(mv, SPEED, 1);\r
416                                 //mapScrollUp(mask, SPEED);\r
417                                 modexShowPage(spri->page);\r
418                                 player.q++;\r
419                         } else { player.q = 1; player.d = 0; player.ty--; }\r
420                 }\r
421                 else if(player.ty > 1 && !(bg->map->data[(player.tx-1)+(map.width*(player.ty-2))] == 0))//!(player.tx == TRIGGX &&  player.ty-1 == TRIGGY))\r
422                 {\r
423                         if(player.q<=(TILEWH/SPEED))\r
424                         {\r
425                                 INC_PER_FRAME;\r
426                                 player.y-=SPEED;\r
427                                 //animatePlayer(bg, spri, mask, 0, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
428                                 modexShowPage(spri->page);\r
429                                 animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
430                                 player.q++;\r
431                         } else { player.q = 1; player.d = 0; player.ty--; }\r
432                 }\r
433                 else\r
434                 {\r
435                         modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
436                         modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 0, 24, 32, &ptmp);\r
437                         modexShowPage(spri->page);\r
438                         player.d = 0;\r
439                 }\r
440                 player.triggerx = player.tx;\r
441                 player.triggery = player.ty-1;\r
442         }\r
443 }else{\r
444 //88 switch!\r
445         //right movement\r
446         if((keyp(77) && !keyp(75) && pand == 0) || pand == 2)\r
447         {\r
448                 if(pand == 0){ pand = 2; }\r
449                         if(panq<=(TILEWH/SPEED))\r
450                         {\r
451                                 switch(panpagenum)\r
452                                 {\r
453                                         case 0:\r
454                                                 //bg\r
455                                                 bg->page->dx++;\r
456                                                 modexShowPage(bg->page);\r
457                                         break;\r
458                                         case 1:\r
459                                                 //spri\r
460                                                 spri->page->dx++;\r
461                                                 modexShowPage(spri->page);\r
462                                         break;\r
463                                         case 2:\r
464                                                 //fg\r
465                                                 mask->page->dx++;\r
466                                                 modexShowPage(mask->page);\r
467                                         break;\r
468                                 }\r
469                                 panq++;\r
470                         } else { panq = 1; pand = 0; }\r
471         }\r
472         //left movement\r
473         if((keyp(75) && !keyp(77) && pand == 0) || pand == 4)\r
474         {\r
475                 if(pand == 0){ pand = 4; }\r
476                         if(panq<=(TILEWH/SPEED))\r
477                         {\r
478                                 switch(panpagenum)\r
479                                 {\r
480                                         case 0:\r
481                                                 //bg\r
482                                                 bg->page->dx--;\r
483                                                 modexShowPage(bg->page);\r
484                                         break;\r
485                                         case 1:\r
486                                                 //spri\r
487                                                 spri->page->dx--;\r
488                                                 modexShowPage(spri->page);\r
489                                         break;\r
490                                         case 2:\r
491                                                 //fg\r
492                                                 mask->page->dx--;\r
493                                                 modexShowPage(mask->page);\r
494                                         break;\r
495                                 }\r
496                                 panq++;\r
497                         } else { panq = 1; pand = 0; }\r
498         }\r
499         //down movement\r
500         if((keyp(72) && !keyp(80) && pand == 0) || pand == 3)\r
501         {\r
502                 if(pand == 0){ pand = 3; }\r
503                         if(panq<=(TILEWH/SPEED))\r
504                         {\r
505                                 switch(panpagenum)\r
506                                 {\r
507                                         case 0:\r
508                                                 //bg\r
509                                                 bg->page->dy--;\r
510                                                 modexShowPage(bg->page);\r
511                                         break;\r
512                                         case 1:\r
513                                                 //spri\r
514                                                 spri->page->dy--;\r
515                                                 modexShowPage(spri->page);\r
516                                         break;\r
517                                         case 2:\r
518                                                 //fg\r
519                                                 mask->page->dy--;\r
520                                                 modexShowPage(mask->page);\r
521                                         break;\r
522                                 }\r
523                                 panq++;\r
524                         } else { panq = 1; pand = 0; }\r
525         }\r
526         //up movement\r
527         if((keyp(80) && !keyp(72) && pand == 0) || pand == 1)\r
528         {\r
529                 if(pand == 0){ pand = 1; }\r
530                         if(panq<=(TILEWH/SPEED))\r
531                         {\r
532                                 switch(panpagenum)\r
533                                 {\r
534                                         case 0:\r
535                                                 //bg\r
536                                                 bg->page->dy++;\r
537                                                 modexShowPage(bg->page);\r
538                                         break;\r
539                                         case 1:\r
540                                                 //spri\r
541                                                 spri->page->dy++;\r
542                                                 modexShowPage(spri->page);\r
543                                         break;\r
544                                         case 2:\r
545                                                 //fg\r
546                                                 mask->page->dy++;\r
547                                                 modexShowPage(mask->page);\r
548                                         break;\r
549                                 }\r
550                                 panq++;\r
551                         } else { panq = 1; pand = 0; }\r
552         }\r
553 }\r
554 \r
555         //the scripting stuf....\r
556 \r
557         //if(((player.triggerx == TRIGGX && player.triggery == TRIGGY) && keyp(0x1C))||(player.tx == 5 && player.ty == 5))\r
558         if(((bg->map->data[(player.triggerx-1)+(map.width*(player.triggery-1))] == 0) && keyp(0x1C))||(player.tx == 5 && player.ty == 5))\r
559         {\r
560                 short i;\r
561                 for(i=800; i>=400; i--)\r
562                 {\r
563                         sound(i);\r
564                 }\r
565                 nosound();\r
566         }\r
567         if(player.q == (TILEWH/SPEED)+1 && player.d > 0 && (player.triggerx == 5 && player.triggery == 5)){ player.hp--; }\r
568         //debugging binds!\r
569         //if(keyp(0x0E)) while(1){ if(xmsmalloc(24)) break; }\r
570         if(keyp(2)){ modexShowPage(bg->page); panpagenum=0; }\r
571         if(keyp(3)){ modexShowPage(spri->page); panpagenum=1; }\r
572         if(keyp(4)){ modexShowPage(mask->page); panpagenum=2; }\r
573         if(keyp(0x44)){ bputs(spri->page, player.x+(TILEWH*2), player.y+(TILEWH*2), "wwww"); }  //f10\r
574         if(keyp(25)){ pdump(bg); pdump(spri); } //p\r
575         if(keyp(24)){ modexPalUpdate0(gpal); paloffset=0; pdump(bg); pdump(spri); }\r
576         if(keyp(22)){\r
577         paloffset=0; modexPalBlack(); modexPalUpdate(&ptmp, &paloffset, 0, 0);\r
578         printf("1paloffset      =       %d\n", paloffset/3);\r
579          modexPalUpdate(map.tiles->data, &paloffset, 0, 0);\r
580         printf("2paloffset      =       %d\n", paloffset/3);\r
581          pdump(bg); pdump(spri); }\r
582         //pan switch\r
583         if(keyp(88)){if(!panswitch) panswitch++; else panswitch--; }    //f12\r
584         //TSR\r
585         if(keyp(87))    //f11\r
586         {\r
587                 modexLeave();\r
588                 setkb(0);\r
589                 __asm\r
590                 {\r
591                         mov ah,31h\r
592                         int 21h\r
593                 }\r
594         }\r
595 \r
596         if((player.q==1) && !(player.x%TILEWH==0 && player.y%TILEWH==0)) break; //incase things go out of sync!\r
597 \r
598         }\r
599 \r
600         /* fade back to text mode */\r
601         /* but 1st lets save the game palette~ */\r
602         modexPalSave(gpal);\r
603         modexSavePalFile("data/g.pal", gpal);\r
604         modexFadeOff(4, gpal);\r
605         modexLeave();\r
606         setkb(0);\r
607         printf("Project 16 scroll.exe\n");\r
608         printf("tx: %d\n", bg->tx);\r
609         printf("ty: %d\n", bg->ty);\r
610         printf("player.x: %d", player.x); printf("              player.y: %d\n", player.y);\r
611         //if(player.hp==0) printf("%d wwww\n", player.y+8);\r
612         //else printf("\nplayer.y: %d\n", player.y);\r
613         printf("player.tx: %d", player.tx); printf("            player.ty: %d\n", player.ty);\r
614         printf("player.triggx: %d", player.triggerx); printf("  player.triggy: %d\n", player.triggery);\r
615         printf("player.hp: %d", player.hp);     printf("        player.q: %d", player.q);       printf("        player.d: %d\n", player.d);\r
616         printf("tile data value at player trigger position: %d\n", bg->map->data[(player.triggerx-1)+(map.width*(player.triggery-1))]);\r
617         printf("palette offset: %d\n", paloffset/3);\r
618 //++++  printf("Total used: %zu\n", oldfreemem-GetFreeSize());\r
619 //++++  printf("Total free: %zu\n", GetFreeSize());\r
620         printf("temporary player sprite 0: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=45556867\n");\r
621         printf("temporary player sprite 1: http://www.pixiv.net/member_illust.php?mode=medium&illust_id=44606385\n");\r
622         printf("Screen: %dx", screen.width);    printf("%d\n", screen.height);\r
623         printf("Screen2: %dx", screen2.width);  printf("%d\n", screen2.height);\r
624         //printf("map.width=%d  map.height=%d   map.data[0]=%d\n", bg->map->width, bg->map->height, bg->map->data[0]);\r
625         //xmsfree(&map);\r
626         //xmsfree(bg);\r
627         //xmsfree(spri);\r
628         //xmsfree(mask);\r
629         //xmsreport();\r
630         //emmclose(emmhandle);\r
631         printf("%Fp\n", bios_8x8_font());\r
632         //printf("%c\n", *bios_8x8_font());\r
633         switch(detectcpu())\r
634         {\r
635                 case 0: cpus = "8086/8088 or 186/88"; break;\r
636                 case 1: cpus = "286"; break;\r
637                 case 2: cpus = "386 or newer"; break;\r
638                 default: cpus = "internal error"; break;\r
639         }\r
640         printf("detected CPU type: %s\n", cpus);\r
641         modexFadeOn(4, dpal);\r
642 }\r
643 \r
644 \r
645 map_t\r
646 allocMap(int w, int h) {\r
647         map_t result;\r
648 \r
649         result.width =w;\r
650         result.height=h;\r
651         result.data = malloc(sizeof(byte) * w * h);\r
652         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
653         /*if(isEMS() || checkEMS())\r
654         {\r
655                 XMOVE mm;\r
656                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
657                 mm.length=sizeof(result);\r
658                 mm.sourceH=0;\r
659                 mm.sourceOff=ptr2long(&result);\r
660                 mm.destH=emmhandle;\r
661                 mm.destOff=0;\r
662                 ist = move_emem(&mm);\r
663                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
664                 printf("%d\n", coretotalEMS());\r
665         }*/\r
666 \r
667         return result;\r
668 }\r
669 \r
670 void\r
671 initMap(map_t *map) {\r
672         /* just a place holder to fill out an alternating pattern */\r
673         int x, y, xx, yy;\r
674         int i, q;\r
675 //      int tile = 1;\r
676         //if(!isEMS() || !checkEMS())\r
677 //              map->tiles = malloc(sizeof(tiles_t));\r
678         //else\r
679         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
680 \r
681         /* create the tile set */\r
682         //if(!isEMS() || !checkEMS())\r
683 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
684         //else\r
685         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
686 //      map->tiles->data->width = (TILEWH/**2*/);\r
687 //      map->tiles->data->height= TILEWH;\r
688         //if(!isEMS() || !checkEMS())\r
689 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
690         //else\r
691         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
692 //      map->tiles->tileHeight = TILEWH;\r
693 //      map->tiles->tileWidth =TILEWH;\r
694 //      map->tiles->rows = 1;\r
695 //      map->tiles->cols = 1;//2;\r
696 \r
697         /*q=0;\r
698         //for(y=0; y<map->height; y++) {\r
699         //for(x=0; x<map->width; x++) {\r
700         i=0;\r
701         for(yy=0; yy<TILEWH; yy++) {\r
702         for(xx=0; xx<(TILEWH); xx++) {\r
703                 //if(x<TILEWH){\r
704                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
705 //                printf("[%d]", map->tiles->data->data[i]);\r
706                 //}else{\r
707                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
708                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
709                 //}\r
710                 i++;\r
711         }\r
712 //      printf("\n");\r
713         }\r
714 //      printf("[%d]", map->data[q]);\r
715         q++;\r
716 //      }\r
717         //printf("\n\n");\r
718 //      }*/\r
719 \r
720         /*i=0;\r
721         for(y=0; y<map->height; y++) {\r
722                 for(x=0; x<map->width; x++) {\r
723 //                      map->data[i]=255;\r
724                         printf("[%d]", map->data[i]);\r
725                         //tile = tile ? 0 : 1;\r
726                         i++;\r
727                 }\r
728                 //tile = tile ? 0 : 1;\r
729         }*/\r
730 }
731
732 \r
733 void\r
734 mapScrollRight(map_view_t *mv, byte offset, word id)
735 {\r
736         word x, y;  /* coordinate for drawing */\r
737 \r
738         /* increment the pixel position and update the page */\r
739         mv[id].page->dx += offset;\r
740 \r
741         /* check to see if this changes the tile */\r
742         if(mv[id].page->dx >= mv[id].dxThresh ) {\r
743         /* go forward one tile */\r
744         mv[id].tx++;\r
745         /* Snap the origin forward */\r
746         mv[id].page->data += 4;\r
747         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
748 \r
749         /* draw the next column */\r
750         x= SCREEN_WIDTH + mv[id].map->tiles->tileWidth;\r
751                 if(id==0)
752                         mapDrawCol(&mv[0], mv[0].tx + 20 , mv[0].ty-1, x);
753                 else
754                         modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);
755         }\r
756 }\r
757 \r
758 \r
759 void\r
760 mapScrollLeft(map_view_t *mv, byte offset, word id)
761 {\r
762         word x, y;  /* coordinate for drawing */\r
763 \r
764         /* increment the pixel position and update the page */\r
765         mv[id].page->dx -= offset;\r
766 \r
767         /* check to see if this changes the tile */\r
768         if(mv[id].page->dx == 0) {\r
769         /* go backward one tile */\r
770         mv[id].tx--;\r
771 \r
772         /* Snap the origin backward */\r
773         mv[id].page->data -= 4;\r
774         mv[id].page->dx = mv[id].map->tiles->tileWidth;\r
775 \r
776         /* draw the next column */
777         x= 0;\r
778                 if(id==0)\r
779                         mapDrawCol(&mv[0], mv[0].tx-1, mv[0].ty-1, 0);
780                 else
781                         modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*17);\r
782         }\r
783 }\r
784 \r
785 \r
786 void\r
787 mapScrollUp(map_view_t *mv, byte offset, word id)
788 {\r
789         word x, y;  /* coordinate for drawing */\r
790 \r
791         /* increment the pixel position and update the page */\r
792         mv[id].page->dy -= offset;\r
793 \r
794         /* check to see if this changes the tile */\r
795         if(mv[id].page->dy == 0 ) {\r
796         /* go down one tile */\r
797         mv[id].ty--;\r
798         /* Snap the origin downward */\r
799         mv[id].page->data -= mv[id].page->width*4;\r
800         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
801 \r
802         /* draw the next row */\r
803         y= 0;\r
804                 if(id==0)\r
805                         mapDrawRow(&mv[0], mv[0].tx-1 , mv[0].ty-1, 0);
806                 else\r
807                         modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);
808         }\r
809 }\r
810 \r
811 \r
812 void\r
813 mapScrollDown(map_view_t *mv, byte offset, word id)
814 {\r
815         word x, y;  /* coordinate for drawing */\r
816 \r
817         /* increment the pixel position and update the page */\r
818         mv[id].page->dy += offset;\r
819 \r
820         /* check to see if this changes the tile */\r
821         if(mv[id].page->dy >= mv[id].dyThresh ) {\r
822         /* go down one tile */\r
823         mv[id].ty++;\r
824         /* Snap the origin downward */\r
825         mv[id].page->data += mv[id].page->width*4;\r
826         mv[id].page->dy = mv[id].map->tiles->tileHeight;\r
827 \r
828         /* draw the next row */\r
829         y= SCREEN_HEIGHT + mv[id].map->tiles->tileHeight;\r
830                 if(id==0)\r
831                         mapDrawRow(&mv[0], mv[0].tx-1 , mv[0].ty+15, y);
832                 else
833                         modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*22, mv[id].map->tiles->tileHeight);\r
834         }\r
835 }\r
836 \r
837 \r
838 void\r
839 mapGoTo(map_view_t *mv, int tx, int ty) {\r
840         int px, py;\r
841         unsigned int i;\r
842 \r
843         /* set up the coordinates */\r
844         mv->tx = tx;\r
845         mv->ty = ty;\r
846         mv->page->dx = mv->map->tiles->tileWidth;\r
847         mv->page->dy = mv->map->tiles->tileHeight;\r
848 \r
849         /* set up the thresholds */\r
850         mv->dxThresh = mv->map->tiles->tileWidth * 2;\r
851         mv->dyThresh = mv->map->tiles->tileHeight * 2;\r
852 \r
853         /* draw the tiles */\r
854         modexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0);\r
855         py=0;\r
856         i=mv->ty * mv->map->width + mv->tx;\r
857         for(ty=mv->ty-1; py < SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; ty++, py+=mv->map->tiles->tileHeight) {\r
858                 mapDrawRow(mv, tx-1, ty, py);\r
859         i+=mv->map->width - tx;\r
860         }\r
861 }\r
862 \r
863 \r
864 void\r
865 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y) {\r
866         word rx;\r
867         word ry;\r
868         //if(i==0) i=2;\r
869         if(i==0)\r
870         {\r
871                 //wwww\r
872                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
873         }\r
874         else\r
875         {\r
876         rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
877         ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
878 ////0000        printf("i=%d\n", i);\r
879         //mxPutTile(t->data, x, y, t->tileWidth, t->tileHeight);\r
880         modexDrawBmpRegion(page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
881         }\r
882 }\r
883 \r
884 \r
885 void\r
886 mapDrawRow(map_view_t *mv, int tx, int ty, word y) {\r
887         word x;\r
888         int i;\r
889 \r
890         /* the position within the map array */\r
891         i=ty * mv->map->width + tx;\r
892         for(x=0; x<SCREEN_WIDTH+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
893         if(i>=0) {\r
894                 /* we are in the map, so copy! */\r
895                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
896         }\r
897         i++; /* next! */\r
898         }\r
899 }\r
900 \r
901 void\r
902 mapDrawCol(map_view_t *mv, int tx, int ty, word x) {\r
903         int y;\r
904         int i;\r
905 \r
906         /* location in the map array */\r
907         i=ty * mv->map->width + tx;\r
908 \r
909         /* We'll copy all of the columns in the screen, \r
910            i + 1 row above and one below */\r
911         for(y=0; y<SCREEN_HEIGHT+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
912         if(i>=0) {\r
913                 /* we are in the map, so copy away! */\r
914                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
915         }\r
916         i += mv->map->width;\r
917         }\r
918 }\r
919 \r
920 void qclean()\r
921 {\r
922         modexLeave();\r
923         setkb(0);\r
924 }\r
925 \r
926 void pdump(map_view_t *pee)\r
927 {\r
928         int mult=(QUADWH);\r
929         int palq=(mult)*TILEWH;\r
930         int palcol=0;\r
931         int palx, paly;\r
932         for(paly=0; paly<palq; paly+=mult){\r
933                 for(palx=0; palx<palq; palx+=mult){\r
934                                 modexClearRegion(pee->page, palx+TILEWH, paly+TILEWH, mult, mult, palcol);\r
935                         palcol++;\r
936                 }\r
937         }\r
938 }\r
939 \r
940 void\r
941 animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp)\r
942 {\r
943         sword dire=32*d; //direction\r
944         sword qq; //scroll offset\r
945 \r
946         if(scrolloffsetswitch==0) qq = 0;\r
947         else qq = ((lp)*SPEED);\r
948         switch (d)\r
949         {\r
950                 case 0:\r
951                         //up\r
952                         x=x-4;\r
953                         y=y-qq-TILEWH;\r
954                 break;\r
955                 case 1:\r
956                         // right\r
957                         x=x+qq-4;\r
958                         y=y-TILEWH;\r
959                 break;\r
960                 case 2:\r
961                         //down\r
962                         x=x-4;\r
963                         y=y+qq-TILEWH;\r
964                 break;\r
965                 case 3:\r
966                         //left\r
967                         x=x-qq-4;\r
968                         y=y-TILEWH;\r
969                 break;\r
970         }\r
971         modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);\r
972         if(2>ls && ls>=1) { modexDrawSpriteRegion(dest->page, x, y, 48, dire, 24, 32, bmp); }else\r
973         if(3>ls && ls>=2) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }else\r
974         if(4>ls && ls>=3) { modexDrawSpriteRegion(dest->page, x, y, 0, dire, 24, 32, bmp); }else\r
975         if(5>ls && ls>=4) { modexDrawSpriteRegion(dest->page, x, y, 24, dire, 24, 32, bmp); }\r
976         //TODO: mask copy //modexCopyPageRegion(dest->page, src->page, x-4, y-4, x-4, y-4, 28, 40);\r
977         //modexClearRegion(top->page, 66, 66, 2, 40, 0);\r
978         //modexCopyPageRegion(dest->page, top->page, 66, 66, 66, 66, 2, 40);\r
979         //turn this off if XT\r
980         //XTif(detectcpu() > 0) 
981         modexWaitBorder();\r
982 }\r