Discover MP features/unlockables structure and rename many symbols

This commit is contained in:
Ryan Dwyer
2020-11-25 00:07:40 +10:00
parent 5c60cfb8e8
commit 0aa56dba60
13 changed files with 566 additions and 467 deletions
+81 -4
View File
@@ -246,10 +246,6 @@
#define CASING_RIFLE 2
#define CASING_SHOTGUN 3
// Challenge numbers don't appear to be a 1:1 mapping :(
#define CHALLENGE_7 30
#define CHALLENGE_UNK64 64
#define CHANNEL_0 0
#define CHANNEL_1 1
#define CHANNEL_2 2
@@ -1767,6 +1763,87 @@
#define MPCONFIG_CHALLENGE29 0x2a
#define MPCONFIG_CHALLENGE30 0x2b
// Features are things that can be unlocked
#define MPFEATURE_WEAPON_FARSIGHT 0x01
#define MPFEATURE_WEAPON_TRANQUILIZER 0x02
#define MPFEATURE_WEAPON_SUPERDRAGON 0x03
#define MPFEATURE_WEAPON_SLAYER 0x04
#define MPFEATURE_WEAPON_FALCON2SILENCED 0x05
#define MPFEATURE_WEAPON_FALCON2SCOPE 0x06
#define MPFEATURE_WEAPON_MAULER 0x07
#define MPFEATURE_WEAPON_PHOENIX 0x08
#define MPFEATURE_WEAPON_DY357LX 0x09
#define MPFEATURE_WEAPON_CALLISTO 0x0a
#define MPFEATURE_WEAPON_LAPTOPGUN 0x0b
#define MPFEATURE_WEAPON_K7AVENGER 0x0c
#define MPFEATURE_WEAPON_RCP120 0x0d
#define MPFEATURE_WEAPON_SHOTGUN 0x0e
#define MPFEATURE_WEAPON_REAPER 0x0f
#define MPFEATURE_WEAPON_DEVASTATOR 0x10
#define MPFEATURE_WEAPON_CROSSBOW 0x11
#define MPFEATURE_WEAPON_NBOMB 0x12
#define MPFEATURE_WEAPON_PROXIMITYMINE 0x13
#define MPFEATURE_WEAPON_REMOTEMINE 0x14
#define MPFEATURE_WEAPON_XRAYSCANNER 0x15
#define MPFEATURE_WEAPON_SHIELD 0x16
#define MPFEATURE_WEAPON_CLOAKINGDEVICE 0x17
#define MPFEATURE_WEAPON_COMBATBOOST 0x18
#define MPFEATURE_SIMSKILL_HARD 0x19
#define MPFEATURE_SIMSKILL_PERFECT 0x1a
#define MPFEATURE_1B 0x1b
#define MPFEATURE_SIMSKILL_DARK 0x1c
#define MPFEATURE_SLOWMOTION 0x1d
#define MPFEATURE_ONEHITKILLS 0x1e
#define MPFEATURE_1F 0x1f
#define MPFEATURE_20 0x20
#define MPFEATURE_21 0x21
#define MPFEATURE_22 0x22
#define MPFEATURE_STAGE_CARPARK 0x23
#define MPFEATURE_STAGE_COMPLEX 0x24
#define MPFEATURE_STAGE_WAREHOUSE 0x25
#define MPFEATURE_STAGE_RAVINE 0x26
#define MPFEATURE_STAGE_TEMPLE 0x27
#define MPFEATURE_STAGE_G5BUILDING 0x28
#define MPFEATURE_STAGE_GRID 0x29
#define MPFEATURE_STAGE_FELICITY 0x2a
#define MPFEATURE_STAGE_VILLA 0x2b
#define MPFEATURE_STAGE_SEWERS 0x2c
#define MPFEATURE_STAGE_RUINS 0x2d
#define MPFEATURE_STAGE_BASE 0x2e
#define MPFEATURE_2F 0x2f
#define MPFEATURE_STAGE_FORTRESS 0x30
#define MPFEATURE_31 0x31
#define MPFEATURE_32 0x32
#define MPFEATURE_33 0x33
#define MPFEATURE_34 0x34
#define MPFEATURE_35 0x35
#define MPFEATURE_36 0x36
#define MPFEATURE_37 0x37
#define MPFEATURE_38 0x38
#define MPFEATURE_39 0x39
#define MPFEATURE_3A 0x3a
#define MPFEATURE_3B 0x3b
#define MPFEATURE_3C 0x3c
#define MPFEATURE_3D 0x3d
#define MPFEATURE_3E 0x3e
#define MPFEATURE_3F 0x3f
#define MPFEATURE_8BOTS 0x40 // also unlocks the 4 Bonds
#define MPFEATURE_41 0x41
#define MPFEATURE_42 0x42
#define MPFEATURE_43 0x43
#define MPFEATURE_44 0x44
#define MPFEATURE_45 0x45
#define MPFEATURE_46 0x46
#define MPFEATURE_47 0x47
#define MPFEATURE_48 0x48
#define MPFEATURE_49 0x49
#define MPFEATURE_4A 0x4a
#define MPFEATURE_4B 0x4b
#define MPFEATURE_4C 0x4c
#define MPFEATURE_4D 0x4d
#define MPFEATURE_4E 0x4e
#define MPFEATURE_WEAPON_LASER 0x4f
#define MPHEAD_DARK_COMBAT 0x00
#define MPHEAD_DARK_FROCK 0x01
#define MPHEAD_DARKAQUA 0x02
+11 -11
View File
@@ -14,18 +14,18 @@ void mpPerformSanityChecks(void);
char *mpGetChallengeNameBySlot(s32 slot);
bool mpIsChallengeCompletedByAnyChrWithNumPlayersBySlot(s32 slot, s32 numplayers);
struct mpconfigfull *mpLoadConfig(s32 confignum, u8 *buffer, s32 len);
s32 func0f19bb50(s32 unlockvalue, u8 *array, s32 index, s32 len);
s32 mpForceUnlockFeature(s32 featurenum, u8 *array, s32 tail, s32 len);
s32 func0f19bb98(struct mpsetup *mpsetup, u8 *array, s32 len);
u32 func0f19bd4c(void);
void func0f19bfa0(void);
void mpForceUnlockSimulantFeatures(void);
void func0f19c1cc(void);
char *mpGetCurrentChallengeDescription(void);
char *mpconfigGetDescription(struct mpconfigfull *mpconfig);
bool mpIsChallengeCompleteForEndscreen(void);
bool aiMpInitSimulants(void);
void func0f19ab40(void);
bool func0f19af3c(s32 chrnum, s32 challengeindex);
bool mpIsChallengeAvailable(s32 challengeindex);
bool mpIsChallengeAvailableToPlayer(s32 chrnum, s32 challengeindex);
bool mpIsChallengeAvailableToAnyPlayer(s32 challengeindex);
s32 mpGetNumAvailableChallenges(void);
char *mpChallengeGetName(s32 challengeindex);
void mpSetCurrentChallenge(s32 slotnum);
@@ -38,14 +38,14 @@ s32 mpRemoveLock(void);
void mpLoadAndStoreCurrentChallenge(u8 *buffer, s32 len);
void mpClearCurrentChallenge(void);
bool mpIsChallengeLoaded(void);
s32 mpGetNumChallengesAvailable(s32 mpchrnum);
s32 mpGetAutoFocusedChallengeIndex(s32 mpchrnum);
char *mpChallengeGetNameWithArg(s32 arg0, s32 challengeindex);
bool func0f19c3bc(s32 mpchrnum, s32 index, s32 numplayers);
bool mpIsChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers);
void mpSetChallengeCompletedByAnyChrWithNumPlayers(s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByChrWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers);
void mpSetChallengeCompletedByChrWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByPlayerWithNumPlayers2(s32 mpchrnum, s32 index, s32 numplayers);
bool mpIsChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers);
void mpSetChallengeCompletedByAnyPlayerWithNumPlayers(s32 index, s32 numplayers, bool completed);
bool mpIsChallengeCompletedByPlayerWithNumPlayers(s32 mpchrnum, s32 index, s32 numplayers);
void mpSetChallengeCompletedByPlayerWithNumPlayers(u32 mpchrnum, s32 index, s32 numplayers, bool completed);
void mpConsiderMarkingCurrentChallengeComplete(void);
bool mpIsChallengeComplete(s32 challenge);
bool mpIsFeatureUnlocked(s32 feature);
#endif
+2 -2
View File
@@ -48,13 +48,13 @@ void func0f18b9e4(void);
u32 func0f18bb1c(void);
s32 mpGetNumHeads(void);
s32 mpGetHeadId(u8 headnum);
s32 mpGetHeadUnlockValue(u8 headnum);
s32 mpGetHeadRequiredFeature(u8 headnum);
s32 mpGetBeauHeadId(u8 headnum);
u32 mpGetNumBodies(void);
s32 mpGetBodyId(u8 bodynum);
s32 mpGetMpbodynumByBodynum(u16 bodynum);
char *mpGetBodyName(u8 bodynum);
u8 mpGetBodyUnk06(u8 bodynum);
u8 mpGetBodyRequiredFeature(u8 bodynum);
s32 mpGetMpheadnumByMpbodynum(s32 bodynum);
u32 mpChooseRandomLockPlayer(void);
bool mpSetLock(s32 locktype, s32 playernum);
+2 -2
View File
@@ -833,8 +833,8 @@ extern u32 var800acc28[18];
extern u32 var800acc70;
extern u32 var800acc74;
extern struct chrdata *g_MpSimulantChrs[MAX_SIMULANTS];
extern u8 var800acca0[40];
extern u8 g_MpChallengesCompleted[];
extern u8 g_MpFeaturesForceUnlocked[40];
extern u8 g_MpFeaturesUnlocked[80];
extern struct frdata g_FrData;
extern struct trainingdata g_DtData;
extern struct trainingdata g_HoloTrainingData;
+20 -11
View File
@@ -3070,7 +3070,7 @@ struct stagetableentry {
struct mpweaponset {
/*0x00*/ u16 name;
/*0x02*/ u8 slots[6];
/*0x08*/ u8 unlocks[4];
/*0x08*/ u8 requirefeatures[4];
/*0x0c*/ u8 unk0c;
/*0x0d*/ u8 unk0d;
/*0x0e*/ u8 unk0e;
@@ -3081,7 +3081,7 @@ struct mpweaponset {
struct mphead {
s16 headnum;
u8 unlockvalue;
u8 requirefeature;
};
struct mpsimulanttype {
@@ -3089,14 +3089,14 @@ struct mpsimulanttype {
/*0x01*/ u8 skill;
/*0x02*/ u16 name;
/*0x04*/ u16 body;
/*0x06*/ u8 unlockvalue;
/*0x06*/ u8 requirefeature;
};
struct mpbody {
s16 bodynum;
s16 name;
s16 headnum;
u8 unlockvalue;
u8 requirefeature;
};
struct mptrack {
@@ -4484,7 +4484,7 @@ struct mpscenariooverview {
struct mparena {
s16 stagenum;
u8 unlock;
u8 requirefeature;
u16 name;
};
@@ -4521,11 +4521,20 @@ struct challenge {
/*0x00*/ u16 name;
/*0x02*/ s16 confignum;
// One byte for each number of players,
// and 4 bits in each to mark which players completed it
/*0x04*/ u8 completions[5];
// Bitfield xxx4 321a
// The number denotes if that player has the challenge available,
// and `a` denotes if any other has the challenge available.
/*0x04*/ u8 availability;
/*0x09*/ u8 unk09[16];
// Same structure as availability, however each byte determines how many
// players it was completed with. So completions[0] is for completions with
// a single player and completions[3] is for completions with 4 players.
/*0x05*/ u8 completions[4];
// Array of features which will become unlocked once the challenge is
// available. Seems to be unused though, as all arrays are empty.
// Maybe it's populated at runtime?
/*0x09*/ u8 unlockfeatures[16];
};
struct scenariodata_cbt {
@@ -4777,7 +4786,7 @@ struct criteria_holograph {
struct mppreset {
u16 name;
u32 confignum;
u8 challenges[16];
u8 requirefeatures[16]; // Doesn't seem to be used? All values are zero
};
struct explosiontype {
@@ -5816,7 +5825,7 @@ struct mpweapon {
/*0x03*/ s8 weapon2ammotypeminusone;
/*0x04*/ u8 weapon2ammoqty;
/*0x05*/ u8 giveweapon : 1;
/*0x05*/ u8 unlock : 7;
/*0x05*/ u8 unlockfeature : 7;
/*0x06*/ s16 model;
/*0x08*/ s16 extrascale;
};