This hack must be required by a mod to be enabled.
This hack expands base game reward quest types, adds several new ones and more.
Requiring This Hack
To require this hack, add this line to your mod's Meta.ini:
RequiredHack=CustomRewardQuestSupportYour mod can provide a configuration file when requiring this hack.
Configuring This Hack
To configure this hack, create a file named CustomRewardQuestSupport.ini and add the parameters necessary for your mod inside it.
[ShowQuestComplete]
; (quest name)
; Configure whether to show a message when completing various quest types.
; Defaults to 1 for all quest types except "BonusMission" and "StreetRace",
; which already have ways to inform the player they unlocked something.
Cards=1
StreetRace=0
BonusMission=0
Wasps=1
Gags=1
Mission=1
Wager=1
Coins=1
HitAndRun=1
Evaded=1
Busted=1
GetIn=1
Doorbell=1
MaxCoins=1Base Game Quest Types
General
This hack reimplements all base game quest types to support multiple rewards per quest type, such as having multiple default cars/skins or multiple street race rewards.
Additionally, all quest types (except defaultcar) can now be used with skin rewards, enabling many new ways to unlock skins.
cards
The cards quest type exists in the base game, but does not function properly. With this hack, you can use it to bind a reward to collecting all cards in a level and it will actually unlock immediately upon doing so.
Here is an example of using the cards quest type:
// Unlock the Electaurus upon collecting all of Level 1's cards
BindReward("elect_v", "art\cars\elect_v.p3d", "car", "cards", 1);-- Unlock the Electaurus upon collecting all of Level 1's cards
Game.BindReward("elect_v", "art\\cars\\elect_v.p3d", "car", "cards", 1)Additionally, you can also now bind a reward to a specific card in a level by specifying the card number after the level number:
// Unlock the Electaurus upon collecting Level 1's third card
BindReward("elect_v", "art\cars\elect_v.p3d", "car", "cards", 1, 3);-- Unlock the Electaurus upon collecting Level 1's third card
Game.BindReward("elect_v", "art\\cars\\elect_v.p3d", "car", "cards", 1, 3);streetrace
With this hack, the streetrace quest type can take an extra parameter to bind a reward to a specific street race.
Here is an example:
// Unlock the Electaurus upon completing Level 1's second street race
BindReward("elect_v", "art\cars\elect_v.p3d", "car", "streetrace", 1, 2);-- Unlock the Electaurus upon completing Level 1's second street race
Game.BindReward("elect_v", "art\\cars\\elect_v.p3d", "car", "streetrace", 1, 2)Additional Quest Types
wasps
Unlocks a reward when a player destroys all wasps in a level.
// Unlock the Electaurus upon destroying all wasps in Level 1
BindReward("elect_v", "art\cars\elect_v.p3d", "car", "wasps", 1);-- Unlock the Electaurus upon destroying all wasps in Level 1
Game.BindReward("elect_v", "art\\cars\\elect_v.p3d", "car", "wasps", 1)gags
Unlocks a reward when a player completes all gags in a level.
// Unlock the Electaurus upon completing all gags in Level 1
BindReward("elect_v", "art\cars\elect_v.p3d", "car", "gags", 1);-- Unlock the Electaurus upon completing all gags in Level 1
Game.BindReward("elect_v", "art\\cars\\elect_v.p3d", "car", "gags", 1)mission
Unlocks a reward when a player completes either a specific story mission or ALL story missions in a level.
// Unlock the WWII Car upon completing Level 7 Mission 1
BindReward("gramp_v", "art\cars\gramp_v.p3d", "car", "mission", 7, 1);
// Unlock the WWII Rocket Car upon completing ALL story missions in Level 7
BindReward("gramR_v", "art\cars\gramR_v.p3d", "car", "mission", 7);-- Unlock the WWII Car upon completing Level 7 Mission 1
Game.BindReward("gramp_v", "art\\cars\\gramp_v.p3d", "car", "mission", 7, 1);
-- Unlock the WWII Rocket Car upon completing ALL story missions in Level 7
Game.BindReward("gramR_v", "art\\cars\\gramR_v.p3d", "car", "mission", 7);wager
Unlocks a reward when a player completes a wager race, optionally requiring a specific time to beat.
// Unlock the Red Ferrini for beating Level 6's Wager Race
BindReward("bart_v", "art\cars\bart_v.p3d", "car", "wager", 6);
// Unlock the Black Ferrini for beating Level 6's Wager Race in less than 2 minutes
// (This only works if the mission is actually a gamble race)
BindReward("cBlbart", "art\cars\cBlbart.p3d", "car", "wager", 6, 120);-- Unlock the Red Ferrini for beating Level 6's Wager Race
Game.BindReward("bart_v", "art\\cars\\bart_v.p3d", "car", "wager", 6)
-- Unlock the Black Ferrini for beating Level 6's Wager Race in less than 2 minutes
-- (This only works if the mission is actually a gamble race)
Game.BindReward("cBlbart", "art\\cars\\cBlbart.p3d", "car", "wager", 6, 120)coins
Unlocks a reward when a player has the specified amount of coins or greater.
// Unlock the 70s Sports Car but only when the player is filthy rich in Level 1
BindReward("homer_v", "art\cars\homer_v.p3d", "car", "coins", 1, 9999);-- Unlock the 70s Sports Car but only when the player is filthy rich in Level 1
Game.BindReward("homer_v", "art\\cars\\homer_v.p3d", "car", "coins", 1, 9999)The reward will become locked again if the player falls below this amount of coins. If you want the reward to stay unlocked, use the maxcoins quest instead.
hitandrun
Unlocks a reward when a player triggers the specified amount of Hit & Runs in a level.
// Unlock the 70s Sports Car if the player pisses off the police 10 times in Level 1
BindReward("homer_v", "art\cars\homer_v.p3d", "car", "hitandrun", 1, 10);-- Unlock the 70s Sports Car if the player pisses off the police 10 times in Level 1
Game.BindReward("homer_v", "art\\cars\\homer_v.p3d", "car", "hitandrun", 1, 10)evaded
Unlocks a reward when a player successfully evades the specified number of Hit & Runs a level.
// Unlock the 70s Sports Car if the player successfully avoids the police 10 times in Level 1
BindReward("homer_v", "art\cars\homer_v.p3d", "car", "evaded", 1, 10);-- Unlock the 70s Sports Car if the player successfully avoids the police 10 times in Level 1
Game.BindReward("homer_v", "art\\cars\\homer_v.p3d", "car", "evaded", 1, 10)busted
Unlocks a reward when a player gets busted during a Hit & Run the specified number of times in a level.
// Unlock the 70s Sports Car if the player gets caught by the police 10 times in Level 1
BindReward("homer_v", "art\cars\homer_v.p3d", "car", "busted", 1, 10);-- Unlock the 70s Sports Car if the player gets caught by the police 10 times in Level 1
Game.BindReward("homer_v", "art\\cars\\homer_v.p3d", "car", "busted", 1, 10)getin
Unlocks a reward when the player enters the specified car (case-sensitive).
// Unlock the Speed Rocket upon getting into it in Level 1
BindReward("rocke_v", "art\cars\rocke_v.p3d", "car", "getin", 1, "rocke_v");
// Unlock the Duff Truck for getting in the Traffic School Bus in Level 1
// (random example to show it doesn't have to be the *same* car)
BindReward("cDuff", "art\cars\cDuff.p3d", "car", "getin", 1, "schoolbu");-- Unlock the Speed Rocket upon getting into it in Level 1
Game.BindReward("rocke_v", "art\\cars\\rocke_v.p3d", "car", "getin", 1, "rocke_v")
-- Unlock the Duff Truck for getting in the Traffic School Bus in Level 1
-- (random example to show it doesn't have to be the *same* car)
Game.BindReward("cDuff", "art\\cars\\cDuff.p3d", "car", "getin", 1, "schoolbu")doorbell
Unlocks a reward for pressing a doorbell with the given character (case-sensitive).
// Unlock the Speed Rocket upon bothering Quimby in Level 1
BindReward("rocke_v", "art\cars\rocke_v.p3d", "car", "doorbell", 1, "quimby");-- Unlock the Speed Rocket upon bothering Quimby in Level 1
Game.BindReward("rocke_v", "art\\cars\\rocke_v.p3d", "car", "doorbell", 1, "quimby")The character name for a doorbell is defined in the ObjectName field of an Action Locator, prefixed with DB_. For example, the base game's art\l1z4.p3d contains such a locator with an ObjectName of DB_quimby, which is used in the above example.
maxcoins
Unlocks a reward when a player reaches the specified amount of coins or greater.
// Unlock the 70s Sports Car if the player is filthy rich at some point in Level 1
BindReward("homer_v", "art\cars\homer_v.p3d", "car", "maxcoins", 1, 9999);-- Unlock the 70s Sports Car if the player is filthy rich at some point in Level 1
Game.BindReward("homer_v", "art\\cars\\homer_v.p3d", "car", "maxcoins", 1, 9999)The reward will remain unlocked if the player falls below this amount of coins. If you want the reward to become locked again if the player falls below the amount of coins, use the coins quest instead.
Phonebooth Messages
This hack enables mods to show how to unlock a car reward in the phone booth.
To use this functionality, a mod must make manual changes to art\frontend\scrooby\ingame.p3d.
Inside the Frontend Project (0x18000), navigate to:
Phonebooth.pag(Frontend Page (0x18002))Foreground(Frontend Layer (0x18003))Locked(Frontend Group (0x18004))
And, inside the Locked group, add a new Frontend Multi Text (0x18007) named CompleteQuest. This chunk controls the position, justification, color and more of the text and how you set this up is up to you.
Then, inside the Complete quest multi text, add a new Frontend String Text Bible (0x1800B) with the string identifier COMPLETE_QUEST.
In Lucas' Pure3D Editor, your P3D file should look something like this:

This message can then be customized by also requiring the Custom Text hack and declaring one of the following strings:
COMPLETE_QUEST_followed by the reward's name.- For example, the message shown on
elect_vwould beCOMPLETE_QUEST_ELECT_V.
- For example, the message shown on
COMPLETE_QUEST_followed by the quest type.- For example, the message shown on a car locked by a
cardsquest would beCOMPLETE_QUEST_CARDS.
- For example, the message shown on a car locked by a
COMPLETE_QUEST
If no string is found, the hack will fallback to showing "Complete quest".
Skin Shop Messages
This hack enables mods to show how to unlock a skin reward in a skin shop.
Unlike phonebooth messages, this leverages existing frontend chunks in art\frontend\scrooby\ingame.p3d so no modifications are needed.
The relevant frontend chunks are two Frontend Multi Text (0x18007) chunks located inside the Frontend Project (0x18000):
Rewards.pag(Frontend Page (0x18002))Foreground(Frontend Layer (0x18003))Locked(Frontend Group (0x18004))ToPurchase(Frontend Multi Text (0x18007))Price(Frontend Multi Text (0x18007))
The messages can then be customized by also requiring the Custom Text hack and declaring one of the following strings to be shown in the Price Frontend Multi Text (0x18007):
COMPLETE_QUEST_followed by the reward's name.- For example, the message shown on
elect_vwould beCOMPLETE_QUEST_ELECT_V.
- For example, the message shown on
COMPLETE_QUEST_followed by the quest type.- For example, the message shown on a car locked by a
cardsquest would beCOMPLETE_QUEST_CARDS.
- For example, the message shown on a car locked by a
COMPLETE_QUEST
If no string is found, the hack will fallback to showing "Complete quest".
You can also declare a TO_UNLOCK string to customize the text shown in the ToPurchase Frontend Multi Text (0x18007). If no string is found, the hack will fallback to showing "to unlock".
Unlock Messages
Upon unlocking a reward, this hack will trigger a popup message similar to the one shown when completing all level gags or destroying all wasps in the base game.
This message can be customized by also requiring the Custom Text hack and declaring one of the following strings:
QUEST_COMPLETE_followed by the reward's name.- For example, unlocking
elect_vwould lookupQUEST_COMPLETE_ELECT_V.
- For example, unlocking
QUEST_COMPLETE_followed by the quest type.- For example, completing a
cardsquest would lookupQUEST_COMPLETE_CARDS.
- For example, completing a
QUEST_COMPLETE
If no string is found, the hack will fallback to showing "QUEST COMPLETE!".
For rewards unlocked via the gags or wasps quest types, this message will take precedence over the message the game usually shows.
Notes
If you're making a mod that adds additional rewards, you will most likely also want to use the Custom Stats Totals hack to adjust stats totals and potentially also the Increased Reward Limits hack if your added rewards exceed the base game's limitations.