diff --git a/docs/Static_analysis.md b/docs/Static_analysis.md new file mode 100644 index 0000000..9ece9d7 --- /dev/null +++ b/docs/Static_analysis.md @@ -0,0 +1,50 @@ +# Manuális kód átvizsgálás, statikus analízis + +## A feladat leírása +A feladatot a következő lépések mentén valósítottuk meg: +- Hibák kigyűjtése SonarLint és ErrorLens segítségével +- Hibák szűrése fontosság szerint +- A kiszűrt és azonosított híbák kijavítása, változtatások publikálása +## Feladatmegosztás +A feladat végzése közben, mivel ketten egy időben csináltuk, folyamatosan beszéltünk egymással egy Discord hívásban. Ennek következményeként nagyon hatékonyan tudtuk a munkát felosztani, a feladattal párhuzamosan haladni és az esetleges merge-conflictokat elkerülni. Általánosságban egy class-t egy ember javított ki, ha elakadt a másiktól kért segítséget. +## Hibák kigyűjtése +A VSCode SonarLint és ErrorLens bővítményeivel először is átvizsgáltuk a kódbázist és megnéztük milyen hibákat talál a statikus analízis eszköz. Ezután kigyűjtöttük azokat, amelyek kijavítása nem triviális. Itt a csapattal közösen egyeztünk meg a kijavítandó hibákban. A statikus analízis futtatása során a következő hibákat vettük figyelembe: +- Save and reuse random +- Refactor monster class +- Refactor method to reduce complexity +- Remove code duplications +- és más kisebb javítások (olvashatóság, formai szabványok követése, szemantikai és logikai javítások) + +Egy SonarLint és ErrorLens bővítményekkel megnyitott file egy sora ami hibás: +![File with SonarLint and ErrorLens](./images/SonarLintErrorLens.png) + +A továbbiakban a fentebb említett hibákat fogjuk részletesebben bemutatni. + +## Save and reuse random +A hibát azért választottuk, mert a hiba kijavításának mellőzése komoly biztonsági hibákat idézhet elő. A hiba a `Cistern.java`, `Pump.java` és `Pipe.java` fájlokban volt. Megoldása egyszerű volt, hiszen csak az újrahasznált változókat kellett osztályonként egyszer példányosítani egy-egy privát tagváltozóként. + +## Refactor monster class +A projektben a `Main.java` osztály isten osztálynak lett jelölve a statikus analízis során, aminek oka az osztály függőségeinek száma volt. + +A problémát azonban nem csak a függőségek számának irányából közelítettük meg, hanem inkább a felelősségek szempontjából. Az osztály fő célja a játék kezdőállapotának beállítása és a játékmenet elkezdése, azonban az említett osztály végezte az elemek kirajzolását is. + +A hiba orvoslásának érdekében létrehoztunk egy `Renderer.java` osztályt, ahova átkerült a kirajzoláshoz szükséges funkcionalítás. Habár így a `Main` class-ban eggyel több függőséget lett, így is sikerült annak számát összességében csökkenteni, ezzel is biztosítva az olvashatóságot és a SOLID elvek betartását. + +## Refactor method to reduce complexity +A következő classok következő metódusainak komplexitását tudtuk csökkenteni: +- `MyFrame.java` -> drawLines method +- `Active.java` -> PipeRelocation method +- `GraphicsPipe.java` -> update method +- `GameKeyListener.java` -> keyReleased method +- `Pump.java` -> Insert method +A metódusok komplexitását általában egyszerű refaktorálással tudtuk csökkenteni, viszont néhány helyen át kellett írnunk a logikát is. Emellett itt még több más, a SonarLint által nem jelzett logikai hibát javítottunk ki. + +## Remove code duplications +A `Pipe.java` ChangeState és AddPoint metódusait refaktoráltuk, hogy ne legyen benne kódduplikáció. Ezt mindkét metódusban a logika átírásával oldottuk meg. + +## Kisebb javítások +Ezek a javítások általában nem voltak elég nagyméretűek, komplexek és fontosak, hogy külön mindegyikre kitérjünk. Az itt elvégzett javítások között van például: a nem használt importok kitörlése, behúzás javítása, kód olvashatóbbá tétele a kód formájának megváltoztatásával. Ezek a változtatások is javítottak a kód és a projekt minőségén. + +## Összegzés, tanulságok + +A feladat elvégzésével határozottan sikerült a kód minőségén és olvashatóságán javítani, ezzel bizonyítva a statikus analízis módszerek használatának fontosságát. A feladat során betekintést kaphattunk komplexebb problémák csoportos javításába és a csapatmunka mikéntjébe. diff --git a/docs/images/SonarLintErrorLens.png b/docs/images/SonarLintErrorLens.png new file mode 100644 index 0000000..ad031f4 Binary files /dev/null and b/docs/images/SonarLintErrorLens.png differ diff --git a/src/main/java/Active.java b/src/main/java/Active.java index 3402ada..361055c 100644 --- a/src/main/java/Active.java +++ b/src/main/java/Active.java @@ -30,48 +30,47 @@ public void Swap(Passive p1,Passive p2) * @param toEndPoint hányadik kimenetére * A komponens amelybe be kell kötni a csövet. */ - public boolean PipeRelocation(int endPoint,Active to,int toEndPoint) - { - if(to !=null) { + public boolean PipeRelocation(int endPoint,Active to,int toEndPoint){ + if(to == null) { + return false; + } - if (PassiveComponents[endPoint].ActiveComponents[0]!= null && PassiveComponents[endPoint].ActiveComponents[0].equals(this)) //Megnezzuk hogy ez az aktiv a keresett passzivnak hanyadik eleme. - { + if (PassiveComponents[endPoint].ActiveComponents[0]!= null && PassiveComponents[endPoint].ActiveComponents[0].equals(this)) //Megnezzuk hogy ez az aktiv a keresett passzivnak hanyadik eleme. + { - if(PassiveComponents[endPoint].ActiveComponents[1]!=null){ - try{ + if(PassiveComponents[endPoint].ActiveComponents[1]!=null){ + try{ - PassiveComponents[endPoint].ActiveComponents[1].Swap(PassiveComponents[endPoint], null); + PassiveComponents[endPoint].ActiveComponents[1].Swap(PassiveComponents[endPoint], null); - } - catch (Exception e ){ - e.printStackTrace(); - } } - - PassiveComponents[endPoint].ActiveComponents[1] = to;//0 - + catch (Exception e ){ + e.printStackTrace(); + } } - else if (PassiveComponents[endPoint].ActiveComponents[1]!= null&& PassiveComponents[endPoint].ActiveComponents[1].equals(this)) - { + PassiveComponents[endPoint].ActiveComponents[1] = to;//0 - if(PassiveComponents[endPoint].ActiveComponents[0]!=null){ + } - PassiveComponents[endPoint].ActiveComponents[0].Swap(PassiveComponents[endPoint], null); + else if (PassiveComponents[endPoint].ActiveComponents[1]!= null&& PassiveComponents[endPoint].ActiveComponents[1].equals(this)) + { - } + if(PassiveComponents[endPoint].ActiveComponents[0]!=null){ - PassiveComponents[endPoint].ActiveComponents[0] = to;//0 + PassiveComponents[endPoint].ActiveComponents[0].Swap(PassiveComponents[endPoint], null); } - if(to.PassiveComponents[toEndPoint]==null) - to.PassiveComponents[toEndPoint]= PassiveComponents[endPoint]; - else { - to.Swap(to.PassiveComponents[toEndPoint], PassiveComponents[endPoint]); - } - return true; + + PassiveComponents[endPoint].ActiveComponents[0] = to;//0 + } - return false; + if(to.PassiveComponents[toEndPoint]==null) + to.PassiveComponents[toEndPoint]= PassiveComponents[endPoint]; + else { + to.Swap(to.PassiveComponents[toEndPoint], PassiveComponents[endPoint]); + } + return true; } /** @@ -112,5 +111,7 @@ public int getNeighbourIndex(Passive p) public void setNeighbours(int i, Passive p){ PassiveComponents[i]=p; } - public void MoveWater(SComponent c){} + public void MoveWater(SComponent c){ + //only special Active components are capable of moving water. + } } diff --git a/src/main/java/Cistern.java b/src/main/java/Cistern.java index 249bd1a..04261a4 100644 --- a/src/main/java/Cistern.java +++ b/src/main/java/Cistern.java @@ -6,6 +6,7 @@ public class Cistern extends Active implements Notifiable { private Pump Pump; //Tárolja a ciszternánál lévő generált pumpát private int generate; //Ez majd egy random lesz a gyakorlatban, és csak a Notify-on belül fog létezni [TESZTELÉSHEZ] private boolean randomizable = true; + private Random r = new Random(); private int waterCounter; //Konstruktor public Cistern(String s,int X, int Y) @@ -127,7 +128,6 @@ public int AddPoint(){ public void Notify() { if(randomizable) { - Random r = new Random(); generate=r.nextInt(50); diff --git a/src/main/java/GameKeyListener.java b/src/main/java/GameKeyListener.java index f2be455..3ea3c7f 100644 --- a/src/main/java/GameKeyListener.java +++ b/src/main/java/GameKeyListener.java @@ -25,14 +25,41 @@ public void setActivePlayer(Player activePlayer) { public GameKeyListener(GraphicsMap gm) { gMap = gm; + felsoAlsoOtions.add("felso"); + felsoAlsoOtions.add("jobb"); + felsoAlsoOtions.add("also"); + felsoAlsoOtions.add("bal"); + for (SComponent g: Main.map.getComponents()) { + String str= g.getId(); + options.add(str); + } } + + private ArrayList felsoAlsoOtions = new ArrayList<>(); + + private ArrayList options = new ArrayList<>(); + + + + + + + + + + + + + /** * A KeyListener interfész egyik kötelezően * implementálandó függvénye. A gombnyomások ellenőrzését mi a * keyReleased()-ben ellenőrizzük, tehát ez a függvény üresen marad. */ @Override - public void keyTyped(KeyEvent e) {} + public void keyTyped(KeyEvent e) { + //A gombnyomások ellenőrzését mi a keyReleased()-ben ellenőrizzük, tehát ez a függvény üresen marad. + } /** * A KeyListener interfész egyik kötelezően * implementálandó függvénye. Egy billentyű megnyomását és felengedését @@ -43,7 +70,7 @@ public void keyTyped(KeyEvent e) {} * meghívja a gMap UpdateAll() függvényét, hogy a grafikus elemek frissüljenek, * illetve szükség esetén frissíti a gMap tartalmát. */ - + /** * A KeyListener interfész egyik kötelezően * implementálandó függvénye. Egy billentyű megnyomását és felengedését @@ -55,530 +82,560 @@ public void keyTyped(KeyEvent e) {} * illetve szükség esetén frissíti a gMap tartalmát. */ @Override - public void keyPressed(KeyEvent e) {} + public void keyPressed(KeyEvent e) { + //A gombnyomások ellenőrzését mi a keyReleased()-ben ellenőrizzük, tehát ez a függvény üresen marad. + } + - /** - * A KeyListener interfész egyik kötelezően - * implementálandó függvénye. A gombnyomások ellenőrzését mi a - * keyReleased()-ben ellenőrizzük, tehát ez a függvény üresen marad. + private SComponent pos; + + + /* + * Helper függvények a keyReleased függvényhez + * A különböző akciókat ezek végzik el */ - @Override - public void keyReleased(KeyEvent e) { - JOptionPane errorMsg = new JOptionPane(); - JOptionPane selector = new JOptionPane(); - SComponent pos = activePlayer.getPosition(); - switch(e.getKeyChar()) + + private void moveUp(){ + if(pos.getNeighbours().length == 2) { - default: return; - case 'w': - if(pos.getNeighbours().length == 2) + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(pos.getNeighbours().length == 4) + { + if(pos.getNeighbours()[0] == null) + { + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY) && activePlayer.getRooted()) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(!activePlayer.Move(pos.getNeighbours()[0])) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[0].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + } + private void moveRight(){ + if(pos.getNeighbours().length == 2) + { + if(pos.getNeighbours()[0] == null) + { + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(!activePlayer.Move(pos.getNeighbours()[0])) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[0].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + else if(pos.getNeighbours().length == 4) + { + if(pos.getNeighbours()[1] == null) + { + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(!activePlayer.Move(pos.getNeighbours()[1])) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[1].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + } + private void moveDown(){ + if(pos.getNeighbours().length == 2) + { + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(pos.getNeighbours().length == 4) + { + if(pos.getNeighbours()[2] == null) { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - else if(pos.getNeighbours().length == 4) + else if(activePlayer.getAP() < 1) { - if(pos.getNeighbours()[0] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY) && activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[0])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[0].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - break; //moveUp - case 'd': - if(pos.getNeighbours().length == 2) + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) { - if(pos.getNeighbours()[0] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[0])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[0].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - else if(pos.getNeighbours().length == 4) + else if(!activePlayer.Move(pos.getNeighbours()[2])) { - if(pos.getNeighbours()[1] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[1])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[1].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[2].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - break; //moveRight - case 's': - if(pos.getNeighbours().length == 2) + } + } + private void moveLeft(){ + if(pos.getNeighbours().length == 2) + { + if(pos.getNeighbours()[1] == null) { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - else if(pos.getNeighbours().length == 4) + else if(activePlayer.getAP() < 1) { - if(pos.getNeighbours()[2] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[2])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[2].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - break; //moveDown - case 'a': - if(pos.getNeighbours().length == 2) + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) { - if(pos.getNeighbours()[1] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[1])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[1].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - else if(pos.getNeighbours().length == 4) + else if(!activePlayer.Move(pos.getNeighbours()[1])) { - if(pos.getNeighbours()[3] == null) - { - errorMsg.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - else if(!activePlayer.Move(pos.getNeighbours()[3])) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[3].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[1].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - break; //moveLeft - case 'f': - if(!Main.mechanics.contains((activePlayer))) + } + else if(pos.getNeighbours().length == 4) + { + if(pos.getNeighbours()[3] == null) { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; + JOptionPane.showMessageDialog(null, "Ebben az iranyban nem talalhato szomszedos komponens!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - int idxP = 0; - for(int i = 0; i < Main.mechanics.size(); i++) + else if(activePlayer.getAP() < 1) { - if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.mechanics.size(); - } + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - Mechanic activeMechanicF = Main.mechanics.get(idxP); - if(!pos.getBroken()) + else if(pos.getState()!=null && pos.getState().equals(PipeState.STICKY)&& activePlayer.getRooted()) { - errorMsg.showMessageDialog(null, "A komponenst nem lehet megszerelni, mivel nem torott!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem tud lepni, mivel be van ragadva!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - if(activePlayer.getAP() < 1) + else if(!activePlayer.Move(pos.getNeighbours()[3])) { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem lephet at a(z) " + pos.getNeighbours()[3].getId() + " komponensre, mivel az mar foglalt!", "HIBA!", JOptionPane.ERROR_MESSAGE); } - activeMechanicF.FixComponent(); + } + } + + private void mechanicFix(){ + if(!Main.mechanics.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.mechanics.size(); i++) + { + if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Mechanic activeMechanicF = Main.mechanics.get(idxP); + if(!pos.getBroken()) + { + JOptionPane.showMessageDialog(null, "A komponenst nem lehet megszerelni, mivel nem torott!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + activeMechanicF.FixComponent(); + } + + private void puncture(){ + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(!activePlayer.Puncture()) + { + JOptionPane.showMessageDialog(null, "A komponenst nem lehet kiszurni (vagy mar ki van szurva)!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + private void mechanicCollect(){ + if(!Main.mechanics.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.mechanics.size(); i++) + { + if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Mechanic activeMechanicP = Main.mechanics.get(idxP); + if(pos.getItem() == null) + { + JOptionPane.showMessageDialog(null, pos.getId() + "-nel jelenleg nincsen generalt pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(activeMechanicP.getItem() != null) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nel mar van pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + activeMechanicP.CollectPump(); + } + + private void mechanicPlace(){ + if(!Main.mechanics.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.mechanics.size(); i++) + { + if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Mechanic activeMechanicP2 = Main.mechanics.get(idxP); + if(activeMechanicP2.getItem() == null) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nel nincs pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(!activeMechanicP2.PlacePump()){ + JOptionPane.showMessageDialog(null, "A jatekos jelenlegi poziciojara nem helyezheto pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + Pipe pii =(Pipe)Main.map.getComponents().get(Main.map.getComponents().size()-2); + Main.notifiableList.add(pii); + Main.gmap.addItem(new GraphicsPipe(pii)); + Main.passiveComponents.put(pii.getId(),pii); + Pump pu =(Pump)Main.map.getComponents().get(Main.map.getComponents().size()-1); + Main.notifiableList.add(pu); + Main.gmap.addItem(new GraphicsPump(pu)); + Main.activeComponents.put(pu.getId(),pu); + } + + private void makeSlippery(){ + if(!Main.saboteurs.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szabotorok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.saboteurs.size(); i++) + { + if(Main.saboteurs.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Saboteur activeSaboteurP = Main.saboteurs.get(idxP); + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + try{ + Pipe p = (Pipe) activePlayer.position; + } + catch(Exception ex) { + JOptionPane.showMessageDialog(null, "Ez a tipusu komponens nem teheto csuszossa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + if(!activeSaboteurP.MakePipeSlippery()){ + JOptionPane.showMessageDialog(null, "A cso nem teheto csuszossa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + private void makeSticky(){ + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + else if(!activePlayer.MakePipeSticky()) + { + JOptionPane.showMessageDialog(null, "A komponenst nem lehet ragadossa tenni (vagy mar ragad)!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + private void playerEscape(){ + if(activePlayer.getAP() != activePlayer.maxAP) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + + String activeElem=""; + try + { + activeElem = (String)JOptionPane.showInputDialog(null, "Adja meg melyik komponensre szeretne elszokni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, options.toArray(), options.get(0)); + } + catch(Exception ex) {} + SComponent newPostion = null; + for (SComponent g: Main.map.getComponents()) { + if(g.getId().equals(activeElem)) + newPostion=g; + } + if(newPostion!=null && !activePlayer.Escape(newPostion)) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + " nem menekulhet at a(z) " +newPostion.getId() + " komponensre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + + private void playerSetPump(){ + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + String elsoVegStr=""; + String masodikVegStr=""; + try + { + elsoVegStr= (String)JOptionPane.showInputDialog(null, "Adja meg a pumpa bemenetet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); + } + catch(Exception ex) {} + try + { + masodikVegStr= (String)JOptionPane.showInputDialog(null, "Adja meg a pumpa kimenetet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); + } + catch(Exception ex) {} + + if(elsoVegStr.equals("") || masodikVegStr.equals("")) + { + JOptionPane.showMessageDialog(null, "Nem megfeleloek a pumpa bemenete es kimenete!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int elsoVeg=-1; + int masodikVeg=-1; + + switch (elsoVegStr) + { + case "felso":elsoVeg=0; break; + case "jobb":elsoVeg=1; break; + case "also":elsoVeg=2; break; + case "bal":elsoVeg=3; break; + default: break; + } + switch (masodikVegStr) + { + case "felso":masodikVeg=0; break; + case "jobb":masodikVeg=1; break; + case "also":masodikVeg=2; break; + case "bal":masodikVeg=3; break; + default: break; + } + if(!activePlayer.SetPump(elsoVeg,masodikVeg)) + { + JOptionPane.showMessageDialog(null, "A komponens nem pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + private void playerRelocatePipe(){ + if(!Main.mechanics.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.mechanics.size(); i++) + { + if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Mechanic activeMechanicP3 = Main.mechanics.get(idxP); + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + String elsoVegStr=""; + String masodikVegStr=""; + try + { + elsoVegStr= (String)JOptionPane.showInputDialog(null, "Adja meg a melyik csovet szeretne athelyezni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); + } + catch(Exception ex) {} + String activeElem=""; + try + { + activeElem = (String)JOptionPane.showInputDialog(null, "Adja meg a melyik aktiv elemhez akarja csatlakoztatni a csovet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, options.toArray(), options.get(0)); + } + catch(Exception ex) {} + try + { + masodikVegStr= (String)JOptionPane.showInputDialog(null, "Adja meg a melyik vegponthoz szeretne athelyezni a csovet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); + } + catch(Exception ex) {} + + if(elsoVegStr.equals("") || masodikVegStr.equals("")) + { + JOptionPane.showMessageDialog(null, "Nem megfeleloek a pumpa bemenete es kimenete!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int elsoVeg=-1; + int masodikVeg=-1; + + switch (elsoVegStr) + { + case "felso":elsoVeg=0; break; + case "jobb":elsoVeg=1; break; + case "also":elsoVeg=2; break; + case "bal":elsoVeg=3; break; + default: break; + } + switch (masodikVegStr) + { + case "felso":masodikVeg=0; break; + case "jobb":masodikVeg=1; break; + case "also":masodikVeg=2; break; + case "bal":masodikVeg=3; break; + default: break; + } + + Active activeComponent = Main.activeComponents.get(activeElem); + if(!activeMechanicP3.RelocatePipe(elsoVeg,activeComponent,masodikVeg)){ + JOptionPane.showMessageDialog(null, "Nem lehet athelyezni a csovet", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + private void playerDetachPipe(){ + if(!Main.mechanics.contains((activePlayer))) + { + JOptionPane.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int idxP = 0; + for(int i = 0; i < Main.mechanics.size(); i++) + { + if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) + { + idxP = i; + break; + } + } + Mechanic activeMechanicP4 = Main.mechanics.get(idxP); + if(activePlayer.getAP() < 1) + { + JOptionPane.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + String VegStr=""; + try + { + VegStr= (String)JOptionPane.showInputDialog(null, "Adja meg a melyik csovet szeretne lecsatlakoztatni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); + } + catch(Exception ex) {} + if(VegStr.equals("")) + { + JOptionPane.showMessageDialog(null, "Ervenytelen vegpont!", "HIBA!", JOptionPane.ERROR_MESSAGE); + return; + } + int activeVegPont2=-1; + switch (VegStr) + { + case "felso":activeVegPont2=0; break; + case "jobb":activeVegPont2=1; break; + case "also":activeVegPont2=2; break; + case "bal":activeVegPont2=3; break; + default: break; + } + if(!activeMechanicP4.Detach(activeVegPont2)){ + JOptionPane.showMessageDialog(null, "A komponens nem aktiv!", "HIBA!", JOptionPane.ERROR_MESSAGE); + } + } + + /** + * A KeyListener interfész egyik kötelezően + * implementálandó függvénye. A gombnyomások ellenőrzését mi a + * keyReleased()-ben ellenőrizzük, tehát ez a függvény üresen marad. + */ + @Override + public void keyReleased(KeyEvent e) { + pos = activePlayer.getPosition(); + + switch(e.getKeyChar()) + { + + case 'w': + moveUp(); + break; //moveUp + case 'd': + moveRight(); + break; //moveRight + case 's': + moveDown(); + break; //moveDown + case 'a': + moveLeft(); + break; //moveLeft + case 'f': + mechanicFix(); break; //fix case 'p': - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - else if(!activePlayer.Puncture()) - { - errorMsg.showMessageDialog(null, "A komponenst nem lehet kiszurni (vagy mar ki van szurva)!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + puncture(); break; //puncture case 'c': - if(!Main.mechanics.contains((activePlayer))) - { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - idxP = 0; - for(int i = 0; i < Main.mechanics.size(); i++) - { - if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.mechanics.size(); - } - } - Mechanic activeMechanicP = Main.mechanics.get(idxP); - if(pos.getItem() == null) - { - errorMsg.showMessageDialog(null, pos.getId() + "-nel jelenleg nincsen generalt pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - if(activeMechanicP.getItem() != null) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nel mar van pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - activeMechanicP.CollectPump(); + mechanicCollect(); break; //collect case 'g': - if(!Main.mechanics.contains((activePlayer))) - { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - idxP = 0; - for(int i = 0; i < Main.mechanics.size(); i++) - { - if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.mechanics.size(); - } - } - Mechanic activeMechanicP2 = Main.mechanics.get(idxP); - if(activeMechanicP2.getItem() == null) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nel nincs pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - if(!activeMechanicP2.PlacePump()){ - errorMsg.showMessageDialog(null, "A jatekos jelenlegi poziciojara nem helyezheto pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - Pipe pii =(Pipe)Main.map.getComponents().get(Main.map.getComponents().size()-2); - Main.notifiableList.add(pii); - Main.gmap.addItem(new GraphicsPipe(pii)); - Main.passiveComponents.put(pii.getId(),pii); - Pump pu =(Pump)Main.map.getComponents().get(Main.map.getComponents().size()-1); - Main.notifiableList.add(pu); - Main.gmap.addItem(new GraphicsPump(pu)); - Main.activeComponents.put(pu.getId(),pu); + mechanicPlace(); break; //place case 'l': - if(!Main.saboteurs.contains((activePlayer))) - { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szabotorok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - idxP = 0; - for(int i = 0; i < Main.saboteurs.size(); i++) - { - if(Main.saboteurs.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.saboteurs.size(); - } - } - Saboteur activeSaboteurP = Main.saboteurs.get(idxP); - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - try{ - Pipe p = (Pipe) activePlayer.position; - } - catch(Exception ex) { - errorMsg.showMessageDialog(null, "Ez a tipusu komponens nem teheto csuszossa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - if(!activeSaboteurP.MakePipeSlippery()){ - errorMsg.showMessageDialog(null, "A cso nem teheto csuszossa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } + makeSlippery(); break; //slippery case 't': - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - else if(!activePlayer.MakePipeSticky()) - { - errorMsg.showMessageDialog(null, "A komponenst nem lehet ragadossa tenni (vagy mar ragad)!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } + makeSticky(); break; //sticky case 'e': - if(activePlayer.getAP() != activePlayer.maxAP) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - ArrayList options = new ArrayList(); - for (SComponent g: Main.map.getComponents()) { - String str= g.getId(); - options.add(str); - } - String activeElem=""; - try - { - activeElem = (String)selector.showInputDialog(null, "Adja meg melyik komponensre szeretne elszokni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, options.toArray(), options.get(0)); - } - catch(Exception ex) {} - SComponent newPostion = null; - for (SComponent g: Main.map.getComponents()) { - if(g.getId().equals(activeElem)) - newPostion=g; - } - if(newPostion!=null) - { - if(!activePlayer.Escape(newPostion)) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + " nem menekulhet at a(z) " +newPostion.getId() + " komponensre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } - } + playerEscape(); break; //escape case 'q': activePlayer.Pass(); break; //pass case 'v': - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - String elsoVegStr=""; - String masodikVegStr=""; - ArrayList felsoAlsoOtions = new ArrayList(); - felsoAlsoOtions.add("felso"); - felsoAlsoOtions.add("jobb"); - felsoAlsoOtions.add("also"); - felsoAlsoOtions.add("bal"); - try - { - elsoVegStr= (String)selector.showInputDialog(null, "Adja meg a pumpa bemenetet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); - } - catch(Exception ex) {} - try - { - masodikVegStr= (String)selector.showInputDialog(null, "Adja meg a pumpa kimenetet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); - } - catch(Exception ex) {} - - if(elsoVegStr.equals("") || masodikVegStr.equals("")) - { - errorMsg.showMessageDialog(null, "Nem megfeleloek a pumpa bemenete es kimenete!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - int elsoVeg=-1; - int masodikVeg=-1; - - switch (elsoVegStr) - { - case "felso":elsoVeg=0; break; - case "jobb":elsoVeg=1; break; - case "also":elsoVeg=2; break; - case "bal":elsoVeg=3; break; - } - switch (masodikVegStr) - { - case "felso":masodikVeg=0; break; - case "jobb":masodikVeg=1; break; - case "also":masodikVeg=2; break; - case "bal":masodikVeg=3; break; - } - if(!activePlayer.SetPump(elsoVeg,masodikVeg)) - { - errorMsg.showMessageDialog(null, "A komponens nem pumpa!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } + playerSetPump(); break; //set pump case 'r': - if(!Main.mechanics.contains((activePlayer))) - { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - idxP = 0; - for(int i = 0; i < Main.mechanics.size(); i++) - { - if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.mechanics.size(); - } - } - Mechanic activeMechanicP3 = Main.mechanics.get(idxP); - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - elsoVegStr=""; - masodikVegStr=""; - felsoAlsoOtions = new ArrayList(); - felsoAlsoOtions.add("felso"); - felsoAlsoOtions.add("jobb"); - felsoAlsoOtions.add("also"); - felsoAlsoOtions.add("bal"); - try - { - elsoVegStr= (String)selector.showInputDialog(null, "Adja meg a melyik csovet szeretne athelyezni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); - } - catch(Exception ex) {} - options = new ArrayList(); - for (SComponent s: Main.map.getComponents()) { - try{ - options.add(s.getId()); - } - catch(Exception ex) {} - } - activeElem=""; - try - { - activeElem = (String)selector.showInputDialog(null, "Adja meg a melyik aktiv elemhez akarja csatlakoztatni a csovet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, options.toArray(), options.get(0)); - } - catch(Exception ex) {} - try - { - masodikVegStr= (String)selector.showInputDialog(null, "Adja meg a melyik vegponthoz szeretne athelyezni a csovet!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); - } - catch(Exception ex) {} - - if(elsoVegStr.equals("") || masodikVegStr.equals("")) - { - errorMsg.showMessageDialog(null, "Nem megfeleloek a pumpa bemenete es kimenete!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - elsoVeg=-1; - masodikVeg=-1; - - switch (elsoVegStr) - { - case "felso":elsoVeg=0; break; - case "jobb":elsoVeg=1; break; - case "also":elsoVeg=2; break; - case "bal":elsoVeg=3; break; - } - switch (masodikVegStr) - { - case "felso":masodikVeg=0; break; - case "jobb":masodikVeg=1; break; - case "also":masodikVeg=2; break; - case "bal":masodikVeg=3; break; - } - - Active activeComponent = Main.activeComponents.get(activeElem); - if(!activeMechanicP3.RelocatePipe(elsoVeg,activeComponent,masodikVeg)){ - errorMsg.showMessageDialog(null, "Nem lehet athelyezni a csovet", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } + playerRelocatePipe(); break; //relocate pipe case 'h': - if(!Main.mechanics.contains((activePlayer))) - { - errorMsg.showMessageDialog(null, "Ezt a muveletet csak szerelok hajthatjak vegre!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - idxP = 0; - for(int i = 0; i < Main.mechanics.size(); i++) - { - if(Main.mechanics.get(i).getId().equals(activePlayer.getId())) - { - idxP = i; - i = Main.mechanics.size(); - } - } - Mechanic activeMechanicP4 = Main.mechanics.get(idxP); - if(activePlayer.getAP() < 1) - { - errorMsg.showMessageDialog(null, activePlayer.getId() + "-nek nincs eleg AP-je a muvelet elvegzesehez!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - String VegStr=""; - felsoAlsoOtions = new ArrayList(); - felsoAlsoOtions.add("felso"); - felsoAlsoOtions.add("jobb"); - felsoAlsoOtions.add("also"); - felsoAlsoOtions.add("bal"); - try - { - VegStr= (String)selector.showInputDialog(null, "Adja meg a melyik csovet szeretne lecsatlakoztatni!", "CÍM", JOptionPane.QUESTION_MESSAGE, null, felsoAlsoOtions.toArray(), felsoAlsoOtions.get(0)); - } - catch(Exception ex) {} - if(VegStr.equals("")) - { - errorMsg.showMessageDialog(null, "Ervenytelen vegpont!", "HIBA!", JOptionPane.ERROR_MESSAGE); - break; - } - int activeVegPont2=-1; - switch (VegStr) - { - case "felso":activeVegPont2=0; break; - case "jobb":activeVegPont2=1; break; - case "also":activeVegPont2=2; break; - case "bal":activeVegPont2=3; break; - } - if(!activeMechanicP4.Detach(activeVegPont2)){ - errorMsg.showMessageDialog(null, "A komponens nem aktiv!", "HIBA!", JOptionPane.ERROR_MESSAGE); - } + playerDetachPipe(); break; //detach pipe + default: return; } Main.gameLoop(); gMap.updateAll(); } - public void SetActivePlayer(Player p) - { - activePlayer = p; - } } diff --git a/src/main/java/GraphicsMap.java b/src/main/java/GraphicsMap.java index 4c414ba..d96bf53 100644 --- a/src/main/java/GraphicsMap.java +++ b/src/main/java/GraphicsMap.java @@ -2,6 +2,7 @@ //Grafikus map import java.util.ArrayList; +import java.util.List; public class GraphicsMap { @@ -11,7 +12,7 @@ public class GraphicsMap { * Default Map konstruktor */ GraphicsMap(){ - GrafCompList = new ArrayList(); + GrafCompList = new ArrayList<>(); } /** diff --git a/src/main/java/GraphicsPipe.java b/src/main/java/GraphicsPipe.java index 73686c6..8fcc2f8 100644 --- a/src/main/java/GraphicsPipe.java +++ b/src/main/java/GraphicsPipe.java @@ -46,72 +46,47 @@ public JLabel getIdLabel(){ return picLabel2; } + + /* + * Segédfüggvények az update függvény komplexitáscsökkentéséhez + */ + + private String calculateStateBroken(){ + if(relative.broken) + return "_br"; + return "_wk"; + } + private String calculateStateWater(){ + if(relative.hasWater) + return "_hw"; + return "_nw"; + } + private String calculateStateSurfice(){ + switch (relative.getState()) { + case NORMAL: + return "_no"; + case SLIPPERY: + return "_sl"; + case STICKY: + return "_st"; + default: + return "_no"; + } + } /** * Ezzel a függvénnyel frissítjük az eltárolt cső kinézetét. * Lekéri az adott komponens adott állapotát és a szerint választja ki a képernyőn lévő képet. */ public void update(){ picLabel.setBounds(relative.posX, relative.posY, 80, 80); - switch(relative.getState()){ - case NORMAL : - if(relative.broken){ - if (relative.getHasWater()) { - ChangeAppearance("pipe_no_br_hw"); - } else { - ChangeAppearance("pipe_no_br_nw"); - } - } - else{ - if(relative.hasWater){ - ChangeAppearance("pipe_no_wk_hw"); - } - else { - ChangeAppearance("pipe_no_wk_nw"); - } - } - break; - case SLIPPERY: - if(relative.broken){ - if(relative.hasWater){ - ChangeAppearance("pipe_sl_br_hw"); - } - else { - ChangeAppearance("pipe_sl_br_nw"); - } - } - else{ - if(relative.hasWater){ - ChangeAppearance("pipe_sl_wk_hw"); - } - else { - ChangeAppearance("pipe_sl_wk_nw"); - } - } - break; - case STICKY: - if(relative.broken){ - if(relative.hasWater){ - ChangeAppearance("pipe_st_br_hw"); - } - else { - ChangeAppearance("pipe_st_br_nw"); - } - } - else{ - if(relative.hasWater){ - ChangeAppearance("pipe_st_wk_hw"); - } - else { - ChangeAppearance("pipe_st_wk_nw"); - } - } - break; - default: - break; - - } - }; - + String stateString = "pipe"; + stateString += calculateStateSurfice(); + stateString += calculateStateBroken(); + stateString += calculateStateWater(); + ChangeAppearance(stateString); + } + void refresh (){picLabel = new JLabel(new ImageIcon(IMG));} - + } + \ No newline at end of file diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 525b62e..ec9eeea 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,4 +1,3 @@ -import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -12,10 +11,8 @@ public class Main { static public Map map = new Map(); static public GraphicsMap gmap = new GraphicsMap(); - static public Scoreboard sb = new Scoreboard(); static public GameKeyListener gameKeyListener; static ArrayList notifiableList = new ArrayList(); - static MyFrame frame = new MyFrame(); static HashMap passiveComponents = new HashMap(); static HashMap activeComponents = new HashMap(); static ArrayList mechanics = new ArrayList(); @@ -23,30 +20,20 @@ public class Main { static int roundNums = 30; static int activePlayerIndex = 0; static Player activePlayer; + static Renderer renderer; public static void main(String[] args) { gameKeyListener= new GameKeyListener(gmap); - frame.setSize(1280,720); - frame.setLayout(null); - frame.setVisible(true); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setResizable(false); + renderer.frame.setSize(1280,720); + renderer.frame.setLayout(null); + renderer.frame.setVisible(true); + renderer.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + renderer.frame.setResizable(false); setupMainMenu(); } private static void setupMainMenu() { - JLabel picLabel; - Image IMG; - ImageIcon icon ; - String filePath = "RESOURCES/IMAGES/Texture2D/"; - icon = new ImageIcon(filePath+"BG_desert.png"); - IMG = icon.getImage(); - picLabel = new JLabel(new ImageIcon(IMG)); - picLabel.setOpaque(false); - picLabel.setBounds(0, 0, 1280, 720); - JButton newGameButton=new JButton("Start"); - newGameButton.setBounds(1280/2-100,200,200, 70); - newGameButton.addActionListener(new ActionListener() { + ActionListener newGameListener = new ActionListener() { public void actionPerformed(ActionEvent e) { try { setupGame(); @@ -55,21 +42,9 @@ public void actionPerformed(ActionEvent e) { } gameLoop(); } - } ); + }; - frame.getContentPane().add(newGameButton); - JButton exitGameButton=new JButton("Exit"); - exitGameButton.setBounds(1280/2-100,400,200, 70); - exitGameButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - System.exit(0); - } - } ); - frame.getContentPane().add(exitGameButton); - frame.getContentPane().add(picLabel); - frame.setLayout(null); - frame.setVisible( true ); - frame.repaint(); + renderer.drawMainMenu(newGameListener); } private static void setupGame() throws FileNotFoundException { @@ -85,64 +60,14 @@ private static void setupGame() throws FileNotFoundException { } } fr.close(); - frame.setPumps(passiveComponents); + renderer.frame.setPumps(passiveComponents); activePlayer= mechanics.get(0); gameKeyListener.setActivePlayer(activePlayer); - frame.addKeyListener(gameKeyListener); - frame.requestFocus(); - drawScene(); + renderer.frame.addKeyListener(gameKeyListener); + renderer.frame.requestFocus(); + renderer.drawScene(mechanics, activePlayer, gmap, roundNums); } - private static void endScreen() - { - passiveComponents.clear(); - frame.removeKeyListener(gameKeyListener); - frame.getContentPane().removeAll(); - frame.getContentPane().setBackground(Color.BLACK); - JLabel winTeam; - if(sb.getMechPoints()>sb.getSabPoints()) - { - winTeam = new JLabel("Mechanics won"); - winTeam.setBounds(1280/2-150,100,500,200); - } - else if (sb.getMechPoints()0) @@ -155,10 +80,10 @@ public static void gameLoop() } if (activePlayerIndex==0||activePlayerIndex==2) { activePlayer = mechanics.get(activePlayerIndex/2); - MechanicKeyBinds(); + renderer.MechanicKeyBinds(); } else { activePlayer = saboteurs.get((activePlayerIndex/2)); - SaboteurKeyBinds(); + renderer.SaboteurKeyBinds(); } activePlayer.resetAP(); gameKeyListener.setActivePlayer(activePlayer); @@ -167,7 +92,7 @@ public static void gameLoop() c.MoveWater(null); } map.resetMoveWater(); - sb.TallyPoints(map); + renderer.sb.TallyPoints(map); int mapSize=map.getComponents().size(); for (Notifiable n:notifiableList) { @@ -181,13 +106,13 @@ public static void gameLoop() Main.passiveComponents.put(pii.getId(),pii); } } - drawScene(); + renderer.drawScene(mechanics, activePlayer, gmap, roundNums); new JOptionPane().showMessageDialog(null, "Uj aktiv jatekos: " + activePlayer.getId(), "JATEKOS VALTAS!", JOptionPane.WARNING_MESSAGE); } - drawScene(); + renderer.drawScene(mechanics, activePlayer, gmap, roundNums); if(roundNums <= 0) { - endScreen(); + renderer.endScreen(passiveComponents, gameKeyListener); } } } @@ -320,80 +245,4 @@ private static void SetPump(String cmd) int newOut = Integer.parseInt(args[2]); c.SetPump(newIn-1, newOut-1); } - - private static void drawScene() - { - frame.getContentPane().removeAll(); - if (mechanics.contains(activePlayer)) - MechanicKeyBinds(); - else - SaboteurKeyBinds(); - for (int i =gmap.getComponents().size()-1; i>-1;i--){ - frame.add(gmap.getComponents().get(i).getLabel()); - frame.add(gmap.getComponents().get(i).getIdLabel()); - } - - - JLabel scoreLabel = new JLabel("SAB POINTS: "+sb.getSabPoints()+"
MEC POINTS: "+sb.getMechPoints()+"

ROUND: "+(30-roundNums)+"/30

AP: "+activePlayer.getAP()+"
"+activePlayer.getId()+"
"); - scoreLabel.setFont(new Font("Arial",1,20)); - scoreLabel.setBounds(frame.getWidth()-215,0,198, 220); - scoreLabel.setOpaque(true); - scoreLabel.setBackground(Color.GRAY); - frame.add(scoreLabel); - SwingUtilities.updateComponentTreeUI(frame); - - JLabel picLabel; - Image IMG; - ImageIcon icon ; - String filePath = "RESOURCES/IMAGES/Texture2D/"; - icon = new ImageIcon(filePath+"BG_desert.png"); - IMG = icon.getImage(); - picLabel = new JLabel(new ImageIcon(IMG)); - picLabel.setOpaque(false); - picLabel.setBounds(0, 0, 1280, 720); - frame.getContentPane().add(picLabel); - frame.setLayout(null); - frame.setVisible( true ); - frame.repaint(); - } - - private static void MechanicKeyBinds(){ - JLabel label2 = new JLabel("UP:..........................w
" + - "RIGHT:....................d
" + - "DOWN:....................s
" + - "LEFT:......................a
" + - "ESCAPE:................e
" + - "PASS:.....................q
" + - "SET PUMP:.............v
"+ - "PUNCTURE:............p
"+ - "FIX:..........................f
"+ - "STICKY:..................t
"+ - "COLLECT PUMP:...c
"+ - "PLACE PUMP:........g
"+ - "RELOCATE PIPE:...r
"+ - "DETACH PIPE:.......h
"); - label2.setFont(new Font("Arial",1,18)); - label2.setBounds(frame.getWidth()-215,210,198, frame.getHeight()-210); - label2.setOpaque(true); - label2.setBackground(Color.BLACK); - frame.add(label2); - } - - private static void SaboteurKeyBinds(){ - JLabel label = new JLabel("UP:..........................w
" + - "RIGHT:....................d
" + - "DOWN:....................s
" + - "LEFT:.......................a
" + - "ESCAPE:.................e
" + - "PASS:......................q
" + - "SET PUMP:..............v
"+ - "PUNCTURE:............p
"+ - "SLIPPERY:...............l
"+ - "STICKY:...................t
"); - label.setFont(new Font("Arial",1,18)); - label.setBounds(frame.getWidth()-215,210,198, frame.getHeight()-210); - label.setOpaque(true); - label.setBackground(Color.BLACK); - frame.add(label); - } -} +} \ No newline at end of file diff --git a/src/main/java/MyFrame.java b/src/main/java/MyFrame.java index 22f49ec..66826d5 100644 --- a/src/main/java/MyFrame.java +++ b/src/main/java/MyFrame.java @@ -1,42 +1,50 @@ import javax.swing.*; import java.awt.*; -import java.awt.geom.Line2D; -import java.util.ArrayList; import java.util.HashMap; public class MyFrame extends JFrame { + + private int pipeOffset; + private int activeXOffset; + private int activeYOffset; + + + + private HashMap pipes = new HashMap<>(); public void setPumps(HashMap p) { pipes = p; } - void drawLines(java.awt.Graphics g) { + + private void setOffsets(int i, Passive pipe){ + pipeOffset = i==0?20:-25; + int side = pipe.getNeighbours()[i].getNeighbourIndex(pipe); + activeXOffset=0; + activeYOffset=0; + if(side==0||side==2) + { + activeYOffset=(side==0?30:110); + activeXOffset = 50; + } + else + { + activeXOffset=(side==1?90:10); + activeYOffset=70; + } + } + + private void drawLines(java.awt.Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setStroke(new BasicStroke(5)); for (Passive pipe:pipes.values()) { int neighbourCount = pipe.getNeighbours().length; for(int i = 0;iUP:..........................w
" + + "RIGHT:....................d
" + + "DOWN:....................s
" + + "LEFT:......................a
" + + "ESCAPE:................e
" + + "PASS:.....................q
" + + "SET PUMP:.............v
"+ + "PUNCTURE:............p
"+ + "FIX:..........................f
"+ + "STICKY:..................t
"+ + "COLLECT PUMP:...c
"+ + "PLACE PUMP:........g
"+ + "RELOCATE PIPE:...r
"+ + "DETACH PIPE:.......h
"); + label2.setFont(new Font("Arial",1,18)); + label2.setBounds(frame.getWidth()-215,210,198, frame.getHeight()-210); + label2.setOpaque(true); + label2.setBackground(Color.BLACK); + frame.add(label2); + } + public static void SaboteurKeyBinds(){ + JLabel label = new JLabel("UP:..........................w
" + + "RIGHT:....................d
" + + "DOWN:....................s
" + + "LEFT:.......................a
" + + "ESCAPE:.................e
" + + "PASS:......................q
" + + "SET PUMP:..............v
"+ + "PUNCTURE:............p
"+ + "SLIPPERY:...............l
"+ + "STICKY:...................t
"); + label.setFont(new Font("Arial",1,18)); + label.setBounds(frame.getWidth()-215,210,198, frame.getHeight()-210); + label.setOpaque(true); + label.setBackground(Color.BLACK); + frame.add(label); + } + + public static void drawMainMenu(ActionListener al) { + JLabel picLabel; + Image IMG; + ImageIcon icon ; + String filePath = "RESOURCES/IMAGES/Texture2D/"; + icon = new ImageIcon(filePath+"BG_desert.png"); + IMG = icon.getImage(); + picLabel = new JLabel(new ImageIcon(IMG)); + picLabel.setOpaque(false); + picLabel.setBounds(0, 0, 1280, 720); + JButton newGameButton=new JButton("Start"); + newGameButton.setBounds(1280/2-100,200,200, 70); + newGameButton.addActionListener(al); + + frame.getContentPane().add(newGameButton); + JButton exitGameButton=new JButton("Exit"); + exitGameButton.setBounds(1280/2-100,400,200, 70); + exitGameButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + } ); + frame.getContentPane().add(exitGameButton); + frame.getContentPane().add(picLabel); + frame.setLayout(null); + frame.setVisible( true ); + frame.repaint(); + } + public static void endScreen(HashMap passiveComponents, GameKeyListener gameKeyListener) + { + passiveComponents.clear(); + frame.removeKeyListener(gameKeyListener); + frame.getContentPane().removeAll(); + frame.getContentPane().setBackground(Color.BLACK); + JLabel winTeam; + if(sb.getMechPoints()>sb.getSabPoints()) + { + winTeam = new JLabel("Mechanics won"); + winTeam.setBounds(1280/2-150,100,500,200); + } + else if (sb.getMechPoints() mechanics, Player activePlayer, GraphicsMap gmap, int roundNums) + { + frame.getContentPane().removeAll(); + if (mechanics.contains(activePlayer)) + MechanicKeyBinds(); + else + SaboteurKeyBinds(); + for (int i =gmap.getComponents().size()-1; i>-1;i--){ + frame.add(gmap.getComponents().get(i).getLabel()); + frame.add(gmap.getComponents().get(i).getIdLabel()); + } + + + JLabel scoreLabel = new JLabel("SAB POINTS: "+sb.getSabPoints()+"
MEC POINTS: "+sb.getMechPoints()+"

ROUND: "+(30-roundNums)+"/30

AP: "+activePlayer.getAP()+"
"+activePlayer.getId()+"
"); + scoreLabel.setFont(new Font("Arial",1,20)); + scoreLabel.setBounds(frame.getWidth()-215,0,198, 220); + scoreLabel.setOpaque(true); + scoreLabel.setBackground(Color.GRAY); + frame.add(scoreLabel); + SwingUtilities.updateComponentTreeUI(frame); + + JLabel picLabel; + Image IMG; + ImageIcon icon ; + String filePath = "RESOURCES/IMAGES/Texture2D/"; + icon = new ImageIcon(filePath+"BG_desert.png"); + IMG = icon.getImage(); + picLabel = new JLabel(new ImageIcon(IMG)); + picLabel.setOpaque(false); + picLabel.setBounds(0, 0, 1280, 720); + frame.getContentPane().add(picLabel); + frame.setLayout(null); + frame.setVisible( true ); + frame.repaint(); + } +} \ No newline at end of file