forked from ernop/coil-levels
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
135 lines (118 loc) · 5.14 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Collections.Generic;
using System.Diagnostics;
using static coil.Debug;
using static coil.Coilutil;
using static coil.Reportutil;
namespace coil
{
partial class Program
{
static void Main(string[] args)
{
var config = new LevelGenerationConfig();
config.seed = 0;
config.x = 5000;
config.y = 5000;
config.saveTweaks = false;
config.saveEvery = 1;
config.segPickerName = "Weighted4";
//config.segPickerName = "";
config.tweakPickerName = "rnd99";
//config.tweakPickerName = "";
config.saveEmpty = false;
config.saveEmptyUpperCorner = true;
config.saveWithPath = false;
config.saveArrows = false;
config.arrowLengthMin = 50;
config.genLimits = new List<int?>() { 20, };
config.saveCsv = true;
CreateLevel(config);
//CreateMultiple(config, 30);
}
static void CreateLots(LevelGenerationConfig config, int minx, int miny, int maxx, int maxy, int xincrement, int yincrement, int countper)
{
var x = minx;
var y = miny;
while (x < maxx && y < maxy) {
CreateMultiple(config, countper);
x += xincrement;
y += yincrement;
}
}
static void CreateMultiple(LevelGenerationConfig config, int count) {
var max = config.seed + count;
while (config.seed < max)
{
CreateLevel(config);
config.seed++;
}
}
static void CreateLevel(LevelGenerationConfig config)
{
var levelstem = $"../../../output/{config.x}x{config.y}";
var csvpath = levelstem + "/results.csv";
var csv = new CsvWriter(csvpath);
if (!System.IO.Directory.Exists(levelstem))
{
System.IO.Directory.CreateDirectory($"{levelstem}");
}
var runcount = 0;
//var ws = new InitialWanderSetup(steplimit:2, startPoint:(1,1), gomax:true);
var ws = new InitialWanderSetup();
foreach (var tweakPicker in TweakPickers.GetPickers(config.tweakPickerName))
{
foreach (var el in config.genLimits)
{
var os = new OptimizationSetup();
os.GlobalTweakLim = el;
foreach (var segPicker in SegPickers.GetSegPickers(config.segPickerName))
{
runcount++;
var lc = new LevelConfiguration(tweakPicker, segPicker, os, ws);
var log = new Log(lc);
var rnd = new System.Random(config.seed);
var level = new Level(lc, config.x, config.y, rnd, config.seed);
level.InitialWander(lc);
//bit awkward to do it here - it needs a better guarantee of finding the best seg.
segPicker.Init(config.seed, level);
tweakPicker.Init(config.seed);
var st = Stopwatch.StartNew();
var tweakStats = level.RepeatedlyTweak(config.saveTweaks, config.saveEvery.Value, st);
var elapsed = st.Elapsed;
//before doing any outputting, validate the level.
DoDebug(level, show: false, validateBoard: true);
AfterLevelGenerated(level, config, levelstem, lc, tweakStats, elapsed, csv, log, runcount);
}
}
}
}
public static void AfterLevelGenerated(Level level, LevelGenerationConfig config, string levelstem, LevelConfiguration lc, TweakStats tweakStats, TimeSpan ts, CsvWriter csv, Log log, int runcount)
{
var repdata = GetReport(level, ts, tweakStats);
var rep = Report(repdata, multiline: true);
log.Info(Report(repdata, multiline: false));
SaveLevelAsText(level, config.seed);
if (config.saveCsv)
{
csv.Write(repdata);
}
if (config.saveEmpty)
{
SaveEmpty(level, $"{levelstem}/{lc.GetStr()}-empty-{config.seed} {runcount}.png", subtitle: rep, quiet: true);
}
if (config.saveEmptyUpperCorner)
{
SaveEmpty(level, $"{levelstem}/{lc.GetStr()}-corner-{config.seed} {runcount}.png", subtitle: rep, quiet: true, corner: true);
}
if (config.saveWithPath)
{
SaveWithPath(level, $"{levelstem}/{lc.GetStr()}-path-{config.seed} {runcount}.png", subtitle: rep, quiet: true);
}
if (config.saveArrows)
{
SaveArrowVersions(level, config.seed, levelstem, config.arrowLengthMin);
}
}
}
}