Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 165 additions & 60 deletions SMB3Explorer/Enums/PlayerTrait.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;

// ReSharper disable NotAccessedPositionalProperty.Global
Expand All @@ -9,7 +10,7 @@ public static class PlayerTrait
{
public record struct DatabaseTraitSubtypePair(int TraitId, int? SubtypeId);

public static Dictionary<DatabaseTraitSubtypePair, Trait> TraitMap { get; } = new()
private static Dictionary<DatabaseTraitSubtypePair, Trait> _smb3TraitMap { get; } = new()
{
{new DatabaseTraitSubtypePair(0, 0), Trait.BatterPowerVsRight},
{new DatabaseTraitSubtypePair(0, 1), Trait.BatterPowerVsLeft},
Expand All @@ -32,67 +33,171 @@ public record struct DatabaseTraitSubtypePair(int TraitId, int? SubtypeId);
{new DatabaseTraitSubtypePair(8, 7), Trait.BatterBadJumps},
{new DatabaseTraitSubtypePair(9, null), Trait.BatterUtility},
};

public static ImmutableDictionary<DatabaseTraitSubtypePair, Trait> Smb3TraitMap { get; } =
_smb3TraitMap.ToImmutableDictionary();

private static Dictionary<DatabaseTraitSubtypePair, Trait> _smb4TraitMap { get; } = new()
{
{new DatabaseTraitSubtypePair(0, 0), Trait.BatterPowerVsRight},
{new DatabaseTraitSubtypePair(0, 1), Trait.BatterPowerVsLeft},
{new DatabaseTraitSubtypePair(1, 0), Trait.BatterContactVsRight},
{new DatabaseTraitSubtypePair(1, 1), Trait.BatterContactVsLeft},
{new DatabaseTraitSubtypePair(2, 6), Trait.BatterRbiMan},
{new DatabaseTraitSubtypePair(2, 7), Trait.BatterRbiZero},
{new DatabaseTraitSubtypePair(3, 2), Trait.BatterHighPitch},
{new DatabaseTraitSubtypePair(3, 3), Trait.BatterLowPitch},
{new DatabaseTraitSubtypePair(3, 4), Trait.BatterInsidePitch},
{new DatabaseTraitSubtypePair(3, 5), Trait.BatterOutsidePitch},
{new DatabaseTraitSubtypePair(4, 6), Trait.BatterToughOut},
{new DatabaseTraitSubtypePair(4, 7), Trait.BatterWhiffer},
{new DatabaseTraitSubtypePair(5, 12), Trait.PitcherSpecialist},
{new DatabaseTraitSubtypePair(5, 13), Trait.PitcherReverseSplits},
{new DatabaseTraitSubtypePair(6, 6), Trait.PitcherComposed},
{new DatabaseTraitSubtypePair(6, 7), Trait.PitcherWalkProne},
{new DatabaseTraitSubtypePair(7, 6), Trait.PitcherKCollector},
{new DatabaseTraitSubtypePair(7, 7), Trait.PitcherKNeglector},
{new DatabaseTraitSubtypePair(8, 6), Trait.BatterStealer},
{new DatabaseTraitSubtypePair(8, 7), Trait.BatterBadJumps},
{new DatabaseTraitSubtypePair(9, 6), Trait.BatterUtility},
{new DatabaseTraitSubtypePair(10, 8), Trait.BatterFastballHitter},
{new DatabaseTraitSubtypePair(10, 9), Trait.BatterOffSpeedHitter},
{new DatabaseTraitSubtypePair(11, 6), Trait.BatterBadBallHitter},
{new DatabaseTraitSubtypePair(12, 10), Trait.BatterBigHack},
{new DatabaseTraitSubtypePair(12, 11), Trait.BatterLittleHack},
{new DatabaseTraitSubtypePair(13, 6), Trait.BatterRallyStarter},
{new DatabaseTraitSubtypePair(14, 6), Trait.BatterFirstPitchSlayer},
{new DatabaseTraitSubtypePair(14, 7), Trait.BatterFirstPitchPrayer},
{new DatabaseTraitSubtypePair(15, 6), Trait.BatterPinchPerfect},
{new DatabaseTraitSubtypePair(16, 6), Trait.BatterAceExterminator},
{new DatabaseTraitSubtypePair(17, 6), Trait.BatterMindGamer},
{new DatabaseTraitSubtypePair(17, 7), Trait.BatterEasyTarget},
{new DatabaseTraitSubtypePair(18, 6), Trait.PitcherPickOfficer},
{new DatabaseTraitSubtypePair(18, 7), Trait.PitcherEasyJumps},
{new DatabaseTraitSubtypePair(19, 6), Trait.PitcherGetsAhead},
{new DatabaseTraitSubtypePair(19, 7), Trait.PitcherFallsBehind},
{new DatabaseTraitSubtypePair(20, 6), Trait.PitcherRallyStopper},
{new DatabaseTraitSubtypePair(20, 7), Trait.PitcherSurrounded},
{new DatabaseTraitSubtypePair(21, 7), Trait.PitcherCrossedUp},
{new DatabaseTraitSubtypePair(22, 14), Trait.PitcherElite4SeamFastball},
{new DatabaseTraitSubtypePair(22, 15), Trait.PitcherElite2SeamFastball},
{new DatabaseTraitSubtypePair(22, 16), Trait.PitcherEliteCutter},
{new DatabaseTraitSubtypePair(22, 17), Trait.PitcherEliteCurveball},
{new DatabaseTraitSubtypePair(22, 18), Trait.PitcherEliteSlider},
{new DatabaseTraitSubtypePair(22, 19), Trait.PitcherEliteChangeUp},
{new DatabaseTraitSubtypePair(22, 20), Trait.PitcherEliteScrewball},
{new DatabaseTraitSubtypePair(22, 21), Trait.PitcherEliteForkball},
{new DatabaseTraitSubtypePair(23, 6), Trait.PitcherWorkhorse},
{new DatabaseTraitSubtypePair(24, 22), Trait.PitcherTwoWayOutfielder},
{new DatabaseTraitSubtypePair(24, 23), Trait.PitcherTwoWayInfielder},
{new DatabaseTraitSubtypePair(24, 24), Trait.PitcherTwoWayCatcher},
{new DatabaseTraitSubtypePair(25, 6), Trait.PitcherMetalHead},
{new DatabaseTraitSubtypePair(26, 6), Trait.BatterSprinter},
{new DatabaseTraitSubtypePair(26, 7), Trait.BatterSlowPoke},
{new DatabaseTraitSubtypePair(27, 6), Trait.BatterBaseRounder},
{new DatabaseTraitSubtypePair(27, 7), Trait.BatterBaseJogger},
{new DatabaseTraitSubtypePair(28, 6), Trait.BatterDistractor},
{new DatabaseTraitSubtypePair(29, 6), Trait.MagicHands},
{new DatabaseTraitSubtypePair(29, 7), Trait.ButterFingers},
{new DatabaseTraitSubtypePair(30, 7), Trait.WildThrower},
{new DatabaseTraitSubtypePair(31, 7), Trait.PitcherWildThing},
{new DatabaseTraitSubtypePair(32, 6), Trait.Clutch},
{new DatabaseTraitSubtypePair(32, 7), Trait.Choker},
{new DatabaseTraitSubtypePair(33, 25), Trait.Consistent},
{new DatabaseTraitSubtypePair(33, 26), Trait.Volatile},
{new DatabaseTraitSubtypePair(34, 6), Trait.Durable},
{new DatabaseTraitSubtypePair(34, 7), Trait.InjuryProne},
{new DatabaseTraitSubtypePair(35, 6), Trait.Stimulated},
{new DatabaseTraitSubtypePair(36, 6), Trait.BatterCannonArm},
{new DatabaseTraitSubtypePair(36, 7), Trait.BatterNoodleArm},
{new DatabaseTraitSubtypePair(37, 6), Trait.BatterDiveWizard},
{new DatabaseTraitSubtypePair(38, 6), Trait.BatterSignStealer},
{new DatabaseTraitSubtypePair(39, 7), Trait.PitcherMeltdown},
{new DatabaseTraitSubtypePair(40, 6), Trait.BatterBunter},
};

public static ImmutableDictionary<DatabaseTraitSubtypePair, Trait> Smb4TraitMap { get; } =
_smb4TraitMap.ToImmutableDictionary();
}

public enum Trait
{
[Description("POW vs RHP")]
BatterPowerVsRight,

[Description("POW vs LHP")]
BatterPowerVsLeft,

[Description("CON vs RHP")]
BatterContactVsRight,

[Description("CON vs LHP")]
BatterContactVsLeft,

[Description("RBI Man")]
BatterRbiMan,

[Description("RBI Dud")]
BatterRbiDud,

[Description("High Pitch")]
BatterHighPitch,

[Description("Low Pitch")]
BatterLowPitch,

[Description("Inside Pitch")]
BatterInsidePitch,

[Description("Outside Pitch")]
BatterOutsidePitch,

[Description("Tough Out")]
BatterToughOut,

[Description("Whiffer")]
BatterWhiffer,

[Description("Stealer")]
BatterStealer,

[Description("Bad Jumps")]
BatterBadJumps,

[Description("Utility")]
BatterUtility,

[Description("Composed")]
PitcherComposed,

[Description("BB Prone")]
PitcherWalkProne,

[Description("Specialist")]
PitcherSpecialist,

[Description("K Man")]
PitcherStrikeoutMan,

[Description("K Dud")]
PitcherStrikeoutDud,
[Description("POW vs RHP")] BatterPowerVsRight,
[Description("POW vs LHP")] BatterPowerVsLeft,
[Description("CON vs RHP")] BatterContactVsRight,
[Description("CON vs LHP")] BatterContactVsLeft,
[Description("RBI Man")] BatterRbiMan,
[Description("RBI Dud")] BatterRbiDud,
[Description("High Pitch")] BatterHighPitch,
[Description("Low Pitch")] BatterLowPitch,
[Description("Inside Pitch")] BatterInsidePitch,
[Description("Outside Pitch")] BatterOutsidePitch,
[Description("Tough Out")] BatterToughOut,
[Description("Whiffer")] BatterWhiffer,
[Description("Stealer")] BatterStealer,
[Description("Bad Jumps")] BatterBadJumps,
[Description("Utility")] BatterUtility,
[Description("Composed")] PitcherComposed,
[Description("BB Prone")] PitcherWalkProne,
[Description("Specialist")] PitcherSpecialist,
[Description("K Man")] PitcherStrikeoutMan,
[Description("K Dud")] PitcherStrikeoutDud,
[Description("Big Hack")] BatterBigHack,
[Description("Magic Hands")] MagicHands,
[Description("Little Hack")] BatterLittleHack,
[Description("Elite 4F")] PitcherElite4SeamFastball,
[Description("K Collector")] PitcherKCollector,
[Description("Falls Behind")] PitcherFallsBehind,
[Description("Mind Gamer")] BatterMindGamer,
[Description("Elite CH")] PitcherEliteChangeUp,
[Description("Meltdown")] PitcherMeltdown,
[Description("Gets Ahead")] PitcherGetsAhead,
[Description("K Neglector")] PitcherKNeglector,
[Description("Choker")] Choker,
[Description("Consistent")] Consistent,
[Description("RBI Zero")] BatterRbiZero,
[Description("First Pitch Prayer")] BatterFirstPitchPrayer,
[Description("First Pitch Slayer")] BatterFirstPitchSlayer,
[Description("Sprinter")] BatterSprinter,
[Description("Pick Officer")] PitcherPickOfficer,
[Description("Fastball Hitter")] BatterFastballHitter,
[Description("Workhorse")] PitcherWorkhorse,
[Description("Clutch")] Clutch,
[Description("Elite 2F")] PitcherElite2SeamFastball,
[Description("Crossed Up")] PitcherCrossedUp,
[Description("Volatile")] Volatile,
[Description("Rally Stopper")] PitcherRallyStopper,
[Description("Butter Fingers")] ButterFingers,
[Description("Off-speed Hitter")] BatterOffSpeedHitter,
[Description("Ace Exterminator")] BatterAceExterminator,
[Description("Metal Head")] PitcherMetalHead,
[Description("Stimulated")] Stimulated,
[Description("Reverse Splits")] PitcherReverseSplits,
[Description("Rally Starter")] BatterRallyStarter,
[Description("Pinch Perfect")] BatterPinchPerfect,
[Description("Base Jogger")] BatterBaseJogger,
[Description("Cannon Arm")] BatterCannonArm,
[Description("Easy Target")] BatterEasyTarget,
[Description("Elite CB")] PitcherEliteCurveball,
[Description("Surrounded")] PitcherSurrounded,
[Description("Easy Jumps")] PitcherEasyJumps,
[Description("Slow Poke")] BatterSlowPoke,
[Description("Wild Thrower")] WildThrower,
[Description("Sign Stealer")] BatterSignStealer,
[Description("Noodle Arm")] BatterNoodleArm,
[Description("Elite CF")] PitcherEliteCutter,
[Description("Wild Thing")] PitcherWildThing,
[Description("Elite SL")] PitcherEliteSlider,
[Description("Dive Wizard")] BatterDiveWizard,
[Description("Injury Prone")] InjuryProne,
[Description("Distractor")] BatterDistractor,
[Description("Durable")] Durable,
[Description("Bunter")] BatterBunter,
[Description("Base Rounder")] BatterBaseRounder,
[Description("Elite FK")] PitcherEliteForkball,
[Description("Elite SB")] PitcherEliteScrewball,
[Description("Two Way (IF)")] PitcherTwoWayInfielder,
[Description("Two Way (OF)")] PitcherTwoWayOutfielder,
[Description("Two Way (C)")] PitcherTwoWayCatcher,
[Description("Bad Ball Hitter")] BatterBadBallHitter
}
3 changes: 3 additions & 0 deletions SMB3Explorer/Models/Exports/SeasonPlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,7 @@ public Trait[] Traits

[Name("Trait 2"), Index(19)]
public string? Trait2 { get; set; }

[Name("Chemistry"), Index(20)]
public string? Chemistry { get; set; }
}
88 changes: 88 additions & 0 deletions SMB3Explorer/Resources/Sql/MostRecentSeasonPlayersSmb4.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
WITH teams AS
(SELECT ttli.GUID AS teamGUID, tt.teamName
FROM t_team_local_ids ttli
JOIN t_teams tt ON ttli.GUID = tt.GUID),
mostRecentSeason AS (SELECT id AS seasonID,
RANK() OVER (ORDER BY id) AS seasonNum
FROM t_seasons
JOIN t_leagues ON t_seasons.historicalLeagueGUID = t_leagues.GUID
JOIN t_franchise tf ON t_leagues.GUID = tf.leagueGUID
WHERE t_leagues.GUID = CAST(@leagueId AS BLOB)
ORDER BY ID DESC
LIMIT 1)
SELECT vbpi.baseballPlayerGUID,
tsea.ID AS seasonId,
s.seasonNum,
CASE
WHEN tsp.[baseballPlayerLocalID] IS NULL THEN tsp.[firstName]
ELSE vbpi.[firstName] END AS firstName,
CASE
WHEN tsp.[baseballPlayerLocalID] IS NULL THEN tsp.[lastName]
ELSE vbpi.[lastName] END AS lastName,
CASE
WHEN tsp.[baseballPlayerLocalID] IS NULL THEN tsp.[primaryPos]
ELSE vbpi.[primaryPosition] END AS primaryPosition,
CASE
WHEN tsp.[baseballPlayerLocalID] IS NULL THEN tsp.[pitcherRole]
ELSE vbpi.[pitcherRole] END AS pitcherRole,
CAST(secondaryPosition.optionValue AS INTEGER) AS secondaryPosition,
currentTeam.teamName AS currentTeam,
previousTeam.teamName AS previousTeam,
tbp.power,
tbp.contact,
tbp.speed,
tbp.fielding,
tbp.arm,
tbp.velocity,
tbp.junk,
tbp.accuracy,
tbp.age,
salary.salary * 200 AS salaryDollars,
CASE
WHEN COUNT(tbpt.trait) = 0 THEN NULL
ELSE json_group_array(json_object('traitId', tbpt.trait, 'subtypeId', tbpt.subType))
END AS traits,
CASE
WHEN chemistry.optionValue = 0
THEN 'Competitive'
WHEN chemistry.optionValue = 1
THEN 'Spirited'
WHEN chemistry.optionValue = 2
THEN 'Disciplined'
WHEN chemistry.optionValue = 3
THEN 'Scholarly'
WHEN chemistry.optionValue = 4
THEN 'Crafty'
ELSE 'Unknown'
END AS chemistryType

FROM [v_baseball_player_info] vbpi
LEFT JOIN t_baseball_player_local_ids tbpli ON vbpi.baseballPlayerGUID = tbpli.GUID
LEFT JOIN t_stats_players tsp ON tbpli.localID = tsp.baseballPlayerLocalID
LEFT JOIN t_stats ts ON tsp.statsPlayerID = ts.statsPlayerID
LEFT JOIN t_season_stats tss ON ts.aggregatorID = tss.aggregatorID
JOIN t_baseball_players tbp ON tbpli.GUID = tbp.GUID
LEFT JOIN t_baseball_player_traits tbpt ON tbpli.localID = tbpt.baseballPlayerLocalID

JOIN t_seasons tsea ON tss.seasonID = tsea.ID
JOIN mostRecentSeason s ON tsea.ID = s.seasonID
JOIN t_league_local_ids tlli ON tsp.leagueLocalID = tlli.localID
JOIN t_leagues tl ON tlli.GUID = tl.GUID

JOIN t_salary salary ON vbpi.baseballPlayerGUID = salary.baseballPlayerGUID

LEFT JOIN t_baseball_player_options secondaryPosition
ON tbpli.localID = secondaryPosition.baseballPlayerLocalID AND secondaryPosition.optionKey = 55

LEFT JOIN t_baseball_player_options chemistry
ON tbpli.localID = chemistry.baseballPlayerLocalID AND chemistry.optionKey = 107

LEFT JOIN [t_team_local_ids] tt1 ON ts.[currentTeamLocalID] = tt1.[localID]
LEFT JOIN [t_team_local_ids] tt2
ON ts.[previousRecentlyPlayedTeamLocalID] = tt2.[localID]
LEFT JOIN teams currentTeam ON tt1.GUID = currentTeam.teamGUID
LEFT JOIN teams previousTeam ON tt2.GUID = previousTeam.teamGUID

WHERE tl.GUID = CAST(@leagueId AS BLOB)
GROUP BY vbpi.baseballPlayerGUID, currentTeam, salaryDollars
ORDER BY currentTeam IS NULL, currentTeam, salaryDollars DESC
9 changes: 4 additions & 5 deletions SMB3Explorer/SMB3Explorer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,6 @@
<None Remove="Resources\Sql\GetAllFranchisePitchers.sql" />
</ItemGroup>

<ItemGroup>
<Folder Include="Controls" />
</ItemGroup>

<ItemGroup>
<None Remove="Resources\Sql\CareerStatsBatting.sql" />
<EmbeddedResource Include="Resources\Sql\CareerStatsBatting.sql" />
Expand Down Expand Up @@ -88,7 +84,6 @@
<None Remove="Resources\Sql\GetFranchiseSeasons.sql" />
<EmbeddedResource Include="Resources\Sql\FranchiseSeasons.sql" />
<None Remove="Resources\Sql\MostRecentSeasonPlayers.sql" />
<EmbeddedResource Include="Resources\Sql\MostRecentSeasonPlayers.sql" />
<None Remove="Resources\Sql\MostRecentSeasonTeams.sql" />
<EmbeddedResource Include="Resources\Sql\MostRecentSeasonTeams.sql" />
<None Remove="Resources\Sql\SeasonAverageBatterStats.sql" />
Expand All @@ -99,6 +94,10 @@
<EmbeddedResource Include="Resources\Sql\MostRecentSeasonSchedule.sql" />
<None Remove="Resources\Sql\GetLeagues.sql" />
<EmbeddedResource Include="Resources\Sql\GetLeagues.sql" />
<None Remove="Resources\Sql\MostRecentSeasonPlayersSmb3.sql" />
<EmbeddedResource Include="Resources\Sql\MostRecentSeasonPlayersSmb3.sql" />
<None Remove="Resources\Sql\MostRecentSeasonPlayersSmb4.sql" />
<EmbeddedResource Include="Resources\Sql\MostRecentSeasonPlayersSmb4.sql" />
</ItemGroup>

</Project>
2 changes: 2 additions & 0 deletions SMB3Explorer/Services/DataService/DataServiceInit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ public async Task<OneOf<List<Smb4LeagueSelection>, Error<string>>> EstablishDbCo
Log.Error("Invalid save file, missing expected tables");
return new Error<string>("Invalid save file, missing expected tables");
}

if (_applicationContext.MostRecentSelectedSaveFilePath is null) return new List<Smb4LeagueSelection>();

List<Smb4LeagueSelection> leagues = new();
var command2 = Connection.CreateCommand();
Expand Down
Loading