]> 4ch.mooo.com Git - 16.git/blobdiff - 16/roads/TILEIO.C
refresh wwww
[16.git] / 16 / roads / TILEIO.C
diff --git a/16/roads/TILEIO.C b/16/roads/TILEIO.C
new file mode 100755 (executable)
index 0000000..f04956b
--- /dev/null
@@ -0,0 +1,178 @@
+#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