diff options
author | Starla Insigna <hatkirby@fourisland.com> | 2009-01-19 16:22:50 -0500 |
---|---|---|
committer | Starla Insigna <hatkirby@fourisland.com> | 2009-01-19 16:22:50 -0500 |
commit | 80fd704e66e98d70e98da977b01568b7813d80e9 (patch) | |
tree | 8ea16d1f3d37a212c42025e3fbc86d1f4c15545f | |
parent | 69b495c392bffe96dab97306a42466edd4b2474e (diff) | |
download | fourpuzzle-80fd704e66e98d70e98da977b01568b7813d80e9.tar.gz fourpuzzle-80fd704e66e98d70e98da977b01568b7813d80e9.tar.bz2 fourpuzzle-80fd704e66e98d70e98da977b01568b7813d80e9.zip |
Fixed MoveEvent bug
8 files changed, 147 insertions, 48 deletions
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java index bcc2ed7..b17d7b3 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/Map.java | |||
@@ -6,9 +6,9 @@ | |||
6 | package com.fourisland.fourpuzzle.gamestate.mapview; | 6 | package com.fourisland.fourpuzzle.gamestate.mapview; |
7 | 7 | ||
8 | import com.fourisland.fourpuzzle.*; | 8 | import com.fourisland.fourpuzzle.*; |
9 | import com.fourisland.fourpuzzle.gamestate.mapview.event.EventList; | ||
9 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; | 10 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; |
10 | import java.awt.Dimension; | 11 | import java.awt.Dimension; |
11 | import java.util.ArrayList; | ||
12 | import java.util.HashMap; | 12 | import java.util.HashMap; |
13 | import java.util.Vector; | 13 | import java.util.Vector; |
14 | 14 | ||
@@ -41,19 +41,18 @@ public abstract class Map { | |||
41 | } | 41 | } |
42 | } | 42 | } |
43 | 43 | ||
44 | private ArrayList<LayerEvent> events = new ArrayList<LayerEvent>(); | 44 | private EventList events = new EventList(); |
45 | public ArrayList<LayerEvent> getEvents() | 45 | public EventList getEvents() |
46 | { | 46 | { |
47 | return events; | 47 | return events; |
48 | } | 48 | } |
49 | public LayerEvent getEvent(String event) | 49 | public LayerEvent getEvent(String event) |
50 | { | 50 | { |
51 | int i=0; | 51 | for (LayerEvent ev : events) |
52 | for (i=0;i<events.size();i++) | ||
53 | { | 52 | { |
54 | if (events.get(i).getLabel().equals(event)) | 53 | if (ev.getLabel().equals(event)) |
55 | { | 54 | { |
56 | return events.get(i); | 55 | return ev; |
57 | } | 56 | } |
58 | } | 57 | } |
59 | 58 | ||
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java index 0e5ec44..6aeac83 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/MapViewGameState.java | |||
@@ -13,10 +13,12 @@ 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.EventList; | ||
16 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; | 17 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; |
18 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventThread; | ||
19 | import com.fourisland.fourpuzzle.util.Functions; | ||
17 | import java.awt.Graphics2D; | 20 | import java.awt.Graphics2D; |
18 | import java.awt.event.KeyEvent; | 21 | import java.awt.event.KeyEvent; |
19 | import java.util.ArrayList; | ||
20 | 22 | ||
21 | /** | 23 | /** |
22 | * | 24 | * |
@@ -67,7 +69,7 @@ public class MapViewGameState implements GameState { | |||
67 | debugWalkthrough = false; | 69 | debugWalkthrough = false; |
68 | } | 70 | } |
69 | 71 | ||
70 | if (!hero.isMoving()) | 72 | if (!hero.isMoving() && !MoveEventThread.isHeroMoving()) |
71 | { | 73 | { |
72 | Direction toMove = null; | 74 | Direction toMove = null; |
73 | Boolean letsMove = false; | 75 | Boolean letsMove = false; |
@@ -104,29 +106,22 @@ public class MapViewGameState implements GameState { | |||
104 | 106 | ||
105 | if ((Game.getKey().getKeyCode() == KeyEvent.VK_ENTER) || (Game.getKey().getKeyCode() == KeyEvent.VK_SPACE)) | 107 | if ((Game.getKey().getKeyCode() == KeyEvent.VK_ENTER) || (Game.getKey().getKeyCode() == KeyEvent.VK_SPACE)) |
106 | { | 108 | { |
107 | int i=0; | 109 | for (LayerEvent ev : currentMap.getEvents()) |
108 | for (i=0;i<currentMap.getEvents().size();i++) | ||
109 | { | 110 | { |
110 | LayerEvent ev = currentMap.getEvents().get(i); | ||
111 | |||
112 | if (ev.getCalltime() == EventCallTime.PushKey) | 111 | if (ev.getCalltime() == EventCallTime.PushKey) |
113 | { | 112 | { |
114 | if ((hero.getDirection() == Direction.North) && (ev.getLocation().x == hero.getLocation().x) && (ev.getLocation().y == (hero.getLocation().y - 1))) | 113 | if (ev.getLayer() == Layer.Middle) |
115 | { | ||
116 | ev.setDirection(Direction.South); | ||
117 | ev.getCallback().run(); | ||
118 | } else if ((hero.getDirection() == Direction.West) && (ev.getLocation().x == (hero.getLocation().x - 1)) && (ev.getLocation().y == hero.getLocation().y)) | ||
119 | { | ||
120 | ev.setDirection(Direction.East); | ||
121 | ev.getCallback().run(); | ||
122 | } else if ((hero.getDirection() == Direction.South) && (ev.getLocation().x == hero.getLocation().x) && (ev.getLocation().y == (hero.getLocation().y + 1))) | ||
123 | { | 114 | { |
124 | ev.setDirection(Direction.North); | 115 | if (Functions.isFacing(hero, ev)) |
125 | ev.getCallback().run(); | 116 | { |
126 | } else if ((hero.getDirection() == Direction.East) && (ev.getLocation().x == (hero.getLocation().x + 1)) && (ev.getLocation().y == hero.getLocation().y)) | 117 | ev.setDirection(Functions.oppositeDirection(hero.getDirection())); |
127 | { | 118 | ev.getCallback().activate(); |
128 | ev.setDirection(Direction.West); | 119 | } |
129 | ev.getCallback().run(); | 120 | } else { |
121 | if (ev.getLocation().equals(hero.getLocation())) | ||
122 | { | ||
123 | ev.getCallback().activate(); | ||
124 | } | ||
130 | } | 125 | } |
131 | } | 126 | } |
132 | } | 127 | } |
@@ -145,14 +140,16 @@ public class MapViewGameState implements GameState { | |||
145 | hero.processMoving(); | 140 | hero.processMoving(); |
146 | } | 141 | } |
147 | 142 | ||
148 | int i=0; | 143 | for (LayerEvent ev : currentMap.getEvents()) |
149 | for (i=0;i<currentMap.getEvents().size();i++) | ||
150 | { | 144 | { |
151 | if (!currentMap.getEvents().get(i).isMoving()) | 145 | if (!ev.isMoving()) |
152 | { | 146 | { |
153 | currentMap.getEvents().get(i).startMoving(currentMap); | 147 | if (!MoveEventThread.isOtherMoving(ev)) |
148 | { | ||
149 | ev.startMoving(currentMap); | ||
150 | } | ||
154 | } else { | 151 | } else { |
155 | currentMap.getEvents().get(i).processMoving(); | 152 | ev.processMoving(); |
156 | } | 153 | } |
157 | } | 154 | } |
158 | } | 155 | } |
@@ -183,10 +180,10 @@ public class MapViewGameState implements GameState { | |||
183 | mv.draw(g, true);*/ | 180 | mv.draw(g, true);*/ |
184 | Game.getSaveFile().getHero().render(g); | 181 | Game.getSaveFile().getHero().render(g); |
185 | 182 | ||
186 | ArrayList<LayerEvent> events = currentMap.getEvents(); | 183 | EventList events = currentMap.getEvents(); |
187 | for (i=0;i<events.size();i++) | 184 | for (LayerEvent event : events) |
188 | { | 185 | { |
189 | events.get(i).render(g); | 186 | event.render(g); |
190 | } | 187 | } |
191 | 188 | ||
192 | for (i=0;i<currentMap.getMapData().size();i++) | 189 | for (i=0;i<currentMap.getMapData().size();i++) |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java index daca678..3bbde17 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventCall.java | |||
@@ -22,4 +22,9 @@ public abstract class EventCall extends SpecialEvent implements Runnable { | |||
22 | 22 | ||
23 | public abstract void run(); | 23 | public abstract void run(); |
24 | 24 | ||
25 | public void activate() | ||
26 | { | ||
27 | new Thread(this, "Special Event").start(); | ||
28 | } | ||
29 | |||
25 | } | 30 | } |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventList.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventList.java new file mode 100644 index 0000000..a10aadc --- /dev/null +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/EventList.java | |||
@@ -0,0 +1,42 @@ | |||
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.Vector; | ||
9 | |||
10 | /** | ||
11 | * | ||
12 | * @author hatkirby | ||
13 | */ | ||
14 | public class EventList extends Vector<LayerEvent> { | ||
15 | |||
16 | @Override | ||
17 | public boolean add(LayerEvent o) | ||
18 | { | ||
19 | if (o.getLabel().equals("Unlabelled")) | ||
20 | { | ||
21 | o.setLabel("Event" + (this.size()+1)); | ||
22 | } else { | ||
23 | if ( (o.getLabel().equals("Hero")) || | ||
24 | (o.getLabel().equals("Unlabelled")) || | ||
25 | (o.getLabel().equals(""))) | ||
26 | { | ||
27 | return false; | ||
28 | } | ||
29 | |||
30 | for (Event ev : this) | ||
31 | { | ||
32 | if (ev.getLabel().equals(o.getLabel())) | ||
33 | { | ||
34 | return false; | ||
35 | } | ||
36 | } | ||
37 | } | ||
38 | |||
39 | return super.add(o); | ||
40 | } | ||
41 | |||
42 | } | ||
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java index 92cfd54..b67f2aa 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/LayerEvent.java | |||
@@ -27,6 +27,7 @@ public class LayerEvent implements Event { | |||
27 | { | 27 | { |
28 | location = new Point(x,y); | 28 | location = new Point(x,y); |
29 | events = new ArrayList<PossibleEvent>(); | 29 | events = new ArrayList<PossibleEvent>(); |
30 | label = "Unlabelled"; | ||
30 | } | 31 | } |
31 | 32 | ||
32 | /** Create a new Event instance | 33 | /** Create a new Event instance |
@@ -204,4 +205,8 @@ public class LayerEvent implements Event { | |||
204 | return getPossibleEvent().getCallback(); | 205 | return getPossibleEvent().getCallback(); |
205 | } | 206 | } |
206 | 207 | ||
207 | } | 208 | public void setLabel(String string) { |
209 | this.label = string; | ||
210 | } | ||
211 | |||
212 | } \ No newline at end of file | ||
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java index 26f89c7..121bbe8 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/SpecialEvent.java | |||
@@ -6,10 +6,9 @@ | |||
6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; | 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event; |
7 | 7 | ||
8 | import com.fourisland.fourpuzzle.*; | 8 | import com.fourisland.fourpuzzle.*; |
9 | import com.fourisland.fourpuzzle.gamestate.mapview.MapViewGameState; | ||
9 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEvent; | 10 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEvent; |
10 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventThread; | 11 | import com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove.MoveEventThread; |
11 | import java.util.concurrent.BrokenBarrierException; | ||
12 | import java.util.concurrent.CyclicBarrier; | ||
13 | import java.util.logging.Level; | 12 | import java.util.logging.Level; |
14 | import java.util.logging.Logger; | 13 | import java.util.logging.Logger; |
15 | 14 | ||
@@ -102,18 +101,18 @@ public class SpecialEvent { | |||
102 | */ | 101 | */ |
103 | public void MoveEvent(MoveEvent[] actions) | 102 | public void MoveEvent(MoveEvent[] actions) |
104 | { | 103 | { |
105 | MoveEvent(actions, Game.getHeroEvent()); | 104 | new Thread(new MoveEventThread(Game.getHeroEvent(), actions)).start(); |
106 | } | 105 | } |
107 | 106 | ||
108 | /** | 107 | /** |
109 | * Performs actions on an event | 108 | * Performs actions on an event |
110 | * | 109 | * |
111 | * @param actions An array of MoveEvents to perform on the event | 110 | * @param actions An array of MoveEvents to perform on the event |
112 | * @param ev The event to act upon | 111 | * @param label The label of the event to act upon |
113 | */ | 112 | */ |
114 | public void MoveEvent(MoveEvent[] actions, Event ev) | 113 | public void MoveEvent(MoveEvent[] actions, String label) |
115 | { | 114 | { |
116 | new Thread(new MoveEventThread(ev, actions)).start(); | 115 | new Thread(new MoveEventThread(((MapViewGameState) Game.getGameState()).getCurrentMap().getEvent(label), actions)).start(); |
117 | } | 116 | } |
118 | 117 | ||
119 | /** | 118 | /** |
diff --git a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java index 4c16197..d6971f3 100644 --- a/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java +++ b/src/com/fourisland/fourpuzzle/gamestate/mapview/event/specialmove/MoveEventThread.java | |||
@@ -5,9 +5,12 @@ | |||
5 | 5 | ||
6 | package com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove; | 6 | package com.fourisland.fourpuzzle.gamestate.mapview.event.specialmove; |
7 | 7 | ||
8 | import com.fourisland.fourpuzzle.Game; | ||
8 | import com.fourisland.fourpuzzle.gamestate.mapview.event.Event; | 9 | import com.fourisland.fourpuzzle.gamestate.mapview.event.Event; |
10 | import com.fourisland.fourpuzzle.gamestate.mapview.event.LayerEvent; | ||
11 | import java.util.List; | ||
12 | import java.util.Vector; | ||
9 | import java.util.concurrent.CountDownLatch; | 13 | import java.util.concurrent.CountDownLatch; |
10 | import java.util.concurrent.CyclicBarrier; | ||
11 | import java.util.logging.Level; | 14 | import java.util.logging.Level; |
12 | import java.util.logging.Logger; | 15 | import java.util.logging.Logger; |
13 | 16 | ||
@@ -19,6 +22,7 @@ public class MoveEventThread implements Runnable { | |||
19 | 22 | ||
20 | public static volatile CountDownLatch moveEventWait = new CountDownLatch(0); | 23 | public static volatile CountDownLatch moveEventWait = new CountDownLatch(0); |
21 | public static volatile int countMoveEventThreads = 0; | 24 | public static volatile int countMoveEventThreads = 0; |
25 | public static volatile List<Event> events = new Vector<Event>(); | ||
22 | 26 | ||
23 | Event ev; | 27 | Event ev; |
24 | MoveEvent[] actions; | 28 | MoveEvent[] actions; |
@@ -29,22 +33,36 @@ public class MoveEventThread implements Runnable { | |||
29 | this.actions = actions; | 33 | this.actions = actions; |
30 | } | 34 | } |
31 | 35 | ||
32 | public void run() { | 36 | public void run() |
37 | { | ||
38 | events.add(ev); | ||
39 | |||
33 | MoveEventThread.countMoveEventThreads++; | 40 | MoveEventThread.countMoveEventThreads++; |
34 | moveEventWait = new CountDownLatch(countMoveEventThreads); | 41 | moveEventWait = new CountDownLatch(countMoveEventThreads); |
35 | 42 | ||
36 | int i=0; | 43 | for (MoveEvent action : actions) |
37 | for (i=0;i<actions.length;i++) | ||
38 | { | 44 | { |
39 | try { | 45 | try { |
40 | actions[i].doAction(ev); | 46 | action.doAction(ev); |
41 | } catch (Exception ex) { | 47 | } catch (Exception ex) { |
42 | Logger.getLogger(MoveEventThread.class.getName()).log(Level.SEVERE, null, ex); | 48 | Logger.getLogger(MoveEventThread.class.getName()).log(Level.SEVERE, null, ex); |
43 | } | 49 | } |
44 | } | 50 | } |
45 | 51 | ||
52 | events.remove(ev); | ||
53 | |||
46 | MoveEventThread.countMoveEventThreads--; | 54 | MoveEventThread.countMoveEventThreads--; |
47 | moveEventWait.countDown(); | 55 | moveEventWait.countDown(); |
48 | } | 56 | } |
57 | |||
58 | public static boolean isHeroMoving() | ||
59 | { | ||
60 | return (events.contains(Game.getHeroEvent())); | ||
61 | } | ||
62 | |||
63 | public static boolean isOtherMoving(LayerEvent event) | ||
64 | { | ||
65 | return (events.contains(event)); | ||
66 | } | ||
49 | 67 | ||
50 | } | 68 | } |
diff --git a/src/com/fourisland/fourpuzzle/util/Functions.java b/src/com/fourisland/fourpuzzle/util/Functions.java index 5eb70cd..d1995f9 100644 --- a/src/com/fourisland/fourpuzzle/util/Functions.java +++ b/src/com/fourisland/fourpuzzle/util/Functions.java | |||
@@ -5,6 +5,8 @@ | |||
5 | 5 | ||
6 | package com.fourisland.fourpuzzle.util; | 6 | package com.fourisland.fourpuzzle.util; |
7 | 7 | ||
8 | import com.fourisland.fourpuzzle.Direction; | ||
9 | import com.fourisland.fourpuzzle.gamestate.mapview.event.Event; | ||
8 | import com.fourisland.fourpuzzle.gamestate.mapview.event.PossibleEvent; | 10 | import com.fourisland.fourpuzzle.gamestate.mapview.event.PossibleEvent; |
9 | 11 | ||
10 | /** | 12 | /** |
@@ -27,5 +29,37 @@ public class Functions { | |||
27 | 29 | ||
28 | return false; | 30 | return false; |
29 | } | 31 | } |
32 | |||
33 | public static boolean isFacing(Event ev1, Event ev2) throws Exception | ||
34 | { | ||
35 | if ((ev1.getDirection() == Direction.North) && (ev2.getLocation().x == ev1.getLocation().x) && (ev2.getLocation().y == (ev1.getLocation().y - 1))) | ||
36 | { | ||
37 | return true; | ||
38 | } else if ((ev1.getDirection() == Direction.West) && (ev2.getLocation().x == (ev1.getLocation().x - 1)) && (ev2.getLocation().y == ev1.getLocation().y)) | ||
39 | { | ||
40 | return true; | ||
41 | } else if ((ev1.getDirection() == Direction.South) && (ev2.getLocation().x == ev1.getLocation().x) && (ev2.getLocation().y == (ev1.getLocation().y + 1))) | ||
42 | { | ||
43 | return true; | ||
44 | } else if ((ev1.getDirection() == Direction.East) && (ev2.getLocation().x == (ev1.getLocation().x + 1)) && (ev2.getLocation().y == ev1.getLocation().y)) | ||
45 | { | ||
46 | return true; | ||
47 | } | ||
48 | |||
49 | return false; | ||
50 | } | ||
51 | |||
52 | public static Direction oppositeDirection(Direction dir) | ||
53 | { | ||
54 | switch (dir) | ||
55 | { | ||
56 | case North: return Direction.South; | ||
57 | case West: return Direction.East; | ||
58 | case South: return Direction.North; | ||
59 | case East: return Direction.West; | ||
60 | } | ||
61 | |||
62 | return null; | ||
63 | } | ||
30 | 64 | ||
31 | } | 65 | } |