Start Info Community Spielen
 
 

Morgengrauner Dokumentation

Dateipfad: /home/mud/mudlib/doc//wiz/teamkampf_intern

Teamkampf-Interna
=================

Verwaltung der Kampfreihen
--------------------------

Die Umordnung der Teammitglieder wird durch die Formation gesteuert.

  formin[reihe] - Minimale Anzahl von Teammitgliedern in dieser Reihe
  formax[reihe] - Maximale Anzahl von Teammitgliedern in dieser Reihe

Die Funktion CheckFormation() passt die Werte so an, dass sie bei Anwesenheit
aller Teammitglieder erfuellbar sind, wobei ggf. der Maximalwert vorne
anfangend erhoeht wird und der Minimalwert hinten anfangend verringert wird.
Dabei ist der Minimalwert der ersten Reihe 1.

Es ist zwischen der Teamaufstellung und der Raumaufstellung zu unterscheiden.
Die Teamaufstellung ist die Aufstellung, in der die Mitglieder angeordnet
waeren, wenn alle anwesend waeren. In der Teamaufstellung ist durch die
Funktion MakeFormation() sichergestellt, dass die Minimal- und
Maximalanforderungen erfuellt sind.
Die Raumaufstellung ergibt sich aus den anwesenden Mitgliedern der
Teamaufstellung. Sollten die Minimalanforderungen einer vorderen Reihe nicht
erfuellt sein, werden anwesende Mitglieder aus den hinteren Reihen IN DER
RAUMAUFSTELLUNG nach vorne geschoben soweit noetig.

Vor Verschiebungen und bei Updates der TEAMAUFSTELLUNG werden die Arrays mit
den Mitgliedern jeder Reihe sortiert, wobei die gewuenschte Reihe der
Mitglieder das groesste Gewicht (125) im Sortierkriterium hat und die Anzahl
der Lebenspunkte einfach eingeht. Solange die Teammitglieder unter 250 LP
haben, kann ein Mitglied mit wenigen LP hinter einem mit vielen LP einsortiert
sein, der EINE Reihe weiter hinter stehen will, aber nicht zwei oder mehr.
Wird es noetig, Mitglieder aus einer Reihe in eine andere zu verschieben,
werden Mitglieder vom Anfang des Arrays nach vorne verschoben (an das Ende
des davorliegenden Arrays) bzw. Mitglieder vom Ende des Arrays nach hinten
(an den Anfang des dahinterliegenden Arrays). Dadurch werden immer die
Mitglieder mit dem staerksten Drang nach vorne an die Front geschickt :-)

Wenn jemand die Reihe wechselt und dabei die Minimalanforderung der Quellreihe
unterschritten oder die Maximalanforderung der Zielreihe ueberschritten wird,
wird mit CycleRows() rotiert. Kommt ein neues Mitglied hinzu und die
Maximalanforderung seiner gewuenschten Reihe wuerde ueberschritten, wird
in AddToRow() zunaechst versucht ein Mitglied eine Reihe vorzuschieben, falls
da noch Platz ist, sonst eine Reihe zurueck, falls da noch Platz ist (die
Anzahl der Mitglieder also < formax ist). Wird ein Mitglied entfernt oder
gewaltsam entfernt und wuerde dabei die Minimalanforderung seiner Reihe
unterschritten, wird in RemoveFromRow() versucht, ein Mitglied aus der
nachfolgenden Reihe nach vorne zu holen, falls dort Ueberschuss vorhanden ist
(in der nachfolgenden Reihe also mehr Mitglieder als formin sind), sonst aus
der vorangehenden Reihe, falls dort Ueberschuss ist.

Sollten diese Umordnungen nicht ausreichen die Formation in der
TEAMAUFSTELLUNG einzuhalten, wird die Formation mit MakeFormation() erzwungen.
Dies wird in zwei Durchlaeufen erreicht. Der erste Durchlauf wird von vorne
nach hinten durchgefuehrt. Ist das Maximum einer Reihe ueberschritten, werden
soviele Mitglieder nach vorne geschoben wie in der davorliegenden Reihe freie
Plaetze sind und die restlichen ueberschuessigen Mitglieder nach hinten. Sollte
das Minimum einer Reihe unterschritten sein, werden soviele Mitglieder aus den
nachfolgenden Reihen hergeholt, wie zum Erreichen des Minimums noetig ist. Der
zweite Durchlauf wird von hinten nach vorne ausgefuehrt. Falls das Minimum
einer Reihe unterschritten wird, werden Mitglieder aus den davorliegenden
Reihen geholt soweit noetig, wenn jedoch Ueberschuss vorhanden ist, wird
dieser nach vorne geschoben.

BEISPIEL:

Formation 3-6 2-2 1-2 0-6 1-1 (bloedsinnige Formation ;-)

1. Durchlauf (vorne beginnend):

   1 1 6 1 0
   <----     (Minimum Reihe 1 unterschritten)
   3 0 5 1 0
     <--     (Minimum Reihe 2 unterschritten)
   3 2 3 1 0
       -->   (Maximum Reihe 3 ueberschritten)
   3 2 2 2 0

2. Durchlauf (hinten beginnend):

   3 2 2 2 0
         --> (Minimum Reihe 5 unterschritten)
   3 2 2 1 1

Ergebnis entspricht der gewuenschten Formation. Ermittlung der RAUMaufstellung:

   2 0 2 1 1 (Anwesende aus der vorangegangenen TEAMaufstellung)
   <----
   3 0 1 1 1
     <----
   3 2 0 0 1
       <----
   3 2 1 0 0

Ergebnis erfuellt Minimalanforderungen zumindest vorne, Maximalanforderungen
koennen nicht ueberschritten werden, weil die Raumaufstellung hoechstens
soviele Mitglieder wie die Teamaufstellung hat.


Abarbeitung des Angriffsbefehls und Verteilung der Begruessungsschlaege
-----------------------------------------------------------------------
Das Grundprinzip ist folgendes:
Wenn das ganze Team bewegt wird, werden die Begruessungsschlaege unter
Vorbehalt weggelassen. Sobald alle Teammitglieder bewegt wurden, macht
jedes Monster, das noch einen Begruessungsschlag ausfuehren muss, einen
Schlag auf EIN Teammitglied das im Nahkampf erreichbar ist und der Vorbehalt
wird fuer alle Mitglieder aufgehoben. Wenn ein Teammitglied versucht
sich zu bewegen und noch ein Begruessungsschlag unter Vorbehalt fehlt,
wird dieser noch vor der Bewegung nachgeholt.


SIEHE AUCH:
        Uebersicht: teamkampf
        Properties: P_TEAM, P_ASSOC_MEMBERS, P_TEAM_ATTACK_CMD,
                    P_TEAM_AUTOFOLLOW, P_TEAM_COLORS, P_TEAM_LEADER,
                    P_TEAM_NEWMEMBER, P_TEAM_WANTED_ROW, P_TEAM_WIMPY_ROW
        Bewegung:   IsTeamMove, TeamFlee
        Mitglieder: IsTeamLeader, TeamMembers
        Kampf:      AssocMember, DeAssocMember, InsertEnemyTeam,
                    SelectNearEnemy, SelectFarEnemy
        Positionen: PresentPosition, PresentRows, PresentEnemyRows,
                    PresentTeamPosition, SwapRows
        Sonstiges:  TeamPrefix


---------------------------------------------------------------------------- Last modified: 16-08-2010, Gabylon


zurück zur Übersicht

FEEDBACK | IMPRESSUM | DATENSCHUTZ 1992–2019 © MorgenGrauen. Alle Rechte vorbehalten.