From af2321fe7168a657abf54fd6b407751ff791b555 Mon Sep 17 00:00:00 2001 From: Anselme <anselme16@hotmail.fr> Date: Tue, 13 Jan 2015 23:35:48 +0100 Subject: [PATCH] debugged move action, and some other render problems --- generator.c | 2 +- generator.h | 2 +- generator_anselme.c | 4 +- main.c | 102 +++++++++++++++----------------------------- main.h | 9 +++- orange.c | 2 +- purple.c | 2 +- tools.c | 49 +++++++++++++++++---- tools.h | 4 +- 9 files changed, 91 insertions(+), 85 deletions(-) diff --git a/generator.c b/generator.c index 8948368..a672732 100644 --- a/generator.c +++ b/generator.c @@ -26,7 +26,7 @@ void create_epicenter(int x, int y, int type); void create_epicenter_random(int type); int generate(int x, int y); -void create_map(t_pixel** map, t_team* teams, int w, int h){ +void create_map(int w, int h){ int i,j; int type; diff --git a/generator.h b/generator.h index 0f762e4..e84b155 100644 --- a/generator.h +++ b/generator.h @@ -1,6 +1,6 @@ #ifndef GENERATOR_H #define GENERATOR_H -void create_map(t_pixel** map, t_team* teams, int width, int height); +void create_map(int width, int height); #endif \ No newline at end of file diff --git a/generator_anselme.c b/generator_anselme.c index 2ced43f..f59cb83 100644 --- a/generator_anselme.c +++ b/generator_anselme.c @@ -15,7 +15,7 @@ int max(int a, int b) return a > b ? a : b; } -void create_map(t_pixel** map, t_team* teams, int w, int h){ +void create_map(int w, int h){ int i,j, k; int r = (w/NB_TEAMS < h ? w/NB_TEAMS : h)/2; @@ -39,7 +39,7 @@ void create_map(t_pixel** map, t_team* teams, int w, int h){ if(d == 0){ map[i][j].type = SPAWN; map[i][j].data = malloc(sizeof(int)); - *(int*)(map[i][j].data) = k; + *((int*)(map[i][j].data)) = k; }else{ int l = (d-20)+(rand()%40); if(l > r+15){ diff --git a/main.c b/main.c index 2f321a6..bfbf17b 100755 --- a/main.c +++ b/main.c @@ -13,10 +13,6 @@ typedef struct{ int attack; } t_fight; -t_pixel** map; -t_team* teams; -SDL_Surface* img; - // temp code t_action purple_update(void* my_info, void* com_data, int my_id); t_action orange_update(void* my_info, void* com_data, int my_id); @@ -45,7 +41,7 @@ void initWorld(){ teams[i].dudes = malloc(sizeof(t_dude)*MAX_DUDES); teams[i].spawn.x = 0; teams[i].spawn.y = 0; - teams[i].spawn_food = 0; + teams[i].spawn_food = 10; teams[i].spawn_count = 0; } map = (t_pixel**)malloc(sizeof(t_pixel*)*WIDTH); @@ -54,7 +50,7 @@ void initWorld(){ // generate map printf("Generating map...\n"); - create_map(map, teams, WIDTH, HEIGHT); + create_map(WIDTH, HEIGHT); // create image from map printf("Creating image from map...\n"); @@ -69,26 +65,25 @@ void updateTeam(t_team team){ int i; t_action action; for(i=0; i<team.nb_dudes; i++){ - t_dude dude = team.dudes[i]; - action = team.update((void*)(dude.custom_data), (void*)(dude.com_data), i); - handleAction(action, dude); + action = team.update((void*)(team.dudes[i].custom_data), (void*)(team.dudes[i].com_data), i); + handleAction(action, team.dudes+i); } } t_coord getPos(t_coord coord, int dir){ switch(dir){ case NORTH : - coord.x++; - break; - case SOUTH : - coord.x--; - break; - case WEST : coord.y++; break; - case EAST : + case SOUTH : coord.y--; break; + case WEST : + coord.x++; + break; + case EAST : + coord.x--; + break; } return coord; } @@ -97,28 +92,27 @@ void spawnDudes(){ int i; t_dude new_dude; for(i=0; i<NB_TEAMS; i++){ - t_team team = teams[i]; - if(team.spawn_food) - team.spawn_count++; - if(team.spawn_count > 10 && map[team.spawn.x][team.spawn.y].type == SPAWN){ - team.spawn_food--; + if(teams[i].spawn_food > 0) + teams[i].spawn_count++; + if(teams[i].spawn_count > 10 && map[teams[i].spawn.x][teams[i].spawn.y].type == SPAWN){ + teams[i].spawn_food--; + teams[i].spawn_count = 0; - new_dude.pos = team.spawn; - new_dude.team = team.team; + new_dude.pos = teams[i].spawn; + new_dude.team = teams[i].team; new_dude.inventory = -1; - new_dude.ground.type = SPAWN; - new_dude.ground.data = NULL; - new_dude.custom_data = malloc(team.dude_size); - memset(new_dude.custom_data, 0, team.dude_size); + new_dude.ground = map[teams[i].spawn.x][teams[i].spawn.y]; + new_dude.custom_data = malloc(teams[i].dude_size); + memset(new_dude.custom_data, 0, teams[i].dude_size); new_dude.com_data = NULL; - team.dudes[team.nb_dudes++] = new_dude; + teams[i].dudes[teams[i].nb_dudes++] = new_dude; } } } -void handleAction(t_action action, t_dude dude){ - t_coord target_pos = getPos(dude.pos, action.dir); +void handleAction(t_action action, t_dude* dude){ + t_coord target_pos = getPos(dude->pos, action.dir); t_pixel target = map[target_pos.x][target_pos.y]; switch(action.type){ case MOVE : @@ -129,18 +123,21 @@ void handleAction(t_action action, t_dude dude){ && target.type != DUDE && target.type != TREE ) - add_move(&dude, target_pos, map); + add_move(dude, target_pos); break; case ATTACK : - if(target.type == DUDE) - addFight(dude, *((t_dude*)(target.data))); + printf("forbidden action\n"); + //if(target.type == DUDE) + // addFight(dude, *((t_dude*)(target.data))); break; case PICK : + printf("forbidden action\n"); // if target is resource : // put target in inventory // put grass on target break; case PUT : + printf("forbidden action\n"); // if target is grass or road or corpse // target = inventory // inventory = NULL @@ -148,6 +145,7 @@ void handleAction(t_action action, t_dude dude){ // spawn.food ++ break; case WORK : + printf("forbidden action\n"); // switch target // case rock -> stone // case berries -> food @@ -162,9 +160,11 @@ void handleAction(t_action action, t_dude dude){ // case corpse -> grass break; case WAIT : + printf("forbidden action\n"); // ... break; case COMMUNICATE : + printf("forbidden action\n"); // if target is sign -> set sign message // if target is dude -> sent message to dude break; @@ -173,41 +173,9 @@ void handleAction(t_action action, t_dude dude){ void generateImg(){ int i, j; - Uint32 color; - t_dude* dudeData; - int* spawnData; for(i=0; i<WIDTH; i++){ for(j=0; j<HEIGHT; j++){ - switch(map[i][j].type){ - case BEDROCK : color = 0x101020; break; - case GRASS : color = 0x004400; break; - case ROCK : color = 0x8C8C8C; break; - case IRON_ORE : color = 0x917B61; break; - case TREE : color = 0x000F0F; break; - case BERRIES : color = 0x6B87C7; break; - case FOOD : color = 0xFF7A7A; break; - case WOOD : color = 0x634A22; break; - case STONE : color = 0x999999; break; - case IRON : color = 0x555555; break; - case CORPSE : color = 0xFF0000; break; - - case DUDE : - dudeData = map[i][j].data; - color = dudeData->team == ORANGE ? 0xFF8000 : 0x9900FF; - break; - case SPAWN : - spawnData = (int*)map[i][j].data; - color = *spawnData == ORANGE ? 0xFFC080 : 0xD596FF; - break; - - case WALL : color = 0xE6B2A1; break; - case ROAD : color = 0xEDB287; break; - case SWORD : color = 0xEBEBEB; break; - case SIGN : color = 0xA37A50; break; - default : color = 0x0000FF; break; // bleu absolu = bug - } - putpixel(img, i, j, color); - //img->pixels[j * WIDTH + i] = color; + putpixel(img, i, j, getColor(map[i][j])); } } } @@ -242,7 +210,7 @@ int MAIN( int argc, char** argv ) temps = SDL_GetTicks(); SDL_PumpEvents(); int i; - //spawnDudes(); + spawnDudes(); for(i=0; i<NB_TEAMS; i++) updateTeam(teams[i]); resolve_moves(); diff --git a/main.h b/main.h index 268a021..0621a05 100644 --- a/main.h +++ b/main.h @@ -12,7 +12,7 @@ #define OS "Linux" #endif -#define MAX_FPS 60 +#define MAX_FPS 4 #define MAX_DUDES 50 #define WIDTH 400 #define HEIGHT 250 @@ -49,6 +49,11 @@ typedef struct{ void generateImg(); -void handleAction(t_action action, t_dude dude); +void handleAction(t_action action, t_dude* dude); + +// variables globales +t_pixel** map; +t_team* teams; +SDL_Surface* img; #endif \ No newline at end of file diff --git a/orange.c b/orange.c index 68d39f2..a2ff514 100644 --- a/orange.c +++ b/orange.c @@ -16,7 +16,7 @@ t_action orange_update(void* my_info, void* com_data, int my_id){ t_action action; action.type = MOVE; - action.dir = SOUTH; + action.dir = rand()%4; action.data = NULL; return action; diff --git a/purple.c b/purple.c index 50b86a8..8461c15 100644 --- a/purple.c +++ b/purple.c @@ -16,7 +16,7 @@ t_action purple_update(void* my_info, void* com_data, int my_id){ t_action action; action.type = MOVE; - action.dir = NORTH; + action.dir = rand()%4; action.data = NULL; return action; diff --git a/tools.c b/tools.c index 23859ab..f8282be 100644 --- a/tools.c +++ b/tools.c @@ -10,10 +10,8 @@ t_move* clearMoves[MAX_DUDES*NB_TEAMS]; int nb_clear = 0; t_move* occupiedMoves[MAX_DUDES*NB_TEAMS]; int nb_occupied = 0; -t_pixel** map; -void add_move(t_dude* dude, t_coord dst, t_pixel** the_map){ - map = the_map; +void add_move(t_dude* dude, t_coord dst){ t_move* move = malloc(sizeof(t_move)); move->dude = dude; move->dst = dst; @@ -26,16 +24,19 @@ void add_move(t_dude* dude, t_coord dst, t_pixel** the_map){ 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; + map[move->dude->pos.x][move->dude->pos.y] = move->dude->ground; // set the ground where the dude was + move->dude->ground = target; // set the ground of the dude to where he goes + map[move->dst.x][move->dst.y].type = DUDE; // set the target tile with the dude + map[move->dst.x][move->dst.y].data = move->dude; + putpixel(img, move->dst.x, move->dst.y, getColor(map[move->dst.x][move->dst.y])); + putpixel(img, move->dude->pos.x, move->dude->pos.y, getColor(map[move->dude->pos.x][move->dude->pos.y])); + move->dude->pos.x = move->dst.x; + move->dude->pos.y = move->dst.y; } void resolve_moves(){ int change = 1; int i; - // clear moves while(nb_clear > 0){ i = rand()%nb_clear; @@ -46,7 +47,6 @@ void resolve_moves(){ } clearMoves[i] = clearMoves[--nb_clear]; } - // occupied moves while(change){ change = 0; @@ -60,6 +60,37 @@ void resolve_moves(){ nb_occupied = 0; } +Uint32 getColor(t_pixel pixel){ + t_dude* dudeData; + int* spawnData; + switch(pixel.type){ + case BEDROCK : return 0x101020; + case GRASS : return 0x719678; + case ROCK : return 0x8C8C8C; + case IRON_ORE : return 0x917B61; + case TREE : return 0x003800; + case BERRIES : return 0x4D6394; + case FOOD : return 0xFF7A7A; + case WOOD : return 0x634A22; + case STONE : return 0x454545; + case IRON : return 0x4A4036; + case CORPSE : return 0xFF0000; + case DUDE : + dudeData = pixel.data; + return dudeData->team == ORANGE ? 0x7A4100 : 0x9900FF; + case SPAWN : + spawnData = (int*)(pixel.data); + if(spawnData == NULL) printf("WTF\n"); + return *spawnData == ORANGE ? 0xFFC080 : 0xD596FF; + case WALL : return 0xE6B2A1; + case ROAD : return 0xEDB287; + case SWORD : return 0xEBEBEB; + case SIGN : return 0xA37A50; + default : return 0x0000FF; // bleu absolu = bug + } + +} + Uint32 getpixel(SDL_Surface *surface, int x, int y) { int bpp = surface->format->BytesPerPixel; diff --git a/tools.h b/tools.h index 3d9ba90..f6ad9f6 100644 --- a/tools.h +++ b/tools.h @@ -5,10 +5,12 @@ #include "main.h" #include "team.h" -void add_move(t_dude* dude, t_coord dst, t_pixel** the_map); +void add_move(t_dude* dude, t_coord dst); void resolve_moves(); +Uint32 getColor(t_pixel pixel); + void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel); Uint32 getpixel(SDL_Surface *surface, int x, int y);