MultipleChoice oder andere Lösung gesucht

» Siedler Map Source Forum » Siedler DEdK Script Forum » MultipleChoice oder andere Lösung gesucht

Seiten: 1

Kalle
#1
30.08.2010 14:54
Beiträge: 1150

MultipleChoice oder andere Lösung gesucht

Hallo,

ich benötige einen Lösungsansatz:

Ich möchte den Spieler etwas fragen (hier bietet sich ja Multiple gerade zu an...), aber nach einer bestimmten Dauer soll eine Entscheidung her und nicht auf den Spieler gewartet werden.

Eine Lösung wäre es über Tribute zu steuern, die bei Zeitablauf wieder widerrufen werden: finde ich aber nicht so schön.

Ich stelle mir ein normales Briefing vor, welches aber durch Zeitablauf "von selbst" beendet wird.

Beispiel: Möchtest Du bezahlen, damit die Brücke zum Gegner verschlossen bleibt? -> Ja -Bezahlen, Nein -Brücke auf.

Der Spieler soll hierzu ca. 30 Sekunden bedenkzeit haben, falls er nicht wählt, soll das Script entscheiden.

Hat jemand eine Lösung, außer der Tribute?

Danke
Kalle

____________________
Lieber Siedeln statt (fern)sehen.....

Peter-FS
#2
30.08.2010 16:35
Beiträge: 1086

Hallo Kalle,

du könntest einen Brückenwächter vor die Brücke stellen, ein normales Briefing starten mit der Info, dass der Spieler 30 Sek. Zeit hat es sich zu überlegen.
Nach dem Briefing den Wächter für 30 Sek. als NPC aktivieren, wenn der Spieler ihn nicht anklickt, NPC deaktivieren, Brücke auf und NPC verschwinden lassen.

Gruss Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

kingsia
#3
30.08.2010 16:44
Beiträge: 750

Briefing dann zwei NPCs wegen Auswahl.
SimpleJob starten.
Wenn keine von den beiden NPCs angesprochen war, lass den Skript entscheiden.

Gruss
Kingsia

fritz_98
#4
30.08.2010 17:12
Beiträge: 472

Vielleicht lässt sich ja auch was mit einem Counter in Verbindung mit EndBriefing() machen...

Wenn ich Kalles Frage richtig interpretiere, sollen die 30sek Bedenkzeit erst beim Start des Briefings starten.

Kalle
#5
30.08.2010 17:25
Beiträge: 1150

Mein Wunschdenken:

Zitat von fritz_98:
Wenn ich Kalles Frage richtig interpretiere, sollen die 30sek Bedenkzeit erst beim Start des Briefings starten.



Ich würde sehr gern in einen "normalem Dialog" in einem Briefing dem Spieler die Auswahlfrage stellen. Ich möchte aber nicht, dass das Game dann ggf. EWIG auf die Antwort des Players wartet....

Und eigentlich möchte ich nicht, dass der Player in einer Art Contdown noch große Möglichkeiten hat, zB den Held wegzubringen etc.... (deswegen gefällt mir das mittels Tribute nicht...)

Am liebsten wäre halt ein NO-ESC-Briefing, mit Auswahl, welches durch einen Timer nötigenfalls beendet würde, aber ich glaube, da gibt es keine Lösung.....

____________________
Lieber Siedeln statt (fern)sehen.....

fritz_98
#6
30.08.2010 17:50
Beiträge: 472

Zitat von fritz_98:
Vielleicht lässt sich ja auch was mit einem Counter in Verbindung mit EndBriefing() machen...



Peter-FS
#7
30.08.2010 17:55
Beiträge: 1086

Tastatur Abfrage

Eine weitere Möglichkeit wäre evtl. nach dem Briefing die Tastatur abzufragen.
Als Text im Briefing:
"Du hast 30 sek. Zeit um die Taste z.B. "b" (für bezahlen) zu drücken."

Den Helden könntest du während der 30 Sek., wenn er versucht weg zu laufen, wieder mit Move(..) an die Position zurückschicken.

Ich weiss aber nur wie man die Tasten 1-9 abfragen kann, vielleicht könnte da jemand anderes helfen.

Gruss Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

kingsia
#8
30.08.2010 18:24
Beiträge: 750

Zitat von Kalle:
Mein Wunschdenken:
Und eigentlich möchte ich nicht, dass der Player in einer Art Contdown noch große Möglichkeiten hat, zB den Held wegzubringen etc.



Dann erstelle eine Bereich ausserhalb der normale sichtbare Kartenbereich wo der Spieler seine Auswahl treffen soll, und versetzte den Held dorthin.
MiniMap und Einheitauswahlmöglichkeiten ausschalten bis er gewählt hat oder Zeit abgelaufen ist.
Bis der Spieler den Bildschirm soweit gescrollt hat das er etwas anderes unternehmen kann ist wahrscheinlich den Zeit schon abgelaufen.
Nach der Entscheidung oder nach ablauf der Denkzeit, versetzte den Held zurück auf seine ürsprungliche Position. Keine Weglauf möglich.
Das wurde auch mehr Druck auf der Spieler ausüben schnell eine Entscheidung zu treffen weil bis er entscheidet kann er nicht beeinflussen was seine Truppen macht.

Gruss
Kingsia

Kalle
#9
30.08.2010 19:36
Beiträge: 1150

...hmmm....

alles noch nicht das erträumte...

Mal ein anderer Ansatz:

Es gab doch mal kluge Köpfe, die kleine Info-Fenster realisieren konnten (das brauche ich sowieso noch). Kann man auch zwei Fenster, eines Links und eines Rechts einblenden (zB für die Dauer von 30 Sekunden) und dann mittels Job die Mausposition (und auch das "Klicken" ) abfangen, um somit Ja oder Nein zu erfragen?

Wäre sowas möglich?

PS: Den genauen Einsatz möchte ich noch nicht verraten. Sollte spätestens mit meiner dritten Map umgesetzt sein...

____________________
Lieber Siedeln statt (fern)sehen.....

Flodder
#10
30.08.2010 19:53
Beiträge: 2608

Zitat von Kalle:
...hmmm....
Wäre sowas möglich?


Ja, aber eigentlich nicht nötig Kalle.
Du kannst z.B. auch die Zifferntasten 1 bis 0 "hacken"

Da die Spielerantwort logischerweise nur "ja" sein kann, brauchste auch nur eine Zifferntaste "hacken". Meinetwegen die "1". Die also für "Ich zahle"

Dann lässte einen sichbaren ( ...oder meinetwegen auch "stillen" ) counter ablaufen. Ist der abgelaufen und Spieler hat in dieser Zeit NICHT die Zifferntaste gedrückt, die Du vorgegeben hast, erfolgt über Scriptbefehlt die andere Entscheidung und der "hack" wird zurückgesetzt.

Bei anderen Ereignissen schon eingesetzt und funktioniert.

Gruss
Flodder

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

Dieser Beitrag wurde von Flodder am 30.08.2010 um 20:27 editiert.

Flodder
#11
30.08.2010 20:10
Beiträge: 2608

Nachtrag:

Für die komplette Belegung der Zifferntasten 1 bis 0 sähe das so aus:

function SchalterWahl()
GroupSelection_SelectTroopsOld = GroupSelection_SelectTroops
function GroupSelection_SelectTroops ( _schalter )
   if _schalter == 1 then
      _schalter = 0
   -- mach dies
   elseif _schalter == 2 then
      _schalter = 0
   -- mach dies
   elseif _schalter == 3 then
      _schalter = 0
   -- mach dies
   elseif _schalter == 4 then
      _schalter = 0
   -- mach dies
   elseif _schalter == 5 then
      _schalter = 0
   -- mach dies
   elseif _schalter == 6 then
      _schalter = 0
   elseif _schalter == 7 then
      _schalter = 0
    -- mach dies
   elseif _schalter == 8 then
      _schalter = 0
    -- mach dies
   elseif _schalter == 9 then
      _schalter = 0
    -- mach dies
   elseif _schalter == 10 then
      _schalter = 0
   -- mach dies
   end
   GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld
   return true
   end
end


Da Du für Deine Zwecke nur eine Zifferntaste brauchst, dann z.B. für Zifferntaste 1 so:

function SchalterWahl()
GroupSelection_SelectTroopsOld = GroupSelection_SelectTroops
function GroupSelection_SelectTroops ( _schalter )
   if _schalter == 1 then
      _schalter = 0
   -- mach dies
end
   GroupSelection_SelectTroops = GroupSelection_SelectTroopsOld
   return true
   end
end


Zum counter brauch ich nichts sagen, oder?

Edit
Beachte dabei bitte, dass viele Spieler gerne die Zifferntasten 1 bis 4 mit Truppengattungen belegen. Dann nimm meinetwegen die 8 oder sonstwas.

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

kingsia
#12
30.08.2010 21:00
Beiträge: 750

Es scheint mir dass Kalle keine technische Lösung sucht sondern ein gut optisch aussehende Lösung.

Daher folgende Idee (Vorschlag)

Statt NPCs die angesprochen werden muss, letzte Briefingseite mit den Held vor ein Wegweiser (ausserhalb der normale Bereich). Nach links Option 1, nach rechts Option 2.
Wenn der Spieler dann nicht innerhalb eine bestimmte Zeit für eins von der Wege entscheidet dann entscheidet der Skript.

Wäre auch ein Einsatzmöglichkeit für jKR_Wegweiser.
Statt eine Wegweiser, zwei XD_Signpost1 links und rechts mit entsprenchenden Texten. Klick abfragen und fertig.

Gruss
Kingsia

Flodder
#13
30.08.2010 21:25
Beiträge: 2608

Zitat von kingsia:
Es scheint mir dass Kalle keine technische Lösung sucht sondern ein gut optisch aussehende Lösung.

Daher folgende Idee (Vorschlag)

Statt NPCs die angesprochen werden muss, letzte Briefingseite mit den Held vor ein Wegweiser (ausserhalb der normale Bereich). Nach links Option 1, nach rechts Option 2.
Wenn der Spieler dann nicht innerhalb eine bestimmte Zeit für eins von der Wege entscheidet dann entscheidet der Skript.

Wäre auch ein Einsatzmöglichkeit für jKR_Wegweiser.
Statt eine Wegweiser, zwei XD_Signpost1 links und rechts mit entsprenchenden Texten. Klick abfragen und fertig.

Gruss
Kingsia


Jau, dass wäre auch eine "elegante" Lösung.
Klick abfragen noch gar nicht mal nötig. Positonsabfrage reicht ja schon. Ist "name" bei "posRechts" Radius 1000 angekommen, dann dies. Ist "name" bei "posLinks" Radius 1000 angekommen, dann das.

Ist Zeit "x" abgelaufen und "name" kann sich nicht entscheiden gilt "Angriff" (...für "posLinks" oder "posRechts" festlegen)

Jo, jau, das hat was!

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

Peter-FS
#14
31.08.2010 00:30
Beiträge: 1086

InfoFenster

hier der Code für ein Infofenster, ist übrigens nicht von mir.

function MovieFenster(_Title,_Text)
  gvFenster = true
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 1 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Cinematic_Text" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarTop" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarBottom" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieInvisibleClickCatcher" ), 0 );
  XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowTextTitle" ), _Title );
  XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowText" ), _Text );		
end



zum schliessen des Fenster:

function HideMovieFenster()
  gvFenster = false
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 0 );    
end



Habe ich bisher noch nicht verwendet, kannst du ja mal probieren.

@Flodder - kannst du mir Info über die Indoor Elemente XD_... schicken?

Gruss Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Flodder
#15
31.08.2010 00:55
Beiträge: 2608

Zitat von Peter-FS:
hier der Code für ein Infofenster, ist übrigens nicht von mir.

function MovieFenster(_Title,_Text)
  gvFenster = true
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 1 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Cinematic_Text" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarTop" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarBottom" ), 0 );
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieInvisibleClickCatcher" ), 0 );
  XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowTextTitle" ), _Title );
  XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowText" ), _Text );		
end


...und wem das Siedler-Logo oberhalb des Movie-Fensters nicht gefällt oder nicht passt der möge die Funktion so komplettieren:

function MovieFenster(_Title,_Text)
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 1 );
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Cinematic_Text" ), 0 );
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarTop" ), 0 );
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieBarBottom" ), 0 );
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "CreditsWindowLogo" ), 0 ); --<-- das hinzufügen 
	XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "MovieInvisibleClickCatcher" ), 0 );
	XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowTextTitle" ), _Title );
	XGUIEng.SetText( XGUIEng.GetWidgetID( "CreditsWindowText" ), _Text );		
end


(Für diese zusätzliche Zeile meinen Dank an unser Siedler_Team Mitglied totalwarANGEL!)
Obige Funktion ist eine Comfortfunktion und kommt in die Comforts.

Zitat von Peter-FS:

zum schliessen des Fenster:

function HideMovieFenster()
  gvFenster = false
  XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 0 );    
end


Es reicht:

function HideMovieFenster()
    XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "Movie" ), 0 );    
end


... auch in die Comforts packen.

Zitat von Peter-FS:

@Flodder - kannst du mir Info über die Indoor Elemente XD_... schicken?
Gruss Peter


Jau Peter, geht gleich los. Sind XML - Dateien.
Wo die hin müssen, werde ich in der Mail beschreiben.

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

Kalle
#16
01.09.2010 10:01
Beiträge: 1150

Fassen wir mal zusammmen:

Eine Möglichkeit, ein begonnenes Briefing Multiple, welches auf eine Auswahl wartet, ist nicht durch das System zu beenden!?

Ein "normales" Briefing endet durch CHAR-TIME durch Zeitablauf.... Nur halt Multiple wartet auf einen Mausklick auf eine der beiden Auswahlmöglichkeiten.

Sieht hier jemand die Chance, durch einen Job im Hintergund (zb Startet Job bei Start Briefing), vom System aus ggf. die Auswahl zu erwirken, als ob der Spieler nun eine Auswahl angeklickt hat?

Scheinbar (wie so oft von mir gewünscht) ein unmögliches Unterfangen?

____________________
Lieber Siedeln statt (fern)sehen.....

warrior1024
#17
01.09.2010 10:30
Beiträge: 345

Cinematic
       CinematicMC_Container
         CinematicMC_Headline
         CinematicMC_Text
         CinematicMC_Button1
           Calls: BriefingMCButtonSelected(1)
         CinematicMC_Button2
           Calls: BriefingMCButtonSelected(2)
       CinematicMiniMapContainer
         CinematicFrame
         CinematicMiniMapOverlay
         CinematicMiniMap
         CinematicFrameBG
       Cinematic_Text
       Cinematic_Headline
       CinematicBar00
       CinematicBar01
       CinematicBar02


Mit BriefingMCSelected könnte man Erfolg haben, da bei einer Entscheidung des Spielers nichts anderes passiert.

____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

Kalle
#18
01.09.2010 12:14
Beiträge: 1150

Zitat von warrior1024:
Mit BriefingMCSelected könnte man Erfolg haben, da bei einer Entscheidung des Spielers nichts anderes passiert.



... tja, das wäre ein Ansatz, aber ich kann nicht glauben, dass ich den zum funzen bringe. Denn irgendwoher muss die Maschine ja wissen, um welches Briefing es sich handelt. Also selbst, wenn ich während das Script im MC-Briefing auf die Anwort/Auswahl des Spielers "wartet", aus einen Job heraus die Anweisung (wie auch immer???) Calls: BriefingMCButtonSelected(1) aufrufen würde, woher weiß die Maschine dann, welches Briefing gemeint sein soll?

Es fehlen die Infos über ggf. nötige Parameter? Oder hat jemand mit diesen Anweisungen schon mal irgendwo irgendwas irgendwie verwendet?

Ich hatte ja eher (aus Ur-Ur-Ur-Zeiten vom Computern) an eine Art "Tastaturpuffer vorbelegen" gedacht, also quasi die Maus ferngesteuert klicken lassen.....

PS
... bin aber weiterhin für jede Idee dankbar...

____________________
Lieber Siedeln statt (fern)sehen.....

Peter-FS
#19
01.09.2010 13:28
Beiträge: 1086

Hallo Kalle,

wie wäre die Idee, ein Movie-Fenster für 30 Sek. anzeigen mit dem Hinweis (nur ein Beispiel):

Du hast 30 Sekunden dich zu entscheiden!
Bezahlen: Taste 1 drücken
Sonst: Taste 2 drücken

Wenn die 30 Sek. um sind, Fenster schließen und Brücke schliessen. Code für Tastenabfrage (nicht von mir) in die FMA:

function GroupSelection_SelectTroops ( _count ) 
   if _count == 1 then 
      z.B. Brücke öffnen 
   elseif _count == 2 then 
      z.B.Brücke schließen
   end 
end 


Evtl. muss dann der original Zustand der GroupSelection Funktion wieder hergestellt werden.

Gruss Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Noigi
#20
01.09.2010 14:28
Beiträge: 772

Zitat von Kalle:

Zitat von warrior1024:
Mit BriefingMCSelected könnte man Erfolg haben, da bei einer Entscheidung des Spielers nichts anderes passiert.



... tja, das wäre ein Ansatz, aber ich kann nicht glauben, dass ich den zum funzen bringe. Denn irgendwoher muss die Maschine ja wissen, um welches Briefing es sich handelt. Also selbst, wenn ich während das Script im MC-Briefing auf die Anwort/Auswahl des Spielers "wartet", aus einen Job heraus die Anweisung (wie auch immer???) Calls: BriefingMCButtonSelected(1) aufrufen würde, woher weiß die Maschine dann, welches Briefing gemeint sein soll?

Es fehlen die Infos über ggf. nötige Parameter? Oder hat jemand mit diesen Anweisungen schon mal irgendwo irgendwas irgendwie verwendet?



Ich glaub nicht, dass da irgendwelche Informationen fehlen.
Aus dem von warrior1024 gezeigten Teil der GUI-Architektur geht ja hervor, dass bei einem Klick des Spielers auf einen MC-Button nichts anderes passiert als ein Aufruf von BriefingMCButtonSelected - entweder mit 1 oder mit 2 als Parameter. Auch in diesem Fall weiß das Spiel also aus dem Kontext heraus, was der Aufruf bewirken soll.

Ich bin mir also ziemlich sicher, dass (wie von dir vorgeschlagen) ein Job, der nach 30 Sek. BriefingMCButtonSelected(1) aufruft, genau das gewünschte Verhalten zeigen wird.

Kalle
#21
01.09.2010 16:30
Beiträge: 1150

"smack"

- - > p e r f e k t < - -

Dicker Schmatzer, funzt tadellos !

Warrior1024 Ansatz und Noigi mit seinem Kommentar gaben die Lösung.

Hab' zwar 'ne Weile fummeln müssen, und der Job ist bei "BriefingFinished" IMMER noch am laufen, aber jetzt klappts.

DICKES DANKE

Gruß
Kalle

____________________
Lieber Siedeln statt (fern)sehen.....

Flodder
#22
03.09.2010 19:17
Beiträge: 2608

Hallo Kalle,
Lösungsweg und Mustermap per Mail zugeschickt. Näheres in der eMail.
Viel Spass

____________________
Take a Nudelholz und hau it on the Kopp of a bekloppt Person .... to give you a better Gefühl than vorher.

Mordred
#23
03.09.2010 19:45
Beiträge: 939

Per Tribut siehts auch schön aus, mit Fenster und mal was anderes:

EntscheideDich()

function EntscheideDich()
 Logic.SuspendAllEntities() -- Spiel anhalten
 StartSimpleJob("AutoEntscheidung")
 ---------------------
  local tributeA =  {}
 tributeA.playerId = 1
 tributeA.text = "Klick hierdrauf."
 tributeA.cost = { Gold = 0}
 tributeA.Callback = EntscheideDich_A
 EntscheideDichTributA = AddTribute(tributeA)
  local tributeB =  {}
 tributeB.playerId = 1
 tributeB.text = "Oder dadrauf."
 tributeB.cost = { Gold = 0}
 tributeB.Callback = EntscheideDich_B
 EntscheideDichTributB = AddTribute(tributeB)
 --------------------
 XGUIEng.ShowWidget(XGUIEng.GetWidgetID("TradeWindow"),1)
 XGUIEng.ShowWidget(XGUIEng.GetWidgetID("TradeWindowCloseButton"),0)
 QuickSaveOrig = QuickSave
 GUIAction_ToggleMenuOrig = GUIAction_ToggleMenu
 QuickSave = function () end -- speichern gilt nicht
 GUIAction_ToggleMenuOrig = function (_menu,_flag) end -- menus aufmachen auch nicht
end
function AutoEntscheidung()
 if Counter.Tick2("AutoEntscheidung",30)then
  Logic.RemoveTribute(1,EntscheideDichTributA)
  Logic.RemoveTribute(1,EntscheideDichTributB)
  TributEntschieden()
  -- EntscheideDich_A()
  -- EntscheideDich_B()
  return true
 end
end
function EntscheideDich_A()
 Logic.RemoveTribute(1,EntscheideDichTributB)
 TributEntschieden()
 -- etc
end
function EntscheideDich_B()
 Logic.RemoveTribute(1,EntscheideDichTributA)
 TributEntschieden()
 -- etc
end
function TributEntschieden()
 QuickSave = QuickSaveOrig
 GUIAction_ToggleMenu = GUIAction_ToggleMenuOrig
 Logic.ResumeAllEntities()
 XGUIEng.ShowWidget(XGUIEng.GetWidgetID("TradeWindowCloseButton"),1)
 XGUIEng.ShowWidget(XGUIEng.GetWidgetID("TradeWindow"),0)
end

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum