/* * Get the current value of a server option * in a text buffer. * * This is called when a client requests * to see the current server parameter list. */ int Parser_list_option(int *ind, char *buf) { int i = *ind, option_count; option_desc *opts; opts = Get_option_descs(&option_count); if (i < 0 || i >= option_count) return -1; if (opts[i].defaultValue == NULL) return 0; if ((opts[i].flags & OPT_VISIBLE) == 0) return 0; switch (opts[i].type) { case valInt: sprintf(buf, "%s:%d", opts[i].name, *(int *)opts[i].variable); break; case valReal: sprintf(buf, "%s:%g", opts[i].name, *(double *)opts[i].variable); break; case valBool: sprintf(buf, "%s:%s", opts[i].name, *(bool *)opts[i].variable ? "yes" : "no"); break; case valIPos: sprintf(buf, "%s:%d,%d", opts[i].name, ((ipos_t *)opts[i].variable)->x, ((ipos_t *)opts[i].variable)->y); break; case valString: sprintf(buf, "%s:%s", opts[i].name, *(char **)opts[i].variable); break; case valList: { list_t list = *(list_t *)opts[i].variable; sprintf(buf, "%s:", opts[i].name); if (list) { list_iter_t iter; for (iter = List_begin(list); iter != List_end(list); LI_FORWARD(iter)) { char *str = (char *)LI_DATA(iter); if (iter != List_begin(list)) strlcat(buf, ",", MSG_LEN); if (strlcat(buf, str, MSG_LEN) >= MSG_LEN) break; } } } break; default: return 0; } return 1; }
void TestData_list_uint_test(TestData _test) { uint i = 0; ///list _lst; List _lst = List_new(Vptr, malloc, free); List lst; Iterator iter; for (; i < _test->count; i++) { _test->data[i].uint32_var = i; } printf("push back begin test\n"); lst = List_Init(_lst, Uint32, malloc, free); for (i = 0; i < _test->count; i++) { Iterator iter = List_push_back(lst, _test->data[i]); if (List_get_value(iter).uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", List_get_value(iter).uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", List_get_value(iter).uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } } i = 0; iter = List_begin(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_next(iter); i++; } i = _test->count - 1; iter = List_end(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_prev(iter); i--; } List_Dest(lst); printf("push back test end\n"); /// printf("insert after test0 begin\n"); lst = List_Init(lst, Uint32, malloc, free); iter = List_push_back(lst, _test->data[0]); for (i = 1; i < _test->count; i++) { iter = List_insert_after(lst, iter, _test->data[i]); } i = 0; iter = List_begin(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_next(iter); i++; } List_Dest(lst); printf("insert after test0 end\n"); /// printf("insert after test1 begin\n"); lst = List_Init(lst, Uint32, malloc, free); iter = List_push_back(lst, _test->data[0]); List_push_back(lst, _test->data[_test->count - 1]); for (i = 1; i < _test->count - 1; i++) { iter = List_insert_after(lst, iter, _test->data[i]); } i = 0; iter = List_begin(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_next(iter); i++; } List_Dest(lst); printf("insert after test1 end\n"); /// printf("insert before test0 begin\n"); lst = List_Init(lst, Uint32, malloc, free); iter = List_push_back(lst, _test->data[_test->count - 1]); for (i = _test->count - 2; i; i--) { iter = List_insert_before(lst, iter, _test->data[i]); } List_insert_before(lst, iter, _test->data[0]); i = 0; iter = List_begin(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_next(iter); i++; } List_Dest(lst); printf("insert before test0 end\n"); /// /// printf("insert before test1 begin\n"); lst = List_Init(lst, Uint32, malloc, free); iter = List_push_back(lst, _test->data[0]); List_push_back(lst, _test->data[_test->count - 1]); iter = List_end(lst); for (i = _test->count - 2; i; i--) { iter = List_insert_before(lst, iter, _test->data[i]); } i = 0; iter = List_begin(lst); while (iter) { var tmp = List_get_value(iter); if (tmp.uint32_var != _test->data[i].uint32_var) { #if BIT_WIDTH == 64 printf("data error! tmp %d data %d i %I64d count %I64d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #else printf("data error! tmp %d data %d i %d count %d", tmp.uint32_var, _test->data[i].uint32_var, i, _test->count); getchar(); exit(0); #endif } iter = List_next(iter); i++; } List_Dest(lst); printf("insert before test1 end\n"); /// printf("test succ\n"); }
static void AsteroidCollision(void) { int j, radius, obj_count; object_t *ast; object_t *obj = NULL, **obj_list; list_t list; list_iter_t iter; double damage = 0.0; bool sound = false; list = Asteroid_get_list(); if (!list) return; for (iter = List_begin(list); iter != List_end(list); LI_FORWARD(iter)) { ast = (object_t *)LI_DATA(iter); assert(ast->type == OBJ_ASTEROID); if (ast->life <= 0.0) continue; assert(World_contains_clpos(ast->pos)); if (NumObjs >= options.cellGetObjectsThreshold) Cell_get_objects(ast->pos, ast->pl_radius / BLOCK_SZ + 1, 300, &obj_list, &obj_count); else { obj_list = Obj; obj_count = NumObjs; } for (j = 0; j < obj_count; j++) { obj = obj_list[j]; assert(obj != NULL); /* asteroids don't hit these objects */ if ((obj->type == OBJ_ITEM || obj->type == OBJ_DEBRIS || obj->type == OBJ_SPARK || obj->type == OBJ_WRECKAGE) && obj->id == NO_ID && !BIT(obj->obj_status, FROMCANNON)) continue; /* don't collide while still overlapping after breaking */ if (obj->type == OBJ_ASTEROID && ast->fuse > 0) continue; /* don't collide with self */ if (obj == ast) continue; /* don't collide with phased balls */ if (obj->type == OBJ_BALL && obj->id != NO_ID && Player_is_phasing(Player_by_id(obj->id))) continue; radius = (ast->pl_radius + obj->pl_radius) * CLICK; if (!in_range(OBJ_PTR(ast), obj, (double)radius)) continue; switch (obj->type) { case OBJ_BALL: Obj_repel(ast, obj, radius); if (options.treasureCollisionDestroys) obj->life = 0.0; damage = ED_BALL_HIT; sound = true; break; case OBJ_ASTEROID: obj->life -= ASTEROID_FUEL_HIT( collision_cost(ast->mass, VECTOR_LENGTH(ast->vel)), WIRE_PTR(obj)->wire_size); damage = -collision_cost(obj->mass, VECTOR_LENGTH(obj->vel)); Delta_mv_elastic(ast, obj); /* avoid doing collision twice */ obj->fuse = timeStep; sound = true; break; case OBJ_SPARK: obj->life = 0.0; Delta_mv(ast, obj); damage = 0.0; break; case OBJ_DEBRIS: case OBJ_WRECKAGE: obj->life = 0.0; damage = -collision_cost(obj->mass, VECTOR_LENGTH(obj->vel)); Delta_mv(ast, obj); break; case OBJ_MINE: if (!BIT(obj->obj_status, CONFUSED)) obj->life = 0.0; break; case OBJ_SHOT: case OBJ_CANNON_SHOT: obj->life = 0.0; Delta_mv(ast, obj); damage = ED_SHOT_HIT; sound = true; break; case OBJ_SMART_SHOT: case OBJ_TORPEDO: case OBJ_HEAT_SHOT: obj->life = 0.0; Delta_mv(ast, obj); damage = Missile_hit_drain(MISSILE_PTR(obj)); sound = true; break; case OBJ_PULSE: obj->life = 0; damage = ED_LASER_HIT; sound = true; break; default: Delta_mv(ast, obj); damage = 0.0; break; } if (ast->life > 0.0) { /* kps - this is some strange sort of hack - fix it*/ /*if (ast->life <= ast->fuselife) {*/ ast->life += ASTEROID_FUEL_HIT(damage, WIRE_PTR(ast)->wire_size); /*}*/ if (sound) sound_play_sensors(ast->pos, ASTEROID_HIT_SOUND); if (ast->life < 0.0) ast->life = 0.0; if (ast->life == 0.0) { if ((obj->id != NO_ID || (obj->type == OBJ_BALL && BALL_PTR(obj)->ball_owner != NO_ID))) { int owner_id = ((obj->type == OBJ_BALL) ? BALL_PTR(obj)->ball_owner : obj->id); player_t *pl = Player_by_id(owner_id); Handle_Scoring(SCORE_ASTEROID_KILL,pl,NULL,ast,NULL); } /* break; */ } } } } }