--- /dev/null
+#define TILEIO_C\r
+\r
+#include <fastgraf.h>\r
+#include "roads.h"\r
+#include "tiles.h" /* NEEDS ACCESS BECAUSE OF ANIMS */\r
+\r
+extern int far *topography; /* BACKGROUND TILE LIST (ARRAY) */\r
+extern int far *terrain; /* FOREGROUND TILE LIST (ARRAY) */\r
+extern struct ANIMATION *anim_list[ANIM_LIST_TOTAL];\r
+\r
+int view_x=0, view_y=0; /* VIEW AREA (UPPER LEFT CORNER) */\r
+int viewpage=0; /* CURRENTLY VIEWED PAGE */\r
+\r
+/*\r
+ *\r
+ * Redraws the screen view area. Returns 1 on successful scroll.\r
+ *\r
+ */\r
+int redraw (int draw_type)\r
+{\r
+ int new_draw_type;\r
+ int pageflip=1;\r
+\r
+ switch (draw_type)\r
+ {\r
+ case NONFLIP_SCROLL_RIGHT:\r
+ new_draw_type=SCROLL_RIGHT; pageflip=0; break;\r
+ case NONFLIP_SCROLL_LEFT:\r
+ new_draw_type=SCROLL_LEFT; pageflip=0; break;\r
+ case NONFLIP_SCROLL_UP:\r
+ new_draw_type=SCROLL_UP; pageflip=0; break;\r
+ case NONFLIP_SCROLL_DOWN:\r
+ new_draw_type=SCROLL_DOWN; pageflip=0; break;\r
+ case NONFLIP_REFRESH:\r
+ new_draw_type=REFRESH; pageflip=0; break;\r
+ default:\r
+ new_draw_type=draw_type; break;\r
+ }\r
+\r
+ switch (new_draw_type)\r
+ {\r
+ case REFRESH: /* Full Refresh */\r
+ place_tile_block (0, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_UP:\r
+ if (view_y<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */\r
+ view_y--;\r
+ fg_transfer (0, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
+ break;\r
+\r
+ case SCROLL_DOWN:\r
+ if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return 0; /* HEY! */\r
+ view_y++;\r
+ fg_transfer (0, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_LEFT:\r
+ if (view_x<=0) return 0; /* DON'T ALLOW TO SCROLL BEYOND WORLD */\r
+ view_x--;\r
+ fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_RIGHT:\r
+ if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return 0; /* HEY! */\r
+ view_x++;\r
+ fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_UR:\r
+ if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw (SCROLL_UP);\r
+ if (view_y<=0) return redraw(SCROLL_RIGHT);\r
+ view_y--; view_x++;\r
+ fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, 0, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
+ place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_DR:\r
+ if (view_x>=WORLD_WIDTH-VIEW_WIDTH) return redraw(SCROLL_DOWN);\r
+ if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_RIGHT);\r
+ view_y++; view_x++;\r
+ fg_transfer (TILE_WIDTH, SCREEN_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ place_tile_block (VIEW_WIDTH-1, 0, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_DL:\r
+ if (view_x<=0) return redraw (SCROLL_DOWN);\r
+ if (view_y>=WORLD_HEIGHT-VIEW_HEIGHT) return redraw(SCROLL_LEFT);\r
+ view_y++; view_x--;\r
+ fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, TILE_HEIGHT, SCREEN_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-TILE_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, VIEW_HEIGHT-1, VIEW_WIDTH-1, VIEW_HEIGHT-1);\r
+ place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
+ break;\r
+\r
+ case SCROLL_UL:\r
+ if (view_x<=0) return redraw (SCROLL_UP);\r
+ if (view_y<=0) return redraw (SCROLL_LEFT);\r
+ view_y--; view_x--;\r
+ fg_transfer (0, SCREEN_WIDTH-TILE_WIDTH-1, 0, SCREEN_HEIGHT-TILE_HEIGHT-1, TILE_WIDTH, SCREEN_HEIGHT-1, viewpage, !viewpage);\r
+ place_tile_block (0, 0, VIEW_WIDTH-1, 0);\r
+ place_tile_block (0, 0, 0, VIEW_HEIGHT-1);\r
+ break;\r
+ }\r
+\r
+ if (pageflip)\r
+ {\r
+ viewpage=!viewpage; /* SWAP PAGES */\r
+ fg_setvpage (viewpage);\r
+ }\r
+\r
+ return 1; /* SUCCESSFUL SCROLL */\r
+}\r
+\r
+/*\r
+ *\r
+ * Redraws a rectangular region of the active (!shown) page with tiles.\r
+ *\r
+ */\r
+\r
+void place_tile_block (int x1, int y1, int x2, int y2)\r
+{\r
+ register int x, y;\r
+ int tile, a;\r
+\r
+ for (y=view_y+y1; y<=view_y+y2; y++)\r
+ for (x=view_x+x1; x<=view_x+x2; x++)\r
+ {\r
+ tile=terrain[WORLD_TILE(x,y)];\r
+\r
+ /* DON'T PLACE FOREGROUND IF EMPTY */\r
+ if (tile==EMPTY_TILE)\r
+ pagecopy_tile_op (topography[WORLD_TILE(x,y)],VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
+\r
+ else\r
+ {\r
+ if (is_anim(tile))\r
+ {\r
+ a=0;\r
+ while (anim_list[a]->anm!=tile) a++;\r
+ tile=anim_list[a]->current;\r
+ }\r
+\r
+ pagecopy_tile_op (topography[WORLD_TILE(x,y)], VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
+ pagecopy_tile_tr (tile, VIEW_TILE(x-view_x,y-view_y), TILEPAGE, !viewpage);\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+ *\r
+ * Updates on the visual page a single world tile.\r
+ *\r
+ */\r
+void update_tile (int tile)\r
+{\r
+ register int viewtile;\r
+\r
+ if (!is_viewable (tile)) return; /* DO NOT UPDATE THE UNSEEN */\r
+\r
+ viewtile=VIEW_TILE(WORLD_TILE_X(tile)-view_x,WORLD_TILE_Y(tile)-view_y);\r
+\r
+ if (terrain[tile]==EMPTY_TILE)\r
+ pagecopy_tile_op (topography[tile], viewtile, TILEPAGE, viewpage);\r
+\r
+ else\r
+ {\r
+ pagecopy_tile_op (topography[tile], MIXING_TILE, TILEPAGE, TILEPAGE);\r
+ pagecopy_tile_tr (terrain[tile], MIXING_TILE, TILEPAGE, TILEPAGE);\r
+ pagecopy_tile_op (MIXING_TILE, viewtile, TILEPAGE, viewpage);\r
+ }\r
+}\r
+\r