feat: added deterministic flag for replacerules

This commit is contained in:
Sara Gerretsen 2026-04-01 16:03:11 +02:00
parent f7a06a51dc
commit 35559c69d6
3 changed files with 181 additions and 142 deletions

View file

@ -164,12 +164,7 @@ bool RepeatRuleUntilFailure::try_apply(Ref<Sentence> sentence) {
void ReplaceRule::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, pattern, PROPERTY_HINT_RESOURCE_TYPE, Sentence::get_class_static());
BIND_HPROPERTY(Variant::DICTIONARY, results_dict, PROPERTY_HINT_DICTIONARY_TYPE, vformat("%s/%s:%s;float", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE, Sentence::get_class_static()));
}
bool ReplaceRule::try_match(Ref<Sentence> sentence, Vector2i &out) {
ERR_FAIL_COND_V_EDMSG(this->results.size() == 0, false, "ReplaceRule::try_apply failed, no results in list");
return false;
BIND_PROPERTY(Variant::BOOL, deterministic);
}
void ReplaceRule::write_result(Ref<Sentence> to, Vector2i at) {
@ -184,15 +179,10 @@ void ReplaceRule::write_result(Ref<Sentence> to, Vector2i at) {
}
bool ReplaceRule::try_apply_all(Ref<Sentence> sentence) {
Vector2i at{};
if (try_match(sentence, at)) {
write_result(sentence, at);
return true;
}
unsigned total{ 2 * 2 * 2 };
for (Vector2i pos{ 0, 0 }; pos.y < sentence->get_size().y; ++pos.y) {
for (; pos.x < sentence->get_size().x; ++pos.x) {
unsigned random{ (Math::rand() * 3) % total };
unsigned random{ this->deterministic ? 1 : (Math::rand() * 3) % total };
for (unsigned i{ 0 }; i < total; ++i) {
this->pattern->read_flip_h = (i * random) & 0b1;
this->pattern->read_flip_v = (i * random) & 0b10;

View file

@ -88,7 +88,6 @@ public:
class ReplaceRule : public Rule {
GDCLASS(ReplaceRule, Rule);
static void _bind_methods();
bool try_match(Ref<Sentence> graph, Vector2i &out);
void write_result(Ref<Sentence> to, Vector2i at);
bool try_apply_all(Ref<Sentence> sentence);
@ -98,9 +97,11 @@ public:
private:
Ref<Sentence> pattern{};
Vector<Pair<Ref<Sentence>, float>> results{};
bool deterministic{ false };
public:
GET_SET_FNS(Ref<Sentence>, pattern);
GET_SET_FNS(bool, deterministic);
void set_results(Vector<Pair<Ref<Sentence>, float>> value) { this->results = value; }
Vector<Pair<Ref<Sentence>, float>> get_results() { return this->results; }
void set_results_dict(Dictionary value);

View file

@ -17,6 +17,100 @@ background_mode = 2
sky = SubResource("Sky_srduu")
glow_enabled = true
[sub_resource type="Sentence" id="Sentence_c7dwr"]
size = Vector2i(5, 5)
symbols_string = "sssss
sssss
sssss
sssss
sssss"
[sub_resource type="Sentence" id="Sentence_ohg4i"]
size = Vector2i(5, 5)
symbols_string = "ppppp
ppppp
ppspp
ppppp
ppppp"
[sub_resource type="Sentence" id="Sentence_yxqus"]
size = Vector2i(7, 7)
symbols_string = "*#####*
upppppu
upppppu
upppppu
upppppu
upppppu
*#####*"
[sub_resource type="Sentence" id="Sentence_08grt"]
size = Vector2i(7, 7)
symbols_string = "*#####*
uupppuu
uupppuu
uupppuu
uupppuu
uupppuu
*#####*"
[sub_resource type="Sentence" id="Sentence_b4io3"]
size = Vector2i(4, 4)
symbols_string = "#uuu
#uuu
#uuu
####"
[sub_resource type="Sentence" id="Sentence_cygrb"]
size = Vector2i(4, 4)
symbols_string = "#puu
#ppu
#ppp
####"
[sub_resource type="Sentence" id="Sentence_cxvmb"]
size = Vector2i(4, 4)
symbols_string = "#uuu
#puu
#ppu
####"
[sub_resource type="Sentence" id="Sentence_45kae"]
size = Vector2i(4, 4)
symbols_string = "pppu
pppu
pppu
uuuu"
[sub_resource type="Sentence" id="Sentence_eijdf"]
size = Vector2i(4, 4)
symbols_string = "pppu
ppuu
puuu
uuuu"
[sub_resource type="Sentence" id="Sentence_5lcvo"]
size = Vector2i(4, 4)
symbols_string = "pppu
pppu
ppuu
uuuu"
[sub_resource type="Sentence" id="Sentence_5ax7p"]
size = Vector2i(2, 1)
symbols_string = "pu"
[sub_resource type="Sentence" id="Sentence_ntpuo"]
size = Vector2i(2, 1)
symbols_string = "pw"
[sub_resource type="Sentence" id="Sentence_25vwi"]
size = Vector2i(2, 1)
symbols_string = "xu"
[sub_resource type="Sentence" id="Sentence_wvupy"]
size = Vector2i(2, 1)
symbols_string = "xw"
[sub_resource type="Sentence" id="Sentence_bb2w7"]
size = Vector2i(15, 15)
symbols_string = "uuuuuuuuuuuuuuu
@ -50,8 +144,8 @@ uxppu
[sub_resource type="Sentence" id="Sentence_qw2yk"]
size = Vector2i(5, 3)
symbols_string = "uuuuu
upppu
*pux*"
uppxu
*pup*"
[sub_resource type="Sentence" id="Sentence_pbld3"]
size = Vector2i(5, 4)
@ -103,95 +197,28 @@ symbols_string = "px"
size = Vector2i(2, 1)
symbols_string = "xp"
[sub_resource type="Sentence" id="Sentence_c7dwr"]
size = Vector2i(5, 5)
symbols_string = "sssss
sssss
sssss
sssss
sssss"
[sub_resource type="Sentence" id="Sentence_dkjoc"]
size = Vector2i(3, 3)
symbols_string = "*pu
*pp
u**"
[sub_resource type="Sentence" id="Sentence_ohg4i"]
size = Vector2i(5, 5)
symbols_string = "ppppp
ppppp
ppspp
ppppp
ppppp"
[sub_resource type="Sentence" id="Sentence_g57ti"]
size = Vector2i(3, 3)
symbols_string = "*pu
*xp
u**"
[sub_resource type="Sentence" id="Sentence_b4io3"]
size = Vector2i(4, 4)
symbols_string = "#uuu
#uuu
#uuu
####"
[sub_resource type="Sentence" id="Sentence_7rlrl"]
size = Vector2i(3, 3)
symbols_string = "uuu
upu
*p*"
[sub_resource type="Sentence" id="Sentence_cygrb"]
size = Vector2i(4, 4)
symbols_string = "#puu
#ppu
#ppp
####"
[sub_resource type="Sentence" id="Sentence_cxvmb"]
size = Vector2i(4, 4)
symbols_string = "#uuu
#puu
#ppu
####"
[sub_resource type="Sentence" id="Sentence_45kae"]
size = Vector2i(4, 4)
symbols_string = "pppu
pppu
pppu
uuuu"
[sub_resource type="Sentence" id="Sentence_eijdf"]
size = Vector2i(4, 4)
symbols_string = "pppu
ppuu
puuu
uuuu"
[sub_resource type="Sentence" id="Sentence_5lcvo"]
size = Vector2i(4, 4)
symbols_string = "pppu
pppu
ppuu
uuuu"
[sub_resource type="Sentence" id="Sentence_yxqus"]
size = Vector2i(7, 5)
symbols_string = "uuuuuuu
*ppppp*
#ppppp#
#ppppp#
#ppppp#"
[sub_resource type="Sentence" id="Sentence_08grt"]
size = Vector2i(7, 5)
symbols_string = "uuuuuuu
*uuuuu*
#ppppp#
#ppppp#
#ppppp#"
[sub_resource type="Sentence" id="Sentence_5ax7p"]
size = Vector2i(2, 1)
symbols_string = "pu"
[sub_resource type="Sentence" id="Sentence_ntpuo"]
size = Vector2i(2, 1)
symbols_string = "pw"
[sub_resource type="Sentence" id="Sentence_25vwi"]
size = Vector2i(2, 1)
symbols_string = "xu"
[sub_resource type="Sentence" id="Sentence_wvupy"]
size = Vector2i(2, 1)
symbols_string = "xw"
[sub_resource type="Sentence" id="Sentence_13d85"]
size = Vector2i(3, 2)
symbols_string = "uuu
uxu"
[node name="Dungeon" type="Node3D" unique_id=719313039]
@ -202,6 +229,58 @@ environment = SubResource("Environment_s5a2w")
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
shadow_enabled = true
[node name="ResizeRule" type="ResizeRule" parent="." unique_id=630306379]
factor = 5
[node name="SingleStart" type="ReplaceRule" parent="." unique_id=80625713]
pattern = SubResource("Sentence_c7dwr")
results_dict = {
SubResource("Sentence_ohg4i"): 1.0
}
[node name="TightenPaths" type="RepeatRuleUntilFailure" parent="." unique_id=1419444164]
[node name="Path" type="ReplaceRule" parent="TightenPaths" unique_id=582926889]
pattern = SubResource("Sentence_yxqus")
results_dict = {
SubResource("Sentence_08grt"): 1.0
}
deterministic = true
[node name="Naturalise" type="RepeatRuleUntilFailure" parent="." unique_id=945333249]
[node name="InnerCorner" type="ReplaceRule" parent="Naturalise" unique_id=1294874606]
pattern = SubResource("Sentence_b4io3")
results_dict = {
SubResource("Sentence_cygrb"): 1.0,
SubResource("Sentence_cxvmb"): 1.0
}
deterministic = true
[node name="OuterCorner" type="ReplaceRule" parent="Naturalise" unique_id=1858990914]
pattern = SubResource("Sentence_45kae")
results_dict = {
SubResource("Sentence_eijdf"): 1.0,
SubResource("Sentence_5lcvo"): 1.0
}
deterministic = true
[node name="AddWalls" type="RepeatRuleUntilFailure" parent="." unique_id=351448478]
[node name="Path" type="ReplaceRule" parent="AddWalls" unique_id=1194164836]
pattern = SubResource("Sentence_5ax7p")
results_dict = {
SubResource("Sentence_ntpuo"): 1.0
}
deterministic = true
[node name="Room" type="ReplaceRule" parent="AddWalls" unique_id=1878579537]
pattern = SubResource("Sentence_25vwi")
results_dict = {
SubResource("Sentence_wvupy"): 1.0
}
deterministic = true
[node name="Generator" type="Generator" parent="." unique_id=1532743122]
state = SubResource("Sentence_bb2w7")
tiles_dict = {
@ -242,56 +321,25 @@ results_dict = {
SubResource("Sentence_q0ye3"): 1.0
}
[node name="ClearAdjacentRooms" type="RepeatRuleUntilFailure" parent="Generator/Generate" unique_id=1503159395]
[node name="RefineRooms" type="RepeatRuleUntilFailure" parent="Generator/Generate" unique_id=1503159395]
[node name="ReplaceDouble" type="ReplaceRule" parent="Generator/Generate/ClearAdjacentRooms" unique_id=1043806381]
[node name="ReplaceDouble" type="ReplaceRule" parent="Generator/Generate/RefineRooms" unique_id=1043806381]
pattern = SubResource("Sentence_7ibwp")
results_dict = {
SubResource("Sentence_gm6wd"): 1.0,
SubResource("Sentence_lpnri"): 1.0
}
deterministic = true
[node name="ResizeRule" type="ResizeRule" parent="Generator/Generate" unique_id=630306379]
factor = 5
[node name="SingleStart" type="ReplaceRule" parent="Generator/Generate" unique_id=80625713]
pattern = SubResource("Sentence_c7dwr")
[node name="RoomOnCorners" type="ReplaceRule" parent="Generator/Generate/RefineRooms" unique_id=792182208]
pattern = SubResource("Sentence_dkjoc")
results_dict = {
SubResource("Sentence_ohg4i"): 1.0
SubResource("Sentence_g57ti"): 1.0
}
deterministic = true
[node name="Naturalise" type="RepeatRuleUntilFailure" parent="Generator/Generate" unique_id=945333249]
[node name="InnerCorner" type="ReplaceRule" parent="Generator/Generate/Naturalise" unique_id=1294874606]
pattern = SubResource("Sentence_b4io3")
[node name="DeadEnd" type="ReplaceRule" parent="Generator/Generate/RefineRooms" unique_id=1706813607]
pattern = SubResource("Sentence_7rlrl")
results_dict = {
SubResource("Sentence_cygrb"): 1.0,
SubResource("Sentence_cxvmb"): 1.0
}
[node name="OuterCorner" type="ReplaceRule" parent="Generator/Generate/Naturalise" unique_id=1858990914]
pattern = SubResource("Sentence_45kae")
results_dict = {
SubResource("Sentence_eijdf"): 1.0,
SubResource("Sentence_5lcvo"): 1.0
}
[node name="Path" type="ReplaceRule" parent="Generator/Generate/Naturalise" unique_id=582926889]
pattern = SubResource("Sentence_yxqus")
results_dict = {
SubResource("Sentence_08grt"): 1.0
}
[node name="AddWalls" type="RepeatRuleUntilFailure" parent="Generator/Generate" unique_id=351448478]
[node name="Path" type="ReplaceRule" parent="Generator/Generate/AddWalls" unique_id=1194164836]
pattern = SubResource("Sentence_5ax7p")
results_dict = {
SubResource("Sentence_ntpuo"): 1.0
}
[node name="Room" type="ReplaceRule" parent="Generator/Generate/AddWalls" unique_id=1878579537]
pattern = SubResource("Sentence_25vwi")
results_dict = {
SubResource("Sentence_wvupy"): 1.0
SubResource("Sentence_13d85"): 1.0
}