Jump to content

Vicarious Visions GOB Tools (Editing the console version of the game!)


Recommended Posts

Not officially. If you're running a JTAG/RGH modded system you can get some unofficial updates installed. I no longer play online with my 360 since I have an Xbox One, so I went ahead and made it modded. It's nice because my kids like to try and get all my game discs. This way they sit in a bin under our bed in our room, and everything runs off the hard drive.

Link to comment

Still waiting for the TV to be free (family is using it now), but I realized something. There may be checksums on the gob, particularly in MP. I found references to such in the original MP source, so odds are if mods are available it may be SP only as we shouldn't compile new executables.

 

***EDIT***

 

Ran the SP executable this time. I got to the splash screen at least before locking up. I'll look at the SP source again. Problem is that it is far more modified than MP from where we seemingly were doing some tests on 360. Still, it looks like they were aiming to run gobs, so maybe that code is untouched. I'll look to see if there's some checksum against the gob

Link to comment

That would mean it's failing anywhere in this chunk of code:

 

 

        Cmd_Init ();
        Cvar_Init ();

        // get the commandline cvars set
        Com_StartupVariable( NULL );

        // done early so bind command exists
        CL_InitKeyCommands();

#ifdef _XBOX
        extern void Sys_FilecodeScan_f();
        Sys_InitFileCodes();
        Cmd_AddCommand("filecodes", Sys_FilecodeScan_f);

        extern void Sys_StreamInit();
        Sys_StreamInit();

        // This just forces the static singleton in the function to call
        // its constructor, which allocates a stupid 12 byte block of
        // memory that never gets freed. Otherwise, it ends up stranded in
        // the middle of the zone:
        TheGhoul2InfoArray();
#endif

        FS_InitFilesystem ();    //uses z_malloc
        R_InitWorldEffects();   // this doesn't do much but I want to be sure certain variables are intialized.
        
        Cbuf_AddText ("exec default.cfg\n");

        // skip the jaconfig.cfg if "safe" is on the command line
        if ( !Com_SafeMode() ) {
            Cbuf_AddText ("exec jaconfig.cfg\n");
        }

        Cbuf_AddText ("exec autoexec.cfg\n");
        
        Cbuf_Execute ();

        // override anything from the config files with command line args
        Com_StartupVariable( NULL );
        
        // allocate the stack based hunk allocator
        Com_InitHunkMemory();

        // if any archived cvars are modified after this, we will trigger a writing
        // of the config file
        cvar_modifiedFlags &= ~CVAR_ARCHIVE;
        
        //
        // init commands and vars
        //
        Cmd_AddCommand ("quit", Com_Quit_f);
        Cmd_AddCommand ("writeconfig", Com_WriteConfig_f );
        
        com_maxfps = Cvar_Get ("com_maxfps", "85", CVAR_ARCHIVE);
        
        com_developer = Cvar_Get ("developer", "0", CVAR_TEMP );
        com_logfile = Cvar_Get ("logfile", "0", CVAR_TEMP );
        com_speedslog = Cvar_Get ("speedslog", "0", CVAR_TEMP );
        
        com_timescale = Cvar_Get ("timescale", "1", CVAR_CHEAT );
        com_fixedtime = Cvar_Get ("fixedtime", "0", CVAR_CHEAT);
        com_showtrace = Cvar_Get ("com_showtrace", "0", CVAR_CHEAT);
        com_terrainPhysics = Cvar_Get ("com_terrainPhysics", "1", CVAR_CHEAT);
        com_viewlog = Cvar_Get( "viewlog", "0", CVAR_TEMP );
        com_speeds = Cvar_Get ("com_speeds", "0", 0);
        
#ifdef G2_PERFORMANCE_ANALYSIS
        com_G2Report = Cvar_Get("com_G2Report", "0", 0);
#endif

        cl_paused       = Cvar_Get ("cl_paused", "0", CVAR_ROM);
        sv_paused       = Cvar_Get ("sv_paused", "0", CVAR_ROM);
        com_sv_running = Cvar_Get ("sv_running", "0", CVAR_ROM);
        com_cl_running = Cvar_Get ("cl_running", "0", CVAR_ROM);
        com_skippingcin = Cvar_Get ("skippingCinematic", "0", CVAR_ROM);
        com_buildScript = Cvar_Get( "com_buildScript", "0", 0 );
        
        if ( com_developer && com_developer->integer ) {
            Cmd_AddCommand ("error", Com_Error_f);
            Cmd_AddCommand ("crash", Com_Crash_f );
            Cmd_AddCommand ("freeze", Com_Freeze_f);
        }
        
        s = va("%s %s %s", Q3_VERSION, CPUSTRING, __DATE__ );
        com_version = Cvar_Get ("version", s, CVAR_ROM | CVAR_SERVERINFO );


        // So any controller can skip the logo movies:
        inSplashMenu = Cvar_Get( "inSplashMenu", "1", 0 );
        controllerOut= Cvar_Get( "ControllerOutNum", "-1", 0);

#ifdef XBOX_DEMO
        // Cvar used to hide "QUIT TO DEMOS MENU" options if we weren't started by CDX
        extern bool demoLaunchDataValid;
        if( demoLaunchDataValid )
            Cvar_SetValue( "ui_allowDemoQuit", 1 );
        else
            Cvar_SetValue( "ui_allowDemoQuit", 0 );
#endif

        SE_Init();    // Initialize StringEd
    
        Sys_Init();    // this also detects CPU type, so I can now do this CPU check below...

        Netchan_Init( Com_Milliseconds() & 0xffff );    // pick a port value that should be nice and random
//    VM_Init();
        SV_Init();
        
        CL_Init();

#ifdef _XBOX
        // Experiment. Sound memory never gets freed, move it earlier. This
        // will also let us play movies sooner, if we need to.
        extern void CL_StartSound(void);
        CL_StartSound();
#endif

        Sys_ShowConsole( com_viewlog->integer, qfalse );
        
        // set com_frameTime so that if a map is started on the
        // command line it will still be able to count on com_frameTime
        // being random enough for a serverid
        com_frameTime = Com_Milliseconds();

        // add + commands from command line
#ifndef _XBOX
        if ( !Com_AddStartupCommands() ) {
#ifdef NDEBUG
            // if the user didn't give any commands, run default action
//            if ( !com_dedicated->integer )
            {
                Cbuf_AddText ("cinematic openinglogos\n");
//                if( !com_introPlayed->integer ) {
//                    Cvar_Set( com_introPlayed->name, "1" );
//                    Cvar_Set( "nextmap", "cinematic intro" );
//                }
            }
#endif    
        }
#endif
Smoo and DarthValeria like this
Link to comment

So I did a really basic experiment just now -- I swapped the GFC/GOB names so that assets.gfc/.gob became assets_mp.gfc/.gob and vice versa. Both the SP and MP executables loaded just fine. I had previously checked if they shared the same .gfc/.gob by deleting one or the other, and I can also confirm that they do indeed rely on their individual sets. The SP xbe (XBox Executable) loads assets.gob and MP loads assets_mp.gob. Basically this leads me to believe that there's not some sort of check to ensure it's the original container for that executable, but that the problem must be elsewhere.

 

I can understand if you're bored with this though. If you are would you mind passing the source along? If not I'll do some more thinking to try and help resolve the issue.

Link to comment

So I did a really basic experiment just now -- I swapped the GFC/GOB names so that assets.gfc/.gob became assets_mp.gfc/.gob and vice versa. Both the SP and MP executables loaded just fine. I had previously checked if they shared the same .gfc/.gob by deleting one or the other, and I can also confirm that they do indeed rely on their individual sets. The SP xbe (XBox Executable) loads assets.gob and MP loads assets_mp.gob. Basically this leads me to believe that there's not some sort of check to ensure it's the original container for that executable, but that the problem must be elsewhere.

 

I can understand if you're bored with this though. If you are would you mind passing the source along? If not I'll do some more thinking to try and help resolve the issue.

Not bored, I'm just unsure of how to proceed. I looked in the source code pretty extensively and I wasn't able to find any sort of issue indicating the problem. But I can provide the source code, sure.

Teancum likes this
Link to comment
  • 2 weeks later...

The main reason I was hoping to do it was that my family and friends are all console gamers. When we get together we can carry just a few Xbox consoles and 8 controllers in a bag, hook them up to 2 TVs, and instantly have an 8 player battle.

RAILBACK likes this
Link to comment
  • 4 years later...
1 hour ago, TomArrow said:

Hi, I'm getting an error with gobextract:

[gobextract.cpp:151]: Not enough memory to perform operation.

What could this mean?

This is a RAM issue, which can occur when a process takes up too much memory. If you have 4 or 8 GB of RAM, you need to upgrade.

Link to comment
  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...