Skip to content

Instantly share code, notes, and snippets.

@leoetlino
Last active October 6, 2018 14:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leoetlino/54950eab6d1de860571889849e18fa99 to your computer and use it in GitHub Desktop.
Save leoetlino/54950eab6d1de860571889849e18fa99 to your computer and use it in GitHub Desktop.
// utility functions (inlined in the actual executable)
void GameDataMgr::setFlag(const sead::SafeString& flagName, bool value)
{
if (this->paramB.changeOnlyOnce)
return;
if (!TriggerParam::setBoolByKey(*this->paramB.param1, value, flag_name, this->paramB.x, 1LL, 1))
return;
if (!this->paramB.propagateParam1Changes)
return;
TriggerParam::setBoolByKey(*this->paramB.param, value, flag_name, this->paramB.x, 1LL, 1);
}
bool GameDataMgr::flagIsSet(const sead::SafeString& flagName)
{
bool value;
return TriggerParam::getFlagByKey(*this->param.param1, &value, flagName, this->param.x) && value;
}
// 0x7100DD0A88
// called from GameScene
void GameDataMgr::getAndSetShrineQuestAndKassFlags()
{
if (flagIsSet("DarkWoods_Giant_Clear") && !flagIsSet("DarkWoods_Finish"))
setFlag("DarkWoods_Giant_Clear", false);
if ( TriggerParam::getFlagByKey(*this->param.param1, &giant_ball1, "giant_ball1", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &giant_ball2, "giant_ball2", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &giant_ball3, "giant_ball3", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &giant_dungeon, "giant_dungeon", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &lithograph1, "MainField_DgnObj_RemainsLithogragh_A_02_789666109", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &lithograph2, "MainField_DgnObj_RemainsLithogragh_A_02_2456751716", this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, &lithograph3, "MainField_DgnObj_RemainsLithogragh_A_02_1822262999", this->param.x) )
{
if (giant_ball1 && !lithograph1 && !(this->flags & 0x40000))
setFlag("MainField_DgnObj_RemainsLithogragh_A_02_789666109", true);
if (giant_ball2 && !lithograph2 && !(this->flags & 0x40000))
setFlag("MainField_DgnObj_RemainsLithogragh_A_02_2456751716", true);
if (giant_ball3 && !lithograph3 && !(this->flags & 0x40000))
setFlag("MainField_DgnObj_RemainsLithogragh_A_02_1822262999", true);
if (!giant_dungeon && giant_ball1 && giant_ball2 && giant_ball3)
setFlag("giant_dungeon", true);
}
if (flagIsSet("MainField_Weapon_Bow_071_2178255681"))
setFlag("MainField_Weapon_Bow_071_2178255681", false);
if (flagIsSet("BalladOfHeroes_Step02") && !flagIsSet("BalladOfHeroes_Step03"))
{
int defeatedCount =
flagIsSet("Defeat_OneHitDungeon001") +
flagIsSet("Defeat_OneHitDungeon002") +
flagIsSet("Defeat_OneHitDungeon003") +
flagIsSet("Defeat_OneHitDungeon004");
bool defeatedNonLockedOneHitDungeon = !Lock_OneHitDungeon001 && Defeat_OneHitDungeon001;
defeatedNonLockedOneHitDungeon |= !Lock_OneHitDungeon002 && Defeat_OneHitDungeon002;
defeatedNonLockedOneHitDungeon |= !Lock_OneHitDungeon003 && Defeat_OneHitDungeon003;
defeatedNonLockedOneHitDungeon |= !Lock_OneHitDungeon004 && Defeat_OneHitDungeon004;
if ( defeatedNonLockedOneHitDungeon && defeatedCount >= 1 )
{
if (!flagIsSet("BalladOfHeroes_Step02_Dungeon01"))
setFlag("BalladOfHeroes_Step02_Dungeon01", true);
if ( defeatedCount >= 2 )
{
if (!flagIsSet("BalladOfHeroes_Step02_Dungeon02"))
setFlag("BalladOfHeroes_Step02_Dungeon02", true);
if ( defeatedCount >= 3 )
{
if (!flagIsSet("BalladOfHeroes_Step02_Dungeon03"))
setFlag("BalladOfHeroes_Step02_Dungeon03", true);
if (defeatedCount >= 4 && !flagIsSet("BalladOfHeroes_Step2_Dungeon4"))
setFlag("BalladOfHeroes_Step2_Dungeon4", true);
}
}
}
}
if (flagIsSet("IsGet_Armor_005_Head") &&
flagIsSet("IsGet_Armor_005_Upper") &&
flagIsSet("IsGet_Armor_005_Lower") &&
!(this->flags & 0x40000))
{
setFlag("CompleteDungeon_Finish", true);
}
if (flagIsSet("NightStoneBreak") && !flagIsSet("NightStoneDungeonAppear"))
setFlag("NightStoneBreak", false);
if (flagIsSet("Animal_Forest_Finish") &&
flagIsSet("HateeluMini_Treasure_Finish") &&
flagIsSet("Thunder_Sword_Finish") &&
flagIsSet("Relief_Landing_Finish") &&
flagIsSet("TwoWheels_Finish") &&
flagIsSet("Shadow_Sign_Finish") &&
flagIsSet("MouthofDragon_Finish") &&
flagIsSet("BloodyMoonRelief_Finish") &&
flagIsSet("Rito_BrosRock_Finish"))
{
setFlag("Npc_Musician_Come", true);
}
}
void __fastcall GameDataMgr::getAndSetShrineQuestAndKassFlags(GameDataMgr *this)
{
BOOL v2; // w0
char v3; // w8
int v4; // w9
signed int v5; // w25
bool v6; // w0
BOOL v7; // w0
sead::SafeStringBase::vtable *v8; // [xsp+0h] [xbp-140h]
char v9; // [xsp+8h] [xbp-138h]
char v10; // [xsp+9h] [xbp-137h]
char v11; // [xsp+Ah] [xbp-136h]
char v12; // [xsp+Bh] [xbp-135h]
char v13; // [xsp+Ch] [xbp-134h]
char v14; // [xsp+Dh] [xbp-133h]
int a2; // [xsp+10h] [xbp-130h]
char v16; // [xsp+14h] [xbp-12Ch]
char v17; // [xsp+15h] [xbp-12Bh]
char v18; // [xsp+16h] [xbp-12Ah]
char v19; // [xsp+17h] [xbp-129h]
int v20[2]; // [xsp+18h] [xbp-128h]
sead::SafeString a3; // [xsp+20h] [xbp-120h]
sead::SafeString v22; // [xsp+30h] [xbp-110h]
sead::SafeString v23; // [xsp+40h] [xbp-100h]
sead::SafeString v24; // [xsp+50h] [xbp-F0h]
sead::SafeString v25; // [xsp+60h] [xbp-E0h]
sead::SafeString v26; // [xsp+70h] [xbp-D0h]
sead::SafeString v27; // [xsp+80h] [xbp-C0h]
sead::SafeString v28; // [xsp+90h] [xbp-B0h]
sead::SafeString v29; // [xsp+A0h] [xbp-A0h]
sead::SafeString v30; // [xsp+B0h] [xbp-90h]
sead::SafeString v31; // [xsp+C0h] [xbp-80h]
sead::SafeString v32; // [xsp+D0h] [xbp-70h]
sead::SafeString v33; // [xsp+E0h] [xbp-60h]
sead::SafeString v34; // [xsp+F0h] [xbp-50h]
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "DarkWoods_Giant_Clear";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "DarkWoods_Finish";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 1, &v22, this->param.x)
&& (_BYTE)v8
&& !BYTE1(v8)
&& !this->paramB.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->paramB.param1, 0, &a3, this->paramB.x, 1LL, 1)
&& this->paramB.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->paramB.param, 0, &a3, this->paramB.x, 1LL, 1);
}
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "giant_ball1";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "giant_ball2";
v23.vptr = &`vtable for'sead::SafeStringBase<char>;
v23.cstr = "giant_ball3";
v27.vptr = &`vtable for'sead::SafeStringBase<char>;
v27.cstr = "MainField_DgnObj_RemainsLithogragh_A_02_1822262999";
v24.vptr = &`vtable for'sead::SafeStringBase<char>;
v24.cstr = "giant_dungeon";
v25.vptr = &`vtable for'sead::SafeStringBase<char>;
v25.cstr = "MainField_DgnObj_RemainsLithogragh_A_02_789666109";
v26.vptr = &`vtable for'sead::SafeStringBase<char>;
v26.cstr = "MainField_DgnObj_RemainsLithogragh_A_02_2456751716";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 1, &v22, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 2, &v23, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 3, &v24, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 4, &v25, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 5, &v26, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 6, &v27, this->param.x) )
{
if ( (_BYTE)v8
&& !BYTE4(v8)
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v25, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v25, this->param.x, 1LL, 0);
}
if ( BYTE1(v8)
&& !BYTE5(v8)
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v26, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v26, this->param.x, 1LL, 0);
}
if ( BYTE2(v8)
&& !BYTE6(v8)
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v27, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v27, this->param.x, 1LL, 0);
}
if ( !BYTE3(v8)
&& (_BYTE)v8 != 0
&& BYTE1(v8) != 0
&& BYTE2(v8) != 0
&& !this->paramB.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->paramB.param1, 1, &v24, this->paramB.x, 1LL, 1)
&& this->paramB.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->paramB.param, 1, &v24, this->paramB.x, 1LL, 1);
}
}
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "MainField_Weapon_Bow_071_2178255681";
v2 = TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x);
if ( (_BYTE)v8
&& v2
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 0, &a3, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 0, &a3, this->param.x, 1LL, 0);
}
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "BalladOfHeroes_Step02";
v23.vptr = &`vtable for'sead::SafeStringBase<char>;
v23.cstr = "Defeat_OneHitDungeon001";
v24.vptr = &`vtable for'sead::SafeStringBase<char>;
v24.cstr = "Defeat_OneHitDungeon002";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "BalladOfHeroes_Step03";
v34.vptr = &`vtable for'sead::SafeStringBase<char>;
v34.cstr = "BalladOfHeroes_Step2_Dungeon4";
v25.vptr = &`vtable for'sead::SafeStringBase<char>;
v25.cstr = "Defeat_OneHitDungeon003";
v26.vptr = &`vtable for'sead::SafeStringBase<char>;
v26.cstr = "Defeat_OneHitDungeon004";
v27.vptr = &`vtable for'sead::SafeStringBase<char>;
v27.cstr = "Lock_OneHitDungeon001";
v28.vptr = &`vtable for'sead::SafeStringBase<char>;
v28.cstr = "Lock_OneHitDungeon002";
v29.vptr = &`vtable for'sead::SafeStringBase<char>;
v29.cstr = "Lock_OneHitDungeon003";
v30.vptr = &`vtable for'sead::SafeStringBase<char>;
v30.cstr = "Lock_OneHitDungeon004";
v31.vptr = &`vtable for'sead::SafeStringBase<char>;
v31.cstr = "BalladOfHeroes_Step02_Dungeon01";
v32.vptr = &`vtable for'sead::SafeStringBase<char>;
v32.cstr = "BalladOfHeroes_Step02_Dungeon02";
v33.vptr = &`vtable for'sead::SafeStringBase<char>;
v33.cstr = "BalladOfHeroes_Step02_Dungeon03";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 1, &v22, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 2, &v23, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 3, &v24, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 4, &v25, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 5, &v26, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 6, &v27, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 7, &v28, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v9, &v29, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v10, &v30, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v11, &v31, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v12, &v32, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v13, &v33, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v14, &v34, this->param.x)
&& (_BYTE)v8
&& !BYTE1(v8) )
{
v3 = BYTE2(v8);
v4 = BYTE6(v8) == 0 && BYTE2(v8) != 0;
if ( BYTE3(v8) )
{
if ( BYTE2(v8) )
v3 = 2;
else
v3 = 1;
v4 |= HIBYTE(v8) == 0;
}
if ( BYTE4(v8) )
{
++v3;
v4 |= v9 == 0;
}
if ( BYTE5(v8) )
{
if ( !((v4 | (v10 == 0)) & 1) )
goto LABEL_105;
++v3;
}
else if ( !v4 )
{
goto LABEL_105;
}
v5 = v3;
if ( v3 >= 1 )
{
if ( !v11
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v31, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v31, this->param.x, 1LL, 0);
}
if ( v5 >= 2 )
{
if ( !v12
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v32, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v32, this->param.x, 1LL, 0);
}
if ( v5 >= 3 )
{
if ( !v13
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v33, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v33, this->param.x, 1LL, 0);
}
if ( v5 >= 4
&& !v14
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v34, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v34, this->param.x, 1LL, 0);
}
}
}
}
}
LABEL_105:
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "IsGet_Armor_005_Head";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "IsGet_Armor_005_Upper";
v23.vptr = &`vtable for'sead::SafeStringBase<char>;
v23.cstr = "IsGet_Armor_005_Lower";
v24.vptr = &`vtable for'sead::SafeStringBase<char>;
v24.cstr = "CompleteDungeon_Finish";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 1, &v22, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 2, &v23, this->param.x) )
{
v6 = TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 3, &v24, this->param.x);
if ( !BYTE3(v8)
&& (_BYTE)v8 != 0
&& v6
&& BYTE1(v8) != 0
&& BYTE2(v8) != 0
&& !(this->flags & 0x40000)
&& !this->param.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->param.param1, 1, &v24, this->param.x, 1LL, 0)
&& this->param.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->param.param, 1, &v24, this->param.x, 1LL, 0);
}
}
}
}
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "NightStoneBreak";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "NightStoneDungeonAppear";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8, &a3, this->param.x)
&& TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v8 + 1, &v22, this->param.x)
&& (_BYTE)v8
&& !BYTE1(v8)
&& !this->paramB.changeOnlyOnce
&& TriggerParam::setBoolByKey(*this->paramB.param1, 0, &a3, this->paramB.x, 1LL, 1)
&& this->paramB.propagateParam1Changes )
{
TriggerParam::setBoolByKey(*this->paramB.param, 0, &a3, this->paramB.x, 1LL, 1);
}
a3.vptr = &`vtable for'sead::SafeStringBase<char>;
a3.cstr = "Animal_Forest_Finish";
v22.vptr = &`vtable for'sead::SafeStringBase<char>;
v22.cstr = "HateeluMini_Treasure_Finish";
v23.vptr = &`vtable for'sead::SafeStringBase<char>;
v23.cstr = "Thunder_Sword_Finish";
v24.vptr = &`vtable for'sead::SafeStringBase<char>;
v24.cstr = "Relief_Landing_Finish";
v27.vptr = &`vtable for'sead::SafeStringBase<char>;
v27.cstr = "TwoWheels_Finish";
v25.vptr = &`vtable for'sead::SafeStringBase<char>;
v25.cstr = "Shadow_Sign_Finish";
v26.vptr = &`vtable for'sead::SafeStringBase<char>;
v26.cstr = "MouthofDragon_Finish";
v28.vptr = &`vtable for'sead::SafeStringBase<char>;
v28.cstr = "BloodyMoonRelief_Finish";
v29.vptr = &`vtable for'sead::SafeStringBase<char>;
v29.cstr = "Rito_BrosRock_Finish";
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&a2, &a3, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&a2 + 1, &v22, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&a2 + 2, &v23, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&a2 + 3, &v24, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v16, &v25, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v17, &v26, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v18, &v27, this->param.x) )
{
if ( TriggerParam::getFlagByKey(*this->param.param1, (bool *)&v19, &v28, this->param.x) )
{
v7 = TriggerParam::getFlagByKey(*this->param.param1, (bool *)v20, &v29, this->param.x);
if ( (_BYTE)a2 )
{
if ( v7 )
{
if ( BYTE1(a2) )
{
if ( BYTE2(a2) )
{
if ( HIBYTE(a2) )
{
if ( v16 )
{
if ( v17 )
{
if ( v18 )
{
if ( v19 )
{
if ( LOBYTE(v20[0]) )
{
v8 = &`vtable for'sead::SafeStringBase<char>;
*(_QWORD *)&v9 = "Npc_Musician_Come";
if ( !this->paramB.changeOnlyOnce )
{
if ( TriggerParam::setBoolByKey(
*this->paramB.param1,
1,
(const sead::SafeString *)&v8,
this->paramB.x,
1LL,
1) )
{
if ( this->paramB.propagateParam1Changes )
TriggerParam::setBoolByKey(
*this->paramB.param,
1,
(const sead::SafeString *)&v8,
this->paramB.x,
1LL,
1);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment