author | ecalot
<ecalot> 2004-08-13 04:33:40 UTC |
committer | ecalot
<ecalot> 2004-08-13 04:33:40 UTC |
parent | 4af2e317faff9e10a43898258783cd646a2ef4f7 |
FP/src/Makefile | +2 | -2 |
FP/src/include/maps.h | +24 | -47 |
FP/src/include/room.h | +4 | -1 |
FP/src/ker/kernel.c | +20 | -13 |
FP/src/ker/room.c | +66 | -73 |
FP/src/res/maps.c | +82 | -127 |
diff --git a/FP/src/Makefile b/FP/src/Makefile index 834a6a5..56fb8e1 100644 --- a/FP/src/Makefile +++ b/FP/src/Makefile @@ -115,9 +115,9 @@ kernel.o: ker/kernel.c include/kernel.h include/resources.h include/output.h $(INFO) Compiling main kernel... $(CC) -c ker/kernel.c $(OPTIONS) -room.o: ker/drawscreen.c +room.o: ker/room.c $(INFO) Compiling kernel room object... - $(CC) -c ker/drawscreen.c $(OPTIONS) + $(CC) -c ker/room.c $(OPTIONS) kid.o: ker/kid.c $(INFO) Compiling kernel kid object... diff --git a/FP/src/include/maps.h b/FP/src/include/maps.h index e0fb497..78ead31 100644 --- a/FP/src/include/maps.h +++ b/FP/src/include/maps.h @@ -34,57 +34,34 @@ maps.c: Freeprince : Map handling library #define _MAPS_H_ #include "map_defs.h" - #include "room.h" +#include "resources.h" /* tMemory */ +#include "kid.h" /* tKid */ + +typedef struct { + tRoomId links[4*24]; + unsigned char fore [24*30]; + unsigned char back [24*30]; + /* + * Active door handling here + * */ + int time; + unsigned char start[3]; +} tMap; typedef enum {eLeft=0,eRight=1,eUp=2,eDown=3}tDirection; -int levelUse(void* level); -/* Sets the level for future use using the resource given - * Initializes the position in the beginning of the level - * - * Return 0 on success - */ -tTile levelGetTile(tRoom* room,int x, int y); - -int levelGetScreenWalls(unsigned char* data,unsigned char* borders); -/* nt levelGetRoom (tRoom* room); */ -/* This will save a screen map into data. - * - * data is a pre-allocated array with 10x3=30 bytes with the screen map - * dumped over it in left-to-right/upper-to-lower oreder. - * - * borders is another pre-allocated array with 10 upper bytes, 10 bottom - * bytes, 3 left-side bytes, 3 right-side bytes and 4 bytes for the - * corners. This is another 30 bytes. The order has to be determined! - * In case the screen doesn't exist the 0x00 (free foreground) byte will - * be returned for the bottom and right sides, the wall foreground for - * the left side and the simple tile byte for the top side. - */ - -int levelGetScreenItems(unsigned char* data,unsigned char* borders); -/* This will save a screen map modifiers into data. - * - * data and borders are in the same form as Walls but they contain - * additional modifiers that must be defined in maps.h. - * e.g. MAPS_ITEMS_DOOROPEN 0x01 - */ - -int levelMoveScreen(tDirection direction); -/* Moves the position screen that is inside the library - * - * Returns 0 id the screen didn't exist and the screen id - * in case the screen was moved - */ - -int levelGetGuards(/* TODO: add modifiers */); -int levelGetDoorMap(/* TODO: idem */); - -int levelGetStarPosition(int* screen, int* position); /* TODO: define - position as an int or using x,y coordinate system*/ - -int levelGetInformation(int *thisScreen, unsigned char* LRUDscreens, unsigned char* cornerScreens); -/* TODO: define the format of cornerscreens */ +/* called from reources */ +void* mapLoadLevel(tMemory* level); +void mapDestroy(tData* map); + +/* called from the kernel */ +tRoom mapGetRoom(tData* map, tRoomId roomId); +void mapStart(tData* map, tKid* kid, tRoomId* roomId); + +/* events */ +void mapPressedTile(tData* map, tTile tile); +void mapMove(tData* map); #endif diff --git a/FP/src/include/room.h b/FP/src/include/room.h index 1043c62..cbfd77b 100644 --- a/FP/src/include/room.h +++ b/FP/src/include/room.h @@ -40,6 +40,7 @@ typedef unsigned char tTileId; typedef unsigned char tModId; typedef struct { + void* level; tRoomId id; tRoomId links[4]; tRoomId corners[4]; @@ -63,7 +64,9 @@ typedef struct { char code; } tTile; -void drawScreen(/*tRoom room, */int layer,int level); /* TODO: rename it to roomDraw */ +tTile roomGetTile(tRoom* room,int x, int y); +void roomDrawBackground(tRoom* room); +void roomDrawForeground(tRoom* room); #endif diff --git a/FP/src/ker/kernel.c b/FP/src/ker/kernel.c index 3d0fe5e..25556c9 100644 --- a/FP/src/ker/kernel.c +++ b/FP/src/ker/kernel.c @@ -40,20 +40,27 @@ kernel.c: FreePrince : Main Kernel #include "titles.h" #include "kid.h" #include "room.h" +#include "maps.h" /* * Main game control function */ int playgame(int optionflag,int level) { - tKey key=inputCreateKey(); - tKid kid=kidCreate(); - -/* Game loop here */ - drawScreen(4,level); -/* Level loop here */ - outputClearScreen(); /* TODO: send to drawScreen(0) */ - /*drawScreen(0); TODO: try to optimize what to draw */ + /* Create objects */ + tKey key=inputCreateKey(); + tKid kid=kidCreate(); + tData* map=NULL; /*resLoad(RES_MAP+level);*/ + tRoom room; + tRoomId roomId; + + /* Game loop here */ + + /* Initialize kid and room in the map */ + mapStart(map,&kid,&roomId); + room=mapGetRoom(map,roomId); + + /* Level loop here */ while (1) { if (inputGetEvent(&key)) { /* Time event */ @@ -64,21 +71,21 @@ int playgame(int optionflag,int level) { * the key is interpreted in kid object */ kidMove(&kid,key); - + mapMove(map); /* Drawing functions */ outputClearScreen(); /* TODO: send to drawScreen(0) */ - drawScreen(0,0); - drawScreen(1,0); - drawScreen(2,0); + roomDrawBackground(&room); kidDraw(kid); - drawScreen(3,0); + roomDrawForeground(&room); outputUpdateScreen(); } else { /* Action event */ switch (key.actionPerformed) { case quit: + resFree(map); return 1; case gotoTitles: + resFree(map); return 0; default: break; diff --git a/FP/src/ker/room.c b/FP/src/ker/room.c index c7eda55..caa3213 100644 --- a/FP/src/ker/room.c +++ b/FP/src/ker/room.c @@ -19,8 +19,8 @@ */ /* -drawscreen.c: FreePrince : Draw Screen -\xaf\xaf\xaf\xaf\xaf\xaf\xaf\xaf\xaf\xaf\xaf\xaf +room.c: FreePrince : Room and Tile Object +\xaf\xaf\xaf\xaf\xaf\xaf Copyright 2004 Princed Development Team Created: 18 Jul 2004 @@ -38,82 +38,75 @@ drawscreen.c: FreePrince : Draw Screen #include "room.h" #include "maps.h" -void drawScreen(/*tRoom room, */int layer,int level) { /* TODO: rename it to roomDraw */ - static int frame=0; - int i,x,y,fase; - tTile tile; - static tData* torch; - static tData* environment; - -/* draws the screen where the kid is - * if layer is 0 the background is loaded - * if layer is 1 the foreground columns are loaded - * if layer is 2 the torches are drawn - * if layer is 3 the columns that need to be redrawn are drawn - * - * if layer is 4 the function loads the vdungeon enviorment - * 5 vpalace - */ - - switch (layer&0x0f) { - case 0: - /* Draw and initialize the background */ - frame=0; - for(x=0;x<5;x++) { - for (y=0;y<12;y++) { - /*tile=levelGetTile(room,x,y);*/ - printf("%c",'A'+tile.code); - /*drawTile((i%10)*20,(i/10)*20,map[i]);*/ - } - printf("\n"); - } - break; - case 1: - break; - case 2: - if (frame==torch->frames) frame=0; - fase=0; - for (i=0;i<30;i++) { -/* if (map[i]==torch) { - outputDraw((i%10)*20,(i/10)*20,torch.pFrame[(frame+fase)%torch.frames]); - fase+=2; - }*/ - } - frame++; - break; - case 3: - break; - case 4: - case 5: - if (environment!=NULL) { - resFree(environment); - if (layer&0x1) { - environment=resLoad(RES_IMG_ENV_DUNGEON); - } else { - /*environment=resLoad(RES_IMG_ENV_PALACE);*/ - } - } - if (torch==NULL) { - torch=resLoad(RES_ANIM_TORCH); - } - break; - case 6: - if (torch!=NULL) { - resFree(torch); - torch=NULL; - } - if (environment!=NULL) { - resFree(environment); - environment=NULL; - } - break; +static struct { + tData* torch; + tData* environment; +} roomGfx; + +void roomLoadGfx(long environment) { + if (roomGfx.environment!=NULL) { + resFree(roomGfx.environment); + } + roomGfx.environment=resLoad(environment); + if (roomGfx.torch==NULL) { + roomGfx.torch=resLoad(RES_ANIM_TORCH); } +} - +void roomFree() { + if (roomGfx.environment) resFree(roomGfx.environment); + if (roomGfx.torch) resFree(roomGfx.torch); + roomGfx.torch=(roomGfx.environment=NULL); } +/* room */ tTile roomGetTile(tRoom* room,int x, int y) { - tTile result; + tTile result; + tTileId fore; + tModId back; + + fore=room->fore[x+12*y]; + back=room->back[x+12*y]; + result.code=fore&0x1F; + + switch (result.code) { /* TODO: use arrays and a better algorithm */ + case T_EMPTY: + result.walkable=0; + result.block=0; + result.hasTorch=0; + result.hasFloor=0; + result.hasBrokenTile=0; + result.isWall=0; + result.hasSword=0; + break; + case T_FLOOR: + case T_TORCH: + case T_SWORD: + case T_DEBRIS: + result.walkable=1; + result.block=0; + result.hasTorch=(result.code==T_TORCH); + result.hasFloor=1; + result.hasBrokenTile=(result.code==T_DEBRIS); + result.isWall=0; + result.hasSword=(result.code==T_SWORD); + break; + case T_WALL: + result.walkable=0; + result.block=1; + result.hasTorch=0; + result.hasFloor=0; + result.hasBrokenTile=0; + result.isWall=1; + result.hasSword=0; + break; + } return result; } +void roomDrawBackground(tRoom* room) { +} +void roomDrawForeground(tRoom* room) { +} + + diff --git a/FP/src/res/maps.c b/FP/src/res/maps.c index f4254a9..7193ca3 100644 --- a/FP/src/res/maps.c +++ b/FP/src/res/maps.c @@ -31,14 +31,15 @@ maps.c: Freeprince : Map handling library */ #include <string.h> /* mempcy */ +#include <stdlib.h> /* malloc */ #include "maps.h" #include "room.h" +#include "kid.h" +#include "resources.h" -static unsigned char* slevel; -static int sscreen; +#define slevel(field) (((tMap*)map->pFrames[0])->field) - -/* Privates */ +/* Privates void maps_getStartPosition(int* pantalla, int* p, int *b,tDirection *sentido,tDirection *sentido2) { int valor; @@ -52,84 +53,30 @@ void maps_getStartPosition(int* pantalla, int* p, int *b,tDirection *sentido,tDi } void maps_getGuard(int pantalla,int *p,int *b,int *skill,int *color,tDirection *sentido,int *exists) { - /* Posicion */ + Posicion unsigned char valor=(slevel[(MAPS_BLOCK_OFFSET_GUARD_POSITION+sscreen-1)]); *exists = (valor<30); *b = (valor%10); *p = (valor/10); - /* sentido */ + sentido *sentido=slevel[MAPS_BLOCK_OFFSET_GUARD_DIRECTION+pantalla-1]?eRight:eLeft; - /* skill */ + * skill * *skill =slevel[MAPS_BLOCK_OFFSET_GUARD_SKILL+pantalla-1]; - /* Color */ + * Color * *color =slevel[MAPS_BLOCK_OFFSET_GUARD_COLOR+pantalla-1]; } - +*/ /* Publics */ - -int levelUse(void* level) { -/* Sets the level for future use using the resource given - * Initializes the position in the beginning of the level - * - * Return 0 on success - */ - - /* Remember level */ - slevel=level; - - /* Set start screen */ - sscreen=slevel[MAPS_BLOCK_OFFSET_START_POSITION]; - - printf("levelUse: using new level\n"); - return level==NULL; -} - -tTile levelGetTile(tRoom* room,int x, int y) { - tTile result; - tTileId fore; - tModId back; - - fore=room->fore[x+12*y]; - back=room->back[x+12*y]; - result.code=fore&0x1F; - - switch (result.code) { /* TODO: use arrays and a better algorithm */ - case T_EMPTY: - result.walkable=0; - result.block=0; - result.hasTorch=0; - result.hasFloor=0; - result.hasBrokenTile=0; - result.isWall=0; - result.hasSword=0; - break; - case T_FLOOR: - case T_TORCH: - case T_SWORD: - case T_DEBRIS: - result.walkable=1; - result.block=0; - result.hasTorch=(result.code==T_TORCH); - result.hasFloor=1; - result.hasBrokenTile=(result.code==T_DEBRIS); - result.isWall=0; - result.hasSword=(result.code==T_SWORD); - break; - case T_WALL: - result.walkable=0; - result.block=1; - result.hasTorch=0; - result.hasFloor=0; - result.hasBrokenTile=0; - result.isWall=1; - result.hasSword=0; - break; - } - return result; +void* mapLoadLevel(tMemory* level) { + tMap* map=(tMap*)malloc(sizeof(tMap)); + memcpy(map->fore,level->array+MAPS_BLOCK_OFFSET_WALL,30*24); + memcpy(map->back,level->array+MAPS_BLOCK_OFFSET_BACK,30*24); + memcpy(map->start,level->array+MAPS_BLOCK_OFFSET_START_POSITION,3); +/* memcpy(slevel(links),level.data+MAPS_BLOCK_OFFSET_LINKS,4*24);*/ + return (void*)map; } - -tRoom levelGetRoom(tRoomId roomId) { +tRoom mapGetRoom(tData* map, tRoomId roomId) { tRoom result; tRoomId roomAux; @@ -137,12 +84,12 @@ tRoom levelGetRoom(tRoomId roomId) { result.id=roomId; /* SET room links */ - memcpy(result.links,slevel+MAPS_BLOCK_OFFSET_LINK+((roomId-1)*4),4); + memcpy(result.links,slevel(links)+((roomId-1)*4),4); /* up corners */ roomAux=result.links[2]; if (roomAux) { - result.corners[0]=slevel[MAPS_BLOCK_OFFSET_LINK+((roomAux-1)*4)+0]; - result.corners[1]=slevel[MAPS_BLOCK_OFFSET_LINK+((roomAux-1)*4)+1]; + result.corners[0]=*(slevel(links)+((roomAux-1)*4)+0); + result.corners[1]=*(slevel(links)+((roomAux-1)*4)+1); } else { result.corners[0]=0; result.corners[1]=0; @@ -150,8 +97,8 @@ tRoom levelGetRoom(tRoomId roomId) { /* down corners */ roomAux=result.links[3]; if (roomAux) { - result.corners[2]=slevel[MAPS_BLOCK_OFFSET_LINK+((roomAux-1)*4)+0]; - result.corners[3]=slevel[MAPS_BLOCK_OFFSET_LINK+((roomAux-1)*4)+1]; + result.corners[2]=*(slevel(links)+((roomAux-1)*4)+0); + result.corners[3]=*(slevel(links)+((roomAux-1)*4)+1); } else { result.corners[2]=0; result.corners[3]=0; @@ -160,32 +107,32 @@ tRoom levelGetRoom(tRoomId roomId) { /* SET corner bytes */ /* left+up */ if ((roomAux=result.corners[0])) { - result.fore[0]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+29]; - result.back[0]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+29]; + result.fore[0]=*(slevel(fore)+30*(roomAux-1)+29); + result.back[0]=*(slevel(back)+30*(roomAux-1)+29); } else { result.fore[0]=MAP_F_WALL; result.back[0]=MAP_B_NONE; } /* right+up */ if ((roomAux=result.corners[1])) { - result.fore[11]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+20]; - result.back[11]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+20]; + result.fore[11]=*(slevel(fore)+30*(roomAux-1)+20); + result.back[11]=*(slevel(back)+30*(roomAux-1)+20); } else { result.fore[11]=MAP_F_FREE; result.back[11]=MAP_B_NONE; } /* left+down */ if ((roomAux=result.corners[2])) { - result.fore[48]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+9]; - result.back[48]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+9]; + result.fore[48]=*(slevel(fore)+30*(roomAux-1)+9); + result.back[48]=*(slevel(back)+30*(roomAux-1)+9); } else { result.fore[48]=MAP_F_WALL; result.back[48]=MAP_B_NONE; } /* right+down */ if ((roomAux=result.corners[3])) { - result.fore[59]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+0]; - result.back[59]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+0]; + result.fore[59]=*(slevel(fore)+30*(roomAux-1)+0); + result.back[59]=*(slevel(back)+30*(roomAux-1)+0); } else { result.fore[59]=MAP_F_WALL; result.back[59]=MAP_B_NONE; @@ -193,12 +140,12 @@ tRoom levelGetRoom(tRoomId roomId) { /* Left room */ if ((roomAux=result.links[0])) { - result.fore[12]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+9]; - result.back[12]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+9]; - result.fore[24]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+19]; - result.back[24]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+19]; - result.fore[36]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+29]; - result.back[36]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+29]; + result.fore[12]=*(slevel(fore)+30*(roomAux-1)+9); + result.back[12]=*(slevel(back)+30*(roomAux-1)+9); + result.fore[24]=*(slevel(fore)+30*(roomAux-1)+19); + result.back[24]=*(slevel(back)+30*(roomAux-1)+19); + result.fore[36]=*(slevel(fore)+30*(roomAux-1)+29); + result.back[36]=*(slevel(back)+30*(roomAux-1)+29); } else { result.fore[12]=MAP_F_WALL; result.back[12]=MAP_B_NONE; @@ -210,12 +157,12 @@ tRoom levelGetRoom(tRoomId roomId) { /* Right room */ if ((roomAux=result.links[1])) { - result.fore[11]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+0]; - result.back[11]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+0]; - result.fore[23]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+10]; - result.back[23]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+10]; - result.fore[35]=slevel[MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+20]; - result.back[35]=slevel[MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+20]; + result.fore[11]=*(slevel(fore)+30*(roomAux-1)+0); + result.back[11]=*(slevel(back)+30*(roomAux-1)+0); + result.fore[23]=*(slevel(fore)+30*(roomAux-1)+10); + result.back[23]=*(slevel(back)+30*(roomAux-1)+10); + result.fore[35]=*(slevel(fore)+30*(roomAux-1)+20); + result.back[35]=*(slevel(back)+30*(roomAux-1)+20); } else { result.fore[11]=MAP_F_WALL; result.back[11]=MAP_B_NONE; @@ -227,8 +174,8 @@ tRoom levelGetRoom(tRoomId roomId) { /* Top room */ if ((roomAux=result.links[2])) { - memcpy(result.fore+1,slevel+MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+20,10); - memcpy(result.back+1,slevel+MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+20,10); + memcpy(result.fore+1,slevel(fore)+30*(roomAux-1)+20,10); + memcpy(result.back+1,slevel(back)+30*(roomAux-1)+20,10); } else { memcpy(result.fore+1,"aaaa aaaa ",10); /* TODO: use tiles */ memcpy(result.back+1,"aaaa aaaa ",10); /* TODO: use tiles */ @@ -236,20 +183,20 @@ tRoom levelGetRoom(tRoomId roomId) { /* Bottom room */ if ((roomAux=result.links[3])) { - memcpy(result.fore+49,slevel+MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+0,10); - memcpy(result.back+49,slevel+MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+0,10); + memcpy(result.fore+49,slevel(fore)+30*(roomAux-1)+0,10); + memcpy(result.back+49,slevel(back)+30*(roomAux-1)+0,10); } else { memcpy(result.fore+49,"aaaa aaaa ",10); /* TODO: use tiles */ memcpy(result.back+49,"aaaa aaaa ",10); /* TODO: use tiles */ } /* Main room */ - memcpy(result.fore+13,slevel+MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+0,10); - memcpy(result.back+13,slevel+MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+0,10); - memcpy(result.fore+25,slevel+MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+10,10); - memcpy(result.back+25,slevel+MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+10,10); - memcpy(result.fore+37,slevel+MAPS_BLOCK_OFFSET_WALL+30*(roomAux-1)+20,10); - memcpy(result.back+37,slevel+MAPS_BLOCK_OFFSET_BACK+30*(roomAux-1)+20,10); + memcpy(result.fore+13,slevel(fore)+30*(roomAux-1)+0,10); + memcpy(result.back+13,slevel(back)+30*(roomAux-1)+0,10); + memcpy(result.fore+25,slevel(fore)+30*(roomAux-1)+10,10); + memcpy(result.back+25,slevel(back)+30*(roomAux-1)+10,10); + memcpy(result.fore+37,slevel(fore)+30*(roomAux-1)+20,10); + memcpy(result.back+37,slevel(back)+30*(roomAux-1)+20,10); /* This will save a screen map into data. * @@ -273,31 +220,39 @@ tRoom levelGetRoom(tRoomId roomId) { return result; } -/*int levelMoveScreen(tDirection direction) { - * Moves the position screen that is inside the library - * - * Returns 0 id the screen didn't exist and the screen id - * in case the screen was moved - * - - return sscreen=slevel[MAPS_BLOCK_OFFSET_LINK+((sscreen-1)*4)+direction]; -}*/ +void mapStart(tData* map, tKid* kid, tRoomId* roomId) { + /* kid->x,y */ + *roomId=slevel(start)[0]; +} -int levelGetGuards(/* TODO: add modifiers */); -int levelGetDoorMap(/* TODO: idem */); +void mapMove(tData* map) { + /* slevel(time)++;*/ -int levelGetStarPosition(int* screen, int* position) { -/* TODO: define position as an int or using x,y coordinate system*/ - /* maps_getStartPosition(screen, position, int *b,tDirection *sentido,tDirection *sentido2); */ - return 0; } -int levelGetInformation(int *thisScreen, unsigned char* LRUDscreens, unsigned char* cornerScreens) { -/* TODO: define the format of cornerscreens */ - *thisScreen=sscreen; - memcpy(LRUDscreens,slevel+MAPS_BLOCK_OFFSET_LINK+(sscreen-1)*4,4); - return sscreen; -} + + + + + + + + + + + + + + + + + + + + + + + #ifdef OLD_MAP_SRC