]> 4ch.mooo.com Git - 16.git/blob - src/lib/zcroll16.c
52182f2bd79b46283041966024e468a7c3c273bc
[16.git] / src / lib / zcroll16.c
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2016 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         scroll16 library~\r
24 */\r
25 #include "src/lib/zcroll16.h"\r
26 \r
27 boolean boundary_check(int x, int y, int dx, int dy, int h, int w){\r
28         return (dx > 0 && (x + dx) < w) || (dx < 0 && (x + dx) >= 0) || (dy > 0 && (y + dy) < h) || (dy < 0 && (y + dy) >= 0) || (dx == dy && dx == 0);\r
29 }\r
30 \r
31 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v){\r
32         // Assume everything crosses at most 1 tile at once\r
33         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
34 }\r
35 \r
36 boolean walk(entity_t *ent, map_view_t *map_v){\r
37         return 1;\r
38         int dx = 1;\r
39         int dy = 1;\r
40         switch(ent->d){\r
41                 case STOP:\r
42                         return 0;\r
43                 case LEFT:\r
44                         dx = -dx;\r
45                 case RIGHT:\r
46                         dy = 0;\r
47                         break;\r
48                 case UP:\r
49                         dy = -dy;\r
50                 case DOWN:\r
51                         dx = 0;\r
52                         break;\r
53         }\r
54         if(coll_check(ent->x, ent->y, dx, dy,  map_v)){\r
55                 // Allow movement\r
56                 // Set speed\r
57                 // Start animation\r
58                 // Mark next tile as occupied\r
59                 // Mark this tile as vacant\r
60                 return 1;\r
61         }\r
62         return 0;\r
63 }\r
64 \r
65 void player_walk(player_t *player, map_view_t *map_v){\r
66         int dx, dy;\r
67         if(walk(player->ent, map_v) && boundary_check(map_v->tx, map_v->ty, dx, dy, map_v->map->width - 2*map_v->page->tilesw, map_v->map->height - 2*map_v->page->tilesh)){\r
68                 mapScroll(map_v, player);\r
69                 // (Un)load stuff?\r
70         }\r
71 }\r
72 \r
73 void mapGoTo(map_view_t *mv, int tx, int ty)\r
74 {\r
75         return;\r
76 }\r
77 \r
78 void near mapScroll(map_view_t *mv, player_t *player){\r
79         word x, y;  /* coordinate for drawing */\r
80         int c = 1;\r
81         int delta;\r
82         mv->delta += player->dx | player->dy;\r
83         delta = mv->delta;\r
84         mv->d = (player->dx) ? (player->dx > 0) ? RIGHT : LEFT : (player->dy) ? (player->dy > 0) ? DOWN : UP : STOP;\r
85         switch(mv->d){\r
86                 case DOWN:\r
87                         c = -1;\r
88                         delta = -delta;\r
89                 case UP:\r
90                         if(!(delta + mv->dxThresh)){\r
91                                 mv->delta = 0;\r
92                                 mv->ty += c;\r
93                         }\r
94                         break;\r
95                 case RIGHT:\r
96                         c = -1;\r
97                         delta = -delta;\r
98                 case LEFT:\r
99                         if(!(delta + mv->dyThresh)){\r
100                                 mv->delta = 0;\r
101                                 mv->tx += c;\r
102                         }\r
103                         break;\r
104                 default:\r
105                         break;\r
106         }\r
107 \r
108         mv->video->r=1;\r
109 }\r
110 \r
111 sword chkmap(map_t *map, word q)\r
112 {\r
113         /*\r
114 //      bitmap_t bp;\r
115         static byte x[(MAPW*MAPH)+1] =\r
116 { 1, 2, 3, 4, 0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 10, 11, 12, 4, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 0, 1, 1, 1, 5, 8, 1, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, 0, 0, 0, 0, 8, 8, 1, 11, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 2, 3, 4, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 5, 6, 7, 8, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 9, 10, 11, 12, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10 };\r
117         //check for failed to load map\r
118         if((map->width == map->height == 0) && (q>0))\r
119         {\r
120                 //initiate a null map!\r
121                 map->width=MAPW;///2;\r
122                 map->height=MAPH;///2;\r
123 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
124                 map->data = &x;\r
125                 map->tiles = malloc(sizeof(tiles_t));\r
126                 //fix this to be far~\r
127 //              bp = bitmapLoadPcx("data/ed.pcx");\r
128 //              map->tiles->data = &bp;\r
129                 map->tiles->debug_data = map->data;\r
130                 map->tiles->tileHeight = 16;\r
131                 map->tiles->tileWidth = 16;\r
132                 map->tiles->rows = 1;\r
133                 map->tiles->cols = 1;\r
134                 map->tiles->debug_text = true;\r
135         }\r
136         else map->tiles->debug_text = false;*/\r
137         return 0;\r
138 }\r
139 \r
140 //TODO: player position here\r
141 \r
142 void near\r
143 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
144 {\r
145         word rx;\r
146         word ry;\r
147         word textx=0;\r
148         word texty=0;\r
149         //if(i==0) i=2;\r
150         if(i==0)\r
151         {\r
152                 //wwww\r
153                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
154         }\r
155         else\r
156         {\r
157                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
158                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
159 ////0000printf("i=%d\n", i);\r
160                 switch(t->debug_text)\r
161                 {\r
162                         case 0:\r
163 #ifndef TILERENDER\r
164                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((t->debug_data[i])+1));\r
165                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
166 #else\r
167                                 PBUFBFUN                (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
168                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
169                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
170                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
171 #endif\r
172                         break;\r
173                         case 1:\r
174                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (t->debug_data[i])+1);\r
175                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
176                                 /*for(texty=0; texty<2; texty++)\r
177                                 {\r
178                                         for(textx=0; textx<2; textx++)\r
179                                         {*/\r
180 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
181 /*                                      }\r
182                                 }*/\r
183                         break;\r
184                 }\r
185         }\r
186 }\r
187 \r
188 unsigned char shinku_fps_indicator_page = 2;\r
189 boolean pageflipflop = 1;\r
190 boolean pageploop = 1;\r
191 \r
192 /*      sync    */\r
193 void shinku(global_game_variables_t *gv)\r
194 {\r
195         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
196         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
197         word w = 64, h = 8, col = 7, bgcol = 0, type = 1;\r
198         byte o,o2,i;\r
199         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
200         {\r
201                 sprintf(gv->pee, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
202                 //modexClearRegion(&(gv->video.page[shinku_fps_indicator_page]), x, y, w, h, 45);\r
203                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, gv->pee);\r
204                 gv->kurokku.tiku=0;\r
205         }else //copy dat sheet\r
206         gv->kurokku.tiku++;\r
207 \r
208         switch(gv->kurokku.fpscap)\r
209         {\r
210                 case 0:\r
211                         gv->kurokku.frames_per_second=1;\r
212                 break;\r
213                 case 1:\r
214                         //turn this off if XT\r
215                         vga_wait_for_vsync();\r
216                         gv->kurokku.frames_per_second=60;\r
217                 break;\r
218         }\r
219         /*\r
220         if(pageflipflop){\r
221                 if(gv->video.r){\r
222                         if(!pageploop) modexCopyPageRegion(&(gv->video.page[(gv->video.p)]), &(gv->video.page[(!gv->video.p)]), 0, 0, 0, 0, gv->video.page[gv->video.p].width, gv->video.page[!gv->video.p].height);\r
223                         modexShowPage(&(gv->video.page[gv->video.p]));\r
224                         if(!pageploop) gv->video.p=!gv->video.p;\r
225                         gv->video.r=!gv->video.r;\r
226                 }\r
227         }*/\r
228 }\r
229 \r
230 void near animatePlayer(map_view_t *pip, player_t *player,  sword scrollswitch)\r
231 {\r
232         sword x = player->x;\r
233         sword y = player->y;\r
234         sword bx = x+16;        //buffer's x\r
235         sword by = y+16;        //buffer's y\r
236         word dire=32; //direction\r
237         sword qq; //scroll offset\r
238         word ls = player->persist_aniframe;\r
239 \r
240         switch(scrollswitch)\r
241         {\r
242                 case 0:\r
243                         qq = 0;\r
244                 break;\r
245                 default:\r
246                         qq = ((player->q)*(player->speed));\r
247                 break;\r
248         }\r
249         //x-=4;\r
250         //y-=pip->map->tiles->tileHeight;\r
251         switch (player->d)\r
252         {\r
253                 case 0:\r
254                         //up\r
255                         dire*=player->d;\r
256                         y-=qq;\r
257                         by-=4;\r
258                 break;\r
259                 case 3:\r
260                         // right\r
261                         dire*=(player->d-2);\r
262                         x+=qq;\r
263                         bx+=4;\r
264                 break;\r
265                 case 2:\r
266                 break;\r
267                 case 4:\r
268                         //down\r
269                         dire*=(player->d-2);\r
270                         y+=qq;\r
271                         by+=4;\r
272                 break;\r
273                 case 1:\r
274                         //left\r
275                         dire*=(player->d+2);\r
276                         x-=qq;\r
277                         bx-=4;\r
278                 break;\r
279         }\r
280 \r
281 #ifdef SPRITE\r
282 #define FRAME1 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 48, dire, 24, 32, PLAYERBMPDATA);\r
283 #define FRAME2 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
284 #define FRAME3 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 24, 32,  PLAYERBMPDATA);\r
285 #define FRAME4 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
286 #else\r
287 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
288 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
289 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
290 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
291 #endif\r
292         if(!pageflipflop)\r
293                 modexCopyPageRegion(pip->page, pip->page, x-4, y-4, x-4, y-4, 28, 36);\r
294         else{\r
295                 //copy old bg to page0\r
296                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
297                 //update buffer\r
298                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
299         }\r
300         switch(ls)\r
301         {\r
302                 case 1:\r
303                         FRAME1\r
304                 break;\r
305                 case 2:\r
306                         FRAME2\r
307                 break;\r
308                 case 3:\r
309                         FRAME3\r
310                 break;\r
311                 case 4:\r
312                         FRAME4\r
313                 break;\r
314         }\r
315         pip->video->r=1;\r
316 }\r