/* LORD OF HOSTS - misc.c --- Verschiedene Dienstleistungsroutinen */ #include "Lord.h" extern ULONG JoyMouseData; char players[2][16]; extern int status; extern BOOL joymouse_on, joymouse_allowed; struct TRStructure MyTextStruct; void Rules(void) { short result=0; int nr=-1; MyTextStruct.KeyMask=0xFFFF; MyTextStruct.textcolor=1; MyTextStruct.detailcolor = 0; MyTextStruct.blockcolor = 1; MyTextStruct.versionnumber = REQVERSION; MyTextStruct.Timeout = 0; MyTextStruct.AbortMask=0; MyTextStruct.rfu1 = 0; while (result!=1) { if (result==0) ++nr; if (result==2) --nr; switch (nr) { case 0: MyTextStruct.Title="Regeln: Seite 1"; MyTextStruct.PositiveText = "Fertig"; MyTextStruct.NegativeText = "Nächste Seite"; MyTextStruct.MiddleText = NULL; MyTextStruct.Text = " LORD OF HOSTS\n" " =============\n\n" "Jeder Spieler führt sieben Ritter und\n" "einen König (der mit der Krone).\n" "Ziel des Spiels: Den Gegner schlagen,\n" "indem man:\n" " - seinen König fängt oder\n" " - sechs seiner Ritter schlägt.\n\n" "Die Spieler sollten versuchen, die\n" "Steine des Gegners zu schlagen und da-\n" "bei die eigenen zu decken.\n\n\n\n\n\n"; break; case 1: MyTextStruct.Title="Regeln: Seite 2"; MyTextStruct.PositiveText = "Fertig"; MyTextStruct.NegativeText = "Nächste Seite"; MyTextStruct.MiddleText = "Vorige Seite"; MyTextStruct.Text = " Wie man spielt\n\n" "'Spiel beginnen' wählen und Namen der\n" "Spieler eingeben. Der Computer lost\n" "aus, wer das Spiel beginnt\n" "Spieler eins benutzt die Maus zum Be-\n" "wegen des Cursors, Spieler 2 kann ei-\n" "nen Joystick nehmen.\n" "Nach jedem Zug geht die Kontrolle über\n" "den Cursor auf den Gegner über.\n" "Die beiden Felder am rechten Rand des\n" "Bildschirms zeigen die Namen der Spie-\n" "ler an sowie denjenigen der zwei, der\n" "gerade am Zug ist, indem die Worte\n" "'Spieler 1/2' blaugefärbt werden.\n" "Wenn die Worte 'Spieler 1/2' gelbge-\n" "färbt sind, so wartet der Computer auf\n" "die Bestätigung oder Zurücknahme eines\n" "Zuges (siehe auch Seite 9)"; break; case 2: MyTextStruct.Title="Regeln: Seite 3"; MyTextStruct.Text = " Spielzüge\n\n" "Durch einmaliges Maus- oder Joystick-\n" "klicken wählt man den Stein, mit dem\n" "man ziehen will. Die Zahl, die auf dem\n" "Stein steht, gibt an, wieviele Felder\n" "dieser Stein ziehen MUSS. Die Steine\n" "können nur waagrecht oder senkrecht\n" "ziehen (NICHT schräg), man darf aber\n" "einmal pro Zug im rechten Winkel ab-\n" "biegen. Man kann also mit einem Vierer\n" "z.B. 4 Felder geradeaus oder 3 nach\n" "rechts und 1 nach oben ziehen.\n" "Es ist nicht möglich, über andere\n" "Steine hinwegzuziehen. Außerdem kann\n" "man nicht in einem einzigen Zug vor\n" "und wieder zurück ziehen.\n\n"; break; case 3: MyTextStruct.Title="Regeln: Seite 4"; MyTextStruct.Text = " Spielzüge (Forts.)\n\n" "Klicken Sie einmal auf das Feld, auf\n" "das der angewählte Stein ziehen soll. \n" "Ist der Zug gültig, so wird der Stein\n" "dorthin gezogen.Wenn nichts geschieht,\n" "müssen Sie entweder ein anderes Ziel-\n" "feld oder einen anderen Stein wählen. \n" "Der Menüpunkt 'Zugfehler erklären' er-\n" "klärt, warum der Computer sich gewei-\n" "gert hat, einen Zug auszuführen.\n" "Ein Zug ist ungültig, wenn\n" " - man versucht, den Stein zu weit\n" " oder nicht weit genug zu ziehen\n" " - der Weg versperrt ist\n" " - der eigene König in unmittelbarer\n" " Gefahr ist (man muß erst, wie im\n" " Schach, die Gefahr abwenden).\n"; break; case 4: MyTextStruct.Title="Regeln: Seite 5"; MyTextStruct.Text = " Schlagen von Steinen\n\n" "Jeder Spielstein kann einen Ritter des\n" "Gegners schlagen, indem er auf dessen\n" "Feld zieht. Der König kann auf diese\n" "Weise jedoch nicht geschlagen werden.\n" "Wenn ein König auf seinem Feld bedroht\n" "wird, so wird 'Schach' angesagt. Beim\n" "nun folgenden Zug muß der angegriffene\n" "Spieler entweder\n" " - seinen König auf ein sicheres Feld\n" " schieben oder\n" " - den Weg zwischen König und Angrei-\n" " fer mit einem anderen Stein ver-\n" " stellen oder\n" " - den bedrohenden Stein schlagen.\n" "Wenn keine dieser Möglichkeiten mehr\n" "besteht, ist das Spiel vorbei.\n"; break; case 5: MyTextStruct.Title="Regeln: Seite 6"; MyTextStruct.Text = " Das Ende des Spiels\n\n" "Das Spiel ist -wie soeben beschrieben-\n" "vorbei, wenn einer der Spieler keinen\n" "gültigen Zug mehr machen kann.\n" "Eine andere Möglichkeit, das Spiel zu\n" "gewinnen ist, sechs Ritter des Gegners\n" "zu schlagen. Ein König, der nur noch\n" "einen Ritter übrig hat, verliert die\n" "Schlacht.\n\n\n\n\n\n\n\n\n"; break; case 6: MyTextStruct.Title="Regeln: Seite 7"; MyTextStruct.Text = " Erklärung der Menüs (1)\n\n" "SPIEL-Menü:\n" "Spiel beginnen : Los geht's!\n" "Spiel laden : Naja, Spiel laden.\n" "Spiel speichern : Abspeichern des mo-\n" " mentanen Spielstands (einschließlich\n" " des gesamten Spielverlaufs).\n" "Regeln : Was wohl.\n" "Infos : Ein paar Infos über LORD.\n" "Ende : Beenden des Spiels.\n\n\n\n\n\n\n\n"; break; case 7: MyTextStruct.Title="Regeln: Seite 8"; MyTextStruct.Text = " Erklärung der Menüs (2)\n\n" "BRETT-Menü:\n" "Standard : Lord Of Hosts basiert auf\n" " dem Brettspiel 'Shogun'. Dort werden\n" " die Zugwerte der Steine durch kleine\n" " Magnete bestimmt. Diese Einstellung\n" " simuliert das Brett.\n" "Rotiert 90° : Dasselbe Brett um 90°\n" " rotiert (führt zu anderen Zugwertemu-\n" " stern).\n" "Zuf Ausgewogen : Computergeneriertes\n" " Zufallsbrett.Es wird darauf geachtet,\n" " daß jeder Zugwert pro Stein genau\n" " gleich oft vorkommt.\n" "Reiner Zufall : Keine Ausgewogenheit\n" " bei der Werteverteilung.\n\n"; break; case 8: MyTextStruct.Title="Regeln: Seite 9"; MyTextStruct.PositiveText = "Fertig"; MyTextStruct.NegativeText = "Nächste Seite"; MyTextStruct.MiddleText = "Vorige Seite"; MyTextStruct.Text = " Erklärung der Menüs (3)\n" "SPEZIAL-Menü:\n" "Zurücknehmen : Nimmt den letzten Zug\n" " zurück. Bis zu 500 Züge können nach-\n" " einander zurückgenommen werden. Das\n" " geht auch mit geladenen Spielen!\n" "Nachspielen: Spielt einen zurückgenom-\n" " menen Zug wieder nach. Das kann nur\n" " gehen, wenn seit dem letzen 'Zurück'\n" " keine neuen Züge gespielt wurden.\n" "Hilfsmodi : Der Computer kann Hilfen\n" " anbieten : Durch 'Zeige Bekanntes'\n" " gibt der Computer die Zahl an,die der\n" " Stein nach einem Zug haben wird, WENN\n" " ER AUF DIESEM FELD SCHON EINMAL WAR.\n" " 'Zeige Alles' zeigt den neuen Wert\n" " immer an. Entweder man bestätigt den\n" " Zug durch nochmaliges Klicken, oder\n" " wählt ein neues Ziel od. neuen Stein."; break; case 9: MyTextStruct.Title="Regeln: Seite 10"; MyTextStruct.PositiveText = "Fertig"; MyTextStruct.NegativeText = NULL; MyTextStruct.MiddleText = "Vorige Seite"; MyTextStruct.Text = " Eklärung der Menüs (3)\n\n" "SPEZIAL-Menü (Forts.):\n" "JoyMouse : Falls Spieler 2 keinen Joy-\n" " stick zur Cursorsteuerung verwendet,\n" " läßt sich diese Voreinstellung hier\n" " aus- (und wieder an-)schalten.\n" "JoyMouse Speed: Hiermit läßt sich die\n" " Geschwindigkeit der Cursorbewegung\n" " bei aktiver Joysticksteuerung ändern.\n" " Das kann bei Verwendung von Mausbe-\n" " schleunigern hilfreich sein.\n" "Seitenwechsel : Noch nicht implemen-\n" " tiertes Feature für die LORD-Version,\n" " in der man gegen den COMPUTER spielen\n" " kann...\n" "Zugfehler erklären : Es erscheint ein\n" " Requester, der angibt, warum ein Zug\n" " nicht durchgeführt wurde."; break; default: MyTextStruct.Text = NULL; break; } result = TextRequest(&MyTextStruct); } } void About(void) { SimpleRequest( " LORD OF HOSTS V" VERSION "\n" " ==================\n\n" " Programmiert von:\n" " Tim Pietzcker\n" " Schwarzwaldstr.52\n" " W-7819 Denzlingen\n" "Copyright © 1991. All Rights Reserved.\n\n" "Vielen Dank den Entwicklern des Cygnus\n" "Ed Pro (Release 2) für sowohl diesen\n" "Super-Editor als auch die req.library!\n" "Geschrieben in ANSI C (Aztec C V5.0d)\n\n" "Dieses Programm darf frei vertrieben\n" "werden, solange nichts gelöscht wird.\n" "Diese Version darf nur in der PD-Serie\n" "SPIELEKISTE vertrieben werden. Andere\n" "benötigen schriftliche Genehmigung!!"); } void ExplainError(int Error) { char errtext[300]="Der letzte zurückgewiesene Zug war\nungültig, weil\n"; if (!Error) strcpy(errtext,"Kein ungültiger Zug bis jetzt!"); if (Error & DIST_EXCEEDED) strcat(errtext,"\n - der Stein zu weit gezogen wurde"); if (Error & MUST_MOVE_FARTHER) strcat(errtext,"\n - der Stein nicht weit genug kam"); if (Error & WAY_BLOCKED) strcat(errtext,"\n - der Weg versperrt war"); if (Error & KING_IN_DANGER) strcat(errtext,"\n - der König nicht in Gefahr\n gebracht werden darf"); strcat(errtext,"!"); SimpleRequest(errtext); } void SetJMSpeed(void) { struct GetLongStruct MyGetLongStruct; MyGetLongStruct.titlebar = "Neue JoyMouse-Speed:"; MyGetLongStruct.defaultval = (LONG)JoyMouseData; MyGetLongStruct.minlimit = 1; MyGetLongStruct.maxlimit = 10; MyGetLongStruct.window = 0; MyGetLongStruct.versionnumber = REQVERSION; MyGetLongStruct.flags = 0; MyGetLongStruct.rfu2 = 0; if (GetLong(&MyGetLongStruct)) { Forbid(); JoyMouseData=(ULONG)MyGetLongStruct.result; Permit(); } } void EnterNames(void) { do GetString(players[0], "Spieler 1, bitte Namen eingeben:", NULL, 38, 16); while (strchr((const char *)players[0],'%')); do GetString(players[1], "Spieler 2, bitte Namen eingeben:", NULL, 38, 16); while (strchr((const char *)players[1],'%')); drawplayers(players[0],players[1]); } BOOL Coords(SHORT MouseX, SHORT MouseY, UBYTE *x, UBYTE *y) { MouseX-=2; MouseY-=13; if (MouseX<0 || MouseY<0 || MouseX>183 || MouseY>183) return FALSE; *x = MouseX / 23; *y = MouseY / 23; return TRUE; } void Exchange(UBYTE *a, UBYTE *b) { UBYTE c; c = *a; *a = *b; *b = c; } void Notify(int Nr, int occurrence) { char notice[200]; if (occurrence == ENEMY_KNIGHT_BEATEN) return; occurrence &= (~ENEMY_KNIGHT_BEATEN); if (occurrence) { strcpy(notice,players[Nr]); if (occurrence & ENEMY_KING_BEATABLE) { strcat(notice," sagt 'SCHACH!' an"); if (occurrence > ENEMY_KING_BEATABLE) strcat(notice,"\nund"); else strcat(notice, "!\n"); } if (occurrence > ENEMY_KING_BEATABLE) { strcat(notice," gewinnt das Spiel!\n"); if (occurrence & ENEMY_MATED) { strcat(notice,players[1-Nr]); strcat(notice,"s König ist schachmatt!\n"); } if (occurrence & ENEMY_OUT_OF_KNIGHTS) { strcat(notice,players[1-Nr]); strcat(notice," hat sechs Ritter verloren!\n"); } status &=(~(WAITING_FOR_PICK|WAITING_FOR_DEST|WAITING_FOR_CONF|IN_GAME)); NextPlayer(RED); /* schaltet JoyMouse aus und setzt Farben zurück */ } SimpleRequest(notice); } } void NextPlayer(BOOL who) { if (who == RED) { if (joymouse_on) swapjoymouse(FALSE); if (status & IN_GAME) DrawText(9,JAM1,219,16,"Spieler 1"); else DrawText(1,JAM1,219,16,"Spieler 1"); DrawText(1,JAM1,219,49,"Spieler 2"); } else { /* who == WHITE */ if (joymouse_allowed && !joymouse_on) swapjoymouse(TRUE); DrawText(1,JAM1,219,16,"Spieler 1"); if (status & IN_GAME) DrawText(9,JAM1,219,49,"Spieler 2"); else DrawText(1,JAM1,219,49,"Spieler 2"); } }