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