Script Frage Value Selection

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Script Frage Value Selection

Post by Joda »

Hi
kann mir mal bitte jemand erklären wie das mit der
return id funktioniert ?
Das habe ich schon versucht in nem testscript

Code: Select all

while 1
  
  $Mainmenu.Menu = create custom menu array
  
  $janein.array = array alloc: size=0
  append 'Ja' to array $janein.array
  append 'Nein' to array $janein.array
  
  add custom menu item to array $Mainmenu.Menu: text='normal' returnvalue='ja.nein.drei'
  
  add value selection to menu: $Mainmenu.Menu, text='test', value array=$janein.array, default=0, return id='test'
  
  $ret.value = open custom menu: title='Langstrecken Waren Transporter Hauptmenue' description=null option array=$Mainmenu.Menu
  if $ret.value == -1
    return null
  end
  
  
  if $ret.value  == 'test'
    $tmpSelection = $ret.value[0]
    $tmpSelection2 = $ret.value[1]
    play sample 972
    $msg = sprintf: fmt='Ja', $tmpSelection, $tmpSelection2, null, null, null
    display subtitle text: text=$msg duration=11000 ms
  end
  
  if $ret.value  =='ja.nein.drei'
    play sample 972
  end
  
end
return null
Also der normale eintrag funktioniert und das sample wird abgespielt, nur eben das pfeil ding nicht!
Reflexer hat mal geschrieben das dabei ein array zurückkommt ?! Aber mit welchen werten? stimmt meine abfrage so?
Reflexer wrote:
Edith sagt: ergänzend wäre noch zu erwähnen, dass diese Art der Abfrage nur bei einfachen menü-elementen funktioniert. wenn du eine value-selection (das ding mit den pfeilen rechts und links) verwendest, dann muss die Abfrage auf den returnvalue komplett anders aussehen, da dann ein array zurückkommt. ich weiß ja nicht, was du verwendest.

kann mir das bitte mal einer erklären!
Danke :)
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

ich würde mal schätzen die return id ist das element des Arrays was den gewählten Wert enthält. sprich deine RetVal ist in diesem fall irrelevant, es wird das Array welches du in das Menü einfügst verändert. ( $janein.array )

des weiteren ist diese Abfrage hier witzlos:
if $ret.value == 'test'
| $tmpSelection = $ret.value[0]
| $tmpSelection2 = $ret.value[1]

mit der if-Abfrage fragst du ab, ob $ret.value ein String ist, gehst aber in den nächsten beiden Zeilen davon aus dass es ein Array ist, aber eine Variable kann keine 2 verschiedenen Datentypen sein, sprich selbst wenn diese bedingung irgendwie erfüllt würde würdes du daraufhin nur null raus bekommen.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

ich versuche es mal zu erklären.

die value-selection fütterst du ja mit einem array. die return id ist der name des rückgabewertes. es wird immer der index der selektion des arrays zurückgegeben.

hast du also ein array mit den werten:
0=ja
1=nein
2=vielleicht
3=kann sein
und deine return id ist "usereingabe" und der anwender wählt "kann sein", dann bekommst du als returnwert "3" zurück. dieser ist im rückgabearray.

das rückgabearray enthält alle werte. um nun zu ermitteln was zurückgegeben wurde (ich verwende mal deinen aufruf als beispiel) fragst du folgendermaßen ab:

Code: Select all

$ret.value.count = size of array $ret.value
$tmpCounter = 0
while $tmpCounter < $ret.value.count
   $tmpSingleRet = $ret.value[$tmpCounter]
   $tmpRetName = $tmpSingleRet[0]
   if $tmpRetName == 'usereingabe'
      $tmpIndex = $tmpSingleRet[1]
      * tue irgendwas!
   end
   inc $tmpCounter
end
Der Wert $tmpIndex enthält nun den zurückgegebenen Index korrespondierend zum Aufrufarray.

Um zu prüfen, ob es klappt kannste Dir das ja im Playerlog ausgeben lassen:

Code: Select all

$tmpText = $deinArray[$tmpIndex]
$tmpTextLog = 'Der Anwender hat folgendes gewaehlt: ' + $tmpText
write to player logbook $tmpTextLog
ich hoffe, dass Dir das weiterhilft
User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Post by Joda »

ok danke euch beiden!!!!!!!!!
nach langem probieren peil ich es endlich :) (teilweise)
eine frage hätte ich aber noch:
wie geht es, wenn ich einen wert wie z.B. Ja ausgewählt habe, sich im menu
automatisch ne neue zeile öffnet.
es funktioniert in meinem beispielscript nur wenn ich den ersten "normalen"
Button anklicke ( so wie eine art aktualisierungsbutten )
die zeile mit den ????? darunter hätte ich gerne sofort angezeigt bekommen wenn ich den wert ändere!

Code: Select all

$tmpIndex = 0
while 1
  $Mainmenu.Menu = create custom menu array
  $janein.array = array alloc: size=0
  append 'Ja' to array $janein.array
  append 'Nein' to array $janein.array
  
  
  add custom menu item to array $Mainmenu.Menu: text='normal' returnvalue='ja.nein.drei'
  add value selection to menu: $Mainmenu.Menu, text='test', value array=$janein.array, default=$tmpIndex, return id='usereingabe'
  
* ?????????????????????????????????????????
  if $tmpIndex == 1
    add custom menu item to array $Mainmenu.Menu: text='normal2' returnvalue='ja.nein.vier'
  end
  
  

* -----------------------------------------------------------------------------------
* Menu oeffnen
* -----------------------------------------------------------------------------------
  $ret.value = open custom menu: title='Langstrecken Waren Transporter Hauptmenue' description=null option array=$Mainmenu.Menu
  if $ret.value == -1
    return null
  end
  
  
  $ret.value.count = size of array $ret.value
  $tmpCounter = 0
  while $tmpCounter < $ret.value.count
    
* -----------------------------------------------------------------------------------
* tmpSingleRet ist eigentlich ret.value wie vorher
* -----------------------------------------------------------------------------------
    $tmpSingleRet = $ret.value[$tmpCounter]
    
    if $tmpSingleRet == 'ja.nein.drei'
      display subtitle text: text=$tmpSingleRet duration=11000 ms
      play sample 1007
    else if $tmpSingleRet == 'ja.nein.vier'
      display subtitle text: text=$tmpSingleRet duration=11000 ms
      play sample 1006
    end
    
    
* -----------------------------------------------------------------------------------
* ab hier die pfeildinger
* -----------------------------------------------------------------------------------
    $tmpRetName = $tmpSingleRet[0]
    
    if $tmpRetName == 'usereingabe'
      $tmpIndex = $tmpSingleRet[1]
      if $tmpIndex == 1
*        play sample 929
      else
*        play sample 972
      end
    end
    
* -----------------------------------------------------------------------------------
    
    inc $tmpCounter =
  end
end
return null


User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

das geht so ohne weiteres nicht. die änderungen an den values sind nicht dynamisch, da sie kein event auslösen, wie das bei "modernen" programmiersprachen ist. du musst den umweg über eine "übernahme"-zeile nehmen. ich weiß nicht, ob du den som nutzt - aber der erste auswahldialog bei einer bestellung (rassenwahl, klassenwahl usw.) funktioniert genauso.
Last edited by Reflexer on Sun, 20. Jan 13, 22:54, edited 1 time in total.
User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Post by Joda »

nein nutze ihn nicht.
werd aber mal ins script schaun.
Edit: ok weiß jetzt wie du das machst, aber ich hab gesehen das es
doch geht http://forum.egosoft.com/viewtopic.php?t=261816
Schaut ziemlich kompliziert aus!
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

ich habe auch nicht geschrieben, dass es nicht geht, sondern, dass "es nicht ohen weiteres geht" ;)

Da du mit dem normalen handling schon an deine grenzen gestoßen warst wollte ich dich nicht überfahren.

der aufwand es so zu betreiben wiegt in keinem fall den nutzen auf. selbst lucike macht es nicht so - weil es einfach jenseits von gut und böse ist.
User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Post by Joda »

ah ok danke :D

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”