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