//====================================== // // QuakeEd Project Management // //====================================== #import "qedefs.h" id project_i; @implementation Project - init { project_i = self; return self; } //=========================================================== // // Project code // //=========================================================== - initVars { char *s; s = [preferences_i getProjectPath]; StripFilename(s); strcpy(path_basepath,s); strcpy(path_progdir,s); strcat(path_progdir,"/"SUBDIR_ENT); strcpy(path_mapdirectory,s); strcat(path_mapdirectory,"/"SUBDIR_MAPS); // source dir strcpy(path_finalmapdir,s); strcat(path_finalmapdir,"/"SUBDIR_MAPS); // dest dir [basepathinfo_i setStringValue:s]; // in Project Inspector #if 0 if ((s = [projectInfo getStringFor:BASEPATHKEY])) { strcpy(path_basepath,s); strcpy(path_progdir,s); strcat(path_progdir,"/"SUBDIR_ENT); strcpy(path_mapdirectory,s); strcat(path_mapdirectory,"/"SUBDIR_MAPS); // source dir strcpy(path_finalmapdir,s); strcat(path_finalmapdir,"/"SUBDIR_MAPS); // dest dir [basepathinfo_i setStringValue:s]; // in Project Inspector } #endif if ((s = [projectInfo getStringFor:BSPFULLVIS])) { strcpy(string_fullvis,s); changeString('@','\"',string_fullvis); } if ((s = [projectInfo getStringFor:BSPFASTVIS])) { strcpy(string_fastvis,s); changeString('@','\"',string_fastvis); } if ((s = [projectInfo getStringFor:BSPNOVIS])) { strcpy(string_novis,s); changeString('@','\"',string_novis); } if ((s = [projectInfo getStringFor:BSPRELIGHT])) { strcpy(string_relight,s); changeString('@','\"',string_relight); } if ((s = [projectInfo getStringFor:BSPLEAKTEST])) { strcpy(string_leaktest,s); changeString('@','\"',string_leaktest); } if ((s = [projectInfo getStringFor:BSPENTITIES])) { strcpy(string_entities,s); changeString('@','\"', string_entities); } // Build list of wads wadList = [projectInfo parseMultipleFrom:WADSKEY]; // Build list of maps & descriptions mapList = [projectInfo parseMultipleFrom:MAPNAMESKEY]; descList = [projectInfo parseMultipleFrom:DESCKEY]; [self changeChar:'_' to:' ' in:descList]; [self initProjSettings]; return self; } // // Init Project Settings fields // - initProjSettings { [pis_basepath_i setStringValue:path_basepath]; [pis_fullvis_i setStringValue:string_fullvis]; [pis_fastvis_i setStringValue:string_fastvis]; [pis_novis_i setStringValue:string_novis]; [pis_relight_i setStringValue:string_relight]; [pis_leaktest_i setStringValue:string_leaktest]; return self; } // // Add text to the BSP Output window // - addToOutput:(char *)string { int end; end = [BSPoutput_i textLength]; [BSPoutput_i setSel:end :end]; [BSPoutput_i replaceSel:string]; end = [BSPoutput_i textLength]; [BSPoutput_i setSel:end :end]; [BSPoutput_i scrollSelToVisible]; return self; } - clearBspOutput:sender { [BSPoutput_i selectAll:self]; [BSPoutput_i replaceSel:"\0"]; return self; } - print { [BSPoutput_i printPSCode:self]; return self; } - initProject { [self parseProjectFile]; if (projectInfo == NULL) return self; [self initVars]; [mapbrowse_i reuseColumns:YES]; [mapbrowse_i loadColumnZero]; [pis_wads_i reuseColumns:YES]; [pis_wads_i loadColumnZero]; [things_i initEntities]; return self; } // // Change a character to another in a Storage list of strings // - changeChar:(char)f to:(char)t in:(id)obj { int i; int max; char *string; max = [obj count]; for (i = 0;i < max;i++) { string = [obj elementAt:i]; changeString(f,t,string); } return self; } // // Fill the QuakeEd Maps or wads browser // (Delegate method - delegated in Interface Builder) // - (int)browser:sender fillMatrix:matrix inColumn:(int)column { id cell, list; int max; char *name; int i; if (sender == mapbrowse_i) list = mapList; else if (sender == pis_wads_i) list = wadList; else { list = nil; Error ("Project: unknown browser to fill"); } max = [list count]; for (i = 0 ; i.QE_Project file // - parseProjectFile { char *path; int rtn; path = [preferences_i getProjectPath]; if (!path || !path[0] || access(path,0)) { rtn = NXRunAlertPanel("Project Error!", "A default project has not been found.\n" , "Open Project", NULL, NULL); if ([self openProject] == nil) while (1) // can't run without a project [NXApp terminate: self]; return self; } [self openProjectFile:path]; return self; } // // Loads and parses a project file // - openProjectFile:(char *)path { FILE *fp; struct stat s; strcpy(path_projectinfo,path); projectInfo = NULL; fp = fopen(path,"r+t"); if (fp == NULL) return self; stat(path,&s); lastModified = s.st_mtime; projectInfo = [(Dict *)[Dict alloc] initFromFile:fp]; fclose(fp); return self; } - (char *)currentProjectFile { return path_projectinfo; } // // Open a project file // - openProject { char path[128]; id openpanel; int rtn; char *projtypes[2] = {"qpr",NULL}; char **filenames; char *dir; openpanel = [OpenPanel new]; [openpanel allowMultipleFiles:NO]; [openpanel chooseDirectories:NO]; rtn = [openpanel runModalForTypes:projtypes]; if (rtn == NX_OKTAG) { (const char *const *)filenames = [openpanel filenames]; dir = (char *)[openpanel directory]; sprintf(path,"%s/%s",dir,filenames[0]); strcpy(path_projectinfo,path); [self openProjectFile:path]; return self; } return nil; } // // Search for a string in a List of strings // - (int)searchForString:(char *)str in:(id)obj { int i; int max; char *s; max = [obj count]; for (i = 0;i < max; i++) { s = (char *)[obj elementAt:i]; if (!strcmp(s,str)) return 1; } return 0; } - (char *)getMapDirectory { return path_mapdirectory; } - (char *)getFinalMapDirectory { return path_finalmapdir; } - (char *)getProgDirectory { return path_progdir; } // // Return the WAD name for cmd-8 // - (char *)getWAD8 { if (!path_wad8[0]) return NULL; return path_wad8; } // // Return the WAD name for cmd-9 // - (char *)getWAD9 { if (!path_wad9[0]) return NULL; return path_wad9; } // // Return the WAD name for cmd-0 // - (char *)getWAD0 { if (!path_wad0[0]) return NULL; return path_wad0; } // // Return the FULLVIS cmd string // - (char *)getFullVisCmd { if (!string_fullvis[0]) return NULL; return string_fullvis; } // // Return the FASTVIS cmd string // - (char *)getFastVisCmd { if (!string_fastvis[0]) return NULL; return string_fastvis; } // // Return the NOVIS cmd string // - (char *)getNoVisCmd { if (!string_novis[0]) return NULL; return string_novis; } // // Return the RELIGHT cmd string // - (char *)getRelightCmd { if (!string_relight[0]) return NULL; return string_relight; } // // Return the LEAKTEST cmd string // - (char *)getLeaktestCmd { if (!string_leaktest[0]) return NULL; return string_leaktest; } - (char *)getEntitiesCmd { if (!string_entities[0]) return NULL; return string_entities; } @end //==================================================== // C Functions //==================================================== // // Change a character to a different char in a string // void changeString(char cf,char ct,char *string) { int j; for (j = 0;j < strlen(string);j++) if (string[j] == cf) string[j] = ct; }