diff --git a/main.c b/main.c index edac239..d27de08 100755 --- a/main.c +++ b/main.c @@ -8,12 +8,6 @@ #include #include -typedef struct{ - t_dude dude1; - t_dude dude2; - int attack; -} t_fight; - // temp code t_action purple_update(void* my_info, void* com_data, int success); t_action orange_update(void* my_info, void* com_data, int success); @@ -56,17 +50,16 @@ void initWorld(int width, int height){ generateImg(width, height); } -void addFight(t_dude dude, t_dude other_dude){ - -} - void updateTeam(t_team team){ int i; - t_action action; + + for(i=0; iaction; t_coord target_pos = getPos(dude->pos, action.dir); t_pixel target = map[target_pos.x][target_pos.y]; int* nb_res; @@ -164,9 +159,28 @@ void handleAction(t_action action, t_dude* dude){ add_move(dude, target_pos); break; case ATTACK : - printf("forbidden action\n"); // TODO : implement that - //if(target.type == DUDE) - // addFight(dude, *((t_dude*)(target.data))); + dude->success = 0; + if( target.type == DUDE + || 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; case PICK : nb_res = target.data; @@ -286,18 +300,27 @@ void handleAction(t_action action, t_dude* dude){ break; case COMMUNICATE : switch(target.type){ + // TODO : conflicts are not handled in a fair way case DUDE : action.com_data.flag = (action.dir+2)%4; - dude->com_data = malloc(sizeof(t_com)); - *(dude->com_data) = action.com_data; - dude->success = 1; + if(dude->com_data == NULL){ + dude->com_data = malloc(sizeof(t_com)); + *(dude->com_data) = action.com_data; + dude->success = 1; + }else + dude->success = 0; break; case LIBRARY : if(action.com_data.flag & READ){ - action.com_data.flag = action.dir; - dude->com_data = malloc(sizeof(t_com)); - *(dude->com_data) = action.com_data; - memcpy(dude->com_data + sizeof(int), target.data + (action.com_data.flag | 3), 32); + if(dude->com_data == NULL){ + action.com_data.flag = action.dir; + dude->com_data = malloc(sizeof(t_com)); + *(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{ memcpy(target.data + action.com_data.flag, action.com_data.data, 32); } @@ -481,6 +504,7 @@ int MAIN 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 add_fight(t_dude* dude, t_coord dst){ + int i; + t_pixel target = map[dst.x][dst.y]; + t_fight* fight; + if(target.type == DUDE){ + t_dude* dude2 = target.data; + for(i=0; itarget == dude){ + fight = malloc(sizeof(t_fight)); + fight->dude = dude; + fight->target = dude2; + fight->dmg = 1 + 3*(dude->inventory == SWORD); + fight->proba = 99 - fights[i]->proba; + fights[nb_fight++] = fight; + return; + } + if(fights[i]->target == dude2){ + fights[i]->dmg += 1 + 3*(dude->inventory == SWORD); + return; + } + } + fight = malloc(sizeof(t_fight)); + fight->dude = dude; + fight->target = dude2; + fight->dmg = 1 + 3*(dude->inventory == SWORD); + fight->proba = rand()%100; + fights[nb_fight++] = fight; + } +} + void applyMove(t_move* move){ 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 == BEDROCK || target.type == IRON_ORE @@ -49,6 +83,28 @@ void applyMove(t_move* move){ free(move); } +void resolve_fights(){ + int i, j; + int defense = 0; + for(i=0; idude->action.type; + defense = (type == MOVE || type == ATTACK)*(1 + 3*(fights[i]->dude->inventory == SWORD)); + if((defense*100)/(defense + fights[i]->dmg) < fights[i]->proba){ + t_dude* target = fights[i]->target; + t_team team = teams[target->team]; + for(j=0; jpos.x][target->pos.y].type = DEAD_DUDE; + break; + } + } + } + free(fights[i]); + } + nb_fight = 0; +} + void resolve_moves(){ int change = 1; int i; @@ -100,6 +156,7 @@ Uint32 getColor(t_pixel pixel){ case ROAD : return 0xEDB287; case SWORD : return 0xEBEBEB; case LIBRARY : return 0xA37A50; + case DEAD_DUDE : return 0xFF0000; default : return 0x0000FF; // bleu absolu = bug } diff --git a/tools.h b/tools.h index f6ad9f6..9c666d9 100644 --- a/tools.h +++ b/tools.h @@ -7,6 +7,8 @@ void add_move(t_dude* dude, t_coord dst); +void add_fight(t_dude* dude, t_coord dst); + void resolve_moves(); Uint32 getColor(t_pixel pixel);