OSDN Git Service

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