123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include <draw.h>
- #include "sokoban.h"
- void
- consumeline(Biobuf *b)
- {
- while(Bgetc(b) != '\n')
- ;
- }
- /* parse a level file */
- int
- loadlevels(char *path)
- {
- Biobuf *b;
- int x = 0, y = 0, lnum = 0;
- char c;
-
- if(path == nil)
- return 0;
- b = Bopen(path, OREAD);
- if(b == nil) {
- fprint(2, "could not open file %s: %r\n", path);
- return 0;
- }
- memset(levels, 0, Maxlevels*sizeof(Level));
-
- while((c = Bgetc(b)) > 0) {
- switch(c) {
- case ';':
- consumeline(b); /* no ';'-comments in the middle of a level */
- break;
- case '\n':
- levels[lnum].index = lnum;
- levels[lnum].done = 0;
- x = 0;
- levels[lnum].max.y = ++y;
- c = Bgetc(b);
- if(c == '\n' || c == Beof) {
- /* end of level */
- if(++lnum == Maxlevels)
- goto Done;
- x = 0;
- y = 0;
- } else
- Bungetc(b);
- break;
- case '#':
- levels[lnum].board[x][y] = Wall;
- x++;
- break;
- case ' ':
- levels[lnum].board[x][y] = Empty;
- x++;
- break;
- case '$':
- levels[lnum].board[x][y] = Cargo;
- x++;
- break;
- case '*':
- levels[lnum].board[x][y] = GoalCargo;
- x++;
- break;
- case '.':
- levels[lnum].board[x][y] = Goal;
- x++;
- break;
- case '@':
- levels[lnum].board[x][y] = Empty;
- levels[lnum].glenda = Pt(x, y);
- x++;
- break;
- case '+':
- levels[lnum].board[x][y] = Goal;
- levels[lnum].glenda = Pt(x, y);
- x++;
- break;
- default:
- fprint(2, "impossible character for level %d: %c\n", lnum+1, c);
- return 0;
- }
- if(x > levels[lnum].max.x)
- levels[lnum].max.x = x;
- levels[lnum].max.y = y;
- }
- Done:
- Bterm(b);
- level = levels[0];
- numlevels = lnum;
- return 1;
- }
|