OSDN Git Service

something is bothering me very much on the animation part of frame. particularly...
[proj16/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_PRINT     sprintf(global_temp_status_text, "%u", player[pn].enti.persist_aniframe);\\r
28 modexprint(&(pip->video->page[0]), player[pn].enti.x-(8*player[pn].enti.persist_aniframe), player[pn].enti.y-TILEWH-(8*player[pn].enti.persist_aniframe), 1, 20, 1, global_temp_status_text);\r
29 \r
30 //#define WALKTYPE_FRAM_PRINT INC_PER_FRAME_PRINT\r
31 //walktypeinfo(player, pn);\r
32 //modexprint(&(pip->video->page[0]), player[pn].enti.x-(8*player[pn].enti.persist_aniframe)+8, player[pn].enti.y-TILEWH-(8*player[pn].enti.persist_aniframe), 1, 20, 1, global_temp_status_text);\r
33 \r
34 #define PERSIST_ANIFRAME_INIT 1\r
35 #define Q_INIT PERSIST_ANIFRAME_INIT\r
36 #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 = PERSIST_ANIFRAME_INIT;\r
37 \r
38 void ZC_walk(map_view_t *pip, player_t *player, word pn)\r
39 {\r
40         switch(player[pn].enti.d)\r
41         {\r
42                 //no direction\r
43                 case 2:\r
44                         //0000pip[0].video->startclk = (*clockw);\r
45                 break;\r
46                 //right movement\r
47                 case 3:\r
48                         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
49                         !(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
50                         {\r
51                                 player[pn].walktype=2;\r
52                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
53                                 {\r
54                                         INC_PER_FRAME;\r
55                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
56                                         ScrollRight(pip, player, 3, pn);\r
57                                         ScrollRight(pip, player, 2, pn);\r
58                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
59                                         player[pn].enti.q++;\r
60                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
61                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
62                         }\r
63                         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
64                         {\r
65                                 player[pn].walktype=1;\r
66                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
67                                 {\r
68                                         INC_PER_FRAME;\r
69                                         player[pn].enti.x+=(player[pn].enti.speed);\r
70                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
71                                         player[pn].enti.q++;\r
72                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
73                         }\r
74                         else\r
75                         {\r
76                                 player[pn].walktype=0;\r
77                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
78                                 player[pn].enti.d = 2;\r
79                         }\r
80                         player[pn].enti.triggerx = player[pn].enti.tx+1;\r
81                         player[pn].enti.triggery = player[pn].enti.ty;\r
82                 break;\r
83                 //left movement\r
84                 case 1:\r
85                         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
86                         !(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
87                         {\r
88                                 player[pn].walktype=2;\r
89                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
90                                 {\r
91                                         INC_PER_FRAME;\r
92                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
93                                         ScrollLeft(pip, player, 3, pn);\r
94                                         ScrollLeft(pip, player, 2, pn);\r
95                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
96                                         player[pn].enti.q++;\r
97                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
98                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
99                         }\r
100                         else if(player[pn].enti.tx > 1 && !(pip[0].map->data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY))\r
101                         {\r
102                                 player[pn].walktype=1;\r
103                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
104                                 {\r
105                                         INC_PER_FRAME;\r
106                                         player[pn].enti.x-=(player[pn].enti.speed);\r
107                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
108                                         player[pn].enti.q++;\r
109                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
110                         }\r
111                         else\r
112                         {\r
113                                 player[pn].walktype=0;\r
114                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
115                                 player[pn].enti.d = 2;\r
116                         }\r
117                         player[pn].enti.triggerx = player[pn].enti.tx-1;\r
118                         player[pn].enti.triggery = player[pn].enti.ty;\r
119                 break;\r
120                 //down movement\r
121                 case 4:\r
122                         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
123                         !(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
124                         {\r
125                                 player[pn].walktype=2;\r
126                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
127                                 {\r
128                                         INC_PER_FRAME;\r
129                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
130                                         ScrollDown(pip, player, 3, pn);\r
131                                         ScrollDown(pip, player, 2, pn);\r
132                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
133                                         player[pn].enti.q++;\r
134                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
135                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
136                         }\r
137                         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
138                         {\r
139                                 player[pn].walktype=1;\r
140                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
141                                 {\r
142                                         INC_PER_FRAME;\r
143                                         player[pn].enti.y+=(player[pn].enti.speed);\r
144                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
145                                         player[pn].enti.q++;\r
146                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
147                         }\r
148                         else\r
149                         {\r
150                                 player[pn].walktype=0;\r
151                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
152                                 player[pn].enti.d = 2;\r
153                         }\r
154                         player[pn].enti.triggerx = player[pn].enti.tx;\r
155                         player[pn].enti.triggery = player[pn].enti.ty+1;\r
156                 break;\r
157                 //up movement\r
158                 case 0:\r
159                         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
160                         !(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
161                         {\r
162                                 player[pn].walktype=2;\r
163                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
164                                 {\r
165                                         INC_PER_FRAME;\r
166                                         ANIMATESPRIFUN(pip, player, pn, 2);\r
167                                         ScrollUp(pip, player, 3, pn);\r
168                                         ScrollUp(pip, player, 2, pn);\r
169                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
170                                         player[pn].enti.q++;\r
171                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
172                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
173                         }\r
174                         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
175                         {\r
176                                 player[pn].walktype=1;\r
177                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
178                                 {\r
179                                         INC_PER_FRAME;\r
180                                         player[pn].enti.y-=(player[pn].enti.speed);\r
181                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
182                                         player[pn].enti.q++;\r
183                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
184                         }\r
185                         else\r
186                         {\r
187                                 player[pn].walktype=0;\r
188                                 ANIMATESPRIFUN(pip, player, pn, 0);\r
189                                 player[pn].enti.d = 2;\r
190                         }\r
191                         player[pn].enti.triggerx = player[pn].enti.tx;\r
192                         player[pn].enti.triggery = player[pn].enti.ty-1;\r
193                 break;\r
194         }\r
195 }\r
196 \r
197 \r
198 /*\r
199 src/lib/scroll16.c:     mv[0].video->r=1;\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:     pip->video->r=1;\r
204 src/lib/scroll16.c:     mv->video->r=1;\r
205  */\r
206 \r
207 void oldwalk(map_view_t *pip, player_t *player, word pn)\r
208 {\r
209         //printf("player[%d].d=%d\n", pn, player[pn].enti.d);\r
210         switch(player[pn].enti.d)\r
211         {\r
212                 //no direction\r
213                 case 2:\r
214                         //0000pip[0].video->startclk = (*clockw);\r
215                 break;\r
216                 //right movement\r
217                 case 3:\r
218                         //printf("pip[0].page->tilesw=%d        ", pip[0].page->tilesw); printf("pip[0].page->tw=%d\n", pip[0].page->tw);\r
219                         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
220                         !(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
221                         {\r
222                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
223                                 {\r
224                                         INC_PER_FRAME;\r
225                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
226                                         ScrollRight(pip, player, 3, pn);\r
227                                         ScrollRight(pip, player, 2, pn);\r
228                                         //mapScrollRight(pip, player, !(pip[0].video->p), pn);\r
229                                         mapScrollRight(pip, player, (pip[0].video->p), pn);\r
230                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
231                                         player[pn].enti.q++;\r
232                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
233                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
234                         }\r
235                         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
236                         {\r
237                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
238                                 {\r
239                                         INC_PER_FRAME;\r
240                                         player[pn].enti.x+=(player[pn].enti.speed);\r
241                                         ANIMATESPRIFUN(pip, player, pn, 0);\r
242                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
243                                         player[pn].enti.q++;\r
244                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx++; }\r
245                         }\r
246                         else\r
247                         {\r
248                                 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
249 #ifdef SPRITE\r
250                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 24, 32, PLAYERBMPDATAPTR);\r
251 #else\r
252                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 14);\r
253 #endif\r
254                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
255                                 player[pn].enti.d = 2;\r
256                         }\r
257                         player[pn].enti.triggerx = player[pn].enti.tx+1;\r
258                         player[pn].enti.triggery = player[pn].enti.ty;\r
259                 break;\r
260 \r
261                 //left movement\r
262                 case 1:\r
263                         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
264                         !(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
265                         {\r
266                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
267                                 {\r
268                                         INC_PER_FRAME;\r
269                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
270                                         ScrollLeft(pip, player, 3, pn);\r
271                                         ScrollLeft(pip, player, 2, pn);\r
272                                         //mapScrollLeft(pip, player, !(pip[0].video->p), pn);\r
273                                         mapScrollLeft(pip, player, (pip[0].video->p), pn);\r
274                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
275                                         player[pn].enti.q++;\r
276                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
277                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
278                         }\r
279                         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
280                         {\r
281                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
282                                 {\r
283                                         INC_PER_FRAME;\r
284                                         player[pn].enti.x-=(player[pn].enti.speed);\r
285                                         ANIMATESPRIFUN(pip, player, pn, 0);\r
286                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
287                                         player[pn].enti.q++;\r
288                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.tx--; }\r
289                         }\r
290                         else\r
291                         {\r
292                                 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
293 #ifdef SPRITE\r
294                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 96, 24, 32, PLAYERBMPDATAPTR);\r
295 #else\r
296                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 10);\r
297 #endif\r
298                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
299                                 player[pn].enti.d = 2;\r
300                         }\r
301                         player[pn].enti.triggerx = player[pn].enti.tx-1;\r
302                         player[pn].enti.triggery = player[pn].enti.ty;\r
303                 break;\r
304 \r
305                 //down movement\r
306                 case 4:\r
307                         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
308                         !(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
309                         {\r
310                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
311                                 {\r
312                                         INC_PER_FRAME;\r
313                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
314                                         ScrollDown(pip, player, 3, pn);\r
315                                         ScrollDown(pip, player, 2, pn);\r
316                                         //mapScrollDown(pip, player, !(pip[0].video->p), pn);\r
317                                         mapScrollDown(pip, player, (pip[0].video->p), pn);\r
318                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
319                                         player[pn].enti.q++;\r
320                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
321                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
322                         }\r
323                         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
324                         {\r
325                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
326                                 {\r
327                                         INC_PER_FRAME;\r
328                                         player[pn].enti.y+=(player[pn].enti.speed);\r
329                                         ANIMATESPRIFUN(pip, player, pn, 0);\r
330                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
331                                         player[pn].enti.q++;\r
332                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty++; }\r
333                         }\r
334                         else\r
335                         {\r
336                                 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
337 #ifdef SPRITE\r
338                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 64, 24, 32, PLAYERBMPDATAPTR);\r
339 #else\r
340                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 9);\r
341 #endif\r
342                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
343                                 player[pn].enti.d = 2;\r
344                         }\r
345                         player[pn].enti.triggerx = player[pn].enti.tx;\r
346                         player[pn].enti.triggery = player[pn].enti.ty+1;\r
347                 break;\r
348 \r
349                 //up movement\r
350                 case 0:\r
351                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].map->height && player[pn].enti.ty == pip[0].ty+pip[0].page->tilemidposscreeny &&\r
352                         !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY))        //collision detection!\r
353                         {\r
354                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
355                                 {\r
356                                         INC_PER_FRAME;\r
357                                         ANIMATESPRIFUN(pip, player, pn, 1);\r
358                                         ScrollUp(pip, player, 3, pn);\r
359                                         ScrollUp(pip, player, 2, pn);\r
360                                         //mapScrollUp(pip, player, !(pip[0].video->p), pn);\r
361                                         mapScrollUp(pip, player, (pip[0].video->p), pn);\r
362                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
363                                         player[pn].enti.q++;\r
364                                         //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;\r
365                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
366                         }\r
367                         else if(player[pn].enti.ty > 1 && !(pip[0].map->data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX &&  player[pn].enti.ty-1 == TRIGGY))\r
368                         {\r
369                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
370                                 {\r
371                                         INC_PER_FRAME;\r
372                                         player[pn].enti.y-=(player[pn].enti.speed);\r
373                                         ANIMATESPRIFUN(pip, player, pn, 0);\r
374                                         if(!pageflipflop) modexShowPage(pip[1].page);\r
375                                         player[pn].enti.q++;\r
376                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; player[pn].enti.ty--; }\r
377                         }\r
378                         else\r
379                         {\r
380                                 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
381 #ifdef SPRITE\r
382                                 modexDrawSpriteRegion(pip[0].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 0, 24, 32, PLAYERBMPDATAPTR);\r
383 #else\r
384                                 modexClearRegion(pip[1].page, player[pn].enti.x, player[pn].enti.y-TILEWH, 24, 32, 12);\r
385 #endif\r
386                                 if(!pageflipflop) modexShowPage(pip[1].page);\r
387                                 player[pn].enti.d = 2;\r
388                         }\r
389                         player[pn].enti.triggerx = player[pn].enti.tx;\r
390                         player[pn].enti.triggery = player[pn].enti.ty-1;\r
391                 break;\r
392         }\r
393 }\r
394 \r
395 //panning page\r
396 void ZC_panPageManual(map_view_t *pip, player_t *player, word pn)\r
397 {\r
398 #define SHOWMVFUN_ ZC_ShowMV(pip, 0, 0);\r
399         switch(player[pn].enti.d)\r
400         {\r
401                 //right movement\r
402                 case 3:\r
403                         if(pip[0].tx >= 0 && pip[0].tx+pip[0].page->tw < pip[0].page->tilesw)\r
404                         {\r
405                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
406                                 {\r
407                                         pip[0].page->dx+=4;\r
408                                         SHOWMVFUN_;\r
409                                         player[pn].enti.q++;\r
410                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; pip[0].tx++; }\r
411                         }\r
412                 break;\r
413 \r
414                 //left movement\r
415                 case 1:\r
416                         if(pip[0].tx > 0 && pip[0].tx+pip[0].page->tw <= pip[0].page->tilesw)\r
417                         {\r
418                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
419                                 {\r
420                                         pip[0].page->dx-=4;\r
421                                         SHOWMVFUN_;\r
422                                         player[pn].enti.q++;\r
423                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; pip[0].tx--; }\r
424                         }\r
425                 break;\r
426 \r
427                 //down movement\r
428                 case 4:\r
429                         if(pip[0].ty >= 0 && pip[0].ty+pip[0].page->th < pip[0].page->tilesh)\r
430                         {\r
431                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
432                                 {\r
433                                         pip[0].page->dy+=4;\r
434                                         SHOWMVFUN_;\r
435                                         player[pn].enti.q++;\r
436                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; pip[0].ty++; }\r
437                         }\r
438                 break;\r
439 \r
440                 //up movement\r
441                 case 0:\r
442                         if(pip[0].ty > 0 && pip[0].ty+pip[0].page->th <= pip[0].page->tilesh)\r
443                         {\r
444                                 if(player[pn].enti.q<=player[pn].enti.spt)\r
445                                 {\r
446                                         pip[0].page->dy-=4;\r
447                                         SHOWMVFUN_;\r
448                                         player[pn].enti.q++;\r
449                                 } else { player[pn].enti.q = Q_INIT; player[pn].enti.d = 2; pip[0].ty--; }\r
450                         }\r
451                 break;\r
452         }\r
453 }\r
454 \r
455 /*\r
456  * modex mv setup\r
457 */\r
458 void ZC_MVSetup(map_view_t *pip, map_t *map, global_game_variables_t *gv)\r
459 {\r
460 #define ZC_MVI 1\r
461         nibble i;\r
462         // 1st page\r
463         pip[0].page = &gv->video.page[0];\r
464         pip[0].map = map;\r
465         pip[0].video = &gv->video;\r
466         pip[0].panp     = &gv->video.panp;\r
467         ZC_MVInit(pip, 1, 1);\r
468 \r
469         for(i=ZC_MVI;i<gv->video.num_of_pages;i++)\r
470         {\r
471                 pip[i].page     =       &gv->video.page[i];\r
472                 pip[i].map      =       pip[0].map;\r
473                 pip[i].video    =       pip[0].video;\r
474                 pip[i].panp     =       pip[0].panp;\r
475 //              if(i>ZC_MVI) {\r
476                 pip[i].tx =     1;\r
477                 pip[i].ty =     1;\r
478 //              }\r
479         }\r
480 }\r
481 \r
482 void ZC_MVInit(map_view_t *pip, int tx, int ty)\r
483 {\r
484         pip[0].tx = tx;\r
485         pip[0].ty = ty;\r
486         //pip[0].tx = pip[1].tx = tx;\r
487         //pip[0].ty = pip[1].ty = ty;\r
488 }\r
489 \r
490 void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr)\r
491 {\r
492         word high_address, low_address, offset;\r
493         byte crtcOffset;\r
494 \r
495         /* calculate offset */\r
496         offset = (word) moo[moo[0].video->panp].page->data;\r
497         offset += moo[0].page->dy * (moo[0].page->width >> 2 );\r
498         offset += moo[0].page->dx >> 2;\r
499 \r
500         /* calculate crtcOffset according to virtual width */\r
501         switch(sr)\r
502         {\r
503                 case 1:\r
504                         crtcOffset = moo[0].page->sw >> 3;\r
505                 break;\r
506                 default:\r
507                 case 0:\r
508                         crtcOffset = moo[0].page->width >> 3;\r
509                 break;\r
510         }\r
511 \r
512         high_address = HIGH_ADDRESS | (offset & 0xff00);\r
513         low_address  = LOW_ADDRESS  | (offset << 8);\r
514 \r
515         /* wait for appropriate timing and then program CRTC */\r
516         if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
517         outpw(CRTC_INDEX, high_address);\r
518         outpw(CRTC_INDEX, low_address);\r
519         outp(CRTC_INDEX, 0x13);\r
520         outp(CRTC_DATA, crtcOffset);\r
521 \r
522         /* wait for one retrace */\r
523         if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE));\r
524 \r
525         /* do PEL panning here */\r
526         outp(AC_INDEX, 0x33);\r
527         outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1);\r
528 }\r
529 \r
530 /*map_t\r
531 allocMap(int w, int h) {\r
532         map_t result;\r
533 \r
534         result.width =w;\r
535         result.height=h;\r
536         result.data = malloc(sizeof(byte) * w * h);\r
537         //result.data = (byte *)alloc_emem(((int)sizeof(byte) * w * h)/1024);\r
538         if(isEMS() || checkEMS())\r
539         {\r
540                 XMOVE mm;\r
541                 //emmhandle = mallocEMS(coretotalEMS());//alloc_emem((int)sizeof(map))\r
542                 mm.length=sizeof(result);\r
543                 mm.sourceH=0;\r
544                 mm.sourceOff=ptr2long(&result);\r
545                 mm.destH=emmhandle;\r
546                 mm.destOff=0;\r
547                 ist = move_emem(&mm);\r
548                 if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
549                 printf("%d\n", coretotalEMS());\r
550         }\r
551 \r
552         return result;\r
553 }*/\r
554 \r
555 /*void\r
556 initMap(map_t *map) {\r
557         // just a place holder to fill out an alternating pattern\r
558         int x, y, xx, yy;\r
559         int i, q;\r
560 //      int tile = 1;\r
561         //if(!isEMS() || !checkEMS())\r
562 //              map->tiles = malloc(sizeof(tiles_t));\r
563         //else\r
564         //      map->tiles = (tiles_t *)alloc_emem(sizeof(tiles_t));\r
565 \r
566          //create the tile set\r
567         //if(!isEMS() || !checkEMS())\r
568 //              map->tiles->data = malloc(sizeof(bitmap_t));\r
569         //else\r
570         //      map->tiles->data = (bitmap_t *)alloc_emem(sizeof(bitmap_t));\r
571 //      map->tiles->data->width = (TILEWH);\r
572 //      map->tiles->data->height= TILEWH;\r
573         //if(!isEMS() || !checkEMS())\r
574 //              map->tiles->data->data = malloc((TILEWH*2)*TILEWH);\r
575         //else\r
576         //      map->tiles->data->data = (byte *)alloc_emem((TILEWH*2)*TILEWH);\r
577 //      map->tiles->tileHeight = TILEWH;\r
578 //      map->tiles->tileWidth =TILEWH;\r
579 //      map->tiles->rows = 1;\r
580 //      map->tiles->cols = 1;//2;\r
581 \r
582         q=0;\r
583         //for(y=0; y<map->height; y++) {\r
584         //for(x=0; x<map->width; x++) {\r
585         i=0;\r
586         for(yy=0; yy<TILEWH; yy++) {\r
587         for(xx=0; xx<(TILEWH); xx++) {\r
588                 //if(x<TILEWH){\r
589                   map->tiles->data->data[i+1] = map->data[q];//28;//0x24;\r
590 //                printf("[%d]", map->tiles->data->data[i]);\r
591                 //}else{\r
592                   //map->tiles->data->data[i] = map->data[q];//0;//0x34;\r
593                   //printf("]%d[==[%d]", i, map->tiles->data->data[i]);\r
594                 //}\r
595                 i++;\r
596         }\r
597 //      printf("\n");\r
598         }\r
599 //      printf("[%d]", map->data[q]);\r
600         q++;\r
601 //      }\r
602         //printf("\n\n");\r
603 //      }\r
604 \r
605         i=0;\r
606         for(y=0; y<map->height; y++) {\r
607                 for(x=0; x<map->width; x++) {\r
608 //                      map->data[i]=255;\r
609                         printf("[%d]", map->data[i]);\r
610                         //tile = tile ? 0 : 1;\r
611                         i++;\r
612                 }\r
613                 //tile = tile ? 0 : 1;\r
614         }\r
615 }*/\r
616 \r
617 void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
618 {\r
619         word x;//, y;  /* coordinate for drawing */\r
620 \r
621         /* increment the pixel position and update the page */\r
622         mv[id].page[0].dx += player[plid].enti.speed;\r
623 \r
624         /* check to see if this changes the tile */\r
625         if(mv[id].page[0].dx >= mv[id].dxThresh )\r
626         {\r
627         /* go forward one tile */\r
628         mv[id].tx++;\r
629         /* Snap the origin forward */\r
630         mv[id].page->data += 4;\r
631 \r
632         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
633         }\r
634 \r
635         /* draw the next column */\r
636         x= mv[0].page->sw + mv[id].map->tiles->tileWidth;\r
637         if(player[plid].enti.q%4)\r
638                 if(id==0)\r
639                         mapDrawCol(&mv[0], mv[0].tx + mv[0].page->tw, mv[0].ty-1, x, player, mv->page[0].dx);\r
640                 else\r
641                         if(!pageflipflop && !pageploop)\r
642                                 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
643         mv[0].video->r=1;\r
644 }\r
645 \r
646 \r
647 void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
648 {\r
649         word x;//,y;  /* coordinate for drawing */\r
650 \r
651         /* decrement the pixel position and update the page */\r
652         mv[id].page[0].dx -= player[plid].enti.speed;\r
653 \r
654         /* check to see if this changes the tile */\r
655         if(mv[id].page[0].dx == 0)\r
656         {\r
657         /* go backward one tile */\r
658         mv[id].tx--;\r
659         /* Snap the origin backward */\r
660         mv[id].page->data -= 4;\r
661 \r
662         mv[id].page[0].dx = mv[id].map->tiles->tileWidth;\r
663         }\r
664 \r
665         /* draw the next column */\r
666         x= 0;\r
667         if(player[plid].enti.q%4)\r
668                 if(id==0)\r
669                         mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, mv->page[0].dx);\r
670                 else\r
671                         if(!pageflipflop && !pageploop)\r
672                                 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
673         mv[0].video->r=1;\r
674 }\r
675 \r
676 \r
677 void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
678 {\r
679         word y;//x,  /* coordinate for drawing */\r
680 \r
681         /* decrement the pixel position and update the page */\r
682         mv[id].page[0].dy -= player[plid].enti.speed;\r
683 \r
684         /* check to see if this changes the tile */\r
685         if(mv[id].page[0].dy == 0 )\r
686         {\r
687         /* go down one tile */\r
688         mv[id].ty--;\r
689         /* Snap the origin downward */\r
690         mv[id].page->data -= mv[id].page->pi;\r
691 \r
692         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
693         }\r
694 \r
695         /* draw the next row */\r
696         y= 0;\r
697         if(player[plid].enti.q%3)\r
698                 if(id==0)\r
699                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, mv->page[0].dy);\r
700                 else\r
701                         if(!pageflipflop && !pageploop)\r
702                                 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
703         mv[0].video->r=1;\r
704 }\r
705 \r
706 void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
707 {\r
708         word y;//x,  /* coordinate for drawing */\r
709 \r
710         /* increment the pixel position and update the page */\r
711         mv[id].page[0].dy += player[plid].enti.speed;\r
712 \r
713         /* check to see if this changes the tile */\r
714         if(mv[id].page[0].dy >= mv[id].dyThresh )\r
715         {\r
716         /* go down one tile */\r
717         mv[id].ty++;\r
718         /* Snap the origin downward */\r
719         mv[id].page->data += mv[id].page->pi;\r
720 \r
721         mv[id].page[0].dy = mv[id].map->tiles->tileHeight;\r
722         }\r
723 \r
724         /* draw the next row */\r
725         y= mv[0].page->sh + mv[id].map->tiles->tileHeight;\r
726         if(player[plid].enti.q%3)\r
727                 if(id==0)\r
728                         mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->th, y, player, mv->page[0].dy);\r
729                 else\r
730                         if(!pageflipflop && !pageploop)\r
731                                 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
732         mv[0].video->r=1;\r
733 }\r
734 \r
735 \r
736 //TODO finish this wwww\r
737 void near ScrollRight(map_view_t *mv, player_t *player, word id, word plid)\r
738 {\r
739         /* increment the pixel position and update the page */\r
740         mv[id].page->dx += player[plid].enti.speed;\r
741 \r
742         /* check to see if this changes the tile */\r
743         if(mv[id].page->dx >= mv[0].dxThresh )\r
744         {\r
745 //              vga_setup_wm1_block_copy();\r
746 //              _fmemmove(mv[id].page->data+4, mv[id].page->data, mv[id].page->pagesize);\r
747 //              vga_restore_rm0wm0();\r
748                 /* Snap the origin forward */\r
749                 mv[id].page->data += 4;\r
750                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
751         }\r
752 }\r
753 \r
754 void near ScrollLeft(map_view_t *mv, player_t *player, word id, word plid)\r
755 {\r
756         /* decrement the pixel position and update the page */\r
757         mv[id].page->dx -= player[plid].enti.speed;\r
758 \r
759         /* check to see if this changes the tile */\r
760         if(mv[id].page->dx == 0)\r
761         {\r
762 //              vga_setup_wm1_block_copy();\r
763 //              _fmemmove(mv[id].page->data-4, mv[id].page->data, mv[id].page->pagesize);\r
764 //              vga_restore_rm0wm0();\r
765                 /* Snap the origin backward */\r
766                 mv[id].page->data -= 4;\r
767                 mv[id].page->dx = mv[0].map->tiles->tileWidth;\r
768         }\r
769 }\r
770 \r
771 void near ScrollUp(map_view_t *mv, player_t *player, word id, word plid)\r
772 {\r
773         /* decrement the pixel position and update the page */\r
774         mv[id].page->dy -= player[plid].enti.speed;\r
775 \r
776         /* check to see if this changes the tile */\r
777         if(mv[id].page->dy == 0)\r
778         {\r
779 //              vga_setup_wm1_block_copy();\r
780 //              _fmemmove(mv[id].page->data-mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
781 //              vga_restore_rm0wm0();\r
782                 /* Snap the origin backward */\r
783                 mv[id].page->data -= mv[id].page->pi;\r
784                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
785         }\r
786 }\r
787 \r
788 void near ScrollDown(map_view_t *mv, player_t *player, word id, word plid)\r
789 {\r
790         /* increment the pixel position and update the page */\r
791         mv[id].page->dy += player[plid].enti.speed;\r
792 \r
793         /* check to see if this changes the tile */\r
794         if(mv[id].page->dy >= mv[0].dxThresh )\r
795         {\r
796 //              vga_setup_wm1_block_copy();\r
797 //              _fmemmove(mv[id].page->data+mv[id].page->pi, mv[id].page->data, mv[id].page->pagesize);\r
798 //              vga_restore_rm0wm0();\r
799                 /* Snap the origin forward */\r
800                 mv[id].page->data += mv[id].page->pi;\r
801                 mv[id].page->dy = mv[0].map->tiles->tileWidth;\r
802         }\r
803 }\r
804 \r
805 //===========================================================================\r
806 //TODO: put player in starting position of assigned spot on map\r
807 //default player position on the viewable map\r
808 void playerXYpos(int x, int y, player_t *player, map_view_t *pip, nibble pn)\r
809 {\r
810         player[pn].enti.tx = x + pip[0].tx + pip[0].page->tilemidposscreenx;\r
811         player[pn].enti.ty = y + pip[0].ty + pip[0].page->tilemidposscreeny;\r
812 }\r
813 //===========================================================================\r
814 \r
815 sword chkmap(map_t *map, word q)\r
816 {\r
817 //      bitmap_t bp;\r
818         static byte x[(MAPW*MAPH)+1] =\r
819 { 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
820 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
821 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
822 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
823 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
824 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
825 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
826 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      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,      3,      1,      1,      1,      \\r
828 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
829 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
830 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
831 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
832 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
833 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
834 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
835         //check for failed to load map\r
836         if((map->width == map->height == 0) && (q>0))\r
837         {\r
838                 //initiate a null map!\r
839                 map->width=MAPW;///2;\r
840                 map->height=MAPH;///2;\r
841 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
842                 map->data = &x;\r
843                 map->tiles = malloc(sizeof(tiles_t));\r
844                 //fix this to be far~\r
845 //              bp = bitmapLoadPcx("data/ed.pcx");\r
846 //              map->tiles->data = &bp;\r
847 #ifdef __DEBUG_MAP__\r
848                 dbg_mapdata = map->data;\r
849 #endif\r
850                 map->tiles->tileHeight = 16;\r
851                 map->tiles->tileWidth = 16;\r
852                 map->tiles->rows = 1;\r
853                 map->tiles->cols = 1;\r
854 #ifdef __DEBUG_MAP__\r
855                 dbg_maptext = true;\r
856 #endif\r
857         }\r
858 #ifdef __DEBUG_MAP__\r
859         else dbg_maptext = false;\r
860 #endif\r
861         return 0;\r
862 }\r
863 \r
864 //TODO: player position here\r
865 void mapGoTo(map_view_t *mv, int tx, int ty)\r
866 {\r
867         int py;//px,\r
868         unsigned int i;\r
869 \r
870         mapinitmapview(mv, tx, ty);\r
871 \r
872         /* draw the tiles */\r
873         modexClearRegion(mv[0].page, 0, 0, mv[0].page->width, mv[0].page->height, 0);\r
874         py=0;\r
875         i=mv[0].ty * mv[0].map->width + mv[0].tx;\r
876         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
877                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
878         i+=mv->map->width - tx;\r
879         }\r
880         //if(!pageploop)\r
881                 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 void near ZC_drawframe(map_view_t *pip, entity_t *enti, sword x, sword y)\r
1105 {\r
1106         switch(pip[0].video->rss)\r
1107         {\r
1108                 case 0:\r
1109                         animate_spri(enti, pip->video);\r
1110                 break;\r
1111                 case 1:\r
1112                         animate_spri(enti, pip->video);\r
1113                 break;\r
1114 //              case 2:\r
1115 //                      modexClearRegion(&(pip[0].page[0]), x, y, 16, 32, player[pn].enti.dire);\r
1116 //              break;\r
1117         }\r
1118 }\r
1119 \r
1120 #ifdef SPRITE\r
1121 #define FRAME1 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 48, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
1122 #define FRAME2 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
1123 #define FRAME3 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 0, player[pn].enti.dire, 24, 32,     PLAYERBMPDATAPTR);\r
1124 #define FRAME4 modexDrawSpriteRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, player[pn].enti.dire, 24, 32,    PLAYERBMPDATAPTR);\r
1125 #else\r
1126 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 2+player[pn].enti.dire);\r
1127 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
1128 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, player[pn].enti.dire);\r
1129 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 16, 32, 1+player[pn].enti.dire);\r
1130 #endif\r
1131 \r
1132 void near animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1133 {\r
1134         sword x = player[pn].enti.x;\r
1135         sword y = player[pn].enti.y;\r
1136         sword bx = x+16;        //buffer's x\r
1137         sword by = y+16;        //buffer's y\r
1138         sword qq; //scroll offset\r
1139         word ls = player[pn].enti.persist_aniframe;\r
1140         player[pn].enti.dire=32; //direction\r
1141 \r
1142         switch(scrollswitch)\r
1143         {\r
1144                 case 0:\r
1145                         qq = 0;\r
1146                 break;\r
1147                 default:\r
1148                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1149                 break;\r
1150         }\r
1151         //x-=4;\r
1152         y-=pip[0].map->tiles->tileHeight;\r
1153         switch (player[pn].enti.d)\r
1154         {\r
1155                 case 0:\r
1156                         //up\r
1157                         player[pn].enti.dire*=player[pn].enti.d;\r
1158                         y-=qq;\r
1159                         by-=4;\r
1160                 break;\r
1161                 case 3:\r
1162                         // right\r
1163                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
1164                         x+=qq;\r
1165                         bx+=4;\r
1166                 break;\r
1167                 case 2:\r
1168                 break;\r
1169                 case 4:\r
1170                         //down\r
1171                         player[pn].enti.dire*=(player[pn].enti.d-2);\r
1172                         y+=qq;\r
1173                         by+=4;\r
1174                 break;\r
1175                 case 1:\r
1176                         //left\r
1177                         player[pn].enti.dire*=(player[pn].enti.d+2);\r
1178                         x-=qq;\r
1179                         bx-=4;\r
1180                 break;\r
1181         }\r
1182 \r
1183         if(!pageflipflop)\r
1184                 modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);\r
1185         else{\r
1186                 //copy old bg to page0\r
1187                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
1188                 //update buffer\r
1189                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
1190         }\r
1191 //modexCopyPageRegion(page_t *dest, page_t *src, word sx, word sy, word dx, word dy, word width, word height);\r
1192         //modexCopyPageRegion(pip[3].page, pip[!(pip->video->p)].page, x-4, y-4, 0, 128, 28, 36);\r
1193         /*modexCopyPageRegion(pip[pip->video->p].page,\r
1194  pip[!(pip->video->p)].page, x-4, y-4, x-4, y-4, 28, 36);*/\r
1195 //      else modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 40);\r
1196         switch(ls)\r
1197         {\r
1198                 case 1:\r
1199                         FRAME1\r
1200                 break;\r
1201                 case 2:\r
1202                         FRAME2\r
1203                 break;\r
1204                 case 3:\r
1205                         FRAME3\r
1206                 break;\r
1207                 case 4:\r
1208                         FRAME4\r
1209                 break;\r
1210         }\r
1211 //      if(2>ls && ls>=1) { FRAME1 }else\r
1212 //      if(3>ls && ls>=2) { FRAME2 }else\r
1213 //      if(4>ls && ls>=3) { FRAME3 }else\r
1214 //      if(5>ls && ls>=4) { FRAME4 }\r
1215         //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0, x, y, 24, 32);\r
1216         //printf("x=%d  y=%d    bx=%d           by=%d\n", x, y, bx, by);\r
1217         pip->video->r=1;\r
1218 }\r
1219 \r
1220 void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitch)\r
1221 {\r
1222         sword x = player[pn].enti.x;\r
1223         sword y = player[pn].enti.y;\r
1224         sword qq,dd; //scroll offset\r
1225         player[pn].enti.dire=10; //direction\r
1226 \r
1227         switch(scrollswitch)\r
1228         {\r
1229                 case 0:\r
1230                         dd = 0;\r
1231                         qq = 0;\r
1232                 break;\r
1233                 case 1:\r
1234                         dd = 1;\r
1235                         qq = 0;\r
1236                 break;\r
1237                 case 2:\r
1238                         dd = 1;\r
1239                         qq = ((player[pn].enti.q)*(player[pn].enti.speed));\r
1240                 break;\r
1241         }\r
1242         x-=4;\r
1243         y-=pip[0].map->tiles->tileHeight;\r
1244         switch (player[pn].enti.d)\r
1245         {\r
1246                 case 0:\r
1247                         //up\r
1248                         player[pn].enti.dire*=player[pn].enti.d+1;\r
1249                         y-=qq;\r
1250                 break;\r
1251                 case 3:\r
1252                         // right\r
1253                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1254                         x+=qq;\r
1255                 break;\r
1256                 case 2:\r
1257                 break;\r
1258                 case 4:\r
1259                         //down\r
1260                         player[pn].enti.dire*=(player[pn].enti.d-1);\r
1261                         y+=qq;\r
1262                 break;\r
1263                 case 1:\r
1264                         //left\r
1265                         player[pn].enti.dire*=(player[pn].enti.d+3);\r
1266                         x-=qq;\r
1267                 break;\r
1268         }\r
1269         player[pn].enti.dire+=dd;\r
1270 \r
1271         if((player[pn].enti.q==1 && player[pn].enti.pred != player[pn].enti.d) || !dd)\r
1272         {\r
1273                 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
1274                 player[pn].enti.pred = player[pn].enti.d;\r
1275         }\r
1276 \r
1277         //setting xy position\r
1278         player[pn].enti.spri->x = x;\r
1279         player[pn].enti.spri->y = y;\r
1280 \r
1281         //draw sprite\r
1282         ZC_drawframe(pip, &player[pn].enti, x, y);\r
1283 \r
1284         pip->video->r=1;\r
1285         //WALKTYPE_FRAM_PRINT;\r
1286 }\r
1287 \r
1288 /*\r
1289  * from zcroll16.c\r
1290 */\r
1291 \r
1292 boolean boundary_check(int x, int y, int dx, int dy, int h, int w)\r
1293 {\r
1294         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
1295 }\r
1296 \r
1297 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v)\r
1298 {\r
1299         // Assume everything crosses at most 1 tile at once\r
1300         return dx && 1;//crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
1301 }\r
1302 \r
1303 boolean ZC_walk2(entity_t *enti, map_view_t *map_v)\r
1304 {\r
1305         //return 1;\r
1306         int dx = 1;\r
1307         int dy = 1;\r
1308         switch(enti->d)\r
1309         {\r
1310                 case 2:\r
1311                         return 0;\r
1312                 case 1:\r
1313                         dx = -dx;\r
1314                 case 3:\r
1315                         dy = 0;\r
1316                         break;\r
1317                 case 0:\r
1318                         dy = -dy;\r
1319                 case 4:\r
1320                         dx = 0;\r
1321                         break;\r
1322         }\r
1323         if(coll_check(enti->x, enti->y, dx, dy,  map_v))\r
1324         {\r
1325                 // Allow movement\r
1326                 // Set speed\r
1327                 // Start animation\r
1328                 // Mark next tile as occupied\r
1329                 // Mark this tile as vacant\r
1330                 return 1;\r
1331         }\r
1332         return 0;\r
1333 }\r
1334 \r
1335 void player_walk(player_t *player, map_view_t *map_v){\r
1336         int dx=16, dy=16;\r
1337         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
1338         {\r
1339                 mapScroll(map_v, player);\r
1340                 // (Un)load stuff?\r
1341         }\r
1342 }\r
1343 \r
1344 void near mapScroll(map_view_t *mv, player_t *player)\r
1345 {\r
1346         //word x, y;  /* coordinate for drawing */\r
1347         int c = 1;\r
1348         int delta;\r
1349         mv->delta += player->dx | player->dy;\r
1350         delta = mv->delta;\r
1351         mv->d = (player->dx) ? (player->dx > 0) ? 3 : 1 : (player->dy) ? (player->dy > 0) ? 4 : 0 : 2;\r
1352         switch(mv->d){\r
1353                 case 4:\r
1354                         c = -1;\r
1355                         delta = -delta;\r
1356                 case 0:\r
1357                         if(!(delta + mv->dxThresh))\r
1358                         {\r
1359                                 mv->delta = 0;\r
1360                                 mv->ty += c;\r
1361                         }\r
1362                         break;\r
1363                 case 3:\r
1364                         c = -1;\r
1365                         delta = -delta;\r
1366                 case 1:\r
1367                         if(!(delta + mv->dyThresh))\r
1368                         {\r
1369                                 mv->delta = 0;\r
1370                                 mv->tx += c;\r
1371                         }\r
1372                         break;\r
1373                 default:\r
1374                         break;\r
1375         }\r
1376 \r
1377         mv->video->r=1;\r
1378 }\r