1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38sm/**
20cfd74d65d832137e20e193c960802afba73b5d38sm * A system for testing positions against "hot spots" embedded in the level tile map data.
21cfd74d65d832137e20e193c960802afba73b5d38sm * A level may contain a layer of "hot spots," tiles that provide a hint to the game objects about
22cfd74d65d832137e20e193c960802afba73b5d38sm * how to act in that particular area of the game world.  Hot spots are commonly used to direct AI
23cfd74d65d832137e20e193c960802afba73b5d38sm * characters, or to define areas where special collision rules apply (e.g. regions that cause
24cfd74d65d832137e20e193c960802afba73b5d38sm * instant death when entered).
25cfd74d65d832137e20e193c960802afba73b5d38sm */
26cfd74d65d832137e20e193c960802afba73b5d38smpublic class HotSpotSystem extends BaseObject {
27cfd74d65d832137e20e193c960802afba73b5d38sm    TiledWorld mWorld;
28cfd74d65d832137e20e193c960802afba73b5d38sm
29cfd74d65d832137e20e193c960802afba73b5d38sm    public class HotSpotType {
30cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NONE = -1;
31cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int GO_RIGHT = 0;
32cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int GO_LEFT = 1;
33cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int GO_UP = 2;
34cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int GO_DOWN = 3;
35cfd74d65d832137e20e193c960802afba73b5d38sm
36cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int WAIT_SHORT = 4;
37cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int WAIT_MEDIUM = 5;
38cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int WAIT_LONG = 6;
39cfd74d65d832137e20e193c960802afba73b5d38sm
40cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int ATTACK = 7;
41cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int TALK = 8;
42cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int DIE = 9;
43cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int WALK_AND_TALK = 10;
44cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int TAKE_CAMERA_FOCUS = 11;
45cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int RELEASE_CAMERA_FOCUS = 12;
46cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int END_LEVEL = 13;
47cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int GAME_EVENT = 14;
48cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_RUN_QUEUED_COMMANDS = 15;
49cfd74d65d832137e20e193c960802afba73b5d38sm
50cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_RIGHT = 16;
51cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_LEFT = 17;
52cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_UP = 18;
53cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_DOWN = 19;
54cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_UP_RIGHT = 20;
55cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_UP_LEFT = 21;
56cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_DOWN_LEFT = 22;
57cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_DOWN_RIGHT = 23;
58cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_TOWARDS_PLAYER = 24;
59cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_RANDOM = 25;
60cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_UP_FROM_GROUND = 26;
61cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_GO_DOWN_FROM_CEILING = 27;
62cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_STOP = 28;
63cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SLOW = 29;
64cfd74d65d832137e20e193c960802afba73b5d38sm
65cfd74d65d832137e20e193c960802afba73b5d38sm
66cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_1_1 = 32;
67cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_1_2 = 33;
68cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_1_3 = 34;
69cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_1_4 = 35;
70cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_1_5 = 36;
71cfd74d65d832137e20e193c960802afba73b5d38sm
72cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_2_1 = 38;
73cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_2_2 = 39;
74cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_2_3 = 40;
75cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_2_4 = 41;
76cfd74d65d832137e20e193c960802afba73b5d38sm        public static final int NPC_SELECT_DIALOG_2_5 = 42;
77cfd74d65d832137e20e193c960802afba73b5d38sm
78cfd74d65d832137e20e193c960802afba73b5d38sm
79cfd74d65d832137e20e193c960802afba73b5d38sm
80cfd74d65d832137e20e193c960802afba73b5d38sm    }
81cfd74d65d832137e20e193c960802afba73b5d38sm
82cfd74d65d832137e20e193c960802afba73b5d38sm    public HotSpotSystem() {
83cfd74d65d832137e20e193c960802afba73b5d38sm        super();
84cfd74d65d832137e20e193c960802afba73b5d38sm    }
85cfd74d65d832137e20e193c960802afba73b5d38sm
86cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
87cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
88cfd74d65d832137e20e193c960802afba73b5d38sm        mWorld = null;
89cfd74d65d832137e20e193c960802afba73b5d38sm    }
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm    public final void setWorld(TiledWorld world) {
92cfd74d65d832137e20e193c960802afba73b5d38sm        mWorld = world;
93cfd74d65d832137e20e193c960802afba73b5d38sm    }
94cfd74d65d832137e20e193c960802afba73b5d38sm
95cfd74d65d832137e20e193c960802afba73b5d38sm    public int getHotSpot(float worldX, float worldY) {
96cfd74d65d832137e20e193c960802afba73b5d38sm        //TOOD: take a region?  how do we deal with multiple hot spot intersections?
97cfd74d65d832137e20e193c960802afba73b5d38sm        int result = HotSpotType.NONE;
98cfd74d65d832137e20e193c960802afba73b5d38sm        if (mWorld != null) {
99cfd74d65d832137e20e193c960802afba73b5d38sm
100cfd74d65d832137e20e193c960802afba73b5d38sm            final int xTile = getHitTileX(worldX);
101cfd74d65d832137e20e193c960802afba73b5d38sm            final int yTile = getHitTileY(worldY);
102cfd74d65d832137e20e193c960802afba73b5d38sm
103cfd74d65d832137e20e193c960802afba73b5d38sm            result = mWorld.getTile(xTile, yTile);
104cfd74d65d832137e20e193c960802afba73b5d38sm        }
105cfd74d65d832137e20e193c960802afba73b5d38sm
106cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
107cfd74d65d832137e20e193c960802afba73b5d38sm    }
108cfd74d65d832137e20e193c960802afba73b5d38sm
109cfd74d65d832137e20e193c960802afba73b5d38sm    public int getHotSpotByTile(int tileX, int tileY) {
110cfd74d65d832137e20e193c960802afba73b5d38sm        //TOOD: take a region?  how do we deal with multiple hot spot intersections?
111cfd74d65d832137e20e193c960802afba73b5d38sm        int result = HotSpotType.NONE;
112cfd74d65d832137e20e193c960802afba73b5d38sm        if (mWorld != null) {
113cfd74d65d832137e20e193c960802afba73b5d38sm            result = mWorld.getTile(tileX, tileY);
114cfd74d65d832137e20e193c960802afba73b5d38sm        }
115cfd74d65d832137e20e193c960802afba73b5d38sm
116cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
117cfd74d65d832137e20e193c960802afba73b5d38sm    }
118cfd74d65d832137e20e193c960802afba73b5d38sm
119cfd74d65d832137e20e193c960802afba73b5d38sm    public final int getHitTileX(float worldX) {
120cfd74d65d832137e20e193c960802afba73b5d38sm        int xTile = 0;
121cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
122cfd74d65d832137e20e193c960802afba73b5d38sm        if (mWorld != null && level != null) {
123cfd74d65d832137e20e193c960802afba73b5d38sm            final float worldPixelWidth = level.getLevelWidth();
124cfd74d65d832137e20e193c960802afba73b5d38sm            xTile = (int)Math.floor(((worldX) / worldPixelWidth) * mWorld.getWidth());
125cfd74d65d832137e20e193c960802afba73b5d38sm        }
126cfd74d65d832137e20e193c960802afba73b5d38sm        return xTile;
127cfd74d65d832137e20e193c960802afba73b5d38sm    }
128cfd74d65d832137e20e193c960802afba73b5d38sm
129cfd74d65d832137e20e193c960802afba73b5d38sm    public final int getHitTileY(float worldY) {
130cfd74d65d832137e20e193c960802afba73b5d38sm        int yTile = 0;
131cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
132cfd74d65d832137e20e193c960802afba73b5d38sm        if (mWorld != null && level != null) {
133cfd74d65d832137e20e193c960802afba73b5d38sm            final float worldPixelHeight = level.getLevelHeight();
134cfd74d65d832137e20e193c960802afba73b5d38sm            // TODO: it is stupid to keep doing this space conversion all over the code.  Fix this
135cfd74d65d832137e20e193c960802afba73b5d38sm            // in the TiledWorld code!
136cfd74d65d832137e20e193c960802afba73b5d38sm            final float flippedY = worldPixelHeight - (worldY);
137cfd74d65d832137e20e193c960802afba73b5d38sm            yTile = (int)Math.floor((flippedY / worldPixelHeight) * mWorld.getHeight());
138cfd74d65d832137e20e193c960802afba73b5d38sm        }
139cfd74d65d832137e20e193c960802afba73b5d38sm        return yTile;
140cfd74d65d832137e20e193c960802afba73b5d38sm    }
141cfd74d65d832137e20e193c960802afba73b5d38sm
142cfd74d65d832137e20e193c960802afba73b5d38sm    public final float getTileCenterWorldPositionX(int tileX) {
143cfd74d65d832137e20e193c960802afba73b5d38sm        float worldX = 0.0f;
144cfd74d65d832137e20e193c960802afba73b5d38sm    	LevelSystem level = sSystemRegistry.levelSystem;
145cfd74d65d832137e20e193c960802afba73b5d38sm        if (mWorld != null && level != null) {
146cfd74d65d832137e20e193c960802afba73b5d38sm            final float tileWidth = level.getLevelWidth() / mWorld.getWidth();
147cfd74d65d832137e20e193c960802afba73b5d38sm            worldX = (tileX * tileWidth) + (tileWidth / 2.0f);
148cfd74d65d832137e20e193c960802afba73b5d38sm        }
149cfd74d65d832137e20e193c960802afba73b5d38sm        return worldX;
150cfd74d65d832137e20e193c960802afba73b5d38sm    }
151cfd74d65d832137e20e193c960802afba73b5d38sm
152cfd74d65d832137e20e193c960802afba73b5d38sm}
153