Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
1aab7c7
Slight tweaks to RandomizerConfiguration defaults
initsu Jul 12, 2026
fab3a21
Change Climate variants handling to make enums smaller
initsu May 31, 2026
daf3d82
Update Avalonia to 12.1.0 and other dependencies
initsu Jun 10, 2026
c216296
Fix build warnings
initsu Jun 10, 2026
b669e3d
Clean up leftover App.config of old
initsu Feb 10, 2026
6635e3e
GitHub workflows: Update triggers
initsu May 30, 2026
0bee122
Add IntVector2 methods and tests
initsu Jul 13, 2026
5a6e74a
Add tests for our Random implementation
initsu Jun 13, 2026
ab47138
Wrap World.map in a new class OverworldMap
initsu May 28, 2026
fc2ecba
Determine linked fire spell when RandomizerProperties is created
initsu May 23, 2026
4c8f024
Add some more free ROM memory areas
initsu May 28, 2026
6cf31a1
Update RAM map
initsu Apr 18, 2026
da1ef85
Set both East P-bag caves to have 500 P like vanilla
initsu Jul 6, 2026
3d602bd
Refactor requireables to be a Set instead of List/Array
initsu May 10, 2026
e545c6d
Refactor placeLongBridge code
initsu May 28, 2026
274bd6e
Fix overshooting bridges and Darunia trap locations
initsu May 28, 2026
6bdea6f
Fix rare endless Reconstructed generation time
initsu Jun 1, 2026
b2087ce
Move shared World.UpdateVisit case to base class
initsu Apr 29, 2026
d118610
Comment out FillPalaceRooms assembler test run
initsu Jan 26, 2026
1669182
Change PalacesView checkboxes to use enabled via observable logic
initsu Jul 9, 2026
b19d88c
Create SpellsViewModel
initsu Apr 8, 2026
2d6411f
Hide custom music in browser build as it can't be used
initsu Jun 7, 2026
2562d28
UI flag update performance improvement
initsu Jun 10, 2026
3d15250
Multi-line flag & seed paste support
initsu Jun 10, 2026
0a23680
Tweak progress update messages
initsu Jun 16, 2026
8c1c120
Rewrite encounter rate code and implement random per continent
initsu Apr 29, 2026
263d87e
Refactor Maze Island
initsu Jul 13, 2026
842bb02
DrawRiver refactor
initsu Jun 14, 2026
169f93e
ConnectIslands refactor
initsu Jun 15, 2026
61339eb
VoD generation refactor/fixing for illegal passthroughs
initsu Jun 15, 2026
423317b
Refactor DrawCanyon and DrawCenterMountain
initsu Jun 16, 2026
df10d23
Change ElevatorBossFix to use js65
initsu Jul 3, 2026
3371fe5
Move asm from Shuffler to ROM.HandleRandomBossDrop
initsu Jul 4, 2026
2071624
Add rolled stats to spoiler log
initsu Jul 2, 2026
1d365b2
Refactor drops to use SmallItem enum
initsu Jul 4, 2026
73d6aef
Create DropRandomizer class and move drop randomizing logic there
initsu Jul 4, 2026
6f08d9f
Switch Attack, Magic & Life effectiveness to use Enum definition
initsu Jul 13, 2026
e393059
Refactor RandomizeSmallItems to use existing functions
initsu Jul 6, 2026
79aaee3
Rewrite PlaceSaneCave to fix occasional L/R being swapped
initsu Jul 12, 2026
e01c956
Refactor DM & probably improve 4-way connector logic
initsu Jul 12, 2026
a2aec08
Add more sword immunity options
initsu May 23, 2026
7cc95d4
Add images of collectables to Overworld spoiler map
initsu Jul 5, 2026
a04bb5c
Refactoring RoomPool again
initsu Jul 10, 2026
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
4 changes: 3 additions & 1 deletion .github/workflows/build-debug.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ on:
branches-ignore:
- main
- testing
- '5.1'
- extras
- sgl
- '5.2'
pull_request:

env:
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/build-latest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ on:
branches:
- main
- testing
- '5.1'
- extras
- sgl
- '5.2'

env:
# I'm not a fan of the telemetry as-is, but this also suppresses some lines in the build log.
Expand Down
5 changes: 1 addition & 4 deletions CoreSourceGenerator/CoreSourceGenerator.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@
<Configurations>Debug;Release;Unsafe Debug</Configurations>
<Platforms>AnyCPU</Platforms>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
<IsTrimmable>true</IsTrimmable>
</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)' == 'Unsafe Debug' ">
<DebugSymbols Condition=" '$(DebugSymbols)' == '' ">true</DebugSymbols>
<Optimize Condition=" '$(Optimize)' == '' ">false</Optimize>
Expand Down
51 changes: 30 additions & 21 deletions CoreSourceGenerator/FlagsSerializeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private static bool IsPartialClass(SyntaxNode node)
.Select(f =>
{
// Look up the source code for the declaration to find if it has a default value
var equalsSyntax = f.DeclaringSyntaxReferences[0].GetSyntax() switch
var equalsSyntax = f.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() switch
{
PropertyDeclarationSyntax property => property.Initializer,
VariableDeclaratorSyntax variable => variable.Initializer,
Expand All @@ -81,18 +81,32 @@ private static bool IsPartialClass(SyntaxNode node)
var serializeFields = classSymbol.GetMembers()
.OfType<IFieldSymbol>()
.Where(f => !HasIgnoreInFlagsAttribute(f))
.Select(f => new SerializedFieldInfo()
.Select(f =>
{
FieldName = f.Name,
FieldType = f.Type.ToDisplayString(),
IsDifficultyOnly = HasDifficultyOnlyAttribute(f),
IsConditionallyIncluded = HasConditionallyIncludedInFlagsAttribute(f),
DefaultValue = GetDefaultValue(f),
IsEnum = f.Type.TypeKind == TypeKind.Enum,
EnumSymbol = f.Type.TypeKind == TypeKind.Enum ? f.Type as INamedTypeSymbol : null,
Minimum = GetCustomMinimum(f),
Maximum = GetCustomMaximum(f),
CustomSerializerName = GetCustomFlagSerializer(f),
var dictionaryInterface = f.Type.AllInterfaces
.FirstOrDefault(i => i.OriginalDefinition.ToDisplayString().StartsWith("System.Collections.Generic.IDictionary"));
var innerType = dictionaryInterface != null ? dictionaryInterface.TypeArguments[0] : f.Type;

var equalsSyntax = f.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() switch
{
PropertyDeclarationSyntax property => property.Initializer,
VariableDeclaratorSyntax variable => variable.Initializer,
_ => null
};

return new SerializedFieldInfo()
{
FieldName = f.Name,
FieldType = f.Type.ToDisplayString(),
IsDifficultyOnly = HasDifficultyOnlyAttribute(f),
IsConditionallyIncluded = HasConditionallyIncludedInFlagsAttribute(f),
DefaultValue = equalsSyntax?.Value.ToString(),
IsEnum = f.Type.TypeKind == TypeKind.Enum,
EnumSymbol = f.Type.TypeKind == TypeKind.Enum ? f.Type as INamedTypeSymbol : null,
Minimum = GetCustomMinimum(f),
Maximum = GetCustomMaximum(f),
CustomSerializerName = GetCustomFlagSerializer(f),
};
}).ToList();

classInfo.SerializedFields.AddRange(serializeFields);
Expand Down Expand Up @@ -140,14 +154,6 @@ private static bool HasDifficultyOnlyAttribute(IFieldSymbol field)
.Any(attr => attr.AttributeClass?.Name.StartsWith("DifficultyOnly") ?? false);
}

private static string GetDefaultValue(IFieldSymbol f)
{
var defaultAttr = f.GetAttributes()
.FirstOrDefault(a => a.AttributeClass?.ToDisplayString() == "System.ComponentModel.DefaultValueAttribute");
var arg = defaultAttr?.ConstructorArguments[0];
return arg != null ? FormatArgument(arg.Value) : "default";
}

private static bool HasIgnoreInFlagsAttribute(IFieldSymbol field)
{
return field.GetAttributes()
Expand Down Expand Up @@ -317,7 +323,10 @@ private static void GenerateReactiveProperty(StringBuilder sb, ReactiveFieldInfo
sb.AppendLine($"{indent} {{");
sb.AppendLine($"{indent} {field.FieldName} = value;");
sb.AppendLine($"{indent} OnPropertyChanged(nameof({field.PropertyName}));");
sb.AppendLine($"{indent} OnPropertyChanged(\"Flags\");");
sb.AppendLine($"{indent} if (!_inDeserializeFlags)");
sb.AppendLine($"{indent} {{");
sb.AppendLine($"{indent} OnPropertyChanged(\"Flags\");");
sb.AppendLine($"{indent} }}");
sb.AppendLine($"{indent} }}");
sb.AppendLine($"{indent} }}");
sb.AppendLine($"{indent} }}{defaultValue}");
Expand Down
6 changes: 6 additions & 0 deletions CrossPlatformUI.Browser/CrossPlatformUI.Browser.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,14 @@

<CompressionEnabled>false</CompressionEnabled>
<BlazorEnableCompression>false</BlazorEnableCompression>
<WasmEmitSymbolMap>true</WasmEmitSymbolMap>
<EnableWorkloadRestore>true</EnableWorkloadRestore>
</PropertyGroup>

<ItemGroup>
<Workload Include="wasm-tools" />
</ItemGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
Expand Down
Binary file removed CrossPlatformUI/Assets/palace-blockers.png
Binary file not shown.
11 changes: 6 additions & 5 deletions CrossPlatformUI/CrossPlatformUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>

<PropertyGroup>
<!-- ReactiveUserControl<T> ViewModel references cause IL2026 -->
<NoWarn>$(NoWarn);IL2026</NoWarn>
</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)' == 'Unsafe Debug' ">
<DebugSymbols Condition=" '$(DebugSymbols)' == '' ">true</DebugSymbols>
<Optimize Condition=" '$(Optimize)' == '' ">false</Optimize>
Expand All @@ -35,6 +30,7 @@
<PackageReference Include="AvaloniaUI.DiagnosticsSupport" />
<PackageReference Include="DialogHost.Avalonia" />
<PackageReference Include="Material.Avalonia" />
<PackageReference Include="Material.Avalonia.DataGrid" />
<PackageReference Include="Material.Icons.Avalonia" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="ReactiveUI" />
Expand All @@ -46,6 +42,11 @@
<PackageReference Include="Xaml.Behaviors.Interactions" />
</ItemGroup>

<ItemGroup>
<RuntimeHostConfigurationOption Include="MaterialThemeIncludeDataGrid" Value="false"/>
<RuntimeHostConfigurationOption Include="MaterialThemeIncludeTreeDataGrid" Value="false"/>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\RandomizerCore\RandomizerCore.csproj" />
</ItemGroup>
Expand Down
25 changes: 19 additions & 6 deletions CrossPlatformUI/Lang/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,20 @@ group is the same as the number in that group that steal EXP in vanilla.</value>
<value>If selected, the amount of EXP each stealer steals is between 50% and 150% of the vanilla
amount.</value>
</data>
<data name="ShuffleSwordImmunityToolTip" xml:space="preserve">
<value>Randomly reassigns which enemies are immune to stabs. The number of enemies that are
immune in each group is the same as the number in that group that are immune in vanilla.</value>
<data name="SwordImmunityOptionToolTip" xml:space="preserve">
<value>Vanilla:
Uses the game's original sword immunities. (Tektites and Zoras)

Shuffle:
Randomly reassigns which enemies are immune to sword attacks and require the Fire spell
to damage. On average, the same number of enemies are immune as in the vanilla game.

Shuffle/None if Fire unusable:
Uses Shuffle if the Fire spell is usable (not replaced by Dash nor linked with Fairy).
Otherwise, removes all sword immunities.

None:
Removes all sword immunities.</value>
</data>
<data name="ShuffleSpritePalettesToolTip" xml:space="preserve">
<value>Randomizes the color palettes of enemies and NPCs. Health bar color is also randomized.
Expand Down Expand Up @@ -692,9 +703,9 @@ linear.</value>
make room.

Random Item Rooms Per Palace:
• Each palace gets 0–3 item rooms (varies by palace length/style).
• Clouds in the entrance screen and Ironknuckle statues by the entrance elevator
indicate how many items there are in the palace.</value>
• Each palace gets 0–3 item rooms (varies by palace length/style).
</data>
<data name="IncludeVanillaRoomsToolTip" xml:space="preserve">
<value>If selected, the normal zelda 2 rooms will be available for palace generation. Note that
Expand Down Expand Up @@ -766,8 +777,10 @@ considered duplicates of each other. Has no effect on vanilla palaces. Does not
prevent duplicates for Random Walk generated palaces.</value>
</data>
<data name="BlockingRoomsinAnyPalaceToolTip" xml:space="preserve">
<value>Allows rooms that require an item or spell to traverse to appear in any palace. Otherwise,
palaces can only contain blocks according to the following table.</value>
<value>Allows rooms that cannot be passed without a specific item or spell to appear in any palace.
Otherwise, the allowed requirements for rooms in palaces are based on the items and spells
needed to pass through every room in that palace in vanilla (from either direction).
See the Wiki for the full table.</value>
</data>
<data name="RemoveLongDeadEndsToolTip" xml:space="preserve">
<value>Removes dead-end rooms from the room pool. This helps newer players who are not yet
Expand Down
4 changes: 2 additions & 2 deletions CrossPlatformUI/Presets/BeginnerPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public static class BeginnerPreset
EastBiome = Biome.VANILLALIKE,
DmBiome = Biome.VANILLALIKE,
MazeBiome = Biome.VANILLALIKE,
WestClimate = ClimateEnum.VANILLA_WEIGHTED_WEST,
EastClimate = ClimateEnum.VANILLA_WEIGHTED_EAST,
WestClimate = ClimateEnum.VANILLA_WEIGHTED,
EastClimate = ClimateEnum.VANILLA_WEIGHTED,

//Palaces
NormalPalaceStyle = PalaceStyle.VANILLA_WEIGHTED,
Expand Down
6 changes: 3 additions & 3 deletions CrossPlatformUI/Presets/FullShufflePreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public static class FullShufflePreset
EastBiome = Biome.RANDOM_NO_VANILLA_OR_SHUFFLE,
DmBiome = Biome.RANDOM_NO_VANILLA_OR_SHUFFLE,
MazeBiome = Biome.VANILLALIKE,
WestClimate = ClimateEnum.VANILLA_WEIGHTED_WEST,
EastClimate = ClimateEnum.VANILLA_WEIGHTED_EAST,
WestClimate = ClimateEnum.VANILLA_WEIGHTED,
EastClimate = ClimateEnum.VANILLA_WEIGHTED,
ContinentConnectionType = ContinentConnectionType.ANYTHING_GOES,

//Palaces
Expand Down Expand Up @@ -77,7 +77,7 @@ public static class FullShufflePreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/MaxRando2025Preset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public static class MaxRando2025Preset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/MaxRandoPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public static class MaxRandoPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.WIDE,

//Items
Expand Down
6 changes: 3 additions & 3 deletions CrossPlatformUI/Presets/NormalPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public static class NormalPreset
EastBiome = Biome.RANDOM_NO_VANILLA_OR_SHUFFLE,
MazeBiome = Biome.VANILLALIKE,
DmBiome = Biome.RANDOM_NO_VANILLA_OR_SHUFFLE,
WestClimate = ClimateEnum.VANILLA_WEIGHTED_WEST,
EastClimate = ClimateEnum.VANILLA_WEIGHTED_EAST,
WestClimate = ClimateEnum.VANILLA_WEIGHTED,
EastClimate = ClimateEnum.VANILLA_WEIGHTED,
ContinentConnectionType = ContinentConnectionType.TRANSPORTATION_SHUFFLE,

//Palaces
Expand Down Expand Up @@ -70,7 +70,7 @@ public static class NormalPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/RandomPercentPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public static class RandomPercentPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/StandardPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public static class StandardPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/StandardSwissPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static class StandardSwissPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
2 changes: 1 addition & 1 deletion CrossPlatformUI/Presets/UpstartsTournamentPreset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public static class UpstartsTournamentPreset
ShuffleBossHP = EnemyLifeOption.MEDIUM,
ShuffleXPStealers = true,
ShuffleXPStolenAmount = true,
ShuffleSwordImmunity = true,
SwordImmunityOption = SwordImmunityOption.SHUFFLE,
EnemyXPDrops = XPEffectiveness.RANDOM,

//Items
Expand Down
Loading