public static void DisableCombatMusicOnEnemy(GameObjects.Actor actor) { int actorInitVarRomAddr = actor.GetAttribute<ActorInitVarOffsetAttribute>().Offset; /// each enemy actor has actor init variables, /// if they have combat music is determined if a flag is set in the seventh byte /// disabling combat music means disabling this bit for most enemies int actorFileID = (int)actor; RomUtils.CheckCompressed(actorFileID); int actorFlagLocation = (actorInitVarRomAddr + 7);// - RomData.MMFileList[ActorFID].Addr; // file offset byte flagByte = RomData.MMFileList[actorFileID].Data[actorFlagLocation]; RomData.MMFileList[actorFileID].Data[actorFlagLocation] = (byte)(flagByte & 0xFB); if (actor == GameObjects.Actor.DekuBabaWithered) // special case: when they regrow music returns { // when they finish regrowing their combat music bit is reset, we need to no-op this to stop it // [ori t3,t1,0x0005] which is [35 2B 00 05] becomes [35 2B 00 01] as the 4 bit is combat music, 1 is R-targetable RomData.MMFileList[actorFileID].Data[0x12BF] = 0x01; } }
public static void DisableEnemyCombatMusic(bool weakEnemiesOnly = false) { /// each enemy has one int flag that contains a single bit that enables combat music /// to get these values I used the starting rom addr of the enemy actor /// searched the ram for the actor overlay table that has rom and ram per actor, /// there it lists the actor init var ram and actor ram locations, diff, apply to rom start /// the combat music flag is part of the seventh byte of the actor init variables, but our fuction knows this // we always disable wizrobe because he's a miniboss, // but when you enter his room you hear regular combat music for a few frames before his fight really starts // this isn't noticed in vanilla because vanilla combat starts slow DisableCombatMusicOnEnemy(GameObjects.Actor.Wizrobe); var weakEnemyList = new GameObjects.Actor[] { GameObjects.Actor.ChuChu, GameObjects.Actor.SkullFish, GameObjects.Actor.DekuBaba, GameObjects.Actor.DekuBabaWithered, GameObjects.Actor.BioDekuBaba, GameObjects.Actor.RealBombchu, GameObjects.Actor.Guay, GameObjects.Actor.Wolfos, GameObjects.Actor.Keese, GameObjects.Actor.Leever, GameObjects.Actor.Bo, GameObjects.Actor.DekuBaba, GameObjects.Actor.Shellblade, GameObjects.Actor.Tektite, GameObjects.Actor.BadBat, GameObjects.Actor.Eeno, GameObjects.Actor.MadShrub, GameObjects.Actor.Nejiron, GameObjects.Actor.Hiploop, GameObjects.Actor.Octarok, GameObjects.Actor.Shabom, GameObjects.Actor.Dexihand, GameObjects.Actor.Freezard, GameObjects.Actor.Armos, GameObjects.Actor.Snapper, GameObjects.Actor.Desbreko, GameObjects.Actor.Poe, GameObjects.Actor.GibdoIkana, GameObjects.Actor.GibdoWell, GameObjects.Actor.RedBubble, GameObjects.Actor.Stalchild }.ToList(); var annoyingEnemyList = new GameObjects.Actor[] { GameObjects.Actor.BlueBubble, GameObjects.Actor.LikeLike, GameObjects.Actor.Beamos, GameObjects.Actor.DeathArmos, GameObjects.Actor.Dinofos, GameObjects.Actor.DragonFly, GameObjects.Actor.GiantBeee, GameObjects.Actor.WallMaster, GameObjects.Actor.FloorMaster, GameObjects.Actor.Skulltula, GameObjects.Actor.SkullWallTula, GameObjects.Actor.ReDead, GameObjects.Actor.Peahat, GameObjects.Actor.Dodongo, GameObjects.Actor.Takkuri, GameObjects.Actor.Eyegore, GameObjects.Actor.IronKnuckle, GameObjects.Actor.Garo }.ToList(); var disableList = weakEnemiesOnly ? weakEnemyList : weakEnemyList.Concat(annoyingEnemyList); foreach (var enemy in disableList) { DisableCombatMusicOnEnemy(enemy); } }