Revert "MNPC: Walk() in zwei Funktionen gesplittet"
This reverts commit 8ecb43e259b9e0cfe4e960fb21f065081717e1fb.
Meines Erachtens ist die Aenderung nicht ausgereift:
1) Sie macht es zwar einfacher, das Walk() zu ueberschreiben,
aber immer noch noetig fuer das Ersetzen der Zielermittlung
und damit unnoetig komplex. Will man nur das Ziel aendern,
ist das Ueberladen des Walk() immer noch eine unnoetig
aufwendige Massnahme.
2) Die Umbenennung der Schedulerfunktion erfordert in der
Praxis einen Reboot - unnoetigerweise.
3) Die aktuelle Implementation erfordert die Pruefung
aller ueberladenen Walk() in erbenden Objekten. Denn wenn
jemand das Walk mit einer Kopie ueberladen hat, kommt es
bei jeder Callout-Multiplikation (in jeder Bewegung
werden 2 Callouts gestartet).
4) Die Aenderung enthaelt einen Bug bzgl. der Ausgabe der
Bewegungsmeldung vom Exit - der war zwar aelter, aber wurde
auch nicht korrigiert. Die Meldung beim Nutzen eines Ausganges
ist in P_EXIT nicht mehr mit # getrennt am Zielpfad.
Change-Id: Ie0b59f8a5f09806cc7a17d80d2740371951e451a
diff --git a/p/service/padreic/mnpc/moving.c b/p/service/padreic/mnpc/moving.c
index f9eb697..46c0a4b 100644
--- a/p/service/padreic/mnpc/moving.c
+++ b/p/service/padreic/mnpc/moving.c
@@ -46,8 +46,8 @@
}
else
{
- if (find_call_out("CheckWalk") == -1)
- call_out("CheckWalk", QueryProp(MNPC_DELAY)+random(QueryProp(MNPC_RANDOM)));
+ if (find_call_out("Walk") == -1)
+ call_out("Walk", QueryProp(MNPC_DELAY)+random(QueryProp(MNPC_RANDOM)));
}
}
@@ -64,7 +64,7 @@
// Falls MNPC noch registriert ist oder noch einen Callout auf Walk hat,
// muss nichts weiter gemacht werden.
if (WALK_MASTER->Registration()
- || find_call_out("CheckWalk") > -1)
+ || find_call_out("Walk") > -1)
return -1;
// ansonsten MNPC registrieren, falls geeignet.
if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))<MAX_MASTER_TIME)
@@ -72,7 +72,7 @@
// und mit kurzer Verzoegerung einmal laufen. (ja, absicht, hier
// MNPC_DELAY zu nutzen - denn solange dauert das Walk vom Master
// mindestens.)
- call_out("CheckWalk",1+random( min(QueryProp(MNPC_DELAY)-1,8) ));
+ call_out("Walk",1+random( min(QueryProp(MNPC_DELAY)-1,8) ));
return 1;
}
return 0;
@@ -82,8 +82,8 @@
{
if (WALK_MASTER->Registration())
WALK_MASTER->RemoveWalker();
- else if (find_call_out("CheckWalk")!=-1)
- remove_call_out("CheckWalk");
+ else if (find_call_out("Walk")!=-1)
+ remove_call_out("Walk");
if (movehome)
{
move(QueryProp(MNPC_HOME), M_TPORT|M_NOCHECK);
@@ -328,10 +328,40 @@
return res;
}
-// Koennte eigentlich auch void sein, aber fuer die Abwaertskompatibilitaet
-// wird int gebraucht.
int Walk()
{
+ if (!environment())
+ {
+ // darf eigentlich nicht vorkommen.
+ raise_error("MNPC ohne Environment.\n");
+ }
+
+ int flags=QueryProp(MNPC_FLAGS);
+ if (!(flags & MNPC_WALK))
+ return 0;
+
+ //ggf. neuen Callout eintragen, bevor irgendwas anderes gemacht wird.
+ if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))>=MAX_MASTER_TIME)
+ call_out("Walk", QueryProp(MNPC_DELAY)+random(QueryProp(MNPC_RANDOM)));
+
+ // Im Kampf ggf. nicht weitergehen.
+ if ((flags & MNPC_NO_WALK_IN_FIGHT) && InFight())
+ {
+ meet_last_player=time();
+ return 1;
+ }
+
+ // MNPC anhalten, wenn lange kein Spielerkontakt
+ if (QueryProp(MNPC_WALK_TIME)+meet_last_player < time()
+ && !sizeof(filter(all_inventory(environment()),
+ #'query_once_interactive))
+ )
+ {
+ // anhalten und ggf. auch direkt nach Hause gehen.
+ Stop(flags & MNPC_GO_HOME_WHEN_STOPPED);
+ return 0;
+ }
+
// Ausgaenge ermitteln, zunaechst aber keine Special Exits.
mapping exits = (environment()->QueryProp(P_EXITS));
string *rooms = m_values(exits);
@@ -346,7 +376,6 @@
ex += ({ dirs[i] });
}
/* Hier muessen wir auf die Zuverlaessigkeit unserer Magier bauen ... */
- int flags=QueryProp(MNPC_FLAGS);
if (flags & MNPC_DIRECT_MOVE)
{
// im direct mode keine SEs benutzbar...
@@ -388,44 +417,6 @@
move(QueryProp(MNPC_HOME), M_TPORT|M_NOCHECK);
}
}
- return 1;
-}
-
-int CheckWalk()
-{
- if (!environment())
- {
- // darf eigentlich nicht vorkommen.
- raise_error("MNPC ohne Environment.\n");
- }
-
- int flags=QueryProp(MNPC_FLAGS);
- if (!(flags & MNPC_WALK))
- return 0;
-
- //ggf. neuen Callout eintragen, bevor irgendwas anderes gemacht wird.
- if ((QueryProp(MNPC_DELAY)+QueryProp(MNPC_RANDOM))>=MAX_MASTER_TIME)
- call_out("CheckWalk", QueryProp(MNPC_DELAY)+random(QueryProp(MNPC_RANDOM)));
-
- // Im Kampf ggf. nicht weitergehen.
- if ((flags & MNPC_NO_WALK_IN_FIGHT) && InFight())
- {
- meet_last_player=time();
- return 1;
- }
-
- // MNPC anhalten, wenn lange kein Spielerkontakt
- if (QueryProp(MNPC_WALK_TIME)+meet_last_player < time()
- && !sizeof(filter(all_inventory(environment()),
- #'query_once_interactive))
- )
- {
- // anhalten und ggf. auch direkt nach Hause gehen.
- Stop(flags & MNPC_GO_HOME_WHEN_STOPPED);
- return 0;
- }
-
- Walk();
return 1;
}
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index 688c1b7..58aecf3 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -78,7 +78,7 @@
closure func = walk_closure;
if (!closurep(func))
{
- func=symbol_function("CheckWalk", previous_object());
+ func=symbol_function("Walk", previous_object());
if (!func)
raise_error("RegisterWalker() call from Object without Walk() function.\n");
}