diff --git a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs
index 753608a10..797e36dea 100644
--- a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs
+++ b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8.cs
@@ -135,8 +135,43 @@ namespace PKHeX.Core
};
}
- public override bool CanHaveIntensity(int memory, int intensity) => true; // todo
- public override bool CanHaveFeeling(int memory, int feeling, int argument) => true; // todo
- public override int GetMinimumIntensity(int memory) => 3; // todo
+ public static bool CanHaveFeeling8(int memory, int feeling, int argument)
+ {
+ if (memory >= MemoryFeelings.Length)
+ return false;
+ if (feeling <= 0)
+ return false; // Different from Gen6; this +1 is to match them treating 0 as empty
+ return (MemoryFeelings[memory] & (1 << --feeling)) != 0;
+ }
+
+ public static bool CanHaveIntensity8(int memory, int intensity)
+ {
+ if (memory >= MemoryFeelings.Length)
+ return false;
+ return MemoryMinIntensity[memory] <= intensity;
+ }
+
+ public static int GetRandomFeeling8(int memory, int max = 24)
+ {
+ var bits = MemoryFeelings[memory];
+ var rnd = Util.Rand;
+ while (true)
+ {
+ int feel = rnd.Next(max);
+ if ((bits & (1 << feel)) != 0)
+ return feel + 1; // Different from Gen6; this +1 is to match them treating 0 as empty
+ }
+ }
+
+ public static int GetMinimumIntensity8(int memory)
+ {
+ if (memory >= MemoryMinIntensity.Length)
+ return -1;
+ return MemoryMinIntensity[memory];
+ }
+
+ public override bool CanHaveIntensity(int memory, int intensity) => CanHaveIntensity8(memory, intensity);
+ public override bool CanHaveFeeling(int memory, int feeling, int argument) => CanHaveFeeling8(memory, feeling, argument);
+ public override int GetMinimumIntensity(int memory) => GetMinimumIntensity8(memory);
}
}
diff --git a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8Data.cs b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8Data.cs
index 5c5ae97ad..8ec736222 100644
--- a/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8Data.cs
+++ b/PKHeX.Core/Legality/Restrictions/Memories/MemoryContext8Data.cs
@@ -244,5 +244,53 @@ namespace PKHeX.Core
65,
71, 72, 73, 74, 75, 76, 77, 78, 79,
};
+
+ private static readonly byte[] MemoryMinIntensity =
+ {
+ 0, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 4, 5, 5,
+ 5, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 1, 3, 2, 2, 4, 3, 4, 4,
+ 4, 4, 2, 4, 2, 4, 3, 3, 4, 2,
+ 3, 3, 3, 3, 3, 2, 3, 4, 4, 2, // same as Gen6
+ 2, 3, 3, 3, 3, 4, 5, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ };
+
+ // [0,99]+1 >= CHANCE -> abort
+ // this silly +1 causes:
+ // 100% memories to fail 1% of the time
+ // 1% memories to fail 100% of the time (!!!)
+ // swsh v1.3 sub_71013B0C40
+ private static readonly byte[] MemoryRandChance =
+ {
+ 000, 100, 100, 100, 100, 005, 005, 005, 005, 005,
+ 005, 005, 005, 005, 010, 020, 010, 001, 050, 030,
+ 005, 005, 020, 005, 005, 005, 001, 050, 100, 050,
+ 050, 002, 002, 005, 005, 005, 005, 005, 005, 002,
+ 020, 020, 005, 010, 001, 001, 050, 030, 020, 020,
+ 010, 010, 001, 010, 001, 050, 030, 030, 030, 002,
+ 050, 020, 020, 020, 020, 010, 010, 050, 020, 005, // same as Gen6
+ 005, 010, 010, 020, 020, 010, 100, 010, 005, 010,
+ 010, 010, 010, 010, 010, 010, 010, 001, 001, 001,
+ };
+
+ ///
+ /// 24bits of flags allowing certain feelings for a given memory index.
+ ///
+ /// Beware, there was an off-by-one error in the game that made Feeling 0 unobtainable, and thus the Happy feeling bit (rightmost) is omitted.
+ private static readonly uint[] MemoryFeelings =
+ {
+ 0x000000, 0x04CBFD, 0x004BFD, 0x04CBFD, 0x04CBFD, 0xFFFBFB, 0x84FFF9, 0x47FFFF, 0xBF7FFA, 0x7660B0,
+ 0x80BDF9, 0x88FB7A, 0x083F79, 0x0001FE, 0xCFEFFF, 0x84EBAF, 0xB368B0, 0x091F7E, 0x0320A0, 0x080DDD,
+ 0x081A7B, 0x404030, 0x0FFFFF, 0x9A08BC, 0x089A7B, 0x0032AA, 0x80FF7A, 0x0FFFFF, 0x0805FD, 0x098278,
+ 0x0B3FFF, 0x8BBFFA, 0x8BBFFE, 0x81A97C, 0x8BB97C, 0x8BBF7F, 0x8BBF7F, 0x8BBF7F, 0x8BBF7F, 0xAC3ABE,
+ 0xBFFFFF, 0x8B837C, 0x848AFA, 0x88FFFE, 0x8B0B7C, 0xB76AB2, 0x8B1FFF, 0xBE7AB8, 0xB77EB8, 0x8C9FFD,
+ 0xBF9BFF, 0xF408B0, 0xBCFE7A, 0x8F3F72, 0x90DB7A, 0xBCEBFF, 0xBC5838, 0x9C3FFE, 0x9CFFFF, 0x96D83A,
+ 0xB770B0, 0x881F7A, 0x839F7A, 0x839F7A, 0x839F7A, 0x53897F, 0x41BB6F, 0x0C35FF, 0x8BBF7F, 0x8BBF7F, // same as Gen6
+ 0x90CC7E, 0x2FBF7F, 0x2FBF7F, 0xB797FF, 0x3FB7FF, 0xBFFFFF, 0xCC8BFF, 0xF69F7F, 0x37FDFF, 0x2B277F,
+ 0x8FFBFA, 0x8CDFFA, 0xFCE9EF, 0x8F6F7B, 0x826AB0, 0x866AB0, 0x8C69FE, 0x776AB0, 0x8CFB7A, 0x0CFEBA,
+ };
}
}