+ Antworten
Ergebnis 1 bis 3 von 3
  1. #1
    Holzfäller
    Registriert seit
    05.02.2011
    Beiträge
    140

    Standard Skript mit Fehlermeldung

    Um das Table KnighTtitleRequirements vom globaklen ins lokale Skript zu kopieren habe ich folgendes geschrieben (mit Logausgaben um alles nachzuvollziehen)

    Code:
    function NEP_KnightTitles()
    
        KnightTitles = {}
        KnightTitles.Knight     = 0
        KnightTitles.Mayor      = 1
        KnightTitles.Baron      = 2
        KnightTitles.Earl       = 3
        KnightTitles.Marquees   = 4
        KnightTitles.Duke       = 5
        KnightTitles.Archduke   = 6
    
        NeedsAndRightsByKnightTitleTest = {}
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Knight] = {
            ActivateNeedForPlayer, {Needs.Nutrition,Needs.Medicine},
            ActivateRightForPlayer, {
                Technologies.R_Gathering,
                Technologies.R_Woodcutter,
                Technologies.R_StoneQuarry,
                Technologies.R_HuntersHut,
                Technologies.R_FishingHut,
                Technologies.R_CattleFarm,
                Technologies.R_GrainFarm,
                Technologies.R_SheepFarm,
                Technologies.R_IronMine,
                Technologies.R_Beekeeper,
                Technologies.R_HerbGatherer,
                Technologies.R_Nutrition,
                Technologies.R_Bakery,
                Technologies.R_Dairy,
                Technologies.R_Butcher,
                Technologies.R_SmokeHouse,
                Technologies.R_Clothes,
                Technologies.R_Weaver,
                Technologies.R_Tanner,
                Technologies.R_Construction,
                Technologies.R_Wall,
                Technologies.R_Pallisade,
                Technologies.R_Trail,
                Technologies.R_KnockDown,
                Technologies.R_Sermon,
                Technologies.R_SpecialEdition,
                Technologies.R_SpecialEdition_Pavilion
                }
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Mayor] = {
            ActivateNeedForPlayer, {Needs.Clothes},
            ActivateRightForPlayer, {
                Technologies.R_Hygiene,
                Technologies.R_Soapmaker,
                Technologies.R_BroomMaker,
                Technologies.R_Military,
                Technologies.R_SwordSmith,
                Technologies.R_Barracks,
                Technologies.R_Thieves,
                Technologies.R_SpecialEdition_StatueFamily
                },
            StartKnightsPromotionCelebration
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Baron] = {
            ActivateNeedForPlayer, {Needs.Hygiene},
            ActivateRightForPlayer, {
                Technologies.R_Medicine,
                Technologies.R_BowMaker,
                Technologies.R_BarracksArchers,
                Technologies.R_Entertainment,
                Technologies.R_Tavern,
                Technologies.R_Festival,
                Technologies.R_Street,
                Technologies.R_SpecialEdition_Column
                },
            StartKnightsPromotionCelebration
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Earl] = {
            ActivateNeedForPlayer, {Needs.Entertainment,Needs.Prosperity},
            ActivateRightForPlayer, {
                Technologies.R_Baths,
                Technologies.R_SiegeEngineWorkshop,
                Technologies.R_BatteringRam,
                Technologies.R_Ballista,
                Technologies.R_AmmunitionCart,
                Technologies.R_Prosperity,
                Technologies.R_Taxes,
                Technologies.R_SpecialEdition_StatueSettler
                },
            StartKnightsPromotionCelebration
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Marquees] = {
            ActivateNeedForPlayer, {Needs.Wealth},
            ActivateRightForPlayer, {
                Technologies.R_Theater,
                Technologies.R_Wealth,
                Technologies.R_BannerMaker,
                Technologies.R_SiegeTower,
                Technologies.R_SpecialEdition_StatueProduction,
                },
            StartKnightsPromotionCelebration
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Duke] = {
            ActivateNeedForPlayer, nil,
            ActivateRightForPlayer, {
                Technologies.R_Catapult,
                Technologies.R_Carpenter,
                Technologies.R_CandleMaker,
                Technologies.R_Blacksmith,
                Technologies.R_SpecialEdition_StatueDario
                },
            StartKnightsPromotionCelebration
        }
    
        NeedsAndRightsByKnightTitleTest[KnightTitles.Archduke] = {
            ActivateNeedForPlayer, nil,
            ActivateRightForPlayer, {
                Technologies.R_Victory
                },
            VictroryBecauseOfTitle,
            StartKnightsPromotionCelebration
        }
    
        if g_PatchIdentifierExtra1 then
            local TechnologiesTableIndex = 4
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Mayor][TechnologiesTableIndex],Technologies.R_Cistern)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Marquees][TechnologiesTableIndex],Technologies.R_Beautification_Brazier)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Marquees][TechnologiesTableIndex],Technologies.R_Beautification_Pillar)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Marquees][TechnologiesTableIndex],Technologies.R_Beautification_Shrine)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Duke][TechnologiesTableIndex],Technologies.R_Beautification_StoneBench)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Duke][TechnologiesTableIndex],Technologies.R_Beautification_Sundial)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Duke][TechnologiesTableIndex],Technologies.R_Beautification_Vase)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Archduke][TechnologiesTableIndex],Technologies.R_Beautification_TriumphalArch)
            table.insert(NeedsAndRightsByKnightTitleTest[KnightTitles.Archduke][TechnologiesTableIndex],Technologies.R_Beautification_VictoryColumn)
        end
    
        KnightTitleRequirements = {}
        KnightTitleRequirements[KnightTitles.Mayor] = {}
        KnightTitleRequirements[KnightTitles.Mayor].Settlers = 10
        KnightTitleRequirements[KnightTitles.Mayor].Headquarters = 1
        KnightTitleRequirements[KnightTitles.Mayor].Goods = {{"AmountOfProductsOfEntitiesInCategory", EntityCategories.GC_Clothes_Supplier, 6}}  
    
        KnightTitleRequirements[KnightTitles.Baron] = {}
        KnightTitleRequirements[KnightTitles.Baron].Settlers = 30
        KnightTitleRequirements[KnightTitles.Baron].Storehouse = 1
        KnightTitleRequirements[KnightTitles.Baron].Headquarters = 1
        KnightTitleRequirements[KnightTitles.Baron].Cathedrals = 1
        KnightTitleRequirements[KnightTitles.Baron].Goods = {{"AmountOfProductsOfEntitiesInCategory", EntityCategories.GC_Hygiene_Supplier, 12}}
    
        KnightTitleRequirements[KnightTitles.Earl] = {}
        KnightTitleRequirements[KnightTitles.Earl].Settlers = 50
        KnightTitleRequirements[KnightTitles.Earl].Headquarters = 2
        KnightTitleRequirements[KnightTitles.Earl].Goods = {{"AmountOfProductsOfEntitiesInCategory", EntityCategories.GC_Entertainment_Supplier, 12}}
    
        KnightTitleRequirements[KnightTitles.Marquees] = {}
        KnightTitleRequirements[KnightTitles.Marquees].Settlers = 70
        KnightTitleRequirements[KnightTitles.Marquees].Storehouse = 2
        KnightTitleRequirements[KnightTitles.Marquees].Cathedrals = 2
        KnightTitleRequirements[KnightTitles.Marquees].Headquarters = 2
        KnightTitleRequirements[KnightTitles.Marquees].RichBuildings = 20
        
        KnightTitleRequirements[KnightTitles.Duke] = {}
        KnightTitleRequirements[KnightTitles.Duke].Settlers = 90
        KnightTitleRequirements[KnightTitles.Duke].Storehouse = 2
        KnightTitleRequirements[KnightTitles.Duke].Cathedrals = 2
        KnightTitleRequirements[KnightTitles.Duke].Headquarters = 3
        KnightTitleRequirements[KnightTitles.Duke].DecoratedBuildings = {Goods.G_Banner, 9}
        
        KnightTitleRequirements[KnightTitles.Archduke] = {}
        KnightTitleRequirements[KnightTitles.Archduke].Settlers = 150
        KnightTitleRequirements[KnightTitles.Archduke].Storehouse = 3
        KnightTitleRequirements[KnightTitles.Archduke].Cathedrals = 3
        KnightTitleRequirements[KnightTitles.Archduke].Headquarters = 3
        KnightTitleRequirements[KnightTitles.Archduke].RichBuildings = 30
        KnightTitleRequirements[KnightTitles.Archduke].DecoratedBuildings = {-1, 30}
        
        if not GUI then
            TechnologiesToProhibit = {}
            for i = 1, #TechnologiesToProhibit do
                Logic.TechnologySetState(1, TechnologiesToProhibit[i], TechnologyStates.Prohibited)
            end
        end
        
        function KnightTitleRequirementsKopie(...)
            
            if #arg == 0 then
                for index in pairs(KnightTitleRequirements) do
                    Framework.WriteToLog(index)
                    if type(KnightTitleRequirements[index]) == "table" then
                        Framework.WriteToLog('KnightTitleRequirements['..index..'] = {}')
                        Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..index..'] = {}')
                        KnightTitleRequirementsKopie(index)
                    else
                        if type(KnightTitleRequirements[index]) == "string" then
                            Framework.WriteToLog('KnightTitleRequirements['..index..'] = "'..KnightTitleRequirements[index]..'"')
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..index..'] = "'..KnightTitleRequirements[index]..'"')
                        else
                            Framework.WriteToLog('KnightTitleRequirements['..index..'] = '..KnightTitleRequirements[index])
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..index..'] = '..KnightTitleRequirements[index])
                        end
                    end
                end
                
            elseif #arg == 1 then
                for index in pairs(KnightTitleRequirements[arg[1]]) do
                    Framework.WriteToLog(arg[1].." - "..index)
                    if type(KnightTitleRequirements[arg[1]][index]) == "table" then
                        Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..index..'] = {}')
                        Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..index..'] = {}')
                        KnightTitleRequirementsKopie(arg[1], index)
                    else
                        if type(KnightTitleRequirements[arg[1]][index]) == "string" then
                            Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][index]..'"')
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][index]..'"')
                        else
                            Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..index..'] = '..KnightTitleRequirements[arg[1]][index])
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..index..'] = '..KnightTitleRequirements[arg[1]][index])
                        end
                    end
                end
            
            elseif #arg == 2 then
                for index in pairs(KnightTitleRequirements[arg[1]][arg[2]]) do
                    Framework.WriteToLog(arg[1].." - "..arg[2].." - "..index)
                    if type(KnightTitleRequirements[arg[1]][arg[2]][index]) == "table" then
                        Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = {}')
                        Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = {}')
                        KnightTitleRequirementsKopie(arg[1], arg[2], index)
                    else
                        if type(KnightTitleRequirements[arg[1]][arg[2]][index]) == "string" then
                            Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][arg[2]][index]..'"')
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][arg[2]][index]..'"')
                        else
                            Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = '..KnightTitleRequirements[arg[1]][arg[2]][index])
                            Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..index..'] = '..KnightTitleRequirements[arg[1]][arg[2]][index])
                        end
                    end
                end
                
            elseif #arg == 3 then
                for index in pairs(KnightTitleRequirements[arg[1]][arg[2]][arg[3]]) do
                    Framework.WriteToLog(arg[1].." - "..arg[2].." - "..arg[3].." - "..index)
                    if type(KnightTitleRequirements[arg[1]][arg[2]][arg[3]][index]) == "string" then
                        Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..arg[3]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][arg[2]][arg[3]][index]..'"')
                        Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..arg[3]..']['..index..'] = "'..KnightTitleRequirements[arg[1]][arg[2]][arg[3]][index]..'"')
                    else
                        Framework.WriteToLog('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..arg[3]..']['..index..'] = '..KnightTitleRequirements[arg[1]][arg[2]][arg[3]][index])
                        Logic.ExecuteInLuaLocalState('KnightTitleRequirements['..arg[1]..']['..arg[2]..']['..arg[3]..']['..index..'] = '..KnightTitleRequirements[arg[1]][arg[2]][arg[3]][index])
                    end
                end
            end
        end
        
        Logic.ExecuteInLuaLocalState('KnightTitleRequirements = {}')
        KnightTitleRequirementsKopie()
    Das führt zu folgender Ausgabe:

    Code:
    1
    KnightTitleRequirements[1] = {}
    1 - Settlers
    KnightTitleRequirements[1][Settlers] = 10
    1 - Headquarters
    KnightTitleRequirements[1][Headquarters] = 1
    1 - Goods
    KnightTitleRequirements[1][Goods] = {}
    1 - Goods - 1
    KnightTitleRequirements[1][Goods][1] = {}
    1 - Goods - 1 - 1
    KnightTitleRequirements[1][Goods][1][1] = "AmountOfProductsOfEntitiesInCategory"
    1 - Goods - 1 - 2
    KnightTitleRequirements[1][Goods][1][2] = 32
    1 - Goods - 1 - 3
    KnightTitleRequirements[1][Goods][1][3] = 6
    2
    KnightTitleRequirements[2] = {}
    2 - Storehouse
    KnightTitleRequirements[2][Storehouse] = 1
    2 - Headquarters
    KnightTitleRequirements[2][Headquarters] = 1
    2 - Settlers
    KnightTitleRequirements[2][Settlers] = 30
    2 - Cathedrals
    KnightTitleRequirements[2][Cathedrals] = 1
    2 - Goods
    KnightTitleRequirements[2][Goods] = {}
    2 - Goods - 1
    KnightTitleRequirements[2][Goods][1] = {}
    2 - Goods - 1 - 1
    KnightTitleRequirements[2][Goods][1][1] = "AmountOfProductsOfEntitiesInCategory"
    2 - Goods - 1 - 2
    KnightTitleRequirements[2][Goods][1][2] = 28
    2 - Goods - 1 - 3
    KnightTitleRequirements[2][Goods][1][3] = 12
    3
    KnightTitleRequirements[3] = {}
    3 - Settlers
    KnightTitleRequirements[3][Settlers] = 50
    3 - Headquarters
    KnightTitleRequirements[3][Headquarters] = 2
    3 - Goods
    KnightTitleRequirements[3][Goods] = {}
    3 - Goods - 1
    KnightTitleRequirements[3][Goods][1] = {}
    3 - Goods - 1 - 1
    KnightTitleRequirements[3][Goods][1][1] = "AmountOfProductsOfEntitiesInCategory"
    3 - Goods - 1 - 2
    KnightTitleRequirements[3][Goods][1][2] = 33
    3 - Goods - 1 - 3
    KnightTitleRequirements[3][Goods][1][3] = 12
    4
    KnightTitleRequirements[4] = {}
    4 - Storehouse
    KnightTitleRequirements[4][Storehouse] = 2
    4 - Headquarters
    KnightTitleRequirements[4][Headquarters] = 2
    4 - Settlers
    KnightTitleRequirements[4][Settlers] = 70
    4 - Cathedrals
    KnightTitleRequirements[4][Cathedrals] = 2
    4 - RichBuildings
    KnightTitleRequirements[4][RichBuildings] = 20
    5
    KnightTitleRequirements[5] = {}
    5 - Storehouse
    KnightTitleRequirements[5][Storehouse] = 2
    5 - Headquarters
    KnightTitleRequirements[5][Headquarters] = 3
    5 - Settlers
    KnightTitleRequirements[5][Settlers] = 90
    5 - Cathedrals
    KnightTitleRequirements[5][Cathedrals] = 2
    5 - DecoratedBuildings
    KnightTitleRequirements[5][DecoratedBuildings] = {}
    5 - DecoratedBuildings - 1
    KnightTitleRequirements[5][DecoratedBuildings][1] = 37
    5 - DecoratedBuildings - 2
    KnightTitleRequirements[5][DecoratedBuildings][2] = 9
    6
    KnightTitleRequirements[6] = {}
    6 - Storehouse
    KnightTitleRequirements[6][Storehouse] = 3
    6 - Headquarters
    KnightTitleRequirements[6][Headquarters] = 3
    6 - Settlers
    KnightTitleRequirements[6][Settlers] = 150
    6 - Cathedrals
    KnightTitleRequirements[6][Cathedrals] = 3
    6 - DecoratedBuildings
    KnightTitleRequirements[6][DecoratedBuildings] = {}
    6 - DecoratedBuildings - 1
    KnightTitleRequirements[6][DecoratedBuildings][1] = -1
    6 - DecoratedBuildings - 2
    KnightTitleRequirements[6][DecoratedBuildings][2] = 30
    6 - RichBuildings
    KnightTitleRequirements[6][RichBuildings] = 30
    Das Table wird also vollständig kopiert. Direkt darauf folgt dann aber diese Fehlermeldung:

    Code:
    ERROR: ASSERTION FAILED!
    
        Expression: Lua Error
        Error: LUA_ERRRUN: [string "?"]:1: table index is nil
        Stacklevel: 0 Type: C Function: "(null)"
        Stacklevel: 1 Type: main
    
        Current stack:
    
        Additional info: Game turn 120 (0:12)
    Ich habe keine Ahnung, wie es dazu kommt.

    Vielleicht hat ja jemand die Muße, sich das anzugucken und vielleicht selber auszuprobieren und findet heraus, was da verkehrt läuft.

  2. #2
    Imker Avatar von Fidelio1958
    Registriert seit
    18.06.2008
    Ort
    Wien 1100 (Österreich)
    Beiträge
    752

    Standard AW: Skript mit Fehlermeldung

    Ich verwende das NEP immer als Ganzes, weil ich auch öfter die anderen Funktionen nutze.
    Das Ganze ist ja recht koplex, und hier sind Änderungen nicht so ganz einfach.
    Was mir gefallen hat, ist, dass ich auch ein paar mal für eigene Funktionen ganz einfach ToolTipTextKeys und andere Kleinigkeiten für meinen Bedarf ändern konnte.
    Viel mehr herumändern hat bei mir auch meisstens Fehler verursacht.

    Das KnightTitle Script ist heikel!! Hier wird das vor der function Mission_LocalOnMapStart() und vor FMA gestartete Script überschrieben und noch einmal neu gestartet!!
    Erklärung im ScriptWiki:UserKnightTitles [AeK Script-Wiki]

    Beide KnightTitleTables müssen ident sein!
    Aber da gibts auch noch die Aufrufe:
    local die function : Start UserKnightTitles
    und global: function InitKnightTitleTables(), NEP_KnightTitles(), CreateTechnologyKnightTitleTable()
    Ich kopiere die function NEP_KnightTitles einfach in beide Scripte des kompletten NEP, wenn ich was ändere. so funktionierts am einfachsten.
    Ich nehme an, dass deine Kopierfunktion das ganze zu spät oder zu früh ins lokale kopiert und Aufrufe od functionen fehlen, und es deswegen den Fehler macht???
    Die Fehlermeldung sagt ja, dass ein table fehlt (nil = 0 od ungewiss) und eine function(möglicherweise: InitKnightTitleTables?)
    Viel mehr kann ich dazu leider auch nicht beitragen, vielleicht hilfts ja etwas.

    Grüsse Wolfi

  3. #3
    Holzfäller
    Registriert seit
    05.02.2011
    Beiträge
    140

    Standard AW: Skript mit Fehlermeldung

    Mir ist schon bewusst, wie das NEP aufgebaut ist. Aber diese Unterteilung in globale und lokale Umgebung ist so ziemlich der größte programmiertechnische Unfug, den ich jemals erlebt habe. Ich versuche derzeit noch ein paar Neuerungen ins Spiel einzubauen und muss die Skriptpassagen auch auf lokales und globales verteilen. Das nervt und verringert die Übersichtlichkeit.

    Darum will ich das komplette NEP in das gloable Skript packen, dabei die lokalen Passagen per Logic.ExecuteInLuaLocalState erzeugen. KnightTitleRequirements und NeedsAndRightsByKnightTitle will ich nur ein mal definieren und dann automatisch die 1:1-Kopie (mit obigem Code) in der lokalen Umgebung erzeugen.

    Obige Datei hatte ich zwar tatsächlich ohne den Rest des NEPs in meine Testkarte eingebaut, aber daran lag es nicht. Es haben ein paar Anführungszeichen gefehlt. Anstatt z.B.

    Code:
    KnightTitleRequirements[1][Settlers] = 10
    muss

    Code:
    KnightTitleRequirements[1]["Settlers"] = 10
    als Befehl gesendet werden. Dann läuft's.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. LUA Skript / Makros
    Von Hansdampf im Forum Technik Ecke
    Antworten: 3
    Letzter Beitrag: 07.11.2011, 13:54
  2. Skript-Wizard
    Von Old McDonald im Forum Siedler 6 AeK Mapperecke
    Antworten: 27
    Letzter Beitrag: 01.11.2011, 17:49
  3. Skript von Sokrates
    Von mattizwo im Forum S6 Scriptecke
    Antworten: 2
    Letzter Beitrag: 17.12.2008, 09:11
  4. Skript > GraphViz
    Von saladin im Forum S6 Scriptecke
    Antworten: 8
    Letzter Beitrag: 18.03.2008, 17:21
  5. Pause im Skript
    Von saladin im Forum S6 Scriptecke
    Antworten: 4
    Letzter Beitrag: 10.03.2008, 19:57

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein