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