1 #include <stdio.h>
2 #include "sokoban.h"
3
4 extern char *malloc();
5 extern FILE *fopen();
6
7 extern short level, packets, savepack, rows, cols;
8 extern char map[MAXROW+1][MAXCOL+1];
9 extern POS ppos;
10
readscreen()11 short readscreen() {
12
13 FILE *screen;
14 char *fnam;
15 short j, c, ret = 0;
16
17 fnam = malloc( strlen( SCREENPATH) + 11);
18 sprintf( fnam, "%s/screen.%d", SCREENPATH, level);
19 if( (screen = fopen( fnam, "r")) == NULL)
20 ret = E_FOPENSCREEN;
21 else {
22 packets = savepack = rows = j = cols = 0;
23 ppos.x = -1; ppos.y = -1;
24 while( (ret == 0) && ((c = getc( screen)) != EOF)) {
25 if( c == '\n') {
26 map[rows++][j] = '\0';
27 if( rows > MAXROW)
28 ret = E_TOMUCHROWS;
29 else {
30 if( j > cols) cols = j;
31 j = 0;
32 }
33 }
34 else if( (c == player.obj_intern) || (c == playerstore.obj_intern)) {
35 if( ppos.x != -1)
36 ret = E_PLAYPOS1;
37 else {
38 ppos.x = rows; ppos.y = j;
39 map[rows][j++] = c;
40 if( j > MAXCOL) ret = E_TOMUCHCOLS;
41 }
42 }
43 else if( (c == save.obj_intern) || (c == packet.obj_intern) ||
44 (c == wall.obj_intern) || (c == store.obj_intern) ||
45 (c == ground.obj_intern)) {
46 if( c == save.obj_intern) { savepack++; packets++; }
47 if( c == packet.obj_intern) packets++;
48 map[rows][j++] = c;
49 if( j > MAXCOL) ret = E_TOMUCHCOLS;
50 }
51 else ret = E_ILLCHAR;
52 }
53 fclose( screen);
54 if( (ret == 0) && (ppos.x == -1)) ret = E_PLAYPOS2;
55 }
56 return( ret);
57 }
58