Suchen und Finden im Spieler

Liebe Mitmagier,

in diesem Beitrag geht es um Suchen und Finden von Gegenständen in Spielern.

Immer wieder kommen wir zu einem Punkt, an dem wir etwas im Spieler (oder NPC oder Raum) suchen und ggf. auch finden / identifizieren müssen.
Dabei gibt es verschiedene Vorgehensweisen, die mehr und weniger gut sind.
Ich möchte hier ein paar vorstellen:

Angenommen, ich suche im Spieler einen bestimmten Gegenstand mit der ID
“\nQuestFlasche” und dem Pfad “/d/gebirge/hoehle/obj/flasche.c”.

  1. SEHR schlecht, nicht nachmachen!
object* fl = all_inventory(spieler);

  if ( !fl || !sizeof(fl) )
   {
    tell_object(spieler,"Du hast leider keine passende Flasche dabei.\n");
    return 1;
   }
  object flasche;
  for ( i=sizeof(fl)-1; i>=0; i-- )
   if ( fl[i]->id("\nQuestFlasche") )
    {
     flasche = fl[i];
     break;
    }
   ...

Warum ist das schlecht? Aus verschiedenen Gründen:

  • Um etwas in einem Spieler zu finden brauchen wir all_inventory()
    grundsätzlich nicht explizit.
  • for() ist langsamer als foreach().
  • id() ist generell teuer, innerhalb einer Schleife ist es noch teurer. 🙂
  1. FALLS man an einer Schleife festhalten will (warum auch immer), dann
    bitte:
  int flag = 0;
  object flasche;

  foreach ( object flasche : all_inventory(spieler) )
   if ( "/d/gebirge/hoehle/obj/flasche" == load_name(flasche) )
    {
     flag = 1;
     break;
    }

  if ( !flag )
   {
    tell_object(spieler,"Du hast leider keine passende Flasche dabei.\n");
    return 1;
   }
  ...
  1. Am besten jedoch mit present_clone() und dem Pfad arbeiten:
  object flasche = present_clone("/d/gebirge/hoehle/obj/flasche",spieler);
/ bzw. noch besser, weil flexibler:
/ object flasche = present_clone(OBJ"flasche",spieler);

  if ( !objectp(flasche) )
   {
    tell_object(spieler,"Du hast leider keine passende Flasche dabei.\n");
    return 1;
   }
  ...

Bis bald!

Gruß, Torin

Schreibe einen Kommentar