]> 4ch.mooo.com Git - 16.git/blob - 16/zcroll16.c
i do not know if zcroll16.c or scroll16.c will be used yakui-lover wwwww for zcroll...
[16.git] / 16 / zcroll16.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/zcroll16.h"\r
26 \r
27 boolean boundary_check(int x, int y, int dx, int dy, int h, int w){\r
28         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
29 }\r
30 \r
31 boolean coll_check(int x, int y, int dx, int dy, map_view_t *map_v){\r
32         // Assume everything crosses at most 1 tile at once\r
33         return dx && crossable_tile(x + dx, map_v) || dy && crossable_tile(y + dy, map_v);\r
34 }\r
35 \r
36 boolean walk(entity_t *ent, map_view_t *map_v)\r
37 {\r
38         int dx = 1;\r
39         int dy = 1;\r
40         switch(ent->d)\r
41         {\r
42                 case STOP:\r
43                         return;\r
44                 case LEFT:\r
45                         dx = -dx;\r
46                 case RIGHT:\r
47                         dy = 0;\r
48                         break;\r
49                 case UP:\r
50                         dy = -dy;\r
51                 case DOWN:\r
52                         dx = 0;\r
53                         break;\r
54         }\r
55         if(coll_check(ent->x, ent->y, dx, dy,  map_v)){\r
56                 // Allow movement\r
57                 // Set speed\r
58                 // Start animation\r
59                 // Mark next tile as occupied\r
60                 // Mark this tile as vacant\r
61                 return true;\r
62         }\r
63         return false;\r
64 }\r
65 \r
66 void player_walk(player_t *player, map_view_t *map_v){\r
67         if(walk(player->ent, 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
68                 mapScroll(map_v, player);\r
69                 // (Un)load stuff?\r
70         }\r
71 }\r
72 \r
73 \r
74 void near mapScroll(map_view_t *mv, player_t *player){\r
75         word x, y;  /* coordinate for drawing */\r
76         int c = 1;\r
77         int delta;\r
78         mv->delta += player->dx | player->dy;\r
79         delta = mv->delta;\r
80         mv->d = (player->dx) ? (player->dx > 0) ? RIGHT : LEFT : (player->dy) ? (player->dy > 0) ? DOWN : UP : STOP;\r
81         switch(mv->d){\r
82                 case DOWN:\r
83                         c = -1;\r
84                         delta = -delta;\r
85                 case UP:\r
86                         if(!(delta + mv->dxThresh)){\r
87                                 mv->delta = 0;\r
88                                 mv->ty += c;\r
89                         }\r
90                         break;\r
91                 case RIGHT:\r
92                         c = -1;\r
93                         delta = -delta;\r
94                 case LEFT:\r
95                         if(!(delta + mv->dyThresh)){\r
96                                 mv->delta = 0;\r
97                                 mv->tx += c;\r
98                         }\r
99                         break;\r
100                 default:\r
101                         break;\r
102         }\r
103 \r
104         mv->video->r=1;\r
105 }\r
106 \r
107 sword chkmap(map_t *map, word q)\r
108 {\r
109 //      bitmap_t bp;\r
110         static byte x[(MAPW*MAPH)+1] =\r
111 { 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
112 /*1,    2,      3,      4,      0,      3,      3,      3,      3,      3,      3,      3,      3,      4,      1,      1,      1,      1,      1,      1,      \\r
113 5,      6,      7,      8,      0,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
114 9,      10,     11,     12,     4,      1,      0,      1,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
115 13,     14,     15,     16,     0,      1,      1,      1,      5,      8,      1,      11,     11,     1,      1,      1,      1,      1,      1,      1,      \\r
116 0,      0,      4,      0,      0,      0,      0,      0,      8,      8,      1,      11,     11,     3,      1,      1,      1,      1,      1,      1,      \\r
117 1,      1,      1,      1,      0,      0,      0,      0,      8,      8,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
118 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
119 1,      1,      1,      1,      0,      0,      0,      0,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
120 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
121 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
122 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
123 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
124 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      1,      1,      1,      \\r
125 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      \\r
126 1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      1,      3,      3,      3,      3,      1,      2,      3,      4 };*/\r
127         //check for failed to load map\r
128         if((map->width == map->height == 0) && (q>0))\r
129         {\r
130                 //initiate a null map!\r
131                 map->width=MAPW;///2;\r
132                 map->height=MAPH;///2;\r
133 //              map->data = malloc(((map->width*map->height)+1)*sizeof(byte));\r
134                 map->data = &x;\r
135                 map->tiles = malloc(sizeof(tiles_t));\r
136                 //fix this to be far~\r
137 //              bp = bitmapLoadPcx("data/ed.pcx");\r
138 //              map->tiles->data = &bp;\r
139                 map->tiles->debug_data = map->data;\r
140                 map->tiles->tileHeight = 16;\r
141                 map->tiles->tileWidth = 16;\r
142                 map->tiles->rows = 1;\r
143                 map->tiles->cols = 1;\r
144                 map->tiles->debug_text = true;\r
145         }\r
146         else map->tiles->debug_text = false;\r
147         return 0;\r
148 }\r
149 \r
150 //TODO: player position here\r
151 void mapGoTo(map_view_t *mv, int tx, int ty)\r
152 {\r
153         int px, py;\r
154         unsigned int i;\r
155 \r
156         /* set up the coordinates */\r
157         mv->tx = tx;\r
158         mv->ty = ty;\r
159         mv->page->delta = 0;\r
160 \r
161         /* set up the thresholds */\r
162         mv->dxThresh = mv->map->tiles[0]->tileWidth * 2;\r
163         mv->dyThresh = mv->map->tiles[0]->tileHeight * 2;\r
164 \r
165         /* draw the tiles */\r
166         modexClearRegion(mv->page, 0, 0, mv->page->width, mv->page->height, 0);\r
167         py=0;\r
168         i=mv->ty * mv->map->width + mv->tx;\r
169 /*      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
170                 mapDrawWRow(&mv[0], tx-1, ty, py);\r
171         i+=mv->map->width - tx;\r
172         }\r
173         if(!pageploop) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);\r
174 //      {\r
175 //              unsigned int k,j,o;\r
176 //              // fill screen with a distinctive pattern \r
177 //              for (k=0;k < vga_state.vga_width;k++) {\r
178 //                      o = k >> 2;\r
179 //                      vga_write_sequencer(0x02/*map mask*//*,1 << (k&3));\r
180 //                              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
181 //                                      vga_state.vga_graphics_ram[o] = (k^j)&15; // VRL samples put all colors in first 15!\r
182 //              }\r
183 //      }\r
184         modexCopyPageRegion(mv[3].page, mv[0].page, 0, 0, 0, 0, 24, 32);*/\r
185 }\r
186 \r
187 void near\r
188 mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y)\r
189 {\r
190         word rx;\r
191         word ry;\r
192         word textx=0;\r
193         word texty=0;\r
194         //if(i==0) i=2;\r
195         if(i==0)\r
196         {\r
197                 //wwww\r
198                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, 0); //currently the over scan color!\r
199         }\r
200         else\r
201         {\r
202                 rx = (((i-1) % ((t->data->width)/t->tileWidth)) * t->tileWidth);\r
203                 ry = (((i-1) / ((t->data->height)/t->tileHeight)) * t->tileHeight);\r
204 ////0000printf("i=%d\n", i);\r
205                 switch(t->debug_text)\r
206                 {\r
207                         case 0:\r
208 #ifndef TILERENDER\r
209                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, ((t->debug_data[i])+1));\r
210                                 //modexprint(page, x, y, 1, 15, 0, (char const *)(t->debug_data[i]));\r
211 #else\r
212                                 PBUFBFUN                (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
213                                 /* then the sprite. note modding ram ptr means we just draw to (x&3,0) */\r
214                                 //draw_vrl1_vgax_modex(x-rx,y-ry,vrl_header,vrl_lineoffs,buffer+sizeof(*vrl_header),bufsz-sizeof(*vrl_header));\r
215                                 //modexDrawBmpRegion    (page, x, y, rx, ry, t->tileWidth, t->tileHeight, (t->data));\r
216 #endif\r
217                         break;\r
218                         case 1:\r
219                                 modexClearRegion(page, x, y, t->tileWidth, t->tileHeight, (t->debug_data[i])+1);\r
220                                 //modexprintbig(page, x, y, 1, 15, 0, (t->debug_data));\r
221                                 /*for(texty=0; texty<2; texty++)\r
222                                 {\r
223                                         for(textx=0; textx<2; textx++)\r
224                                         {*/\r
225 //                                              modexprint(page, x+(textx*8), y+(texty*8), 1, (word)(t->debug_data), 0, (t->debug_data));\r
226 /*                                      }\r
227                                 }*/\r
228                         break;\r
229                 }\r
230         }\r
231 }\r
232 \r
233 unsigned char shinku_fps_indicator_page = 2;\r
234 boolean pageflipflop = 1;\r
235 boolean pageploop = 1;\r
236 \r
237 /*      sync    */\r
238 void shinku(global_game_variables_t *gv)\r
239 {\r
240         word x = (0) + gv->video.page[/*!*/(gv->video.p)].dx; // follow the screen\r
241         word y = (0) + gv->video.page[/*!*/(gv->video.p)].dy; // follow the screen\r
242         word w = 64, h = 8, col = 7, bgcol = 0, type = 1;\r
243         byte o,o2,i;\r
244         if(elapsed_timer(gv) >= (1.0 / gv->kurokku.frames_per_second))\r
245         {\r
246                 sprintf(gv->pee, "%.0f fps", (double)gv->kurokku.tiku/ticktock(gv));\r
247                 //modexClearRegion(&(gv->video.page[shinku_fps_indicator_page]), x, y, w, h, 45);\r
248                 modexprint(&(gv->video.page[/*!*/(gv->video.p)]), x, y, type, col, bgcol, gv->pee);\r
249                 gv->kurokku.tiku=0;\r
250         }else //copy dat sheet\r
251         gv->kurokku.tiku++;\r
252 \r
253         switch(gv->kurokku.fpscap)\r
254         {\r
255                 case 0:\r
256                         gv->kurokku.frames_per_second=1;\r
257                 break;\r
258                 case 1:\r
259                         //turn this off if XT\r
260                         vga_wait_for_vsync();\r
261                         gv->kurokku.frames_per_second=60;\r
262                 break;\r
263         }\r
264         if(pageflipflop){\r
265         if(gv->video.r){\r
266                 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
267                 modexShowPage(&(gv->video.page[gv->video.p]));\r
268                 if(!pageploop) gv->video.p=!gv->video.p;\r
269                 gv->video.r=!gv->video.r;\r
270         }\r
271         }\r
272 }\r
273 \r
274 void near animatePlayer(map_view_t *pip, player_t *player,  sword scrollswitch)\r
275 {\r
276         sword x = player->x;\r
277         sword y = player->y;\r
278         sword bx = x+16;        //buffer's x\r
279         sword by = y+16;        //buffer's y\r
280         word dire=32; //direction\r
281         sword qq; //scroll offset\r
282         word ls = player->persist_aniframe;\r
283 \r
284         switch(scrollswitch)\r
285         {\r
286                 case 0:\r
287                         qq = 0;\r
288                 break;\r
289                 default:\r
290                         qq = ((player->q)*(player->speed));\r
291                 break;\r
292         }\r
293         //x-=4;\r
294         y-=pip->map->tiles->tileHeight;\r
295         switch (player->d)\r
296         {\r
297                 case 0:\r
298                         //up\r
299                         dire*=player->d;\r
300                         y-=qq;\r
301                         by-=4;\r
302                 break;\r
303                 case 3:\r
304                         // right\r
305                         dire*=(player->d-2);\r
306                         x+=qq;\r
307                         bx+=4;\r
308                 break;\r
309                 case 2:\r
310                 break;\r
311                 case 4:\r
312                         //down\r
313                         dire*=(player->d-2);\r
314                         y+=qq;\r
315                         by+=4;\r
316                 break;\r
317                 case 1:\r
318                         //left\r
319                         dire*=(player->d+2);\r
320                         x-=qq;\r
321                         bx-=4;\r
322                 break;\r
323         }\r
324 \r
325 #ifdef SPRITE\r
326 #define FRAME1 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 48, dire, 24, 32, PLAYERBMPDATA);\r
327 #define FRAME2 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
328 #define FRAME3 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 0, dire, 24, 32,  PLAYERBMPDATA);\r
329 #define FRAME4 PBUFSFUN(pip[/*!*/(pip->video->p)].page, x, y, 24, dire, 24, 32, PLAYERBMPDATA);\r
330 #else\r
331 #define FRAME1 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 2+dire);\r
332 #define FRAME2 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
333 #define FRAME3 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, dire);\r
334 #define FRAME4 modexClearRegion(pip[/*!*/(pip->video->p)].page, x, y, 24, 32, 1+dire);\r
335 #endif\r
336         if(!pageflipflop)\r
337                 modexCopyPageRegion(pip->page, pip->page, x-4, y-4, x-4, y-4, 28, 36);\r
338         else{\r
339                 //copy old bg to page0\r
340                 //modexCopyPageRegion(pip[3].page, pip[0].page, bx, by, 0, 0,   20, 36);\r
341                 //update buffer\r
342                 //modexCopyPageRegion(pip[0].page, pip[3].page, 0, 0,   x, y,   20, 36);\r
343         }\r
344         switch(ls)\r
345         {\r
346                 case 1:\r
347                         FRAME1\r
348                 break;\r
349                 case 2:\r
350                         FRAME2\r
351                 break;\r
352                 case 3:\r
353                         FRAME3\r
354                 break;\r
355                 case 4:\r
356                         FRAME4\r
357                 break;\r
358         }\r
359         pip->video->r=1;\r
360 }\r