mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-12 01:40:47 +00:00
Restructure event flags in z64save.h (1/?) (#2380)
* Simplify most event flags * EVENTINF_HORSES_INDEX -> EVENTINF_INDEX_HORSES * Add missing index numbers * pr suggestions * Clean up INGO_RACE flags
This commit is contained in:
parent
471fe51c82
commit
ee4b3474a5
18 changed files with 166 additions and 164 deletions
|
@ -696,7 +696,8 @@ static s16 sDemoEffectLightColors[] = { DEMO_EFFECT_LIGHT_GREEN, DEMO_EFFECT_LIG
|
|||
|
||||
static s16 sExItemTypes[] = { EXITEM_MAGIC_WIND, EXITEM_MAGIC_FIRE, EXITEM_MAGIC_DARK };
|
||||
|
||||
static s16 sItemGetFlags[] = { ITEMGETINF_18_MASK, ITEMGETINF_19_MASK, ITEMGETINF_1A_MASK };
|
||||
static s16 sItemGetFlagMasks[] = { ITEMGETINF_MASK(ITEMGETINF_18), ITEMGETINF_MASK(ITEMGETINF_19),
|
||||
ITEMGETINF_MASK(ITEMGETINF_1A) };
|
||||
|
||||
static u8 sItemIds[] = { ITEM_FARORES_WIND, ITEM_DINS_FIRE, ITEM_NAYRUS_LOVE };
|
||||
|
||||
|
@ -808,7 +809,7 @@ void BgDyYoseizo_Give_Reward(BgDyYoseizo* this, PlayState* play) {
|
|||
this->itemSpawned = true;
|
||||
gSaveContext.healthAccumulator = 0x140;
|
||||
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_HEARTS_MAGIC);
|
||||
gSaveContext.save.info.itemGetInf[ITEMGETINF_18_19_1A_INDEX] |= sItemGetFlags[cueIdTemp];
|
||||
gSaveContext.save.info.itemGetInf[ITEMGETINF_INDEX_18_19_1A] |= sItemGetFlagMasks[cueIdTemp];
|
||||
Item_Give(play, sItemIds[cueIdTemp]);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -138,7 +138,7 @@ void BgSpot09Obj_Init(Actor* thisx, PlayState* play) {
|
|||
BgSpot09Obj* this = (BgSpot09Obj*)thisx;
|
||||
|
||||
PRINTF("Spot09 Object [arg_data : 0x%04x](大工救出フラグ 0x%x)\n", this->dyna.actor.params,
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX] &
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_CARPENTERS_FREE] &
|
||||
EVENTCHKINF_CARPENTERS_FREE_MASK_ALL);
|
||||
this->dyna.actor.params &= 0xFF;
|
||||
if ((this->dyna.actor.params < 0) || (this->dyna.actor.params >= 5)) {
|
||||
|
|
|
@ -270,7 +270,7 @@ void EnDaiku_UpdateText(EnDaiku* this, PlayState* play) {
|
|||
if (this->stateFlags & ENDAIKU_STATEFLAG_GERUDODEFEATED) {
|
||||
freedCount = 0;
|
||||
for (carpenterType = 0; carpenterType < 4; carpenterType++) {
|
||||
if (gSaveContext.save.info.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX] &
|
||||
if (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_CARPENTERS_FREE] &
|
||||
EVENTCHKINF_CARPENTERS_FREE_MASK(carpenterType)) {
|
||||
freedCount++;
|
||||
}
|
||||
|
@ -399,7 +399,7 @@ void EnDaiku_InitEscape(EnDaiku* this, PlayState* play) {
|
|||
EnDaiku_ChangeAnim(this, ENDAIKU_ANIM_RUN, &this->currentAnimIndex);
|
||||
this->stateFlags &= ~(ENDAIKU_STATEFLAG_1 | ENDAIKU_STATEFLAG_2);
|
||||
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX] |=
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_CARPENTERS_FREE] |=
|
||||
EVENTCHKINF_CARPENTERS_FREE_MASK(PARAMS_GET_U(this->actor.params, 0, 2));
|
||||
|
||||
this->actor.gravity = -1.0f;
|
||||
|
|
|
@ -108,22 +108,22 @@ static EnFrPointers sEnFrPointers = {
|
|||
};
|
||||
|
||||
#define FROG_HAS_SONG_BEEN_PLAYED(frogSongIndex) \
|
||||
(gSaveContext.save.info.eventChkInf[EVENTCHKINF_SONGS_FOR_FROGS_INDEX] & \
|
||||
(gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_SONGS_FOR_FROGS] & \
|
||||
sFrogSongIndexToEventChkInfSongsForFrogsMask[frogSongIndex])
|
||||
|
||||
#define FROG_SET_SONG_PLAYED(frogSongIndex) \
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_SONGS_FOR_FROGS_INDEX] |= \
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_SONGS_FOR_FROGS] |= \
|
||||
sFrogSongIndexToEventChkInfSongsForFrogsMask[frogSongIndex];
|
||||
|
||||
static u16 sFrogSongIndexToEventChkInfSongsForFrogsMask[] = {
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_ZL_MASK, // FROG_ZL
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_EPONA_MASK, // FROG_EPONA
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_SARIA_MASK, // FROG_SARIA
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_SUNS_MASK, // FROG_SUNS
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_SOT_MASK, // FROG_SOT
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_STORMS_MASK, // FROG_STORMS
|
||||
EVENTCHKINF_SONGS_FOR_FROGS_CHOIR_MASK, // FROG_CHOIR_SONG
|
||||
0, // FROG_NO_SONG
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_ZL), // FROG_ZL
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_EPONA), // FROG_EPONA
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_SARIA), // FROG_SARIA
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_SUNS), // FROG_SUNS
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_SOT), // FROG_SOT
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_STORMS), // FROG_STORMS
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_SONGS_FOR_FROGS_CHOIR), // FROG_CHOIR_SONG
|
||||
0, // FROG_NO_SONG
|
||||
};
|
||||
|
||||
static u8 sFrogToFrogSongIndex[] = {
|
||||
|
|
|
@ -225,7 +225,7 @@ s32 Ge2_DetectPlayerInUpdate(PlayState* play, EnGe2* this, Vec3f* pos, s16 yRot,
|
|||
}
|
||||
|
||||
s32 EnGe2_CheckCarpentersFreed(void) {
|
||||
if (CHECK_FLAG_ALL(gSaveContext.save.info.eventChkInf[EVENTCHKINF_CARPENTERS_FREE_INDEX] &
|
||||
if (CHECK_FLAG_ALL(gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_CARPENTERS_FREE] &
|
||||
(EVENTCHKINF_CARPENTERS_FREE_MASK_ALL | 0xF0),
|
||||
EVENTCHKINF_CARPENTERS_FREE_MASK_ALL)) {
|
||||
return 1;
|
||||
|
|
|
@ -605,7 +605,7 @@ u16 EnHy_GetTextId(PlayState* play, Actor* thisx) {
|
|||
switch (ENHY_GET_TYPE(&this->actor)) {
|
||||
case ENHY_TYPE_DOG_LADY:
|
||||
if (play->sceneId == SCENE_KAKARIKO_CENTER_GUEST_HOUSE) {
|
||||
return (this->talonEventChkInf & EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO_MASK)
|
||||
return (this->talonEventChkInf & EVENTCHKINF_MASK(EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO))
|
||||
? 0x508D
|
||||
: (GET_INFTABLE(INFTABLE_CB) ? 0x508C : 0x508B);
|
||||
} else if (play->sceneId == SCENE_MARKET_DAY) {
|
||||
|
@ -738,7 +738,7 @@ u16 EnHy_GetTextId(PlayState* play, Actor* thisx) {
|
|||
if (!LINK_IS_ADULT) {
|
||||
return GET_EVENTCHKINF(EVENTCHKINF_80) ? 0x505F : (GET_INFTABLE(INFTABLE_163) ? 0x505E : 0x505D);
|
||||
} else {
|
||||
return (this->talonEventChkInf & EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO_MASK)
|
||||
return (this->talonEventChkInf & EVENTCHKINF_MASK(EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO))
|
||||
? 0x5062
|
||||
: (GET_INFTABLE(INFTABLE_164) ? 0x5061 : 0x5060);
|
||||
}
|
||||
|
@ -1165,7 +1165,7 @@ void EnHy_WaitForObjects(EnHy* this, PlayState* play) {
|
|||
}
|
||||
|
||||
if (play->sceneId == SCENE_KAKARIKO_CENTER_GUEST_HOUSE) {
|
||||
this->talonEventChkInf = gSaveContext.save.info.eventChkInf[EVENTCHKINF_TALON_RETURNED_FROM_KAKARIKO_INDEX];
|
||||
this->talonEventChkInf = gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_TALON_RETURNED_FROM_KAKARIKO];
|
||||
}
|
||||
|
||||
EnHy_InitSetProperties(this);
|
||||
|
|
|
@ -500,7 +500,7 @@ void EnIn_Init(Actor* thisx, PlayState* play) {
|
|||
respawnPos = respawn->pos;
|
||||
// hardcoded coords for lon lon entrance
|
||||
if (D_80A7B998 == 0 && respawnPos.x == 1107.0f && respawnPos.y == 0.0f && respawnPos.z == -3740.0f) {
|
||||
gSaveContext.eventInf[EVENTINF_HORSES_INDEX] = 0;
|
||||
gSaveContext.eventInf[EVENTINF_INDEX_HORSES] = 0;
|
||||
D_80A7B998 = 1;
|
||||
}
|
||||
this->actionFunc = EnIn_WaitForObject;
|
||||
|
@ -586,7 +586,7 @@ void EnIn_WaitForObject(EnIn* this, PlayState* play) {
|
|||
case INGO_RACE_STATE_RACING:
|
||||
EnIn_ChangeAnim(this, ENIN_ANIM_2);
|
||||
this->actionFunc = func_80A7A4C8;
|
||||
gSaveContext.eventInf[EVENTINF_HORSES_INDEX] = 0;
|
||||
gSaveContext.eventInf[EVENTINF_INDEX_HORSES] = 0;
|
||||
break;
|
||||
case INGO_RACE_STATE_HORSE_RENTAL_PERIOD:
|
||||
this->actor.attentionRangeType = ATTENTION_RANGE_3;
|
||||
|
|
|
@ -64,9 +64,9 @@ void EnMu_Interact(EnMu* this, PlayState* play) {
|
|||
s32 randomIndex;
|
||||
s32 i;
|
||||
|
||||
textFlags = gSaveContext.eventInf[EVENTINF_20_21_22_23_24_INDEX] &
|
||||
textFlags = gSaveContext.eventInf[EVENTINF_INDEX_20_21_22_23_24] &
|
||||
(EVENTINF_20_MASK | EVENTINF_21_MASK | EVENTINF_22_MASK | EVENTINF_23_MASK | EVENTINF_24_MASK);
|
||||
gSaveContext.eventInf[EVENTINF_20_21_22_23_24_INDEX] &=
|
||||
gSaveContext.eventInf[EVENTINF_INDEX_20_21_22_23_24] &=
|
||||
~(EVENTINF_20_MASK | EVENTINF_21_MASK | EVENTINF_22_MASK | EVENTINF_23_MASK | EVENTINF_24_MASK);
|
||||
randomIndex = (play->state.frames + (s32)(Rand_ZeroOne() * 5.0f)) % 5;
|
||||
|
||||
|
@ -95,7 +95,7 @@ void EnMu_Interact(EnMu* this, PlayState* play) {
|
|||
textFlags |= bitmask[randomIndex];
|
||||
this->defaultTextId = textIdOffset[randomIndex] | 0x7000;
|
||||
textFlags &= EVENTINF_20_MASK | EVENTINF_21_MASK | EVENTINF_22_MASK | EVENTINF_23_MASK | EVENTINF_24_MASK | 0xE0;
|
||||
gSaveContext.eventInf[EVENTINF_20_21_22_23_24_INDEX] |= textFlags;
|
||||
gSaveContext.eventInf[EVENTINF_INDEX_20_21_22_23_24] |= textFlags;
|
||||
}
|
||||
|
||||
u16 EnMu_GetTextId(PlayState* play, Actor* thisx) {
|
||||
|
|
|
@ -66,8 +66,8 @@ static Vec3f sKakarikoPosList[] = {
|
|||
};
|
||||
|
||||
static s16 sKakarikoFlagList[] = {
|
||||
INFTABLE_199_MASK, INFTABLE_19A_MASK, INFTABLE_19B_MASK, INFTABLE_19C_MASK,
|
||||
INFTABLE_19D_MASK, INFTABLE_19E_MASK, INFTABLE_19F_MASK,
|
||||
INFTABLE_MASK(INFTABLE_199), INFTABLE_MASK(INFTABLE_19A), INFTABLE_MASK(INFTABLE_19B), INFTABLE_MASK(INFTABLE_19C),
|
||||
INFTABLE_MASK(INFTABLE_19D), INFTABLE_MASK(INFTABLE_19E), INFTABLE_MASK(INFTABLE_19F),
|
||||
};
|
||||
|
||||
static u8 sLowerRiverSpawned = false;
|
||||
|
@ -162,7 +162,7 @@ void EnNiw_Init(Actor* thisx, PlayState* play) {
|
|||
fabsf(this->actor.world.pos.z - sKakarikoPosList[i].z) < 40.0f) {
|
||||
this->unk_2AA = i;
|
||||
PRINTF(VT_FGCOL(YELLOW) " 通常鶏index %d\n" VT_RST, this->unk_2AA);
|
||||
if (gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX] &
|
||||
if (gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F] &
|
||||
sKakarikoFlagList[i]) {
|
||||
this->actor.world.pos.x = 300.0f;
|
||||
this->actor.world.pos.y = 100.0f;
|
||||
|
|
|
@ -43,8 +43,8 @@ static s16 sMissingCuccoTextIds[] = {
|
|||
};
|
||||
|
||||
static s16 D_80ABB3B4[] = {
|
||||
INFTABLE_199_MASK, INFTABLE_19A_MASK, INFTABLE_19B_MASK, INFTABLE_19C_MASK,
|
||||
INFTABLE_19D_MASK, INFTABLE_19E_MASK, INFTABLE_19F_MASK,
|
||||
INFTABLE_MASK(INFTABLE_199), INFTABLE_MASK(INFTABLE_19A), INFTABLE_MASK(INFTABLE_19B), INFTABLE_MASK(INFTABLE_19C),
|
||||
INFTABLE_MASK(INFTABLE_19D), INFTABLE_MASK(INFTABLE_19E), INFTABLE_MASK(INFTABLE_19F),
|
||||
};
|
||||
|
||||
static ColliderCylinderInit sCylinderInit = {
|
||||
|
@ -210,7 +210,7 @@ void func_80ABA244(EnNiwLady* this, PlayState* play) {
|
|||
if ((fabsf(currentCucco->actor.world.pos.x - 330.0f) < 90.0f) &&
|
||||
(fabsf(currentCucco->actor.world.pos.z - 1610.0f) < 190.0f)) {
|
||||
if (this->unk_26C == 0) {
|
||||
gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX] |=
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F] |=
|
||||
D_80ABB3B4[currentCucco->unk_2AA];
|
||||
if (BREG(1) != 0) {
|
||||
// "GET inside the chicken fence!"
|
||||
|
@ -219,7 +219,7 @@ void func_80ABA244(EnNiwLady* this, PlayState* play) {
|
|||
}
|
||||
this->cuccosInPen++;
|
||||
} else if (this->unk_26C == 0) {
|
||||
gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX] &=
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F] &=
|
||||
~D_80ABB3B4[currentCucco->unk_2AA];
|
||||
}
|
||||
}
|
||||
|
@ -276,12 +276,13 @@ void func_80ABA244(EnNiwLady* this, PlayState* play) {
|
|||
this->unk_262 = TEXT_STATE_EVENT;
|
||||
this->unk_26A = this->cuccosInPen;
|
||||
PRINTF(VT_FGCOL(CYAN) "☆☆☆☆☆ 柵内BIT変更前 ☆☆ %x\n" VT_RST,
|
||||
gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX]);
|
||||
gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX] &=
|
||||
(u16) ~(INFTABLE_199_MASK | INFTABLE_19A_MASK | INFTABLE_19B_MASK | INFTABLE_19C_MASK |
|
||||
INFTABLE_19D_MASK | INFTABLE_19E_MASK | INFTABLE_19F_MASK);
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F]);
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F] &=
|
||||
(u16) ~(INFTABLE_MASK(INFTABLE_199) | INFTABLE_MASK(INFTABLE_19A) | INFTABLE_MASK(INFTABLE_19B) |
|
||||
INFTABLE_MASK(INFTABLE_19C) | INFTABLE_MASK(INFTABLE_19D) | INFTABLE_MASK(INFTABLE_19E) |
|
||||
INFTABLE_MASK(INFTABLE_19F));
|
||||
PRINTF(VT_FGCOL(CYAN) "☆☆☆☆☆ 柵内BIT変更後 ☆☆ %x\n" VT_RST,
|
||||
gSaveContext.save.info.infTable[INFTABLE_199_19A_19B_19C_19D_19E_19F_INDEX]);
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_199_19A_19B_19C_19D_19E_19F]);
|
||||
PRINTF("\n\n");
|
||||
this->actionFunc = func_80ABA654;
|
||||
return;
|
||||
|
|
|
@ -74,7 +74,12 @@ static EnSthActionFunc sRewardObtainedWaitActions[6] = {
|
|||
};
|
||||
|
||||
static u16 sEventFlags[6] = {
|
||||
0, EVENTCHKINF_DA_MASK, EVENTCHKINF_DB_MASK, EVENTCHKINF_DC_MASK, EVENTCHKINF_DD_MASK, EVENTCHKINF_DE_MASK,
|
||||
0,
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_DA),
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_DB),
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_DC),
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_DD),
|
||||
EVENTCHKINF_MASK(EVENTCHKINF_DE),
|
||||
};
|
||||
|
||||
static s16 sGetItemIds[6] = {
|
||||
|
@ -156,7 +161,7 @@ void EnSth_SetupAfterObjectLoaded(EnSth* this, PlayState* play) {
|
|||
|
||||
this->eventFlag = sEventFlags[this->actor.params];
|
||||
params = &this->actor.params;
|
||||
if (gSaveContext.save.info.eventChkInf[EVENTCHKINF_DA_DB_DC_DD_DE_INDEX] & this->eventFlag) {
|
||||
if (gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_DA_DB_DC_DD_DE] & this->eventFlag) {
|
||||
EnSth_SetupAction(this, sRewardObtainedWaitActions[*params]);
|
||||
} else {
|
||||
EnSth_SetupAction(this, EnSth_RewardUnobtainedWait);
|
||||
|
@ -256,7 +261,7 @@ void EnSth_GiveReward(EnSth* this, PlayState* play) {
|
|||
if (Actor_HasParent(&this->actor, play)) {
|
||||
this->actor.parent = NULL;
|
||||
EnSth_SetupAction(this, EnSth_RewardObtainedTalk);
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_DA_DB_DC_DD_DE_INDEX] |= this->eventFlag;
|
||||
gSaveContext.save.info.eventChkInf[EVENTCHKINF_INDEX_DA_DB_DC_DD_DE] |= this->eventFlag;
|
||||
} else {
|
||||
EnSth_GivePlayerItem(this, play);
|
||||
}
|
||||
|
|
|
@ -10760,7 +10760,7 @@ void Player_Init(Actor* thisx, PlayState* play2) {
|
|||
gSaveContext.respawn[RESPAWN_MODE_DOWN].data = 1;
|
||||
|
||||
if (play->sceneId <= SCENE_INSIDE_GANONS_CASTLE_COLLAPSE) {
|
||||
gSaveContext.save.info.infTable[INFTABLE_1AX_INDEX] |= gBitFlags[play->sceneId];
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_1AX] |= gBitFlags[play->sceneId];
|
||||
}
|
||||
|
||||
startMode = PLAYER_GET_START_MODE(thisx);
|
||||
|
|
|
@ -466,7 +466,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
|
|||
Inventory_ChangeEquipment(pauseCtx->cursorY[PAUSE_EQUIP], pauseCtx->cursorX[PAUSE_EQUIP]);
|
||||
|
||||
if (pauseCtx->cursorY[PAUSE_EQUIP] == 0) {
|
||||
gSaveContext.save.info.infTable[INFTABLE_1DX_INDEX] = 0;
|
||||
gSaveContext.save.info.infTable[INFTABLE_INDEX_1DX] = 0;
|
||||
gSaveContext.save.info.equips.buttonItems[0] = cursorItem;
|
||||
|
||||
if ((pauseCtx->cursorX[PAUSE_EQUIP] == 3) && (gSaveContext.save.info.playerData.bgsFlag != 0)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue