#include #include #include #include "main.h" #include "arena.h" #include "list.h" #include "tux.h" #include "shot.h" #include "item.h" #include "myTimer.h" #include "modules.h" #ifndef PUBLIC_SERVER #include "screen_world.h" #include "layer.h" #endif static arena_t *currentArena; void setCurrentArena(arena_t *p) { currentArena = p; } arena_t* getCurrentArena() { return currentArena; } arena_t* newArena(int w, int h) { arena_t *new; new = malloc( sizeof(arena_t) ); #ifndef PUBLIC_SERVER new->background = NULL; strcpy(new->music, ""); #endif new->w = w; new->h = h; new->listTimer = newList(); //new->listTux = newList(); //new->listItem = newList(); new->spaceTux = newSpace(w, h, 320, 240, getStatusTux, setStatusTux); new->spaceItem = newSpace(w, h, 320, 240, getStatusItem, setStatusItem); new->listShot = newList(); return new; } int conflictSpace(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2) { return (x1spaceTux, x, y, w, h) )return 0; if( isConflictWithListShot(arena->listShot, x, y, w, h) )return 0; if( isConflictWithObjectFromSpace(arena->spaceItem, x, y, w, h) )return 0; if( isConflictModule(x, y, w, h) )return 0; //if( isConflictWithListWall(arena->listWall, x, y, w, h) )return 0; //if( isConflictWithListTeleport(arena->listTeleport, x, y, w, h) )return 0; //if( isConflictWithListPipe(arena->listPipe, x, y, w, h) )return 0; return 1; } void findFreeSpace(arena_t *arena, int *x, int *y, int w, int h) { int z_x; int z_y; assert( x != NULL ); assert( y != NULL ); do{ z_x = random() % WINDOW_SIZE_X;//arena->w; z_y = random() % WINDOW_SIZE_Y;//arena->h; }while( isFreeSpace(arena, z_x, z_y ,w ,h) == 0 ); *x = z_x; *y = z_y; } void getCenterScreen(int *screen_x, int *screen_y, int x, int y) { arena_t *arena; arena = getCurrentArena(); *screen_x = x - WINDOW_SIZE_X/2; *screen_y = y - WINDOW_SIZE_Y/2; if( *screen_x < 0 ) { *screen_x = 0; } if( *screen_y < 0 ) { *screen_y = 0; } if( *screen_x + WINDOW_SIZE_X >= arena->w ) { *screen_x = arena->w - WINDOW_SIZE_X; } if( *screen_y + WINDOW_SIZE_Y >= arena->h ) { *screen_y = arena->h - WINDOW_SIZE_Y; } } #ifndef PUBLIC_SERVER void drawArena(arena_t *arena) { int screen_x, screen_y; tux_t *tux = NULL; int i, j; tux = getControlTux(TUX_CONTROL_KEYBOARD_RIGHT); if( tux == NULL ) { return; } /* screen_x = tux->x - WINDOW_SIZE_X/2; screen_y = tux->y - WINDOW_SIZE_Y/2; */ getCenterScreen(&screen_x, &screen_y, tux->x, tux->y); for( i = screen_y/arena->background->h ; i <= screen_y/arena->background->h + WINDOW_SIZE_Y/arena->background->h ; i++ ) { for( j = screen_x/arena->background->w ; j <= screen_x/arena->background->w + WINDOW_SIZE_X/arena->background->w ; j++ ) { addLayer(arena->background, j * arena->background->w, i * arena->background->h, 0, 0, arena->background->w, arena->background->h, -100); } } listDoEmpty(listHelp); getObjectFromSpace(arena->spaceTux, screen_x, screen_y, WINDOW_SIZE_X, WINDOW_SIZE_Y, listHelp); drawListTux(listHelp); listDoEmpty(listHelp); getObjectFromSpace(arena->spaceItem, screen_x, screen_y, WINDOW_SIZE_X, WINDOW_SIZE_Y, listHelp); drawListItem(listHelp); printSpace(arena->spaceItem); //drawListTux(arena->listTux); //drawListWall(arena->listWall); //drawListTeleport(arena->listTeleport); //drawListPipe(arena->listPipe); drawListShot(arena->listShot); //drawListItem(arena->listItem); drawModule(screen_x, screen_y, WINDOW_SIZE_X, WINDOW_SIZE_Y); /* my_time_t t; t = getMyTime(); */ if( tux == NULL ) { drawLayerCenter(WINDOW_SIZE_X/2, WINDOW_SIZE_Y/2); } else { drawLayerCenter(tux->x, tux->y); } // printf("time = %d\n", getMyTime() - t ); } #endif void eventArena(arena_t *arena) { int i; //eventConflictTuxWithTeleport(arena->listTux, arena->listTeleport); //eventConflictTuxWithShot(arena); for( i = 0 ; i < 8 ; i++) { eventMoveListShot(arena->listShot); checkShotIsInTuxScreen(arena); //eventConflictShotWithWall(arena->listWall, arena->listShot); //eventConflictShotWithTeleport(arena->listTeleport, arena->listShot); //eventConflictShotWithPipe(arena->listPipe, arena->listShot); eventConflictShotWithItem(arena); eventConflictTuxWithShot(arena); eventModule(); } eventListItem(arena->spaceItem); eventListTux(arena->spaceTux->list); eventTimer(arena->listTimer); } void destroyArena(arena_t *p) { destroySpace(p->spaceTux, destroyTux); destroySpace(p->spaceItem, destroyItem); destroyListItem(p->listShot, destroyShot); destroyTimer(p->listTimer); free(p); }