diff options
Diffstat (limited to 'src/com')
5 files changed, 95 insertions, 6 deletions
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java index 0604dd0..65d2d2d 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java | |||
| @@ -13,6 +13,7 @@ import com.fourisland.fourpuzzle.Game; | |||
| 13 | import com.fourisland.fourpuzzle.Layer; | 13 | import com.fourisland.fourpuzzle.Layer; |
| 14 | import com.fourisland.fourpuzzle.PuzzleApplication; | 14 | import com.fourisland.fourpuzzle.PuzzleApplication; |
| 15 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventCallTime; | 15 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventCallTime; |
| 16 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventHandler; | ||
| 16 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventList; | 17 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventList; |
| 17 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; | 18 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; |
| 18 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventThread; | 19 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventThread; |
| @@ -72,7 +73,7 @@ public class MapViewGameState implements GameState { | |||
| 72 | debugWalkthrough = false; | 73 | debugWalkthrough = false; |
| 73 | } | 74 | } |
| 74 | 75 | ||
| 75 | if (!hero.isMoving() && !MoveEventThread.isHeroMoving()) | 76 | if (!hero.isMoving() && !MoveEventThread.isHeroMoving() && !EventHandler.isRunningEvent()) |
| 76 | { | 77 | { |
| 77 | Direction toMove = null; | 78 | Direction toMove = null; |
| 78 | Boolean letsMove = false; | 79 | Boolean letsMove = false; |
| @@ -113,12 +114,12 @@ public class MapViewGameState implements GameState { | |||
| 113 | if (Functions.isFacing(hero, ev)) | 114 | if (Functions.isFacing(hero, ev)) |
| 114 | { | 115 | { |
| 115 | ev.setDirection(Functions.oppositeDirection(hero.getDirection())); | 116 | ev.setDirection(Functions.oppositeDirection(hero.getDirection())); |
| 116 | ev.getCallback().activate(); | 117 | ev.getCallback().activate(ev.getCalltime()); |
| 117 | } | 118 | } |
| 118 | } else { | 119 | } else { |
| 119 | if (ev.getLocation().equals(hero.getLocation())) | 120 | if (ev.getLocation().equals(hero.getLocation())) |
| 120 | { | 121 | { |
| 121 | ev.getCallback().activate(); | 122 | ev.getCallback().activate(ev.getCalltime()); |
| 122 | } | 123 | } |
| 123 | } | 124 | } |
| 124 | } | 125 | } |
| @@ -144,11 +145,19 @@ public class MapViewGameState implements GameState { | |||
| 144 | { | 145 | { |
| 145 | if (!MoveEventThread.isOtherMoving(ev)) | 146 | if (!MoveEventThread.isOtherMoving(ev)) |
| 146 | { | 147 | { |
| 147 | ev.startMoving(currentMap); | 148 | if (!EventHandler.isRunningEvent()) |
| 149 | { | ||
| 150 | ev.startMoving(currentMap); | ||
| 151 | } | ||
| 148 | } | 152 | } |
| 149 | } else { | 153 | } else { |
| 150 | ev.processMoving(); | 154 | ev.processMoving(); |
| 151 | } | 155 | } |
| 156 | |||
| 157 | if (ev.getCalltime() == EventCallTime.ParallelProcess) | ||
| 158 | { | ||
| 159 | ev.getCallback().activate(ev.getCalltime()); | ||
| 160 | } | ||
| 152 | } | 161 | } |
| 153 | } | 162 | } |
| 154 | 163 | ||
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java index 3bbde17..64ca592 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | 5 | ||
| 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; | 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; |
| 7 | 7 | ||
| 8 | import java.util.concurrent.Future; | ||
| 9 | |||
| 8 | /** | 10 | /** |
| 9 | * | 11 | * |
| 10 | * @author hatkirby | 12 | * @author hatkirby |
| @@ -22,9 +24,18 @@ public abstract class EventCall extends SpecialEvent implements Runnable { | |||
| 22 | 24 | ||
| 23 | public abstract void run(); | 25 | public abstract void run(); |
| 24 | 26 | ||
| 25 | public void activate() | 27 | private Future isRunning = null; |
| 28 | public void activate(EventCallTime calltime) | ||
| 26 | { | 29 | { |
| 27 | new Thread(this, "Special Event").start(); | 30 | if ((isRunning == null) || (isRunning.isDone())) |
| 31 | { | ||
| 32 | if (calltime == EventCallTime.ParallelProcess) | ||
| 33 | { | ||
| 34 | isRunning = EventHandler.runParallel(this); | ||
| 35 | } else { | ||
| 36 | isRunning = EventHandler.runEvent(this); | ||
| 37 | } | ||
| 38 | } | ||
| 28 | } | 39 | } |
| 29 | 40 | ||
| 30 | } | 41 | } |
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventHandler.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventHandler.java new file mode 100644 index 0000000..05997e0 --- /dev/null +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventHandler.java | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | /* | ||
| 2 | * To change this template, choose Tools | Templates | ||
| 3 | * and open the template in the editor. | ||
| 4 | */ | ||
| 5 | |||
| 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; | ||
| 7 | |||
| 8 | import java.util.concurrent.ExecutorService; | ||
| 9 | import java.util.concurrent.Executors; | ||
| 10 | import java.util.concurrent.Future; | ||
| 11 | |||
| 12 | |||
| 13 | /** | ||
| 14 | * | ||
| 15 | * @author hatkirby | ||
| 16 | */ | ||
| 17 | public class EventHandler { | ||
| 18 | |||
| 19 | private static ExecutorService eventExecutorService = Executors.newSingleThreadExecutor(); | ||
| 20 | private static ExecutorService parallelExecutorService = Executors.newCachedThreadPool(); | ||
| 21 | private static Future eventAction = null; | ||
| 22 | |||
| 23 | static { | ||
| 24 | Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { | ||
| 25 | public void run() | ||
| 26 | { | ||
| 27 | eventExecutorService.shutdownNow(); | ||
| 28 | parallelExecutorService.shutdownNow(); | ||
| 29 | } | ||
| 30 | })); | ||
| 31 | } | ||
| 32 | |||
| 33 | public static Future runEvent(EventCall callback) | ||
| 34 | { | ||
| 35 | eventAction = eventExecutorService.submit(callback); | ||
| 36 | return eventAction; | ||
| 37 | } | ||
| 38 | |||
| 39 | public static Future runParallel(EventCall callback) | ||
| 40 | { | ||
| 41 | return parallelExecutorService.submit(callback); | ||
| 42 | } | ||
| 43 | |||
| 44 | public static boolean isRunningEvent() | ||
| 45 | { | ||
| 46 | if (eventAction == null) | ||
| 47 | { | ||
| 48 | return false; | ||
| 49 | } | ||
| 50 | |||
| 51 | return (!eventAction.isDone()); | ||
| 52 | } | ||
| 53 | |||
| 54 | } | ||
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java index b7a6ec7..8b9e3fb 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/HeroEvent.java | |||
| @@ -33,6 +33,15 @@ public class HeroEvent extends AbstractEvent implements Event { | |||
| 33 | public void render(Graphics g) | 33 | public void render(Graphics g) |
| 34 | { | 34 | { |
| 35 | GameCharacter toDraw = Game.getSaveFile().getParty().getLeader(); | 35 | GameCharacter toDraw = Game.getSaveFile().getParty().getLeader(); |
| 36 | |||
| 37 | /* TODO Replace below condition with an instanceof check to | ||
| 38 | * see if toDraw.getGraphic() is an instance of BlankEventGraphic. | ||
| 39 | * The current way does not, in fact, work because an EventGraphic | ||
| 40 | * never be equal to a String. This current way only exists because | ||
| 41 | * HeroEvent's graphic used to be stored as a filename/offset combo | ||
| 42 | * instead of as an EventGraphic. | ||
| 43 | */ | ||
| 44 | |||
| 36 | if (!toDraw.getGraphic().equals("blank")) | 45 | if (!toDraw.getGraphic().equals("blank")) |
| 37 | { | 46 | { |
| 38 | toDraw.getGraphic().setDirection(direction); | 47 | toDraw.getGraphic().setDirection(direction); |
| diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java index 1fac317..6201fc8 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java | |||
| @@ -78,6 +78,12 @@ public class LayerEvent extends AbstractEvent implements Event { | |||
| 78 | public void render(Graphics g) | 78 | public void render(Graphics g) |
| 79 | { | 79 | { |
| 80 | PossibleEvent toDraw = getPossibleEvent(); | 80 | PossibleEvent toDraw = getPossibleEvent(); |
| 81 | |||
| 82 | /* TODO Replace below condition with an instanceof check to | ||
| 83 | * see if toDraw.getGraphic() is an instance of BlankEventGraphic. | ||
| 84 | * The current way requires BlankEventGraphic() to be instantated | ||
| 85 | * many times for no reason. */ | ||
| 86 | |||
| 81 | if (!toDraw.getGraphic().equals(new BlankEventGraphic())) | 87 | if (!toDraw.getGraphic().equals(new BlankEventGraphic())) |
| 82 | { | 88 | { |
| 83 | g.drawImage(toDraw.getImage(), getRenderX(), getRenderY(), null); | 89 | g.drawImage(toDraw.getImage(), getRenderX(), getRenderY(), null); |
