diff --git a/Makefile b/Makefile index c2034a8..2a81a22 100644 --- a/Makefile +++ b/Makefile @@ -22,13 +22,13 @@ orange : orange.o purple : purple.o -main : main.o generator.o +main : main.o generator.o tools.o -$(BINARY) : orange.o purple.o main.o generator.o - $(CC) main.o generator.o orange.o purple.o -o $(BINARY) $(LIB) +$(BINARY) : orange.o purple.o main.o generator.o tools.o + $(CC) main.o generator.o orange.o purple.o tools.o -o $(BINARY) $(LIB) -anselme : orange.o purple.o main.o generator_anselme.o - $(CC) main.o generator_anselme.o orange.o purple.o -o $(BINARY) $(LIB) +anselme : orange.o purple.o main.o generator_anselme.o tools.o + $(CC) main.o generator_anselme.o orange.o purple.o tools.o -o $(BINARY) $(LIB) %.o: %.c $(CC) -o $@ -c $< $(FLAGS) diff --git a/main.c b/main.c index 56a290c..2f321a6 100755 --- a/main.c +++ b/main.c @@ -1,11 +1,18 @@ #include "main.h" #include "team.h" +#include "tools.h" #include "generator.h" #include #include #include #include +typedef struct{ + t_dude dude1; + t_dude dude2; + int attack; +} t_fight; + t_pixel** map; t_team* teams; SDL_Surface* img; @@ -17,7 +24,7 @@ int get_purple_size(); int get_orange_size(); void initWorld(){ - int i, j; + int i; // allocations printf("Allocating memory...\n"); @@ -68,7 +75,7 @@ void updateTeam(t_team team){ } } -t_pixel getTile(t_coord coord, int dir){ +t_coord getPos(t_coord coord, int dir){ switch(dir){ case NORTH : coord.x++; @@ -83,7 +90,7 @@ t_pixel getTile(t_coord coord, int dir){ coord.y--; break; } - return map[coord.x][coord.y]; + return coord; } void spawnDudes(){ @@ -111,7 +118,8 @@ void spawnDudes(){ } void handleAction(t_action action, t_dude dude){ - t_pixel target = getTile(dude.pos, action.dir); + t_coord target_pos = getPos(dude.pos, action.dir); + t_pixel target = map[target_pos.x][target_pos.y]; switch(action.type){ case MOVE : if( target.type != WALL @@ -120,12 +128,8 @@ void handleAction(t_action action, t_dude dude){ && target.type != IRON_ORE && target.type != DUDE && target.type != TREE - ){ - map[dude.pos.x][dude.pos.y] = dude.ground; - dude.ground = target; - target.type = DUDE; - target.data = &dude; - } + ) + add_move(&dude, target_pos, map); break; case ATTACK : if(target.type == DUDE) @@ -208,62 +212,6 @@ void generateImg(){ } } -Uint32 getpixel(SDL_Surface *surface, int x, int y) -{ - int bpp = surface->format->BytesPerPixel; - Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; - switch (bpp) { - case 1: - return *p; - - case 2: - return *(Uint16 *)p; - case 3: - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) - return p[0] << 16 | p[1] << 8 | p[2]; - else - return p[0] | p[1] << 8 | p[2] << 16; - case 4: - return *(Uint32 *)p; - - default: - return 0; - } -} - -void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) -{ - int bpp = surface->format->BytesPerPixel; - /* Here p is the address to the pixel we want to set */ - Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; - - switch(bpp) { - case 1: - *p = pixel; - break; - - case 2: - *(Uint16 *)p = pixel; - break; - - case 3: - if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { - p[0] = (pixel >> 16) & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = pixel & 0xff; - } else { - p[0] = pixel & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = (pixel >> 16) & 0xff; - } - break; - - case 4: - *(Uint32 *)p = pixel; - break; - } -} - void initSDL() { srand(time(NULL)); @@ -288,6 +236,8 @@ int MAIN( int argc, char** argv ) initWorld(); SDL_Flip(img); + printf("Launching simulation... press ESCAPE to stop.\n"); + while (!keystate[SDLK_ESCAPE] && !over){ temps = SDL_GetTicks(); SDL_PumpEvents(); @@ -295,6 +245,7 @@ int MAIN( int argc, char** argv ) //spawnDudes(); for(i=0; idude = dude; + move->dst = dst; + move->ok = 0; + if(map[dst.x][dst.y].type == DUDE) + occupiedMoves[nb_occupied++] = move; + else + clearMoves[nb_clear++] = move; +} + +void applyMove(t_move* move){ + t_pixel target = map[move->dst.x][move->dst.y]; + map[move->dude->pos.x][move->dude->pos.y] = move->dude->ground; + move->dude->ground = target; + target.type = DUDE; + target.data = move->dude; +} + +void resolve_moves(){ + int change = 1; + int i; + + // clear moves + while(nb_clear > 0){ + i = rand()%nb_clear; + if(map[clearMoves[i]->dst.x][clearMoves[i]->dst.y].type == DUDE){ + occupiedMoves[nb_occupied++] = clearMoves[i]; + }else{ + applyMove(clearMoves[i]); + } + clearMoves[i] = clearMoves[--nb_clear]; + } + + // occupied moves + while(change){ + change = 0; + for(i=0; idst.x][occupiedMoves[i]->dst.y].type != DUDE){ + change = 1; + applyMove(occupiedMoves[i]); + } + } + } + nb_occupied = 0; +} + +Uint32 getpixel(SDL_Surface *surface, int x, int y) +{ + int bpp = surface->format->BytesPerPixel; + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + switch (bpp) { + case 1: + return *p; + case 2: + return *(Uint16 *)p; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + return p[0] << 16 | p[1] << 8 | p[2]; + else + return p[0] | p[1] << 8 | p[2] << 16; + case 4: + return *(Uint32 *)p; + default: + return 0; + } +} + +void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) +{ + int bpp = surface->format->BytesPerPixel; + /* Here p is the address to the pixel we want to set */ + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + switch(bpp) { + case 1: + *p = pixel; + break; + case 2: + *(Uint16 *)p = pixel; + break; + case 3: + if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } else { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + case 4: + *(Uint32 *)p = pixel; + break; + } +} \ No newline at end of file diff --git a/tools.h b/tools.h new file mode 100644 index 0000000..3d9ba90 --- /dev/null +++ b/tools.h @@ -0,0 +1,16 @@ +#ifndef TOOLS_H +#define TOOLS_H + +#include +#include "main.h" +#include "team.h" + +void add_move(t_dude* dude, t_coord dst, t_pixel** the_map); + +void resolve_moves(); + +void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel); + +Uint32 getpixel(SDL_Surface *surface, int x, int y); + +#endif