]> 4ch.mooo.com Git - 16.git/blob - src/lib/zcroll16.c
scroll.exe works again but the fps thingy dose not work because of MM zcroll breaks...
[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 boolean pageflipflop = 1;\r
189 \r
190 void near animatePlayer(map_view_t *pip, player_t *player,  sword scrollswitch)\r
191 {\r
192         sword x = player->x;\r
193         sword y = player->y;\r
194         sword bx = x+16;        //buffer's x\r
195         sword by = y+16;        //buffer's y\r
196         word dire=32; //direction\r
197         sword qq; //scroll offset\r
198         word ls = player->persist_aniframe;\r
199 \r
200         switch(scrollswitch)\r
201         {\r
202                 case 0:\r
203                         qq = 0;\r
204                 break;\r
205                 default:\r
206                         qq = ((player->q)*(player->speed));\r
207                 break;\r
208         }\r
209         //x-=4;\r
210         //y-=pip->map->tiles->tileHeight;\r
211         switch (player->d)\r
212         {\r
213                 case 0:\r
214                         //up\r
215                         dire*=player->d;\r
216                         y-=qq;\r
217                         by-=4;\r
218                 break;\r
219                 case 3:\r
220                         // right\r
221                         dire*=(player->d-2);\r
222                         x+=qq;\r
223                         bx+=4;\r
224                 break;\r
225                 case 2:\r
226                 break;\r
227                 case 4:\r
228                         //down\r
229                         dire*=(player->d-2);\r
230                         y+=qq;\r
231                         by+=4;\r
232                 break;\r
233                 case 1:\r
234                         //left\r
235                         dire*=(player->d+2);\r
236                         x-=qq;\r
237                         bx-=4;\r
238                 break;\r
239         }\r
240 \r
241 #ifdef SPRITE\r
242 #define FRAME1 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 48, dire, 24, 32, PLAYERBMPDATA);\r
243 #define FRAME2 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
244 #define FRAME3 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 24, 32,  PLAYERBMPDATA);\r
245 #define FRAME4 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
246 #else\r
247 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
248 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
249 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
250 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
251 #endif\r
252         if(!pageflipflop)\r
253                 modexCopyPageRegion(pip->page, pip->page, x-4, y-4, x-4, y-4, 28, 36);\r
254         else{\r
255                 //copy old bg to page0\r
256                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
257                 //update buffer\r
258                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
259         }\r
260         switch(ls)\r
261         {\r
262                 case 1:\r
263                         FRAME1\r
264                 break;\r
265                 case 2:\r
266                         FRAME2\r
267                 break;\r
268                 case 3:\r
269                         FRAME3\r
270                 break;\r
271                 case 4:\r
272                         FRAME4\r
273                 break;\r
274         }\r
275         pip->video->r=1;\r
276 }\r