Problem with my script "invalid access to property or key "keys" on a base object of type "Control"

Godot Version

4.3

Question

` Hello, I’m trying for my first game to do a text life simulator like Bitlife, I could make some stuff but now I’m stuck because I have an error and I don’t know how to solve it. So I came here for help:

Here is the code of the main scene:

` extends Control

@onready var v_box_container: VBoxContainer = %VBoxContainer
@onready var age_button: Button = %AgeButton
@onready var scroll_container: ScrollContainer = %ScrollContainer
@onready var v_scrollbar_container = scroll_container.get_v_scroll_bar()
@onready var menu_button: Button = %MenuButton

@onready var bonheur_bar: ProgressBar = %BonheurBar
@onready var apparence_bar: ProgressBar = %ApparenceBar
@onready var physique_bar: ProgressBar = %PhysiqueBar
@onready var age_label: Label = %AgeLabel
@onready var puissance_label: Label = %PuissanceLabel

@onready var age : int = 1
@onready var puissance : int = 0

var side_menu : Array[Dictionary] = [
{
“name” : “S’entraîner”,
“text” : “Vous vous êtes entraîné d’arrache pied”,
“stat” : puissance,
“effet” : randi_range(100, 300),
},
]

func _ready() → void:
set_game()

func create_message(message : String) → void:
var main_message = RichTextLabel.new()
main_message.fit_content = true
main_message.scroll_active = false
main_message.bbcode_enabled = true
main_message.mouse_filter = Control.MOUSE_FILTER_IGNORE
main_message.text = message
v_box_container.add_child(main_message)

func advance_age() → void:
age += 1
create_message(“[center]Vous avez " + str(age) + " ans[/center]”)

var temp_puissance = randi_range(10, 1000)
create_message("Vous avez gagné " + str(temp_puissance) + " de Puissance en plus en commençant cette année")
puissance += temp_puissance

var fatigue_age := randi_range(-10, 10)
physique_bar.value += fatigue_age

update_jeu()

func handle_scrollbar_changed() → void:
scroll_container.scroll_vertical = v_scrollbar_container.max_value

func create_menu() → void:
var new_menu := load(“res://Scenes/menu.tscn”)
var new_menu_instance = new_menu.instantiate()
add_child(new_menu_instance)
new_menu_instance.menu_create(side_menu, “name”, “text”, “stat”, “effet”)

func set_game() → void:
create_message(“[center]Vous avez " + str(age) + " ans[/center]”)

age_button.pressed.connect(advance_age)
v_scrollbar_container.changed.connect(handle_scrollbar_changed)
menu_button.pressed.connect(create_menu)

bonheur_bar.value = 100
apparence_bar.value = randi_range(0, 100)
physique_bar.value = randi_range(10, 100)

age_label.text = "Age : " + str(age) + " an(s)"

puissance = randi_range(10, 1000)
puissance_label.text = "Puissance : " + str(puissance)

func update_jeu() → void:
puissance_label.text = "Puissance : " + str(puissance)
age_label.text = “Age : " + str(age) + " an(s)”`

And here the menu scene:

'extends Control

@onready var v_box_menu_container: VBoxContainer = $MenuScrollContainer/VBoxMenuContainer
@onready var menu_button: Button = $MenuScrollContainer/VBoxMenuContainer/MenuButton
@onready var menu_scroll_container: ScrollContainer = $MenuScrollContainer

var item_index := 0

Called when the node enters the scene tree for the first time.

func _ready() → void:
pass

func menu_create(my_keys : Array[Dictionary], my_name : String, my_text : String, my_stat : String, stat_value : String) → void:
for keys in my_keys:
var create_button = Button.new()
v_box_menu_container.add_child(create_button)
create_button.text = keys[my_name]
create_button.pressed.connect(func() → void:
get_parent().create_message(keys[my_text])
get_parent().keys[my_stat] += keys[stat_value]
get_parent().update_jeu()
queue_free()
)`

The error come from the anonymous function from the second script :
get_parent().keys[my_stat] += keys[stat_value]

First, use the preformatted text tool in your code (the </> button) to format your code corectly, its hard to read as is.

Are you sure the node being returned by get_parent() has a variable called keys? Are you not forggeting the variable name that holds a dict? Also in the last case you also would need to use keys() to get the keys array.

2 Likes