implemented pick/put test algorith for purple, but it is bugged
This commit is contained in:
parent
b3a6964493
commit
0bc1604747
83
main.c
83
main.c
@ -20,6 +20,8 @@ t_action orange_update(void* my_info, void* com_data, int my_id, int success);
|
|||||||
int get_purple_size();
|
int get_purple_size();
|
||||||
int get_orange_size();
|
int get_orange_size();
|
||||||
|
|
||||||
|
t_dude* current_dude;
|
||||||
|
|
||||||
void initWorld(int width, int height){
|
void initWorld(int width, int height){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -66,6 +68,7 @@ void updateTeam(t_team team){
|
|||||||
int i;
|
int i;
|
||||||
t_action action;
|
t_action action;
|
||||||
for(i=0; i<team.nb_dudes; i++){
|
for(i=0; i<team.nb_dudes; i++){
|
||||||
|
current_dude = team.dudes + i;
|
||||||
action = team.update((void*)(team.dudes[i].custom_data), (void*)(team.dudes[i].com_data), i, team.dudes[i].success);
|
action = team.update((void*)(team.dudes[i].custom_data), (void*)(team.dudes[i].com_data), i, team.dudes[i].success);
|
||||||
handleAction(action, team.dudes+i);
|
handleAction(action, team.dudes+i);
|
||||||
}
|
}
|
||||||
@ -89,6 +92,11 @@ t_coord getPos(t_coord coord, int dir){
|
|||||||
return coord;
|
return coord;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getNear(int dir){
|
||||||
|
t_coord coord = getPos(current_dude->pos, dir);
|
||||||
|
return map[coord.x][coord.y].type;
|
||||||
|
}
|
||||||
|
|
||||||
void spawnDudes(){
|
void spawnDudes(){
|
||||||
int i;
|
int i;
|
||||||
t_dude new_dude;
|
t_dude new_dude;
|
||||||
@ -144,12 +152,13 @@ void handleAction(t_action action, t_dude* dude){
|
|||||||
map[target_pos.x][target_pos.y].type = GRASS;
|
map[target_pos.x][target_pos.y].type = GRASS;
|
||||||
map[target_pos.x][target_pos.y].data = NULL;
|
map[target_pos.x][target_pos.y].data = NULL;
|
||||||
}
|
}
|
||||||
|
putpixel(img, target_pos.x, target_pos.y, getColor(map[target_pos.x][target_pos.y]));
|
||||||
}else
|
}else
|
||||||
dude->success = 0;
|
dude->success = 0;
|
||||||
break;
|
break;
|
||||||
case PUT :
|
case PUT :
|
||||||
if(dude->inventory != -1 && (target.type == GRASS || target.type == dude->inventory)){
|
if(dude->inventory != -1 && (target.type == GRASS || target.type == dude->inventory)){
|
||||||
if(target.type == GRASS){
|
if(target.type == GRASS || target.type == MARK){
|
||||||
map[target_pos.x][target_pos.y].type = dude->inventory;
|
map[target_pos.x][target_pos.y].type = dude->inventory;
|
||||||
nb_res = malloc(sizeof(int));
|
nb_res = malloc(sizeof(int));
|
||||||
*nb_res = 1;
|
*nb_res = 1;
|
||||||
@ -159,6 +168,7 @@ void handleAction(t_action action, t_dude* dude){
|
|||||||
(*nb_res)++;
|
(*nb_res)++;
|
||||||
}
|
}
|
||||||
dude->inventory = -1;
|
dude->inventory = -1;
|
||||||
|
putpixel(img, target_pos.x, target_pos.y, getColor(map[target_pos.x][target_pos.y]));
|
||||||
}else
|
}else
|
||||||
dude->success = 0;
|
dude->success = 0;
|
||||||
break;
|
break;
|
||||||
@ -190,20 +200,30 @@ void handleAction(t_action action, t_dude* dude){
|
|||||||
map[target_pos.x][target_pos.y].data = nb_res;
|
map[target_pos.x][target_pos.y].data = nb_res;
|
||||||
break;
|
break;
|
||||||
case GRASS :
|
case GRASS :
|
||||||
map[target_pos.x][target_pos.y].type = ROAD;
|
map[target_pos.x][target_pos.y].type = MARK;
|
||||||
map[target_pos.x][target_pos.y].data = NULL;
|
map[target_pos.x][target_pos.y].data = NULL;
|
||||||
break;
|
break;
|
||||||
case ROAD :
|
case MARK :
|
||||||
map[target_pos.x][target_pos.y].type = GRASS;
|
map[target_pos.x][target_pos.y].type = GRASS;
|
||||||
map[target_pos.x][target_pos.y].data = NULL;
|
map[target_pos.x][target_pos.y].data = NULL;
|
||||||
break;
|
break;
|
||||||
|
case WOOD :
|
||||||
|
nb_res = target.data;
|
||||||
|
if(*nb_res != 1)
|
||||||
|
dude->success = 0;
|
||||||
|
else{
|
||||||
|
free(target.data);
|
||||||
|
map[target_pos.x][target_pos.y].type = WALL;
|
||||||
|
map[target_pos.x][target_pos.y].data = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case STONE :
|
case STONE :
|
||||||
nb_res = target.data;
|
nb_res = target.data;
|
||||||
if(*nb_res != 1)
|
if(*nb_res != 1)
|
||||||
dude->success = 0;
|
dude->success = 0;
|
||||||
else{
|
else{
|
||||||
free(target.data);
|
free(target.data);
|
||||||
map[target_pos.x][target_pos.y].type = WALL;
|
map[target_pos.x][target_pos.y].type = ROAD;
|
||||||
map[target_pos.x][target_pos.y].data = NULL;
|
map[target_pos.x][target_pos.y].data = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -214,12 +234,12 @@ void handleAction(t_action action, t_dude* dude){
|
|||||||
else
|
else
|
||||||
map[target_pos.x][target_pos.y].type = SWORD;
|
map[target_pos.x][target_pos.y].type = SWORD;
|
||||||
break;
|
break;
|
||||||
// TODO : case wood -> sign
|
|
||||||
// TODO : case sign -> wood
|
|
||||||
default :
|
default :
|
||||||
dude->success = 0;
|
dude->success = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if(dude->success)
|
||||||
|
putpixel(img, target_pos.x, target_pos.y, getColor(map[target_pos.x][target_pos.y]));
|
||||||
break;
|
break;
|
||||||
case WAIT :
|
case WAIT :
|
||||||
dude->success = 1;
|
dude->success = 1;
|
||||||
@ -265,8 +285,8 @@ void render(SDL_Surface* screen, int x_offset, int y_offset, int zoom_level){
|
|||||||
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
|
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
|
||||||
for(i=0; i<screen->w; i++){
|
for(i=0; i<screen->w; i++){
|
||||||
for(j=0; j<screen->h; j++){
|
for(j=0; j<screen->h; j++){
|
||||||
x = i/zoom_level + x_offset;
|
x = (i - img->w/2)/zoom_level + x_offset;
|
||||||
y = j/zoom_level + y_offset;
|
y = (j - img->h/2)/zoom_level + y_offset;
|
||||||
if(x >= 0 && x < img->w && y >= 0 && y < img->h)
|
if(x >= 0 && x < img->w && y >= 0 && y < img->h)
|
||||||
putpixel(screen, i, j, getpixel(img, x, y));
|
putpixel(screen, i, j, getpixel(img, x, y));
|
||||||
}
|
}
|
||||||
@ -283,7 +303,10 @@ int MAIN
|
|||||||
int y_offset = 0;
|
int y_offset = 0;
|
||||||
int zoom_level = 1;
|
int zoom_level = 1;
|
||||||
int over = 0;
|
int over = 0;
|
||||||
|
int time = 0;
|
||||||
int wait_time = 100;
|
int wait_time = 100;
|
||||||
|
int new_time = 0;
|
||||||
|
int remaining_time = -1;
|
||||||
int fullscreen = 0;
|
int fullscreen = 0;
|
||||||
int width = DEFAULT_WIDTH;
|
int width = DEFAULT_WIDTH;
|
||||||
int height = DEFAULT_HEIGHT;
|
int height = DEFAULT_HEIGHT;
|
||||||
@ -296,9 +319,6 @@ int MAIN
|
|||||||
case 'f' :
|
case 'f' :
|
||||||
fullscreen = 1;
|
fullscreen = 1;
|
||||||
break;
|
break;
|
||||||
case 't' :
|
|
||||||
wait_time = atoi(argv[0]+2);
|
|
||||||
break;
|
|
||||||
case 'w' :
|
case 'w' :
|
||||||
width = atoi(argv[0]+2);
|
width = atoi(argv[0]+2);
|
||||||
break;
|
break;
|
||||||
@ -317,8 +337,11 @@ int MAIN
|
|||||||
initWorld(width, height);
|
initWorld(width, height);
|
||||||
SDL_Flip(img);
|
SDL_Flip(img);
|
||||||
|
|
||||||
|
x_offset = width/2;
|
||||||
|
y_offset = height/2;
|
||||||
printf("Launching simulation...\n");
|
printf("Launching simulation...\n");
|
||||||
|
|
||||||
|
time = SDL_GetTicks();
|
||||||
while (!over){
|
while (!over){
|
||||||
while(SDL_PollEvent(&event)){
|
while(SDL_PollEvent(&event)){
|
||||||
switch (event.type){
|
switch (event.type){
|
||||||
@ -327,22 +350,29 @@ int MAIN
|
|||||||
case SDLK_ESCAPE :
|
case SDLK_ESCAPE :
|
||||||
over = 1;
|
over = 1;
|
||||||
break;
|
break;
|
||||||
|
case SDLK_w :
|
||||||
|
y_offset -= 5;
|
||||||
|
break;
|
||||||
|
case SDLK_s :
|
||||||
|
y_offset += 5;
|
||||||
|
break;
|
||||||
|
case SDLK_a :
|
||||||
|
x_offset -= 5;
|
||||||
|
break;
|
||||||
|
case SDLK_d :
|
||||||
|
x_offset += 5;
|
||||||
|
break;
|
||||||
case SDLK_UP :
|
case SDLK_UP :
|
||||||
y_offset--;
|
wait_time *= 2;
|
||||||
break;
|
break;
|
||||||
case SDLK_DOWN :
|
case SDLK_DOWN :
|
||||||
y_offset++;
|
if(wait_time > 2)
|
||||||
|
wait_time /= 2;
|
||||||
break;
|
break;
|
||||||
case SDLK_LEFT :
|
case SDLK_LEFT :
|
||||||
x_offset--;
|
|
||||||
break;
|
|
||||||
case SDLK_RIGHT :
|
|
||||||
x_offset++;
|
|
||||||
break;
|
|
||||||
case SDLK_PAGEUP :
|
|
||||||
zoom_level++;
|
zoom_level++;
|
||||||
break;
|
break;
|
||||||
case SDLK_PAGEDOWN :
|
case SDLK_RIGHT :
|
||||||
zoom_level--;
|
zoom_level--;
|
||||||
if(zoom_level < 1)
|
if(zoom_level < 1)
|
||||||
zoom_level = 1;
|
zoom_level = 1;
|
||||||
@ -354,6 +384,10 @@ int MAIN
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SDL_MOUSEMOTION:
|
||||||
|
x_offset += event.motion.xrel;
|
||||||
|
y_offset += event.motion.yrel;
|
||||||
|
break;
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
over = 1;
|
over = 1;
|
||||||
break;
|
break;
|
||||||
@ -362,16 +396,21 @@ int MAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!paused){
|
new_time = SDL_GetTicks();
|
||||||
|
remaining_time -= new_time - time;
|
||||||
|
time = new_time;
|
||||||
|
if(remaining_time < 0 && !paused){
|
||||||
spawnDudes();
|
spawnDudes();
|
||||||
for(i=0; i<NB_TEAMS; i++)
|
for(i=0; i<NB_TEAMS; i++)
|
||||||
updateTeam(teams[i]);
|
updateTeam(teams[i]);
|
||||||
resolve_moves();
|
resolve_moves();
|
||||||
|
|
||||||
|
remaining_time = wait_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
render(screen, x_offset, y_offset, zoom_level);
|
render(screen, x_offset, y_offset, zoom_level);
|
||||||
|
|
||||||
SDL_Delay(wait_time);
|
SDL_Delay(30);
|
||||||
SDL_Flip(screen);
|
SDL_Flip(screen);
|
||||||
}
|
}
|
||||||
SDL_FreeSurface(screen);
|
SDL_FreeSurface(screen);
|
||||||
|
53
purple.c
53
purple.c
@ -4,21 +4,68 @@
|
|||||||
// Hello World
|
// Hello World
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
int plop; // custom info
|
t_coord pos;
|
||||||
|
int try;
|
||||||
|
int brings_food;
|
||||||
} t_data;
|
} t_data;
|
||||||
|
|
||||||
int get_purple_size(){
|
int get_purple_size(){
|
||||||
return sizeof(t_data);
|
return sizeof(t_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t_coord getPos(t_coord coord, int dir);
|
||||||
|
|
||||||
t_action purple_update(void* my_info, void* com_data, int my_id, int success){
|
t_action purple_update(void* my_info, void* com_data, int my_id, int success){
|
||||||
t_data* data = (t_data*)my_info;
|
t_data* data = (t_data*)my_info;
|
||||||
t_action action;
|
t_action action;
|
||||||
int i;
|
int i, type;
|
||||||
|
|
||||||
|
if(data->try && success)
|
||||||
|
data->brings_food = 1;
|
||||||
|
data->try = 0;
|
||||||
|
|
||||||
|
if(data->brings_food){
|
||||||
|
if(data->pos.x == 0)
|
||||||
|
action.dir = WEST;
|
||||||
|
else{
|
||||||
|
if(data->pos.y == 0){
|
||||||
|
if(data->pos.x > 0)
|
||||||
|
action.dir = EAST;
|
||||||
|
else
|
||||||
|
action.dir = WEST;
|
||||||
|
if(data->pos.x == -1 || data->pos.x == 1){
|
||||||
|
data->brings_food = 0;
|
||||||
|
action.type = PUT;
|
||||||
|
action.data = NULL;
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
action.dir = data->pos.y > 0 ? SOUTH : NORTH;
|
||||||
|
}
|
||||||
|
action.type = MOVE;
|
||||||
|
action.data = NULL;
|
||||||
|
data->pos = getPos(data->pos, action.dir);
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
type = getNear(i);
|
||||||
|
if(type == BERRIES || type == TREE || type == IRON_ORE || type == ROCK){
|
||||||
|
action.type = WORK;
|
||||||
|
action.dir = i;
|
||||||
|
action.data = NULL;
|
||||||
|
return action;
|
||||||
|
}else if(type == FOOD){
|
||||||
|
action.type = PICK;
|
||||||
|
action.dir = i;
|
||||||
|
action.data = NULL;
|
||||||
|
data->try = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
action.type = MOVE;
|
action.type = MOVE;
|
||||||
action.dir = rand()%4;
|
action.dir = rand()%4;
|
||||||
action.data = NULL;
|
action.data = NULL;
|
||||||
|
data->pos = getPos(data->pos, action.dir);
|
||||||
return action;
|
return action;
|
||||||
}
|
}
|
2
team.h
2
team.h
@ -11,7 +11,7 @@ enum{
|
|||||||
BEDROCK, GRASS, TREE, BERRIES, ROCK, IRON_ORE, // nature
|
BEDROCK, GRASS, TREE, BERRIES, ROCK, IRON_ORE, // nature
|
||||||
FOOD, WOOD, STONE, IRON, SWORD, // resources
|
FOOD, WOOD, STONE, IRON, SWORD, // resources
|
||||||
DUDE, // humans
|
DUDE, // humans
|
||||||
SPAWN, WALL, ROAD, SIGN // buildings
|
SPAWN, WALL, ROAD, MARK, SIGN // buildings
|
||||||
};
|
};
|
||||||
|
|
||||||
// Action types
|
// Action types
|
||||||
|
Loading…
x
Reference in New Issue
Block a user