qboolean Model_MapLoadSubmodels(struct map *map) { struct submodel *out, *rout; struct dsubmodel *in; int i, j; if (map->header->lumps[LUMP_MODELS].filelen % sizeof(*in)) return false; in = (struct dsubmodel *)(map->mod_base + map->header->lumps[LUMP_MODELS].fileofs); map->submodels_count = map->header->lumps[LUMP_MODELS].filelen / sizeof(*in); if (map->submodels_count< 1) return false; if (map->submodels_count > MAX_MAP_MODELS) return false; out = map->submodels; rout = out; map->visleafs = LittleLong(in[0].visleafs); for (i=0; i<map->submodels_count ; i++, in++, out++) { for (j=0; j<3; j++) { out->mins[j] = LittleFloat(in->mins[j]) - 1; out->maxs[j] = LittleFloat(in->maxs[j]) + 1; out->origins[j] = LittleFloat(in->origins[j]); } for (j=0; j<MAX_MAP_HULLS; j++) { out->hulls[j].planes = map->planes; out->hulls[j].clipnodes = map->clipnodes; out->hulls[j].firstclipnode = LittleLong(in->headnode[j]); out->hulls[j].lastclipnode = map->clipnodes_count - 1; } Vector_Clear(out->hulls[0].clip_mins); Vector_Clear(out->hulls[0].clip_maxs); Vector_Set(out->hulls[1].clip_mins, -16, -16, -24); Vector_Set(out->hulls[1].clip_maxs, 16, 16, 32); Vector_Set(out->hulls[2].clip_mins, -32, -32, -24); Vector_Set(out->hulls[2].clip_maxs, 32, 32, 64); } return true; }
void Vector_Fini (Vector v) { assert (v); Vector_Clear (v); free (v->data); }
void World_Reset(World* world, int map_width, int map_height) { Vector_Clear(&world->bonus_vector); Vector_Clear(&world->bullets_vector); Vector_Clear(&world->monsters_vector); Vector_Clear(&world->explosions_vector); Vector_Clear(&world->events_vector); for(int i = 0 ; i < world->map_size ; i++) { free(world->map[i]); } for(int i = 0 ; i < world->map_size ; i++) { free(world->ground_map[i]); } *world = World_Initialize(map_width, map_height); }
void Level_Clear(World* w) { for(int i = 0 ; i < Vector_Count(&w->monsters_vector) ; i++) { Entity* ent = Vector_Get(&w->monsters_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->bonus_vector) ; i++) { Entity* ent = Vector_Get(&w->bonus_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->bullets_vector) ; i++) { Entity* ent = Vector_Get(&w->bullets_vector, i); Entity_Destroy(ent); } for(int i = 0 ; i < Vector_Count(&w->explosions_vector) ; i++) { Entity* ent = Vector_Get(&w->explosions_vector, i); Entity_Destroy(ent); } Vector_Clear(&w->monsters_vector); Vector_Clear(&w->bonus_vector); Vector_Clear(&w->events_vector); Vector_Clear(&w->bullets_vector); Vector_Clear(&w->explosions_vector); Vector_Clear(&w->decals_vector); Vector_Clear(&w->props_vector); for(int i = 0 ; i < w->map_size ; i++) { free(w->map[i]); } for(int i = 0 ; i < w->map_size ; i++) { free(w->ground_map[i]); } }