quakeforge/tools/Forge/Bundles/MapEdit/Project.m
2003-03-18 19:48:24 +00:00

526 lines
8.7 KiB
Objective-C

//======================================
//
// 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<max ; i++)
{
name = [list elementAt:i];
[matrix addRow];
cell = [matrix cellAt:i :0];
[cell setStringValue:name];
[cell setLeaf:YES];
[cell setLoaded:YES];
}
return i;
}
//
// Clicked on a map name or description!
//
- clickedOnMap:sender
{
id matrix;
int row;
char fname[1024];
id panel;
matrix = [sender matrixInColumn:0];
row = [matrix selectedRow];
sprintf(fname,"%s/%s.map",path_mapdirectory,
(char *)[mapList elementAt:row]);
panel = NSGetAlertPanel("Loading...",
"Loading map. Please wait.",NULL,NULL,NULL);
[panel orderFront:NULL];
[quakeed_i doOpen:fname];
[panel performClose:NULL];
NSFreeAlertPanel(panel);
return self;
}
- setTextureWad: (char *)wf
{
int i, c;
char *name;
qprintf ("loading %s", wf);
// set the row in the settings inspector wad browser
c = [wadList count];
for (i=0 ; i<c ; i++)
{
name = (char *)[wadList elementAt:i];
if (!strcmp(name, wf))
{
[[pis_wads_i matrixInColumn:0] selectCellAt: i : 0];
break;
}
}
// update the texture inspector
[texturepalette_i initPaletteFromWadfile:wf ];
[[map_i objectAt: 0] setKey:"wad" toValue: wf];
// [inspcontrol_i changeInspectorTo:i_textures];
[quakeed_i updateAll];
return self;
}
//
// Clicked on a wad name
//
- clickedOnWad:sender
{
id matrix;
int row;
char *name;
matrix = [sender matrixInColumn:0];
row = [matrix selectedRow];
name = (char *)[wadList elementAt:row];
[self setTextureWad: name];
return self;
}
//
// Read in the <name>.QE_Project file
//
- parseProjectFile
{
char *path;
int rtn;
path = [preferences_i getProjectPath];
if (!path || !path[0] || access(path,0))
{
rtn = NSRunAlertPanel("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
[NSApp 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 == NS_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;
}