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