Name the special values used with Kinstone Fusions

This commit is contained in:
Catobat 2023-04-29 02:56:08 +02:00
parent a82ad2951a
commit fcfbd73dd2
13 changed files with 62 additions and 53 deletions

View File

@ -35,7 +35,7 @@ typedef struct {
extern const KinstoneWorldEvent gKinstoneWorldEvents[];
typedef enum {
KINSTONE_0,
KINSTONE_NONE,
KINSTONE_MYSTERIOUS_CLOUD_TOP_RIGHT,
KINSTONE_MYSTERIOUS_CLOUD_BOTTOM_LEFT,
KINSTONE_MYSTERIOUS_CLOUD_TOP_LEFT,
@ -136,6 +136,11 @@ typedef enum {
KINSTONE_62,
KINSTONE_63,
KINSTONE_64,
/* some special values, mostly for fusers */
KINSTONE_NEEDS_REPLACEMENT = 0xF1,
KINSTONE_JUST_FUSED = 0xF2,
KINSTONE_FUSER_DONE = 0xF3,
KINSTONE_RANDOM = 0xFF,
} KinstoneId;
typedef struct {

View File

@ -84,12 +84,12 @@ void NPCInit(Entity* ent);
void CollideFollowers(void);
// TODO move?
void AddInteractableWhenBigFuser(Entity* ent, u32 arg1);
void AddInteractableWhenBigFuser(Entity* ent, u32 kinstoneId);
u32 sub_0806F5A4(u32);
u32 GetFusionToOffer(Entity*);
void AddInteractableWhenBigObject(Entity*);
void sub_0807000C(Entity*);
void AddInteractableAsMinishFuser(Entity*, u32);
void AddInteractableAsMinishFuser(Entity* ent, u32 kinstoneId);
enum NPC {
/*0x00*/ NPC_NONE_0,

View File

@ -831,28 +831,28 @@ void sub_0801E64C(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_
}
}
void NotifyFusersOnFusionDone(u32 kinstoneId) {
void NotifyFusersOnFusionDone(KinstoneId kinstoneId) {
u32 tmp;
u32 index;
if (kinstoneId - 1 < 100) {
for (index = 0; index < 0x80; index++) {
if (kinstoneId == gSave.fuserOffers[index]) {
gSave.fuserOffers[index] = 0xf1;
gSave.fuserOffers[index] = KINSTONE_NEEDS_REPLACEMENT;
}
}
tmp = GetFuserId(gFuseInfo.ent);
if ((tmp - 1 < 0x7f) && (gSave.fuserOffers[tmp] == 0xf1)) {
gSave.fuserOffers[tmp] = 0xf2;
if ((tmp - 1 < 0x7f) && (gSave.fuserOffers[tmp] == KINSTONE_NEEDS_REPLACEMENT)) {
gSave.fuserOffers[tmp] = KINSTONE_JUST_FUSED;
}
for (index = 0; index < 0x20; index++) {
if (kinstoneId == gPossibleInteraction.candidates[index].kinstoneId) {
gPossibleInteraction.candidates[index].kinstoneId = 0xf1;
gPossibleInteraction.candidates[index].kinstoneId = KINSTONE_NEEDS_REPLACEMENT;
}
}
}
}
void AddKinstoneToBag(u32 kinstoneId) {
void AddKinstoneToBag(KinstoneId kinstoneId) {
s32 index;
s32 tmp;
@ -861,7 +861,7 @@ void AddKinstoneToBag(u32 kinstoneId) {
index = GetIndexInKinstoneBag(kinstoneId);
if (index < 0) {
index = 0;
while (gSave.kinstoneTypes[index] != 0) {
while (gSave.kinstoneTypes[index] != KINSTONE_NONE) {
index++;
}
}
@ -876,19 +876,19 @@ void AddKinstoneToBag(u32 kinstoneId) {
}
}
void RemoveKinstoneFromBag(u32 kinstoneId) {
void RemoveKinstoneFromBag(KinstoneId kinstoneId) {
s32 idx = GetIndexInKinstoneBag(kinstoneId);
if (idx >= 0) {
s32 next = gSave.kinstoneAmounts[idx] - 1;
if (next <= 0) {
gSave.kinstoneTypes[idx] = 0;
gSave.kinstoneTypes[idx] = KINSTONE_NONE;
next = 0;
}
gSave.kinstoneAmounts[idx] = next;
}
}
u32 GetAmountInKinstoneBag(u32 kinstoneId) {
u32 GetAmountInKinstoneBag(KinstoneId kinstoneId) {
s32 index = GetIndexInKinstoneBag(kinstoneId);
if (index < 0) {
return 0;
@ -896,15 +896,15 @@ u32 GetAmountInKinstoneBag(u32 kinstoneId) {
return gSave.kinstoneAmounts[index];
}
u32 CheckKinstoneFused(u32 kinstoneId) {
if (kinstoneId > 100 || kinstoneId < 1) {
u32 CheckKinstoneFused(KinstoneId kinstoneId) {
if (kinstoneId - 1 >= 100) {
return 0;
}
return ReadBit(&gSave.fusedKinstones, kinstoneId);
}
bool32 CheckFusionMapMarkerDisabled(u32 kinstoneId) {
if (kinstoneId > 100 || kinstoneId < 1) {
bool32 CheckFusionMapMarkerDisabled(KinstoneId kinstoneId) {
if (kinstoneId - 1 >= 100) {
return FALSE;
}
return ReadBit(&gSave.fusionUnmarked, kinstoneId);
@ -974,7 +974,7 @@ code0_2:
#endif
}
s32 GetIndexInKinstoneBag(u32 kinstoneId) {
s32 GetIndexInKinstoneBag(KinstoneId kinstoneId) {
u32 i;
for (i = 0; i < 0x12; ++i) {
@ -1054,7 +1054,7 @@ void UpdateVisibleFusionMapMarkers(void) {
extern u8* gUnk_08001DCC[];
u32 GetFusionToOffer(Entity* entity) {
KinstoneId GetFusionToOffer(Entity* entity) {
u8* fuserData;
u32 fuserId;
u32 offeredFusion;
@ -1065,20 +1065,20 @@ u32 GetFusionToOffer(Entity* entity) {
fuserId = GetFuserId(entity);
fuserData = gUnk_08001DCC[fuserId];
if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0 || fuserData[0] > gSave.global_progress) {
return 0;
return KINSTONE_NONE;
}
offeredFusion = gSave.fuserOffers[fuserId];
fuserProgress = gSave.fuserProgress[fuserId];
fuserFusionData = (u8*)(fuserProgress + (u32)fuserData);
while (TRUE) { // loop through fusions for this fuser
switch (offeredFusion) {
case 0xF1: // offered fusion completed with someone else
case 0x00: // no fusion offered yet
case KINSTONE_NEEDS_REPLACEMENT: // offered fusion completed with someone else
case KINSTONE_NONE: // no fusion offered yet
offeredFusion = fuserFusionData[5];
if (offeredFusion == 0x00 || offeredFusion == 0xFF || CheckKinstoneFused(offeredFusion) == 0) {
if (offeredFusion == KINSTONE_NONE || offeredFusion == 0xFF || CheckKinstoneFused(offeredFusion) == 0) {
break;
}
case 0xF2: // previous fusion completed
case KINSTONE_JUST_FUSED: // previous fusion completed
fuserFusionData++;
fuserProgress++;
offeredFusion = fuserFusionData[5];
@ -1086,27 +1086,27 @@ u32 GetFusionToOffer(Entity* entity) {
if (offeredFusion == 0xFF) { // random shared fusion
offeredFusion = GetRandomSharedFusion(fuserData);
}
if (offeredFusion == 0x00) { // end of fusion list
offeredFusion = 0xF3; // mark this fuser as done
if (offeredFusion == KINSTONE_NONE) { // end of fusion list
offeredFusion = KINSTONE_FUSER_DONE; // mark this fuser as done
break;
}
if (offeredFusion == 0xF2) { // previous fusion completed
if (offeredFusion == KINSTONE_JUST_FUSED) { // previous fusion completed
continue;
}
if (CheckKinstoneFused(offeredFusion) == 0) {
break;
}
offeredFusion = 0xF1; // already completed, try next fusion in the list
offeredFusion = KINSTONE_NEEDS_REPLACEMENT; // already completed, try next fusion in the list
}
gSave.fuserOffers[fuserId] = offeredFusion;
gSave.fuserProgress[fuserId] = fuserProgress;
randomMood = Random();
fuserStability = fuserData[1];
if (fuserStability <= randomMood % 100) {
return 0; // fickleness
return KINSTONE_NONE; // fickleness
}
if (offeredFusion - 1 > 99) {
offeredFusion = 0;
offeredFusion = KINSTONE_NONE;
}
return offeredFusion;
}
@ -1286,5 +1286,5 @@ u32 GetRandomSharedFusion(u8* fuserData) {
return kinstoneId;
r = (r + 1) % 18;
}
return 0xF2;
return KINSTONE_JUST_FUSED;
}

View File

@ -13,6 +13,7 @@
#include "functions.h"
#include "game.h"
#include "item.h"
#include "kinstone.h"
void sub_08028E9C(Entity*);
void sub_08028EDC(Entity*);
@ -257,7 +258,7 @@ void sub_08028CE8(Entity* this) {
switch (offer->field_0x0 >> 2) {
case 0:
subtype = offer->field_0x9;
if (subtype == 0xff) {
if (subtype == KINSTONE_RANDOM) {
subtype = kinstoneTypes[Random() & 7];
}

View File

@ -151,7 +151,7 @@ void KinstoneMenu_Type0(void) {
gScreen.bg3.updated = 1;
KinstoneMenu_080A4528();
sub_080A4398();
AddKinstoneToBag(0);
AddKinstoneToBag(KINSTONE_NONE);
sub_080A70AC((void*)gUnk_081280DC);
SetMenuType(1);
SetFade(FADE_BLACK_WHITE | FADE_INSTANT, 8);
@ -606,8 +606,8 @@ u32 sub_080A4418(u32 param_1, u32 param_2) {
}
void KinstoneMenu_080A4468(void) {
gPossibleInteraction.kinstoneId = 0;
gPossibleInteraction.currentObject->kinstoneId = 0;
gPossibleInteraction.kinstoneId = KINSTONE_NONE;
gPossibleInteraction.currentObject->kinstoneId = KINSTONE_NONE;
NotifyFusersOnFusionDone(gFuseInfo.kinstoneId);
RemoveKinstoneFromBag(gKinstoneMenu.unk2a);
}

View File

@ -11,6 +11,7 @@
#include "game.h"
#include "item.h"
#include "itemMetaData.h"
#include "kinstone.h"
#include "main.h"
#include "menu.h"
#include "message.h"
@ -1281,7 +1282,7 @@ void PauseMenu_Screen_7(void) {
void sub_080A6024(void) {
sub_080A70AC((KeyButtonLayout*)&gUnk_08128D60);
AddKinstoneToBag(0);
AddKinstoneToBag(KINSTONE_NONE);
sub_080A4398();
SetMenuType(1);
}

View File

@ -1,5 +1,6 @@
#include "npc.h"
#include "functions.h"
#include "kinstone.h"
void (*const Cucco_Actions[])(Entity*);
const u16 Cucco_Sounds[];
@ -113,7 +114,7 @@ void sub_0806E65C(Entity* this) {
void Cucco_ShowMessage(Entity* this) {
u32 val = 0;
u32 index = GetFuserId(this);
if (gSave.fuserOffers[index] == 0xf3) {
if (gSave.fuserOffers[index] == KINSTONE_FUSER_DONE) {
val = 1;
}

View File

@ -1,6 +1,7 @@
#include "global.h"
#include "entity.h"
#include "npc.h"
#include "kinstone.h"
void Din(Entity* this) {
switch (this->action) {
@ -30,11 +31,11 @@ void Din(Entity* this) {
}
void Din_MakeInteractable(Entity* this) {
u32 tmp = GetFusionToOffer(this);
u32 kinstoneId = GetFusionToOffer(this);
if ((gSave.fuserProgress[GetFuserId(this)] != 0) && (gSave.global_progress < 7)) {
tmp = 0;
kinstoneId = KINSTONE_NONE;
}
AddInteractableWhenBigFuser(this, tmp);
AddInteractableWhenBigFuser(this, kinstoneId);
}
void Din_Fusion(Entity* this) {

View File

@ -1,6 +1,7 @@
#include "global.h"
#include "entity.h"
#include "npc.h"
#include "kinstone.h"
void Farore(Entity* this) {
switch (this->action) {
@ -30,11 +31,11 @@ void Farore(Entity* this) {
}
void Farore_MakeInteractable(Entity* this) {
u32 tmp = GetFusionToOffer(this);
u32 kinstoneId = GetFusionToOffer(this);
if ((gSave.fuserProgress[GetFuserId(this)] != 0) && (gSave.global_progress < 7)) {
tmp = 0;
kinstoneId = KINSTONE_NONE;
}
AddInteractableWhenBigFuser(this, tmp);
AddInteractableWhenBigFuser(this, kinstoneId);
}
void Farore_Fusion(Entity* this) {

View File

@ -1,6 +1,7 @@
#include "global.h"
#include "entity.h"
#include "npc.h"
#include "kinstone.h"
void Nayru(Entity* this) {
switch (this->action) {
@ -30,11 +31,11 @@ void Nayru(Entity* this) {
}
void Nayru_MakeInteractable(Entity* this) {
u32 tmp = GetFusionToOffer(this);
u32 kinstoneId = GetFusionToOffer(this);
if ((gSave.fuserProgress[GetFuserId(this)] != 0) && (gSave.global_progress < 7)) {
tmp = 0;
kinstoneId = KINSTONE_NONE;
}
AddInteractableWhenBigFuser(this, tmp);
AddInteractableWhenBigFuser(this, kinstoneId);
}
void Nayru_Fusion(Entity* this) {

View File

@ -58,7 +58,7 @@ u8 NPC4E_GetKinstoneId(Entity* this) {
switch (this->type) {
default:
result = KINSTONE_0;
result = KINSTONE_NONE;
break;
case 1:
result = KINSTONE_MYSTERIOUS_CLOUD_TOP_RIGHT;
@ -89,13 +89,11 @@ u8 NPC4E_GetKinstoneId(Entity* this) {
return result;
}
// Check whether a kinstone fusion is possible and store the result somewhere in param_2?
void NPC4E_IsKinstoneFused(Entity* this, ScriptExecutionContext* context) {
context->condition = CheckKinstoneFused(NPC4E_GetKinstoneId(this));
gActiveScriptInfo.flags |= 1;
}
// maybe actually execute the kinstone fusion?
void NPC4E_MakeFuserInteractable(Entity* this) {
AddInteractableFuser(this, NPC4E_GetKinstoneId(this));
}

View File

@ -355,7 +355,7 @@ u32 UpdateFuseInteraction(Entity* ent) {
void sub_0806F188(Entity* ent) {
u32 idx = GetFuserId(ent);
if (idx != 0)
gSave.fuserOffers[idx] = 0xF3;
gSave.fuserOffers[idx] = KINSTONE_FUSER_DONE;
}
void ShowNPCDialogue(Entity* ent, const Dialog* dia) {

View File

@ -1092,7 +1092,7 @@ bool32 sub_080782C0(void) {
}
}
if (((gPlayerState.playerInput.newInput & PLAYER_INPUT_1000) != 0) && ((u8)(gPossibleInteraction.currentObject->kinstoneId - 1) < 100)) {
AddKinstoneToBag(0);
AddKinstoneToBag(KINSTONE_NONE);
if (gSave.kinstoneAmounts[0] != 0) {
gPossibleInteraction.kinstoneId = gPossibleInteraction.currentObject->kinstoneId;
gPossibleInteraction.currentObject->entity->interactType = 2;
@ -1120,7 +1120,7 @@ bool32 sub_080782C0(void) {
case INTERACTION_USE_SMALL_KEY:
case INTERACTION_TALK_MINISH:
entity->interactType = 1;
gPossibleInteraction.kinstoneId = 0;
gPossibleInteraction.kinstoneId = KINSTONE_NONE;
return TRUE;
case INTERACTION_LIFT_SHOP_ITEM:
if (gRoomVars.shopItemType == 0) {
@ -1229,7 +1229,7 @@ s32 AddInteractableObject(Entity* entity, InteractionType type, KinstoneId kinst
gPossibleInteraction.candidates[index].type = type;
gPossibleInteraction.candidates[index].kinstoneId = kinstoneId;
}
if (kinstoneId != 0) {
if (kinstoneId != KINSTONE_NONE) {
Entity* entity = FindEntityByID(OBJECT, CAMERA_TARGET, 6);
if (entity == NULL) {
CreateObject(CAMERA_TARGET, 0, 0);