MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | |
| 2 | Teamkampf-Interna |
| 3 | ================= |
| 4 | |
| 5 | Verwaltung der Kampfreihen |
| 6 | -------------------------- |
| 7 | |
| 8 | Die Umordnung der Teammitglieder wird durch die Formation gesteuert. |
| 9 | |
| 10 | formin[reihe] - Minimale Anzahl von Teammitgliedern in dieser Reihe |
| 11 | formax[reihe] - Maximale Anzahl von Teammitgliedern in dieser Reihe |
| 12 | |
| 13 | Die Funktion CheckFormation() passt die Werte so an, dass sie bei Anwesenheit |
| 14 | aller Teammitglieder erfuellbar sind, wobei ggf. der Maximalwert vorne |
| 15 | anfangend erhoeht wird und der Minimalwert hinten anfangend verringert wird. |
| 16 | Dabei ist der Minimalwert der ersten Reihe 1. |
| 17 | |
| 18 | Es ist zwischen der Teamaufstellung und der Raumaufstellung zu unterscheiden. |
| 19 | Die Teamaufstellung ist die Aufstellung, in der die Mitglieder angeordnet |
| 20 | waeren, wenn alle anwesend waeren. In der Teamaufstellung ist durch die |
| 21 | Funktion MakeFormation() sichergestellt, dass die Minimal- und |
| 22 | Maximalanforderungen erfuellt sind. |
| 23 | Die Raumaufstellung ergibt sich aus den anwesenden Mitgliedern der |
| 24 | Teamaufstellung. Sollten die Minimalanforderungen einer vorderen Reihe nicht |
| 25 | erfuellt sein, werden anwesende Mitglieder aus den hinteren Reihen IN DER |
| 26 | RAUMAUFSTELLUNG nach vorne geschoben soweit noetig. |
| 27 | |
| 28 | Vor Verschiebungen und bei Updates der TEAMAUFSTELLUNG werden die Arrays mit |
| 29 | den Mitgliedern jeder Reihe sortiert, wobei die gewuenschte Reihe der |
| 30 | Mitglieder das groesste Gewicht (125) im Sortierkriterium hat und die Anzahl |
| 31 | der Lebenspunkte einfach eingeht. Solange die Teammitglieder unter 250 LP |
| 32 | haben, kann ein Mitglied mit wenigen LP hinter einem mit vielen LP einsortiert |
| 33 | sein, der EINE Reihe weiter hinter stehen will, aber nicht zwei oder mehr. |
| 34 | Wird es noetig, Mitglieder aus einer Reihe in eine andere zu verschieben, |
| 35 | werden Mitglieder vom Anfang des Arrays nach vorne verschoben (an das Ende |
| 36 | des davorliegenden Arrays) bzw. Mitglieder vom Ende des Arrays nach hinten |
| 37 | (an den Anfang des dahinterliegenden Arrays). Dadurch werden immer die |
| 38 | Mitglieder mit dem staerksten Drang nach vorne an die Front geschickt :-) |
| 39 | |
| 40 | Wenn jemand die Reihe wechselt und dabei die Minimalanforderung der Quellreihe |
| 41 | unterschritten oder die Maximalanforderung der Zielreihe ueberschritten wird, |
| 42 | wird mit CycleRows() rotiert. Kommt ein neues Mitglied hinzu und die |
| 43 | Maximalanforderung seiner gewuenschten Reihe wuerde ueberschritten, wird |
| 44 | in AddToRow() zunaechst versucht ein Mitglied eine Reihe vorzuschieben, falls |
| 45 | da noch Platz ist, sonst eine Reihe zurueck, falls da noch Platz ist (die |
| 46 | Anzahl der Mitglieder also < formax ist). Wird ein Mitglied entfernt oder |
| 47 | gewaltsam entfernt und wuerde dabei die Minimalanforderung seiner Reihe |
| 48 | unterschritten, wird in RemoveFromRow() versucht, ein Mitglied aus der |
| 49 | nachfolgenden Reihe nach vorne zu holen, falls dort Ueberschuss vorhanden ist |
| 50 | (in der nachfolgenden Reihe also mehr Mitglieder als formin sind), sonst aus |
| 51 | der vorangehenden Reihe, falls dort Ueberschuss ist. |
| 52 | |
| 53 | Sollten diese Umordnungen nicht ausreichen die Formation in der |
| 54 | TEAMAUFSTELLUNG einzuhalten, wird die Formation mit MakeFormation() erzwungen. |
| 55 | Dies wird in zwei Durchlaeufen erreicht. Der erste Durchlauf wird von vorne |
| 56 | nach hinten durchgefuehrt. Ist das Maximum einer Reihe ueberschritten, werden |
| 57 | soviele Mitglieder nach vorne geschoben wie in der davorliegenden Reihe freie |
| 58 | Plaetze sind und die restlichen ueberschuessigen Mitglieder nach hinten. Sollte |
| 59 | das Minimum einer Reihe unterschritten sein, werden soviele Mitglieder aus den |
| 60 | nachfolgenden Reihen hergeholt, wie zum Erreichen des Minimums noetig ist. Der |
| 61 | zweite Durchlauf wird von hinten nach vorne ausgefuehrt. Falls das Minimum |
| 62 | einer Reihe unterschritten wird, werden Mitglieder aus den davorliegenden |
| 63 | Reihen geholt soweit noetig, wenn jedoch Ueberschuss vorhanden ist, wird |
| 64 | dieser nach vorne geschoben. |
| 65 | |
| 66 | BEISPIEL: |
| 67 | |
| 68 | Formation 3-6 2-2 1-2 0-6 1-1 (bloedsinnige Formation ;-) |
| 69 | |
| 70 | 1. Durchlauf (vorne beginnend): |
| 71 | |
| 72 | 1 1 6 1 0 |
| 73 | <---- (Minimum Reihe 1 unterschritten) |
| 74 | 3 0 5 1 0 |
| 75 | <-- (Minimum Reihe 2 unterschritten) |
| 76 | 3 2 3 1 0 |
| 77 | --> (Maximum Reihe 3 ueberschritten) |
| 78 | 3 2 2 2 0 |
| 79 | |
| 80 | 2. Durchlauf (hinten beginnend): |
| 81 | |
| 82 | 3 2 2 2 0 |
| 83 | --> (Minimum Reihe 5 unterschritten) |
| 84 | 3 2 2 1 1 |
| 85 | |
| 86 | Ergebnis entspricht der gewuenschten Formation. Ermittlung der RAUMaufstellung: |
| 87 | |
| 88 | 2 0 2 1 1 (Anwesende aus der vorangegangenen TEAMaufstellung) |
| 89 | <---- |
| 90 | 3 0 1 1 1 |
| 91 | <---- |
| 92 | 3 2 0 0 1 |
| 93 | <---- |
| 94 | 3 2 1 0 0 |
| 95 | |
| 96 | Ergebnis erfuellt Minimalanforderungen zumindest vorne, Maximalanforderungen |
| 97 | koennen nicht ueberschritten werden, weil die Raumaufstellung hoechstens |
| 98 | soviele Mitglieder wie die Teamaufstellung hat. |
| 99 | |
| 100 | |
| 101 | Abarbeitung des Angriffsbefehls und Verteilung der Begruessungsschlaege |
| 102 | ----------------------------------------------------------------------- |
| 103 | Das Grundprinzip ist folgendes: |
| 104 | Wenn das ganze Team bewegt wird, werden die Begruessungsschlaege unter |
| 105 | Vorbehalt weggelassen. Sobald alle Teammitglieder bewegt wurden, macht |
| 106 | jedes Monster, das noch einen Begruessungsschlag ausfuehren muss, einen |
| 107 | Schlag auf EIN Teammitglied das im Nahkampf erreichbar ist und der Vorbehalt |
| 108 | wird fuer alle Mitglieder aufgehoben. Wenn ein Teammitglied versucht |
| 109 | sich zu bewegen und noch ein Begruessungsschlag unter Vorbehalt fehlt, |
| 110 | wird dieser noch vor der Bewegung nachgeholt. |
| 111 | |
| 112 | |
| 113 | SIEHE AUCH: |
| 114 | Uebersicht: teamkampf |
| 115 | Properties: P_TEAM, P_ASSOC_MEMBERS, P_TEAM_ATTACK_CMD, |
| 116 | P_TEAM_AUTOFOLLOW, P_TEAM_COLORS, P_TEAM_LEADER, |
| 117 | P_TEAM_NEWMEMBER, P_TEAM_WANTED_ROW, P_TEAM_WIMPY_ROW |
| 118 | Bewegung: IsTeamMove, TeamFlee |
| 119 | Mitglieder: IsTeamLeader, TeamMembers |
| 120 | Kampf: AssocMember, DeAssocMember, InsertEnemyTeam, |
| 121 | SelectNearEnemy, SelectFarEnemy |
| 122 | Positionen: PresentPosition, PresentRows, PresentEnemyRows, |
| 123 | PresentTeamPosition, SwapRows |
| 124 | Sonstiges: TeamPrefix |
| 125 | |
| 126 | ---------------------------------------------------------------------------- |
| 127 | Last modified: 16-08-2010, Gabylon |