From fcb80a3ae065f1319ce7e1953cbcbd3bc57e405f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Tue, 7 Jan 2025 20:23:58 +0100 Subject: [PATCH 01/13] Moving more "goofy" features to another variable to keep the normal randomizer only to items and NPCs --- code/cgame/cg_draw.cpp | 10 +++++++++- code/cgame/cg_local.h | 1 + code/cgame/cg_main.cpp | 2 ++ code/game/wp_saber.cpp | 9 +++++---- code/randomizer/RandomizerUtils.cpp | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/code/cgame/cg_draw.cpp b/code/cgame/cg_draw.cpp index f216dfe..e27aafc 100644 --- a/code/cgame/cg_draw.cpp +++ b/code/cgame/cg_draw.cpp @@ -2344,7 +2344,15 @@ CG_DrawSeed static float CG_DrawSeed(float y) { if (cg_enableRandomizer.integer) { - const char* seed_string = va("Seed: %s", cg_setSeed.string); + char* seed_string; + if (cg_enableRandomizerEnhancements.integer) + { + seed_string = va("Seed (X): %s", cg_setSeed.string); + } + else + { + seed_string = va("Seed : %s", cg_setSeed.string); + } const int width = cgi_R_Font_StrLenPixels(seed_string, cgs.media.qhFontMedium, 1.0f); cgi_R_Font_DrawString(635 - width, y + 2, seed_string, colorTable[CT_LTGOLD1], cgs.media.qhFontMedium, -1, 1.0f); return y + BIGCHAR_HEIGHT + 10; diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index fd8b8ba..cf51749 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -695,6 +695,7 @@ extern vmCvar_t cg_strafeHelperColorSpeedA; //Additions for Randomizer extern vmCvar_t cg_enableRandomizer; +extern vmCvar_t cg_enableRandomizerEnhancements; extern vmCvar_t cg_drawSeed; extern vmCvar_t cg_setSeed; //Additions for Base Game fixes (ex : artus_mine crates to get all pickups) diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 45026c3..933e6b5 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -392,6 +392,7 @@ vmCvar_t cg_strafeHelperColorSpeedA; // Additions for Randomizer vmCvar_t cg_enableRandomizer; +vmCvar_t cg_enableRandomizerEnhancements; vmCvar_t cg_drawSeed; vmCvar_t cg_useSetSeed; vmCvar_t cg_setSeed; @@ -584,6 +585,7 @@ Ghoul2 Insert End // Additions for Randomizer { &cg_enableRandomizer, "cg_enableRandomizer", "0", CVAR_ARCHIVE }, // By default, it's disabled + { &cg_enableRandomizerEnhancements, "cg_enableRandomizerEnhancements", "0", CVAR_ARCHIVE }, // By default, it's disabled { &cg_drawSeed, "cg_drawSeed", "0", CVAR_ARCHIVE }, { &cg_useSetSeed, "cg_useSetSeed", "0", CVAR_ARCHIVE }, { &cg_setSeed, "cg_setSeed", "", CVAR_ARCHIVE }, diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index ac1e0e1..908e7a3 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -99,6 +99,7 @@ void WP_ForcePowerDrain( gentity_t *self, forcePowers_t forcePower, int override extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; extern vmCvar_t cg_enableRandomizer; +extern vmCvar_t cg_enableRandomizerEnhancements; extern int g_crosshairEntNum; int g_saberFlashTime = 0; @@ -461,7 +462,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) { if ( !ent->client->ps.saberAnimLevel ) {//initialize, but don't reset - if (cg_enableRandomizer.integer) // Random saber style at pickup, but I need to NOT call rand() to keep NPC spawn consistent. + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Random saber style at pickup, but I need to NOT call rand() to keep NPC spawn consistent. { ent->client->ps.saberAnimLevel = (level.framenum + level.time) % 3 + 1; } @@ -480,7 +481,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) if ( ent->client->NPC_class == CLASS_DESANN ) {//longer saber ent->client->ps.saberLengthMax = 48; - if (cg_enableRandomizer.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value { ent->client->ps.saberLengthMax = rand() % 181 + 12; } @@ -488,7 +489,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) else if ( ent->client->NPC_class == CLASS_REBORN ) {//shorter saber ent->client->ps.saberLengthMax = 32; - if (cg_enableRandomizer.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value { ent->client->ps.saberLengthMax = rand() % 121 + 8; } @@ -496,7 +497,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) else {//standard saber length ent->client->ps.saberLengthMax = 40; // Default - if (cg_enableRandomizer.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value { if (ent->client->NPC_class != CLASS_KYLE) // Since it's at map load, and all npc are generated here, we may use rand() { diff --git a/code/randomizer/RandomizerUtils.cpp b/code/randomizer/RandomizerUtils.cpp index dbd189d..3051bca 100644 --- a/code/randomizer/RandomizerUtils.cpp +++ b/code/randomizer/RandomizerUtils.cpp @@ -13,6 +13,7 @@ using namespace std::chrono; // Randomizer extern vmCvar_t cg_enableRandomizer; +extern vmCvar_t cg_enableRandomizerEnhancements; extern vmCvar_t cg_useSetSeed; extern vmCvar_t cg_setSeed; // To access the game From 6d0af8a50f6ba97b80ae080345cc51cc542eb615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Tue, 7 Jan 2025 21:39:04 +0100 Subject: [PATCH 02/13] Added random saber color --- code/game/wp_saber.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index 908e7a3..d74c666 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -483,7 +483,10 @@ void WP_SaberInitBladeData( gentity_t *ent ) ent->client->ps.saberLengthMax = 48; if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value { - ent->client->ps.saberLengthMax = rand() % 181 + 12; + ent->client->ps.saberLengthMax = rand() % 181 + 12; + // For now we use rand, but that will be fixed in the future + ent->client->ps.saberColor = (saber_colors_t) (rand() % 6); + } } else if ( ent->client->NPC_class == CLASS_REBORN ) @@ -492,6 +495,8 @@ void WP_SaberInitBladeData( gentity_t *ent ) if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value { ent->client->ps.saberLengthMax = rand() % 121 + 8; + // For now we use rand, but that will be fixed in the future + ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } } else @@ -502,11 +507,16 @@ void WP_SaberInitBladeData( gentity_t *ent ) if (ent->client->NPC_class != CLASS_KYLE) // Since it's at map load, and all npc are generated here, we may use rand() { ent->client->ps.saberLengthMax = rand() % 151 + 10; + // For now we use rand, but that will be fixed in the future + ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } else // That's Kyle, when he's getting the saber at trial or before, might as well use the current time like for the saber style (to be sonsistent with our seed) { // That's a range of 25% to 400% ent->client->ps.saberLengthMax = (level.framenum + level.time) % 151 + 10; + // Changing the saber will ruin the rng calls, but they will be on a different 'rng source', so it's not that bad in the future + // For now we use rand, but that will be fixed in the future + ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } } From cea1cfc7523ef146a0e51014805f0c8c55856da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Tue, 7 Jan 2025 22:37:44 +0100 Subject: [PATCH 03/13] Moved README of SpeedOutcast to another file and added a new README.md --- Posto-Stuff-ReadmePLZ.txt | 84 ------------- README - SpeedOutcast.md | 233 +++++++++++++++++++++++++++++++++++ README.md | 248 +++++++------------------------------- 3 files changed, 279 insertions(+), 286 deletions(-) delete mode 100644 Posto-Stuff-ReadmePLZ.txt create mode 100644 README - SpeedOutcast.md diff --git a/Posto-Stuff-ReadmePLZ.txt b/Posto-Stuff-ReadmePLZ.txt deleted file mode 100644 index 76ac274..0000000 --- a/Posto-Stuff-ReadmePLZ.txt +++ /dev/null @@ -1,84 +0,0 @@ -Findings on this Randomizer : -- Friendly and neutral NPC carry necessary items (for exemple, the key on kejim_base). -- Some NPC have to be locked, otherwise, we might get undefined behavior in cutscene or else. -- In ns_streets, no matter which npc (except the ones in the little arena) are forced on a path. -- IMPOSSIBLE to start a new game. -- NPC Spawn are determined at the start of the map, not when you hit triggers. If so, then why does it lag ? (Other are lagging, I'm not). - -TODO : -- Lock all necessarry NPC per map (right now thinking about undercity and assembly, to open doors). -- Fixing G_FindConfigstringIndex (very hard). -- Stop the crashes (very hard). -- Maybe add some kind of items randomize ? Except the necessarry ones ofc. -- Some NPC don't spawn, maybe it's an entity not finished like monster_fish. Need to lock them out. - -List of non-working NPC : -- monster_flier2 -- monster_fish -- claw -- lizard -- swamp -- murjj - -Crash : common.cpp, line 296 -It happens because of G_FindConfigstringIndex each time it seems. -I don't know how to fix that, because if it's truly this case every time, it could be a cool mod :/ -q_shared : upped the max sounds and models. -I mean, it works, but limiting the number of different kind of NPC is the better idea. - -For items : -classname : item_bacta, origin : X,Y,Z - -G_CreateG2AttachedWeaponModel : assert at line 249 crashes -You can't give yourself a lightsaber before trial ???? -It makes the game crash for some reason -In trial : models/wepaons2/saber/saber_w.glm -In kejim_base : NULL, unable to read memory -In ns_street : models/weapons2/saber/saber_w.glm, so the same as in trial -g_utils.cpp line 1001 eventParm < 256 -noweap.md3 ????????? - -Idea : Lock it to 10 MAX, so that 1=Kyle, 2=NeededNPC, 3=NeededNPC, 4=maybe needednpc or a random one, 5+ = the rest -Here is what I could grab as the max number of different NPC on a map in Vanilla (thinking about big map) : -- Artus_detention : Stormtrooper,Imperial,DroidGonk,Prisoner,MineMonster,R5D2,Kyle,Droid_Sentry, a total of 8, Kyle included -- Bespin_undercity : Kyle,Ugnaught,Rodian,R5D2,Gran,Weequay,Reborn, a total of 7, Kyle included (less than I expected - - -Needed NPC per map : -- None (but need confirmation): kejim_post, artus_mine, yavin_trial, cairn_bay, cairn_reactor, doom_comm, doom_shield, yavin_swamp, yavin_canyon, -- kejim_base : the corpse that hold the security key to open the mouse droid pad -- artus_detention : the officer/guard with the long sequence -- ns_street : The entity that takes away the briar blaster need to be 'humanoid' / able to hold the blaster. So locking the rodians it is. -- ns_hideout : Lando and Reelo, but both are already forced -- ns_starpas : The two waves of ennemies, it seems that if a neutral spawn, it's kill isn't counted (not sure) -- bespin_undercity : the entity (don't know his name) that opens the door when using force mind trick -- cairn_assembly : The officer that open the door with mind trick -- cairn_dock1 : maybe forcing everything here, because random NPC behavior are strange (they start focusing you). This one I can just filter the mapo entirely -- doom_detention : the officer that open the door to Jan cell -- yavin_courtyard : the trooper shooting the rebel and the rebel being shot - - -CURRENT SITUATION : I locked the number of max unique NPC to 10 for now. -In DEBUG, the game is way less permissing and throw errors often. -But in RELEASE ? It seems plyable, I will do a full playthrought to confirm that. - -I DID an entire playthought without ATST, and a max of 10 random unique NPC, here is a list of softlock I had : -Chicken robots are really too big, I think we should make them spawn naturally and not randomly. -- Two or more NPC spawn location being too close is a problem, if for exemple ATSTs tried to spawn, only one will THEN the other when there is enough space -- kejim_base : the NPC that spawned behind the door couldn't spawn, it was a big droid and Reelo. Making it impossible for the cutscene to execute -- artus_detention : -NPC will NOT respect that truce when the guard is activated, not really a softlock but careful. Also, any NPC can trigger the guard, not only Kyle. -The guard being too big will not work. -Fortunatly, no matter which team the NPC spawned, it will be overwritten and will always be havin the same path and behavior as the guardian. -- artus_topside : -Didn't manage to load the map under unknown conditions -The path finding of NPC that spawn instead of the stormtrooper seems to always be broken -- ns_starpad crashes during the final against Reelo, I should retry this -- cairn_assembly : if the imperial opening the door is too small (for exmeple a small droid), you can't reach the hitbox to hit persuasion -If the NPC remplacin the two reborn dies or don't spawn (don't know which), the ATST door won't open. -- cairn_dock : the map is imposible to play because the new NPCs are having undefefined behavior, making the discretion impossible and you are spoted instantly when by the window -The shadowtropper have to spawn as a shadowtrooper I think because the platform where it spawns DON'T ELEVATE other NPCs (humanoid or droids) -- doom_detention : I didn't any problem with the guard opening the doors, but there might be the same problem as cairn_assembly - - - diff --git a/README - SpeedOutcast.md b/README - SpeedOutcast.md new file mode 100644 index 0000000..f1a199f --- /dev/null +++ b/README - SpeedOutcast.md @@ -0,0 +1,233 @@ +# Speed Outcast + +Source port of the singleplayer of Star Wars Jedi Knight II: Jedi Outcast. +Focuses on staying true to the original game to be used for speedrun purposes. +See the [speedrun.com leaderboard](https://www.speedrun.com/jk2) for more information. + +Based on the original source code released by Raven, see README.txt. + +## New Console Variables + +### Input + +#### `in_mouse_raw` (0 or 1) + +Use raw mouse input. Only applies after an `in_restart` (or after restarting the game). +Default: `1`. + +### HUD + +#### `cg_drawOverbounceInfo` (0 or 1) + +Draw overbounce probabilities, G is for Go, J is for Jump. +Default: `0`. + +#### `cg_drawSecrets` (0 or 1) + +Show a tracker for found versus total number of secrets on the current level. +Default `0`. + +#### `cg_drawServerFPS` (0 or 1) + +Show current value of `sv_fps`. +For verification of speedruns for the leaderboards. +Default: `1`. + +#### `cg_drawSpeedrunTotalTimer` (0-3) + +Draw a total run timer. +Higher values show more decimals. +Default: `0`. + +#### `cg_drawSpeedrunLevelTimer` (0-3) + +Draw a current level timer. +Higher values show more decimals. +Default: `0`. + +#### `cg_drawJumpHelper` (0 or 1) + +Draw a helper for correctly timing jump release and crouch jumping. + +#### `cg_jumpHelperX` (#) + +Horizontal position of the jump helper. +Default: `0.0` (center of the screen). + +#### `cg_jumpHelperY` (#) + +Vertical position of the jump helper. +Default: `0.0` (center of the screen). + +#### `cg_jumpHelperWidth` (#) + +Width of the jump helper. +Note that this becomes height when using the vertical jump helper (`cg_jumpHelperHorizontal 0`). +Default: `300`. + +#### `cg_jumpHelperHeight` (#) + +Height of the jump helper. +Note that this becomes width when using the vertical jump helper (`cg_jumpHelperHorizontal 0`). +Default: `20`. + +#### `cg_jumpHelperHorizontal` (-1, 0 or 1) + +Whether to draw the jump helper horizontally left-to-right (`1`), horizontally right-to-left (`-1`) or vertically bottom-to-top (`0`). +Default: `1`. + +#### `cg_jumpHelperMirror` (0 or 1) + +Whether to mirror the jump helper. +Mirrors horizontally when drawing horizontally, vertically otherwise. +Default: `1`. + +#### `cg_jumpHelperAutoScale` (0 or 1) + +Whether to rescale the jump helper to the same size for each force level. +Default: `0`. + +#### `cg_jumpHelperCrouch` (0 or 1) + +Show an additional height section for crouch jumping, appended to normal jump height. +Default: `1`. + +#### `cg_jumpHelperCurrentScale` (#) + +Scale of the indicator for the current height within the jump helper. +Negative values draw from top to bottom, positive values from bottom to top. +Default: `0.5`. + +#### `cg_drawSpeed` (0 or 1) + +Draw the current player speed. +Default: `0`. + +#### `cg_speedScale` (#) + +Scale of the text for speed display. +Default: `0.9`. + +#### `cg_speedX` (#) + +Horizontal offset for drawing speed text, relative to the center of the screen. +Default: `0.0` (center of the screen). + +#### `cg_speedY` (#) + +Vertical offset for drawing speed text, relative to the center of the screen. +Default: `75.0` (Slightly below center of the screen). + +#### `cg_drawStrafeHelper` (0 or 1) + +Draw a strafe helper. +Default: `0`. + +#### `cg_strafeHelperCenter` (0 or 1) + +Put the strafe helper in the center of the screen. +Default: `1`. + +#### `cg_strafeHelperCenterMarker` (0 or 1) + +Draw a marker in the center of the strafe helper. +Default: `1`. + +#### `cg_strafeHelperHeight` (#) + +Height of strafe helper bar. +Default: `20.0`. + +#### `cg_strafeHelperScale` (#) + +Horizontal scale of the strafe helper. +Angles correspond directly to the field of view if this scale is set to `360/cg_fov`. +Default: `4.0`. + +#### `cg_strafeHelperSpeedScale` (#) + +Scale of the text for speed display tied to strafe helper. +Note that this shows the speed after friction but prior to acceleration, as this is what is relevant for optimal strafing. +It is not the intuitive current player speed. +For that, see `cg_drawSpeed`. +Default: `0.9`. + +#### `cg_strafeHelperSpeedX` (#) + +Horizontal offset of the text for speed display, relative to the center of the screen. +Default: `0.0` (center of the screen). + +#### `cg_strafeHelperSpeedY` (#) + +Vertical offset of the text for speed display, relative to the strafe helper. +Default: `0.0` (directly under the strafe helper). + +#### `cg_strafeHelperY` (#) + +Vertical position of the strafe helper. +Default: `50.0`. + +#### `cg_strafeHelperColor[...]` (0.0 - 1.0) + +Color components (red, green, blue, alpha) for different strafe helper elements. +These are `Accelerating`, `Optimal`, `CenterMarker` and `Speed`. +Colors can be set more conveniently with the corresponding commands. + +### Cosmetics + +#### `g_saber_color` (color) + +Set saber color. +Valid colors: "red", "orange", "yellow", "green", "blue", and "purple". +Default: "blue" + +### Gameplay + +#### `g_speedFactorLanding` (0 or 1) + +To play with factors to multiply speed by on landing. +A value of `0.5` will obtain Jedi Academy behaviour, `1.0` is the original behaviour in Jedi Outcast. +**Cheat protected**. +Default: `1`. + +#### `g_selfKnockback` (0 or 1) + +Allow players to damage boost themselves with explosive weapons. +**Cheat protected**. +Default: `0`. + +#### `sv_speedrunModeIL` (0 or 1) + +Individual-level run mode. +When set to `1`, ingame timer will reset every time an autosave is loaded. +When set to `0`, ingame timer will reset only when `kejim_post` is loaded. +Default: `0`. + +#### `sv_speedrunModeCheckpoint` (0 or 1) + +Mode for running from quicksave to a specified checkpoint on a map. +Coordinates can be set with the command `settimedcheckpoint x1 y1 z1 x2 y2 z2`. +When the player enters the box spanned by the two points `(x1 y1 z1)` and `(x2 y2 z2)` the run is finished. +If `x2`, `y2` and `z2` are omitted, a checkpoint of reasonable size will be created at `(x1 y1 z1)`. +Default: `0`. + +#### `sv_speedrunModeCheckpointSave` (0 or 1) + +Create an automatic save when a checkpoint is reached in checkpoint mode. +Default: `0`. + +## New Commands + +### HUD + +#### `jumpHelperColor[...] ` (components in range 0.0 to 1.0) + +Sets the color for one of the jump helper elements `Background`, `Crouch`, `CrouchExtend`, `Extend`, `Optimal`, `Current` or `Cancel` to the given red, green, blue and alpha values. + +#### `speedColor ` (components in range 0.0 to 1.0) + +Sets the color for the speed display to the given red, green, blue and alpha values. + +#### `strafeHelperColor[...] ` (components in range 0.0 to 1.0) + +Sets the color for one of the strafe helper elements `Accelerating`, `Optimal`, `CenterMarker` or `Speed` to the given red, green, blue and alpha values. diff --git a/README.md b/README.md index f1a199f..0e76cab 100644 --- a/README.md +++ b/README.md @@ -1,233 +1,77 @@ -# Speed Outcast +# Speed Outcast - Randomizer -Source port of the singleplayer of Star Wars Jedi Knight II: Jedi Outcast. -Focuses on staying true to the original game to be used for speedrun purposes. +Fork of SpeedOutcast, a source port of the singleplayer of Star Wars Jedi Knight II: Jedi Outcast. +Focuses on staying true to the original game and SpeedOutcast / speedrun.com rules to be used for speedrun purposes. See the [speedrun.com leaderboard](https://www.speedrun.com/jk2) for more information. -Based on the original source code released by Raven, see README.txt. +Based on the original source code released by Raven, see `README.txt`. +Based on the source port of Star Wars Jedi Knight II: Jedi Outcast named SpeedOucast, see `README - SpeedOutcast.md`. -## New Console Variables - -### Input - -#### `in_mouse_raw` (0 or 1) - -Use raw mouse input. Only applies after an `in_restart` (or after restarting the game). -Default: `1`. - -### HUD - -#### `cg_drawOverbounceInfo` (0 or 1) - -Draw overbounce probabilities, G is for Go, J is for Jump. -Default: `0`. - -#### `cg_drawSecrets` (0 or 1) - -Show a tracker for found versus total number of secrets on the current level. -Default `0`. - -#### `cg_drawServerFPS` (0 or 1) - -Show current value of `sv_fps`. -For verification of speedruns for the leaderboards. -Default: `1`. - -#### `cg_drawSpeedrunTotalTimer` (0-3) - -Draw a total run timer. -Higher values show more decimals. -Default: `0`. - -#### `cg_drawSpeedrunLevelTimer` (0-3) - -Draw a current level timer. -Higher values show more decimals. -Default: `0`. - -#### `cg_drawJumpHelper` (0 or 1) - -Draw a helper for correctly timing jump release and crouch jumping. - -#### `cg_jumpHelperX` (#) - -Horizontal position of the jump helper. -Default: `0.0` (center of the screen). - -#### `cg_jumpHelperY` (#) - -Vertical position of the jump helper. -Default: `0.0` (center of the screen). - -#### `cg_jumpHelperWidth` (#) - -Width of the jump helper. -Note that this becomes height when using the vertical jump helper (`cg_jumpHelperHorizontal 0`). -Default: `300`. - -#### `cg_jumpHelperHeight` (#) - -Height of the jump helper. -Note that this becomes width when using the vertical jump helper (`cg_jumpHelperHorizontal 0`). -Default: `20`. - -#### `cg_jumpHelperHorizontal` (-1, 0 or 1) - -Whether to draw the jump helper horizontally left-to-right (`1`), horizontally right-to-left (`-1`) or vertically bottom-to-top (`0`). -Default: `1`. - -#### `cg_jumpHelperMirror` (0 or 1) - -Whether to mirror the jump helper. -Mirrors horizontally when drawing horizontally, vertically otherwise. -Default: `1`. - -#### `cg_jumpHelperAutoScale` (0 or 1) - -Whether to rescale the jump helper to the same size for each force level. -Default: `0`. -#### `cg_jumpHelperCrouch` (0 or 1) - -Show an additional height section for crouch jumping, appended to normal jump height. -Default: `1`. - -#### `cg_jumpHelperCurrentScale` (#) +## New Console Variables -Scale of the indicator for the current height within the jump helper. -Negative values draw from top to bottom, positive values from bottom to top. -Default: `0.5`. +### Randomizer -#### `cg_drawSpeed` (0 or 1) +#### `cg_enableRandomizer` (0 or 1) -Draw the current player speed. +Enable or disable the NPC and items randomizer. Default: `0`. -#### `cg_speedScale` (#) - -Scale of the text for speed display. -Default: `0.9`. - -#### `cg_speedX` (#) - -Horizontal offset for drawing speed text, relative to the center of the screen. -Default: `0.0` (center of the screen). - -#### `cg_speedY` (#) - -Vertical offset for drawing speed text, relative to the center of the screen. -Default: `75.0` (Slightly below center of the screen). - -#### `cg_drawStrafeHelper` (0 or 1) +#### `cg_enableRandomizerEnhancements` (0 or 1) -Draw a strafe helper. +Enable or disable the other more 'exotic' randomized elements in the game (check list below for more details). +Need `cg_enableRandomizer` to be 1 to work. Default: `0`. -#### `cg_strafeHelperCenter` (0 or 1) - -Put the strafe helper in the center of the screen. -Default: `1`. - -#### `cg_strafeHelperCenterMarker` (0 or 1) - -Draw a marker in the center of the strafe helper. -Default: `1`. - -#### `cg_strafeHelperHeight` (#) - -Height of strafe helper bar. -Default: `20.0`. - -#### `cg_strafeHelperScale` (#) - -Horizontal scale of the strafe helper. -Angles correspond directly to the field of view if this scale is set to `360/cg_fov`. -Default: `4.0`. - -#### `cg_strafeHelperSpeedScale` (#) - -Scale of the text for speed display tied to strafe helper. -Note that this shows the speed after friction but prior to acceleration, as this is what is relevant for optimal strafing. -It is not the intuitive current player speed. -For that, see `cg_drawSpeed`. -Default: `0.9`. +#### `cg_setSeed` 10 digits string -#### `cg_strafeHelperSpeedX` (#) +Variable that store the current seed. Can be edited before starting a run and used if `cg_useSetSeed` is equal to 1. +Default: `EmptyString`. -Horizontal offset of the text for speed display, relative to the center of the screen. -Default: `0.0` (center of the screen). +#### `cg_useSetSeed` (0 or 1) -#### `cg_strafeHelperSpeedY` (#) - -Vertical offset of the text for speed display, relative to the strafe helper. -Default: `0.0` (directly under the strafe helper). - -#### `cg_strafeHelperY` (#) - -Vertical position of the strafe helper. -Default: `50.0`. - -#### `cg_strafeHelperColor[...]` (0.0 - 1.0) - -Color components (red, green, blue, alpha) for different strafe helper elements. -These are `Accelerating`, `Optimal`, `CenterMarker` and `Speed`. -Colors can be set more conveniently with the corresponding commands. - -### Cosmetics - -#### `g_saber_color` (color) - -Set saber color. -Valid colors: "red", "orange", "yellow", "green", "blue", and "purple". -Default: "blue" - -### Gameplay - -#### `g_speedFactorLanding` (0 or 1) - -To play with factors to multiply speed by on landing. -A value of `0.5` will obtain Jedi Academy behaviour, `1.0` is the original behaviour in Jedi Outcast. -**Cheat protected**. -Default: `1`. - -#### `g_selfKnockback` (0 or 1) - -Allow players to damage boost themselves with explosive weapons. -**Cheat protected**. +If 0, generate a random seed during the start of a new game. +If 1, will use the seed stored in `cg_setSeed`. Default: `0`. -#### `sv_speedrunModeIL` (0 or 1) - -Individual-level run mode. -When set to `1`, ingame timer will reset every time an autosave is loaded. -When set to `0`, ingame timer will reset only when `kejim_post` is loaded. -Default: `0`. +### HUD -#### `sv_speedrunModeCheckpoint` (0 or 1) +#### `cg_drawSeed` (0 or 1) -Mode for running from quicksave to a specified checkpoint on a map. -Coordinates can be set with the command `settimedcheckpoint x1 y1 z1 x2 y2 z2`. -When the player enters the box spanned by the two points `(x1 y1 z1)` and `(x2 y2 z2)` the run is finished. -If `x2`, `y2` and `z2` are omitted, a checkpoint of reasonable size will be created at `(x1 y1 z1)`. +Draw the seed used during a run. Will draw "No Rand" is `cg_enableRandomizer` is 0 Default: `0`. -#### `sv_speedrunModeCheckpointSave` (0 or 1) -Create an automatic save when a checkpoint is reached in checkpoint mode. -Default: `0`. +## List of addition for the base Randomizer -## New Commands +#### Gameplay -### HUD +- Every NPC will be randomized during spawn, with exceptions listed below. +- Every items spawned on the map such as items on the ground or in gun racks will be randomized. +- The lightsaber can be obtained early and you will receive a random saber style on pickup. +- Every Force powers (except Saber attack and Saber defense) can be obtained via holocrons. +- NPCs replacing NPCs with keys or special trigger for script will inherit said keys and/or script. +- NPCs replacing normal NPCs will inherit their AI as best as possible (droids can't pathfind exactly like a humanoid). +- Easter egg NPC called `The Death Wiggle`. +- The NPC you kill at the end of `yavin_trial` will trigger the end of the timer like in SpeedOutcast -#### `jumpHelperColor[...] ` (components in range 0.0 to 1.0) +#### Exceptions -Sets the color for one of the jump helper elements `Background`, `Crouch`, `CrouchExtend`, `Extend`, `Optimal`, `Current` or `Cancel` to the given red, green, blue and alpha values. +- Lando, Jan, Luke, MonMothman, Reelo, Desann, Ugnaught, +- ATSTs, Seekers, MouseDroids, R5D2 (bespin) and 'Chicken Robots' will always spawn as themselves. +- The warden in `artus_detention` will always be an humanoid. +- The stormtrooper shooting at the prisoners in `artus_topside` will always be humanoids. +- Rodian, Gran, Weequay at the end of `ns_starpad` (with Reelo) and the waves when Lando will go inside the Lady Luck will always be humanoids. +- The two Imperial Officers in `cairn_assembly` and `doom_detention` we have to mindtrick will always be humanoids. +- Kyle as in player controlled Kyle will always be Kyle. And randomly spawned Kyle will always be considered allies. -#### `speedColor ` (components in range 0.0 to 1.0) +### List of addition for the 'exotic' Randomizer -Sets the color for the speed display to the given red, green, blue and alpha values. +- Randomized saber lenght every time the saber is chosen. +- Randomized saber color every time the saber is chosen. +- TODO : Random jump height +- TODO : Random sounds +- TODO : Random NPC size (may not be possible because of insane hitbox and things) +- TODO : Random projectiles every shot -#### `strafeHelperColor[...] ` (components in range 0.0 to 1.0) -Sets the color for one of the strafe helper elements `Accelerating`, `Optimal`, `CenterMarker` or `Speed` to the given red, green, blue and alpha values. From d42f06f940d292ec73792737327c23a2f7a0088c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Wed, 8 Jan 2025 10:58:20 +0100 Subject: [PATCH 04/13] Added random jump height at every jump and fixed saber style at pickup (the previous formula resulted with a 0 in 80%+ of cases). --- README.md | 13 +++++++------ code/game/bg_pmove.cpp | 18 ++++++++++++++++++ code/game/wp_saber.cpp | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0e76cab..e282886 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Default: `0`. #### `cg_drawSeed` (0 or 1) -Draw the seed used during a run. Will draw "No Rand" is `cg_enableRandomizer` is 0 +Draw the seed used during a run. Will draw "No Rand" is `cg_enableRandomizer` is 0. Default: `0`. @@ -57,7 +57,7 @@ Default: `0`. #### Exceptions -- Lando, Jan, Luke, MonMothman, Reelo, Desann, Ugnaught, +- Lando, Jan, Luke, MonMothman, Reelo, Desann and Ugnaught will always spawn as humanoids. - ATSTs, Seekers, MouseDroids, R5D2 (bespin) and 'Chicken Robots' will always spawn as themselves. - The warden in `artus_detention` will always be an humanoid. - The stormtrooper shooting at the prisoners in `artus_topside` will always be humanoids. @@ -67,11 +67,12 @@ Default: `0`. ### List of addition for the 'exotic' Randomizer -- Randomized saber lenght every time the saber is chosen. -- Randomized saber color every time the saber is chosen. -- TODO : Random jump height +- Random saber style at pickup. That means you will always get a change to get any saber style, so go for a qs/ql if you want something specific. +- Random saber lenght every time the saber is chosen. From 25% to 400% the saber lenght. +- Random saber color every time the saber is chosen. Blue, Green, Yeelow, Orange, Purple and Red. RGB might be possible but that needs investigation. +- Random jump height with every jump. From 1/3 the normal jump without force to double the height with jump force 3. +- TODO : Random projectiles every shot - TODO : Random sounds - TODO : Random NPC size (may not be possible because of insane hitbox and things) -- TODO : Random projectiles every shot diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 52f43e9..9ac07f7 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -620,7 +620,25 @@ static qboolean PM_CheckJump( void ) pm->ps->forceJumpZStart = pm->ps->origin[2]; } */ + + // Randomizer extreme : Here is when a FORCE jump is done. Normal jump is not touched. + // curHeight is zero when we start a jump, so if it is zero and we start a force jump float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; + + if (curHeight == 0 && cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) + { + // Need to change the rng calls later + // Change the values for the force jumps, not the normal one (but since this is called when you have force power, that don't change much) + for (int i = 1; i < 4; i++) + { + int newHeight = rand() % 759 + 10; // 10 as the minimum, 768 as the maximum, which is double force jump 3 + forceJumpHeight[i] = newHeight; + // forceJumpHeightMax is not declared in this score, maybe it's not needed ? + // forceJumpHeightMax[i] = newHeight + 34; + + } + } + //check for max force jump level and cap off & cut z vel if ( ( curHeight<=forceJumpHeight[0] ||//still below minimum jump height (pm->ps->forcePower&&pm->cmd.upmove>=10) ) &&////still have force power available and still trying to jump up diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index d74c666..ba7e95b 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -464,7 +464,7 @@ void WP_SaberInitBladeData( gentity_t *ent ) {//initialize, but don't reset if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Random saber style at pickup, but I need to NOT call rand() to keep NPC spawn consistent. { - ent->client->ps.saberAnimLevel = (level.framenum + level.time) % 3 + 1; + ent->client->ps.saberAnimLevel = (level.framenum) % 3 + 1; } else // Normal gameplay (and yes, there is a glitch to get fast style in trial) { From 567f64168d3eb3dca060b2e587e3626e75d55384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Wed, 8 Jan 2025 13:16:09 +0100 Subject: [PATCH 05/13] Added variables to control each individual part of the 'enhancements' on the randomizer. --- code/cgame/cg_local.h | 9 ++++++-- code/cgame/cg_main.cpp | 11 +++++++++ code/game/bg_pmove.cpp | 2 +- code/game/wp_saber.cpp | 36 +++++++++++++---------------- code/randomizer/RandomizerUtils.cpp | 4 ++++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index cf51749..7ce7127 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -693,12 +693,17 @@ extern vmCvar_t cg_strafeHelperColorSpeedG; extern vmCvar_t cg_strafeHelperColorSpeedB; extern vmCvar_t cg_strafeHelperColorSpeedA; -//Additions for Randomizer +// Additions for Randomizer extern vmCvar_t cg_enableRandomizer; extern vmCvar_t cg_enableRandomizerEnhancements; extern vmCvar_t cg_drawSeed; extern vmCvar_t cg_setSeed; -//Additions for Base Game fixes (ex : artus_mine crates to get all pickups) +// Randomizer - evil mode +extern vmCvar_t cg_enableRandSaberStyle; +extern vmCvar_t cg_enableRandSaberLenght; +extern vmCvar_t cg_enableRandSaberColor; +extern vmCvar_t cg_enableRandJumpHeight; +// Additions for Base Game fixes (ex : artus_mine crates to get all pickups) extern vmCvar_t cg_baseGameFixes; void CG_NewClientinfo( int clientNum ); diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 933e6b5..54ac428 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -396,6 +396,11 @@ vmCvar_t cg_enableRandomizerEnhancements; vmCvar_t cg_drawSeed; vmCvar_t cg_useSetSeed; vmCvar_t cg_setSeed; +// Randomizer - evil mode +vmCvar_t cg_enableRandSaberStyle; +vmCvar_t cg_enableRandSaberLenght; +vmCvar_t cg_enableRandSaberColor; +vmCvar_t cg_enableRandJumpHeight; // Additions for Base Game fixes (ex : artus_mine crates to get all pickups) vmCvar_t cg_baseGameFixes; @@ -589,6 +594,12 @@ Ghoul2 Insert End { &cg_drawSeed, "cg_drawSeed", "0", CVAR_ARCHIVE }, { &cg_useSetSeed, "cg_useSetSeed", "0", CVAR_ARCHIVE }, { &cg_setSeed, "cg_setSeed", "", CVAR_ARCHIVE }, + // Randomizer - evil mode + { &cg_enableRandSaberStyle, "cg_enableRandSaberStyle", "0", CVAR_ARCHIVE }, + { &cg_enableRandSaberLenght, "cg_enableRandSaberLenght", "0", CVAR_ARCHIVE }, + { &cg_enableRandSaberColor, "cg_enableRandSaberColor", "0", CVAR_ARCHIVE }, + { &cg_enableRandJumpHeight, "cg_enableRandJumpHeight", "0", CVAR_ARCHIVE }, + // Additions for BaseGame fixes { &cg_baseGameFixes, "cg_baseGameFixes", "0", CVAR_ARCHIVE } }; diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 9ac07f7..9c5a7ba 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -625,7 +625,7 @@ static qboolean PM_CheckJump( void ) // curHeight is zero when we start a jump, so if it is zero and we start a force jump float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; - if (curHeight == 0 && cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) + if (curHeight == 0 && cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer && cg_enableRandJumpHeight.integer) { // Need to change the rng calls later // Change the values for the force jumps, not the normal one (but since this is called when you have force power, that don't change much) diff --git a/code/game/wp_saber.cpp b/code/game/wp_saber.cpp index ba7e95b..ab8d454 100644 --- a/code/game/wp_saber.cpp +++ b/code/game/wp_saber.cpp @@ -100,6 +100,9 @@ extern cvar_t *g_saberAutoBlocking; extern cvar_t *g_saberRealisticCombat; extern vmCvar_t cg_enableRandomizer; extern vmCvar_t cg_enableRandomizerEnhancements; +extern vmCvar_t cg_enableRandSaberStyle; +extern vmCvar_t cg_enableRandSaberLenght; +extern vmCvar_t cg_enableRandSaberColor; extern int g_crosshairEntNum; int g_saberFlashTime = 0; @@ -462,7 +465,8 @@ void WP_SaberInitBladeData( gentity_t *ent ) { if ( !ent->client->ps.saberAnimLevel ) {//initialize, but don't reset - if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Random saber style at pickup, but I need to NOT call rand() to keep NPC spawn consistent. + // Random saber style at pickup, but I need to NOT call rand() to keep NPC spawn consistent. + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer && cg_enableRandSaberStyle.integer) { ent->client->ps.saberAnimLevel = (level.framenum) % 3 + 1; } @@ -481,44 +485,36 @@ void WP_SaberInitBladeData( gentity_t *ent ) if ( ent->client->NPC_class == CLASS_DESANN ) {//longer saber ent->client->ps.saberLengthMax = 48; - if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) { - ent->client->ps.saberLengthMax = rand() % 181 + 12; - // For now we use rand, but that will be fixed in the future - ent->client->ps.saberColor = (saber_colors_t) (rand() % 6); - + if (cg_enableRandSaberLenght.integer) ent->client->ps.saberLengthMax = rand() % 181 + 12; // Range of 25% to 400% of initial value + if (cg_enableRandSaberColor.integer) ent->client->ps.saberColor = (saber_colors_t) (rand() % 6); } } else if ( ent->client->NPC_class == CLASS_REBORN ) {//shorter saber ent->client->ps.saberLengthMax = 32; - if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) { - ent->client->ps.saberLengthMax = rand() % 121 + 8; - // For now we use rand, but that will be fixed in the future - ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); + if (cg_enableRandSaberLenght.integer) ent->client->ps.saberLengthMax = rand() % 121 + 8; // Range of 25% to 400% of initial value + if (cg_enableRandSaberColor.integer) ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } } else {//standard saber length ent->client->ps.saberLengthMax = 40; // Default - if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) // Would be the funniest thing ever, range of 25% to 400% of initial value + if (cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) { if (ent->client->NPC_class != CLASS_KYLE) // Since it's at map load, and all npc are generated here, we may use rand() { - ent->client->ps.saberLengthMax = rand() % 151 + 10; - // For now we use rand, but that will be fixed in the future - ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); + if (cg_enableRandSaberLenght.integer) ent->client->ps.saberLengthMax = rand() % 151 + 10; // Range of 25% to 400% of initial value + if (cg_enableRandSaberColor.integer) ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } else // That's Kyle, when he's getting the saber at trial or before, might as well use the current time like for the saber style (to be sonsistent with our seed) { - // That's a range of 25% to 400% - ent->client->ps.saberLengthMax = (level.framenum + level.time) % 151 + 10; - // Changing the saber will ruin the rng calls, but they will be on a different 'rng source', so it's not that bad in the future - // For now we use rand, but that will be fixed in the future - ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); + if (cg_enableRandSaberLenght.integer) ent->client->ps.saberLengthMax = level.framenum % 151 + 10; // Range of 25% to 400% of initial value + if (cg_enableRandSaberColor.integer) ent->client->ps.saberColor = (saber_colors_t)(rand() % 6); } - } } diff --git a/code/randomizer/RandomizerUtils.cpp b/code/randomizer/RandomizerUtils.cpp index 3051bca..ba8ab0f 100644 --- a/code/randomizer/RandomizerUtils.cpp +++ b/code/randomizer/RandomizerUtils.cpp @@ -16,6 +16,10 @@ extern vmCvar_t cg_enableRandomizer; extern vmCvar_t cg_enableRandomizerEnhancements; extern vmCvar_t cg_useSetSeed; extern vmCvar_t cg_setSeed; +// Randomizer - evil mode +extern vmCvar_t cg_enableRandSaberLenght; +extern vmCvar_t cg_enableRandSaberColor; +extern vmCvar_t cg_enableRandJumpHeight; // To access the game extern game_import_t gi; From bda493a3b34b6dae2e5ae9aed3385ee802d83300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Wed, 8 Jan 2025 13:27:21 +0100 Subject: [PATCH 06/13] Updated README.md --- README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e282886..d55b8da 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ Default: `0`. #### `cg_enableRandomizerEnhancements` (0 or 1) -Enable or disable the other more 'exotic' randomized elements in the game (check list below for more details). +Enable or disable the other more 'exotic' randomized elements in the game. +Check `List of addition for the 'exotic' Randomizer` below for more details. Need `cg_enableRandomizer` to be 1 to work. Default: `0`. @@ -67,12 +68,21 @@ Default: `0`. ### List of addition for the 'exotic' Randomizer -- Random saber style at pickup. That means you will always get a change to get any saber style, so go for a qs/ql if you want something specific. -- Random saber lenght every time the saber is chosen. From 25% to 400% the saber lenght. -- Random saber color every time the saber is chosen. Blue, Green, Yeelow, Orange, Purple and Red. RGB might be possible but that needs investigation. -- Random jump height with every jump. From 1/3 the normal jump without force to double the height with jump force 3. -- TODO : Random projectiles every shot -- TODO : Random sounds -- TODO : Random NPC size (may not be possible because of insane hitbox and things) +#### `cg_enableRandSaberStyle` (0 or 1) +Random saber style at pickup. That means you will always get a change to get any saber style, so go for a qs/ql if you want something specific. + +#### `cg_enableRandSaberLenght` (0 or 1) +Random saber lenght every time the saber is chosen. From 25% to 400% the saber lenght. + +#### `cg_enableRandSaberColor` (0 or 1) +Random saber color every time the saber is chosen. Blue, Green, Yeelow, Orange, Purple and Red. RGB might be possible but that needs investigation. + +#### `cg_enableRandJumpHeight` (0 or 1) +Random jump height with every jump. From 1/3 the normal jump without force to double the height with jump force 3. + +#### Todos +- Random projectiles every shot +- Random sounds +- Random NPC size (may not be possible because of insane hitbox and things) From 50e48d4609fcc4e6bbfb7e4739e865187ce18b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20Gon=C3=A7alves?= Date: Wed, 8 Jan 2025 18:36:00 +0100 Subject: [PATCH 07/13] Added a randomization on the 'strength' of force jumps. It's controlling the speed of the Z axis. --- README.md | 3 +++ code/cgame/cg_local.h | 1 + code/cgame/cg_main.cpp | 2 ++ code/game/bg_pmove.cpp | 30 +++++++++++++++++++++-------- code/randomizer/RandomizerUtils.cpp | 1 + 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d55b8da..0b88672 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,9 @@ Random saber color every time the saber is chosen. Blue, Green, Yeelow, Orange, #### `cg_enableRandJumpHeight` (0 or 1) Random jump height with every jump. From 1/3 the normal jump without force to double the height with jump force 3. +#### `cg_enableRandJumpStrength` (0 or 1) +Random jump strength with every jump. From the normal jump without force to quadruple the Z velocity with jump force 3. + #### Todos - Random projectiles every shot - Random sounds diff --git a/code/cgame/cg_local.h b/code/cgame/cg_local.h index 7ce7127..86b49fa 100644 --- a/code/cgame/cg_local.h +++ b/code/cgame/cg_local.h @@ -703,6 +703,7 @@ extern vmCvar_t cg_enableRandSaberStyle; extern vmCvar_t cg_enableRandSaberLenght; extern vmCvar_t cg_enableRandSaberColor; extern vmCvar_t cg_enableRandJumpHeight; +extern vmCvar_t cg_enableRandJumpStrength; // Additions for Base Game fixes (ex : artus_mine crates to get all pickups) extern vmCvar_t cg_baseGameFixes; diff --git a/code/cgame/cg_main.cpp b/code/cgame/cg_main.cpp index 54ac428..fd16b6e 100644 --- a/code/cgame/cg_main.cpp +++ b/code/cgame/cg_main.cpp @@ -401,6 +401,7 @@ vmCvar_t cg_enableRandSaberStyle; vmCvar_t cg_enableRandSaberLenght; vmCvar_t cg_enableRandSaberColor; vmCvar_t cg_enableRandJumpHeight; +vmCvar_t cg_enableRandJumpStrength; // Additions for Base Game fixes (ex : artus_mine crates to get all pickups) vmCvar_t cg_baseGameFixes; @@ -599,6 +600,7 @@ Ghoul2 Insert End { &cg_enableRandSaberLenght, "cg_enableRandSaberLenght", "0", CVAR_ARCHIVE }, { &cg_enableRandSaberColor, "cg_enableRandSaberColor", "0", CVAR_ARCHIVE }, { &cg_enableRandJumpHeight, "cg_enableRandJumpHeight", "0", CVAR_ARCHIVE }, + { &cg_enableRandJumpStrength, "cg_enableRandJumpStrength", "0", CVAR_ARCHIVE }, // Additions for BaseGame fixes { &cg_baseGameFixes, "cg_baseGameFixes", "0", CVAR_ARCHIVE } diff --git a/code/game/bg_pmove.cpp b/code/game/bg_pmove.cpp index 9c5a7ba..1993aef 100644 --- a/code/game/bg_pmove.cpp +++ b/code/game/bg_pmove.cpp @@ -625,17 +625,31 @@ static qboolean PM_CheckJump( void ) // curHeight is zero when we start a jump, so if it is zero and we start a force jump float curHeight = pm->ps->origin[2] - pm->ps->forceJumpZStart; - if (curHeight == 0 && cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer && cg_enableRandJumpHeight.integer) + if (curHeight == 0 && cg_enableRandomizer.integer && cg_enableRandomizerEnhancements.integer) { - // Need to change the rng calls later - // Change the values for the force jumps, not the normal one (but since this is called when you have force power, that don't change much) - for (int i = 1; i < 4; i++) + if (cg_enableRandJumpHeight.integer) { - int newHeight = rand() % 759 + 10; // 10 as the minimum, 768 as the maximum, which is double force jump 3 - forceJumpHeight[i] = newHeight; - // forceJumpHeightMax is not declared in this score, maybe it's not needed ? - // forceJumpHeightMax[i] = newHeight + 34; + // Need to change the rng calls later + // Change the values for the force jumps, not the normal one (but since this is called when you have force power, that don't change much) + for (int i = 1; i < 4; i++) + { + int newHeight = rand() % 759 + 10; // 10 as the minimum, 768 as the maximum, which is double force jump 3 + forceJumpHeight[i] = newHeight; + // forceJumpHeightMax is not declared in this score, maybe it's not needed ? + // forceJumpHeightMax[i] = newHeight + 34; + } + } + if (cg_enableRandJumpStrength.integer) + { + // Need to change the rng calls later + // Change the values for the force jumps, not the normal one (but since this is called when you have force power, that don't change much) + for (int i = 1; i < 4; i++) + { + //int newStrength = rand() % 1568 + 112; // 112 as the minimum, 225 is the normal value for no force, 1680 as the maximum, which is double force jump 3 + int newStrength = rand() % 3776 + 225; // Base Velocity is guaranted, but now every jump can be extremely fast + forceJumpStrength[i] = newStrength; + } } } diff --git a/code/randomizer/RandomizerUtils.cpp b/code/randomizer/RandomizerUtils.cpp index ba8ab0f..8a93a49 100644 --- a/code/randomizer/RandomizerUtils.cpp +++ b/code/randomizer/RandomizerUtils.cpp @@ -20,6 +20,7 @@ extern vmCvar_t cg_setSeed; extern vmCvar_t cg_enableRandSaberLenght; extern vmCvar_t cg_enableRandSaberColor; extern vmCvar_t cg_enableRandJumpHeight; +extern vmCvar_t cg_enableRandJumpStrenght; // To access the game extern game_import_t gi; From 0b3b258b20d522e422969062a2a44b321a711890 Mon Sep 17 00:00:00 2001 From: Mugsworth1 Date: Wed, 8 Jan 2025 22:35:25 +0000 Subject: [PATCH 08/13] Add a new top menu section for Randomizer, add new 'Basic' and 'Enhancements' submenus, add settings for randomizer enhancements. --- assets/Bundle Assets.ps1 | 13 + assets/assets_randomizer.pk3 | Bin 18291 -> 68402 bytes .../map_objects/force_holocrons/grip.md3 | Bin 0 -> 804 bytes .../map_objects/force_holocrons/heal.md3 | Bin 0 -> 804 bytes .../map_objects/force_holocrons/lightning.md3 | Bin 0 -> 804 bytes .../force_holocrons/saberthrow.md3 | Bin 0 -> 804 bytes .../map_objects/force_holocrons/telepathy.md3 | Bin 0 -> 804 bytes assets/readme.txt | 7 + assets/ui/controls.menu | 3524 ++++++++++++++++ assets/ui/ingame.menu | 483 +++ assets/ui/ingamecontrols.menu | 3547 +++++++++++++++++ assets/ui/ingameload.menu | 740 ++++ assets/ui/ingamequit.menu | 798 ++++ assets/ui/ingamerandomizer.menu | 1098 +++++ assets/ui/ingamesave.menu | 678 ++++ assets/ui/ingamesetup.menu | 3036 ++++++++++++++ assets/ui/loadgame.menu | 738 ++++ assets/ui/main.menu | 490 +++ assets/ui/menus.txt | 31 + assets/ui/newgame.menu | 771 ++++ assets/ui/quit.menu | 575 +++ assets/ui/randomizer.menu | 1091 +++++ assets/ui/setup.menu | 3144 +++++++++++++++ 23 files changed, 20764 insertions(+) create mode 100644 assets/Bundle Assets.ps1 create mode 100644 assets/models/map_objects/force_holocrons/grip.md3 create mode 100644 assets/models/map_objects/force_holocrons/heal.md3 create mode 100644 assets/models/map_objects/force_holocrons/lightning.md3 create mode 100644 assets/models/map_objects/force_holocrons/saberthrow.md3 create mode 100644 assets/models/map_objects/force_holocrons/telepathy.md3 create mode 100644 assets/readme.txt create mode 100644 assets/ui/controls.menu create mode 100644 assets/ui/ingame.menu create mode 100644 assets/ui/ingamecontrols.menu create mode 100644 assets/ui/ingameload.menu create mode 100644 assets/ui/ingamequit.menu create mode 100644 assets/ui/ingamerandomizer.menu create mode 100644 assets/ui/ingamesave.menu create mode 100644 assets/ui/ingamesetup.menu create mode 100644 assets/ui/loadgame.menu create mode 100644 assets/ui/main.menu create mode 100644 assets/ui/menus.txt create mode 100644 assets/ui/newgame.menu create mode 100644 assets/ui/quit.menu create mode 100644 assets/ui/randomizer.menu create mode 100644 assets/ui/setup.menu diff --git a/assets/Bundle Assets.ps1 b/assets/Bundle Assets.ps1 new file mode 100644 index 0000000..d382bfa --- /dev/null +++ b/assets/Bundle Assets.ps1 @@ -0,0 +1,13 @@ +if(Get-Item assets_randomizer.pk3) +{ + Remove-Item assets_randomizer.pk3 +} + +$compress = @{ + Path = "ui", "models" + CompressionLevel = "Fastest" + DestinationPath = "assets_randomizer.zip" +} +Compress-Archive @compress + +Move-Item assets_randomizer.zip assets_randomizer.pk3 \ No newline at end of file diff --git a/assets/assets_randomizer.pk3 b/assets/assets_randomizer.pk3 index 32f4fb8a2fddc1f0a2971868ce0ff85dd234877b..96539868279af1036d9f71df5bf75f932297eaef 100644 GIT binary patch literal 68402 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 literal 0 HcmV?d00001 diff --git a/assets/models/map_objects/force_holocrons/heal.md3 b/assets/models/map_objects/force_holocrons/heal.md3 new file mode 100644 index 0000000000000000000000000000000000000000..f172741fffbcfaa340ba05eb25394f05e953fb38 GIT binary patch literal 804 zcmeZt2{7hoU|`72Pf5)w*3V5Wh|f>TN=+^SvJ3QcO5!t86La)(Q;dOX2mwZ@0vMeG za(_zp5Kd~slKuyAB>5O8Ejc;yI^fdSuNOimhUMftf3j=`>)5K&K{ z8rFP3}UkbF&7YX05K;NgV@|a400n#A51-n%?rc=K+Ffkpm+me5L*z4 zK|lzIg`pV42AL1^nLPx9IZ!@28(9r98(AGl90bti(fR0V@XLP!`tk*1zBKQDMIsZS}^ebKl;~~)o>0> ZKTI55AIw~sJd6+153>(uK8z2u7Xb80b7}wp literal 0 HcmV?d00001 diff --git a/assets/models/map_objects/force_holocrons/lightning.md3 b/assets/models/map_objects/force_holocrons/lightning.md3 new file mode 100644 index 0000000000000000000000000000000000000000..5125739687cfaed82b769c60113b630d8fcc1dfd GIT binary patch literal 804 zcmbV}y-vbV6vt0*tysUnkHo~u!9g8F!k`0*t&ssH6E>F$f{0Q|po1fi-~%}N06u~y ztnQjPxWbA$f%Si&H#ALP@Fc(Ve?ITIx0%zkWR!?(r&y{s<95DoIfa|jr3+n;7jLa< zrF`wyDz);yT}+~IiYb0heyi{weYRDI*4Hyp^o8i#AUZUOVkTX5@g3XSyExgoYB=_m znM?1E;u-8%aPAHgC1k3o}4dzdF~&eQ+lZY literal 0 HcmV?d00001 diff --git a/assets/models/map_objects/force_holocrons/saberthrow.md3 b/assets/models/map_objects/force_holocrons/saberthrow.md3 new file mode 100644 index 0000000000000000000000000000000000000000..3352f8146e9e4b263fd6d41cd1137f68e60a0328 GIT binary patch literal 804 zcmeZt2{7hoU|`72Pf5)w*3V5Wh|f>TN=+^SvJ3Q!6O&Sl;!84$^2_ydQ;dP?@Bv1s zB#h1h@|Qrd3NuLZ>j8!XdBCMS)wqWoM1$6!}Y zh^QyfjY;_x28J+2WYQpafv^Y=^8oP%AO^Y70VwzYh#Q!Q35SyOM4%pg0B8&tfb0Tc z5CD0f4TxEQm=%gaY<3{#0%8sz=7eGpn;VEhZUpIrsRyxnfmi^D`G6P{Zy*d}3j#3+ z2m!G$6oc3x^MO9IhhQ)V%137-t3hTXs{@IH0J=OnA6*T8`ATN=+^SvJ3QcO5#gWb5aWuOEN0;a#M_f3h@9& zs2q&W0rHnXu?jOt^6LSH1AGS=7``|#I9NC`I0!g0B)oD2$-sc`FD56Aw4(f61;=1l zO^B!`(2Ys?6$XYdMP$+-cY&}75c2@>1|SBx(E%v<0EioyaE3!>dIoY(l%yvD_2B|Q zW557p7YKs@$op(S%mT!$Pz++T12Gp6a{w_X6oc5@Kn!vtNFPi+h|LSc0zk|M#GrTs zVGvsoh(SOIh=rjT#0HrU^qD;bgE>$>IvZIHG8?{lqnV1>AvRW|k{y+NH em(_3%Og~H