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