summaryrefslogtreecommitdiff
path: root/plugins/prospector.cpp
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-02-03 12:48:38 +0400
committerAlexander Gavrilov2012-02-03 12:48:38 +0400
commit6bf55978a499df204ada6da2aac56ecb72305d2b (patch)
treecd0b6eb0176bbebde5adf1171aef57a711328c74 /plugins/prospector.cpp
parentd4163fcde35e813dbe7d5355dbd351a7bc18ea55 (diff)
downloaddfhack-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.cpp29
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);