/* lose a point: noone gets it */ void player_lose_point(gint player_num, gint id) { Player *player = player_get(player_num); Points *point; GList *list; /* look up the point in the list */ for (list = player->points; list != NULL; list = g_list_next(list)) { point = list->data; if (point->id == id) break; } /* communication error: the point doesn't exist */ if (list == NULL) { log_message(MSG_ERROR, _("server asks to lose invalid point.\n")); return; } player->points = g_list_remove(player->points, point); player_modify_points(player_num, point, FALSE); /* tell the user the point is lost */ log_message(MSG_INFO, _("%s lost %s.\n"), player->name, point->name); /* free the memory */ points_free(point); g_free(point); }
/* this function is called when the game starts, to clean up from the * previous game. */ void player_reset(void) { gint i, idx; /* remove all viewers */ while (viewers != NULL) { Viewer *viewer = viewers->data; g_free(viewer->name); g_free(viewer->style); viewers = g_list_remove(viewers, viewer); } /* free player's memory */ for (i = 0; i < MAX_PLAYERS; ++i) { if (players[i].name != NULL) { g_free(players[i].name); players[i].name = NULL; } if (players[i].style != NULL) { g_free(players[i].style); players[i].style = NULL; } while (players[i].points != NULL) { Points *points = players[i].points->data; players[i].points = g_list_remove(players[i].points, points); points_free(points); g_free(points); } for (idx = 0; idx < G_N_ELEMENTS(players[i].statistics); ++idx) players[i].statistics[idx] = 0; } }
/** * Handle operation on a point * @param char* name points name * @param char ope operateur: '=':= ; '+':+= ; '-':-= * @param TPA_Expr** vals **/ static int interp_pointsOperation(Points* points, char* name, char ope, TPA_Expr** vals) { Point point; int i, size = 0; TPA_Expr ** val = vals; // Calculate the size of our point vector while(*val != 0) { size++; val++; } point = point_init(size); for(i=0; i<size; i++) point.vect[i] = (char)(*vals[i]).val; // int that can contain 0,1,-1 (wildcard) switch(ope) { case '=': points_free(points); points_wildOp(points, point, '+'); break; case '+': case '-': if (!points_fit(points, point)) return 0; points_wildOp(points, point, ope); break; } return 1; }
extern void interp_free(Env* env) { int i; for(i=0; i<env->nbfunction; ++i) function_free(env->functions[i]); for(i=0; i<env->nbpoints; ++i) points_free(env->points[i]); free(env->functions); free(env->points); free(env); }