Jump to content

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


Recommended Posts

Posted

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.

Posted

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

Posted

In both multi player and single player it fails at the license/splash screen using various compression levels, including 0. The splash screen exists outside of the gob, in /base/media

Posted

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
DarthValeria and Smoo like this
Posted

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.

Posted

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
  • 2 weeks later...
Posted

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
Posted

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.

JKA LAN party with mods certainly sounds fun, god's speed to you!

DarthValeria likes this
  • 4 years later...
Posted
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.

  • 1 year later...
Posted

I would love for someone to continue this project. We need a working GOBconver.exe script so that XBOX can see repackaged files. Hope for the best 🙂

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...