]> 4ch.mooo.com Git - 16.git/blob - src/lib/scroll16.c
palllist not being worked on right now... i will work on sprite animation VERY soon
[16.git] / src / lib / scroll16.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/scroll16.h"\r
26 \r
27 void oldwalk(map_view_t *pip, player_t *player, word pn)\r
28 {\r
29         #define INC_PER_FRAME if(player[pn].enti.q&1) player[pn].enti.persist_aniframe++; if(player[pn].enti.persist_aniframe>4) player[pn].enti.persist_aniframe = 1;\r
30         //printf("player[%d].d=%d\n", pn, player[pn].enti.d);\r
31         switch(player[pn].enti.d)\r
32         {\r
33                 //no direction\r
34                 case 2:\r
35                         //0000pip[0].video->startclk = (*clockw);\r
36                 break;\r
37                 //right movement\r
38                 case 3:\r
39                         //printf("pip[0].page->tilesw=%d        ", pip[0].page->tilesw); printf("pip[0].page->tw=%d\n", pip[0].page->tw);\r
40                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
41                         !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))  //collision detection!\r
42                         {\r
43                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
44                                 {\r
45                                         INC_PER_FRAME;\r
46                                         animatePlayer(pip, player, pn, 1);\r
47                                         ScrollRight(pip, player, 3, pn);\r
48                                         ScrollRight(pip, player, 2, pn);\r
49                                         //mapScrollRight(pip, player, !(pip[0].video->p), pn);\r
50                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
51                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
52                                         player[pn].enti.q++;\r
53                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
54                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
55                         }\r
56                         else if(player[pn].enti.tx < pip[0].map->width && !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
57                         {\r
58                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
59                                 {\r
60                                         INC_PER_FRAME;\r
61                                         player[pn].enti.x+=(player[pn].enti.speed);\r
62                                         animatePlayer(pip, player, pn, 0);\r
63                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
64                                         player[pn].enti.q++;\r
65                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
66                         }\r
67                         else\r
68                         {\r
69                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32);\r
70 #ifdef SPRITE\r
71                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 24, 32, PLAYERBMPDATAPTR);\r
72 #else\r
73                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 14);\r
74 #endif\r
75                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
76                                 player[pn].enti.d = 2;\r
77                         }\r
78                         player[pn].enti.triggerx = player[pn].enti.tx+1;\r
79                         player[pn].enti.triggery = player[pn].enti.ty;\r
80                 break;\r
81 \r
82                 //left movement\r
83                 case 1:\r
84                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
85                         !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))        //collision detection!\r
86                         {\r
87                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
88                                 {\r
89                                         INC_PER_FRAME;\r
90                                         animatePlayer(pip, player, pn, 1);\r
91                                         ScrollLeft(pip, player, 3, pn);\r
92                                         ScrollLeft(pip, player, 2, pn);\r
93                                         //mapScrollLeft(pip, player, !(pip[0].video->p), pn);\r
94                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
95                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
96                                         player[pn].enti.q++;\r
97                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
98                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
99                         }\r
100                         else if(player[pn].enti.tx > 1 && !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
101                         {\r
102                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
103                                 {\r
104                                         INC_PER_FRAME;\r
105                                         player[pn].enti.x-=(player[pn].enti.speed);\r
106                                         animatePlayer(pip, player, pn, 0);\r
107                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
108                                         player[pn].enti.q++;\r
109                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
110                         }\r
111                         else\r
112                         {\r
113                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32);\r
114 #ifdef SPRITE\r
115                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 96, 24, 32, PLAYERBMPDATAPTR);\r
116 #else\r
117                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 10);\r
118 #endif\r
119                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
120                                 player[pn].enti.d = 2;\r
121                         }\r
122                         player[pn].enti.triggerx = player[pn].enti.tx-1;\r
123                         player[pn].enti.triggery = player[pn].enti.ty;\r
124                 break;\r
125 \r
126                 //down movement\r
127                 case 4:\r
128                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
129                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))  //collision detection!\r
130                         {\r
131                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
132                                 {\r
133                                         INC_PER_FRAME;\r
134                                         animatePlayer(pip, player, pn, 1);\r
135                                         ScrollDown(pip, player, 3, pn);\r
136                                         ScrollDown(pip, player, 2, pn);\r
137                                         //mapScrollDown(pip, player, !(pip[0].video->p), pn);\r
138                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
139                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
140                                         player[pn].enti.q++;\r
141                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
142                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
143                         }\r
144                         else if(player[pn].enti.ty < pip[0].map->height && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))\r
145                         {\r
146                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
147                                 {\r
148                                         INC_PER_FRAME;\r
149                                         player[pn].enti.y+=(player[pn].enti.speed);\r
150                                         animatePlayer(pip, player, pn, 0);\r
151                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
152                                         player[pn].enti.q++;\r
153                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
154                         }\r
155                         else\r
156                         {\r
157                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32);\r
158 #ifdef SPRITE\r
159                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 64, 24, 32, PLAYERBMPDATAPTR);\r
160 #else\r
161                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 9);\r
162 #endif\r
163                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
164                                 player[pn].enti.d = 2;\r
165                         }\r
166                         player[pn].enti.triggerx = player[pn].enti.tx;\r
167                         player[pn].enti.triggery = player[pn].enti.ty+1;\r
168                 break;\r
169 \r
170                 //up movement\r
171                 case 0:\r
172                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
173                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY))        //collision detection!\r
174                         {\r
175                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
176                                 {\r
177                                         INC_PER_FRAME;\r
178                                         animatePlayer(pip, player, pn, 1);\r
179                                         ScrollUp(pip, player, 3, pn);\r
180                                         ScrollUp(pip, player, 2, pn);\r
181                                         //mapScrollUp(pip, player, !(pip[0].video->p), pn);\r
182                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
183                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
184                                         player[pn].enti.q++;\r
185                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
186                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
187                         }\r
188                         else if(player[pn].enti.ty > 1 && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX &&  player[pn].enti.ty-1 == TRIGGY))\r
189                         {\r
190                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
191                                 {\r
192                                         INC_PER_FRAME;\r
193                                         player[pn].enti.y-=(player[pn].enti.speed);\r
194                                         animatePlayer(pip, player, 0, pn);\r
195                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
196                                         player[pn].enti.q++;\r
197                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
198                         }\r
199                         else\r
200                         {\r
201                                 if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32);\r
202 #ifdef SPRITE\r
203                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 0, 24, 32, PLAYERBMPDATAPTR);\r
204 #else\r
205                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 12);\r
206 #endif\r
207                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
208                                 player[pn].enti.d = 2;\r
209                         }\r
210                         player[pn].enti.triggerx = player[pn].enti.tx;\r
211                         player[pn].enti.triggery = player[pn].enti.ty-1;\r
212                 break;\r
213         }\r
214 }\r
215 \r
216 \r
217 /*\r
218 src/lib/scroll16.c:     mv[0].video->r=1;\r
219 src/lib/scroll16.c:     mv[0].video->r=1;\r
220 src/lib/scroll16.c:     mv[0].video->r=1;\r
221 src/lib/scroll16.c:     mv[0].video->r=1;\r
222 src/lib/scroll16.c:     pip->video->r=1;\r
223 src/lib/scroll16.c:     mv->video->r=1;\r
224  */\r
225 \r
226 void ZC_walk(map_view_t *pip, player_t *player, word pn)\r
227 {\r
228         #define INC_PER_FRAME if(player[pn].enti.q&1) player[pn].enti.persist_aniframe++; if(player[pn].enti.persist_aniframe>4) player[pn].enti.persist_aniframe = 1;\r
229         switch(player[pn].enti.d)\r
230         {\r
231                 //no direction\r
232                 case 2:\r
233                         //0000pip[0].video->startclk = (*clockw);\r
234                 break;\r
235                 //right movement\r
236                 case 3:\r
237                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
238                         !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))  //collision detection!\r
239                         {\r
240                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
241                                 {\r
242                                         INC_PER_FRAME;\r
243                                         animatePlayer(pip, player, pn, 1);\r
244                                         ScrollRight(pip, player, 3, pn);\r
245                                         ScrollRight(pip, player, 2, pn);\r
246                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
247                                         player[pn].enti.q++;\r
248                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
249                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
250                         }\r
251                         else if(player[pn].enti.tx < pip[0].map->width && !(pip[0].map->data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
252                         {\r
253                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
254                                 {\r
255                                         INC_PER_FRAME;\r
256                                         player[pn].enti.x+=(player[pn].enti.speed);\r
257                                         animatePlayer(pip, player, pn, 0);\r
258                                         player[pn].enti.q++;\r
259                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
260                         }\r
261                         else\r
262                         {\r
263 #ifdef SPRITE\r
264                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 24, 32, PLAYERBMPDATAPTR);\r
265 #else\r
266                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 14);\r
267 #endif\r
268                                 player[pn].enti.d = 2;\r
269                         }\r
270                         player[pn].enti.triggerx = player[pn].enti.tx+1;\r
271                         player[pn].enti.triggery = player[pn].enti.ty;\r
272                 break;\r
273                 //left movement\r
274                 case 1:\r
275                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].map->width && player[pn].enti.tx == pip[0].tx+pip[0].page->tilemidposscreenx &&\r
276                         !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))        //collision detection!\r
277                         {\r
278                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
279                                 {\r
280                                         INC_PER_FRAME;\r
281                                         animatePlayer(pip, player, pn, 1);\r
282                                         ScrollLeft(pip, player, 3, pn);\r
283                                         ScrollLeft(pip, player, 2, pn);\r
284                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
285                                         player[pn].enti.q++;\r
286                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
287                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
288                         }\r
289                         else if(player[pn].enti.tx > 1 && !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
290                         {\r
291                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
292                                 {\r
293                                         INC_PER_FRAME;\r
294                                         player[pn].enti.x-=(player[pn].enti.speed);\r
295                                         animatePlayer(pip, player, pn, 0);\r
296                                         player[pn].enti.q++;\r
297                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
298                         }\r
299                         else\r
300                         {\r
301 #ifdef SPRITE\r
302                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 96, 24, 32, PLAYERBMPDATAPTR);\r
303 #else\r
304                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 10);\r
305 #endif\r
306                                 player[pn].enti.d = 2;\r
307                         }\r
308                         player[pn].enti.triggerx = player[pn].enti.tx-1;\r
309                         player[pn].enti.triggery = player[pn].enti.ty;\r
310                 break;\r
311                 //down movement\r
312                 case 4:\r
313                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
314                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))  //collision detection!\r
315                         {\r
316                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
317                                 {\r
318                                         INC_PER_FRAME;\r
319                                         animatePlayer(pip, player, pn, 1);\r
320                                         ScrollDown(pip, player, 3, pn);\r
321                                         ScrollDown(pip, player, 2, pn);\r
322                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
323                                         player[pn].enti.q++;\r
324                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
325                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
326                         }\r
327                         else if(player[pn].enti.ty < pip[0].map->height && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY))\r
328                         {\r
329                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
330                                 {\r
331                                         INC_PER_FRAME;\r
332                                         player[pn].enti.y+=(player[pn].enti.speed);\r
333                                         animatePlayer(pip, player, pn, 0);\r
334                                         player[pn].enti.q++;\r
335                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
336                         }\r
337                         else\r
338                         {\r
339 #ifdef SPRITE\r
340                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 64, 24, 32, PLAYERBMPDATAPTR);\r
341 #else\r
342                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 9);\r
343 #endif\r
344                                 player[pn].enti.d = 2;\r
345                         }\r
346                         player[pn].enti.triggerx = player[pn].enti.tx;\r
347                         player[pn].enti.triggery = player[pn].enti.ty+1;\r
348                 break;\r
349                 //up movement\r
350                 case 0:\r
351                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
352                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY))        //collision detection!\r
353                         {\r
354                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
355                                 {\r
356                                         INC_PER_FRAME;\r
357                                         animatePlayer(pip, player, pn, 1);\r
358                                         ScrollUp(pip, player, 3, pn);\r
359                                         ScrollUp(pip, player, 2, pn);\r
360                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
361                                         player[pn].enti.q++;\r
362                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
363                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
364                         }\r
365                         else if(player[pn].enti.ty > 1 && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX &&  player[pn].enti.ty-1 == TRIGGY))\r
366                         {\r
367                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
368                                 {\r
369                                         INC_PER_FRAME;\r
370                                         player[pn].enti.y-=(player[pn].enti.speed);\r
371                                         animatePlayer(pip, player, 0, pn);\r
372                                         player[pn].enti.q++;\r
373                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
374                         }\r
375                         else\r
376                         {\r
377 #ifdef SPRITE\r
378                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 0, 24, 32, PLAYERBMPDATAPTR);\r
379 #else\r
380                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 12);\r
381 #endif\r
382                                 player[pn].enti.d = 2;\r
383                         }\r
384                         player[pn].enti.triggerx = player[pn].enti.tx;\r
385                         player[pn].enti.triggery = player[pn].enti.ty-1;\r
386                 break;\r
387         }\r
388 }\r
389 \r
390 //panning page\r
391 void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)\r
392 {\r
393 #define SHOWMVFUN_ ZC_ShowMV(pip, 0, 0);\r
394         switch(player[pn].enti.d)\r
395         {\r
396                 //right movement\r
397                 case 3:\r
398                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].page->tilesw)\r
399                         {\r
400                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
401                                 {\r
402                                         pip[0].page->dx+=4;\r
403                                         SHOWMVFUN_;\r
404                                         player[pn].enti.q++;\r
405                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx++; }\r
406                         }\r
407                 break;\r
408 \r
409                 //left movement\r
410                 case 1:\r
411                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].page->tilesw)\r
412                         {\r
413                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
414                                 {\r
415                                         pip[0].page->dx-=4;\r
416                                         SHOWMVFUN_;\r
417                                         player[pn].enti.q++;\r
418                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].tx--; }\r
419                         }\r
420                 break;\r
421 \r
422                 //down movement\r
423                 case 4:\r
424                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].page->tilesh)\r
425                         {\r
426                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
427                                 {\r
428                                         pip[0].page->dy+=4;\r
429                                         SHOWMVFUN_;\r
430                                         player[pn].enti.q++;\r
431                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty++; }\r
432                         }\r
433                 break;\r
434 \r
435                 //up movement\r
436                 case 0:\r
437                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].page->tilesh)\r
438                         {\r
439                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
440                                 {\r
441                                         pip[0].page->dy-=4;\r
442                                         SHOWMVFUN_;\r
443                                         player[pn].enti.q++;\r
444                                 } else { player[pn].enti.q = 1; player[pn].enti.d = 2; pip[0].ty--; }\r
445                         }\r
446                 break;\r
447         }\r
448 }\r
449 \r
450 /*\r
451  * modex mv setup\r
452 */\r
453 void ZC_MVSetup(map_view_t *pip, map_t *map, global_game_variables_t *gv)\r
454 {\r
455 #define ZC_MVI 1\r
456         nibble i;\r
457         // 1st page\r
458         pip[0].page = &gv->video.page[0];\r
459         pip[0].map = map;\r
460         pip[0].video = &gv->video;\r
461         pip[0].panp     = &gv->video.panp;\r
462         ZC_MVInit(pip, 1, 1);\r
463 \r
464         for(i=ZC_MVI;i<gv->video.num_of_pages;i++)\r
465         {\r
466                 pip[i].page     =       &gv->video.page[i];\r
467                 pip[i].map      =       pip[0].map;\r
468                 pip[i].video    =       pip[0].video;\r
469                 pip[i].panp     =       pip[0].panp;\r
470 //              if(i>ZC_MVI) {\r
471                 pip[i].tx =     1;\r
472                 pip[i].ty =     1;\r
473 //              }\r
474         }\r
475 }\r
476 \r
477 void ZC_MVInit(map_view_t *pip, int tx, int ty)\r
478 {\r
479         pip[0].tx = tx;\r
480         pip[0].ty = ty;\r
481         //pip[0].tx = pip[1].tx = tx;\r
482         //pip[0].ty = pip[1].ty = ty;\r
483 }\r
484 \r
485 void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)\r
486 {\r
487         word high_address, low_address, offset;\r
488         byte crtcOffset;\r
489 \r
490         /* calculate offset */\r
491         offset = (word) moo[moo[0].video->panp].page->data;\r
492         offset += moo[0].page->dy * (moo[0].page->width >> 2 );\r
493         offset += moo[0].page->dx >> 2;\r
494 \r
495         /* calculate crtcOffset according to virtual width */\r
496         switch(sr)\r
497         {\r
498                 case 1:\r
499                         crtcOffset = moo[0].page->sw >> 3;\r
500                 break;\r
501                 default:\r
502                 case 0:\r
503                         crtcOffset = moo[0].page->width >> 3;\r
504                 break;\r
505         }\r
506 \r
507         high_address = HIGH_ADDRESS | (offset & 0xff00);\r
508         low_address  = LOW_ADDRESS  | (offset << 8);\r
509 \r
510         /* wait for appropriate timing and then program CRTC */\r
511         if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
512         outpw(CRTC_INDEX, high_address);\r
513         outpw(CRTC_INDEX, low_address);\r
514         outp(CRTC_INDEX, 0x13);\r
515         outp(CRTC_DATA, crtcOffset);\r
516 \r
517         /* wait for one retrace */\r
518         if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
519 \r
520         /* do PEL panning here */\r
521         outp(AC_INDEX, 0x33);\r
522         outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);\r
523 }\r
524 \r
525 /*map_t\r
526 allocMap(int w, int h) {\r
527         map_t result;\r
528 \r
529         result.width =w;\r
530         result.height=h;\r
531         result.data = malloc(sizeof(byte) * w * h);\r
532         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
533         if(isEMS() || checkEMS())\r
534         {\r
535                 XMOVE mm;\r
536                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
537                 mm.length=sizeof(result);\r
538                 mm.sourceH=0;\r
539                 mm.sourceOff=ptr2long(&result);\r
540                 mm.destH=emmhandle;\r
541                 mm.destOff=0;\r
542                 ist = move_emem(&mm);\r
543                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
544                 printf("%d\n", coretotalEMS());\r
545         }\r
546 \r
547         return result;\r
548 }*/\r
549 \r
550 /*void\r
551 initMap(map_t *map) {\r
552         // just a place holder to fill out an alternating pattern\r
553         int x, y, xx, yy;\r
554         int i, q;\r
555 //      int tile = 1;\r
556         //if(!isEMS() || !checkEMS())\r
557 //              map->tiles = malloc(sizeof(tiles_t));\r
558         //else\r
559         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
560 \r
561          //create the tile set\r
562         //if(!isEMS() || !checkEMS())\r
563 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
564         //else\r
565         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
566 //      map->tiles->data->width = (TILEWH);\r
567 //      map->tiles->data->height= TILEWH;\r
568         //if(!isEMS() || !checkEMS())\r
569 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
570         //else\r
571         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
572 //      map->tiles->tileHeight = TILEWH;\r
573 //      map->tiles->tileWidth =TILEWH;\r
574 //      map->tiles->rows = 1;\r
575 //      map->tiles->cols = 1;//2;\r
576 \r
577         q=0;\r
578         //for(y=0; y<map->height; y++) {\r
579         //for(x=0; x<map->width; x++) {\r
580         i=0;\r
581         for(yy=0; yy<TILEWH; yy++) {\r
582         for(xx=0; xx<(TILEWH); xx++) {\r
583                 //if(x<TILEWH){\r
584                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
585 //                printf("[%d]", map->tiles->data->data[i]);\r
586                 //}else{\r
587                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
588                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
589                 //}\r
590                 i++;\r
591         }\r
592 //      printf("\n");\r
593         }\r
594 //      printf("[%d]", map->data[q]);\r
595         q++;\r
596 //      }\r
597         //printf("\n\n");\r
598 //      }\r
599 \r
600         i=0;\r
601         for(y=0; y<map->height; y++) {\r
602                 for(x=0; x<map->width; x++) {\r
603 //                      map->data[i]=255;\r
604                         printf("[%d]", map->data[i]);\r
605                         //tile = tile ? 0 : 1;\r
606                         i++;\r
607                 }\r
608                 //tile = tile ? 0 : 1;\r
609         }\r
610 }*/\r
611 \r
612 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
613 {\r
614         word x;//, y;  /* coordinate for drawing */\r
615 \r
616         /* increment the pixel position and update the page */\r
617         mv[id].page[0].dx += player[plid].enti.speed;\r
618 \r
619         /* check to see if this changes the tile */\r
620         if(mv[id].page[0].dx >= mv[id].dxThresh )\r
621         {\r
622         /* go forward one tile */\r
623         mv[id].tx++;\r
624         /* Snap the origin forward */\r
625         mv[id].page->data += 4;\r
626 \r
627         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
628         }\r
629 \r
630         /* draw the next column */\r
631         x= mv[0].page->sw + mv[id].map->tiles->tileWidth;\r
632         if(player[plid].enti.q%4)\r
633                 if(id==0)\r
634                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page[0].dx);\r
635                 else\r
636                         if(!pageflipflop && !pageploop)\r
637                                 modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));\r
638         mv[0].video->r=1;\r
639 }\r
640 \r
641 \r
642 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
643 {\r
644         word x;//,y;  /* coordinate for drawing */\r
645 \r
646         /* decrement the pixel position and update the page */\r
647         mv[id].page[0].dx -= player[plid].enti.speed;\r
648 \r
649         /* check to see if this changes the tile */\r
650         if(mv[id].page[0].dx == 0)\r
651         {\r
652         /* go backward one tile */\r
653         mv[id].tx--;\r
654         /* Snap the origin backward */\r
655         mv[id].page->data -= 4;\r
656 \r
657         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
658         }\r
659 \r
660         /* draw the next column */\r
661         x= 0;\r
662         if(player[plid].enti.q%4)\r
663                 if(id==0)\r
664                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page[0].dx);\r
665                 else\r
666                         if(!pageflipflop && !pageploop)\r
667                                 modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->th+2));\r
668         mv[0].video->r=1;\r
669 }\r
670 \r
671 \r
672 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
673 {\r
674         word y;//x,  /* coordinate for drawing */\r
675 \r
676         /* decrement the pixel position and update the page */\r
677         mv[id].page[0].dy -= player[plid].enti.speed;\r
678 \r
679         /* check to see if this changes the tile */\r
680         if(mv[id].page[0].dy == 0 )\r
681         {\r
682         /* go down one tile */\r
683         mv[id].ty--;\r
684         /* Snap the origin downward */\r
685         mv[id].page->data -= mv[id].page->pi;\r
686 \r
687         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
688         }\r
689 \r
690         /* draw the next row */\r
691         y= 0;\r
692         if(player[plid].enti.q%3)\r
693                 if(id==0)\r
694                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page[0].dy);\r
695                 else\r
696                         if(!pageflipflop && !pageploop)\r
697                                 modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);\r
698         mv[0].video->r=1;\r
699 }\r
700 \r
701 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
702 {\r
703         word y;//x,  /* coordinate for drawing */\r
704 \r
705         /* increment the pixel position and update the page */\r
706         mv[id].page[0].dy += player[plid].enti.speed;\r
707 \r
708         /* check to see if this changes the tile */\r
709         if(mv[id].page[0].dy >= mv[id].dyThresh )\r
710         {\r
711         /* go down one tile */\r
712         mv[id].ty++;\r
713         /* Snap the origin downward */\r
714         mv[id].page->data += mv[id].page->pi;\r
715 \r
716         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
717         }\r
718 \r
719         /* draw the next row */\r
720         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
721         if(player[plid].enti.q%3)\r
722                 if(id==0)\r
723                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page[0].dy);\r
724                 else\r
725                         if(!pageflipflop && !pageploop)\r
726                                 modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->tw+2), mv[id].map->tiles->tileHeight);\r
727         mv[0].video->r=1;\r
728 }\r
729 \r
730 \r
731 //TODO finish this wwww\r
732 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
733 {\r
734         /* increment the pixel position and update the page */\r
735         mv[id].page->dx += player[plid].enti.speed;\r
736 \r
737         /* check to see if this changes the tile */\r
738         if(mv[id].page->dx >= mv[0].dxThresh )\r
739         {\r
740 //              vga_setup_wm1_block_copy();\r
741 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
742 //              vga_restore_rm0wm0();\r
743                 /* Snap the origin forward */\r
744                 mv[id].page->data += 4;\r
745                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
746         }\r
747 }\r
748 \r
749 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
750 {\r
751         /* decrement the pixel position and update the page */\r
752         mv[id].page->dx -= player[plid].enti.speed;\r
753 \r
754         /* check to see if this changes the tile */\r
755         if(mv[id].page->dx == 0)\r
756         {\r
757 //              vga_setup_wm1_block_copy();\r
758 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
759 //              vga_restore_rm0wm0();\r
760                 /* Snap the origin backward */\r
761                 mv[id].page->data -= 4;\r
762                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
763         }\r
764 }\r
765 \r
766 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
767 {\r
768         /* decrement the pixel position and update the page */\r
769         mv[id].page->dy -= player[plid].enti.speed;\r
770 \r
771         /* check to see if this changes the tile */\r
772         if(mv[id].page->dy == 0)\r
773         {\r
774 //              vga_setup_wm1_block_copy();\r
775 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
776 //              vga_restore_rm0wm0();\r
777                 /* Snap the origin backward */\r
778                 mv[id].page->data -= mv[id].page->pi;\r
779                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
780         }\r
781 }\r
782 \r
783 void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
784 {\r
785         /* increment the pixel position and update the page */\r
786         mv[id].page->dy += player[plid].enti.speed;\r
787 \r
788         /* check to see if this changes the tile */\r
789         if(mv[id].page->dy >= mv[0].dxThresh )\r
790         {\r
791 //              vga_setup_wm1_block_copy();\r
792 //              _fmemmove(mv[id].page->data+mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
793 //              vga_restore_rm0wm0();\r
794                 /* Snap the origin forward */\r
795                 mv[id].page->data += mv[id].page->pi;\r
796                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
797         }\r
798 }\r
799 \r
800 //===========================================================================\r
801 //TODO: put player in starting position of assigned spot on map\r
802 //default player position on the viewable map\r
803 void playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
804 {\r
805         player[pn].enti.tx = x + pip[0].tx + pip[0].page->tilemidposscreenx;\r
806         player[pn].enti.ty = y + pip[0].ty + pip[0].page->tilemidposscreeny;\r
807 }\r
808 //===========================================================================\r
809 \r
810 sword chkmap(map_t *map, word q)\r
811 {\r
812 //      bitmap_t bp;\r
813         static byte x[(MAPW*MAPH)+1] =\r
814 { 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
815 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
816 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
817 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
818 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
819 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
820 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
821 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
822 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
823 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
824 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
825 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
826 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
827 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
828 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
829 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
830         //check for failed to load map\r
831         if((map->width == map->height == 0) && (q>0))\r
832         {\r
833                 //initiate a null map!\r
834                 map->width=MAPW;///2;\r
835                 map->height=MAPH;///2;\r
836 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
837                 map->data = &x;\r
838                 map->tiles = malloc(sizeof(tiles_t));\r
839                 //fix this to be far~\r
840 //              bp = bitmapLoadPcx("data/ed.pcx");\r
841 //              map->tiles->data = &bp;\r
842 #ifdef __DEBUG_MAP__\r
843                 dbg_mapdata = map->data;\r
844 #endif\r
845                 map->tiles->tileHeight = 16;\r
846                 map->tiles->tileWidth = 16;\r
847                 map->tiles->rows = 1;\r
848                 map->tiles->cols = 1;\r
849 #ifdef __DEBUG_MAP__\r
850                 dbg_maptext = true;\r
851 #endif\r
852         }\r
853 #ifdef __DEBUG_MAP__\r
854         else dbg_maptext = false;\r
855 #endif\r
856         return 0;\r
857 }\r
858 \r
859 //TODO: player position here\r
860 void mapGoTo(map_view_t *mv, int tx, int ty)\r
861 {\r
862         int py;//px,\r
863         unsigned int i;\r
864 \r
865         mapinitmapview(mv, tx, ty);\r
866 \r
867         /* draw the tiles */\r
868         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
869         py=0;\r
870         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
871         for(ty=mv[0].ty-1; py < mv[0].page->sh+mv->dyThresh && ty < mv[0].map->height; ty++, py+=mv[0].map->tiles->tileHeight) {\r
872                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
873         i+=mv->map->width - tx;\r
874         }\r
875         if(!pageploop) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
876 //      {\r
877 //              unsigned int k,j,o;\r
878 //              /* fill screen with a distinctive pattern */\r
879 //              for (k=0;k < vga_state.vga_width;k++) {\r
880 //                      o = k >> 2;\r
881 //                      vga_write_sequencer(0x02/*map mask*/,1 << (k&3));\r
882 //                              for (j=0;j < (mv[0].page->height)+(mv[1].page->height)+(mv[2].page->height)+(mv[3].page->height);j++,o += vga_state.vga_stride)\r
883 //                                      vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!\r
884 //              }\r
885 //      }\r
886         modexCopyPageRegion(mv[3].page, mv[0].page, 0/**/, 0/**/, 0, 0, 24, 32);\r
887 }\r
888 \r
889 void mapinitmapview(map_view_t *mv, int tx, int ty)\r
890 {\r
891         /* set up the coordinates */\r
892         mv[0].tx = mv[1].tx = tx;\r
893         mv[0].ty = mv[1].ty = ty;\r
894         mv[0].page->dx = mv[1].page->dx = mv[2].page->dx = mv[3].page->dx = mv->map->tiles->tileWidth;\r
895         mv[0].page->dy = mv[1].page->dy = mv[2].page->dy = mv[3].page->dy = mv->map->tiles->tileHeight;\r
896 \r
897         /* set up the thresholds */\r
898         mv[0].dxThresh = mv[1].dxThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileWidth * 2;\r
899         mv[0].dyThresh = mv[1].dyThresh = mv[2].dxThresh = mv[3].dxThresh = mv->map->tiles->tileHeight * 2;\r
900 }\r
901 \r
902 void near\r
903 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
904 {\r
905         word rx;\r
906         word ry;\r
907         //word textx=0, texty=0;\r
908         //if(i==0) i=2;\r
909         if(i==0)\r
910         {\r
911                 //wwww\r
912                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
913         }\r
914         else\r
915         {\r
916                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
917                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
918 ////0000printf("i=%d\n", i);\r
919 #ifdef __DEBUG_MAP__\r
920                 switch(dbg_maptext)\r
921                 {\r
922                         case 0:\r
923 #endif\r
924 #ifndef TILERENDER\r
925                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((dbg_mapdata[i])+1));\r
926                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
927 #else\r
928                                 modexDrawBmpRegion              (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
929                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
930                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
931                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
932 #endif\r
933 #ifdef __DEBUG_MAP__\r
934                         break;\r
935                         case 1:\r
936                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (dbg_mapdata[i])+1);\r
937                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
938                                 /*for(texty=0; texty<2; texty++)\r
939                                 {\r
940                                         for(textx=0; textx<2; textx++)\r
941                                         {*/\r
942 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
943 /*                                      }\r
944                                 }*/\r
945                         break;\r
946                 }\r
947 #endif\r
948         }\r
949 }\r
950 \r
951 void near mapDrawRow(map_view_t *mv, int tx, int ty, word y, player_t *player, word poopoffset)\r
952 {\r
953         word x;\r
954         int i;\r
955         poopoffset%=player[0].enti.speed;\r
956 //printf("y: %d\n", poopoffset);\r
957         /* the position within the map array */\r
958         i=ty * mv->map->width + tx;\r
959         for(x=poopoffset; x<(mv->page->sw+mv->dxThresh)/(poopoffset+1) && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
960         if(i>=0) {\r
961                 /* we are in the map, so copy! */\r
962                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
963         }\r
964         i++; /* next! */\r
965         }\r
966 }\r
967 \r
968 void near mapDrawCol(map_view_t *mv, int tx, int ty, word x, player_t *player, word poopoffset)\r
969 {\r
970         int y;\r
971         int i;\r
972         poopoffset%=player[0].enti.speed;\r
973 //printf("x: %d\n", poopoffset);\r
974         /* location in the map array */\r
975         i=ty * mv->map->width + tx;\r
976 \r
977         /* We'll copy all of the columns in the screen,\r
978            i + 1 row above and one below */\r
979         for(y=poopoffset; y<(mv->page->sh+mv->dyThresh)/(poopoffset+1) && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
980         if(i>=0) {\r
981                 /* we are in the map, so copy away! */\r
982                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
983         }\r
984         i += mv->map->width;\r
985         }\r
986 }\r
987 \r
988 void mapDrawWRow(map_view_t *mv, int tx, int ty, word y)\r
989 {\r
990         word x;\r
991         int i;\r
992 \r
993         /* the position within the map array */\r
994         i=ty * mv->map->width + tx;\r
995         for(x=0; x<mv->page->sw+mv->dxThresh && tx < mv->map->width; x+=mv->map->tiles->tileWidth, tx++) {\r
996         if(i>=0) {\r
997                 /* we are in the map, so copy! */\r
998                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
999         }\r
1000         i++; /* next! */\r
1001         }\r
1002 }\r
1003 \r
1004 void mapDrawWCol(map_view_t *mv, int tx, int ty, word x)\r
1005 {\r
1006         int y;\r
1007         int i;\r
1008 \r
1009         /* location in the map array */\r
1010         i=ty * mv->map->width + tx;\r
1011 \r
1012         /* We'll copy all of the columns in the screen,\r
1013            i + 1 row above and one below */\r
1014         for(y=0; y<mv->page->sh+mv->dyThresh && ty < mv->map->height; y+=mv->map->tiles->tileHeight, ty++) {\r
1015         if(i>=0) {\r
1016                 /* we are in the map, so copy away! */\r
1017                 mapDrawTile(mv->map->tiles, mv->map->data[i], mv->page, x, y);\r
1018         }\r
1019         i += mv->map->width;\r
1020         }\r
1021 }\r
1022 \r
1023 /*void qclean()\r
1024 {\r
1025         //setkb(0);\r
1026 }*/\r
1027 \r
1028 boolean pageflipflop = 1;\r
1029 boolean pageploop = 1;\r
1030 \r
1031 /*      sync    */\r
1032 void shinku(global_game_variables_t *gv)\r
1033 {\r
1034         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
1035         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
1036         word col = 7, bgcol = 0, type = 1;//w = 64, h = 8,\r
1037         //byte o,o2,i;\r
1038         //modexCopyPageRegion(pip[1].page, pip[2].page, 16, 16, 16, 16, (14*8)+4, 8+4);\r
1039         /* block copy to visible RAM from offscreen */\r
1040 //      vga_setup_wm1_block_copy();\r
1041 //      modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x+w, 0, w, h);\r
1042 //      o =     *(gv->video.page[2].data); // source offscreen\r
1043 //      o2 =    *(gv->video.page[gv->video->sfip].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
1044 //      for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += vga_state.vga_stride) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
1045         /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
1046 //      vga_restore_rm0wm0();\r
1047         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
1048         {\r
1049         // NTS: For some bizarre reason, gv->pee is not initialized, but the pointer is not NULL even\r
1050         //      though it should be. Instead it's NULL as a near pointer but contains a non-null\r
1051         //      segment value, so testing against NULL doesn't work. It is initialized properly if\r
1052         //      you call start_timer() though which uses near malloc. Rather than fight with that,\r
1053         //      I decided it would be better to declare a temp buffer statically and sprintf to that.\r
1054         //\r
1055         //      This fixes *** Null pointer assignment detected error message in ZCROLL.EXE on exit.\r
1056                 sprintf(global_temp_status_text, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
1057                 //modexClearRegion(&(gv->video.page[gv->video->sfip]), x, y, w, h, 45);\r
1058                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, global_temp_status_text);\r
1059                 gv->kurokku.tiku=0;\r
1060                 /* block copy to visible RAM from offscreen */\r
1061 //              vga_setup_wm1_block_copy();\r
1062 //              o =     *(gv->video.page[gv->video->sfip].data); // source offscreen\r
1063 //              o2 =    *(gv->video.page[2].data)+(y * vga_state.vga_stride) + (x >> 2); // dest visible (original stride)\r
1064 //              for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += vga_state.vga_stride) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
1065 //              modexCopyPageRegion(&(gv->video.page[gv->video->sfip]), &(gv->video.page[!gv->video->sfip]), x, y, x, 0, w, h);\r
1066                 /* must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally */\r
1067 //              vga_restore_rm0wm0();\r
1068         }else //copy dat sheet\r
1069         gv->kurokku.tiku++;\r
1070 \r
1071         switch(gv->kurokku.fpscap)\r
1072         {\r
1073                 case 0:\r
1074                         //modexprint(&(gv->video.page[gv->video->sfip]), x, y+8, type, col, bgcol, "sanic!");\r
1075                         gv->kurokku.frames_per_second=1;\r
1076                 break;\r
1077                 case 1:\r
1078                         //turn this off if XT\r
1079                         //modexWaitBorder();\r
1080                         vga_wait_for_vsync();\r
1081                         gv->kurokku.frames_per_second=60;\r
1082                 break;\r
1083         }\r
1084         if(pageflipflop){\r
1085         if(gv->video.r){\r
1086                 //vga_setup_wm1_block_copy();\r
1087                 //_fmemcpy((gv->video.page[(gv->video.p)]).data, (gv->video.page[(!gv->video.p)]).data, gv->video.page[(!gv->video.p)].pagesize);\r
1088                 //vga_restore_rm0wm0();\r
1089                 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
1090                 modexShowPage(&(gv->video.page[gv->video.p]));\r
1091                 if(!pageploop) gv->video.p=!gv->video.p;\r
1092                 gv->video.r=!gv->video.r;\r
1093                 //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;\r
1094         }\r
1095         }\r
1096 }\r
1097 \r
1098 #ifdef SPRITE\r
1099 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, dire, 24, 32,    PLAYERBMPDATAPTR);\r
1100 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32,    PLAYERBMPDATAPTR);\r
1101 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 24, 32,     PLAYERBMPDATAPTR);\r
1102 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32,    PLAYERBMPDATAPTR);\r
1103 #else\r
1104 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
1105 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
1106 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
1107 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
1108 #endif\r
1109 \r
1110 void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1111 {\r
1112         sword x = player[pn].enti.x;\r
1113         sword y = player[pn].enti.y;\r
1114         sword bx = x+16;        //buffer's x\r
1115         sword by = y+16;        //buffer's y\r
1116         word dire=32; //direction\r
1117         sword qq; //scroll offset\r
1118         word ls = player[pn].enti.persist_aniframe;\r
1119 \r
1120         switch(scrollswitch)\r
1121         {\r
1122                 case 0:\r
1123                         qq = 0;\r
1124                 break;\r
1125                 default:\r
1126                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1127                 break;\r
1128         }\r
1129         //x-=4;\r
1130         y-=pip[0].map->tiles->tileHeight;\r
1131         switch (player[pn].enti.d)\r
1132         {\r
1133                 case 0:\r
1134                         //up\r
1135                         dire*=player[pn].enti.d;\r
1136                         y-=qq;\r
1137                         by-=4;\r
1138                 break;\r
1139                 case 3:\r
1140                         // right\r
1141                         dire*=(player[pn].enti.d-2);\r
1142                         x+=qq;\r
1143                         bx+=4;\r
1144                 break;\r
1145                 case 2:\r
1146                 break;\r
1147                 case 4:\r
1148                         //down\r
1149                         dire*=(player[pn].enti.d-2);\r
1150                         y+=qq;\r
1151                         by+=4;\r
1152                 break;\r
1153                 case 1:\r
1154                         //left\r
1155                         dire*=(player[pn].enti.d+2);\r
1156                         x-=qq;\r
1157                         bx-=4;\r
1158                 break;\r
1159         }\r
1160 \r
1161         if(!pageflipflop)\r
1162                 modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
1163         else{\r
1164                 //copy old bg to page0\r
1165                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
1166                 //update buffer\r
1167                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
1168         }\r
1169 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
1170         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
1171         /*modexCopyPageRegion(pip[pip->video->p].page,\r
1172  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
1173 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
1174         switch(ls)\r
1175         {\r
1176                 case 1:\r
1177                         FRAME1\r
1178                 break;\r
1179                 case 2:\r
1180                         FRAME2\r
1181                 break;\r
1182                 case 3:\r
1183                         FRAME3\r
1184                 break;\r
1185                 case 4:\r
1186                         FRAME4\r
1187                 break;\r
1188         }\r
1189 //      if(2>ls && ls>=1) { FRAME1 }else\r
1190 //      if(3>ls && ls>=2) { FRAME2 }else\r
1191 //      if(4>ls && ls>=3) { FRAME3 }else\r
1192 //      if(5>ls && ls>=4) { FRAME4 }\r
1193         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1194         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1195         pip->video->r=1;\r
1196 }\r
1197 \r
1198 /*\r
1199 void animate_spri(struct sprite *spri, global_game_variables_t *gv)\r
1200 {\r
1201 #define VMEMPAGESIZE2   gv->video.page[0].pagesize+gv->video.page[1].pagesize\r
1202 #define VMEMPAGEDATA2   gv->video.page[2].data\r
1203         unsigned int i,o,o2; int j;\r
1204         int x,y,rx,ry,w,h;\r
1205         int overdraw = 1;       // how many pixels to "overdraw" so that moving sprites with edge pixels don't leave streaks.\r
1206                                                 // if the sprite's edge pixels are clear anyway, you can set this to 0.\r
1207         VGA_RAM_PTR omemptr;\r
1208 \r
1209         // Events go here\r
1210 \r
1211 \r
1212         omemptr = vga_state.vga_graphics_ram; // save original mem ptr\r
1213         x=spri->x-4;\r
1214         y=spri->y;\r
1215 \r
1216         // Draw sprite\r
1217         j = get_vrl_by_id(spri->spritesheet, spri->curr_spri_id, spri->sprite_vrl_cont);\r
1218         if(j < 0)\r
1219         {\r
1220                 Quit (gv, "Error retriving required sprite");\r
1221         }\r
1222 \r
1223         // render box bounds. y does not need modification, but x and width must be multiple of 4\r
1224         if (x >= overdraw) rx = (x - overdraw) & (~3);\r
1225                 else rx = -(gv->video.page[0].dx);\r
1226         if (y >= overdraw) ry = (y - overdraw);\r
1227                 else ry = -(gv->video.page[0].dy);\r
1228         h = spri->sprite_vrl_cont->vrl_header->height + overdraw + y - ry;\r
1229         w = (x + spri->sprite_vrl_cont->vrl_header->width + (overdraw*2) + 3 - rx) & (~3);//round up\r
1230         if ((rx+w) > gv->video.page[0].width) w = gv->video.page[0].width-rx;\r
1231         if ((ry+h) > gv->video.page[0].height) h = gv->video.page[0].height-ry;\r
1232 \r
1233         // block copy pattern to where we will draw the sprite\r
1234         vga_setup_wm1_block_copy();\r
1235         o2 = VMEMPAGESIZE2;\r
1236         o = (0x10000UL - (uint16_t)VMEMPAGEDATA2) + (ry * gv->video.page[0].stridew) + (rx >> 2); // source offscreen\r
1237         for (i=0;i < h;i++,o += gv->video.page[0].stridew,o2 += (w >> 2)) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
1238 \r
1239         // must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally\r
1240         vga_restore_rm0wm0();\r
1241 \r
1242         // replace VGA stride with our own and mem ptr. then sprite rendering at this stage is just (0,0)\r
1243         vga_state.vga_draw_stride_limit = (gv->video.page[0].width + 3 - x) >> 2;//round up\r
1244         vga_state.vga_draw_stride = w >> 2;\r
1245         vga_state.vga_graphics_ram = omemptr + VMEMPAGESIZE2;\r
1246 \r
1247         // then the sprite. note modding ram ptr means we just draw to (x&3,0)\r
1248         draw_vrl1_vgax_modex(\r
1249                 x-rx,\r
1250                 y-ry,\r
1251                 spri->sprite_vrl_cont->vrl_header,\r
1252                 spri->sprite_vrl_cont->line_offsets,\r
1253                 spri->sprite_vrl_cont->buffer + sizeof(struct vrl1_vgax_header),\r
1254                 spri->sprite_vrl_cont->data_size\r
1255         );\r
1256 \r
1257         // restore ptr\r
1258         vga_state.vga_graphics_ram = omemptr;\r
1259 \r
1260         // block copy to visible RAM from offscreen\r
1261         vga_setup_wm1_block_copy();\r
1262         o = VMEMPAGESIZE2; // source offscreen\r
1263         o2 = (ry * gv->video.page[0].stridew) + (rx >> 2); // dest visible (original stride)\r
1264         for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += gv->video.page[0].stridew) vga_wm1_mem_block_copy(o2,o,w >> 2);\r
1265         // must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally\r
1266         vga_restore_rm0wm0();\r
1267 \r
1268         // restore stride\r
1269         vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = gv->video.page[0].stridew;\r
1270 \r
1271         // Depending on delay, update indices\r
1272         switch(spri->delay){\r
1273                 // Delay = 0 means that sprite should loop. Nothing to change here\r
1274                 case 0:\r
1275                         break;\r
1276 \r
1277                 // Delay = 1 means that on next time unit sprite should be changed\r
1278                 case 1:\r
1279                         spri->curr_anim_spri++;\r
1280 \r
1281                         // If we hit the end of an animation sequence, restart it\r
1282                         if(!(spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id)){\r
1283                                 spri->curr_anim_spri = 0;\r
1284                                 spri->curr_spri_id = spri->curr_anim_list[spri->curr_anim_spri].sprite_id;\r
1285                         }\r
1286                         spri->delay = spri->curr_anim_list[spri->curr_anim_spri].delay;\r
1287 \r
1288                 // Delay > 1 means that we should not change sprite yet. Decrease delay\r
1289                 default:\r
1290                         spri->delay--;\r
1291                         break;\r
1292         }\r
1293 }\r
1294 */\r
1295 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1296 {\r
1297         sword x = player[pn].enti.x;\r
1298         sword y = player[pn].enti.y;\r
1299         sword bx = x+16;        //buffer's x\r
1300         sword by = y+16;        //buffer's y\r
1301         word dire=32; //direction\r
1302         sword qq; //scroll offset\r
1303         word ls = player[pn].enti.persist_aniframe;\r
1304 \r
1305         switch(scrollswitch)\r
1306         {\r
1307                 case 0:\r
1308                         qq = 0;\r
1309                 break;\r
1310                 default:\r
1311                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1312                 break;\r
1313         }\r
1314         //x-=4;\r
1315         y-=pip[0].map->tiles->tileHeight;\r
1316         switch (player[pn].enti.d)\r
1317         {\r
1318                 case 0:\r
1319                         //up\r
1320                         dire*=player[pn].enti.d;\r
1321                         y-=qq;\r
1322                         by-=4;\r
1323                 break;\r
1324                 case 3:\r
1325                         // right\r
1326                         dire*=(player[pn].enti.d-2);\r
1327                         x+=qq;\r
1328                         bx+=4;\r
1329                 break;\r
1330                 case 2:\r
1331                 break;\r
1332                 case 4:\r
1333                         //down\r
1334                         dire*=(player[pn].enti.d-2);\r
1335                         y+=qq;\r
1336                         by+=4;\r
1337                 break;\r
1338                 case 1:\r
1339                         //left\r
1340                         dire*=(player[pn].enti.d+2);\r
1341                         x-=qq;\r
1342                         bx-=4;\r
1343                 break;\r
1344         }\r
1345 \r
1346         //if(!pageflipflop)\r
1347         //      modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
1348         //else{\r
1349                 //copy old bg to page0\r
1350                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
1351                 //update buffer\r
1352                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
1353         //}\r
1354 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
1355         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
1356         /*modexCopyPageRegion(pip[pip->video->p].page,\r
1357  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
1358 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
1359 \r
1360 //#define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
1361 //#define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
1362 //#define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
1363 //#define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
1364 \r
1365         switch(ls)\r
1366         {\r
1367                 case 1:\r
1368                         FRAME1\r
1369                 break;\r
1370                 case 2:\r
1371                         FRAME2\r
1372                 break;\r
1373                 case 3:\r
1374                         FRAME3\r
1375                 break;\r
1376                 case 4:\r
1377                         FRAME4\r
1378                 break;\r
1379         }\r
1380 //      if(2>ls && ls>=1) { FRAME1 }else\r
1381 //      if(3>ls && ls>=2) { FRAME2 }else\r
1382 //      if(4>ls && ls>=3) { FRAME3 }else\r
1383 //      if(5>ls && ls>=4) { FRAME4 }\r
1384         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1385         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1386         pip->video->r=1;\r
1387 }\r
1388 \r
1389 /*\r
1390  * from zcroll16.c\r
1391 */\r
1392 \r
1393 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
1394 {\r
1395         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
1396 }\r
1397 \r
1398 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
1399 {\r
1400         // Assume everything crosses at most 1 tile at once\r
1401         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
1402 }\r
1403 \r
1404 boolean ZC_walk2(entity_t *ent, map_view_t *map_v)\r
1405 {\r
1406         //return 1;\r
1407         int dx = 1;\r
1408         int dy = 1;\r
1409         switch(ent->d)\r
1410         {\r
1411                 case 2:\r
1412                         return 0;\r
1413                 case 1:\r
1414                         dx = -dx;\r
1415                 case 3:\r
1416                         dy = 0;\r
1417                         break;\r
1418                 case 0:\r
1419                         dy = -dy;\r
1420                 case 4:\r
1421                         dx = 0;\r
1422                         break;\r
1423         }\r
1424         if(coll_check(ent->x, ent->y, dx, dy,  map_v))\r
1425         {\r
1426                 // Allow movement\r
1427                 // Set speed\r
1428                 // Start animation\r
1429                 // Mark next tile as occupied\r
1430                 // Mark this tile as vacant\r
1431                 return 1;\r
1432         }\r
1433         return 0;\r
1434 }\r
1435 \r
1436 void player_walk(player_t *player, map_view_t *map_v){\r
1437         int dx=16, dy=16;\r
1438         if(ZC_walk2(&(player->enti), 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
1439         {\r
1440                 mapScroll(map_v, player);\r
1441                 // (Un)load stuff?\r
1442         }\r
1443 }\r
1444 \r
1445 void near mapScroll(map_view_t *mv, player_t *player)\r
1446 {\r
1447         //word x, y;  /* coordinate for drawing */\r
1448         int c = 1;\r
1449         int delta;\r
1450         mv->delta += player->dx | player->dy;\r
1451         delta = mv->delta;\r
1452         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
1453         switch(mv->d){\r
1454                 case 4:\r
1455                         c = -1;\r
1456                         delta = -delta;\r
1457                 case 0:\r
1458                         if(!(delta + mv->dxThresh))\r
1459                         {\r
1460                                 mv->delta = 0;\r
1461                                 mv->ty += c;\r
1462                         }\r
1463                         break;\r
1464                 case 3:\r
1465                         c = -1;\r
1466                         delta = -delta;\r
1467                 case 1:\r
1468                         if(!(delta + mv->dyThresh))\r
1469                         {\r
1470                                 mv->delta = 0;\r
1471                                 mv->tx += c;\r
1472                         }\r
1473                         break;\r
1474                 default:\r
1475                         break;\r
1476         }\r
1477 \r
1478         mv->video->r=1;\r
1479 }\r