'Godot 3.4: Quest System using Dictionaries

I took this to the Godot Reddit first, but honestly it's not much help imo. A lot of questions go unanswered there. So here I am.

As the title says, Im making a quest system in godot 2d using nested dictionaries. Ive seen people use Nodes, Classes or otherwise for their quest systems, and a few dictionary based ones out there. I chose dictionaries as I know them the best(still isnt a whole lot, or i probably wouldnt be here asking this lol) And my quest system is set up like so: QuestBase --> QuestHandler --> PlayerData

QuestBase is a giant dictionary of all available quests in the game. PlayerData is a giant dictionary of all the player stats(including active, completed, or failed quests) and QuestHandler takes a questName in a function to Copy the quest(questName) from QuestBase dict into the PlayerData.quests_active dict.(quests_active is a dictionary of quests(also dictionaries) inside of the PlayerData dictionary lol) But i cant seem to get it to work. I've done it a couple different ways now, including the way the Godot documentation states on how to add Dinctionaries into dictionaries. Please help, this is the error I get from QuestHandler:

Invalid set index 'tutorialQuest' (on base: 'Nil') with value of type 'Dictionary'

QuestBase:

var storyQuests = {
    "tutorialQuest":{
        "name" : "Your First Steps",#Name of the Quest
        "desc" : "Get to know your environment and learn the ropes.",#Description of the Quest
        "level" : 1, #Required level before player can accept quest
        "questType" : 0, #0=Story Quest || 1=Side Quest || 2=Repeateable Quest
        "taskType": 0, #0=Progressive(task must be completed in order) || 1=Synchronous(tasks can be completed in any order, and all at once)
        "tasks":{#Dictionary of Quest's Tasks
            "task1":{
                "text":"Talk to Bjorn",#Text to display in Quest log
                "type":0,#0=Talk,1=Slay,2=Fetch,3=Deliver,4=Collect,5=Goto
                "quantity":0,#Determines the amount to complete task for Slay, Fetch, and Collect
                "target":"Bjorn",#Determines Who to talk to, or who to slay, or what to collect.
                "completed":false#Is this task complete?
                },
            "task2":{
                "text":"Talk to Bjorn",
                "type":"Talk",
                "target":"Bjorn",
                "completed":false
                },
            "task3":{
                "text":"Talk to Bjorn",
                "type":"Talk",
                "target":"Bjorn",
                "completed":false
                }
            },
        "itemReward":{
                "items":["Sword", "Basic Elixer"],#Names of items to give
                "amount":[1, 5]#Amount of each item to give, respectively.
            },
        "expReward":{
                "skill":["Forestry","Smithing"],#Names of skills to add Exp to
                "amount": [100,100] #Amount to add to each skill, respectively. 
                #1st number will increase first skill in "skill", etc...
            },
        "Complete":false,
        "Failed":false
        }

}

PlayerData:

var playerData = {
    ... irrelevant player data...

    #Quests
    "quests_active": {"blank":"blank"},
    "quests_completed": {},
    "quests_failed": {},

and Finally, Quest Handler:

func startQuest(questName: String):
var active_quests = PlayerData.playerData.get("quests_active")
if QuestBase.storyQuests.has(questName):
    var questCopy = QuestBase.storyQuests.get(questName).duplicate(true)
    PlayerData.playerData.get("quests_active")[questName] = questCopy  #.quests_active.append(questCopy)
    #print("Story Quest Started: " + PlayerData.playerData.QuestsActive.get(questName).get("name"))
elif QuestBase.sideQuests.has(questName):
    var questCopy = QuestBase.sideQuests.get(questName).duplicate(true)
    active_quests.append(questCopy)
    #print("Side Quest Started: " + PlayerData.playerData.QuestsActive.get(questName).get("name"))
else:
    print("Quest Doesn't Exist! Check Spelling!")


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source