[Verb Coin] Verb je nach Objekt ändern (Verb Override)

  • #1, by vanyanieWednesday, 05. December 2018, 16:37 5 years ago
    Ich würde gerne abhängig vom angewählten Objekt das Verb im ActionText ändern. Beispiel: wähle ich das Mund-Symbol über einem Apfel, möchte ich statt "Rede mit Apfel" im ActionText "Iss Apfel" stehen haben.
    Ich finde kein richtiges Beispiel, das alles gut erklärt, nur Hinweise wie z.B. hier -> https://www.visionaire-studio.net/forum/thread/aktionstext-p...

    Zudem wäre interessant, ob es möglich ist, die zu überschreibenden Verben direkt an das entsprechende Objekt zu heften (Variable/Constante), sodass das Script, welches den ActionText zusammenbaut, alles automatisch auslesen kann. So bräuchte man in der Szene nur die entsprechenden Variablen beim Objekt anlegen, und der Rest erledigt das Script.

    Ist das möglich?

    Newbie

    10 Posts


  • #2, by sebastianWednesday, 05. December 2018, 16:54 5 years ago
    ja das geht. Du benötigst hier aber Luascript. 
    Mein verlinkter Post in dem ich das Thema anspreche macht genau das was du meinst. Mein Script nutzt im Objekt/Item/Charakter eine VS Value die checkt welche Aktion umgeschrieben werden soll (und zu was). Falls die Value nicht existiert, wirds ignoriert. 
    Ich hatte eigentlich schon länger vor dazu ein Tutorial zu erstellen, bis jetzt leider keine Zeit gehabt.

    Im Grunde basiert die Idee auf dem
    getActionText Hook. Hier kannst du quasi sobald sich der Aktionstext ändert (was ja beim Überfahren von Objekten der Fall ist) diesen komplett neu schreiben. Anhand deines aktuellen Items, Objekt unter dem Cursor und Aktion die ausgewählt ist... 

    Thread Captain

    2346 Posts

  • #3, by vanyanieWednesday, 05. December 2018, 17:34 5 years ago
    Ja, aber wie genau checkt dein Script einen VS Value usw? Das wäre halt interessant wink
    Das meinte ich ja mit, dass es meist nur grob umschrieben wird grin

    Newbie

    10 Posts

  • #4, by sebastianWednesday, 05. December 2018, 19:56 5 years ago
    Ja, aber wie genau checkt dein Script einen VS Value usw? Das wäre halt interessant wink
    Das meinte ich ja mit, dass es meist nur grob umschrieben wird grin

    kennst du dich schon mit Lua mit Visionaire Studio aus, oder ist das komplettes Neuland für dich?

    Thread Captain

    2346 Posts

  • #5, by vanyanieWednesday, 05. December 2018, 20:05 5 years ago
    Ich programmiere viel in Lua, habe es auch schon geschafft, einen Value aus einem Objekt auszulesen. Was mir jetzt noch fehlt, ist per Lua rauszubekommen, welches Command (Look, Talk, Use) gerade gewählt ist, damit ich den entsprechenden Value auslesen kann.

    Test-Script:

    function overrideActionText(mousePos)
      -- individual action text: object name (in current language) of object below cursor, if there is no object then '' is shown as action text
      local obj = game:getLink(VGameCurrentObject)
      if obj:getId().tableId == eObjects then
        local vo = obj.ObjectValues["VerbLook"]
        if vo then
          local str =obj.ObjectValues["VerbLook"]:getStr(VValueString)
          if str then
            return str .. " " .. obj:getTextStr(VObjectName)
          end
        end
        return obj:getTextStr(VObjectName)
      end
      --return ''
    end
    
    registerHookFunction("getActionText", "overrideActionText")
    

    Newbie

    10 Posts

  • #6, by afrlmeWednesday, 05. December 2018, 20:56 5 years ago
    if game.ActiveCommand:getName() == "Look" then
    
     -- do something
    
    elseif ...
    
     ...
    
    end

    game.ActiveCommand returns the button of the current active command, so if you add :getName() to it then it returns the name of the button instead.

    Imperator

    7278 Posts

  • #7, by vanyanieWednesday, 05. December 2018, 21:45 5 years ago
    Ok, danke. Ich steige leider immer noch nicht durch die Lua-Dokumentation durch. Wo finde ich denn heraus, was ActiveCommand ist (table, userdata ...) und welche Methoden oder Felder es enthält? In der API Referenz steht nur, dass es ein t_link zu einem Objekt ist.

    Ich würde gerne statt des Namen auch den Text aus dem Command property auslesen. Der Name des Commands ist nämlich "Look", der Action Text aus dem Command property, den ich zum Zusammenbauen brauche, ist aber "Look at"

    Newbie

    10 Posts

  • #8, by afrlmeWednesday, 05. December 2018, 23:18 5 years ago
    object name. column on the left.

    Imperator

    7278 Posts

  • #9, by sebastianWednesday, 05. December 2018, 23:19 5 years ago
    Ok, danke. Ich steige leider immer noch nicht durch die Lua-Dokumentation durch. Wo finde ich denn heraus, was ActiveCommand ist (table, userdata ...) und welche Methoden oder Felder es enthält? In der API Referenz steht nur, dass es ein t_link zu einem Objekt ist.

    Ich würde gerne statt des Namen auch den Text aus dem Command property auslesen. Der Name des Commands ist nämlich "Look", der Action Text aus dem Command property, den ich zum Zusammenbauen brauche, ist aber "Look at"
    schau einmal hier: https://www.visionaire-studio.com/luadocs/#game-1
    hier siehst du z.B. in der "game" Tabelle, dass es das "ActiveCommand" feld gibt. dies ist ein Link auf das aktivierte Button (ebenfalls eine Tabelle in der Datenstruktur), also der aktiven Aktion.
    Leider ist die API-Doku noch nicht immer ganz klar dokumentiert, wohin die Felder zeigen, sollte aber mit Grundverständnis von der Datenstruktur einigermaßen klar werden, wenn man hier in diesem Fall weiß, dass der "active Command" nur ein Button sein kann.
    Ein anderes Beispiel wäre ein t_link von game.CurrentCharacter auf einen Character in der Characterstabelle.

    Es gibt ein paar Funktionen, die du auf die abgefragten VS-Objekte anwenden kannst:


    zum Beispiel solltest du mit
    game.ActiveCommand:getTextStr(fieldname) den in der entsprechenden momentanen Sprache genutzten Befehl bekommen. (:getName() bezieht sich hier auf die VS-interne Bezeichnung in deiner Editor Liste)

    Thread Captain

    2346 Posts

  • #10, by vanyanieWednesday, 05. December 2018, 23:50 5 years ago
    ok, durch Zufall habe nun herausgefunden, dass es wohl mit game.ActiveCommand:getTextStr(VButtonName) funktioniert. Ich glaube, ich brauche erstmal einen Lehrgang für diese Doku. Manches scheint in der API Referenz zu stehen und anderes wiederum nur in der Wiki. Sehr verwirrend.

    Das finale Script sieht so aus, sehr flexibel. Die Objekte in der Szene brauchen nur einen entsprechenden Value mit Namen "Verb" + Name des Commands/Buttons im Interface, also zB VerbLook VerbUse usw.

    function overrideActionText(mousePos)
      local obj = game:getLink(VGameSavedObject)
      local cmd = game.ActiveCommand:getName()
      local verb = game.ActiveCommand:getTextStr(VButtonName)
      if obj:getId().tableId == eObjects then
        if cmd == "Walk" then
          verb = ""
        else
          local overrideVerb = obj.ObjectValues["Verb" .. cmd]
          if overrideVerb then
             verb = overrideVerb:getStr(VValueString)
          end
        end
        return verb .. " " .. obj:getTextStr(VObjectName)
      end
      return game:getLink(VGameCurrentObject):getTextStr(VObjectName)
    end
    
    registerHookFunction("getActionText", "overrideActionText")
    

    Newbie

    10 Posts