package jatek;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import szereplo.*;
public class Main extends Applet implements KeyListener {

    public static final int BALRA=0, FELFELE=1, JOBBRA=2, LEFELE=3, BAL=37, FEL=38, JOBB=39, LE=40, BELEPES=0, TERKEP=1, ZENE=2, MERET=3, MENU=0, LENT=1, JATEK=2, FENT=3;
    public static int jelenlegiKisterkep,jelenlegiMenupont,jelenlegiMeret,hely,szint,nagyitas;
    public static int[] meret=new int[3];
    public static boolean zeneVan;
    public static Image menu,folyoso,zene,csend,lent,fent;
    public static Image[] menupont=new Image[4],kisterkep=new Image[3],kepmeret=new Image[3],lejaro=new Image[5], balkanyar=new Image[5],jobbkanyar=new Image[5],fal=new Image[5],feljaro=new Image[5],kijarat=new Image[5];
    public static AudioClip jelenlegiZene, jatekzene, menuzene, szintlepes, vege;
    public static Utveszto utveszto;
    
    public void init() {
        
        /* képek betöltése */
        csend=getImage(getCodeBase(),"csend.PNG");
        fent=getImage(getCodeBase(),"fent.PNG");
        folyoso=getImage(getCodeBase(),"folyoso.PNG");
        menu=getImage(getCodeBase(),"menu.PNG");
        lent=getImage(getCodeBase(),"lent.PNG");
        zene=getImage(getCodeBase(),"zene.PNG");
        for(int i=0;i<3;i++) {
            kepmeret[i]=getImage(getCodeBase(),"kepmeret"+i+".PNG");
            kisterkep[i]=getImage(getCodeBase(),"kisterkep"+i+".PNG");
        }
        for(int i=0;i<4;i++) {
            menupont[i]=getImage(getCodeBase(),"menupont"+i+".PNG");
        }
        for(int i=0;i<5;i++) {
            balkanyar[i]=getImage(getCodeBase(),"balkanyar"+i+".PNG");
            fal[i]=getImage(getCodeBase(),"fal"+i+".PNG");
            jobbkanyar[i]=getImage(getCodeBase(),"jobbkanyar"+i+".PNG");
            feljaro[i]=getImage(getCodeBase(),"feljaro"+i+".PNG");
            kijarat[i]=getImage(getCodeBase(),"kijarat"+i+".PNG");
            lejaro[i]=getImage(getCodeBase(),"lejaro"+i+".PNG");
        }
        
        /* zenék betöltése */
        jatekzene=getAudioClip(getCodeBase(),"zene"+(int)(Math.random()*19)+".wav");
        menuzene=getAudioClip(getCodeBase(),"menu.wav");
        szintlepes=getAudioClip(getCodeBase(),"szintlepes.wav");
        vege=getAudioClip(getCodeBase(),"vege.wav");
        
        /* kezdőértékadás */
        meret[0]=400;
        meret[1]=640;
        meret[2]=800;
        hely=MENU;
        szint=3;
        nagyitas=160/(szint*2+3);
        zeneVan=true;
        jelenlegiMenupont=0;
        jelenlegiMeret=2;
        jelenlegiKisterkep=0;
        jelenlegiZene=menuzene;
        jelenlegiZene.loop();
        this.addKeyListener(this);
    }
    public void stop() {
        jelenlegiZene.stop();
    }
    public void paint(Graphics g) {
        setBackground(Color.BLACK);
        switch(hely) {
            case MENU:

                /* menü kirajzolása */
                g.drawImage(menu, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                g.drawImage(menupont[jelenlegiMenupont], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                g.drawImage(kisterkep[jelenlegiKisterkep], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                g.drawImage(kepmeret[jelenlegiMeret], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                if(zeneVan) g.drawImage(zene, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this); else g.drawImage(csend, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
            break;

            case LENT:
                g.drawImage(lent, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
            break;

            case JATEK:

                /* folyosó kirajzolása */
                g.drawImage(folyoso, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                Falnezo latas=new Falnezo(utveszto.jatekos);
                if(jelenlegiKisterkep==1) utveszto.terkep[latas.getX()][latas.getY()]=Utveszto.LATOTT;
                while(latas.eloreSzabad(utveszto.terkep) && latas.getLepes()<5) {
                    if(latas.balraSzabad(utveszto.terkep)) {
                        g.drawImage(balkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                        if(jelenlegiKisterkep==1) utveszto.terkep[latas.baloldal(utveszto.terkep).getX()][latas.baloldal(utveszto.terkep).getY()]=Utveszto.LATOTT;
                    }
                    if(latas.jobbraSzabad(utveszto.terkep)) {
                        g.drawImage(jobbkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                        if(jelenlegiKisterkep==1) utveszto.terkep[latas.jobboldal(utveszto.terkep).getX()][latas.jobboldal(utveszto.terkep).getY()]=Utveszto.LATOTT;
                    }
                    latas.elore(utveszto.terkep);
                    if(jelenlegiKisterkep==1) utveszto.terkep[latas.getX()][latas.getY()]=Utveszto.LATOTT;
                }
                if(latas.getLepes()<5) {
                    if(latas.balraSzabad(utveszto.terkep)) {
                        g.drawImage(balkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                        if(jelenlegiKisterkep==1) utveszto.terkep[latas.baloldal(utveszto.terkep).getX()][latas.baloldal(utveszto.terkep).getY()]=Utveszto.LATOTT;
                    }
                    if(latas.jobbraSzabad(utveszto.terkep)) {
                        g.drawImage(jobbkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                        if(jelenlegiKisterkep==1) utveszto.terkep[latas.jobboldal(utveszto.terkep).getX()][latas.jobboldal(utveszto.terkep).getY()]=Utveszto.LATOTT;
                    }
                    g.drawImage(fal[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                    if(latas.erint(utveszto.start)) g.drawImage(lejaro[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                    if(latas.erint(utveszto.cel))
                        if(szint==13) g.drawImage(kijarat[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                        else g.drawImage(feljaro[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                    if(latas.balraSzabad(utveszto.terkep)) g.drawImage(balkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                    if(latas.jobbraSzabad(utveszto.terkep)) g.drawImage(jobbkanyar[latas.getLepes()], (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
                }

                /* térkép kirajzolása */
                if(jelenlegiKisterkep!=2) {
                    for(int i=0; i<utveszto.meret; i++) for(int j=0; j<utveszto.meret; j++) {
                        if(jelenlegiKisterkep==0) {
                            switch (utveszto.terkep[i][j]) {
                                case Utveszto.FAL: g.setColor(Color.BLACK); break;
                                case Utveszto.KERET: g.setColor(Color.DARK_GRAY); break;
                                case Utveszto.FOLYOSO: g.setColor(Color.GRAY); break;
                                case Utveszto.START: g.setColor(Color.RED); break;
                                case Utveszto.CEL: g.setColor(Color.GREEN); break;
                            }
                        }
                        if(jelenlegiKisterkep==1) {
                            if(utveszto.terkep[i][j]==Utveszto.LATOTT) g.setColor(Color.GRAY);
                            else g.setColor(Color.BLACK);
                        }
                        g.fillRect(i*nagyitas, j*nagyitas, nagyitas, nagyitas);
                    }
                    /* játékos kirajzolása a térképre */
                    g.setColor(Color.YELLOW);
                    int[] xek=new int[3];
                    int[] yok=new int[3];
                    xek[0]=utveszto.jatekos.getX()*nagyitas+nagyitas/2;
                    yok[0]=utveszto.jatekos.getY()*nagyitas+nagyitas/2;
                    switch(utveszto.jatekos.getIrany()) {
                        case BALRA:
                            xek[1]=(utveszto.jatekos.getX()+1)*nagyitas;
                            xek[2]=(utveszto.jatekos.getX()+1)*nagyitas;
                            yok[1]=utveszto.jatekos.getY()*nagyitas;
                            yok[2]=(utveszto.jatekos.getY()+1)*nagyitas;
                        break;
                        case FELFELE:
                            xek[1]=utveszto.jatekos.getX()*nagyitas;
                            xek[2]=(utveszto.jatekos.getX()+1)*nagyitas;
                            yok[1]=(utveszto.jatekos.getY()+1)*nagyitas;
                            yok[2]=(utveszto.jatekos.getY()+1)*nagyitas;
                        break;
                        case JOBBRA:
                            xek[1]=utveszto.jatekos.getX()*nagyitas;
                            xek[2]=utveszto.jatekos.getX()*nagyitas;
                            yok[1]=utveszto.jatekos.getY()*nagyitas;
                            yok[2]=(utveszto.jatekos.getY()+1)*nagyitas;
                        break;
                        case LEFELE:
                            xek[1]=utveszto.jatekos.getX()*nagyitas;
                            xek[2]=(utveszto.jatekos.getX()+1)*nagyitas;
                            yok[1]=utveszto.jatekos.getY()*nagyitas;
                            yok[2]=utveszto.jatekos.getY()*nagyitas;
                        break;
                    }
                    g.fillPolygon(xek, yok, 3);
                }
            break;

            case FENT:
                g.drawImage(fent, (800-meret[jelenlegiMeret])/2, 0, meret[jelenlegiMeret], 3*meret[jelenlegiMeret]/4, this);
            break;
        }
    }
    public void keyTyped(KeyEvent e) {}
    
    public void keyPressed(KeyEvent e) {
        
        switch(hely) {
            case MENU:
                switch (e.getKeyCode()) {
                    case BAL: switch(jelenlegiMenupont) {
                        case TERKEP: jelenlegiKisterkep=(jelenlegiKisterkep+2)%3; break;
                        case ZENE: if(zeneVan) {
                            zeneVan=false;
                            jelenlegiZene.stop();
                        }
                        else {
                            zeneVan=true;
                            jelenlegiZene.loop();
                        } break;
                        case MERET:
                            jelenlegiMeret=(jelenlegiMeret+2)%3;
                        break;
                    } break;
                    case FEL: jelenlegiMenupont=(jelenlegiMenupont+3)%4; break;
                    case JOBB: switch(jelenlegiMenupont) {
                        case BELEPES: { 
                            hely=LENT;
                            if(zeneVan) {
                                jelenlegiZene.stop();
                                jelenlegiZene=jatekzene;
                                jelenlegiZene.loop();
                            }
                            try { utveszto=new Utveszto(szint); } catch (Exception ex) { utveszto=new Utveszto(szint); }
                        } break;
                        case TERKEP: jelenlegiKisterkep=(jelenlegiKisterkep+1)%3; break;
                        case ZENE: if(zeneVan) {
                            zeneVan=false;
                            jelenlegiZene.stop();
                        }
                        else {
                            zeneVan=true;
                            jelenlegiZene.loop();
                        } break;
                        case MERET: 
                            jelenlegiMeret=(jelenlegiMeret+1)%3;
                        break;
                    } break;
                    case LE: jelenlegiMenupont=(jelenlegiMenupont+1)%4; break;
                }
            break;

            case LENT:
                switch (e.getKeyCode()) {
                    case BAL:
                        hely=MENU;
                        if(zeneVan) {
                            jelenlegiZene.stop();
                            jelenlegiZene=menuzene;
                            jelenlegiZene.loop();
                        }
                    break;
                    case FEL: hely=JATEK; break;
                }
            break;

            case JATEK:
                switch (e.getKeyCode()) {
                    case BAL: utveszto.jatekos.balra(); break;
                    case FEL: utveszto.jatekos.elore(utveszto.terkep); break;
                    case JOBB: utveszto.jatekos.jobbra(); break;
                    case LE: utveszto.jatekos.hatra(utveszto.terkep); break;
                }
                if(utveszto.jatekos.erint(utveszto.cel)) {
                    if(szint==13) {
                        hely=FENT;
                        szint=3;
                        nagyitas=160/(szint*2+3);
                        if(zeneVan) {
                            jelenlegiZene.stop();
                            jelenlegiZene=vege;
                            jelenlegiZene.loop();
                        }
                    }
                    else {
                        szint++;
                        nagyitas=160/(szint*2+3);
                        try { utveszto=new Utveszto(szint); } catch (Exception ex) { utveszto=new Utveszto(szint); }
                        if(zeneVan) szintlepes.play();
                    }
                }
                if(utveszto.jatekos.erint(utveszto.start)) {
                    hely=MENU;
                    szint=3;
                    nagyitas=160/(szint*2+3);
                    if(zeneVan) {
                        jelenlegiZene.stop();
                        jelenlegiZene=menuzene;
                        jelenlegiZene.loop();
                    }
                }
            break;
            
            case FENT:
                hely=MENU;
                if(zeneVan) {
                    jelenlegiZene.stop();
                    jelenlegiZene=menuzene;
                    jelenlegiZene.loop();
                }
            break;
        }
        repaint();
    }
    
    public void keyReleased(KeyEvent e) {}
}
