From 4a289894ef5cf2c6c8330b11754922465bfd314a Mon Sep 17 00:00:00 2001 From: Human Gamer <39096122+HumanGamer@users.noreply.github.com> Date: Sat, 30 Mar 2024 16:49:58 -0500 Subject: [PATCH] Fixed missing help text on Frictional Concerns and -editor mode not working --- engine/source/console/consoleFunctions.cpp | 25 ++ engine/source/gui/controls/guiBitmapCtrl.cpp | 6 +- engine/source/gui/controls/guiBitmapCtrl.h | 1 + game/MBU.torsion | 4 +- game/MBU.torsion.exports | 266 +++++++++++++++--- game/marble/client/defaults.cs | 6 +- game/marble/client/init.cs | 13 +- game/marble/client/ui/esrbGui.gui | 6 + game/marble/client/ui/mainMenuGui.gui | 55 +++- .../data/missions/beginner/friction.zip | Bin 32582 -> 32602 bytes 10 files changed, 333 insertions(+), 49 deletions(-) diff --git a/engine/source/console/consoleFunctions.cpp b/engine/source/console/consoleFunctions.cpp index a8c9f077..3813b1cc 100644 --- a/engine/source/console/consoleFunctions.cpp +++ b/engine/source/console/consoleFunctions.cpp @@ -16,6 +16,7 @@ #include "core/units.h" #include "console/arrayObject.h" #include +#include // This is a temporary hack to get tools using the library to // link in this module which contains no other references. @@ -1641,3 +1642,27 @@ ConsoleFunction(regexReplace, const char*, 4, 4, "regexMatch(testString, pattern return argv[1]; } } + +ConsoleFunction(getDayNum, const char*, 1, 1, "getDayNum();") { + time_t now = time(0); + struct tm* timeinfo = localtime(&now); + char* ret = Con::getReturnBuffer(20); + dSprintf(ret, 20, "%d", timeinfo->tm_mday); + return ret; +} + +ConsoleFunction(getMonthNum, const char*, 1, 1, "getMonthNum();") { + time_t now = time(0); + struct tm* timeinfo = localtime(&now); + char* ret = Con::getReturnBuffer(20); + dSprintf(ret, 20, "%d", (timeinfo->tm_mon) + 1); + return ret; +} + +ConsoleFunction(getYearNum, const char*, 1, 1, "getYearNum();") { + time_t now = time(0); + struct tm* timeinfo = localtime(&now); + char* ret = Con::getReturnBuffer(20); + dSprintf(ret, 20, "%d", (timeinfo->tm_year) + 1900); + return ret; +} diff --git a/engine/source/gui/controls/guiBitmapCtrl.cpp b/engine/source/gui/controls/guiBitmapCtrl.cpp index 4c34a119..61addeb9 100644 --- a/engine/source/gui/controls/guiBitmapCtrl.cpp +++ b/engine/source/gui/controls/guiBitmapCtrl.cpp @@ -16,6 +16,7 @@ GuiBitmapCtrl::GuiBitmapCtrl(void) mBitmapName = StringTable->insert(""); startPoint.set(0, 0); mWrap = false; + flipY = false; mTextureObject = NULL; mOnMouseUpCommand = StringTable->insert(""); } @@ -28,6 +29,7 @@ void GuiBitmapCtrl::initPersistFields() addField("bitmap", TypeFilename, Offset(mBitmapName, GuiBitmapCtrl)); addField("wrap", TypeBool, Offset(mWrap, GuiBitmapCtrl)); addField("onMouseUp", TypeString, Offset(mOnMouseUpCommand, GuiBitmapCtrl)); + addField("flipY", TypeBool, Offset(flipY, GuiBitmapCtrl)); endGroup("Misc"); } @@ -143,14 +145,14 @@ void GuiBitmapCtrl::onRender(Point2I offset, const RectI& updateRect) ((texture->mBitmapSize.y * y) + offset.y) - yshift, texture->mBitmapSize.x, texture->mBitmapSize.y); - GFX->drawBitmapStretchSR(texture, dstRegion, srcRegion); + GFX->drawBitmapStretchSR(texture, dstRegion, srcRegion, flipY ? GFXBitmapFlip_Y : GFXBitmapFlip_None); } } else { RectI rect(offset, mBounds.extent); - GFX->drawBitmapStretch(mTextureObject, rect); + GFX->drawBitmapStretch(mTextureObject, rect, flipY ? GFXBitmapFlip_Y : GFXBitmapFlip_None); } } diff --git a/engine/source/gui/controls/guiBitmapCtrl.h b/engine/source/gui/controls/guiBitmapCtrl.h index f371a37f..b7f170e7 100644 --- a/engine/source/gui/controls/guiBitmapCtrl.h +++ b/engine/source/gui/controls/guiBitmapCtrl.h @@ -22,6 +22,7 @@ class GuiBitmapCtrl : public GuiControl GFXTexHandle mTextureObject; Point2I startPoint; bool mWrap; + bool flipY; public: //creation methods diff --git a/game/MBU.torsion b/game/MBU.torsion index d299954b..78f5f88d 100644 --- a/game/MBU.torsion +++ b/game/MBU.torsion @@ -11,7 +11,7 @@ Debug x86 MBUltra_DEBUG.exe - true + false true true false @@ -19,7 +19,7 @@ Release x86 MBUltra.exe - true + false true true false diff --git a/game/MBU.torsion.exports b/game/MBU.torsion.exports index 9d2aaabb..e5315bc3 100644 --- a/game/MBU.torsion.exports +++ b/game/MBU.torsion.exports @@ -132,6 +132,54 @@ Stop moving. + ArrayObject + SimObject + addEntry + %entry + + clear + + contains + %entry + + containsEntry + %entry + + dumpEntries + + getEntry + %index + + getEntryByIndex + %index + + getSize + + insertEntryBefore + %index, %entry + + removeEntriesByContents + %match + + removeEntry + %index + + removeEntryByIndex + %index + + removeMatching + %match + + replaceEntryByIndex + %index, %entry + + sort + %compareFn + + swap + %index1, %index2 + + BanList SimObject add @@ -241,7 +289,7 @@ CubemapData SimObject cubeFace - filename cubeFace + string cubeFace dynamic bool dynamic @@ -627,6 +675,10 @@ float times + FastFileAcknowledgeEvent + + FastFileRequestEvent + FileChunkEvent FileDownloadRequestEvent @@ -1541,8 +1593,33 @@ GuiAchievementPopupCtrl GuiControl - bitmap - filename bitmap + setBackground + string filename + Set the background bitmap displayed in the control. + + setHeader + string title + Set the title of the achievement. + + setIcon + string filename + Set the icon bitmap displayed in the control. Note that it is limited in size, to 256x256. + + setTitle + string title + Set the title of the achievement. + + background + filename background + + header + string header + + icon + filename icon + + title + string title GuiArrayCtrl @@ -1956,6 +2033,9 @@ fontCharset enumval fontCharset + fontCharset2 + enumval fontCharset2 + fontColor ColorI fontColor @@ -1980,9 +2060,15 @@ fontSize int fontSize + fontSize2 + int fontSize2 + fontType string fontType + fontType2 + string fontType2 + hitArea intList hitArea @@ -3329,12 +3415,63 @@ More of a helper function than anything. If console access to the field list i HTTPObject - TCPObject + SimObject + addHeader + name, value + get - TransportAddress addr, string requirstURI, string query=NULL + IE: "www.garagegames.com:80" + . +@param requirstURI Specific location on the server to access (IE: "index.php".) +@param query Optional. Actual data to transmit to the server. Can be anything required providing it sticks with limitations of the HTTP protocol. If you were building the URL manually, this is the text that follows the question mark. For example: http://www.google.com/ig/api?<b>weather=Las-Vegas,US</b> +@tsexample +// Create an HTTP object for communications +%httpObj = new HTTPObject(); + +// Specify a URL to transmit to +%url = "www.garagegames.com:80"; + +// Specify a URI to communicate with +%URI = "/index.php"; + +// Specify a query to send. +%query = ""; + +// Send the GET command to the server +%httpObj.get(%url,%URI,%query); +@endtsexample post - TransportAddress addr, string requestURI, string query, string post + IE: "www.garagegames.com:80" + . +@param requirstURI Specific location on the server to access (IE: "index.php".) +@param query Actual data to transmit to the server. Can be anything required providing it sticks with limitations of the HTTP protocol. +@param post Submission data to be processed. +@tsexample +// Create an HTTP object for communications +%httpObj = new HTTPObject(); + +// Specify a URL to transmit to +%url = "www.garagegames.com:80"; + +// Specify a URI to communicate with +%URI = "/index.php"; + +// Specify a query to send. +%query = ""; + +// Specify the submission data. +%post = ""; + +// Send the POST command to the server +%httpObj.POST(%url,%URI,%query,%post); +@endtsexample + + setDownloadPath + path + + setOption + option, value InteriorInstance @@ -3466,6 +3603,9 @@ More of a helper function than anything. If console access to the field list i bool sticky + JSONObject + SimObject + LangTable SimObject addLanguage @@ -3539,6 +3679,9 @@ More of a helper function than anything. If console access to the field list i setPad pad + setPhysics + physics + setPosition transform, mouseY @@ -3556,6 +3699,9 @@ More of a helper function than anything. If console access to the field list i Controllable bool Controllable + size + float size + MarbleData ShapeBaseData @@ -3664,9 +3810,6 @@ More of a helper function than anything. If console access to the field list i RollMegaSound SFXProfile RollMegaSound - size - float size - SlipSound SFXProfile SlipSound @@ -3707,13 +3850,13 @@ More of a helper function than anything. If console access to the field list i bool attenuateBackFace baseTex - filename baseTex + string baseTex breakable bool breakable bumpTex - filename bumpTex + string bumpTex castsShadow bool castsShadow @@ -3725,7 +3868,7 @@ More of a helper function than anything. If console access to the field list i string cubemap detailTex - filename detailTex + string detailTex diffuse ColorF diffuse @@ -3740,7 +3883,7 @@ More of a helper function than anything. If console access to the field list i bool emissive envTex - filename envTex + string envTex exposure int exposure @@ -3758,7 +3901,7 @@ More of a helper function than anything. If console access to the field list i string mapTo noiseTexFileName - filename noiseTexFileName + string noiseTexFileName pixelSpecular bool pixelSpecular @@ -3943,6 +4086,9 @@ More of a helper function than anything. If console access to the field list i relayConnection ip + requestFileDownload + path + resolveGhostID S32 ghostID Convert a ghost id from this connection to a real id. @@ -4974,13 +5120,13 @@ More of a helper function than anything. If console access to the field list i Rebuilds both the vertex and pixel shaders. DXPixelShaderFile - filename DXPixelShaderFile + string DXPixelShaderFile DXVertexShaderFile string DXVertexShaderFile OGLPixelShaderFile - filename OGLPixelShaderFile + string OGLPixelShaderFile OGLVertexShaderFile string OGLVertexShaderFile @@ -6285,6 +6431,9 @@ More of a helper function than anything. If console access to the field list i TSStatic SceneObject + collisionType + enumval collisionType + customAmbientLighting ColorF customAmbientLighting @@ -6813,6 +6962,9 @@ More of a helper function than anything. If console access to the field list i allowConnections bool + Array + [name, obj1, ...] + backtrace Print the call stack. @@ -6836,7 +6988,7 @@ More of a helper function than anything. If console access to the field list i checkForPDLC cleanDetailManager - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) clearClientPaths @@ -6905,6 +7057,12 @@ If exempt is specified, then it is temporarily excluded from collision checks (F ContentQuery [contentCategory] + convertAssimp + path + + convertCollada + path + countBits count the number of bits in the specified 32 bit integer @@ -6925,7 +7083,7 @@ If exempt is specified, then it is temporarily excluded from collision checks (F packageName debug - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) deleteDataBlocks Delete all the datablocks we've downloaded. This is usually done in preparation of downloading a new set of datablocks, such as occurs on a mission change, but it's also good post-mission cleanup. @@ -6970,26 +7128,26 @@ If filePath is , this function writes the resource descriptions to the console dumpMemSnapshot string fileName Dump a snapshot of current memory to a file. -(only exists in Debug x86, Debug x64) +(only exists in Debug x64) dumpNetStats dumpNetStringTable - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) dumpProcessList dumpResourceStats Dump information about resources. Debug only! -(only exists in Debug x86, Debug x64) +(only exists in Debug x64) dumpTextureStats Dump texture manager statistics. Debug only! -(only exists in Debug x86, Debug x64) +(only exists in Debug x64) DumpUnflaggedAllocs filename [optional, if not specified dumps to console] - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) duplicateCachedFont oldFontName, oldFontSize, newFontName @@ -7015,6 +7173,9 @@ If filePath is , this function writes the resource descriptions to the consolesrc string, target string case insensitive + enumColladaForImport + string shapePath, GuiTreeViewCtrl ctrl + error text [, ... ] @@ -7073,7 +7234,7 @@ If filePath is , this function writes the resource descriptions to the consoletext FlagCurrentAllocs - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) flagCurrentGFXResources @@ -7110,6 +7271,8 @@ If filePath is , this function writes the resource descriptions to the console getCurrentActionMap + getDayNum + getDesktopResolution Get the width, height, and bitdepth of the screen. @@ -7158,11 +7321,13 @@ If filePath is , this function writes the resource descriptions to the console getLanguage getMaxFrameAllocation - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) getModPaths Return the mod paths the resource manager is using. + getMonthNum + getPixelShaderVersion Get pixel shader version. @@ -7330,6 +7495,12 @@ Sim time is time since the game started. inviteCode, acceptCb(%ip , rejectCb) + jsonParse + string json + + jsonPrint + value + lightScene script_function completeCallback=NULL, string mode="" Relight the scene. @@ -7343,8 +7514,14 @@ If mode is "forceAlways", the lightmaps will be regenerated regardless of whethe Filename file Read a chunk hierarchy from a file. + loadColladaLights + string filename, [parentGroup], [baseObject] + + loadMaterialJson + jsonFile + loadObjectsFromMission - mission, className, dataBlock + mission, className, dataBlock, missionGroup - Loads Objects from a Mission loadZip @@ -7593,6 +7770,12 @@ Possible parameters are: redbookStop Stop playing. + regexMatch + testString, pattern [, matches] + + regexReplace + regexMatch(testString, pattern, replacement); + registerLights reInitMaterials @@ -7672,13 +7855,16 @@ Valid inputs for xRumble/yRumble are [0 - 1]. fov - Set the FOV of the camera. + setImportSettings + ... + setInteriorFocusedDebug bool enable - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) setInteriorRenderMode int modeNum - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) setLogMode mode @@ -7716,7 +7902,7 @@ Valid inputs for xRumble/yRumble are [0 - 1]. bool f setVideoMode - width, height, bit depth, fullscreen + width, height, bit depth, fullscreen, [antialiasLevel] setWord text, index, replace @@ -7951,7 +8137,7 @@ Creates a new sound source using a profile or a description and filename and pla updateVideoMode ValidateMemory - (only exists in Debug x86, Debug x64) + (only exists in Debug x64) variablesExist wildCard @@ -8020,7 +8206,7 @@ Creates a new sound source using a profile or a description and filename and pla index, invited, callback XBLiveCreateHostedMatch - name, gamemode, mission, maxplayers, privateslots, callback + name, gamemode, mission, maxplayers, privateslots, joinSecret, callback XBLiveEndStatsSession @@ -8036,6 +8222,8 @@ Creates a new sound source using a profile or a description and filename and pla XBLiveGetMatchResultsEntry index + XBLiveGetPartyId + XBLiveGetSignInPort XBLiveGetStatValue @@ -8074,6 +8262,11 @@ Creates a new sound source using a profile or a description and filename and pla XBLiveLoadLeaderboard + XBLivePresenceStartTimer + [stopTime] + + XBLivePresenceStopTimer + XBLiveProbeLocalQoS callback @@ -8088,14 +8281,20 @@ Creates a new sound source using a profile or a description and filename and pla XBLiveRegisterRemoteTalker xbLiveId, address + XBLiveRespondJoinRequest + userId, reply + XBLiveSearchForMatches gamemode, mission, maxplayers, unknown, callback XBLiveSetEnabled enabled + XBLiveSetPartyId + partyId + XBLiveSetRichPresence - port, presence + port, presence, levelname, levelguid XBLiveSetSignInPort port @@ -8126,6 +8325,9 @@ Creates a new sound source using a profile or a description and filename and pla XBLiveUnregisterRemoteTalker xbLiveId + XBLiveUpdateHostedMatch + publicused, publicfree, privateused, privatefree, status, gamemode, mission, disablejip + XBLiveUpdateRemoteVoiceStatus xbLiveId, xbLiveVoice diff --git a/game/marble/client/defaults.cs b/game/marble/client/defaults.cs index df26b1c3..8bc8c7cd 100644 --- a/game/marble/client/defaults.cs +++ b/game/marble/client/defaults.cs @@ -17,6 +17,8 @@ $pref::ChatHudLength = 1; $pref::useStencilShadows = true; $pref::forceDirectConnect = false; +$pref::ForceSecretMode = false; +$Pref::DisableSecretMode = false; $pref::Input::LinkMouseSensitivity = 1; // DInput keyboard, mouse, and joystick prefs $pref::displayMPHelpText = false; @@ -116,8 +118,8 @@ $pref::SFX::channelVolume8 = 0.8; $pref::Client::AutoStart = true; -$pref::Client::AutoStartMission = "marble/data/missions/intermediate/Urban Jungle/urban.mis"; -$pref::Client::AutoStartMissionIndex = 21; +$Client::AutoStartMission = "marble/data/missions/intermediate/urban/urban.mis"; +$Client::AutoStartMissionIndex = 21; $Client::MatchMode = 0; // standard, 1 = ranked $Client::UseXBLiveMatchMaking = !isPCBuild(); diff --git a/game/marble/client/init.cs b/game/marble/client/init.cs index 1ffd0c00..cc9c52fa 100644 --- a/game/marble/client/init.cs +++ b/game/marble/client/init.cs @@ -69,6 +69,13 @@ function initClient() Canvas.setCursor("DefaultCursor"); else Canvas.hideCursor(); + + $secretMode = false; + if(getDayNum() == 1 && getMonthNum() == 4 || $pref::ForceSecretMode) + $secretMode = true; + + if ($Pref::DisableSecretMode && !$pref::ForceSecretMode) + $secretMode = false; // Loadup Misc client functions exec("./scripts/client.cs"); @@ -1127,7 +1134,7 @@ function createPreviewServer(%mission) { %serverType = "SinglePlayer"; if (%mission $= "") - %mission = $pref::Client::AutoStartMission; + %mission = $Client::AutoStartMission; if ($EnableFMS) { @@ -1177,13 +1184,13 @@ function createPreviewServer(%mission) if (%missionIndex == -1) { if (%mission $= "") - %mission = $pref::Client::AutoStartMission; + %mission = $Client::AutoStartMission; %missionIndex = GameMissionInfo.findIndexByPath(%mission); } // Teh hak - GameMissionInfo.selectMission($pref::Client::AutoStartMissionIndex); + GameMissionInfo.selectMission($Client::AutoStartMissionIndex); //GameMissionInfo.selectMission(%missionIndex); } else diff --git a/game/marble/client/ui/esrbGui.gui b/game/marble/client/ui/esrbGui.gui index 15daf813..60730ba3 100644 --- a/game/marble/client/ui/esrbGui.gui +++ b/game/marble/client/ui/esrbGui.gui @@ -57,6 +57,12 @@ function ESRBGui::show(%this) ESRBText.visible = true; else ESRBText.visible = false; + + if($secretMode) + ESRBlogo.flipY = true; + + if ($secretMode) + RootGui.setTitle("Clown Blast Ultra"); // if (isPCBuild() & isEnglish()) ESRBText.visible = true; diff --git a/game/marble/client/ui/mainMenuGui.gui b/game/marble/client/ui/mainMenuGui.gui index f7c6d1df..f5a3552d 100644 --- a/game/marble/client/ui/mainMenuGui.gui +++ b/game/marble/client/ui/mainMenuGui.gui @@ -87,7 +87,13 @@ function mainMenuGui::onA(%this) case 4: RootGui.setContent(HelpAndOptionsGui, MainMenuGui); case 5: // upsell - clientShowMarketplaceUI(); + if ($secretMode) + { + XMessagePopupDlg.show(0, "Sorry, the clowns are sleeping, please try again later...", "lulz", "clientShowMarketplaceUI();", ":(", "clientShowMarketplaceUI();"); + } else + { + clientShowMarketplaceUI(); + } case 6: // exit game in demo %this.exitGame(); } @@ -130,11 +136,31 @@ function MainMenuGui::show(%this) // add rows MainMenu.clear(); - MainMenu.addRow($Text::SinglePlayer, "", 0, 2); - MainMenu.addRow($Text::MultiPlayer, "", 20, 2); - MainMenu.addRow($Text::LeaderBoards, "", 0, 6); - MainMenu.addRow($Text::Achievements, "", 0, 6); - MainMenu.addRow($Text::HelpAndOptions, "", 0, 8); + + if ($secretMode) + MainMenu.addRow("Single Clowns", "", 0, 2); + else + MainMenu.addRow($Text::SinglePlayer, "", 0, 2); + + if ($secretMode) + MainMenu.addRow("Multiple Clowns", "", 20, 2); + else + MainMenu.addRow($Text::MultiPlayer, "", 20, 2); + + if ($secretMode) + MainMenu.addRow("Laundry Boards", "", 0, 6); + else + MainMenu.addRow($Text::LeaderBoards, "", 0, 6); + + if ($secretMode) + MainMenu.addRow("Sports Highlights", "", 0, 6); + else + MainMenu.addRow($Text::Achievements, "", 0, 6); + + if ($secretMode) + MainMenu.addRow("Help & Op- HELP CLOWNS", "", 0, 8); + else + MainMenu.addRow($Text::HelpAndOptions, "", 0, 8); // MarketPlace button always visible: if (isDemoLaunch()) @@ -150,9 +176,16 @@ function MainMenuGui::show(%this) } else { - MainMenu.addRow($Text::DownloadContent, "", 0, 2); + if ($secretMode) + MainMenu.addRow("dOwNlOaD MoAr cLoWnS?!", "", 0, 2); + else + MainMenu.addRow($Text::DownloadContent, "", 0, 2); } - MainMenu.addRow($Text::RTArcadeMenu, "", 0, 10); + + if ($secretMode) + MainMenu.addRow("Abandon Clowns", "", 0, 10); + else + MainMenu.addRow($Text::RTArcadeMenu, "", 0, 10); // disable some stuff //MainMenu.setRowEnabled(4,false); @@ -163,8 +196,14 @@ function MainMenuGui::show(%this) //RootGui.setTitle($Text::MainMenu @ $Test::CheatsEnabled); RootGui.setTitle("" @ $Test::CheatsEnabled); + if ($secretMode) + RootGui.setTitle("Clown Blast Ultra"); + glogo.visible = 1; + if($secretMode) + logo.flipY = true; + // Stat up the title music //if( xbHasPlaybackControl() && !xbIsPlayingMusic() ) // playMusic(); diff --git a/game/marble/data/missions/beginner/friction.zip b/game/marble/data/missions/beginner/friction.zip index a68a5e29315e140179808731ef35f4caf7f5be27..0e7f848fbe8b0a9e84b7511aa7355d4bb376c9fc 100644 GIT binary patch delta 1488 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