Nirn.de

Gast

Thema: Perk: Investor - Mehrfaches Investieren in Händler ermöglichen (Papyrus-Problem)  (Gelesen 1300 mal)

  • Neuling
    • Neuling
Hallo,

ich arbeite seit einiger Zeit immer mal wieder an einem Mod, der das Investor-Perk betreffen soll. Mein Ziel ist, dass, sobald die Fähigkeit "Investor" freigeschaltet ist, in jeden Laden beliebig oft investiert werden kann (und sich der verfügabre Betrag des Händlers immer weiter erhöht). Zum Teil habe ich dieses Problem gelöst, hänge aber nun am Papyrus-Script fest, da ich mich mit dieser Programmiersprache nicht wirklich auskenne und nur Mutmaßungen bzw. Try&Error-Vorstöße machen kann. Es wäre schön, wenn ein Kundiger ein paar Zeilen als Vorschlag postet, damit man daraus etwas entwickeln kann. Schon einmal Danke für Eure Mühen.

In gebotener Kürze, was ich bisher in Erfahrung gebracht und geändert habe. Hinter verwendete Objekte setze ich immer eine Klammer, in der der Type des Objekts angegeben ist (zum leichteren Finden im CreationKit, kurz CK). 

Das Perk "Investor" ist im CK auf oberster Ebene mit dem Objekt "PerkInvestor" (Type: Perk) dargestellt. Dieses Perk ist jedoch letztlich nur eine leere Hülle, die auf das Objekt "PerkInvestorQuest" (Type: Quest) zeigt. In dieser "Quest" ist ein Großteil dieses Perks verankert.

Innerhalb des Quest-Objekts findet man sowohl die Dialogoptionen zum Investieren, als auch die damit verbundenen Scripte. Meiner Meinung nach sind diese beiden Skripte die Wichtigen:

Der erste Skript handelt den Goldaustausch zwischen Händler und Spieler ab. Die Variablen können beliebig abgeändert werden, sind aber in Vanilla auf 500 festgelegt.
Code
Scriptname PerkInvestorQuestScript extends Quest  Conditional
miscobject Property Gold  Auto
int Property GoldAmount = 500 Auto
function GoldTransfer (ObjectReference VendorRef)
game.getplayer().RemoveItem(Gold, InvestAmount.value as int)
VendorRef.additem(Gold, InvestAmount.value as int)
Actor VendorActor=VendorRef as Actor
VendorActor.ModFavorPoints(PerkInvestorFavorReward.value as Int)
EndFunction

globalvariable Property PerkInvestorFavorReward  Auto
GlobalVariable Property InvestAmount  Auto

Der zweite Skript ist für jeden Händler (in den man investieren kann) spezifisch, d.h. jeder von ihnen hat eine eigene Ausführung dieses Skripts. Ich poste hier das Beispiel von Farengar Heimlich-Feuer, der mein Testhändler ist:
Code
;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment
;NEXT FRAGMENT INDEX 1
Scriptname TIF__000B1FDC Extends TopicInfo Hidden

;BEGIN FRAGMENT Fragment_0
Function Fragment_0(ObjectReference akSpeakerRef)
Actor akSpeaker = akSpeakerRef as Actor
;BEGIN CODE
PerkInvestorFarengarGV.Value=0
(GetOwningQuest() as PerkInvestorQuestScript).GoldTransfer(AKSpeaker)
;END CODE
EndFunction
;END FRAGMENT

;END FRAGMENT CODE - Do not edit anything between this and the begin comment

globalvariable Property PerkInvestorFarengarGV  Auto 

Die Variable "PerkInvestorFarengarGV" wird hier auf 0 gesetzt, was wiederum die "Chance None" in der "PerkInvestorWhiterunMagicList" (Type: LeveledItem) auf 0 setzt (diese ist ursprünglich auf 100, so dass die Liste nicht sichtbar ist). Soll heißen: Der Inhalt von "PerkInvestorWhiterunMagicList" (Type: LeveledItem) wird nun sichtbar bzw. aktiv. Dieser Inhalt ist ein weiteres LeveledItem, nämlich "PerkInvestorStoreUpgrade". Und genau in diesem LeveledItem liegen die 500 Gold versteckt, die den Händler nach einer Investition permanent reicher machen. Farengar erhöht also, wenn in ihn investiert wird, sein Standardkapital, indem in seiner Kiste (beim Beispiel von Farengar wäre dies "MerchantWhiterunFarengarsChest" (Formtype: Container)) das Leveleditem "PerkInvestorWhiterunMagicList" liegt. Dieses enthält das Leveleditem "PerkInvestorStoreUpgrade" und eben dieses wird durch die oben auf 0 gesetzte Variable sichtbar / aktiviert. Streng genommen wird also nichts hinzugefügt, sondern nur etwas bereits Existentes aktiviert. Dies ist wohl auch deshalb gemacht worden, weil hinzugefügte Objekte in ein Leveleditem (AddForm-Befehl) das Speichern und Neuladen nicht "überleben". Zu dem Problem soll es aber eine Lösung via Papyrus eben, aber dazu später, wenn wir dieses Problem gelöst haben.

Das man nur ein einziges Mal investieren kann, wird durch eine "Condition" in den "PlayerDialogues" im Quest "PerkInvestorQuest" bestimmt. Geht man also nun auf PerkInvestorQuest -> Player Dialogue -> PerkInvestorBranch1Topic1 und dann auf die Antwort eines beliebigen Händlers, so sieht man dort die Bedingung "S GetGlobalValue Global: PerkInvestorWhiterunMagic == 100". Soll heißen: Nur wenn der zweite Skript (oben), die Variable noch nicht auf 0 gesetzt hat, steht das Investieren zur Verfügung. Löscht man diese Bedingung, so kann man von nun an beliebig oft in den gewählten Händler investieren. Dies hat auch zur Folge, dass sein Kapital immer in 500er Schritten steigt. Einziges Problem: Kauft man ihn leer, so füllt es sich nicht mehr auf die Höhe der mehrfachen Investition auf, sondern nur noch auf die Höhe von einer einzelnen.

Hierzu habe ich folgende Idee: Immer wenn der zweite Skript aktiviert wird, fügt man in das LeveledItem "PerkInvestorStoreUpgrade" 500 Gold hinzu (streng genommen levelt das zwar jeden Händler auf, aber das kann man hinter mit händlerspezifischen LeveledItems beheben). Diesen Ansatz habe ich in dilettantischer Manier einmal versucht. Das geänderte Skript sieht wie folgt aus:

Code
;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment
;NEXT FRAGMENT INDEX 1
Scriptname TIF__000B1FDC Extends TopicInfo Hidden

miscobject Property Gold Auto
leveleditem Property VendorList Auto

;BEGIN FRAGMENT Fragment_0
Function Fragment_0(ObjectReference akSpeakerRef)
Actor akSpeaker = akSpeakerRef as Actor
;BEGIN CODE
PerkInvestorFarengarGV.Value=0
(GetOwningQuest() as PerkInvestorQuestScript).GoldTransfer(AKSpeaker)

VendorList.AddForm(Gold, 1, 500)

;END CODE
EndFunction
;END FRAGMENT

;END FRAGMENT CODE - Do not edit anything between this and the begin comment

globalvariable Property PerkInvestorFarengarGV  Auto 

Meine beiden Properties habe ich wiefolgt definiert:
miscobject Property Gold Auto = "Gold001"
leveleditem Property VendorList Auto = "PerkInvestorStoreUpgrade"

Das Skript wird fehlerfrei kompiliert, im Spiel hat es aber leider keinen Effekt. Das Grundkapital steigt auch jetzt nach mehrfachen Investitionen nicht an. Weiß jemand wieso? Oder hat jemand einen besseren Ansatz, wie man das Problem lösen kann? Wäre echt gut, wenn mal ein Papyrus-Kundiger seinen Senf dazu gibt. Vielen Dank!
  03.05.2012, 09:50
  • Offline