program wp07zad4;

const
    SCIANY = 6;
    ILE_MAX = 1000;

type
    Plansza = ^Pole;
    Gracze = ^Gracz;
    Pole = record
        co : Char;
        kto : Gracze;
        nr : Integer;
        nast, poprz : Plansza
    end;
    Gracz = record
        imie : String;
        gdzie : Plansza;
        nast : Gracze
    end;

var aktualny, poprzedni : Gracze;
    start, pom : Plansza;
    dozwolone : Integer;

procedure wczytaj;
var atrapa, ostatni : Gracze;
    ostp : Plansza;
    s : String;
    i : Integer;
begin
    new(start);
    start^.nr := 0;
    start^.co := ' ';
    start^.kto := nil;
    start^.poprz := nil;
    new(atrapa);
    atrapa^.nast := nil;
    ostatni := atrapa;
    readln(s);
    while s <> '' do begin
        new(ostatni^.nast);
        ostatni := ostatni^.nast;
        ostatni^.gdzie := start;
        ostatni^.imie := s;
        readln(s)
    end;
    ostatni^.nast := atrapa^.nast;
    poprzedni := ostatni;
    aktualny := atrapa^.nast;
    dispose(atrapa);
    ostp := start;
    i := 1;
    repeat
        new(ostp^.nast);
        ostp^.nast^.poprz := ostp;
        ostp := ostp^.nast;
        ostp^.nr := i;
        i := i + 1;
        read(ostp^.co);
        ostp^.kto := nil
    until ostp^.co = '.';
    ostp^.nast := nil
end;

procedure usunAktualnego;
begin
    if aktualny = poprzedni then begin
        dispose(aktualny);
        aktualny := nil;
        poprzedni := nil
    end else begin
        poprzedni^.nast := aktualny^.nast;
        dispose(aktualny);
        aktualny := poprzedni^.nast
    end;
end;

procedure ruchAktualnego(k : Integer);
begin
    if dozwolone > 0 then begin
        dozwolone := dozwolone - 1;
        aktualny^.gdzie^.kto := nil;
        if k > 0 then
            while (k <> 0) and (aktualny^.gdzie^.nast <> nil) do begin
                k := k - 1;
                aktualny^.gdzie := aktualny^.gdzie^.nast
            end
        else
            while (k <> 0) and (aktualny^.gdzie^.poprz <> nil) do begin
                k := k + 1;
                aktualny^.gdzie := aktualny^.gdzie^.poprz
            end;
        if aktualny^.gdzie^.co = '.' then begin
            writeln(aktualny^.imie, ' konczy gre');
            usunAktualnego
        end else begin
            if aktualny^.gdzie^.co = ' ' then begin
                writeln(aktualny^.imie, ' wraca na pole startowe');
                poprzedni := aktualny;
                aktualny := aktualny^.nast
            end else begin
                writeln(aktualny^.imie, ' wchodzi na pole numer ', aktualny^.gdzie^.nr);
                case aktualny^.gdzie^.co of
                    'z' : begin
                        if aktualny^.gdzie^.kto <> nil then begin
                            if dozwolone > 0 then begin
                                dozwolone := dozwolone - 1;
                                writeln(aktualny^.gdzie^.kto^.imie, ' wraca na pole startowe')
                            end;
                            aktualny^.gdzie^.kto^.gdzie := start
                        end;
                        aktualny^.gdzie^.kto := aktualny;
                        poprzedni := aktualny;
                        aktualny := aktualny^.nast
                    end;
                    'o' :
                        ruchAktualnego(-aktualny^.gdzie^.nr);
                    'p' :
                        ruchAktualnego(-10);
                    'c' :
                        ruchAktualnego(5);
                    'd', 'e' :
                        ruchAktualnego(10);
                    'r' :
                        ruchAktualnego(1 + random(SCIANY));
                    't' :
                        ruchAktualnego(-20);
                    'u' :
                        ruchAktualnego(-5)
                end
            end
        end
    end
end;

begin
    randomize;
    wczytaj;
    dozwolone := ILE_MAX;
    while (aktualny <> nil) and (dozwolone > 0) do
        ruchAktualnego(1 + random(SCIANY));
    while aktualny <> nil do
        usunAktualnego;
    while start <> nil do begin
        pom := start;
        start := start^.nast;
        dispose(pom)
    end
end.
