Znaki oraz kolor, jak widać, znikąd (C++)

Witam.

Otóż jak niektórzy mogą wiedzieć z mojego poprzedniego tematu, chcę zrobić grę strategiczną w konsoli.

W tej chwili chciałem się zająć mapą, a dokładnie faktem jej wyświetlania. (z tego powodu sama mapa to w tej chwili krata rodem z obciachowej koszuli) Tak jak wtedy, zrobiłem osobny program w celu przetestowania, czy to działa.

Chciałem otoczyć ją takimi “belkami”, jednak to się pojawia problem.

Po prostu pokażę screen, bo ciężko to wytłumaczyć.

 

8z1e88.jpg

 

Robiłem już z tym kodem chyba wszystko, ale nie mam pojęcia, jak to naprawić…

#include iostream
#include windows.h
#include conio.h
#include fstream
#include "klasy.h"

using namespace std;

Pole mapa[260][260];

void kolor(string fore, string bck)
{
    HANDLE h;
    h = GetStdHandle(STD_OUTPUT_HANDLE);

    int tekst=0, tlo=0;

    if(fore=="black") tekst = 0;
    if(fore=="blue") tekst = 1;
    if(fore=="green") tekst = 2;
    if(fore=="cyan") tekst = 3;
    if(fore=="red") tekst = 4;
    if(fore=="violet") tekst = 5;
    if(fore=="gold") tekst = 6;
    if(fore=="white") tekst = 7;

    if(fore=="gray") tekst = 8;

    if(fore=="lblue") tekst = 9;
    if(fore=="lgreen") tekst = 10;
    if(fore=="lcyan") tekst = 11;
    if(fore=="lred") tekst = 12;
    if(fore=="lviolet") tekst = 13;
    if(fore=="lgold") tekst = 14;
    if(fore=="lwhite") tekst = 15;


    if(bck=="black") tlo = 0;
    if(bck=="blue") tlo = 1;
    if(bck=="green") tlo = 2;
    if(bck=="cyan") tlo = 3;
    if(bck=="red") tlo = 4;
    if(bck=="violet") tlo = 5;
    if(bck=="gold") tlo = 6;
    if(bck=="white") tlo = 7;

    if(bck=="gray") tlo = 8;

    if(bck=="lblue") tlo = 9;
    if(bck=="lgreen") tlo = 10;
    if(bck=="lcyan") tlo = 11;
    if(bck=="lred") tlo = 12;
    if(bck=="lviolet") tlo = 13;
    if(bck=="lgold") tlo = 14;
    if(bck=="lwhite") tlo = 15;

    SetConsoleTextAttribute(h, tekst+16*tlo);
}

void utworz_mape()
{
    for(int i=0; i260; i++)
    {
        for(int j=0; j260; j++)
        {
            if(j%2==0)
            {
                mapa[i][j].znak = 'Û';
                mapa[i][j].kolor = 'h';
            }
            else if(i%2==0)
            {
                mapa[i][j].znak = '°';
                mapa[i][j].kolor = 'r';
            }
            else
            {
                mapa[i][j].znak = '±';
                mapa[i][j].kolor = 'b';
            }
        }
    }
}

void malujznak(char litera, char znak)
{
    string koloreg;

    if(litera=='b') koloreg = "lblue";
    if(litera=='g') koloreg = "lgreen";
    if(litera=='w') koloreg = "lwhite";
    if(litera=='r') koloreg = "lred";
    if(litera=='y') koloreg = "lgold";
    if(litera=='s') koloreg = "lcyan";
    if(litera=='p') koloreg = "lviolet";
    if(litera=='d') koloreg = "gold";
    if(litera=='h') koloreg = "white";

    kolor(koloreg, "black");
    cout znak;
}

bool czytaj_pionowa_belke(Belka_pion belka, const char* plikz, const char* plikzk)
{
    fstream plik;

    bool belki=false, belkik=false;

    plik.open(plikz, ios_base::in);

    if(plik.good()==true)
    {
        for(int i=0; i269; i++)
        {
            for(int j=0; j9; j++)
            {
                plik belka.belka[i][j];
            }
        }
        belki = true;
    }

    plik.open(plikzk, ios_base::in);

    if(plik.good()==true)
    {
        plik belka.kolor;
        belkik = true;
    }

    if((belki==true)(belkik==true)) return true;
    else return false;
}

void pokaz_mape()
{
    int x=0, y=0;

    char opcja;

    Belka_pion lewabelka;

    czytaj_pionowa_belke(lewabelka, "txt/lewabelka.txt", "txt/lewabelkakolor.txt");

    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD NumInputs = 0;
    DWORD InputsRead = 0;

    INPUT_RECORD irInput;

    while(true)
    {
        GetNumberOfConsoleInputEvents(hInput, NumInputs);

        system("cls");

        for(int i=y; iy+21; i++)
        {
            for(int j=x; jx+51; j++)
            {
                if((i==y+10)(j==x+25))
                {
                    kolor("lgold", "black");
                    cout "+";
                }
                else
                {
                    if((i260)(j260)(i=0)(j=0)) malujznak(mapa[i][j].kolor, mapa[i][j].znak);
                    else if((j==-1)(i259+5))
                    {
                        kolor(lewabelka.kolor, "black");
                        malujznak('g', lewabelka.belka[i+6][0]);
                        malujznak('g', lewabelka.belka[i+6][1]);
                        malujznak('g', lewabelka.belka[i+6][2]);
                        malujznak('g', lewabelka.belka[i+6][3]);
                        malujznak('g', lewabelka.belka[i+6][4]);

                    }
                    else
                    {
                        kolor("gray", "black");
                        cout '±';
                    }

                } //else
            } //for (int j)
            cout endl;
        } //for (int i)
        kolor("lwhite", "blue");
        cout "y: " y " x: " x endl;
        cout "y+: " y+10 " x+: " x+25 endl;
        kolor("lwhite", "black");
        opcja = getch();

        ReadConsoleInput(hInput, irInput, 1, InputsRead);

        switch(opcja)
        {
            case 'a':
            {
                if(x-50) x--;
                break;
            }
            case 'd':
            {
                if(x259) x++;
                break;
            }
            case 'w':
            {
                if(y-20) y--;
                break;
            }
            case 's':
            {
                if(y259) y++;
                break;
            }
            default:
            {
                ;
            }
        }//switch

        switch(irInput.Event.KeyEvent.wVirtualKeyCode)
        {
            case VK_LEFT:
            {
                if(x-10=-50) x = x-10;
                break;
            }
            case VK_RIGHT:
            {
                if(x+10=259) x = x+10;
                break;
            }
            case VK_UP:
            {
                if(y-10=-20) y = y-10;
                break;
            }
            case VK_DOWN:
            {
                if(y+10=259) y = y+10;
                break;
            }
        }
    }//while
}

int main()
{
    utworz_mape();
    pokaz_mape();

    return 0;
}

To jest plik klasy.h:

#ifndef krajez
#define krajez
 
#include iostream
#include vector
 
using namespace std;
 
struct Pole
{
    char znak;
    char kolor;
};
 
struct Belka_pion
{
    char belka[269][9];
    string kolor;
};
 
struct Belka_poziom
{
    char belka[5][269];
    string kolor;
};
 
#endif // krajez

Tak wygląda lewabelka.txt:

ŰŰŰŰŰŰŰŰŰ
۱ŰŰŰŰŰŰŰ
۱ŰŰŰ۱ŰŰ
Ű۱۱Ű۱Ű
Ű۱۱Ű۱Ű
۱±±ŰŰŰ±Ű 
۱۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
Ű۱۱ŰŰŰŰ 
۱Ű۱±ŰŰŰ 
±±ŰŰ۱ŰŰŰ 
±Ű±±Ű±ŰŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű۱Ű۱ŰŰ 
۱ŰŰ۱ŰŰŰ 
۱Ű۱±ŰŰŰ 
۱±Ű±Ű±ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱±ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱Ű۱ŰŰ 
Ű۱±Ű۱ŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱ŰŰŰ±Ű 
ŰŰ۱ŰŰŰ±Ű 
Ű۱ŰŰŰŰ±Ű 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
Ű۱Ű۱±ŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱±Ű±ŰŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
Ű۱Ű۱±ŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱±Ű±ŰŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
۱ŰŰŰŰŰŰŰ 
۱ŰŰŰ۱ŰŰ 
Ű۱۱ŰŰ±Ű 
Ű۱۱ŰŰ±Ű 
۱±±ŰŰŰ±Ű 
۱۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
Ű۱۱ŰŰŰŰ 
۱Ű۱±ŰŰŰ 
±±ŰŰ۱ŰŰŰ 
±Ű±±Ű±ŰŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű۱Ű۱ŰŰ 
۱ŰŰ۱ŰŰŰ 
۱Ű۱±ŰŰŰ 
۱±Ű±Ű±ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱±ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱Ű۱ŰŰ 
Ű۱±Ű۱ŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱ŰŰŰ±Ű 
ŰŰ۱ŰŰŰ±Ű 
Ű۱ŰŰŰŰ±Ű 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
Ű۱Ű۱±ŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱±Ű±ŰŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
Ű۱ŰŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
Ű۱Ű۱±ŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱±Ű±ŰŰŰ 
Ű۱Ű۱ŰŰŰ 
Ű۱ŰŰ۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
۱ŰŰŰŰŰŰŰ 
۱ŰŰŰ۱ŰŰ 
Ű۱۱ŰŰ±Ű 
Ű۱۱ŰŰ±Ű 
۱±±ŰŰŰ±Ű 
۱۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
Ű۱۱ŰŰŰŰ 
۱Ű۱±ŰŰŰ 
±±ŰŰ۱ŰŰŰ 
±Ű±±Ű±ŰŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű۱Ű۱ŰŰ 
۱ŰŰ۱ŰŰŰ 
۱Ű۱±ŰŰŰ 
۱±Ű±Ű±ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱±ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰŰŰŰŰ 
۱ŰŰŰŰŰŰŰ 
۱ŰŰŰ۱ŰŰ 
Ű۱۱ŰŰ±Ű 
Ű۱۱ŰŰ±Ű 
۱±±ŰŰŰ±Ű 
۱۱Ű۱ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
Ű۱۱ŰŰŰŰ 
۱Ű۱±ŰŰŰ 
±±ŰŰ۱ŰŰŰ 
±Ű±±Ű±ŰŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű±Ű±Ű±ŰŰ 
±Ű۱Ű۱ŰŰ 
۱ŰŰ۱ŰŰŰ 
۱Ű۱±ŰŰŰ 
۱±Ű±Ű±ŰŰ 
ŰŰ۱Ű۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱ŰŰŰ 
ŰŰŰŰ۱±ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰŰŰŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱ŰŰŰŰŰ 
ŰŰ۱±ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰ۱ŰŰŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
ŰŰŰŰŰ۱ŰŰ 
Ű۱Ű۱±ŰŰ  
Ű۱Ű۱ŰŰŰ  
Ű۱±Ű±ŰŰŰ  
Ű۱Ű۱ŰŰŰ  
Ű۱ŰŰ۱ŰŰ  

A plik lewabelkakolor.txt zawiera jedną linijkę:

gold

 

Dodam też, że wciąż się uczę programować i nie chciałbym napisanego od początku gotowca, tak jak go dostałem w poprzednim temacie. Poprzez dostawanie gotowców nic się nie nauczę, oraz nadal nie wiem, co było nie tak w tamtym kodzie.

Wolałbym raczej wyjaśnienie, co powoduje problem, gdyż sam się nie mogę tego dopatrzeć…

Funkcja czytaj_pionowa_belke przyjmuje Belka_pion belka przez wartość , czyli przy wywoływaniu funkcji tworzona jest kopia przekazywanego obiektu, funkcja zapisuje do tej kopii, co w żaden sposób nie wpływa na oryginał.

Gdybyś przyjmował ten argument przez referencję (Belka_pion & belka) to nie byłaby tworzona kopia, tylko funkcja działałaby na oryginalnym obiekcie.

Przykład ilustrujący różnicę między przekazywaniem przez wartość, a przez referencję: :arrow: http://ideone.com/9vTU79

Dodatkowo mógłbyś dodać jakiś komunikat gdy nie uda się wczytać danych z pliku, żeby wiedzieć czy na pewno zostały wczytane.

Aż takiego wytłumaczenia nie potrzebowałem. :wink:

Wiem, co to referencje, po prostu zapomniałem, że tak napisana funkcja pracuje na kopii… Jak to takie szczegóły umykają…

Wyłapałem trochę innych problemów w kodzie, np. sposób wyświetlania belek. Już się tym pozajmowałem…

Co to komunikatu, to wywołania tych funkcji miały być w if-ach, tylko że o tym również zapomniałem.

Tylko jest problem z wczytywaniem. Funkcja nie może wczytać belek… patrz: edit

Dodałem do kodu funkcji masę coutów, żeby zobaczyć, gdzie pojawia się problem. Wychodzi na to, że jest problem z wczytaniem pliku z kolorem. (który się trochę zmienił)

Jestem absolutnie pewien, że nazwy plików się zgadzają, (bo je kopiowałem) nie za bardzo wiem, gdzie jest problem.

W kodzie zmieniło się też trochę rzeczy.

 

main.cpp:

http://www.wklej.org/id/1550672/

 

klasy.cpp:

http://www.wklej.org/id/1550674/

 

lewabelka.txt i prawabelka.txt (są takie same)

http://www.wklej.org/id/1550676/

 

lewabelkakolor.txt i prawabelkakolor.txt:

http://www.wklej.org/id/1550678/

 

gornabelka.txt i dolnabelka.txt:

http://www.wklej.org/id/1550682/

 

gornabelkakolor.txt i dolnabelkakolor.txt:

http://www.wklej.org/id/1550685/

 

Dodam, że część tytułu “…oraz kolor, jak widać, znikąd” się wyjaśniła, skojarzyłem “g” ze słowem “gold” (głodnemu chleb na myśli :D), a moja funkcja interpretuje to jako “green”. :wink:

 

EDIT Trochę pogrzebałem w kodzie i problemem było to, że nie zamykałem pliku, oraz brak podanego rozszerzenia pliku w wywołaniu funkcji do górnej i dolnej belki.

Wciąż jednak są problemy.

 

(w międzyczasie zmieniłem rozmiar kratki, dla własnej wygody)

 

Co do belki poziomej, to tutaj nie mogę całkowicie zrozumieć powodu tego stanu rzeczy, natomiast przy pionowej pewnie zepsułem coś z liczbami w funkcji zlejbelki… Z tym może być problem, bo słabo potrafię to sobie zobrazować.

 

Zaktualizowany main.cpp: (bo tylko ten uległ zmianie)

http://www.wklej.org/id/1551071/

 

EDIT2

Dla próby kazałem programowi zapisać do osobnego pliku wczytaną zawartość prawej belki.

Efekt:

http://www.wklej.org/id/1551284/

 

Wie ktoś, co powoduje taki stan rzeczy?

 

EDIT3

Problem rozwiązany, był z kodowaniem pliku.