Advertisement
Guest User

SimpleRL DOS

a guest
Dec 2nd, 2011
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.00 KB | None | 0 0
  1. #include <string.h>
  2. #include <i86.h>
  3.  
  4. #define WIDTH 80
  5.  
  6. typedef struct {
  7.     int x;
  8.     int y;
  9. } POINT;
  10.  
  11. void clear() {
  12.     union REGS clear;
  13.     union REGS hide;
  14.  
  15.     // clear screen
  16.     clear.w.cx = 0;
  17.     clear.w.dx = 0x1850;
  18.     clear.h.bh = 7;
  19.     clear.w.ax = 0x0600;
  20.     int86(0x10, &clear, &clear);
  21.  
  22.     // hide cursor
  23.     hide.h.ah = 0x01;
  24.     hide.w.cx = 0x2607;
  25.     int86(0x10, &hide, &hide);
  26. }
  27.  
  28. void draw_char(char ch, int x, int y, char color) {
  29.     int i;
  30.  
  31.     i = 2 * (y * WIDTH + x);
  32.     ((char far *) 0xb8000000)[i] = ch;
  33.     ((char far *) 0xb8000000)[i+1] = color;
  34. }
  35. void draw_line(char * line, int x, int y, int w, char color) {
  36.     int ci;
  37.     for (ci = 0; ci < w; ci++)
  38.         draw_char(line[ci], x + ci, y, color);
  39. }
  40. void draw_map(char * map, int x, int y, int w, char color) {
  41.     int h = strlen(map) / w;
  42.     int line;
  43.  
  44.     for (line = 0; line < h; line++)
  45.         draw_line(map + line * w, 0, line, w, 1);
  46. }
  47.  
  48. void get_key(unsigned char * scancode, unsigned char * ascii) {
  49.     union REGS getkey;
  50.     getkey.h.ah = 0;
  51.     int86(0x16, &getkey, &getkey);
  52.  
  53.     *scancode = getkey.h.ah;
  54.     *ascii = getkey.h.al;
  55. }
  56.  
  57. void move(char * map, POINT * p, int x, int y, int w) {
  58.     if (map[y * w + x] == ' ') {
  59.         p->x = x;
  60.         p->y = y;
  61.     }
  62. }
  63.  
  64. void main() {
  65.     char * map =
  66.         "####  ####"
  67.         "#  ####  #"
  68.         "#        #"
  69.         "##      ##"
  70.         " #      # "
  71.         " #      # "
  72.         "##      ##"
  73.         "#        #"
  74.         "#  ####  #"
  75.         "####  ####";
  76.     int map_w = 10;
  77.  
  78.     POINT player = { 2, 2 };
  79.     unsigned char scancode = 0;
  80.     unsigned char ascii = 0;
  81.  
  82.     clear();
  83.     draw_map(map, 0, 0, map_w, 5);
  84.  
  85.     do {
  86.         draw_char(' ', player.x, player.y, 15);
  87.         switch (scancode) {
  88.         case 72:
  89.             move(map, &player, player.x, player.y - 1,map_w);
  90.             break;
  91.         case 80:
  92.             move(map, &player, player.x, player.y + 1,map_w);
  93.             break;
  94.         case 75:
  95.             move(map, &player, player.x - 1, player.y,map_w);
  96.             break;
  97.         case 77:
  98.             move(map, &player, player.x + 1, player.y,map_w);
  99.             break;
  100.         }
  101.         draw_char('', player.x, player.y, 15);
  102.  
  103.         get_key(&scancode, &ascii);
  104.     }while (scancode != 1);
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement