Failing To Configure The Portmaster Quake3 Menu Screen On The Rgcubexx

[ ]

TL;DR - I couldn’t do it. It needs an engine patch. This does at least explain what I tried before concluding that and confirms the correct way to change the config, as far as that goes.

The Portmaster version of Quake 3 is the Quake 3e port. It works well on the RGCubeXX (incidentally, my favourite of many inexpensive Chinese emulation handhelds I’ve owned) once you get into the game itself. However, this is a pain to do because the right hand side of the main menu is off-screen when the game loads. Getting the menu to display properly when using non-standard resolutions is a problem going back to the original release; it’s just particularly bad on the RGCubeXX’s square screen.

How to change the config

Main config file

This isn’t well documented and 90% of the reason for writing this post. The takeaway is that changing the config works the same as with previous/other ports, just with a slightly different file path. Starting in the directory where Portmaster keeps its ports, the main config file is stored in:

/quake3/conf/.q3a/baseq3

Note that, unlike the original Quake release, this is not the same directory as where the .pk3 files (game data) are stored. When the port is initially installed, the main config - quake3.cfg - looks like this:

// generated by quake, do not modify
unbindall
bind ESCAPE "togglemenu"
bind SPACE "+movedown"
bind + "sizeup"
bind - "sizedown"
bind 0 "weapon 10"
bind = "sizeup"
bind \ "+mlook"
bind _ "sizedown"
bind ` "toggleconsole"
bind b "+moveup"
bind h "centerview"
bind i "+scores"
bind j "weapprev"
bind k "+button3"
bind l "weapnext"
bind m "weapprev"
bind n "weapnext"
bind x "+button2"
bind y "+speed"
bind 0x7e "toggleconsole"
bind PAUSE "pause"
bind UPARROW "+forward"
bind DOWNARROW "+back"
bind LEFTARROW "+moveleft"
bind RIGHTARROW "+moveright"
bind F1 "vote yes"
bind F2 "vote no"
bind F3 "ui_teamorders"
bind F11 "screenshot"
bind MOUSE1 "+attack"
bind MOUSE2 "+zoom"

After the game has been run for the first time, it looks like this:

// generated by quake, do not modify
unbindall
bind ESCAPE "togglemenu"
bind SPACE "+movedown"
bind + "sizeup"
bind - "sizedown"
bind 0 "weapon 10"
bind = "sizeup"
bind \ "+mlook"
bind _ "sizedown"
bind ` "toggleconsole"
bind b "+moveup"
bind h "centerview"
bind i "+scores"
bind j "weapprev"
bind k "+button3"
bind l "weapnext"
bind m "weapprev"
bind n "weapnext"
bind x "+button2"
bind y "+speed"
bind 0x7e "toggleconsole"
bind PAUSE "pause"
bind UPARROW "+forward"
bind DOWNARROW "+back"
bind LEFTARROW "+moveleft"
bind RIGHTARROW "+moveright"
bind F1 "vote yes"
bind F2 "vote no"
bind F3 "ui_teamorders"
bind F11 "screenshot"
bind MOUSE1 "+attack"
bind MOUSE2 "+zoom"
seta capturelimit "0"
seta cg_autoswitch "1"
seta cg_bobpitch "0.002"
seta cg_bobroll "0.002"
seta cg_brassTime "2500"
seta cg_cameraOrbitDelay "50"
seta cg_crosshairHealth "1"
seta cg_crosshairSize "24"
seta cg_crosshairX "0"
seta cg_crosshairY "0"
seta cg_deferPlayers "1"
seta cg_draw2D "1"
seta cg_draw3dIcons "1"
seta cg_drawAmmoWarning "1"
seta cg_drawAttacker "1"
seta cg_drawCrosshair "4"
seta cg_drawCrosshairNames "1"
seta cg_drawFPS "0"
seta cg_drawFriend "1"
seta cg_drawGun "1"
seta cg_drawIcons "1"
seta cg_drawRewards "1"
seta cg_drawSnapshot "0"
seta cg_drawStatus "1"
seta cg_drawTeamOverlay "0"
seta cg_drawTimer "0"
seta cg_forceModel "0"
seta cg_fov "90"
seta cg_gibs "1"
seta cg_lagometer "1"
seta cg_marks "1"
seta cg_noProjectileTrail "0"
seta cg_noTaunt "0"
seta cg_noVoiceChats "0"
seta cg_noVoiceText "0"
seta cg_oldPlasma "1"
seta cg_oldRail "1"
seta cg_oldRocket "1"
seta cg_predictItems "1"
seta cg_railTrailTime "400"
seta cg_runpitch "0.002"
seta cg_runroll "0.005"
seta cg_scorePlums "1"
seta cg_shadows "1"
seta cg_simpleItems "0"
seta cg_smoothClients "0"
seta cg_stereoSeparation "0"
seta cg_teamChatHeight "0"
seta cg_teamChatTime "3000"
seta cg_teamChatsOnly "0"
seta cg_trueLightning "0.0"
seta cg_zoomfov "22.5"
seta cl_autoRecordDemo "0"
seta cl_aviFrameRate "25"
seta cl_aviMotionJpeg "1"
seta cl_aviPipeFormat "-preset medium -crf 23 -vcodec libx264 -flags +cgop -pix_fmt yuv420p -bf 2 -codec:a aac -strict -2 -b:a 160k -r:a 22050 -movflags faststart"
seta cl_consoleKeys "~ ` 0x7e 0x60"
seta cl_maxpackets "60"
seta color1 "4"
seta color2 "5"
seta com_hunkMegs "128"
seta com_introplayed "1"
seta com_skipIdLogo "0"
seta com_soundMegs "8"
seta com_zoneMegs "12"
seta dmflags "0"
seta fraglimit "20"
seta g_allowVote "1"
seta g_banIPs ""
seta g_filterBan "1"
seta g_friendlyfire "0"
seta g_log "games.log"
seta g_logSync "0"
seta g_maxGameClients "0"
seta g_spAwards ""
seta g_spScores1 ""
seta g_spScores2 ""
seta g_spScores3 ""
seta g_spScores4 ""
seta g_spScores5 ""
seta g_spSkill "2"
seta g_spVideos ""
seta g_teamAutoJoin "0"
seta g_teamForceBalance "0"
seta g_warmup "20"
seta in_keyboardDebug "0"
seta in_mouse "1"
seta r_customHeight "1024"
seta r_customWidth "1600"
seta r_dlightMode "0"
seta r_dynamiclight "1"
seta r_fullscreen "1"
seta r_mode "-2"
seta r_modeFullscreen "-2"
seta r_neatsky "0"
seta r_nomip "0"
seta r_picmip "1"
seta r_stereoEnabled "0"
seta r_textureMode "GL_LINEAR_MIPMAP_NEAREST"
seta r_vertexLight "0"
seta rate "25000"
seta s_musicvolume "0.25"
seta s_muteWhenMinimized "1"
seta s_muteWhenUnfocused "1"
seta s_volume "0.8"
seta sensitivity "10"
seta server1 ""
seta server10 ""
seta server11 ""
seta server12 ""
seta server13 ""
seta server14 ""
seta server15 ""
seta server16 ""
seta server2 ""
seta server3 ""
seta server4 ""
seta server5 ""
seta server6 ""
seta server7 ""
seta server8 ""
seta server9 ""
seta snaps "40"
seta sv_dlRate "100"
seta sv_dlURL ""
seta sv_filter "filter.txt"
seta sv_floodProtect "1"
seta sv_hostname "noname"
seta sv_maxclients "8"
seta sv_maxclientsPerIP "3"
seta timelimit "0"
seta ttycon_ansicolor "0"
seta ui_bigFont "0.4"
seta ui_browserGameType "0"
seta ui_browserMaster "0"
seta ui_browserShowEmpty "1"
seta ui_browserShowFull "1"
seta ui_browserSortKey "4"
seta ui_ctf_capturelimit "8"
seta ui_ctf_friendly "0"
seta ui_ctf_timelimit "30"
seta ui_ffa_fraglimit "20"
seta ui_ffa_timelimit "0"
seta ui_smallFont "0.25"
seta ui_team_fraglimit "0"
seta ui_team_friendly "1"
seta ui_team_timelimit "20"
seta ui_tourney_fraglimit "0"
seta ui_tourney_timelimit "15"
seta vid_xpos "3"
seta vid_ypos "22"
seta vm_cgame "2"
seta vm_game "2"
seta vm_ui "2"

It’s not completely clear what is going on here. The resolution is far too high for the RGCubeXX’s screen but the game displays very well (properly proportioned, sharp) once you find your way past the menu (you can find the off-screen buttons, and therefore start a game, by listening for the beep as the cursor hovers over them). It’s probably a combination of these settings, causing the game to fit to the available screen space:

seta r_fullscreen "1"
seta r_mode "-2"
seta r_modeFullscreen "-2"

It’s also worth noting that not only does the resolution in quake3.cfg not match the one you actually get, it doesn’t match the one you see in the setup menu (640x480).

autoexec.cfg

The conventional way to change the game config - other than via the menu or the console - was to create an autoexec.cfg file in the game’s baseq3 directory. Note that the main config file has a comment stating it shouldn’t be edited and we know that the game (over-)writes at least some of the file when it is started. Using an autoexec.cfg file prevents changes being overwritten by the game.

The Portmaster port has two directories called baseq3 : the one with quake3.cfg and the one with the .pk3 files. For an autoexec.cfg file to be picked up it must go in the same directory as the main config. This probably seems obvious but, because of whatever wizardry which causes the game to display well irrespective of what is in quake3.cfg, it isn’t obvious that putting it in either baseq3 directory has any effect on the game’s settings. However, the correct location can be proven by creating:

/quake3/conf/.q3a/baseq3/autoexec.cfg

…and including the following:

seta r_mode "-1"
seta r_customwidth "320"
seta r_customheight "240"
seta r_aspectRatio "0"
seta r_gamma "2.0"
seta r_picmip "10"

vid_restart

This makes the game look terrible but it proves the settings are being picked up. Note that ending the file with vid_restart is critical.

Unfortunately, the following config, which is a kitchen-sink approach to fixing the menu problem, has no effect whatsoever:

seta r_mode "-1"
seta r_modeFullscreen ""
seta r_customwidth "640"
seta r_customheight "480"
seta r_fullscreen "1"
seta r_picmip "1"
seta r_gamma "1.2"
vid_restart

So there is no way of fixing this without attacking the engine in some way.