implemented most of missing features, debugging is still in progress

This commit is contained in:
Anselme 2015-01-20 00:31:00 +01:00
parent f69fece27a
commit 5e3bb43576
4 changed files with 56 additions and 19 deletions

55
main.c
View File

@ -52,7 +52,6 @@ void initWorld(int width, int height){
void updateTeam(t_team team){ void updateTeam(t_team team){
int i; int i;
t_action action;
for(i=0; i<team.nb_dudes; i++){ for(i=0; i<team.nb_dudes; i++){
team.dudes[i].action = team.update((void*)(team.dudes[i].custom_data), (void*)(team.dudes[i].com_data), team.dudes[i].success); team.dudes[i].action = team.update((void*)(team.dudes[i].custom_data), (void*)(team.dudes[i].com_data), team.dudes[i].success);
@ -127,6 +126,7 @@ void spawnDudes(){
new_dude.team = teams[i].team; new_dude.team = teams[i].team;
new_dude.inventory = -1; new_dude.inventory = -1;
new_dude.success = 1; new_dude.success = 1;
new_dude.dead = 0;
new_dude.ground = map[teams[i].spawn.x][teams[i].spawn.y]; new_dude.ground = map[teams[i].spawn.x][teams[i].spawn.y];
new_dude.custom_data = malloc(DUDE_MEMORY); new_dude.custom_data = malloc(DUDE_MEMORY);
memset(new_dude.custom_data, 0, DUDE_MEMORY); memset(new_dude.custom_data, 0, DUDE_MEMORY);
@ -138,9 +138,9 @@ void spawnDudes(){
} }
void handleAction(t_dude* dude){ void handleAction(t_dude* dude){
t_action action = dude->action;
t_coord target_pos = getPos(dude->pos, action.dir); t_coord target_pos = getPos(dude->pos, action.dir);
t_pixel target = map[target_pos.x][target_pos.y]; t_pixel target = map[target_pos.x][target_pos.y];
t_action action = dude->action;
int* nb_res; int* nb_res;
if(dude->com_data != NULL){ if(dude->com_data != NULL){
free(dude->com_data); free(dude->com_data);
@ -159,9 +159,28 @@ void handleAction(t_dude* dude){
add_move(dude, target_pos); add_move(dude, target_pos);
break; break;
case ATTACK : case ATTACK :
printf("forbidden action\n"); // TODO : implement that dude->success = 0;
//if(target.type == DUDE) if( target.type == DUDE
// addFight(dude, *((t_dude*)(target.data))); || target.type == SPAWN
|| target.type == WALL
|| target.type == LIBRARY
|| target.type == ROAD
){
dude->success = 1;
if(target.type == DUDE)
add_fight(dude, target_pos);
else{
if(target.type == SPAWN){
nb_res = target.data;
teams[*nb_res].spawn_food = 0;
teams[*nb_res].spawn_count = 0;
}
if(target.data != NULL)
free(target.data);
map[target_pos.x][target_pos.y].type = GRASS;
map[target_pos.x][target_pos.y].data = NULL;
}
}
break; break;
case PICK : case PICK :
nb_res = target.data; nb_res = target.data;
@ -281,19 +300,27 @@ void handleAction(t_dude* dude){
break; break;
case COMMUNICATE : case COMMUNICATE :
switch(target.type){ switch(target.type){
// TODO : conflict possible if 2 dudes talk to the same dude // TODO : conflicts are not handled in a fair way
case DUDE : case DUDE :
action.com_data.flag = (action.dir+2)%4; action.com_data.flag = (action.dir+2)%4;
dude->com_data = malloc(sizeof(t_com)); if(dude->com_data == NULL){
*(dude->com_data) = action.com_data; dude->com_data = malloc(sizeof(t_com));
dude->success = 1; *(dude->com_data) = action.com_data;
dude->success = 1;
}else
dude->success = 0;
break; break;
case LIBRARY : case LIBRARY :
if(action.com_data.flag & READ){ if(action.com_data.flag & READ){
action.com_data.flag = action.dir; if(dude->com_data == NULL){
dude->com_data = malloc(sizeof(t_com)); action.com_data.flag = action.dir;
*(dude->com_data) = action.com_data; dude->com_data = malloc(sizeof(t_com));
memcpy(dude->com_data + sizeof(int), target.data + (action.com_data.flag | 3), 32); *(dude->com_data) = action.com_data;
memcpy(dude->com_data + sizeof(int), target.data + (action.com_data.flag | 3), 32);
}else{
dude->success = 0;
break;
}
}else{ }else{
memcpy(target.data + action.com_data.flag, action.com_data.data, 32); memcpy(target.data + action.com_data.flag, action.com_data.data, 32);
} }
@ -477,7 +504,7 @@ int MAIN
spawnDudes(); spawnDudes();
for(i=0; i<NB_TEAMS; i++) for(i=0; i<NB_TEAMS; i++)
updateTeam(teams[i]); updateTeam(teams[i]);
resolve_fights(); // resolve_fights(); // TODO : debugging
resolve_moves(); resolve_moves();
remaining_time = wait_time; remaining_time = wait_time;

3
main.h
View File

@ -35,6 +35,7 @@ typedef struct{
int team; int team;
int inventory; int inventory;
int success; int success;
int dead;
t_pixel ground; t_pixel ground;
t_action action; t_action action;
void* custom_data; void* custom_data;
@ -53,7 +54,7 @@ typedef struct{
void generateImg(); void generateImg();
void handleAction(t_action action, t_dude* dude); void handleAction(t_dude* dude);
// variables globales // variables globales
t_pixel** map; t_pixel** map;

2
team.h
View File

@ -34,7 +34,7 @@ typedef struct{
enum{ 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, DEAD_DUDE // humans DUDE, DEAD_DUDE, // humans
SPAWN, WALL, ROAD, MARK, LIBRARY // buildings SPAWN, WALL, ROAD, MARK, LIBRARY // buildings
}; };

15
tools.c
View File

@ -61,7 +61,8 @@ void add_fight(t_dude* dude, t_coord dst){
void applyMove(t_move* move){ void applyMove(t_move* move){
t_pixel target = map[move->dst.x][move->dst.y]; t_pixel target = map[move->dst.x][move->dst.y];
if( target.type == WALL if( move->dude->dead
|| target.type == WALL
|| target.type == ROCK || target.type == ROCK
|| target.type == BEDROCK || target.type == BEDROCK
|| target.type == IRON_ORE || target.type == IRON_ORE
@ -83,13 +84,21 @@ void applyMove(t_move* move){
} }
void resolve_fights(){ void resolve_fights(){
int i; int i, j;
int defense = 0; int defense = 0;
for(i=0; i<nb_fight; i++){ for(i=0; i<nb_fight; i++){
int type = fights[i]->dude->action.type; int type = fights[i]->dude->action.type;
defense = (type == MOVE || type == ATTACK)*(1 + 3*(fights[i]->dude->inventory == SWORD)); defense = (type == MOVE || type == ATTACK)*(1 + 3*(fights[i]->dude->inventory == SWORD));
if((defense*100)/(defense + fights[i]->dmg) < fights[i]->proba){ if((defense*100)/(defense + fights[i]->dmg) < fights[i]->proba){
// perdu t_dude* target = fights[i]->target;
t_team team = teams[target->team];
for(j=0; j<team.nb_dudes; j++){
if(team.dudes + j == target){
team.dudes[j] = team.dudes[--team.nb_dudes];
map[target->pos.x][target->pos.y].type = DEAD_DUDE;
break;
}
}
} }
free(fights[i]); free(fights[i]);
} }