Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Thema gestartet von: Der Kompaniechef am 05. Juli 2012, 11:51:14
-
Nach längeren ausprobieren habe ich die schnauze voll.
Und zwar geht es um das Benutzen von Inventargegeständen mit objecten/hotspots.
Ich möchte das beim Benutzen einens bestimmten Gegestandes z.B Inventargegestand 9 etwas bestimmtes gesagt wird.
bei allen anderen soll nur gesagt werden das ist keine gute Idee
mein Script is folgender:
}
}
else if (UsedAction (A_USE_INV)) {
if (MovePlayer (150,127)) {
if (character [GetPlayerCharacter ()].activeinv == 9) {
FaceDirection (GetPlayerCharacter (), DIR_UP);
Wait (5);
DisplaySpeech (GetPlayerCharacter (), "Der fernseher ist doch schon an.");
}
else
FaceDirection (GetPlayerCharacter (), DIR_UP);
DisplaySpeech (GetPlayerCharacter (), "Das ist keine Fernbedienung.");
}
}
}
Das Problem ist benutze ich jetzt die Fernbedienung mit dem fernseher werden beide texte gesagt, was ja keinen Sinn ergibt.
Ich nutze ags 3.2
Kann einer mir bitte den script so umschreiben das dies nicht mehr passiert!?
MfG JPJF
-
Gewöhn dir an, den code schöner zu formatieren, damit du siehst welche klammern zu welchem block gehören.
In diesem Fall ist dein else Zweig nicht geklammert damit wird nur die erste Zeile nach dem else damit verknüpft, die zeile darunter aber immer ausgeführt.
[ags]
else if (UsedAction (A_USE_INV))
{
if (MovePlayer (150,127))
{
if (character [GetPlayerCharacter ()].activeinv == 9)
{
FaceDirection (GetPlayerCharacter (), DIR_UP);
Wait (5);
DisplaySpeech (GetPlayerCharacter (), "Der fernseher ist doch schon an.");
}
else
{
FaceDirection (GetPlayerCharacter (), DIR_UP);
DisplaySpeech (GetPlayerCharacter (), "Das ist keine Fernbedienung.");
}
}
}
[/ags]
weil es Boogie noch übersichtlicher formatiert hätte, seinen beitrag aber wieder gelöscht mach ich das auch noch mal schöner.....
-
Wie wäre es denn damit...
[ags]
else if (UsedAction(eActUseInventory) && player.ActiveInventory == iFernbedienung)
{
if(oFernseherAn.Visible) //Wenn Fernseher an
{
player.Say("Der Fernseher ist doch schon an.");
}
else
{
oFernseherAn.Visible = true;
}
}
else if (UsedAction(eActUseInventory))
{
Wait(5);
player.Say("Das ist doch keine Fernbedienung.");
}
[/ags]
-
Seit wie viel Jahren ist GetPlayerCharacter(), DisplaySpeech() und Ähnliches nun veraltet...? Fünf oder so.
ZAK:
[ags]// kommentare werden automatisch grün gemacht[/ags]
-
ZAK:
[ags]// kommentare werden automatisch grün gemacht[/ags]
Danke
-
Danke hat prima geklappt. (script von roco)
So die nächste frage.
Wie scripte ich das bei zwei bestimmten Inventargegeständen ein Satz kommt beim Rest aber wieder der Standartspruch
-
Danke hat prima geklappt. (script von roco)
So die nächste frage.
Wie scripte ich das bei zwei bestimmten Inventargegeständen ein Satz kommt beim Rest aber wieder der Standartspruch
Dann solltest du besser roco fragen, denn die Antwort war bereits in meinem Skript...
hier ein Skriptbeispiel nach dem neuem Standart:
[ags]function oAsche_AnyClick()
{
if (any_click_move(110, 125, eDirUp))
{
if (UsedAction(eActWalkTo))
{
Wait(5);
}
else if (UsedAction(eActLookAt))
{
Wait(5);
player.Say("Da war mal eine Feuerstelle.");
}
else if (UsedAction(eActPickUp))
{
Wait(5);
player.Say("Asche zu Asche...");
Wait(20);
player.Say("Aber das gehört nicht in meine Hosentasche.");
}
else if (UsedAction(eActUse))
{
Wait(5);
player.Say("Ja, hier könnte ich Feuer machen.");
}
else if (UsedAction(eActOpen))
{
Wait(5);
player.Say("Das macht nun wirklich kein Sinn.");
}
else if (UsedAction(eActClose))
{
Wait(5);
player.Say("Das macht nun wirklich kein Sinn.");
}
else if (UsedAction(eActPull))
{
Wait(5);
player.Say("Da bewegt sich nichts.");
}
else if (UsedAction(eActPush))
{
Wait(5);
player.Say("Da bewegt sich nichts.");
}
else if (UsedAction(eActUseInventory) && player.ActiveInventory == iLukenoeffner)
{
Wait(5);
player.Say("Da ist nichts bruchbares drin.");
}
else if (UsedAction(eActUseInventory) && player.ActiveInventory == iFeuerholz)
{
Wait(5);
player.Say("Ich sollte vorher die Feuerstelle sichern.");
}
else if (UsedAction(eActUseInventory) && player.ActiveInventory == iMoos01)
{
Wait(5);
player.Say("Ein bisschen Holz wäre sehr hilfreich.");
}
else if (UsedAction(eActUseInventory) && player.ActiveInventory == iNagellackentferner)
{
Wait(5);
player.Say("Das macht hier kein Sinn.");
}
else if (UsedAction(eActUseInventory))
{
Wait(5);
player.Say("Das kann ich hier nicht benutzen.");
}
else Unhandled();
}
}
[/ags]
-
Bevor das hier noch weiter ausartet: JPJF, das nennt man Transfer. Es ist im Grunde 1+1 zusammenzählen, wobei aber nicht eins, die Zahl, gemeint ist, sondern eine Erkenntnis.
Du weißt jetzt, wie man bei einem Gegenstand einen Satz ausgibt, und beim Rest einen anderen. Kann es wirklich so schwer sein, da einen zweiten Gegenstand dazu zu bauen?
Jetzt aber mal zum Code: die Reihenfolge der ifs sollte folgende sein, um den Code nicht unnötig zu verlängern;
1) if (MovePlayer(...))
2) Verbabfrage
3) player.ActiveInventory
Konkret:
[ags]function xy() {
// erst der Positionscheck. Hat der Spieler den Gegenstand erreicht?
if (MovePlayer(123, 234) == 2) {
// dann der Aktionscheck. Welches Verb wurde verwendet?
if (UsedAction(...)) {
...
}
else if (UsedAction(eActUseInventory)) {
// Benutze Inventar mit xy wurde verwendet. Welcher Inventargegenstand genau?
if (player.ActiveInventory == iKeule) {
...
}
else if (player.ActiveInventory == iScharferStein) {
...
}
// anderer Inventargegenstand
else if Unhandled();
}
// andere Verben
else Unhandled();
}
// Gegenstand nicht erreicht
else player.Say("Ich komme nicht ran.");
}[/ags]
Man beachte die korrekte Einrückung, welche die Lesbarkeit deutlich erhöht!