diff options
| author | Alexander Gavrilov | 2012-02-03 12:48:38 +0400 |
|---|---|---|
| committer | Alexander Gavrilov | 2012-02-03 12:48:38 +0400 |
| commit | 6bf55978a499df204ada6da2aac56ecb72305d2b (patch) | |
| tree | cd0b6eb0176bbebde5adf1171aef57a711328c74 /plugins/prospector.cpp | |
| parent | d4163fcde35e813dbe7d5355dbd351a7bc18ea55 (diff) | |
| download | dfhack-6bf55978a499df204ada6da2aac56ecb72305d2b.tar.gz dfhack-6bf55978a499df204ada6da2aac56ecb72305d2b.tar.bz2 dfhack-6bf55978a499df204ada6da2aac56ecb72305d2b.tar.xz | |
Modify embark-time prospect using the randomized material hypothesis.
Assume that the game generates a fixed number of veins of each
type, but randomly chooses the material, using unk_38 as weight.
This seems to bring some numbers closer to the real counts.
Diffstat (limited to 'plugins/prospector.cpp')
| -rw-r--r-- | plugins/prospector.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/plugins/prospector.cpp b/plugins/prospector.cpp index 25ff08cb..b7ade149 100644 --- a/plugins/prospector.cpp +++ b/plugins/prospector.cpp @@ -285,28 +285,41 @@ static command_result embark_prospector(DFHack::Core *c, df::viewscreen_choose_s int level_cnt = layer->top_height - layer->bottom_height + 1; int layer_size = 48*48*cnt*level_cnt; + int sums[ENUM_LAST_ITEM(inclusion_type)+1] = { 0 }; + + for (unsigned j = 0; j < layer->vein_mat.size(); j++) + if (inclusion_type::is_valid(layer->vein_type[j])) + sums[layer->vein_type[j]] += layer->vein_unk_38[j]; + for (unsigned j = 0; j < layer->vein_mat.size(); j++) { // TODO: find out how to estimate the real density - int bias = 100; - switch (layer->vein_type[j]) + // this code assumes that vein_unk_38 is the weight + // used when choosing the vein material + int size = layer->vein_unk_38[j]*cnt*level_cnt; + df::inclusion_type type = layer->vein_type[j]; + + switch (type) { case inclusion_type::VEIN: - bias = 200; + // 3 veins of 80 tiles avg + size = size * 80 * 3 / sums[type]; break; case inclusion_type::CLUSTER: - bias = 1000; + // 1 cluster of 700 tiles avg + size = size * 700 * 1 / sums[type]; break; case inclusion_type::CLUSTER_SMALL: - bias = 15; + size = size * 6 * 7 / sums[type]; break; case inclusion_type::CLUSTER_ONE: - bias = 2; + size = size * 1 * 5 / sums[type]; break; + default: + // shouldn't actually happen + size = cnt*level_cnt; } - int size = layer->vein_unk_38[j]*bias*cnt*level_cnt/100; - veinMats[layer->vein_mat[j]].add(layer->bottom_height, 0); veinMats[layer->vein_mat[j]].add(layer->top_height, size); |
