Integrate map tile coordinates into boss detection
This commit is contained in:
parent
6f0576376b
commit
81430f90f0
@ -46,6 +46,30 @@ namespace rabi_splitter_WPF
|
|||||||
startingBosses: new[] {Boss.Ashuri}
|
startingBosses: new[] {Boss.Ashuri}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static BossFight Rita =
|
||||||
|
new BossFight (
|
||||||
|
displayName: "Rita",
|
||||||
|
music: Music.MIDSTREAM_JAM,
|
||||||
|
mapTile: new MapTileCoordinate(86, 10),
|
||||||
|
startingBosses: new[] { Boss.Rita }
|
||||||
|
);
|
||||||
|
|
||||||
|
public static BossFight Cicini =
|
||||||
|
new BossFight (
|
||||||
|
displayName: "Cicini",
|
||||||
|
music: Music.HI_TECH_DUEL,
|
||||||
|
mapTile: new MapTileCoordinate(22, 14),
|
||||||
|
startingBosses: new[] { Boss.Cicini }
|
||||||
|
);
|
||||||
|
|
||||||
|
public static BossFight Cocoa2 =
|
||||||
|
new BossFight (
|
||||||
|
displayName: "Cocoa2",
|
||||||
|
music: Music.GET_ON_WITH_IT,
|
||||||
|
mapTile: new MapTileCoordinate(14, 10),
|
||||||
|
startingBosses: new[] { Boss.Cocoa2 }
|
||||||
|
);
|
||||||
|
|
||||||
public static BossFight BigBox =
|
public static BossFight BigBox =
|
||||||
new BossFight (
|
new BossFight (
|
||||||
displayName: "Big Box",
|
displayName: "Big Box",
|
||||||
@ -155,7 +179,8 @@ namespace rabi_splitter_WPF
|
|||||||
displayName: "Side Chapter",
|
displayName: "Side Chapter",
|
||||||
music: Music.GET_ON_WITH_IT,
|
music: Music.GET_ON_WITH_IT,
|
||||||
map: Map.RabiRabiTown,
|
map: Map.RabiRabiTown,
|
||||||
extraCondition: (startingBosses, music, map) => {
|
mapTile: new MapTileCoordinate(133, 12),
|
||||||
|
extraCondition: (startingBosses, music, map, mapTile) => {
|
||||||
return startingBosses.Count == 3;
|
return startingBosses.Count == 3;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -19,19 +19,22 @@ namespace rabi_splitter_WPF
|
|||||||
public readonly string displayName;
|
public readonly string displayName;
|
||||||
public readonly Music? music;
|
public readonly Music? music;
|
||||||
public readonly Map? map;
|
public readonly Map? map;
|
||||||
|
public readonly MapTileCoordinate? mapTile;
|
||||||
public readonly HashSet<Boss> startingBosses;
|
public readonly HashSet<Boss> startingBosses;
|
||||||
public readonly Func<HashSet<Boss>, Music, Map, bool> extraCondition;
|
public readonly Func<HashSet<Boss>, Music, Map, MapTileCoordinate, bool> extraCondition;
|
||||||
|
|
||||||
private BossFight(string displayName = null,
|
private BossFight(string displayName = null,
|
||||||
Music? music = null,
|
Music? music = null,
|
||||||
Map? map = null,
|
Map? map = null,
|
||||||
|
MapTileCoordinate? mapTile = null,
|
||||||
Boss[] startingBosses = null,
|
Boss[] startingBosses = null,
|
||||||
Func<HashSet<Boss>, Music, Map, bool> extraCondition = null)
|
Func<HashSet<Boss>, Music, Map, MapTileCoordinate, bool> extraCondition = null)
|
||||||
{
|
{
|
||||||
_value = nextAvailableValue++;
|
_value = nextAvailableValue++;
|
||||||
this.displayName = displayName;
|
this.displayName = displayName;
|
||||||
this.music = music;
|
this.music = music;
|
||||||
this.map = map;
|
this.map = map;
|
||||||
|
this.mapTile = mapTile;
|
||||||
this.startingBosses = (startingBosses != null) ? new HashSet<Boss>(startingBosses) : null;
|
this.startingBosses = (startingBosses != null) ? new HashSet<Boss>(startingBosses) : null;
|
||||||
this.extraCondition = extraCondition;
|
this.extraCondition = extraCondition;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ namespace rabi_splitter_WPF
|
|||||||
{
|
{
|
||||||
public static partial class BossFightIdentifier
|
public static partial class BossFightIdentifier
|
||||||
{
|
{
|
||||||
|
private static ILookup<MapTileCoordinate, BossFight> _matchMapTile;
|
||||||
private static ILookup<Tuple<Music, Map>, BossFight> _matchMusicAndMap;
|
private static ILookup<Tuple<Music, Map>, BossFight> _matchMusicAndMap;
|
||||||
private static ILookup<Music, BossFight> _matchMusic;
|
private static ILookup<Music, BossFight> _matchMusic;
|
||||||
private static ILookup<Map, BossFight> _matchMap;
|
private static ILookup<Map, BossFight> _matchMap;
|
||||||
@ -15,6 +16,7 @@ namespace rabi_splitter_WPF
|
|||||||
static BossFightIdentifier()
|
static BossFightIdentifier()
|
||||||
{
|
{
|
||||||
// Build dictionaries here.
|
// Build dictionaries here.
|
||||||
|
var specifiedMapTile = new List<BossFight>();
|
||||||
var specifiedMusicAndMap = new List<BossFight>();
|
var specifiedMusicAndMap = new List<BossFight>();
|
||||||
var specifiedMusicOnly = new List<BossFight>();
|
var specifiedMusicOnly = new List<BossFight>();
|
||||||
var specifiedMapOnly = new List<BossFight>();
|
var specifiedMapOnly = new List<BossFight>();
|
||||||
@ -22,7 +24,14 @@ namespace rabi_splitter_WPF
|
|||||||
|
|
||||||
foreach (var bossFight in BossFight.GetBossFights())
|
foreach (var bossFight in BossFight.GetBossFights())
|
||||||
{
|
{
|
||||||
//if (bossFight == null) continue;
|
if (bossFight == null || bossFight == BossFight.UNKNOWN) continue;
|
||||||
|
|
||||||
|
if (bossFight.mapTile != null)
|
||||||
|
{
|
||||||
|
specifiedMapTile.Add(bossFight);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (bossFight.music != null)
|
if (bossFight.music != null)
|
||||||
{
|
{
|
||||||
if (bossFight.map != null) specifiedMusicAndMap.Add(bossFight);
|
if (bossFight.map != null) specifiedMusicAndMap.Add(bossFight);
|
||||||
@ -35,17 +44,18 @@ namespace rabi_splitter_WPF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_matchMapTile = specifiedMapTile.ToLookup(bossFight => bossFight.mapTile.Value, bossFight => bossFight);
|
||||||
_matchMusicAndMap = specifiedMusicAndMap.ToLookup(bossFight => new Tuple<Music, Map>(bossFight.music.Value, bossFight.map.Value), bossFight => bossFight);
|
_matchMusicAndMap = specifiedMusicAndMap.ToLookup(bossFight => new Tuple<Music, Map>(bossFight.music.Value, bossFight.map.Value), bossFight => bossFight);
|
||||||
_matchMusic = specifiedMusicOnly.ToLookup(bossFight => bossFight.music.Value, bossFight => bossFight);
|
_matchMusic = specifiedMusicOnly.ToLookup(bossFight => bossFight.music.Value, bossFight => bossFight);
|
||||||
_matchMap = specifiedMapOnly.ToLookup(bossFight => bossFight.map.Value, bossFight => bossFight);
|
_matchMap = specifiedMapOnly.ToLookup(bossFight => bossFight.map.Value, bossFight => bossFight);
|
||||||
_remainingDescriptions = specifiedNeither.ToArray();
|
_remainingDescriptions = specifiedNeither.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool Matches(BossFight bossFight, HashSet<Boss> startingBosses, Music music, Map map)
|
private static bool Matches(BossFight bossFight, HashSet<Boss> startingBosses, Music music, Map map, MapTileCoordinate mapTile)
|
||||||
{
|
{
|
||||||
if (bossFight.startingBosses != null && !bossFight.startingBosses.SetEquals(startingBosses)) return false;
|
if (bossFight.startingBosses != null && !bossFight.startingBosses.SetEquals(startingBosses)) return false;
|
||||||
if (bossFight.extraCondition == null) return true;
|
if (bossFight.extraCondition == null) return true;
|
||||||
return bossFight.extraCondition(startingBosses, music, map);
|
return bossFight.extraCondition(startingBosses, music, map, mapTile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BossFight IdentifyBossFight(MemorySnapshot snapshot)
|
public static BossFight IdentifyBossFight(MemorySnapshot snapshot)
|
||||||
@ -56,28 +66,36 @@ namespace rabi_splitter_WPF
|
|||||||
|
|
||||||
var music = music_.Value;
|
var music = music_.Value;
|
||||||
var map = map_.Value;
|
var map = map_.Value;
|
||||||
|
var mapTile = snapshot.mapTile;
|
||||||
var startingBosses = new HashSet<Boss>(snapshot.bossList
|
var startingBosses = new HashSet<Boss>(snapshot.bossList
|
||||||
.Select(bossStats => StaticData.GetBoss(bossStats.id))
|
.Select(bossStats => StaticData.GetBoss(bossStats.id))
|
||||||
.Where(boss => boss != null)
|
.Where(boss => boss != null)
|
||||||
.Select(boss => boss.Value)
|
.Select(boss => boss.Value)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
foreach (var bossFight in _matchMapTile[mapTile])
|
||||||
|
{
|
||||||
|
if ((bossFight.music == null || music == bossFight.music) &&
|
||||||
|
(bossFight.map == null || map == bossFight.map) &&
|
||||||
|
Matches(bossFight, startingBosses, music, map, mapTile)) return bossFight;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var bossFight in _matchMusicAndMap[new Tuple<Music, Map>(music, map)])
|
foreach (var bossFight in _matchMusicAndMap[new Tuple<Music, Map>(music, map)])
|
||||||
{
|
{
|
||||||
if (Matches(bossFight, startingBosses, music, map)) return bossFight;
|
if (Matches(bossFight, startingBosses, music, map, mapTile)) return bossFight;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var bossFight in _matchMusic[music])
|
foreach (var bossFight in _matchMusic[music])
|
||||||
{
|
{
|
||||||
if (Matches(bossFight, startingBosses, music, map)) return bossFight;
|
if (Matches(bossFight, startingBosses, music, map, mapTile)) return bossFight;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var bossFight in _matchMap[map])
|
foreach (var bossFight in _matchMap[map])
|
||||||
{
|
{
|
||||||
if (Matches(bossFight, startingBosses, music, map)) return bossFight;
|
if (Matches(bossFight, startingBosses, music, map, mapTile)) return bossFight;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _remainingDescriptions.FirstOrDefault(bossFight => Matches(bossFight, startingBosses, music, map)) ?? BossFight.UNKNOWN;
|
return _remainingDescriptions.FirstOrDefault(bossFight => Matches(bossFight, startingBosses, music, map, mapTile)) ?? BossFight.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,22 @@ namespace rabi_splitter_WPF
|
|||||||
|
|
||||||
return new MapTileCoordinate(x, y);
|
return new MapTileCoordinate(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Equals, Hashcode
|
||||||
|
// override object.Equals
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj == null || GetType() != obj.GetType()) return false;
|
||||||
|
var other = (MapTileCoordinate)obj;
|
||||||
|
return x == other.x && y == other.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
// override object.GetHashCode
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return x.GetHashCode() * 31 + y.GetHashCode();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct BossStats
|
public struct BossStats
|
||||||
|
Loading…
x
Reference in New Issue
Block a user