detect being inside a Nexuiz install from Radiant C code, no longer from a shell script on OS X. This should make it work on all systems.

git-svn-id: svn://svn.icculus.org/netradiant/trunk@210 61c419a2-8eb2-4b30-bcec-8cead039b335
This commit is contained in:
divverent 2009-03-05 11:27:30 +00:00
parent bc8893fcd7
commit b7cd2135c9
2 changed files with 81 additions and 26 deletions

View File

@ -26,9 +26,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "stream/stringstream.h" #include "stream/stringstream.h"
#include "debugging/debugging.h" #include "debugging/debugging.h"
#include "os/path.h" #include "os/path.h"
#include "os/file.h"
#include "cmdlib.h" #include "cmdlib.h"
int g_argc; int g_argc;
char** g_argv; char** g_argv;
@ -55,6 +55,84 @@ void args_init(int argc, char* argv[])
g_argv = argv; g_argv = argv;
} }
char *gamedetect_argv_buffer[1024];
void gamedetect_found_game(char *game, char *path)
{
int argc;
static char buf[128];
if(g_argv == gamedetect_argv_buffer)
return;
globalOutputStream() << "Detected game " << game << " in " << path << "\n";
sprintf(buf, "-%s-EnginePath", game);
argc = 0;
gamedetect_argv_buffer[argc++] = "-global-gamefile";
gamedetect_argv_buffer[argc++] = game;
gamedetect_argv_buffer[argc++] = buf;
gamedetect_argv_buffer[argc++] = path;
if((size_t) (argc + g_argc) >= sizeof(gamedetect_argv_buffer) / sizeof(*gamedetect_argv_buffer) - 1)
g_argc = sizeof(gamedetect_argv_buffer) / sizeof(*gamedetect_argv_buffer) - g_argc - 1;
memcpy(gamedetect_argv_buffer + 4, g_argv, sizeof(*gamedetect_argv_buffer) * g_argc);
g_argc += argc;
g_argv = gamedetect_argv_buffer;
}
void gamedetect()
{
// if we're inside a Nexuiz install
// default to nexuiz.game (unless the user used an option to inhibit this)
bool nogamedetect = false;
int i;
for(i = 1; i < g_argc - 1; ++i)
if(g_argv[i][0] == '-')
{
if(!strcmp(g_argv[i], "-gamedetect"))
nogamedetect = !strcmp(g_argv[i+1], "false");
++i;
}
if(!nogamedetect)
{
static char buf[1024 + 64];
strncpy(buf, environment_get_app_path(), sizeof(buf));
buf[sizeof(buf) - 1 - 64] = 0;
if(!strlen(buf))
return;
char *p = buf + strlen(buf) - 1; // point directly on the slash of get_app_path
while(p != buf)
{
// TODO add more games to this
// try to detect Nexuiz installs
strcpy(p, "/data/common-spog.pk3");
globalOutputStream() << "Checking for a game file in " << buf << "\n";
if(file_exists(buf))
{
#if defined(WIN32)
strcpy(p, "/nexuiz.exe");
#elif defined(__APPLE__)
strcpy(p, "/Nexuiz.app/Contents/Info.plist");
#else
strcpy(p, "/nexuiz-linux-glx.sh");
#endif
if(file_exists(buf))
{
p[1] = 0;
gamedetect_found_game("nexuiz.game", buf);
return;
}
}
// we found nothing
// go backwards
--p;
while(p != buf && *p != '/')
--p;
}
}
}
namespace namespace
{ {
CopiedString home_path; CopiedString home_path;
@ -145,6 +223,7 @@ void environment_init(int argc, char* argv[])
app_path = getexename(real); app_path = getexename(real);
ASSERT_MESSAGE(!string_empty(app_path.c_str()), "failed to deduce app path"); ASSERT_MESSAGE(!string_empty(app_path.c_str()), "failed to deduce app path");
} }
gamedetect();
} }
#elif defined(WIN32) #elif defined(WIN32)
@ -190,6 +269,7 @@ void environment_init(int argc, char* argv[])
app << PathCleaned(filename); app << PathCleaned(filename);
app_path = app.c_str(); app_path = app.c_str();
} }
gamedetect();
} }
#else #else

View File

@ -9,31 +9,6 @@ export PANGO_RC_FILE="$MY_DIRECTORY/Contents/MacOS/install/pangorc"
export GDK_PIXBUF_MODULE_FILE="$MY_DIRECTORY/Contents/MacOS/install/gdk-pixbuf.loaders" export GDK_PIXBUF_MODULE_FILE="$MY_DIRECTORY/Contents/MacOS/install/gdk-pixbuf.loaders"
cd "$MY_DIRECTORY/Contents/MacOS/install" cd "$MY_DIRECTORY/Contents/MacOS/install"
# autodetect nexuiz installs
NEX_DIRECTORY="/${MY_DIRECTORY%/*}"
while :; do
if [ -z "$NEX_DIRECTORY" ]; then
break
fi
if [ -f "$NEX_DIRECTORY/data/common-spog.pk3" ]; then
if [ -d "$NEX_DIRECTORY/Nexuiz.app" ]; then
break
fi
fi
NEX_DIRECTORY=${NEX_DIRECTORY%/*}
done
case "$NEX_DIRECTORY" in
//*)
NEX_DIRECTORY=${NEX_DIRECTORY#/}
set -- -global-gamefile nexuiz.game -nexuiz.game-EnginePath "$NEX_DIRECTORY/"
# -global-gamePrompt false?
;;
*)
set --
;;
esac
if [ -x /usr/bin/open-x11 ]; then if [ -x /usr/bin/open-x11 ]; then
/usr/bin/open-x11 ./radiant.ppc "$@" & /usr/bin/open-x11 ./radiant.ppc "$@" &
else else