Optimization of cache rebuild

(>4x faster, for both cache building and "building terrain rules")

by introducing a new method for terrain variations, which stop relying
on the WML preprocessor.

Still WiP. WML syntax is not final, and thus also WML macros and WML
parsing (not optimized yet)
This commit is contained in:
Ali El Gariani 2010-08-23 04:21:47 +00:00
parent 44ed14f86d
commit dfe444a6bc
6 changed files with 111 additions and 146 deletions

View file

@ -22,6 +22,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}
@ -58,6 +59,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0-@R1}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}
@ -99,6 +101,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0-@R1-@R2}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}
@ -146,6 +149,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0-@R1-@R2-@R3}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}
@ -195,6 +199,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0-@R1-@R2-@R3-@R4}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}
@ -249,6 +254,7 @@
[image]
layer={LAYER}
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} -@R0-@R1-@R2-@R3-@R4-@R5}
variations=";2;3;4;5;6;7;8;9;10;11"
center=90,144
[/image]
probability={PROB}

View file

@ -10,62 +10,22 @@
# take one of the images IMAGESTEM#
# the chances are the same for all available images, even if the last ones are missing
#define GENERIC_SINGLE_RANDOM_LFB TERRAIN LAYER FLAG BUILDER IMAGESTEM
{GENERIC_SINGLE_PLFB ({TERRAIN}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{GENERIC_SINGLE_PLFB ({TERRAIN}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{GENERIC_SINGLE_PLFB ({TERRAIN}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{GENERIC_SINGLE_PLFB ({TERRAIN}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define GENERIC_RESTRICTED_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM ROTATION
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} {ROTATION}}
{GENERIC_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V {ROTATION}}
#enddef
#define GENERIC_RESTRICTED2_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM ROTATION
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} {ROTATION}}
{GENERIC_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V {ROTATION}}
#enddef
#define GENERIC_RESTRICTED3_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM ROTATION
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} {ROTATION}}
{GENERIC_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V {ROTATION}}
#enddef
#define GENERIC_COMPLETE_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
@ -88,89 +48,29 @@
# the chances are the same for all available images, even if the last ones are missing
#define BORDER_RESTRICTED_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_RESTRICTED2_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED2_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_RESTRICTED3_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED3_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_RESTRICTED4_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED4_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_RESTRICTED5_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED5_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_RESTRICTED6_RANDOM_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 9 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}11}
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 10 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}10}
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 11 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}9 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 12 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}8 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 14 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}7 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 16 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}6 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 20 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}5 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 25 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}4 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 33 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}3 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 50 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}2 }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM} }
{BORDER_RESTRICTED6_PLFB ({TERRAIN}) ({ADJACENT}) 100 {LAYER} {FLAG} {BUILDER} {IMAGESTEM}@V}
#enddef
#define BORDER_COMPLETE_LFB TERRAIN ADJACENT LAYER FLAG BUILDER IMAGESTEM

View file

@ -22,6 +22,7 @@
probability={PROB}
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} ()}
variations=";2;3;4;5;6;7;8;9;10;11"
layer={LAYER}
base=90,144
center=90,144
@ -55,6 +56,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -89,6 +91,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -120,6 +123,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -151,6 +155,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -196,6 +201,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -228,6 +234,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -260,6 +267,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}
@ -292,6 +300,7 @@
[image]
name={BUILD_IMAGE {BUILDER} {IMAGESTEM} {ROTATION}}
variations=";2;3;4;5;6;7;8;9;10;11"
base=90,144
center=90,144
layer={LAYER}

View file

@ -77,7 +77,10 @@ void terrain_builder::tile::rebuild_cache(const std::string& tod, logs* log)
if(!variant.tods.empty() && variant.tods.find(tod) == variant.tods.end())
continue;
img_list.push_back(variant.image);
//need to break parity pattern in RNG
///@TODO improve this
unsigned int rnd = ri.rand / 7919; //just the 1000th prime
img_list.push_back(variant.images[rnd % variant.images.size()]);
img_list.back().set_animation_time(ri.rand % img_list.back().get_animation_duration());
if(log) {
@ -304,6 +307,29 @@ static bool image_exists(const std::string& name)
return false;
}
static std::vector<std::string> get_variations(const std::string& base, const std::string& variations)
{
///@TODO optimize this function
std::vector<std::string> res;
if(variations.empty()){
res.push_back(base);
return res;
}
std::string::size_type pos = base.find("@V", 0);
if(pos == std::string::npos) {
res.push_back(base);
return res;
}
std::vector<std::string> vars = utils::split(variations, ';', 0);
const std::string prefix(base, 0, pos);
const std::string postfix(base, pos+2, std::string::npos);
foreach(std::string& v, vars){
res.push_back(prefix + v + postfix);
}
return res;
}
bool terrain_builder::load_images(building_rule &rule)
{
// If the rule has no constraints, it is invalid
@ -316,38 +342,52 @@ bool terrain_builder::load_images(building_rule &rule)
{
foreach(rule_image& ri, constraint.images)
{
foreach(rule_image_variant& variant, ri.variants) {
//TODO: improve this, 99% of terrains are not animated.
std::vector<std::string> frames = utils::parenthetical_split(variant.image_string,',');
if (frames.empty()) return false;
foreach(rule_image_variant& variant, ri.variants)
{
foreach(const std::string& frame, frames) {
const std::vector<std::string> items = utils::split(frame, ':');
const std::string& str = items.front();
//std::vector<std::string> var_strings = utils::split(variant.image_string, ';');
std::vector<std::string> var_strings = get_variations(variant.image_string, variant.variations);
foreach(const std::string& var, var_strings)
{
///@TODO improve this, 99% of terrains are not animated.
std::vector<std::string> frames = utils::parenthetical_split(var,',');
animated<image::locator> res;
const size_t tilde = str.find('~');
bool has_tilde = tilde != std::string::npos;
const std::string filename = "terrain/" + (has_tilde ? str.substr(0,tilde) : str);
foreach(const std::string& frame, frames)
{
const std::vector<std::string> items = utils::split(frame, ':');
const std::string& str = items.front();
if(!image_exists(filename))
return false;
const size_t tilde = str.find('~');
bool has_tilde = tilde != std::string::npos;
const std::string filename = "terrain/" + (has_tilde ? str.substr(0,tilde) : str);
const std::string modif = (has_tilde ? str.substr(tilde+1) : "");
if(!image_exists(filename)){
continue; // ignore missing frames
}
int time = 100;
if(items.size() > 1) {
time = atoi(items.back().c_str());
const std::string modif = (has_tilde ? str.substr(tilde+1) : "");
int time = 100;
if(items.size() > 1) {
time = atoi(items.back().c_str());
}
image::locator locator;
if(ri.global_image) {
locator = image::locator(filename, constraint.loc, ri.center_x, ri.center_y, modif);
} else {
locator = image::locator(filename, modif);
}
res.add_frame(time, locator);
}
image::locator locator;
if(ri.global_image) {
locator = image::locator(filename, constraint.loc, ri.center_x, ri.center_y, modif);
} else {
locator = image::locator(filename, modif);
}
variant.image.add_frame(time, locator);
if(res.get_frames_count() == 0)
break; // no valid images, don't register it
res.start_animation(0, true);
variant.images.push_back(res);
}
variant.image.start_animation(0, true);
if(variant.images.empty())
return false; //no valid images, rule is invalid
}
}
}
@ -520,9 +560,10 @@ void terrain_builder::rotate_rule(building_rule &ret, int angle,
replace_rotate_tokens(ret, angle, rot);
}
terrain_builder::rule_image_variant::rule_image_variant(const std::string &image_string, const std::string& tod) :
terrain_builder::rule_image_variant::rule_image_variant(const std::string &image_string, const std::string& variations, const std::string& tod) :
image_string(image_string),
image(),
variations(variations),
images(),
tods()
{
if(!tod.empty()) {
@ -561,15 +602,17 @@ void terrain_builder::add_images_from_config(rule_imagelist& images, const confi
foreach (const config &variant, img.child_range("variant"))
{
const std::string &name = variant["name"];
const std::string &variations = img["variations"];
const std::string &tod = variant["tod"];
images.back().variants.push_back(rule_image_variant(name, tod));
images.back().variants.push_back(rule_image_variant(name, variations, tod));
}
// Adds the main (default) variant of the image at the end,
// (will be used only if previous variants don't match)
const std::string &name = img["name"];
images.back().variants.push_back(rule_image_variant(name));
const std::string &variations = img["variations"];
images.back().variants.push_back(rule_image_variant(name, variations));
}
}

View file

@ -156,14 +156,15 @@ public:
*/
struct rule_image_variant {
/** Constructor for the normal defaut case */
rule_image_variant(const std::string &image_string) :
rule_image_variant(const std::string &image_string, const std::string& variations) :
image_string(image_string),
image(),
variations(variations),
images(),
tods()
{};
/** Constructor for true [variant] cases */
rule_image_variant(const std::string &image_string, const std::string& tod);
rule_image_variant(const std::string &image_string, const std::string& variations, const std::string& tod);
/** A string representing either the filename for an image, or
* a list of images, with an optional timing for each image.
@ -184,11 +185,16 @@ public:
*/
std::string image_string;
/** A semi-solon separated list of string used to replace
* @verbatim <code>@V</code> @endverbatim in image_string (if present)
*/
std::string variations;
/** An animated image locator built according to the image string.
* This will be the image locator which will actually
* be returned to the user.
*/
animated<image::locator> image;
std::vector< animated<image::locator> > images;
/** The Time of Day associated to this variant (if any)*/
std::set<std::string> tods;

View file

@ -3211,9 +3211,10 @@ void console_handler::do_layers() {
const terrain_builder::tile::rule_image_rand& ri = *det.first;
const terrain_builder::rule_image_variant& variant = *det.second;
const image::locator& img = variant.image.get_first_frame();
///@TODO also use random image variations (not just take 1st)
const image::locator& img = variant.images.front().get_first_frame();
const std::string& name = img.get_filename();
//TODO deal with (rarely used) ~modifications
///@TODO deal with (rarely used) ~modifications
//const std::string& modif = img.get_modifications();
const map_location& loc_cut = img.get_loc();