Skip to content

Commit

Permalink
v0.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
niart120 committed Aug 3, 2023
1 parent a7f86b4 commit c4e6f12
Show file tree
Hide file tree
Showing 8 changed files with 425 additions and 219 deletions.
4 changes: 2 additions & 2 deletions BDSPSearch.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 28 additions & 6 deletions BDSPSearch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public partial class BDSPSearchForm : Form
private static readonly string[] Roamers = { "エムリット", "クレセリア" };
private static readonly uint[] RoamersLv = { 50, 50 };

private static readonly string[] RamanasSubLegs = { "フリーザー", "サンダー", "ファイヤー", "ライコウ", "エンティ", "スイクン", "レジロック", "レジアイス", "レジスチル", "ラティアス", "ラティオス" };
private static readonly string[] RamanasSubLegs = { "フリーザー", "サンダー", "ファイヤー", "ライコウ", "エンテイ", "スイクン", "レジロック", "レジアイス", "レジスチル", "ラティアス", "ラティオス" };
private static readonly uint[] RamanasSubLegsLv = { 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70 };
private static readonly string[] RamanasLegs = { "ミュウツー", "ルギア", "ホウオウ", "カイオーガ", "グラードン", "レックウザ" };
private static readonly uint[] RamanasLegsLv = { 70, 70, 70, 70, 70, 70 };
Expand Down Expand Up @@ -56,6 +56,7 @@ private void SymbolTypeComboBox_TextChanged(object sender, EventArgs e)
//分類に対応するポケモン名一覧に更新
SpeciesComboBox.Items.Clear();
SpeciesComboBox.Items.AddRange(spieciesNamesArray[STidx]);
SpeciesComboBox.SelectedIndex = 0;
}

private void SearchButton_Click(object sender, EventArgs e)
Expand Down Expand Up @@ -84,7 +85,17 @@ private void SearchButton_Click(object sender, EventArgs e)

var pokename = SpeciesComboBox.Text;
var pokeLv = spieciesLvsArray[stidx][spidx];
StaticSymbolGenerator generator = new StaticSymbolGenerator(pokename, pokeLv, 3);

//ハマナス伝説の場合は強制的に隠れ特性
var hiddenAbility = (stidx == 3) || (stidx == 4);

var isRoamers = (stidx == 2);
var useSync = UseSynchronize.Checked;

var tsv = 0u;//仮tsv
var generator = new StaticSymbolGenerator(pokename, pokeLv, tsv, 3, hiddenAbility);
var roamergenerator = new RoamerGenerator(pokename, pokeLv, tsv);


Synchronize sync = new Synchronize(SynchronizeComboBox.Text.ConvertToNature());

Expand All @@ -96,6 +107,7 @@ private void SearchButton_Click(object sender, EventArgs e)
var minWeight = (byte)MinWeight.Value;
var maxWeight = (byte)MaxWeight.Value;

//Validator生成
SearchCondition sc = new SearchCondition(natureCondition, genderCondition, shinyCondition, minHeight, maxHeight, minWeight, maxWeight);

Task task = new(() =>
Expand All @@ -107,8 +119,18 @@ private void SearchButton_Click(object sender, EventArgs e)
var results = new List<string[]>();
for (uint i = 0; i < searchRange; i++, state.Advance())
{
var pk = UseSynchronize.Checked ? generator.Generate(state, sync) : generator.Generate(state);
if (!sc.Validate(pk))continue;
Individual pk = null;
//TODO:この書き方を本当にどうにかしたい
if (isRoamers)
{
pk = useSync ? roamergenerator.Generate(state, sync) : roamergenerator.Generate(state);
}
else
{
pk = useSync ? generator.Generate(state, sync) : generator.Generate(state);
}
if (!sc.Validate(pk)) continue;
var advance = initadv + i;
results.Add(Misc.ToResultArray(advance, pk));
Expand All @@ -118,7 +140,7 @@ private void SearchButton_Click(object sender, EventArgs e)
break;
}
}
this.Invoke(() =>
this.Invoke(() =>
{
//TODO:アホなことしてる気がするのでどうにかしたい
dataGridView1.Rows.Clear();
Expand All @@ -128,7 +150,7 @@ private void SearchButton_Click(object sender, EventArgs e)
});
});
task.Start();


}

Expand Down
148 changes: 0 additions & 148 deletions PokemonBDSPRNGLibrary/Generators/StaticSymbolGenerator.cs

This file was deleted.

File renamed without changes.
111 changes: 111 additions & 0 deletions PokemonBDSPRNGLibrary/RoamerGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
using PokemonPRNG.XorShift128;
using PokemonPRNG.Xoroshiro128p;
using PokemonStandardLibrary.Gen8;
using PokemonStandardLibrary;
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace PokemonBDSPRNGLibrary.Generators
{
public class RoamerGenerator
: PokemonPRNG.XorShift128.IGeneratable<Pokemon.Individual>, PokemonPRNG.XorShift128.IGeneratable<Pokemon.Individual, Synchronize>
{
private readonly bool _neverShiny;
private readonly uint _flawlessIVs;
private readonly Pokemon.Species _species;
private readonly uint _lv;

private readonly uint _tsv;

public Pokemon.Individual Generate((uint s0, uint s1, uint s2, uint s3) seed)
{
var ec = seed.GetRand();
var rng = ((ulong)ec).Initialize();

var tempTSV = rng.GetRandBDSP(0xFFFFFFFF).ToShinyValue();
var pid = rng.GetRandBDSP(0xFFFFFFFF);
var psv = pid.ToShinyValue();

var shinyType = _neverShiny ? ShinyType.NotShiny : psv.ToShinyType(tempTSV);
if (shinyType == 0 && pid.ToShinyType(_tsv) != 0)
pid ^= 0x10000000; // Antishiny
else if (shinyType != 0 && pid.ToShinyType(_tsv) == 0)
pid = (_tsv ^ pid) << 16 | pid & 0xFFFF;

var ivs = rng.GenerateIVs(_flawlessIVs);

var ability = (uint)rng.GetRandBDSP(2);
var gender = rng.GenerateGender(_species.GenderRatio);
var nature = (Nature)rng.GetRandBDSP(25);

var height = (byte)(rng.GetRandBDSP(129) + rng.GetRandBDSP(128));
var weight = (byte)(rng.GetRandBDSP(129) + rng.GetRandBDSP(128));

return _species.GetIndividual(_lv, ivs, ec, pid, nature, ability, gender, height, weight).SetShinyType(shinyType);
}

public Pokemon.Individual Generate((uint s0, uint s1, uint s2, uint s3) seed, Synchronize synchronize)
{
var ec = seed.GetRand();
var rng = ((ulong)ec).Initialize();

var tempTSV = rng.GetRandBDSP(0xFFFFFFFF).ToShinyValue();
var pid = rng.GetRandBDSP(0xFFFFFFFF);
var psv = pid.ToShinyValue();

var shinyType = _neverShiny ? ShinyType.NotShiny : psv.ToShinyType(tempTSV);
if (shinyType == 0 && pid.ToShinyType(_tsv) != 0)
pid ^= 0x10000000; // Antishiny
else if (shinyType != 0 && pid.ToShinyType(_tsv) == 0)
pid = (_tsv ^ pid) << 16 | pid & 0xFFFF;

var ivs = rng.GenerateIVs(_flawlessIVs);

var ability = rng.GetRandBDSP(2);
var gender = rng.GenerateGender(_species.GenderRatio);
var nature = (uint)synchronize.FixedNature < 25 ? synchronize.FixedNature : (Nature)rng.GetRandBDSP(25);

var height = (byte)(rng.GetRandBDSP(129) + rng.GetRandBDSP(128));
var weight = (byte)(rng.GetRandBDSP(129) + rng.GetRandBDSP(128));

return _species.GetIndividual(_lv, ivs, ec, pid, nature, ability, gender, height, weight).SetShinyType(shinyType);
}

public RoamerGenerator(string name, uint lv, uint tsv, uint flawlessIVs = 3, bool neverShiny = false)
=> (_species, _lv, _flawlessIVs, _neverShiny, _tsv) = (Pokemon.GetPokemon(name), lv, flawlessIVs, neverShiny, tsv);
}

static class RoamerGenerationExt
{
public static uint ToShinyValue(this ulong val)
=> (uint)(val & 0xFFFF) ^ (uint)(val >> 16);

public static uint[] GenerateIVs(ref this (ulong S0, ulong S1) seed, uint flawlessIVs)
{
var ivs = Enumerable.Repeat(32u, 6).ToArray();
for (int i = 0; i < flawlessIVs; i++)
{
while (true)
{
var idx = seed.GetRandBDSP(6);
if (ivs[idx] == 32)
{
ivs[idx] = 31;
break;
}
}
}
for (int i = 0; i < 6; i++)
if (ivs[i] == 32) ivs[i] = (uint)seed.GetRandBDSP(32);

return ivs;
}

public static Gender GenerateGender(ref this (ulong S0, ulong S1) seed, GenderRatio ratio)
=> ratio.ToFixedGender() ?? ((seed.GetRandBDSP(253) + 1) < (uint)ratio ? Gender.Female : Gender.Male);

}

}
Loading

0 comments on commit c4e6f12

Please sign in to comment.