| |
| 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 |