implemented most of missing features, debugging is still in progress
This commit is contained in:
parent
f69fece27a
commit
5e3bb43576
55
main.c
55
main.c
@ -52,7 +52,6 @@ void initWorld(int width, int height){
|
||||
|
||||
void updateTeam(t_team team){
|
||||
int i;
|
||||
t_action action;
|
||||
|
||||
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);
|
||||
@ -127,6 +126,7 @@ void spawnDudes(){
|
||||
new_dude.team = teams[i].team;
|
||||
new_dude.inventory = -1;
|
||||
new_dude.success = 1;
|
||||
new_dude.dead = 0;
|
||||
new_dude.ground = map[teams[i].spawn.x][teams[i].spawn.y];
|
||||
new_dude.custom_data = malloc(DUDE_MEMORY);
|
||||
memset(new_dude.custom_data, 0, DUDE_MEMORY);
|
||||
@ -138,9 +138,9 @@ void spawnDudes(){
|
||||
}
|
||||
|
||||
void handleAction(t_dude* dude){
|
||||
t_action action = dude->action;
|
||||
t_coord target_pos = getPos(dude->pos, action.dir);
|
||||
t_pixel target = map[target_pos.x][target_pos.y];
|
||||
t_action action = dude->action;
|
||||
int* nb_res;
|
||||
if(dude->com_data != NULL){
|
||||
free(dude->com_data);
|
||||
@ -159,9 +159,28 @@ void handleAction(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;
|
||||
@ -281,19 +300,27 @@ void handleAction(t_dude* dude){
|
||||
break;
|
||||
case COMMUNICATE :
|
||||
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 :
|
||||
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);
|
||||
}
|
||||
@ -477,7 +504,7 @@ int MAIN
|
||||
spawnDudes();
|
||||
for(i=0; i<NB_TEAMS; i++)
|
||||
updateTeam(teams[i]);
|
||||
resolve_fights();
|
||||
// resolve_fights(); // TODO : debugging
|
||||
resolve_moves();
|
||||
|
||||
remaining_time = wait_time;
|
||||
|
3
main.h
3
main.h
@ -35,6 +35,7 @@ typedef struct{
|
||||
int team;
|
||||
int inventory;
|
||||
int success;
|
||||
int dead;
|
||||
t_pixel ground;
|
||||
t_action action;
|
||||
void* custom_data;
|
||||
@ -53,7 +54,7 @@ typedef struct{
|
||||
|
||||
void generateImg();
|
||||
|
||||
void handleAction(t_action action, t_dude* dude);
|
||||
void handleAction(t_dude* dude);
|
||||
|
||||
// variables globales
|
||||
t_pixel** map;
|
||||
|
2
team.h
2
team.h
@ -34,7 +34,7 @@ typedef struct{
|
||||
enum{
|
||||
BEDROCK, GRASS, TREE, BERRIES, ROCK, IRON_ORE, // nature
|
||||
FOOD, WOOD, STONE, IRON, SWORD, // resources
|
||||
DUDE, DEAD_DUDE // humans
|
||||
DUDE, DEAD_DUDE, // humans
|
||||
SPAWN, WALL, ROAD, MARK, LIBRARY // buildings
|
||||
};
|
||||
|
||||
|
15
tools.c
15
tools.c
@ -61,7 +61,8 @@ void add_fight(t_dude* dude, t_coord dst){
|
||||
|
||||
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
|
||||
@ -83,13 +84,21 @@ void applyMove(t_move* move){
|
||||
}
|
||||
|
||||
void resolve_fights(){
|
||||
int i;
|
||||
int i, j;
|
||||
int defense = 0;
|
||||
for(i=0; i<nb_fight; i++){
|
||||
int type = fights[i]->dude->action.type;
|
||||
defense = (type == MOVE || type == ATTACK)*(1 + 3*(fights[i]->dude->inventory == SWORD));
|
||||
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]);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user