chore: dungeon will now place tiles

This commit is contained in:
Sara Gerretsen 2026-03-31 16:17:12 +02:00
parent af5abfce67
commit 36e4be7d28
3 changed files with 95 additions and 22 deletions

View file

@ -1,11 +1,13 @@
#include "generator.h"
#include "core/config/engine.h"
#include "core/math/math_funcs.h"
#include "core/math/vector2i.h"
#include "core/object/class_db.h"
#include "macros.h"
void Generator::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, state, PROPERTY_HINT_RESOURCE_TYPE, "Sentence");
BIND_HPROPERTY(Variant::DICTIONARY, tiles_dict, PROPERTY_HINT_DICTIONARY_TYPE, vformat("String;PackedScene"));
}
void Generator::initialise_state() {
@ -42,6 +44,20 @@ void Generator::ready() {
this->rule->try_apply(this->state);
print_line("STATE:");
print_line(this->state->get_symbols_string());
for (Vector2i at{ 0, 0 }; at.y < this->state->size.y; ++at.y) {
for (; at.x < this->state->size.x; ++at.x) {
Symbol s{ this->state->get_at(at) };
if (this->tiles.has(s)) {
if (Node * node{ this->tiles.get(s)->instantiate() }) {
if (Node3D * node3d{ cast_to<Node3D>(node) }) {
node3d->set_position({ (float)at.x, 0, (float)at.y });
}
this->add_child(node);
}
}
}
at.x = 0;
}
}
void Generator::_notification(int what) {
@ -63,3 +79,23 @@ void Generator::_notification(int what) {
return;
}
}
void Generator::set_tiles_dict(Dictionary dict) {
this->tiles.clear();
for (KeyValue<Variant, Variant> kvp : dict) {
String key{ kvp.key };
Ref<PackedScene> value{ kvp.value };
if (key.is_empty() || value.is_null()) {
continue;
}
this->tiles.insert(key.get(0), value);
}
}
Dictionary Generator::get_tiles_dict() const {
Dictionary dict{};
for (TileMap::KV kvp : this->tiles) {
dict.set(String() + kvp.key, kvp.value);
}
return dict;
}

View file

@ -1,7 +1,9 @@
#pragma once
#include "core/templates/hash_map.h"
#include "generative_grammar/grammar.h"
#include "scene/3d/node_3d.h"
#include "scene/resources/packed_scene.h"
class Generator : public Node3D {
GDCLASS(Generator, Node3D);
@ -15,7 +17,12 @@ protected:
public:
Ref<Sentence> state{};
Rule *rule{ nullptr };
typedef HashMap<Symbol, Ref<PackedScene>> TileMap;
TileMap tiles{};
private:
GET_SET_FNS(Ref<Sentence>, state);
GET_SET_REF_FNS(TileMap, tiles);
void set_tiles_dict(Dictionary dict);
Dictionary get_tiles_dict() const;
};

View file

@ -1,5 +1,7 @@
[gd_scene format=3 uid="uid://cak2tf2adjv8j"]
[ext_resource type="PackedScene" uid="uid://bn7d8n5mbabu3" path="res://objects/tiles/path.tscn" id="1_wail4"]
[sub_resource type="Sentence" id="Sentence_bb2w7"]
size = Vector2i(20, 20)
symbols_string = "uuuuuuuuuuuuuuuuuuuu
@ -23,18 +25,6 @@ uuuuuuuuuuuuuuuuuuuu
uuuuuuuuuuuuuuuuuuuu
uuuuuuuuuuuuuuuuuuuu"
[sub_resource type="Sentence" id="Sentence_wail4"]
size = Vector2i(3, 1)
symbols_string = "ppp"
[sub_resource type="Sentence" id="Sentence_srduu"]
size = Vector2i(3, 1)
symbols_string = "pxp"
[sub_resource type="Sentence" id="Sentence_w0mg0"]
size = Vector2i(3, 1)
symbols_string = "ppp"
[sub_resource type="Sentence" id="Sentence_s5a2w"]
size = Vector2i(5, 3)
symbols_string = "uuuuu
@ -47,9 +37,25 @@ symbols_string = "uuuuu
upxpu
*pup*"
[sub_resource type="Sentence" id="Sentence_wyxho"]
size = Vector2i(5, 5)
symbols_string = "uuuuu
uuuuu
*p*p*
uuuuu
uuuuu"
[sub_resource type="Sentence" id="Sentence_q0ye3"]
size = Vector2i(5, 5)
symbols_string = "uuuuu
upxpu
*pup*
upxpu
uuuuu"
[sub_resource type="Sentence" id="Sentence_7f72c"]
size = Vector2i(5, 3)
symbols_string = "*pxp*
symbols_string = "*p*p*
uuuuu
uuuuu"
@ -59,31 +65,55 @@ symbols_string = "*pup*
upxpu
uuuuu"
[sub_resource type="Sentence" id="Sentence_wail4"]
size = Vector2i(5, 3)
symbols_string = "uuuuu
up*pu
**u**"
[sub_resource type="Sentence" id="Sentence_srduu"]
size = Vector2i(5, 3)
symbols_string = "upxpu
upupu
**u**"
[node name="Dungeon" type="Node3D" unique_id=719313039]
[node name="Generator" type="Generator" parent="." unique_id=1532743122]
state = SubResource("Sentence_bb2w7")
tiles_dict = {
"p": ExtResource("1_wail4"),
"x": ExtResource("1_wail4")
}
[node name="RepeatRuleUntilFailure" type="RepeatRuleUntilFailure" parent="Generator" unique_id=407316032]
[node name="CompositeRule" type="CompositeRule" parent="Generator/RepeatRuleUntilFailure" unique_id=117678547]
random_order = true
[node name="ReplaceRule" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1787373751]
pattern = SubResource("Sentence_wail4")
results_dict = {
SubResource("Sentence_srduu"): 1.0,
SubResource("Sentence_w0mg0"): 2.0
}
[node name="ReplaceRule2" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1073931523]
[node name="ZigUp" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1073931523]
pattern = SubResource("Sentence_s5a2w")
results_dict = {
SubResource("Sentence_yc5ro"): 1.0
}
[node name="ReplaceRule3" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1665850421]
[node name="Split" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=222066055]
pattern = SubResource("Sentence_wyxho")
results_dict = {
SubResource("Sentence_q0ye3"): 1.0
}
[node name="ZagDown" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1665850421]
pattern = SubResource("Sentence_7f72c")
results_dict = {
SubResource("Sentence_pbld3"): 1.0
}
[node name="ExtendLoop" type="ReplaceRule" parent="Generator/RepeatRuleUntilFailure/CompositeRule" unique_id=1207681043]
pattern = SubResource("Sentence_wail4")
results_dict = {
SubResource("Sentence_srduu"): 1.0
}
[node name="Camera3D" type="Camera3D" parent="Generator" unique_id=1193344185]
transform = Transform3D(-0.8008847, 0.5054234, -0.32113996, 0, 0.5362893, 0.84403425, 0.5988186, 0.67597413, -0.42950585, 0, 10.870714, 0)