mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-06-13 14:07:14 -04:00
Impl RandomItemTable class (#598)
* Impl RandomItem class * Refactor func * Impl RandomItemTable * Revert probability inaccuracy * Remove unnecessary comment * Fix compile, probably * As per review 1 --------- Co-authored-by: MegaMech <7255464+MegaMech@users.noreply.github.com>
This commit is contained in:
+5
-711
@@ -44,6 +44,8 @@
|
||||
#include <assets/textures/tracks/sherbet_land/sherbet_land_data.h>
|
||||
#include <assets/textures/tracks/rainbow_road/rainbow_road_data.h>
|
||||
|
||||
#include "engine/RaceManager.h"
|
||||
|
||||
float OTRGetAspectRatio(void);
|
||||
|
||||
//! @todo unused?
|
||||
@@ -2609,719 +2611,11 @@ void consume_item(s32 playerId) {
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
u8 none; // ITEM_NONE
|
||||
u8 banana; // ITEM_BANANA
|
||||
u8 bananaBunch; // ITEM_BANANA_BUNCH
|
||||
u8 greenShell; // ITEM_GREEN_SHELL
|
||||
u8 tripleGreenShell; // ITEM_TRIPLE_GREEN_SHELL
|
||||
u8 redShell; // ITEM_RED_SHELL
|
||||
u8 tripleRedShell; // ITEM_TRIPLE_RED_SHELL
|
||||
u8 blueSpinyShell; // ITEM_BLUE_SPINY_SHELL
|
||||
u8 thunderbolt; // ITEM_THUNDERBOLT
|
||||
u8 fakeItemBox; // ITEM_FAKE_ITEM_BOX
|
||||
u8 star; // ITEM_STAR
|
||||
u8 boo; // ITEM_BOO
|
||||
u8 mushroom; // ITEM_MUSHROOM
|
||||
u8 doubleMushroom; // ITEM_DOUBLE_MUSHROOM
|
||||
u8 tripleMushroom; // ITEM_TRIPLE_MUSHROOM
|
||||
u8 superMushroom; // ITEM_SUPER_MUSHROOM
|
||||
} ItemProbabilities;
|
||||
|
||||
// Each row corresponds to a rank, each column to an item
|
||||
ItemProbabilities grandPrixHumanProbabilityTable[] = {
|
||||
{ .none = 0,
|
||||
.banana = 30,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 30,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 5,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 15,
|
||||
.superMushroom = 5 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 20,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 5,
|
||||
.fakeItemBox = 0,
|
||||
.star = 10,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 20,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 5,
|
||||
.thunderbolt = 10,
|
||||
.fakeItemBox = 0,
|
||||
.star = 15,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 20,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 10,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 5,
|
||||
.thunderbolt = 10,
|
||||
.fakeItemBox = 0,
|
||||
.star = 15,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 15,
|
||||
.fakeItemBox = 0,
|
||||
.star = 20,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 20,
|
||||
.fakeItemBox = 0,
|
||||
.star = 30,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 10,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 15,
|
||||
.thunderbolt = 20,
|
||||
.fakeItemBox = 0,
|
||||
.star = 30,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 5,
|
||||
.superMushroom = 10 },
|
||||
};
|
||||
|
||||
ItemProbabilities grandPrixCPUProbabilityTable[] = {
|
||||
{ .none = 0,
|
||||
.banana = 60,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 25,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 50,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 25,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 40,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 25,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 35,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 25,
|
||||
.tripleGreenShell = 15,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 30,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 20,
|
||||
.tripleGreenShell = 20,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 0,
|
||||
.mushroom = 20,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 30,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 20,
|
||||
.tripleGreenShell = 20,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 0,
|
||||
.mushroom = 20,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 30,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 20,
|
||||
.tripleGreenShell = 20,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 0,
|
||||
.star = 10,
|
||||
.boo = 0,
|
||||
.mushroom = 20,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 25,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 20,
|
||||
.tripleGreenShell = 20,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 1,
|
||||
.fakeItemBox = 0,
|
||||
.star = 10,
|
||||
.boo = 0,
|
||||
.mushroom = 24,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
};
|
||||
|
||||
ItemProbabilities grandPrixHardCPUProbabilityTable[] = {
|
||||
{ .none = 5,
|
||||
.banana = 25,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 30,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 5,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 15,
|
||||
.superMushroom = 5 },
|
||||
{ .none = 0,
|
||||
.banana = 5,
|
||||
.bananaBunch = 3,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 20,
|
||||
.tripleRedShell = 19,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 0,
|
||||
.star = 10,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 19,
|
||||
.superMushroom = 9 },
|
||||
{ .none = 0,
|
||||
.banana = 5,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 10,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 15,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 20,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 10,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 5,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 15,
|
||||
.boo = 0,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 25,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 0,
|
||||
.star = 20,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 25,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 0,
|
||||
.star = 30,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 10,
|
||||
.superMushroom = 10 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 15,
|
||||
.thunderbolt = 10,
|
||||
.fakeItemBox = 0,
|
||||
.star = 30,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 5,
|
||||
.superMushroom = 10 },
|
||||
};
|
||||
|
||||
ItemProbabilities versus2PlayerProbabilityTable[] = {
|
||||
{ .none = 0,
|
||||
.banana = 25,
|
||||
.bananaBunch = 10,
|
||||
.greenShell = 30,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 15,
|
||||
.blueSpinyShell = 5,
|
||||
.thunderbolt = 15,
|
||||
.fakeItemBox = 0,
|
||||
.star = 15,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 15,
|
||||
.superMushroom = 20 },
|
||||
};
|
||||
|
||||
ItemProbabilities versus3PlayerProbabilityTable[] = {
|
||||
{ .none = 0,
|
||||
.banana = 35,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 30,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 5,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 15,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 5,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 20,
|
||||
.superMushroom = 5 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 10,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 15,
|
||||
.fakeItemBox = 0,
|
||||
.star = 15,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 20,
|
||||
.superMushroom = 10 },
|
||||
};
|
||||
|
||||
ItemProbabilities versus4PlayerProbabilityTable[] = {
|
||||
{ .none = 0,
|
||||
.banana = 35,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 30,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 5,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 10,
|
||||
.star = 0,
|
||||
.boo = 5,
|
||||
.mushroom = 10,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 5,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 10,
|
||||
.redShell = 15,
|
||||
.tripleRedShell = 15,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 5,
|
||||
.star = 5,
|
||||
.boo = 5,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 0 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 5,
|
||||
.redShell = 10,
|
||||
.tripleRedShell = 15,
|
||||
.blueSpinyShell = 5,
|
||||
.thunderbolt = 10,
|
||||
.fakeItemBox = 5,
|
||||
.star = 10,
|
||||
.boo = 0,
|
||||
.mushroom = 5,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 5 },
|
||||
{ .none = 0,
|
||||
.banana = 0,
|
||||
.bananaBunch = 0,
|
||||
.greenShell = 0,
|
||||
.tripleGreenShell = 0,
|
||||
.redShell = 0,
|
||||
.tripleRedShell = 20,
|
||||
.blueSpinyShell = 10,
|
||||
.thunderbolt = 15,
|
||||
.fakeItemBox = 0,
|
||||
.star = 20,
|
||||
.boo = 0,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 25,
|
||||
.superMushroom = 10 },
|
||||
};
|
||||
|
||||
ItemProbabilities battleProbabilityCurve[] = { { .none = 0,
|
||||
.banana = 10,
|
||||
.bananaBunch = 5,
|
||||
.greenShell = 5,
|
||||
.tripleGreenShell = 20,
|
||||
.redShell = 20,
|
||||
.tripleRedShell = 0,
|
||||
.blueSpinyShell = 0,
|
||||
.thunderbolt = 0,
|
||||
.fakeItemBox = 15,
|
||||
.star = 20,
|
||||
.boo = 5,
|
||||
.mushroom = 0,
|
||||
.doubleMushroom = 0,
|
||||
.tripleMushroom = 0,
|
||||
.superMushroom = 0 } };
|
||||
|
||||
void getProbabilityArray(const ItemProbabilities* probStruct, u8* probArray) {
|
||||
probArray[ITEM_NONE] = probStruct->none;
|
||||
probArray[ITEM_BANANA] = probStruct->banana;
|
||||
probArray[ITEM_BANANA_BUNCH] = probStruct->bananaBunch;
|
||||
probArray[ITEM_GREEN_SHELL] = probStruct->greenShell;
|
||||
probArray[ITEM_TRIPLE_GREEN_SHELL] = probStruct->tripleGreenShell;
|
||||
probArray[ITEM_RED_SHELL] = probStruct->redShell;
|
||||
probArray[ITEM_TRIPLE_RED_SHELL] = probStruct->tripleRedShell;
|
||||
probArray[ITEM_BLUE_SPINY_SHELL] = probStruct->blueSpinyShell;
|
||||
probArray[ITEM_THUNDERBOLT] = probStruct->thunderbolt;
|
||||
probArray[ITEM_FAKE_ITEM_BOX] = probStruct->fakeItemBox;
|
||||
probArray[ITEM_STAR] = probStruct->star;
|
||||
probArray[ITEM_BOO] = probStruct->boo;
|
||||
probArray[ITEM_MUSHROOM] = probStruct->mushroom;
|
||||
probArray[ITEM_DOUBLE_MUSHROOM] = probStruct->doubleMushroom;
|
||||
probArray[ITEM_TRIPLE_MUSHROOM] = probStruct->tripleMushroom;
|
||||
probArray[ITEM_SUPER_MUSHROOM] = probStruct->superMushroom;
|
||||
}
|
||||
|
||||
// Output a warning if a probability table does not add up to 100
|
||||
void verify_probability_table(char* str, const ItemProbabilities* probs, int16_t rank) {
|
||||
#ifndef _DEBUG
|
||||
return;
|
||||
#endif
|
||||
u8 itemProbabilities[ITEM_MAX];
|
||||
|
||||
getProbabilityArray(probs, itemProbabilities);
|
||||
size_t count = 0;
|
||||
for (size_t i = 0; i < ITEM_MAX; i++) {
|
||||
// printf("prob %d ", itemProbabilities[i]);
|
||||
count += itemProbabilities[i];
|
||||
}
|
||||
// printf("\n");
|
||||
|
||||
if (count != 100) {
|
||||
printf("update_objects.c::verify_probability_table\n %s table for rank %d is imba %d/100\n", str, rank, count);
|
||||
}
|
||||
}
|
||||
|
||||
enum RandomItemOption {
|
||||
HUMAN_TABLE,
|
||||
CPU_TABLE,
|
||||
HARD_CPU_TABLE,
|
||||
};
|
||||
|
||||
/**
|
||||
* New random item system uses chance based on percent
|
||||
* Likely functionally equivallent to the old system but easier to modify
|
||||
*/
|
||||
u8 gen_random_item(s16 rank, s16 option) {
|
||||
#define PERCENTAGE_BASE 100
|
||||
u16 rand = random_int(PERCENTAGE_BASE);
|
||||
#undef PERCENTAGE_BASE
|
||||
ItemProbabilities* distributionTable;
|
||||
u8 randomItem = 0;
|
||||
u8 cumulativeProbability = 0;
|
||||
|
||||
switch (gModeSelection) {
|
||||
case GRAND_PRIX:
|
||||
switch (option) {
|
||||
case HUMAN_TABLE:
|
||||
distributionTable = &grandPrixHumanProbabilityTable[rank];
|
||||
verify_probability_table("Human", distributionTable, rank);
|
||||
break;
|
||||
case CPU_TABLE:
|
||||
distributionTable = &grandPrixCPUProbabilityTable[rank];
|
||||
verify_probability_table("CPU", distributionTable, rank);
|
||||
break;
|
||||
case HARD_CPU_TABLE:
|
||||
distributionTable = &grandPrixHardCPUProbabilityTable[rank];
|
||||
verify_probability_table("Hard CPU", distributionTable, rank);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case VERSUS:
|
||||
switch (gPlayerCountSelection1) {
|
||||
case TWO_PLAYERS_SELECTED:
|
||||
distributionTable = &versus2PlayerProbabilityTable[rank];
|
||||
verify_probability_table("Versus 2P", distributionTable, rank);
|
||||
break;
|
||||
case THREE_PLAYERS_SELECTED:
|
||||
distributionTable = &versus3PlayerProbabilityTable[rank];
|
||||
verify_probability_table("Versus 3P", distributionTable, rank);
|
||||
break;
|
||||
case FOUR_PLAYERS_SELECTED:
|
||||
distributionTable = &versus4PlayerProbabilityTable[rank];
|
||||
verify_probability_table("Versus 4P", distributionTable, rank);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case BATTLE:
|
||||
distributionTable = &battleProbabilityCurve[0];
|
||||
verify_probability_table("Battle", distributionTable, rank);
|
||||
break;
|
||||
}
|
||||
|
||||
u8 itemProbabilities[ITEM_MAX];
|
||||
getProbabilityArray(distributionTable, itemProbabilities);
|
||||
|
||||
for (size_t i = 0; i < ITEM_MAX; i++) {
|
||||
cumulativeProbability += itemProbabilities[i];
|
||||
if (rand < cumulativeProbability) {
|
||||
randomItem = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return randomItem;
|
||||
}
|
||||
|
||||
u8 gen_random_item_human(UNUSED s16 arg0, s16 rank) {
|
||||
if (CVarGetInteger("gHarderCPU", 0) == true) {
|
||||
return gen_random_item(rank, HARD_CPU_TABLE);
|
||||
} else {
|
||||
return gen_random_item(rank, HUMAN_TABLE);
|
||||
}
|
||||
}
|
||||
|
||||
u8 cpu_gen_random_item(UNUSED s32 arg0, s16 rank) {
|
||||
return gen_random_item(rank, CPU_TABLE);
|
||||
}
|
||||
|
||||
u8 hard_cpu_gen_random_item(UNUSED s32 arg0, s16 rank) {
|
||||
return gen_random_item(rank, HARD_CPU_TABLE);
|
||||
}
|
||||
|
||||
s16 func_8007AFB0(s32 objectIndex, s32 playerId) {
|
||||
UNUSED s32 pad[3];
|
||||
s16 randomItem;
|
||||
|
||||
randomItem = gen_random_item_human(gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
randomItem = RaceManager_GetRandomHumanItem(gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
|
||||
if (randomItem == ITEM_NONE) {
|
||||
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
|
||||
@@ -3355,11 +2649,11 @@ s32 func_8007B040(s32 objectIndex, s32 playerId) {
|
||||
if (gModeSelection == GRAND_PRIX) {
|
||||
// Boo item
|
||||
if (random_int(0x0064U) < 0x51) {
|
||||
item = gen_random_item_human(gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
item = RaceManager_GetRandomHumanItem(gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
// ITEM_NONE is not a valid item for ghost, randomize again
|
||||
size_t attempts = 0;
|
||||
while (item == ITEM_NONE && attempts < 200) {
|
||||
item = gen_random_item_human(gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
item = RaceManager_GetRandomHumanItem(gGPCurrentRaceRankByPlayerId[playerId]);
|
||||
attempts++;
|
||||
}
|
||||
if (attempts >= 200) {
|
||||
|
||||
Reference in New Issue
Block a user