/////////////////////////////////////////////////////////////////////// // Read from disk file /////////////////////////////////////////////////////////////////////// void ACEND_LoadNodes(void) { FILE *pIn; int i,j; char tempname[MAX_QPATH] = ""; char filename[MAX_QPATH] = ""; //char filename[60]; int version; // Knightmare- rewote this sprintf (tempname, "nav/%s.nod", level.mapname); GameDirRelativePath (tempname, filename); //strcpy(filename,"ace\\nav\\"); //strcat(filename,level.mapname); //strcat(filename,".nod"); if((pIn = fopen(filename, "rb" )) == NULL) { // Create item table safe_bprintf(PRINT_MEDIUM, "ACE: No node file found, creating new one..."); ACEIT_BuildItemNodeTable(false); safe_bprintf(PRINT_MEDIUM, "done.\n"); return; } // determine version fread(&version,sizeof(int),1,pIn); // read version if(version == 1) { safe_bprintf(PRINT_MEDIUM,"ACE: Loading node table..."); fread(&numnodes,sizeof(int),1,pIn); // read count fread(&num_items,sizeof(int),1,pIn); // read facts count fread(nodes,sizeof(node_t),numnodes,pIn); for(i=0;i<numnodes;i++) for(j=0;j<numnodes;j++) fread(&path_table[i][j],sizeof(int16_t),1,pIn); // write count // Knightmare- is this needed? It's all re-built anyway, and may cause problems. // The item_table array is better left blank. //fread(item_table,sizeof(item_table_t),num_items,pIn); fclose(pIn); } else { // Create item table safe_bprintf(PRINT_MEDIUM, "ACE: No node file found, creating new one..."); ACEIT_BuildItemNodeTable(false); safe_bprintf(PRINT_MEDIUM, "done.\n"); return; // bail } safe_bprintf(PRINT_MEDIUM, "done.\n"); ACEIT_BuildItemNodeTable(true); }
/////////////////////////////////////////////////////////////////////// // Save to disk file // // Since my compression routines are one thing I did not want to // release, I took out the compressed format option. Most levels will // save out to a node file around 50-200k, so compression is not really // a big deal. /////////////////////////////////////////////////////////////////////// void ACEND_SaveNodes() { FILE *pOut; char tempname[MAX_QPATH] = ""; char filename[MAX_QPATH] = ""; // char filename[60]; int i,j; int version = 1; // Resolve paths ACEND_ResolveAllPaths(); safe_bprintf(PRINT_MEDIUM,"Saving node table..."); // Knightmare- rewote this GameDirRelativePath ("nav", filename); // create nav dir if needed _mkdir (filename); sprintf (tempname, "nav/%s.nod", level.mapname); GameDirRelativePath (tempname, filename); //strcpy(filename,"ace\\nav\\"); //strcat(filename,level.mapname); //strcat(filename,".nod"); if((pOut = fopen(filename, "wb" )) == NULL) return; // bail fwrite(&version,sizeof(int),1,pOut); // write version fwrite(&numnodes,sizeof(int),1,pOut); // write count fwrite(&num_items,sizeof(int),1,pOut); // write facts count fwrite(nodes,sizeof(node_t),numnodes,pOut); // write nodes for(i=0;i<numnodes;i++) for(j=0;j<numnodes;j++) fwrite(&path_table[i][j],sizeof(int16_t),1,pOut); // write count fwrite(item_table,sizeof(item_table_t),num_items,pOut); // write out the fact table fclose(pOut); safe_bprintf(PRINT_MEDIUM,"done.\n"); }
/////////////////////////////////////////////////////////////////////// // Load a table of bots from bots.cfg. /////////////////////////////////////////////////////////////////////// void ACESP_LoadBotInfo() { FILE *pIn; char filename[MAX_OSPATH] = ""; char line[256], *parseline; char *token; char botname[128]; if (num_botinfo > 0) // already loaded return; // Knightmare- rewote this GameDirRelativePath ("bots.cfg", filename); if ((pIn = fopen(filename, "rb" )) == NULL) { safe_bprintf(PRINT_MEDIUM,"ACE: No bots.cfg file found, using default bots.\n"); return; // bail } safe_bprintf(PRINT_MEDIUM,"ACE: Loading bot data..."); while (fgets(line, sizeof(line), pIn) && num_botinfo < MAX_BOTS) { parseline = line; token = COM_Parse (&parseline); if (!token || !strlen(token)) // catch bad line continue; // strncpy (botname, token, sizeof(botname)-1); Q_strncpyz(botname, token, sizeof(botname)); token = COM_Parse (&parseline); if (!token || !strlen(token)) // catch bad line continue; // strncpy (bot_info[num_botinfo].name, botname, sizeof(bot_info[num_botinfo].name)-1); // strncpy (bot_info[num_botinfo].skin, token, sizeof(bot_info[num_botinfo].skin)-1); Q_strncpyz(bot_info[num_botinfo].name, botname, sizeof(bot_info[num_botinfo].name)); Q_strncpyz(bot_info[num_botinfo].skin, token, sizeof(bot_info[num_botinfo].skin)); //gi.dprintf("%s %s\n", bot_info[num_botinfo].name, bot_info[num_botinfo].skin); bot_info[num_botinfo].ingame_count = 0; num_botinfo++; } //gi.dprintf("Number of bots loaded: %d\n\n", num_botinfo); safe_bprintf(PRINT_MEDIUM, "done.\n"); fclose(pIn); }
/* ==================== LoadAliasFile Tries to load script file from disk, and then from a pak file. ==================== */ qboolean LoadAliasFile (char *name) { char aliasfilename[MAX_QPATH] = ""; alias_from_pak = false; GameDirRelativePath (name, aliasfilename); alias_data = ReadTextFile(aliasfilename, &alias_data_size); // If file doesn't exist on hard disk, it must be in a pak file if (!alias_data) { cvar_t *basedir, *gamedir; char filename[256]; char pakfile[256]; char textname[128]; int i, k, num, numitems; qboolean in_pak = false; FILE *fpak; pak_header_t pakheader; pak_item_t pakitem; basedir = gi.cvar("basedir", "", 0); gamedir = gi.cvar("gamedir", "", 0); strcpy(filename,basedir->string); sprintf(textname, name); if(strlen(gamedir->string)) strcpy(filename,gamedir->string); // check all pakfiles in current gamedir for (i=0; i<10; i++) { sprintf(pakfile,"%s/pak%d.pak",filename,i); if (NULL != (fpak = fopen(pakfile, "rb"))) { num=fread(&pakheader,1,sizeof(pak_header_t),fpak); if(num >= sizeof(pak_header_t)) { if (pakheader.id[0] == 'P' && pakheader.id[1] == 'A' && pakheader.id[2] == 'C' && pakheader.id[3] == 'K' ) { numitems = pakheader.dsize/sizeof(pak_item_t); fseek(fpak,pakheader.dstart,SEEK_SET); for(k=0; k<numitems && !in_pak; k++) { fread(&pakitem,1,sizeof(pak_item_t),fpak); if (!stricmp(pakitem.name,textname)) { in_pak = true; fseek(fpak,pakitem.start,SEEK_SET); alias_data = gi.TagMalloc(pakitem.size + 1, TAG_LEVEL); if (!alias_data) { fclose(fpak); gi.dprintf("LoadAliasData: Memory allocation failure for entalias.dat\n"); return false; } alias_data_size = fread(alias_data,1,pakitem.size,fpak); alias_data[pakitem.size] = 0; // put end marker alias_from_pak = true; } } } } fclose(fpak); } } } if (!alias_data) return false; return true; }