Skip to content

Instantly share code, notes, and snippets.

@leoetlino
Last active December 31, 2018 21:05
Show Gist options
  • Save leoetlino/5b0b0961d1f84baf8c7fdc5d0ee08023 to your computer and use it in GitHub Desktop.
Save leoetlino/5b0b0961d1f84baf8c7fdc5d0ee08023 to your computer and use it in GitHub Desktop.
// This is at 0x710073D7FC in Switch 1.5.0
bool yigaWeaponStuff(sead::SafeString& enemyName, sead::SafeString& weaponName, bool wantFootsoldier,
const sead::SafeString& disguisedActorName)
{
const bool isFootsoldier = wantFootsoldier || enemyName == "Enemy_Assassin_Junior";
const bool isShooterJunior = enemyName == "Enemy_Assassin_Shooter_Junior";
weaponName = "";
if ( !wantFootsoldier && isFootsoldier ) // well, this is a bug!
{
enemyName = "";
return false;
}
if ( wantFootsoldier )
{
if ( disguisedActorName == "Npc_Assassin_001" )
enemyName = "Enemy_Assassin_Junior_Npc_001";
else if (disguisedActorName == "Npc_Assassin_002")
enemyName = "Enemy_Assassin_Junior_Npc_002";
else
enemyName = "Enemy_Assassin_Junior";
}
// If the player has opened the Thunder Helm chest
// (more precisely: basic signal was emitted by the chest)
if ( getFlag_ElectricRelic_GetBack() )
{
// Footsoldier
if (isFootsoldier)
{
if ( random() < 0.75 )
weaponName = "Weapon_Sword_073"; // Demon Carver
else
weaponName = "Weapon_Sword_053"; // Vicious Sickle
}
// Archer
else if (isShooterJunior)
{
weaponName = "Weapon_Bow_040"; // Duplex Bow
}
// Blademaster
else
{
weaponName = "Weapon_Lsword_074"; // Windcleaver
}
return !enemyName.empty();
}
// Otherwise, if the player has NOT opened the chest:
// Only footsoldiers are allowed to spawn
// And *only if* [the player has talked to Impa or Electric_Relic_AssassinFirst is set]
//
// Note that non-archer footsoldiers are not dynamic spawns.
if (isFootsoldier && (getFlag_Npc_Kakariko001_TalkEnd() || getFlag_Electric_Relic_AssassinFirst()))
{
weaponName = "Weapon_Sword_053"; // Vicious Sickle
return true;
}
// In any other case, blank out the enemy name and prevent it from spawning.
enemyName = "";
return false;
}
bool __fastcall yigaWeaponStuff(sead::SafeString *enemyName, sead::SafeString *weaponName, bool spawnRandomYiga, char *a4)
{
char **enemyNameC; // x23
char *v9; // x8
signed __int64 v10; // x10
int v11; // w12
BOOL isJuniorAssassin; // w25
signed __int64 v13; // x10
int v14; // w12
signed int isShooterJunior; // w26
signed __int64 v17; // x10
int v18; // w11
signed __int64 v19; // x10
int v20; // w11
char *v21; // x8
char *v22; // x8
sead::SafeStringBase *(__cdecl *assign)(sead::SafeString *, sead::SafeString *); // x8
sead::SafeStringBase *v24; // x1
sead::SafeString *v25; // x0
sead::SafeString v26; // [xsp+0h] [xbp-50h]
if ( spawnRandomYiga )
{
enemyNameC = &enemyName->cstr;
LABEL_9:
isJuniorAssassin = 1;
goto LABEL_10;
}
enemyName->vptr->assureTermination(enemyName);
enemyName->vptr->assureTermination(enemyName);
enemyNameC = &enemyName->cstr;
v9 = enemyName->cstr;
if ( v9 == "Enemy_Assassin_Junior" )
goto LABEL_9;
v10 = 0LL;
do...
isJuniorAssassin = 0;
LABEL_10:
enemyName->vptr->assureTermination(enemyName);
enemyName->vptr->assureTermination(enemyName);
if ( *enemyNameC == "Enemy_Assassin_Shooter_Junior" )
{
LABEL_16:
isShooterJunior = 1;
}
else
{
v13 = 0LL;
do...
isShooterJunior = 0;
}
weaponName->vptr->assign(weaponName, &sead::SafeStringBase<char>::cEmptyString);
if ( !spawnRandomYiga && isJuniorAssassin )
{
enemyName->vptr->assign(enemyName, &sead::SafeStringBase<char>::cEmptyString);
return 0;
}
if ( spawnRandomYiga )
{
v26.vptr = &sead::SafeString::vt;
v26.cstr = "Enemy_Assassin_Junior";
enemyName->vptr->assign(enemyName, &v26);
if ( a4 )
{
if ( a4 == "Npc_Assassin_001" )
{
LABEL_33:
v26.vptr = &sead::SafeString::vt;
v21 = "Enemy_Assassin_Junior_Npc_001";
}
else
{
v17 = 0LL;
do
{
v18 = (unsigned __int8)a4[v17];
if ( v18 != (unsigned __int8)aNpcAssassin001[v17] )
break;
if ( v18 == (unsigned __int8)sead::SafeStringBase<char>::cNullChar )
goto LABEL_33;
++v17;
}
while ( v17 < 0x80001 );
if ( a4 != "Npc_Assassin_002" )
{
v19 = 0LL;
do
{
v20 = (unsigned __int8)a4[v19];
if ( v20 != (unsigned __int8)aNpcAssassin002[v19] )
break;
if ( v20 == (unsigned __int8)sead::SafeStringBase<char>::cNullChar )
goto LABEL_34;
++v19;
}
while ( v19 < 0x80001 );
goto LABEL_36;
}
LABEL_34:
v26.vptr = &sead::SafeString::vt;
v21 = "Enemy_Assassin_Junior_Npc_002";
}
v26.cstr = v21;
enemyName->vptr->assign(enemyName, &v26);
goto LABEL_36;
}
}
LABEL_36:
if ( getFlag_ElectricRelic_GetBack(0) )
{
if ( !isJuniorAssassin )
{
if ( isShooterJunior )
{
v26.vptr = &sead::SafeString::vt;
v22 = "Weapon_Bow_040";
}
else
{
v26.vptr = &sead::SafeString::vt;
v22 = "Weapon_Lsword_074";
}
goto gotoAssignStringAndReturn;
}
if ( (float)(COERCE_FLOAT((sead::Random::getU32(sead::GlobalRandom::sInstance) >> 9) | 0x3F800000) + -1.0) < 0.75 )
{
v26.vptr = &sead::SafeString::vt;
v22 = "Weapon_Sword_073";
gotoAssignStringAndReturn:
v26.cstr = v22;
assign = weaponName->vptr->assign;
v24 = &v26;
v25 = weaponName;
goto assignStringAndReturn;
}
giveViciousSickle:
v26.vptr = &sead::SafeString::vt;
v22 = "Weapon_Sword_053";
goto gotoAssignStringAndReturn;
}
if ( (hasFlag_Npc_Kakariko001_TalkEnd(0) || hasFlag_Electric_Relic_AssassinFirst(0LL)) && isJuniorAssassin )
goto giveViciousSickle;
assign = enemyName->vptr->assign;
v24 = &sead::SafeStringBase<char>::cEmptyString;
v25 = enemyName;
assignStringAndReturn:
assign(v25, v24);
return **enemyNameC != sead::SafeStringBase<char>::cNullChar;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment