Direkten Zugriff auf P_DEFENDERS entfernt
Defend() benutzt jetzt die Zugriffsfunktionen.
Die Datenstruktur wurde bisher im Defend() bereinigt. Um auf einen
reset() in allen Spielern zu verzichten, wird die Bereinigung jetzt von
AddDefender() und RemoveDefender() übernommen.
Change-Id: I1b990f7d0c71bcf21e024abd48678ec6e14e4c13
diff --git a/std/living/combat.c b/std/living/combat.c
index 2b05440..6a992f7 100644
--- a/std/living/combat.c
+++ b/std/living/combat.c
@@ -862,6 +862,7 @@
return;
object* defs = QueryProp(P_DEFENDERS) || ({});
+ defs -= ({0});
if(friend in defs)
return;
@@ -876,6 +877,7 @@
return;
object* defs = QueryProp(P_DEFENDERS) || ({});
+ defs -= ({0});
if(!(friend in defs))
return;
@@ -1061,73 +1063,55 @@
}
}
- // Man kann Verteidiger haben. Diese kommen als erste zum Zuge
- if ( res=QueryProp(P_DEFENDERS) )
- { object *defs,*defs_here;
+ // Man kann Verteidiger haben. Diese kommen als erste zum Zuge, falls sie
+ // anwesend sind.
+ object* defs_here = QueryPresentDefenders();
+ if (sizeof(defs_here))
+ {
+ // Die werden erstmal alle informiert.
+ defs_here->InformDefend(enemy);
+ // Leider koennten dabei Objekte zerstoert worden sein. *seufz*
+ defs_here -= ({0});
- defs=({});
- defs_here=({});
- if ( !pointerp(res) )
- res=({res});
- // erst alle anwesenden finden.
- foreach(object defender: res) {
- if ( objectp(defender) && (member(defs,defender)<0) )
- {
- defs+=({defender});
- // Verteidiger muessen im gleichen Raum oder im Living selber
- // enthalten sein.
- if ( environment(defender) == environment()
- || environment(defender) == ME)
- {
- call_other(defender,"InformDefend",enemy);
- if (defender)
- defs_here += ({ defender });
- }
- }
- }
- //Anwesende Verteidiger eintragen.
- spell[EINFO_DEFEND][PRESENT_DEFENDERS]=defs_here;
+ // Anwesende Verteidiger eintragen.
+ spell[EINFO_DEFEND][PRESENT_DEFENDERS] = defs_here;
- // P_DEFENDERS auch gleich aktualisieren
- if ( sizeof(defs)<1 )
- defs=0;
- SetProp(P_DEFENDERS,defs);
-
- if ( spell[SP_PHYSICAL_ATTACK] ) {
- // Bei physischen Angriffen nur Verteidiger aus Reihe 1
- // nehmen (z.B. fuer Rueckendeckung)
- foreach(object defender: defs_here) {
- if ( (defender->PresentPosition())>1 ) {
- defs_here-=({defender});
- }
- }
+ // Bei physischen Angriffen koennen nur Verteidiger aus Reihe 1 helfen
+ // (z.B. fuer Rueckendeckung der Kaempfer)
+ if(spell[SP_PHYSICAL_ATTACK])
+ {
+ defs_here = QueryNearDefenders(defs_here);
}
- if ( (i=sizeof(defs_here)) )
+ if(sizeof(defs_here))
{
- mixed edefendtmp=({defs_here[random(i)],0,0,0});
- res=call_other(edefendtmp[DEF_DEFENDER],"DefendOther",
- dam,dam_type,spell,enemy);
- if ( pointerp(res) && (sizeof(res)>=3) && intp(res[0])
+ // Wenn in Frage kommende Verteidiger anwesend sind, einen davon
+ // auswaehlen...
+ <object|int|string*|mapping>* edefendtmp = ({defs_here[random(sizeof(defs_here))], 0, 0, 0});
+ // ... und DefendOther() darin rufen. Das wirkt wie ein Defend-Hook-Light
+ res = call_other(edefendtmp[DEF_DEFENDER], "DefendOther",
+ dam, dam_type, spell, enemy);
+ // Wenn das Defender valide Daten geliefert hat und den Schaden oder
+ // Schadenstyp geaendert hat (z.B. Umwandlung von Feuer nach Eis),
+ // werden die neuen Daten uebernommen.
+ if(pointerp(res) && (sizeof(res)>=3) && intp(res[0])
&& pointerp(res[1]))
{
- // Helfer koennen den Schaden oder Schadenstyp aendern,
- // z.B. Umwandlung von Feuer nach Eis oder so...
- dam=res[0];
- edefendtmp[DEF_DAM]=dam;
- dam_type=res[1];
- edefendtmp[DEF_DAMTYPE]=dam_type;
-
- if ( mappingp(res[2]) )
+ dam = res[0];
+ edefendtmp[DEF_DAM] = dam;
+ dam_type = res[1];
+ edefendtmp[DEF_DAMTYPE] = dam_type;
+ if(mappingp(res[2]))
{
- spell=res[2];
+ spell = res[2];
// teuer, aber geht nicht anders (Rekursion vermeiden)
- edefendtmp[DEF_SPELL]=deep_copy(res[2]);
+ edefendtmp[DEF_SPELL] = deep_copy(res[2]);
}
- spell[EINFO_DEFEND][CURRENT_DAMTYPE]=dam_type;
- spell[EINFO_DEFEND][CURRENT_DAM]=dam;
+ // Die Werte sind jetzt auch die aktuell wirksamen Werte.
+ spell[EINFO_DEFEND][CURRENT_DAMTYPE] = dam_type;
+ spell[EINFO_DEFEND][CURRENT_DAM] = dam;
}
- spell[EINFO_DEFEND][DEFENDING_DEFENDER]=edefendtmp;
+ spell[EINFO_DEFEND][DEFENDING_DEFENDER] = edefendtmp;
}
} // Ende Defender-Verarbeitung