레벨 밸런스 1000까지 확장 및 박스 상한 규칙 적용

This commit is contained in:
JiWoong Sul
2025-12-04 14:48:11 +09:00
parent ed84c9d9e8
commit d073bc8814
11 changed files with 3323 additions and 607 deletions

View File

@@ -10,6 +10,7 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text;
internal static class Program
@@ -332,7 +333,8 @@ internal static class Program
Id = level.Id,
Grid = newGrid,
LowestPush = level.LowestPush,
PushLimit = level.PushLimit
PushLimit = level.PushLimit,
MoveCount = level.MoveCount
});
}
@@ -395,7 +397,8 @@ internal static class Program
PocketMaxRadius = input.PocketMaxRadius,
MaskPadMin = padMin,
MaskPadMax = padMax,
ShapeMasks = masks
ShapeMasks = masks,
ApplyTransforms = input.ApplyTransforms
};
}
@@ -423,6 +426,21 @@ internal static class Program
case "large":
AddMasks(resolved, seen, MaskLibrary.Large);
break;
case "tall8":
AddMasks(resolved, seen, MaskLibrary.Tall8);
break;
case "tall9":
AddMasks(resolved, seen, MaskLibrary.Tall9);
break;
case "tall10":
AddMasks(resolved, seen, MaskLibrary.Tall10);
break;
case "tall11":
AddMasks(resolved, seen, MaskLibrary.Tall11);
break;
case "tall12":
AddMasks(resolved, seen, MaskLibrary.Tall12);
break;
}
}
}
@@ -477,7 +495,7 @@ internal sealed class LevelGenerator
if (band.ShapeMasksExpanded == null || band.ShapeMasksExpanded.Count == 0)
{
var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban;
band.ShapeMasksExpanded = MaskLibrary.ExpandWithTransforms(baseMasks, band.MaskPadMin, band.MaskPadMax);
band.ShapeMasksExpanded = MaskLibrary.ExpandWithTransforms(baseMasks, band.MaskPadMin, band.MaskPadMax, band.ApplyTransforms);
}
}
@@ -594,7 +612,7 @@ internal sealed class LevelGenerator
{
var failReasons = _trace ? new Dictionary<string, int>() : null;
var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban;
band.ShapeMasksExpanded ??= MaskLibrary.ExpandWithTransforms(baseMasks, band.MaskPadMin, band.MaskPadMax);
band.ShapeMasksExpanded ??= MaskLibrary.ExpandWithTransforms(baseMasks, band.MaskPadMin, band.MaskPadMax, band.ApplyTransforms);
var pockets = ResolvePockets(band);
var relaxSteps = overrideRelaxSteps ?? _tuning.RelaxationSteps;
@@ -627,7 +645,7 @@ internal sealed class LevelGenerator
var mask = MaskLibrary.CreateVariant(
MaskLibrary.PickRandom(rng, band.ShapeMasksExpanded),
rng,
_tuning.ApplyMaskTransforms,
_tuning.ApplyMaskTransforms && band.ApplyTransforms,
_tuning.MaskWallJitter);
var canvas = LayoutFactory.FromMask(mask, rng, _tuning, pockets);
@@ -723,7 +741,8 @@ internal sealed class LevelGenerator
Id = id,
Grid = lines,
LowestPush = solve.Pushes,
PushLimit = pushLimit
PushLimit = pushLimit,
MoveCount = solve.Moves
};
return true;
}
@@ -765,6 +784,7 @@ internal sealed class LevelGenerator
PocketMaxRadius = src.PocketMaxRadius,
MaskPadMin = src.MaskPadMin,
MaskPadMax = src.MaskPadMax,
ApplyTransforms = src.ApplyTransforms,
ShapeMasks = src.ShapeMasks.ToList(),
ShapeMasksExpanded = src.ShapeMasksExpanded?.ToList()
};
@@ -824,7 +844,8 @@ internal sealed class LevelGenerator
Id = level.Id,
Grid = trimmed,
LowestPush = level.LowestPush,
PushLimit = level.PushLimit
PushLimit = level.PushLimit,
MoveCount = level.MoveCount
};
}
}
@@ -953,10 +974,20 @@ internal static class LevelVerifier
internal sealed class GeneratedLevel
{
[JsonPropertyOrder(0)]
public int Id { get; init; }
[JsonPropertyOrder(1)]
public List<string> Grid { get; init; } = new();
[JsonPropertyOrder(2)]
public int LowestPush { get; init; }
[JsonPropertyOrder(3)]
public int PushLimit { get; init; }
[JsonPropertyOrder(4)]
public int MoveCount { get; init; }
}
internal sealed class LevelBandConfig
@@ -978,6 +1009,7 @@ internal sealed class LevelBandConfig
public int PocketMaxRadius { get; set; } = -1;
public int MaskPadMin { get; set; } = -1;
public int MaskPadMax { get; set; } = 1;
public bool ApplyTransforms { get; set; } = true;
public List<string[]> ShapeMasks { get; set; } = new();
public List<string[]>? ShapeMasksExpanded { get; set; }
}
@@ -1006,6 +1038,7 @@ internal sealed class LevelBandJson
public int PocketMaxRadius { get; set; } = -1;
public int MaskPadMin { get; set; } = -1;
public int MaskPadMax { get; set; } = 1;
public bool ApplyTransforms { get; set; } = true;
public List<string> MaskSets { get; set; } = new();
public int MaskTake { get; set; } = 0;
}