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
19cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.Comparator;
20cfd74d65d832137e20e193c960802afba73b5d38sm
21cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.AnimationComponent.PlayerAnimations;
22cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.CollisionParameters.HitType;
23cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.EnemyAnimationComponent.EnemyAnimations;
24cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.ActionType;
25cfd74d65d832137e20e193c960802afba73b5d38smimport com.replica.replicaisland.GameObject.Team;
262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport com.replica.replicaisland.GenericAnimationComponent.Animation;
27cfd74d65d832137e20e193c960802afba73b5d38sm
28cfd74d65d832137e20e193c960802afba73b5d38sm/** A class for generating game objects at runtime.
29cfd74d65d832137e20e193c960802afba73b5d38sm * This should really be replaced with something that is data-driven, but it is hard to do data
30cfd74d65d832137e20e193c960802afba73b5d38sm * parsing quickly at runtime.  For the moment this class is full of large functions that just
31cfd74d65d832137e20e193c960802afba73b5d38sm * patch pointers between objects, but in the future those functions should either be
32cfd74d65d832137e20e193c960802afba73b5d38sm * a) generated from data at compile time, or b) described by data at runtime.
33cfd74d65d832137e20e193c960802afba73b5d38sm */
34cfd74d65d832137e20e193c960802afba73b5d38smpublic class GameObjectFactory extends BaseObject {
359d4cc2572d37983607df38b0f4216ed76ac51814sm    private final static int MAX_GAME_OBJECTS = 384;
36cfd74d65d832137e20e193c960802afba73b5d38sm    private final static ComponentPoolComparator sComponentPoolComparator = new ComponentPoolComparator();
37cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<FixedSizeArray<BaseObject>> mStaticData;
38cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<GameComponentPool> mComponentPools;
39cfd74d65d832137e20e193c960802afba73b5d38sm    private GameComponentPool mPoolSearchDummy;
40cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObjectPool mGameObjectPool;
41cfd74d65d832137e20e193c960802afba73b5d38sm
42cfd74d65d832137e20e193c960802afba73b5d38sm    private float mTightActivationRadius;
43cfd74d65d832137e20e193c960802afba73b5d38sm    private float mNormalActivationRadius;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private float mWideActivationRadius;
45cfd74d65d832137e20e193c960802afba73b5d38sm    private float mAlwaysActive;
46cfd74d65d832137e20e193c960802afba73b5d38sm
47cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sRedButtonChannel = "RED BUTTON";
48cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sBlueButtonChannel = "BLUE BUTTON";
49cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sGreenButtonChannel = "GREEN BUTTON";
50cfd74d65d832137e20e193c960802afba73b5d38sm    private final static String sSurprisedNPCChannel = "SURPRISED";
51cfd74d65d832137e20e193c960802afba73b5d38sm
52cfd74d65d832137e20e193c960802afba73b5d38sm
53cfd74d65d832137e20e193c960802afba73b5d38sm    // A list of game objects that can be spawned at runtime.  Note that the indicies of these
54cfd74d65d832137e20e193c960802afba73b5d38sm    // objects must match the order of the object tileset in the level editor in order for the
55cfd74d65d832137e20e193c960802afba73b5d38sm    // level content to make sense.
56cfd74d65d832137e20e193c960802afba73b5d38sm    public enum GameObjectType {
57cfd74d65d832137e20e193c960802afba73b5d38sm        INVALID(-1),
58cfd74d65d832137e20e193c960802afba73b5d38sm
59cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER (0),
60cfd74d65d832137e20e193c960802afba73b5d38sm
61cfd74d65d832137e20e193c960802afba73b5d38sm        // Collectables
62cfd74d65d832137e20e193c960802afba73b5d38sm        COIN (1),
63cfd74d65d832137e20e193c960802afba73b5d38sm        RUBY (2),
64cfd74d65d832137e20e193c960802afba73b5d38sm        DIARY (3),
65cfd74d65d832137e20e193c960802afba73b5d38sm
66cfd74d65d832137e20e193c960802afba73b5d38sm        // Characters
67cfd74d65d832137e20e193c960802afba73b5d38sm        WANDA (10),
68cfd74d65d832137e20e193c960802afba73b5d38sm        KYLE (11),
69cfd74d65d832137e20e193c960802afba73b5d38sm        KYLE_DEAD (12),
70cfd74d65d832137e20e193c960802afba73b5d38sm        ANDOU_DEAD (13),
71cfd74d65d832137e20e193c960802afba73b5d38sm        KABOCHA (26),
72cfd74d65d832137e20e193c960802afba73b5d38sm        ROKUDOU_TERMINAL (27),
73cfd74d65d832137e20e193c960802afba73b5d38sm        KABOCHA_TERMINAL (28),
74cfd74d65d832137e20e193c960802afba73b5d38sm        EVIL_KABOCHA (29),
75cfd74d65d832137e20e193c960802afba73b5d38sm        ROKUDOU (30),
76cfd74d65d832137e20e193c960802afba73b5d38sm
77cfd74d65d832137e20e193c960802afba73b5d38sm        // AI
78cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT (16),
79cfd74d65d832137e20e193c960802afba73b5d38sm        SNAILBOMB (17),
80cfd74d65d832137e20e193c960802afba73b5d38sm        SHADOWSLIME (18),
81cfd74d65d832137e20e193c960802afba73b5d38sm        MUDMAN (19),
82cfd74d65d832137e20e193c960802afba73b5d38sm        SKELETON (20),
83cfd74d65d832137e20e193c960802afba73b5d38sm        KARAGUIN (21),
84cfd74d65d832137e20e193c960802afba73b5d38sm        PINK_NAMAZU (22),
85cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET (23),
86cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET_LEFT (24),
87cfd74d65d832137e20e193c960802afba73b5d38sm        BAT (6),
88cfd74d65d832137e20e193c960802afba73b5d38sm        STING(7),
89cfd74d65d832137e20e193c960802afba73b5d38sm        ONION(8),
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm        // Objects
92cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_RED (32),
93cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_BLUE (33),
94cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_GREEN (34),
95cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_RED (35),
96cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_BLUE (36),
97cfd74d65d832137e20e193c960802afba73b5d38sm        BUTTON_GREEN (37),
98cfd74d65d832137e20e193c960802afba73b5d38sm        CANNON (38),
99cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_SPAWNER (39),
100cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_SPAWNER_LEFT (40),
101cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK(41),
102cfd74d65d832137e20e193c960802afba73b5d38sm        THE_SOURCE(42),
1032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        HINT_SIGN(43),
104cfd74d65d832137e20e193c960802afba73b5d38sm
105cfd74d65d832137e20e193c960802afba73b5d38sm        // Effects
106cfd74d65d832137e20e193c960802afba73b5d38sm        DUST(48),
107cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_SMALL(49),
108cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_LARGE(50),
109cfd74d65d832137e20e193c960802afba73b5d38sm        EXPLOSION_GIANT(51),
110cfd74d65d832137e20e193c960802afba73b5d38sm
111cfd74d65d832137e20e193c960802afba73b5d38sm
112cfd74d65d832137e20e193c960802afba73b5d38sm        // Special Spawnable
113cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_RED_NONBLOCKING (52),
114cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_BLUE_NONBLOCKING (53),
115cfd74d65d832137e20e193c960802afba73b5d38sm        DOOR_GREEN_NONBLOCKING (54),
116cfd74d65d832137e20e193c960802afba73b5d38sm
117cfd74d65d832137e20e193c960802afba73b5d38sm        GHOST_NPC(55),
118cfd74d65d832137e20e193c960802afba73b5d38sm
119cfd74d65d832137e20e193c960802afba73b5d38sm        CAMERA_BIAS(56),
120cfd74d65d832137e20e193c960802afba73b5d38sm
1219d4cc2572d37983607df38b0f4216ed76ac51814sm        FRAMERATE_WATCHER(57),
1229d4cc2572d37983607df38b0f4216ed76ac51814sm        INFINITE_SPAWNER(58),
1232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        CRUSHER_ANDOU(59),
124cfd74d65d832137e20e193c960802afba73b5d38sm
125cfd74d65d832137e20e193c960802afba73b5d38sm
126cfd74d65d832137e20e193c960802afba73b5d38sm        // Projectiles
127cfd74d65d832137e20e193c960802afba73b5d38sm        ENERGY_BALL(68),
128cfd74d65d832137e20e193c960802afba73b5d38sm        CANNON_BALL(65),
129cfd74d65d832137e20e193c960802afba73b5d38sm        TURRET_BULLET(66),
130cfd74d65d832137e20e193c960802afba73b5d38sm        BROBOT_BULLET(67),
131cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK_PIECE(68),
132cfd74d65d832137e20e193c960802afba73b5d38sm        BREAKABLE_BLOCK_PIECE_SPAWNER(69),
133cfd74d65d832137e20e193c960802afba73b5d38sm        WANDA_SHOT(70),
134cfd74d65d832137e20e193c960802afba73b5d38sm
135cfd74d65d832137e20e193c960802afba73b5d38sm        // Special Objects -- Not spawnable normally
1362b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SMOKE_BIG(-1),
1372b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SMOKE_SMALL(-1),
1382b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1392b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        CRUSH_FLASH(-1),
1402b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        FLASH(-1),
1412b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
142cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_JETS(-1),
143cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_SPARKS(-1),
144cfd74d65d832137e20e193c960802afba73b5d38sm        PLAYER_GLOW(-1),
145cfd74d65d832137e20e193c960802afba73b5d38sm        ENEMY_SPARKS(-1),
146cfd74d65d832137e20e193c960802afba73b5d38sm        GHOST(-1),
147cfd74d65d832137e20e193c960802afba73b5d38sm        SMOKE_POOF(-1),
148cfd74d65d832137e20e193c960802afba73b5d38sm        GEM_EFFECT(-1),
149cfd74d65d832137e20e193c960802afba73b5d38sm        GEM_EFFECT_SPAWNER(-1),
150cfd74d65d832137e20e193c960802afba73b5d38sm
151cfd74d65d832137e20e193c960802afba73b5d38sm
152cfd74d65d832137e20e193c960802afba73b5d38sm        // End
153cfd74d65d832137e20e193c960802afba73b5d38sm        OBJECT_COUNT(-1);
154cfd74d65d832137e20e193c960802afba73b5d38sm
155cfd74d65d832137e20e193c960802afba73b5d38sm        private final int mIndex;
156cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectType(int index) {
157cfd74d65d832137e20e193c960802afba73b5d38sm            this.mIndex = index;
158cfd74d65d832137e20e193c960802afba73b5d38sm        }
159cfd74d65d832137e20e193c960802afba73b5d38sm
160cfd74d65d832137e20e193c960802afba73b5d38sm        public int index() {
161cfd74d65d832137e20e193c960802afba73b5d38sm            return mIndex;
162cfd74d65d832137e20e193c960802afba73b5d38sm        }
163cfd74d65d832137e20e193c960802afba73b5d38sm
164cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: Is there any better way to do this?
165cfd74d65d832137e20e193c960802afba73b5d38sm        public static GameObjectType indexToType(int index) {
166cfd74d65d832137e20e193c960802afba73b5d38sm            final GameObjectType[] valuesArray = values();
167cfd74d65d832137e20e193c960802afba73b5d38sm            GameObjectType foundType = INVALID;
168cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < valuesArray.length; x++) {
169cfd74d65d832137e20e193c960802afba73b5d38sm                GameObjectType type = valuesArray[x];
170cfd74d65d832137e20e193c960802afba73b5d38sm                if (type.mIndex == index) {
171cfd74d65d832137e20e193c960802afba73b5d38sm                    foundType = type;
172cfd74d65d832137e20e193c960802afba73b5d38sm                    break;
173cfd74d65d832137e20e193c960802afba73b5d38sm                }
174cfd74d65d832137e20e193c960802afba73b5d38sm            }
175cfd74d65d832137e20e193c960802afba73b5d38sm            return foundType;
176cfd74d65d832137e20e193c960802afba73b5d38sm        }
177cfd74d65d832137e20e193c960802afba73b5d38sm
178cfd74d65d832137e20e193c960802afba73b5d38sm    }
179cfd74d65d832137e20e193c960802afba73b5d38sm
180cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObjectFactory() {
181cfd74d65d832137e20e193c960802afba73b5d38sm        super();
182cfd74d65d832137e20e193c960802afba73b5d38sm
183cfd74d65d832137e20e193c960802afba73b5d38sm        mGameObjectPool = new GameObjectPool(MAX_GAME_OBJECTS);
184cfd74d65d832137e20e193c960802afba73b5d38sm
185cfd74d65d832137e20e193c960802afba73b5d38sm        final int objectTypeCount = GameObjectType.OBJECT_COUNT.ordinal();
186cfd74d65d832137e20e193c960802afba73b5d38sm        mStaticData = new FixedSizeArray<FixedSizeArray<BaseObject>>(objectTypeCount);
187cfd74d65d832137e20e193c960802afba73b5d38sm
188cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < objectTypeCount; x++) {
189cfd74d65d832137e20e193c960802afba73b5d38sm            mStaticData.add(null);
190cfd74d65d832137e20e193c960802afba73b5d38sm        }
191cfd74d65d832137e20e193c960802afba73b5d38sm
192cfd74d65d832137e20e193c960802afba73b5d38sm        final ContextParameters context = sSystemRegistry.contextParameters;
193cfd74d65d832137e20e193c960802afba73b5d38sm        final float halfHeight2 = (context.gameHeight * 0.5f) * (context.gameHeight * 0.5f);
194cfd74d65d832137e20e193c960802afba73b5d38sm        final float halfWidth2 = (context.gameWidth * 0.5f) * (context.gameWidth * 0.5f);
195cfd74d65d832137e20e193c960802afba73b5d38sm        final float screenSizeRadius = (float)Math.sqrt(halfHeight2 + halfWidth2);
196cfd74d65d832137e20e193c960802afba73b5d38sm        mTightActivationRadius = screenSizeRadius + 128.0f;
197cfd74d65d832137e20e193c960802afba73b5d38sm        mNormalActivationRadius = screenSizeRadius * 1.25f;
198cfd74d65d832137e20e193c960802afba73b5d38sm        mWideActivationRadius = screenSizeRadius * 2.0f;
199cfd74d65d832137e20e193c960802afba73b5d38sm        mAlwaysActive = -1.0f;
200cfd74d65d832137e20e193c960802afba73b5d38sm
201cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: I wish there was a way to do this automatically, but the ClassLoader doesn't seem
202cfd74d65d832137e20e193c960802afba73b5d38sm        // to provide access to the currently loaded class list.  There's some discussion of walking
203cfd74d65d832137e20e193c960802afba73b5d38sm        // the actual class file objects and using forName() to instantiate them, but that sounds
204cfd74d65d832137e20e193c960802afba73b5d38sm        // really heavy-weight.  For now I'll rely on (sucky) manual enumeration.
205cfd74d65d832137e20e193c960802afba73b5d38sm        class ComponentClass {
206cfd74d65d832137e20e193c960802afba73b5d38sm            public Class<?> type;
207cfd74d65d832137e20e193c960802afba73b5d38sm            public int poolSize;
208cfd74d65d832137e20e193c960802afba73b5d38sm            public ComponentClass(Class<?> classType, int size) {
209cfd74d65d832137e20e193c960802afba73b5d38sm                type = classType;
210cfd74d65d832137e20e193c960802afba73b5d38sm                poolSize = size;
211cfd74d65d832137e20e193c960802afba73b5d38sm            }
212cfd74d65d832137e20e193c960802afba73b5d38sm        }
213cfd74d65d832137e20e193c960802afba73b5d38sm        ComponentClass[] componentTypes = {
214cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(AnimationComponent.class, 1),
215cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(AttackAtDistanceComponent.class, 16),
2169d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(BackgroundCollisionComponent.class, 192),
217cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(ButtonAnimationComponent.class, 32),
218cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(CameraBiasComponent.class, 8),
2199d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(ChangeComponentsComponent.class, 256),
2202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                new ComponentClass(CrusherAndouComponent.class, 1),
221cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(DoorAnimationComponent.class, 256),  //!
222cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(DynamicCollisionComponent.class, 256),
2239d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(EnemyAnimationComponent.class, 256),
224cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(FadeDrawableComponent.class, 32),
225cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(FixedAnimationComponent.class, 8),
2269d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(FrameRateWatcherComponent.class, 1),
227cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(GenericAnimationComponent.class, 32),
2289d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(GhostComponent.class, 256),
229cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(GravityComponent.class, 128),
230cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(HitPlayerComponent.class, 256),
231cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(HitReactionComponent.class, 256),
232cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(InventoryComponent.class, 128),
233cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(LauncherComponent.class, 16),
234cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(LaunchProjectileComponent.class, 128),
2359d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(LifetimeComponent.class, 384),
236cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(MotionBlurComponent.class, 1),
237cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(MovementComponent.class, 128),
238cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(NPCAnimationComponent.class, 8),
239cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(NPCComponent.class, 8),
240cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(OrbitalMagnetComponent.class, 1),
2419d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(PatrolComponent.class, 256),
242cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PhysicsComponent.class, 8),
243cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PlayerComponent.class, 1),
2442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                new ComponentClass(PlaySingleSoundComponent.class, 128),
245cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(PopOutComponent.class, 32),
2469d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(RenderComponent.class, 384),
247cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(ScrollerComponent.class, 8),
248cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SelectDialogComponent.class, 8),
249cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SimpleCollisionComponent.class, 32),
2509d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(SimplePhysicsComponent.class, 256),
251cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SleeperComponent.class, 32),
252cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(SolidSurfaceComponent.class, 16),
2539d4cc2572d37983607df38b0f4216ed76ac51814sm                new ComponentClass(SpriteComponent.class, 384),
254cfd74d65d832137e20e193c960802afba73b5d38sm                new ComponentClass(TheSourceComponent.class, 1),
255cfd74d65d832137e20e193c960802afba73b5d38sm
256cfd74d65d832137e20e193c960802afba73b5d38sm        };
257cfd74d65d832137e20e193c960802afba73b5d38sm
258cfd74d65d832137e20e193c960802afba73b5d38sm        mComponentPools = new FixedSizeArray<GameComponentPool>(componentTypes.length, sComponentPoolComparator);
259cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentTypes.length; x++) {
260cfd74d65d832137e20e193c960802afba73b5d38sm            ComponentClass component = componentTypes[x];
261cfd74d65d832137e20e193c960802afba73b5d38sm            mComponentPools.add(new GameComponentPool(component.type, component.poolSize));
262cfd74d65d832137e20e193c960802afba73b5d38sm        }
263cfd74d65d832137e20e193c960802afba73b5d38sm        mComponentPools.sort(true);
264cfd74d65d832137e20e193c960802afba73b5d38sm
265cfd74d65d832137e20e193c960802afba73b5d38sm        mPoolSearchDummy = new GameComponentPool(Object.class, 1);
266cfd74d65d832137e20e193c960802afba73b5d38sm
267cfd74d65d832137e20e193c960802afba73b5d38sm    }
268cfd74d65d832137e20e193c960802afba73b5d38sm
269cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
270cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
271cfd74d65d832137e20e193c960802afba73b5d38sm
272cfd74d65d832137e20e193c960802afba73b5d38sm    }
273cfd74d65d832137e20e193c960802afba73b5d38sm
274cfd74d65d832137e20e193c960802afba73b5d38sm    protected GameComponentPool getComponentPool(Class<?> componentType) {
275cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = null;
276cfd74d65d832137e20e193c960802afba73b5d38sm        mPoolSearchDummy.objectClass = componentType;
277cfd74d65d832137e20e193c960802afba73b5d38sm        final int index = mComponentPools.find(mPoolSearchDummy, false);
278cfd74d65d832137e20e193c960802afba73b5d38sm        if (index != -1) {
279cfd74d65d832137e20e193c960802afba73b5d38sm            pool = mComponentPools.get(index);
280cfd74d65d832137e20e193c960802afba73b5d38sm        }
281cfd74d65d832137e20e193c960802afba73b5d38sm        return pool;
282cfd74d65d832137e20e193c960802afba73b5d38sm    }
283cfd74d65d832137e20e193c960802afba73b5d38sm
284cfd74d65d832137e20e193c960802afba73b5d38sm    protected GameComponent allocateComponent(Class<?> componentType) {
285cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = getComponentPool(componentType);
286cfd74d65d832137e20e193c960802afba73b5d38sm        assert pool != null;
287cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponent component = null;
288cfd74d65d832137e20e193c960802afba73b5d38sm        if (pool != null) {
289cfd74d65d832137e20e193c960802afba73b5d38sm            component = pool.allocate();
290cfd74d65d832137e20e193c960802afba73b5d38sm        }
291cfd74d65d832137e20e193c960802afba73b5d38sm        return component;
292cfd74d65d832137e20e193c960802afba73b5d38sm    }
293cfd74d65d832137e20e193c960802afba73b5d38sm
294cfd74d65d832137e20e193c960802afba73b5d38sm    protected void releaseComponent(GameComponent component) {
295cfd74d65d832137e20e193c960802afba73b5d38sm        GameComponentPool pool = getComponentPool(component.getClass());
296cfd74d65d832137e20e193c960802afba73b5d38sm        assert pool != null;
297cfd74d65d832137e20e193c960802afba73b5d38sm        if (pool != null) {
298cfd74d65d832137e20e193c960802afba73b5d38sm            component.reset();
299cfd74d65d832137e20e193c960802afba73b5d38sm            component.shared = false;
300cfd74d65d832137e20e193c960802afba73b5d38sm            pool.release(component);
301cfd74d65d832137e20e193c960802afba73b5d38sm        }
302cfd74d65d832137e20e193c960802afba73b5d38sm    }
303cfd74d65d832137e20e193c960802afba73b5d38sm
3049d4cc2572d37983607df38b0f4216ed76ac51814sm    protected boolean componentAvailable(Class<?> componentType, int count) {
3059d4cc2572d37983607df38b0f4216ed76ac51814sm    	boolean canAllocate = false;
3069d4cc2572d37983607df38b0f4216ed76ac51814sm        GameComponentPool pool = getComponentPool(componentType);
3079d4cc2572d37983607df38b0f4216ed76ac51814sm        assert pool != null;
3089d4cc2572d37983607df38b0f4216ed76ac51814sm        if (pool != null) {
3099d4cc2572d37983607df38b0f4216ed76ac51814sm        	canAllocate = pool.getAllocatedCount() + count < pool.getSize();
3109d4cc2572d37983607df38b0f4216ed76ac51814sm        }
3119d4cc2572d37983607df38b0f4216ed76ac51814sm        return canAllocate;
3129d4cc2572d37983607df38b0f4216ed76ac51814sm    }
3139d4cc2572d37983607df38b0f4216ed76ac51814sm
314cfd74d65d832137e20e193c960802afba73b5d38sm    public void preloadEffects() {
315cfd74d65d832137e20e193c960802afba73b5d38sm        // These textures appear in every level, so they are long-term.
316cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
317cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust01);
318cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust02);
319cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust03);
320cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust04);
321cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.dust05);
322cfd74d65d832137e20e193c960802afba73b5d38sm
323cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball01);
324cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball02);
325cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball03);
326cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_energyball04);
327cfd74d65d832137e20e193c960802afba73b5d38sm
328cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small01);
329cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small02);
330cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small03);
331cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small04);
332cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small05);
333cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small06);
334cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_small07);
335cfd74d65d832137e20e193c960802afba73b5d38sm
336cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big01);
337cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big02);
338cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big03);
339cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big04);
340cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big05);
341cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big06);
342cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big07);
343cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big08);
344cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_explosion_big09);
345cfd74d65d832137e20e193c960802afba73b5d38sm
346cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big01);
347cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big02);
348cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big03);
349cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big04);
350cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_big05);
351cfd74d65d832137e20e193c960802afba73b5d38sm
352cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small01);
353cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small02);
354cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small03);
355cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small04);
356cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_smoke_small05);
357cfd74d65d832137e20e193c960802afba73b5d38sm
358cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back01);
359cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back02);
360cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_back03);
361cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front01);
362cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front02);
363cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front03);
364cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front04);
365cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front05);
366cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front06);
367cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_crush_front07);
368cfd74d65d832137e20e193c960802afba73b5d38sm    }
369cfd74d65d832137e20e193c960802afba73b5d38sm
370cfd74d65d832137e20e193c960802afba73b5d38sm    public void destroy(GameObject object) {
371cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
372cfd74d65d832137e20e193c960802afba73b5d38sm        final int componentCount = object.getCount();
373cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentCount; x++) {
374cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent component = (GameComponent)object.get(x);
375cfd74d65d832137e20e193c960802afba73b5d38sm            if (!component.shared) {
376cfd74d65d832137e20e193c960802afba73b5d38sm                releaseComponent(component);
377cfd74d65d832137e20e193c960802afba73b5d38sm            }
378cfd74d65d832137e20e193c960802afba73b5d38sm        }
379cfd74d65d832137e20e193c960802afba73b5d38sm        object.removeAll();
380cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
381cfd74d65d832137e20e193c960802afba73b5d38sm        mGameObjectPool.release(object);
382cfd74d65d832137e20e193c960802afba73b5d38sm    }
383cfd74d65d832137e20e193c960802afba73b5d38sm
384cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawn(GameObjectType type, float x, float y, boolean horzFlip) {
385cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject newObject = null;
386cfd74d65d832137e20e193c960802afba73b5d38sm        switch(type) {
387cfd74d65d832137e20e193c960802afba73b5d38sm            case PLAYER:
388cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnPlayer(x, y);
389cfd74d65d832137e20e193c960802afba73b5d38sm                break;
390cfd74d65d832137e20e193c960802afba73b5d38sm            case COIN:
391cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnCoin(x, y);
392cfd74d65d832137e20e193c960802afba73b5d38sm                break;
393cfd74d65d832137e20e193c960802afba73b5d38sm            case RUBY:
394cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnRuby(x, y);
395cfd74d65d832137e20e193c960802afba73b5d38sm                break;
396cfd74d65d832137e20e193c960802afba73b5d38sm            case DIARY:
397cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnDiary(x, y);
398cfd74d65d832137e20e193c960802afba73b5d38sm                break;
399cfd74d65d832137e20e193c960802afba73b5d38sm            case WANDA:
400cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyWanda(x, y, true);
401cfd74d65d832137e20e193c960802afba73b5d38sm                break;
402cfd74d65d832137e20e193c960802afba73b5d38sm            case KYLE:
403cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKyle(x, y, true);
404cfd74d65d832137e20e193c960802afba73b5d38sm                break;
405cfd74d65d832137e20e193c960802afba73b5d38sm            case KYLE_DEAD:
406cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKyleDead(x, y);
407cfd74d65d832137e20e193c960802afba73b5d38sm                break;
408cfd74d65d832137e20e193c960802afba73b5d38sm            case ANDOU_DEAD:
409cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyAndouDead(x, y);
410cfd74d65d832137e20e193c960802afba73b5d38sm                break;
411cfd74d65d832137e20e193c960802afba73b5d38sm            case KABOCHA:
412cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKabocha(x, y, true);
413cfd74d65d832137e20e193c960802afba73b5d38sm                break;
414cfd74d65d832137e20e193c960802afba73b5d38sm            case ROKUDOU_TERMINAL:
415cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnRokudouTerminal(x, y);
416cfd74d65d832137e20e193c960802afba73b5d38sm                break;
417cfd74d65d832137e20e193c960802afba73b5d38sm            case KABOCHA_TERMINAL:
418cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnKabochaTerminal(x, y);
419cfd74d65d832137e20e193c960802afba73b5d38sm                break;
420cfd74d65d832137e20e193c960802afba73b5d38sm            case EVIL_KABOCHA:
421cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyEvilKabocha(x, y, true);
422cfd74d65d832137e20e193c960802afba73b5d38sm                break;
423cfd74d65d832137e20e193c960802afba73b5d38sm            case ROKUDOU:
424cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyRokudou(x, y, true);
425cfd74d65d832137e20e193c960802afba73b5d38sm                break;
426cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT:
427cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyBrobot(x, y, horzFlip);
428cfd74d65d832137e20e193c960802afba73b5d38sm                break;
429cfd74d65d832137e20e193c960802afba73b5d38sm            case SNAILBOMB:
430cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySnailBomb(x, y, horzFlip);
431cfd74d65d832137e20e193c960802afba73b5d38sm                break;
432cfd74d65d832137e20e193c960802afba73b5d38sm            case SHADOWSLIME:
433cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyShadowSlime(x, y, horzFlip);
434cfd74d65d832137e20e193c960802afba73b5d38sm                break;
435cfd74d65d832137e20e193c960802afba73b5d38sm            case MUDMAN:
436cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyMudman(x, y, horzFlip);
437cfd74d65d832137e20e193c960802afba73b5d38sm                break;
438cfd74d65d832137e20e193c960802afba73b5d38sm            case SKELETON:
439cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySkeleton(x, y, horzFlip);
440cfd74d65d832137e20e193c960802afba73b5d38sm                break;
441cfd74d65d832137e20e193c960802afba73b5d38sm            case KARAGUIN:
442cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyKaraguin(x, y, horzFlip);
443cfd74d65d832137e20e193c960802afba73b5d38sm                break;
444cfd74d65d832137e20e193c960802afba73b5d38sm            case PINK_NAMAZU:
445cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyPinkNamazu(x, y, horzFlip);
446cfd74d65d832137e20e193c960802afba73b5d38sm                break;
447cfd74d65d832137e20e193c960802afba73b5d38sm            case BAT:
448cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyBat(x, y, horzFlip);
449cfd74d65d832137e20e193c960802afba73b5d38sm                break;
450cfd74d65d832137e20e193c960802afba73b5d38sm            case STING:
451cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemySting(x, y, horzFlip);
452cfd74d65d832137e20e193c960802afba73b5d38sm                break;
453cfd74d65d832137e20e193c960802afba73b5d38sm            case ONION:
454cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnemyOnion(x, y, horzFlip);
455cfd74d65d832137e20e193c960802afba73b5d38sm                break;
456cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET:
457cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET_LEFT:
458cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectTurret(x, y, (type == GameObjectType.TURRET_LEFT));
459cfd74d65d832137e20e193c960802afba73b5d38sm                break;
460cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED:
461cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED_NONBLOCKING:
462cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_RED, (type == GameObjectType.DOOR_RED));
463cfd74d65d832137e20e193c960802afba73b5d38sm                break;
464cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE:
465cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE_NONBLOCKING:
466cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_BLUE, (type == GameObjectType.DOOR_BLUE));
467cfd74d65d832137e20e193c960802afba73b5d38sm                break;
468cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN:
469cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN_NONBLOCKING:
470cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectDoor(x, y, GameObjectType.DOOR_GREEN, (type == GameObjectType.DOOR_GREEN));
471cfd74d65d832137e20e193c960802afba73b5d38sm                break;
472cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_RED:
473cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_RED);
474cfd74d65d832137e20e193c960802afba73b5d38sm                break;
475cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_BLUE:
476cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_BLUE);
477cfd74d65d832137e20e193c960802afba73b5d38sm                break;
478cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_GREEN:
479cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectButton(x, y, GameObjectType.BUTTON_GREEN);
480cfd74d65d832137e20e193c960802afba73b5d38sm                break;
481cfd74d65d832137e20e193c960802afba73b5d38sm            case CANNON:
482cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectCannon(x, y);
483cfd74d65d832137e20e193c960802afba73b5d38sm                break;
484cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_SPAWNER:
485cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_SPAWNER_LEFT:
486cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectBrobotSpawner(x, y, (type == GameObjectType.BROBOT_SPAWNER_LEFT));
487cfd74d65d832137e20e193c960802afba73b5d38sm                break;
488cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK:
489cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnObjectBreakableBlock(x, y);
490cfd74d65d832137e20e193c960802afba73b5d38sm                break;
491cfd74d65d832137e20e193c960802afba73b5d38sm            case THE_SOURCE:
492cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnObjectTheSource(x, y);
493cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
4942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            case HINT_SIGN:
4952b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	newObject = spawnObjectSign(x, y);
4962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	break;
497cfd74d65d832137e20e193c960802afba73b5d38sm            case DUST:
498cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnDust(x, y, horzFlip);
499cfd74d65d832137e20e193c960802afba73b5d38sm                break;
500cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_SMALL:
501cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionSmall(x, y);
502cfd74d65d832137e20e193c960802afba73b5d38sm                break;
503cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_LARGE:
504cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionLarge(x, y);
505cfd74d65d832137e20e193c960802afba73b5d38sm                break;
506cfd74d65d832137e20e193c960802afba73b5d38sm            case EXPLOSION_GIANT:
507cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectExplosionGiant(x, y);
508cfd74d65d832137e20e193c960802afba73b5d38sm                break;
509cfd74d65d832137e20e193c960802afba73b5d38sm            case GHOST_NPC:
510cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGhostNPC(x, y);
511cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
512cfd74d65d832137e20e193c960802afba73b5d38sm            case CAMERA_BIAS:
513cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnCameraBias(x, y);
514cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
5159d4cc2572d37983607df38b0f4216ed76ac51814sm            case FRAMERATE_WATCHER:
5169d4cc2572d37983607df38b0f4216ed76ac51814sm            	newObject = spawnFrameRateWatcher(x, y);
5179d4cc2572d37983607df38b0f4216ed76ac51814sm            	break;
5189d4cc2572d37983607df38b0f4216ed76ac51814sm            case INFINITE_SPAWNER:
5199d4cc2572d37983607df38b0f4216ed76ac51814sm            	newObject = spawnObjectInfiniteSpawner(x, y);
5209d4cc2572d37983607df38b0f4216ed76ac51814sm            	break;
5212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            case CRUSHER_ANDOU:
5222b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	newObject = spawnObjectCrusherAndou(x,y);
5232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	break;
524cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_BIG:
525cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectSmokeBig(x, y);
526cfd74d65d832137e20e193c960802afba73b5d38sm                break;
527cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_SMALL:
528cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectSmokeSmall(x, y);
529cfd74d65d832137e20e193c960802afba73b5d38sm                break;
530cfd74d65d832137e20e193c960802afba73b5d38sm            case CRUSH_FLASH:
531cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectCrushFlash(x, y);
532cfd74d65d832137e20e193c960802afba73b5d38sm                break;
533cfd74d65d832137e20e193c960802afba73b5d38sm            case FLASH:
534cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEffectFlash(x, y);
535cfd74d65d832137e20e193c960802afba73b5d38sm                break;
5369d4cc2572d37983607df38b0f4216ed76ac51814sm
537cfd74d65d832137e20e193c960802afba73b5d38sm            case ENERGY_BALL:
538cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnEnergyBall(x, y, horzFlip);
539cfd74d65d832137e20e193c960802afba73b5d38sm                break;
540cfd74d65d832137e20e193c960802afba73b5d38sm            case CANNON_BALL:
541cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnCannonBall(x, y, horzFlip);
542cfd74d65d832137e20e193c960802afba73b5d38sm                break;
543cfd74d65d832137e20e193c960802afba73b5d38sm            case TURRET_BULLET:
544cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnTurretBullet(x, y, horzFlip);
545cfd74d65d832137e20e193c960802afba73b5d38sm                break;
546cfd74d65d832137e20e193c960802afba73b5d38sm            case BROBOT_BULLET:
547cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBrobotBullet(x, y, horzFlip);
548cfd74d65d832137e20e193c960802afba73b5d38sm                break;
549cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK_PIECE:
550cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBreakableBlockPiece(x, y);
551cfd74d65d832137e20e193c960802afba73b5d38sm                break;
552cfd74d65d832137e20e193c960802afba73b5d38sm            case BREAKABLE_BLOCK_PIECE_SPAWNER:
553cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnBreakableBlockPieceSpawner(x, y);
554cfd74d65d832137e20e193c960802afba73b5d38sm                break;
555cfd74d65d832137e20e193c960802afba73b5d38sm            case WANDA_SHOT:
556cfd74d65d832137e20e193c960802afba73b5d38sm                newObject = spawnWandaShot(x, y, horzFlip);
557cfd74d65d832137e20e193c960802afba73b5d38sm                break;
558cfd74d65d832137e20e193c960802afba73b5d38sm            case SMOKE_POOF:
559cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnSmokePoof(x, y);
560cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
561cfd74d65d832137e20e193c960802afba73b5d38sm            case GEM_EFFECT:
562cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGemEffect(x, y);
563cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
564cfd74d65d832137e20e193c960802afba73b5d38sm            case GEM_EFFECT_SPAWNER:
565cfd74d65d832137e20e193c960802afba73b5d38sm            	newObject = spawnGemEffectSpawner(x, y);
566cfd74d65d832137e20e193c960802afba73b5d38sm            	break;
567cfd74d65d832137e20e193c960802afba73b5d38sm        }
568cfd74d65d832137e20e193c960802afba73b5d38sm
569cfd74d65d832137e20e193c960802afba73b5d38sm        return newObject;
570cfd74d65d832137e20e193c960802afba73b5d38sm    }
571cfd74d65d832137e20e193c960802afba73b5d38sm
572cfd74d65d832137e20e193c960802afba73b5d38sm
573cfd74d65d832137e20e193c960802afba73b5d38sm
574cfd74d65d832137e20e193c960802afba73b5d38sm	public void spawnFromWorld(TiledWorld world, int tileWidth, int tileHeight) {
575cfd74d65d832137e20e193c960802afba73b5d38sm        // Walk the world and spawn objects based on tile indexes.
576cfd74d65d832137e20e193c960802afba73b5d38sm        final float worldHeight = world.getHeight() * tileHeight;
577cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectManager manager = sSystemRegistry.gameObjectManager;
578cfd74d65d832137e20e193c960802afba73b5d38sm        if (manager != null) {
579cfd74d65d832137e20e193c960802afba73b5d38sm            for (int y = 0; y < world.getHeight(); y++) {
580cfd74d65d832137e20e193c960802afba73b5d38sm                for (int x = 0; x < world.getWidth(); x++) {
581cfd74d65d832137e20e193c960802afba73b5d38sm                    int index = world.getTile(x, y);
582cfd74d65d832137e20e193c960802afba73b5d38sm                    if (index != -1) {
583cfd74d65d832137e20e193c960802afba73b5d38sm                        GameObjectType type = GameObjectType.indexToType(index);
584cfd74d65d832137e20e193c960802afba73b5d38sm                        if (type != GameObjectType.INVALID) {
585cfd74d65d832137e20e193c960802afba73b5d38sm                            final float worldX = x * tileWidth;
586cfd74d65d832137e20e193c960802afba73b5d38sm                            final float worldY = worldHeight - ((y + 1) * tileHeight);
587cfd74d65d832137e20e193c960802afba73b5d38sm                            GameObject object = spawn(type, worldX, worldY, false);
588cfd74d65d832137e20e193c960802afba73b5d38sm                            if (object != null) {
589cfd74d65d832137e20e193c960802afba73b5d38sm                                if (object.height < tileHeight) {
590cfd74d65d832137e20e193c960802afba73b5d38sm                                    // make sure small objects are vertically centered in their
591cfd74d65d832137e20e193c960802afba73b5d38sm                                    // tile.
592cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().y += (tileHeight - object.height) / 2.0f;
593cfd74d65d832137e20e193c960802afba73b5d38sm                                }
594cfd74d65d832137e20e193c960802afba73b5d38sm                                if (object.width < tileWidth) {
595cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().x += (tileWidth - object.width) / 2.0f;
596cfd74d65d832137e20e193c960802afba73b5d38sm                                } else if (object.width > tileWidth) {
597cfd74d65d832137e20e193c960802afba73b5d38sm                                    object.getPosition().x -= (object.width - tileWidth) / 2.0f;
598cfd74d65d832137e20e193c960802afba73b5d38sm                                }
599cfd74d65d832137e20e193c960802afba73b5d38sm                                manager.add(object);
600cfd74d65d832137e20e193c960802afba73b5d38sm                                if (type == GameObjectType.PLAYER) {
601cfd74d65d832137e20e193c960802afba73b5d38sm                                    manager.setPlayer(object);
602cfd74d65d832137e20e193c960802afba73b5d38sm                                }
603cfd74d65d832137e20e193c960802afba73b5d38sm                            }
604cfd74d65d832137e20e193c960802afba73b5d38sm                        }
605cfd74d65d832137e20e193c960802afba73b5d38sm                    }
606cfd74d65d832137e20e193c960802afba73b5d38sm                }
607cfd74d65d832137e20e193c960802afba73b5d38sm            }
608cfd74d65d832137e20e193c960802afba73b5d38sm        }
609cfd74d65d832137e20e193c960802afba73b5d38sm    }
610cfd74d65d832137e20e193c960802afba73b5d38sm
611cfd74d65d832137e20e193c960802afba73b5d38sm
612cfd74d65d832137e20e193c960802afba73b5d38sm    private FixedSizeArray<BaseObject> getStaticData(GameObjectType type) {
613cfd74d65d832137e20e193c960802afba73b5d38sm        return mStaticData.get(type.ordinal());
614cfd74d65d832137e20e193c960802afba73b5d38sm    }
615cfd74d65d832137e20e193c960802afba73b5d38sm
616cfd74d65d832137e20e193c960802afba73b5d38sm    private void setStaticData(GameObjectType type, FixedSizeArray<BaseObject> data) {
617cfd74d65d832137e20e193c960802afba73b5d38sm        int index = type.ordinal();
618cfd74d65d832137e20e193c960802afba73b5d38sm        assert mStaticData.get(index) == null;
619cfd74d65d832137e20e193c960802afba73b5d38sm
620cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataCount = data.getCount();
621cfd74d65d832137e20e193c960802afba73b5d38sm
622cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataCount; x++) {
623cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject entry = data.get(x);
624cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof GameComponent) {
625cfd74d65d832137e20e193c960802afba73b5d38sm                ((GameComponent) entry).shared = true;
626cfd74d65d832137e20e193c960802afba73b5d38sm            }
627cfd74d65d832137e20e193c960802afba73b5d38sm        }
628cfd74d65d832137e20e193c960802afba73b5d38sm
629cfd74d65d832137e20e193c960802afba73b5d38sm        mStaticData.set(index, data);
630cfd74d65d832137e20e193c960802afba73b5d38sm    }
631cfd74d65d832137e20e193c960802afba73b5d38sm
632cfd74d65d832137e20e193c960802afba73b5d38sm    private void addStaticData(GameObjectType type, GameObject object, SpriteComponent sprite) {
633cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
634cfd74d65d832137e20e193c960802afba73b5d38sm        assert staticData != null;
635cfd74d65d832137e20e193c960802afba73b5d38sm
636cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData != null) {
637cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticDataCount = staticData.getCount();
638cfd74d65d832137e20e193c960802afba73b5d38sm
639cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < staticDataCount; x++) {
640cfd74d65d832137e20e193c960802afba73b5d38sm                BaseObject entry = staticData.get(x);
641cfd74d65d832137e20e193c960802afba73b5d38sm                if (entry instanceof GameComponent && object != null) {
642cfd74d65d832137e20e193c960802afba73b5d38sm                    object.add((GameComponent)entry);
643cfd74d65d832137e20e193c960802afba73b5d38sm                } else if (entry instanceof SpriteAnimation && sprite != null) {
644cfd74d65d832137e20e193c960802afba73b5d38sm                    sprite.addAnimation((SpriteAnimation)entry);
645cfd74d65d832137e20e193c960802afba73b5d38sm                }
646cfd74d65d832137e20e193c960802afba73b5d38sm            }
647cfd74d65d832137e20e193c960802afba73b5d38sm        }
648cfd74d65d832137e20e193c960802afba73b5d38sm    }
649cfd74d65d832137e20e193c960802afba73b5d38sm
650cfd74d65d832137e20e193c960802afba73b5d38sm    public void clearStaticData() {
651cfd74d65d832137e20e193c960802afba73b5d38sm        final int typeCount = mStaticData.getCount();
652cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < typeCount; x++) {
653cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> staticData = mStaticData.get(x);
654cfd74d65d832137e20e193c960802afba73b5d38sm            if (staticData != null) {
655cfd74d65d832137e20e193c960802afba73b5d38sm                final int count = staticData.getCount();
656cfd74d65d832137e20e193c960802afba73b5d38sm                for (int y = 0; y < count; y++) {
657cfd74d65d832137e20e193c960802afba73b5d38sm                    BaseObject entry = staticData.get(y);
658cfd74d65d832137e20e193c960802afba73b5d38sm                    if (entry != null) {
659cfd74d65d832137e20e193c960802afba73b5d38sm                        if (entry instanceof GameComponent) {
660cfd74d65d832137e20e193c960802afba73b5d38sm                            releaseComponent((GameComponent)entry);
661cfd74d65d832137e20e193c960802afba73b5d38sm                        }
662cfd74d65d832137e20e193c960802afba73b5d38sm                    }
663cfd74d65d832137e20e193c960802afba73b5d38sm                }
664cfd74d65d832137e20e193c960802afba73b5d38sm                staticData.clear();
665cfd74d65d832137e20e193c960802afba73b5d38sm                mStaticData.set(x, null);
666cfd74d65d832137e20e193c960802afba73b5d38sm            }
667cfd74d65d832137e20e193c960802afba73b5d38sm        }
668cfd74d65d832137e20e193c960802afba73b5d38sm    }
669cfd74d65d832137e20e193c960802afba73b5d38sm
670cfd74d65d832137e20e193c960802afba73b5d38sm    public void sanityCheckPools() {
671cfd74d65d832137e20e193c960802afba73b5d38sm        final int outstandingObjects = mGameObjectPool.getAllocatedCount();
672cfd74d65d832137e20e193c960802afba73b5d38sm        if (outstandingObjects != 0) {
673cfd74d65d832137e20e193c960802afba73b5d38sm            DebugLog.d("Sanity Check", "Outstanding game object allocations! ("
674cfd74d65d832137e20e193c960802afba73b5d38sm                    + outstandingObjects + ")");
675cfd74d65d832137e20e193c960802afba73b5d38sm            assert false;
676cfd74d65d832137e20e193c960802afba73b5d38sm        }
677cfd74d65d832137e20e193c960802afba73b5d38sm
678cfd74d65d832137e20e193c960802afba73b5d38sm        final int componentPoolCount = mComponentPools.getCount();
679cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < componentPoolCount; x++) {
680cfd74d65d832137e20e193c960802afba73b5d38sm            final int outstandingComponents = mComponentPools.get(x).getAllocatedCount();
681cfd74d65d832137e20e193c960802afba73b5d38sm
682cfd74d65d832137e20e193c960802afba73b5d38sm            if (outstandingComponents != 0) {
683cfd74d65d832137e20e193c960802afba73b5d38sm                DebugLog.d("Sanity Check", "Outstanding "
684cfd74d65d832137e20e193c960802afba73b5d38sm                        + mComponentPools.get(x).objectClass.getSimpleName()
685cfd74d65d832137e20e193c960802afba73b5d38sm                        + " allocations! (" + outstandingComponents + ")");
686cfd74d65d832137e20e193c960802afba73b5d38sm                //assert false;
687cfd74d65d832137e20e193c960802afba73b5d38sm            }
688cfd74d65d832137e20e193c960802afba73b5d38sm        }
689cfd74d65d832137e20e193c960802afba73b5d38sm    }
690cfd74d65d832137e20e193c960802afba73b5d38sm
691cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnPlayer(float positionX, float positionY) {
692cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
693cfd74d65d832137e20e193c960802afba73b5d38sm
694cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
695cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
696cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
697cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
698cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
699cfd74d65d832137e20e193c960802afba73b5d38sm
700cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PLAYER);
701cfd74d65d832137e20e193c960802afba73b5d38sm
702cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
703cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 13;
704cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
705cfd74d65d832137e20e193c960802afba73b5d38sm
706cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
707cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
708cfd74d65d832137e20e193c960802afba73b5d38sm            PhysicsComponent physics = (PhysicsComponent)allocateComponent(PhysicsComponent.class);
709cfd74d65d832137e20e193c960802afba73b5d38sm
710cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setMass(9.1f);   // ~90kg w/ earth gravity
711cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setDynamicFrictionCoeffecient(0.2f);
712cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setStaticFrictionCoeffecient(0.01f);
713cfd74d65d832137e20e193c960802afba73b5d38sm
714cfd74d65d832137e20e193c960802afba73b5d38sm            // Animation Data
715cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
716cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
717cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
718cfd74d65d832137e20e193c960802afba73b5d38sm
719cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> pressAndCollectVolume =
720cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
721cfd74d65d832137e20e193c960802afba73b5d38sm            AABoxCollisionVolume collectionVolume = new AABoxCollisionVolume(16, 0, 32, 48);
722cfd74d65d832137e20e193c960802afba73b5d38sm            collectionVolume.setHitType(HitType.COLLECT);
723cfd74d65d832137e20e193c960802afba73b5d38sm            pressAndCollectVolume.add(collectionVolume);
724cfd74d65d832137e20e193c960802afba73b5d38sm            AABoxCollisionVolume pressCollisionVolume = new AABoxCollisionVolume(16, 0, 32, 16);
725cfd74d65d832137e20e193c960802afba73b5d38sm            pressCollisionVolume.setHitType(HitType.DEPRESS);
726cfd74d65d832137e20e193c960802afba73b5d38sm            pressAndCollectVolume.add(pressCollisionVolume);
727cfd74d65d832137e20e193c960802afba73b5d38sm
728cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(PlayerAnimations.IDLE.ordinal(), 1);
729cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stand),
730cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, pressAndCollectVolume, basicVulnerabilityVolume));
731cfd74d65d832137e20e193c960802afba73b5d38sm
732cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation angle = new SpriteAnimation(PlayerAnimations.MOVE.ordinal(), 1);
733cfd74d65d832137e20e193c960802afba73b5d38sm            angle.addFrame(
734cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag01),
735cfd74d65d832137e20e193c960802afba73b5d38sm                            0.0416f, pressAndCollectVolume, basicVulnerabilityVolume));
736cfd74d65d832137e20e193c960802afba73b5d38sm
737cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation extremeAngle = new SpriteAnimation(
738cfd74d65d832137e20e193c960802afba73b5d38sm                    PlayerAnimations.MOVE_FAST.ordinal(), 1);
739cfd74d65d832137e20e193c960802afba73b5d38sm            extremeAngle.addFrame(
740cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore01),
741cfd74d65d832137e20e193c960802afba73b5d38sm                            0.0416f, pressAndCollectVolume, basicVulnerabilityVolume));
742cfd74d65d832137e20e193c960802afba73b5d38sm
743cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation up = new SpriteAnimation(PlayerAnimations.BOOST_UP.ordinal(), 2);
744cfd74d65d832137e20e193c960802afba73b5d38sm            up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup02),
745cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
746cfd74d65d832137e20e193c960802afba73b5d38sm            up.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_flyup03),
747cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
748cfd74d65d832137e20e193c960802afba73b5d38sm            up.setLoop(true);
749cfd74d65d832137e20e193c960802afba73b5d38sm
750cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation boostAngle = new SpriteAnimation(PlayerAnimations.BOOST_MOVE.ordinal(), 2);
751cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.addFrame(
752cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag02),
753cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
754cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.addFrame(
755cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diag03),
756cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
757cfd74d65d832137e20e193c960802afba73b5d38sm            boostAngle.setLoop(true);
758cfd74d65d832137e20e193c960802afba73b5d38sm
759cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation boostExtremeAngle = new SpriteAnimation(
760cfd74d65d832137e20e193c960802afba73b5d38sm                    PlayerAnimations.BOOST_MOVE_FAST.ordinal(), 2);
761cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.addFrame(
762cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore02),
763cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
764cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.addFrame(
765cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_diagmore03),
766cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), pressAndCollectVolume, basicVulnerabilityVolume));
767cfd74d65d832137e20e193c960802afba73b5d38sm            boostExtremeAngle.setLoop(true);
768cfd74d65d832137e20e193c960802afba73b5d38sm
769cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> stompAttackVolume =
770cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(3);
771cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(new AABoxCollisionVolume(16, -5.0f, 32, 37, HitType.HIT));
772cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(pressCollisionVolume);
773cfd74d65d832137e20e193c960802afba73b5d38sm            stompAttackVolume.add(collectionVolume);
774cfd74d65d832137e20e193c960802afba73b5d38sm
775cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation stomp = new SpriteAnimation(PlayerAnimations.STOMP.ordinal(), 4);
776cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
777cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp01),
778cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
779cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
780cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp02),
781cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
782cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
783cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp03),
784cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
785cfd74d65d832137e20e193c960802afba73b5d38sm            stomp.addFrame(
786cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp04),
787cfd74d65d832137e20e193c960802afba73b5d38sm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
788cfd74d65d832137e20e193c960802afba73b5d38sm
789cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hitReactAnim = new SpriteAnimation(PlayerAnimations.HIT_REACT.ordinal(), 1);
790cfd74d65d832137e20e193c960802afba73b5d38sm            hitReactAnim.addFrame(
791cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_hit),
792cfd74d65d832137e20e193c960802afba73b5d38sm                            0.1f, pressAndCollectVolume, null));
793cfd74d65d832137e20e193c960802afba73b5d38sm
794cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation deathAnim = new SpriteAnimation(PlayerAnimations.DEATH.ordinal(), 16);
795cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame death1 =
796cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die01),
797cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1), null, null);
798cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame death2 =
799cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_die02),
800cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1), null, null);
801cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death1);
802cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death2);
803cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death1);
804cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(death2);
805cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
806cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode01),
807cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
808cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
809cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode02),
810cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
811cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
812cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode03),
813cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
814cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
815cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode04),
816cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 1), null, null));
817cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
818cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode05),
819cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
820cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
821cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode06),
822cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
823cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
824cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode07),
825cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
826cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
827cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode08),
828cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
829cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
830cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode09),
831cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
832cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
833cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode10),
834cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
835cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
836cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode11),
837cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
838cfd74d65d832137e20e193c960802afba73b5d38sm            deathAnim.addFrame(
839cfd74d65d832137e20e193c960802afba73b5d38sm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12),
840cfd74d65d832137e20e193c960802afba73b5d38sm                            Utils.framesToTime(24, 2), null, null));
841cfd74d65d832137e20e193c960802afba73b5d38sm
842cfd74d65d832137e20e193c960802afba73b5d38sm
843cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation frozenAnim = new SpriteAnimation(PlayerAnimations.FROZEN.ordinal(), 1);
844cfd74d65d832137e20e193c960802afba73b5d38sm            // Frozen has no frames!
845cfd74d65d832137e20e193c960802afba73b5d38sm
846cfd74d65d832137e20e193c960802afba73b5d38sm
847cfd74d65d832137e20e193c960802afba73b5d38sm            // Save static data
848cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
849cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
850cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
851cfd74d65d832137e20e193c960802afba73b5d38sm
852cfd74d65d832137e20e193c960802afba73b5d38sm
853cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
854cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(angle);
855cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(extremeAngle);
856cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(up);
857cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(boostAngle);
858cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(boostExtremeAngle);
859cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(stomp);
860cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hitReactAnim);
861cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(deathAnim);
862cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(frozenAnim);
863cfd74d65d832137e20e193c960802afba73b5d38sm
864cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.PLAYER, staticData);
865cfd74d65d832137e20e193c960802afba73b5d38sm        }
866cfd74d65d832137e20e193c960802afba73b5d38sm
867cfd74d65d832137e20e193c960802afba73b5d38sm
868cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
869cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PLAYER);
870cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
871cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
872cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
873cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 0);
874cfd74d65d832137e20e193c960802afba73b5d38sm        PlayerComponent player = (PlayerComponent)allocateComponent(PlayerComponent.class);
875cfd74d65d832137e20e193c960802afba73b5d38sm        AnimationComponent animation =
876cfd74d65d832137e20e193c960802afba73b5d38sm            (AnimationComponent)allocateComponent(AnimationComponent.class);
877cfd74d65d832137e20e193c960802afba73b5d38sm
878cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setPlayer(player);
879cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
880cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
881cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setLandThump(sound.load(R.raw.thump));
882cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setRocketSound(sound.load(R.raw.rockets));
883cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setRubySounds(sound.load(R.raw.gem1), sound.load(R.raw.gem2), sound.load(R.raw.gem3));
884cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setExplosionSound(sound.load(R.raw.sound_explode));
885cfd74d65d832137e20e193c960802afba73b5d38sm        }
886cfd74d65d832137e20e193c960802afba73b5d38sm
887cfd74d65d832137e20e193c960802afba73b5d38sm
888cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
889cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
890cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
891cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
892cfd74d65d832137e20e193c960802afba73b5d38sm
893cfd74d65d832137e20e193c960802afba73b5d38sm
894cfd74d65d832137e20e193c960802afba73b5d38sm
895cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision
896cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
897cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
898cfd74d65d832137e20e193c960802afba73b5d38sm
899cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
900cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setBounceOnHit(true);
901cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPauseOnAttack(true);
902cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincibleTime(3.0f);
903cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnOnDealHit(HitType.HIT, GameObjectType.CRUSH_FLASH, false, true);
904cfd74d65d832137e20e193c960802afba73b5d38sm
905cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
906cfd74d65d832137e20e193c960802afba73b5d38sm            hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.deep_clang));
907cfd74d65d832137e20e193c960802afba73b5d38sm        }
908cfd74d65d832137e20e193c960802afba73b5d38sm
909cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
910cfd74d65d832137e20e193c960802afba73b5d38sm
911cfd74d65d832137e20e193c960802afba73b5d38sm        player.setHitReactionComponent(hitReact);
912cfd74d65d832137e20e193c960802afba73b5d38sm
913cfd74d65d832137e20e193c960802afba73b5d38sm        InventoryComponent inventory = (InventoryComponent)allocateComponent(InventoryComponent.class);
914cfd74d65d832137e20e193c960802afba73b5d38sm
915cfd74d65d832137e20e193c960802afba73b5d38sm        player.setInventory(inventory);
916cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setInventory(inventory);
917cfd74d65d832137e20e193c960802afba73b5d38sm
918cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent damageSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
919cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setDamageSwap(damageSwap);
920cfd74d65d832137e20e193c960802afba73b5d38sm
921cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun
922cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
923cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setDelayBetweenShots(0.25f);
924cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
925cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setOffsetX(32);
926cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setOffsetY(15);
927cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setVelocityX(-150.0f);
928cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setVelocityY(100.0f);
929cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun.setThetaError(0.1f);
930cfd74d65d832137e20e193c960802afba73b5d38sm
931cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun2
932cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
933cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setDelayBetweenShots(0.35f);
934cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
935cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setOffsetX(16);
936cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setOffsetY(15);
937cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setVelocityX(-150.0f);
938cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setVelocityY(150.0f);
939cfd74d65d832137e20e193c960802afba73b5d38sm        smokeGun2.setThetaError(0.1f);
940cfd74d65d832137e20e193c960802afba73b5d38sm
941cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.addSwapInComponent(smokeGun);
942cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.addSwapInComponent(smokeGun2);
943cfd74d65d832137e20e193c960802afba73b5d38sm        damageSwap.setPingPongBehavior(true);
944cfd74d65d832137e20e193c960802afba73b5d38sm
945cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent invincibleSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
946cfd74d65d832137e20e193c960802afba73b5d38sm        invincibleSwap.setPingPongBehavior(true);
947cfd74d65d832137e20e193c960802afba73b5d38sm        player.setInvincibleSwap(invincibleSwap);
948cfd74d65d832137e20e193c960802afba73b5d38sm
9492b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.life = PlayerComponent.getDifficultyConstants().getMaxPlayerLife();
950cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.PLAYER;
951cfd74d65d832137e20e193c960802afba73b5d38sm
952cfd74d65d832137e20e193c960802afba73b5d38sm        // Very very basic DDA.  Make the game easier if we've died on this level too much.
953cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
954cfd74d65d832137e20e193c960802afba73b5d38sm        if (level != null) {
955cfd74d65d832137e20e193c960802afba73b5d38sm        	player.adjustDifficulty(object, level.getAttemptsCount());
956cfd74d65d832137e20e193c960802afba73b5d38sm        }
957cfd74d65d832137e20e193c960802afba73b5d38sm
958cfd74d65d832137e20e193c960802afba73b5d38sm
959cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(player);
960cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(inventory);
961cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
962cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
963cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
964cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
965cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
966cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
967cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(damageSwap);
968cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(invincibleSwap);
969cfd74d65d832137e20e193c960802afba73b5d38sm
970cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.PLAYER, object, sprite);
971cfd74d65d832137e20e193c960802afba73b5d38sm
972cfd74d65d832137e20e193c960802afba73b5d38sm
973cfd74d65d832137e20e193c960802afba73b5d38sm
974cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(PlayerAnimations.IDLE.ordinal());
975cfd74d65d832137e20e193c960802afba73b5d38sm
976cfd74d65d832137e20e193c960802afba73b5d38sm
977cfd74d65d832137e20e193c960802afba73b5d38sm        // Jets
978cfd74d65d832137e20e193c960802afba73b5d38sm        {
979cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> jetStaticData = getStaticData(GameObjectType.PLAYER_JETS);
980cfd74d65d832137e20e193c960802afba73b5d38sm            if (jetStaticData == null) {
981cfd74d65d832137e20e193c960802afba73b5d38sm                jetStaticData = new FixedSizeArray<BaseObject>(1);
982cfd74d65d832137e20e193c960802afba73b5d38sm
983cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation jetAnim = new SpriteAnimation(0, 2);
984cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.addFrame(
985cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire01),
986cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
987cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.addFrame(
988cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.jetfire02),
989cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
990cfd74d65d832137e20e193c960802afba73b5d38sm                jetAnim.setLoop(true);
991cfd74d65d832137e20e193c960802afba73b5d38sm
992cfd74d65d832137e20e193c960802afba73b5d38sm                jetStaticData.add(jetAnim);
993cfd74d65d832137e20e193c960802afba73b5d38sm
994cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_JETS, jetStaticData);
995cfd74d65d832137e20e193c960802afba73b5d38sm            }
996cfd74d65d832137e20e193c960802afba73b5d38sm
997cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent jetRender = (RenderComponent)allocateComponent(RenderComponent.class);
998cfd74d65d832137e20e193c960802afba73b5d38sm            jetRender.setPriority(SortConstants.PLAYER - 1);
999cfd74d65d832137e20e193c960802afba73b5d38sm            jetRender.setDrawOffset(0.0f, -16.0f);
1000cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent jetSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1001cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.setSize(64, 64);
1002cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.setRenderComponent(jetRender);
1003cfd74d65d832137e20e193c960802afba73b5d38sm
1004cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(jetRender);
1005cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(jetSprite);
1006cfd74d65d832137e20e193c960802afba73b5d38sm
1007cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_JETS, object, jetSprite);
1008cfd74d65d832137e20e193c960802afba73b5d38sm
1009cfd74d65d832137e20e193c960802afba73b5d38sm            jetSprite.playAnimation(0);
1010cfd74d65d832137e20e193c960802afba73b5d38sm
1011cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setJetSprite(jetSprite);
1012cfd74d65d832137e20e193c960802afba73b5d38sm        }
1013cfd74d65d832137e20e193c960802afba73b5d38sm        // Sparks
1014cfd74d65d832137e20e193c960802afba73b5d38sm        {
1015cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> sparksStaticData = getStaticData(GameObjectType.PLAYER_SPARKS);
1016cfd74d65d832137e20e193c960802afba73b5d38sm
1017cfd74d65d832137e20e193c960802afba73b5d38sm            if (sparksStaticData == null) {
1018cfd74d65d832137e20e193c960802afba73b5d38sm                sparksStaticData = new FixedSizeArray<BaseObject>(1);
1019cfd74d65d832137e20e193c960802afba73b5d38sm
1020cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation sparksAnim = new SpriteAnimation(0, 3);
1021cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
1022cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01),
1023cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
1024cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
1025cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02),
1026cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
1027cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.addFrame(
1028cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03),
1029cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1)));
1030cfd74d65d832137e20e193c960802afba73b5d38sm                sparksAnim.setLoop(true);
1031cfd74d65d832137e20e193c960802afba73b5d38sm
1032cfd74d65d832137e20e193c960802afba73b5d38sm                sparksStaticData.add(sparksAnim);
1033cfd74d65d832137e20e193c960802afba73b5d38sm
1034cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_SPARKS, sparksStaticData);
1035cfd74d65d832137e20e193c960802afba73b5d38sm            }
1036cfd74d65d832137e20e193c960802afba73b5d38sm
1037cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class);
1038cfd74d65d832137e20e193c960802afba73b5d38sm            sparksRender.setPriority(SortConstants.PLAYER + 1);
1039cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1040cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.setSize(64, 64);
1041cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.setRenderComponent(sparksRender);
1042cfd74d65d832137e20e193c960802afba73b5d38sm
1043cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(sparksRender);
1044cfd74d65d832137e20e193c960802afba73b5d38sm            object.add(sparksSprite);
1045cfd74d65d832137e20e193c960802afba73b5d38sm
1046cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_SPARKS, object, sparksSprite);
1047cfd74d65d832137e20e193c960802afba73b5d38sm
1048cfd74d65d832137e20e193c960802afba73b5d38sm            sparksSprite.playAnimation(0);
1049cfd74d65d832137e20e193c960802afba73b5d38sm
1050cfd74d65d832137e20e193c960802afba73b5d38sm            animation.setSparksSprite(sparksSprite);
1051cfd74d65d832137e20e193c960802afba73b5d38sm        }
1052cfd74d65d832137e20e193c960802afba73b5d38sm
1053cfd74d65d832137e20e193c960802afba73b5d38sm        // Glow
1054cfd74d65d832137e20e193c960802afba73b5d38sm        {
1055cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<BaseObject> glowStaticData = getStaticData(GameObjectType.PLAYER_GLOW);
1056cfd74d65d832137e20e193c960802afba73b5d38sm            if (glowStaticData == null) {
1057cfd74d65d832137e20e193c960802afba73b5d38sm                glowStaticData = new FixedSizeArray<BaseObject>(1);
1058cfd74d65d832137e20e193c960802afba73b5d38sm
1059cfd74d65d832137e20e193c960802afba73b5d38sm                FixedSizeArray<CollisionVolume> glowAttackVolume =
1060cfd74d65d832137e20e193c960802afba73b5d38sm                    new FixedSizeArray<CollisionVolume>(1);
1061cfd74d65d832137e20e193c960802afba73b5d38sm                glowAttackVolume.add(new SphereCollisionVolume(40, 40, 40, HitType.HIT));
1062cfd74d65d832137e20e193c960802afba73b5d38sm
1063cfd74d65d832137e20e193c960802afba73b5d38sm                SpriteAnimation glowAnim = new SpriteAnimation(0, 3);
1064cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1065cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow01),
1066cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1067cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1068cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow02),
1069cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1070cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.addFrame(
1071cfd74d65d832137e20e193c960802afba73b5d38sm                        new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_glow03),
1072cfd74d65d832137e20e193c960802afba73b5d38sm                                Utils.framesToTime(24, 1), glowAttackVolume, null));
1073cfd74d65d832137e20e193c960802afba73b5d38sm                glowAnim.setLoop(true);
1074cfd74d65d832137e20e193c960802afba73b5d38sm
1075cfd74d65d832137e20e193c960802afba73b5d38sm                glowStaticData.add(glowAnim);
1076cfd74d65d832137e20e193c960802afba73b5d38sm
1077cfd74d65d832137e20e193c960802afba73b5d38sm                setStaticData(GameObjectType.PLAYER_GLOW, glowStaticData);
1078cfd74d65d832137e20e193c960802afba73b5d38sm            }
1079cfd74d65d832137e20e193c960802afba73b5d38sm
1080cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent glowRender = (RenderComponent)allocateComponent(RenderComponent.class);
1081cfd74d65d832137e20e193c960802afba73b5d38sm            glowRender.setPriority(SortConstants.PLAYER + 1);
1082cfd74d65d832137e20e193c960802afba73b5d38sm            glowRender.setDrawOffset(0, -5.0f);
1083cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteComponent glowSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1084cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setSize(64, 64);
1085cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setRenderComponent(glowRender);
1086cfd74d65d832137e20e193c960802afba73b5d38sm
1087cfd74d65d832137e20e193c960802afba73b5d38sm            DynamicCollisionComponent glowCollision
1088cfd74d65d832137e20e193c960802afba73b5d38sm                = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1089cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.setCollisionComponent(glowCollision);
1090cfd74d65d832137e20e193c960802afba73b5d38sm
1091cfd74d65d832137e20e193c960802afba73b5d38sm            FadeDrawableComponent glowFade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
10922b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            final float glowDuration = PlayerComponent.getDifficultyConstants().getGlowDuration();
1093cfd74d65d832137e20e193c960802afba73b5d38sm            glowFade.setupFade(1.0f, 0.0f, 0.15f,
1094cfd74d65d832137e20e193c960802afba73b5d38sm            		FadeDrawableComponent.LOOP_TYPE_PING_PONG,
1095cfd74d65d832137e20e193c960802afba73b5d38sm            		FadeDrawableComponent.FADE_EASE,
10962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            		glowDuration - 4.0f);	// 4 seconds before the glow ends, start flashing
10972b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            glowFade.setPhaseDuration(glowDuration);
1098cfd74d65d832137e20e193c960802afba73b5d38sm            glowFade.setRenderComponent(glowRender);
10992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
11002b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            // HACK
11012b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            player.setInvincibleFader(glowFade);
1102cfd74d65d832137e20e193c960802afba73b5d38sm
1103cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowRender);
1104cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowSprite);
1105cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowCollision);
1106cfd74d65d832137e20e193c960802afba73b5d38sm            invincibleSwap.addSwapInComponent(glowFade);
1107cfd74d65d832137e20e193c960802afba73b5d38sm
1108cfd74d65d832137e20e193c960802afba73b5d38sm            addStaticData(GameObjectType.PLAYER_GLOW, object, glowSprite);
1109cfd74d65d832137e20e193c960802afba73b5d38sm
1110cfd74d65d832137e20e193c960802afba73b5d38sm            glowSprite.playAnimation(0);
1111cfd74d65d832137e20e193c960802afba73b5d38sm
1112cfd74d65d832137e20e193c960802afba73b5d38sm        }
1113cfd74d65d832137e20e193c960802afba73b5d38sm
1114cfd74d65d832137e20e193c960802afba73b5d38sm        CameraSystem camera = sSystemRegistry.cameraSystem;
1115cfd74d65d832137e20e193c960802afba73b5d38sm        if (camera != null) {
1116cfd74d65d832137e20e193c960802afba73b5d38sm            camera.setTarget(object);
1117cfd74d65d832137e20e193c960802afba73b5d38sm        }
1118cfd74d65d832137e20e193c960802afba73b5d38sm
1119cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1120cfd74d65d832137e20e193c960802afba73b5d38sm    }
1121cfd74d65d832137e20e193c960802afba73b5d38sm
1122cfd74d65d832137e20e193c960802afba73b5d38sm
1123cfd74d65d832137e20e193c960802afba73b5d38sm    // Sparks are used by more than one enemy type, so the setup for them is abstracted.
1124cfd74d65d832137e20e193c960802afba73b5d38sm    private void setupEnemySparks() {
1125cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENEMY_SPARKS);
1126cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1127cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(1);
1128cfd74d65d832137e20e193c960802afba73b5d38sm            TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1129cfd74d65d832137e20e193c960802afba73b5d38sm
1130cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation sparksAnim = new SpriteAnimation(0, 13);
1131cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 =
1132cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark01),
1133cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1134cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 =
1135cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark02),
1136cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1137cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 =
1138cfd74d65d832137e20e193c960802afba73b5d38sm                new AnimationFrame(textureLibrary.allocateTexture(R.drawable.spark03),
1139cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 1));
1140cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1141cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1142cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1143cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1144cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1145cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1146cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1147cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1148cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1149cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame1);
1150cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame2);
1151cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(frame3);
1152cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.addFrame(new AnimationFrame(null, 3.0f));
1153cfd74d65d832137e20e193c960802afba73b5d38sm            sparksAnim.setLoop(true);
1154cfd74d65d832137e20e193c960802afba73b5d38sm
1155cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(sparksAnim);
1156cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ENEMY_SPARKS, staticData);
1157cfd74d65d832137e20e193c960802afba73b5d38sm        }
1158cfd74d65d832137e20e193c960802afba73b5d38sm
1159cfd74d65d832137e20e193c960802afba73b5d38sm    }
1160cfd74d65d832137e20e193c960802afba73b5d38sm
1161cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyBrobot(float positionX, float positionY, boolean flipHorizontal) {
1162cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1163cfd74d65d832137e20e193c960802afba73b5d38sm
1164cfd74d65d832137e20e193c960802afba73b5d38sm
1165cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1166cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1167cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1168cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1169cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1170cfd74d65d832137e20e193c960802afba73b5d38sm
1171cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT);
1172cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1173cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
1174cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1175cfd74d65d832137e20e193c960802afba73b5d38sm
1176cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1177cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1178cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
1179cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.4f);
1180cfd74d65d832137e20e193c960802afba73b5d38sm
1181cfd74d65d832137e20e193c960802afba73b5d38sm
1182cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
1183cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1184cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1185cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1186cfd74d65d832137e20e193c960802afba73b5d38sm
1187cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1188cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
1189cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
1190cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new AABoxCollisionVolume(16, 0, 32, 16, HitType.DEPRESS));
1191cfd74d65d832137e20e193c960802afba73b5d38sm
1192cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4);
1193cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1194cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01),
1195cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1196cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1197cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02),
1198cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1199cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1200cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03),
1201cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1202cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1203cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02),
1204cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1205cfd74d65d832137e20e193c960802afba73b5d38sm
1206cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1207cfd74d65d832137e20e193c960802afba73b5d38sm
1208cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3);
1209cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1210cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01),
1211cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1212cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1213cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02),
1214cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1215cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1216cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03),
1217cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1218cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1219cfd74d65d832137e20e193c960802afba73b5d38sm
1220cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1221cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1222cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1223cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1224cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1225cfd74d65d832137e20e193c960802afba73b5d38sm
1226cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT, staticData);
1227cfd74d65d832137e20e193c960802afba73b5d38sm
1228cfd74d65d832137e20e193c960802afba73b5d38sm        }
1229cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1230cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1231cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1232cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1233cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1234cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 0);
1235cfd74d65d832137e20e193c960802afba73b5d38sm
1236cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1237cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1238cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1239cfd74d65d832137e20e193c960802afba73b5d38sm
1240cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1241cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1242cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1243cfd74d65d832137e20e193c960802afba73b5d38sm
1244cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1245cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
1246cfd74d65d832137e20e193c960802afba73b5d38sm
1247cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1248cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1249cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1250cfd74d65d832137e20e193c960802afba73b5d38sm
1251cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1252cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1253cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1254cfd74d65d832137e20e193c960802afba73b5d38sm
1255cfd74d65d832137e20e193c960802afba73b5d38sm
1256cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1257cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_GIANT);
1258cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
12592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        lifetime.setIncrementEventCounter(EventRecorder.COUNTER_ROBOTS_DESTROYED);
1260cfd74d65d832137e20e193c960802afba73b5d38sm
1261cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
1262cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setMovementSpeed(500.0f);
1263cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setAcceleration(1000.0f);
1264cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setJumpImpulse(300.0f);
1265cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setKillOnRelease(true);
1266cfd74d65d832137e20e193c960802afba73b5d38sm        ghost.setDelayOnRelease(1.5f);
1267cfd74d65d832137e20e193c960802afba73b5d38sm
1268cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1269cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1270cfd74d65d832137e20e193c960802afba73b5d38sm        	ghost.setAmbientSound(sound.load(R.raw.sound_possession));
1271cfd74d65d832137e20e193c960802afba73b5d38sm        }
1272cfd74d65d832137e20e193c960802afba73b5d38sm
1273cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent ghostSwap
1274cfd74d65d832137e20e193c960802afba73b5d38sm            = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
1275cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(ghost);
1276cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapOutComponent(patrol);
1277cfd74d65d832137e20e193c960802afba73b5d38sm
1278cfd74d65d832137e20e193c960802afba73b5d38sm        SimplePhysicsComponent ghostPhysics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
1279cfd74d65d832137e20e193c960802afba73b5d38sm        ghostPhysics.setBounciness(0.0f);
1280cfd74d65d832137e20e193c960802afba73b5d38sm
1281cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1282cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1283cfd74d65d832137e20e193c960802afba73b5d38sm
1284cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1285cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1286cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1287cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1288cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1289cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1290cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(ghostSwap);
1291cfd74d65d832137e20e193c960802afba73b5d38sm
1292cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1293cfd74d65d832137e20e193c960802afba73b5d38sm
1294cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1295cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1296cfd74d65d832137e20e193c960802afba73b5d38sm        }
1297cfd74d65d832137e20e193c960802afba73b5d38sm
1298cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT, object, sprite);
1299cfd74d65d832137e20e193c960802afba73b5d38sm
1300cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
1301cfd74d65d832137e20e193c960802afba73b5d38sm
1302cfd74d65d832137e20e193c960802afba73b5d38sm        SimplePhysicsComponent normalPhysics = object.findByClass(SimplePhysicsComponent.class);
1303cfd74d65d832137e20e193c960802afba73b5d38sm        if (normalPhysics != null) {
1304cfd74d65d832137e20e193c960802afba73b5d38sm            ghostSwap.addSwapOutComponent(normalPhysics);
1305cfd74d65d832137e20e193c960802afba73b5d38sm        }
1306cfd74d65d832137e20e193c960802afba73b5d38sm
1307cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(ghostPhysics);
1308cfd74d65d832137e20e193c960802afba73b5d38sm
1309cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1310cfd74d65d832137e20e193c960802afba73b5d38sm
1311cfd74d65d832137e20e193c960802afba73b5d38sm        // Sparks
1312cfd74d65d832137e20e193c960802afba73b5d38sm        setupEnemySparks();
1313cfd74d65d832137e20e193c960802afba73b5d38sm
1314cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent sparksRender = (RenderComponent)allocateComponent(RenderComponent.class);
1315cfd74d65d832137e20e193c960802afba73b5d38sm        sparksRender.setPriority(render.getPriority() + 1);
1316cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sparksSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1317cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.setSize(64, 64);
1318cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.setRenderComponent(sparksRender);
1319cfd74d65d832137e20e193c960802afba73b5d38sm
1320cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ENEMY_SPARKS, object, sparksSprite);
1321cfd74d65d832137e20e193c960802afba73b5d38sm
1322cfd74d65d832137e20e193c960802afba73b5d38sm        sparksSprite.playAnimation(0);
1323cfd74d65d832137e20e193c960802afba73b5d38sm
1324cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(sparksSprite);
1325cfd74d65d832137e20e193c960802afba73b5d38sm        ghostSwap.addSwapInComponent(sparksRender);
1326cfd74d65d832137e20e193c960802afba73b5d38sm
1327cfd74d65d832137e20e193c960802afba73b5d38sm
1328cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPossessionComponent(ghostSwap);
1329cfd74d65d832137e20e193c960802afba73b5d38sm
1330cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1331cfd74d65d832137e20e193c960802afba73b5d38sm    }
1332cfd74d65d832137e20e193c960802afba73b5d38sm
1333cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySnailBomb(float positionX, float positionY, boolean flipHorizontal) {
1334cfd74d65d832137e20e193c960802afba73b5d38sm
1335cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1336cfd74d65d832137e20e193c960802afba73b5d38sm
1337cfd74d65d832137e20e193c960802afba73b5d38sm
1338cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
1339cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.snail_bomb);
1340cfd74d65d832137e20e193c960802afba73b5d38sm
1341cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1342cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1343cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1344cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1345cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1346cfd74d65d832137e20e193c960802afba73b5d38sm
1347cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SNAILBOMB);
1348cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1349cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 6;
1350cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1351cfd74d65d832137e20e193c960802afba73b5d38sm
1352cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1353cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1354cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1355cfd74d65d832137e20e193c960802afba73b5d38sm
1356cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
1357cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1358cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1359cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT));
1360cfd74d65d832137e20e193c960802afba73b5d38sm
1361cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1362cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1363cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new AABoxCollisionVolume(12, 5, 42, 27, HitType.HIT));
1364cfd74d65d832137e20e193c960802afba73b5d38sm
1365cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
1366cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1367cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1368cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1369cfd74d65d832137e20e193c960802afba73b5d38sm
1370cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 5);
1371cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1372cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1373cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1374cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1375cfd74d65d832137e20e193c960802afba73b5d38sm                        textureLibrary.allocateTexture(R.drawable.snailbomb_walk01),
1376cfd74d65d832137e20e193c960802afba73b5d38sm                        Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1377cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1378cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_walk02),
1379cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume));
1380cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1381cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_walk01),
1382cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1383cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1384cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_stand),
1385cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1386cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1387cfd74d65d832137e20e193c960802afba73b5d38sm
1388cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 2);
1389cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1390cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_shoot01),
1391cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
1392cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1393cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.snailbomb_shoot02),
1394cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume));
1395cfd74d65d832137e20e193c960802afba73b5d38sm
1396cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1397cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1398cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1399cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1400cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1401cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1402cfd74d65d832137e20e193c960802afba73b5d38sm
1403cfd74d65d832137e20e193c960802afba73b5d38sm
1404cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SNAILBOMB, staticData);
1405cfd74d65d832137e20e193c960802afba73b5d38sm        }
1406cfd74d65d832137e20e193c960802afba73b5d38sm
1407cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1408cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1409cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1410cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1411cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1412cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
1413cfd74d65d832137e20e193c960802afba73b5d38sm
1414cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1415cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1416cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1417cfd74d65d832137e20e193c960802afba73b5d38sm
1418cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1419cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1420cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1421cfd74d65d832137e20e193c960802afba73b5d38sm
1422cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1423cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 1000.0f);
1424cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setupAttack(300, 1.0f, 4.0f, true);
1425cfd74d65d832137e20e193c960802afba73b5d38sm
1426cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1427cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1428cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1429cfd74d65d832137e20e193c960802afba73b5d38sm
1430cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1431cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1432cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1433cfd74d65d832137e20e193c960802afba73b5d38sm
1434cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1435cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
1436cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
1437cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1438cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1439cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
1440cfd74d65d832137e20e193c960802afba73b5d38sm        }
1441cfd74d65d832137e20e193c960802afba73b5d38sm
1442cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
1443cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
1444cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
1445cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(3);
1446cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(1.0f);
1447cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenShots(0.25f);
1448cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.CANNON_BALL);
1449cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(55);
1450cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(21);
1451cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
1452cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(100.0f);
1453cfd74d65d832137e20e193c960802afba73b5d38sm
1454cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1455cfd74d65d832137e20e193c960802afba73b5d38sm
1456cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1457cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1458cfd74d65d832137e20e193c960802afba73b5d38sm        }
1459cfd74d65d832137e20e193c960802afba73b5d38sm
1460cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1461cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1462cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1463cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1464cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1465cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1466cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1467cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1468cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
1469cfd74d65d832137e20e193c960802afba73b5d38sm
1470cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SNAILBOMB, object, sprite);
1471cfd74d65d832137e20e193c960802afba73b5d38sm
1472cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1473cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
1474cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(attack.getLength());
1475cfd74d65d832137e20e193c960802afba73b5d38sm        }
1476cfd74d65d832137e20e193c960802afba73b5d38sm
1477cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1478cfd74d65d832137e20e193c960802afba73b5d38sm
1479cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1480cfd74d65d832137e20e193c960802afba73b5d38sm    }
1481cfd74d65d832137e20e193c960802afba73b5d38sm
1482cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyShadowSlime(float positionX, float positionY, boolean flipHorizontal) {
1483cfd74d65d832137e20e193c960802afba73b5d38sm
1484cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1485cfd74d65d832137e20e193c960802afba73b5d38sm
1486cfd74d65d832137e20e193c960802afba73b5d38sm
1487cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
1488cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
1489cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
1490cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
1491cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
1492cfd74d65d832137e20e193c960802afba73b5d38sm
1493cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1494cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1495cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
1496cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1497cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1498cfd74d65d832137e20e193c960802afba73b5d38sm
1499cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SHADOWSLIME);
1500cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1501cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
1502cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1503cfd74d65d832137e20e193c960802afba73b5d38sm
1504cfd74d65d832137e20e193c960802afba73b5d38sm            PopOutComponent popOut = (PopOutComponent)allocateComponent(PopOutComponent.class);
15052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            // edit: these guys turned out to be really annoying, so I'm changing the values
15062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            // here to force them to always be out.
15072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            popOut.setAppearDistance(2000);
15082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            popOut.setHideDistance(4000);
1509cfd74d65d832137e20e193c960802afba73b5d38sm
1510cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
1511cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1512cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
1513cfd74d65d832137e20e193c960802afba73b5d38sm
1514cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1);
1515cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
1516cfd74d65d832137e20e193c960802afba73b5d38sm
1517cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2);
1518cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
1519cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle01),
1520cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1521cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
1522cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_idle02),
1523cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1524cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1525cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
1526cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1527cfd74d65d832137e20e193c960802afba73b5d38sm
1528cfd74d65d832137e20e193c960802afba73b5d38sm
1529cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation appear = new SpriteAnimation(EnemyAnimations.APPEAR.ordinal(), 6);
1530cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear1 = new AnimationFrame(
1531cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate01),
1532cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1533cfd74d65d832137e20e193c960802afba73b5d38sm
1534cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear2 = new AnimationFrame(
1535cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate02),
1536cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1537cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear3 = new AnimationFrame(
1538cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate03),
1539cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1540cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear4 = new AnimationFrame(
1541cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate04),
1542cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1543cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear5 = new AnimationFrame(
1544cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate05),
1545cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1546cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame appear6 = new AnimationFrame(
1547cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_activate06),
1548cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1549cfd74d65d832137e20e193c960802afba73b5d38sm
1550cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear1);
1551cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear2);
1552cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear3);
1553cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear4);
1554cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear5);
1555cfd74d65d832137e20e193c960802afba73b5d38sm            appear.addFrame(appear6);
1556cfd74d65d832137e20e193c960802afba73b5d38sm
1557cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hidden = new SpriteAnimation(EnemyAnimations.HIDDEN.ordinal(), 6);
1558cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear6);
1559cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear5);
1560cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear4);
1561cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear3);
1562cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear2);
1563cfd74d65d832137e20e193c960802afba73b5d38sm            hidden.addFrame(appear1);
1564cfd74d65d832137e20e193c960802afba73b5d38sm            /*hidden.addFrame(new AnimationFrame(
1565cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_stand),
1566cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));*/
1567cfd74d65d832137e20e193c960802afba73b5d38sm
1568cfd74d65d832137e20e193c960802afba73b5d38sm
1569cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 10);
1570cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack1 = new AnimationFrame(
1571cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack01),
1572cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1573cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack2 = new AnimationFrame(
1574cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02),
1575cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1576cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack3 = new AnimationFrame(
1577cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03),
1578cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), basicAttackVolume, basicVulnerabilityVolume);
1579cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack4 = new AnimationFrame(
1580cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04),
1581cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), basicAttackVolume, basicVulnerabilityVolume);
1582cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attackFlash = new AnimationFrame(
1583cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_flash),
1584cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1585cfd74d65d832137e20e193c960802afba73b5d38sm
1586cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack5 = new AnimationFrame(
1587cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack03),
1588cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1589cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack6 = new AnimationFrame(
1590cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack02),
1591cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume);
1592cfd74d65d832137e20e193c960802afba73b5d38sm
1593cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame attack7 = new AnimationFrame(
1594cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_shadowslime_attack04),
1595cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume);
1596cfd74d65d832137e20e193c960802afba73b5d38sm
1597cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack1);
1598cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack2);
1599cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack3);
1600cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack4);
1601cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attackFlash);
1602cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack7);
1603cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attackFlash);
1604cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack5);
1605cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack6);
1606cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(attack1);
1607cfd74d65d832137e20e193c960802afba73b5d38sm
1608cfd74d65d832137e20e193c960802afba73b5d38sm            popOut.setupAttack(200, 2.0f, attack.getLength());
1609cfd74d65d832137e20e193c960802afba73b5d38sm
1610cfd74d65d832137e20e193c960802afba73b5d38sm
1611cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(popOut);
1612cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1613cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hidden);
1614cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(appear);
1615cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1616cfd74d65d832137e20e193c960802afba73b5d38sm
1617cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SHADOWSLIME, staticData);
1618cfd74d65d832137e20e193c960802afba73b5d38sm        }
1619cfd74d65d832137e20e193c960802afba73b5d38sm
1620cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1621cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1622cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
1623cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1624cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
1625cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
1626cfd74d65d832137e20e193c960802afba73b5d38sm
1627cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1628cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1629cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1630cfd74d65d832137e20e193c960802afba73b5d38sm
1631cfd74d65d832137e20e193c960802afba73b5d38sm
1632cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1633cfd74d65d832137e20e193c960802afba73b5d38sm
1634cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
1635cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1636cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1637cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setFacePlayer(true);
1638cfd74d65d832137e20e193c960802afba73b5d38sm
1639cfd74d65d832137e20e193c960802afba73b5d38sm
1640cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
1641cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1642cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1643cfd74d65d832137e20e193c960802afba73b5d38sm
1644cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
1645cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1646cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1647cfd74d65d832137e20e193c960802afba73b5d38sm
1648cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1649cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
1650cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
1651cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
1652cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
1653cfd74d65d832137e20e193c960802afba73b5d38sm        }
1654cfd74d65d832137e20e193c960802afba73b5d38sm
1655cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
1656cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
1657cfd74d65d832137e20e193c960802afba73b5d38sm
1658cfd74d65d832137e20e193c960802afba73b5d38sm
1659cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
1660cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
1661cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL);
1662cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(44);
1663cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(22);
1664cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
1665cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(30.0f);
1666cfd74d65d832137e20e193c960802afba73b5d38sm
1667cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1668cfd74d65d832137e20e193c960802afba73b5d38sm
1669cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1670cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1671cfd74d65d832137e20e193c960802afba73b5d38sm        }
1672cfd74d65d832137e20e193c960802afba73b5d38sm
1673cfd74d65d832137e20e193c960802afba73b5d38sm        // Hack.  Adjusting position lets us avoid giving this character gravity, physics, and
1674cfd74d65d832137e20e193c960802afba73b5d38sm        // collision.
1675cfd74d65d832137e20e193c960802afba73b5d38sm
1676cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 5;
1677cfd74d65d832137e20e193c960802afba73b5d38sm
1678cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1679cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1680cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1681cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1682cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1683cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1684cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1685cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
1686cfd74d65d832137e20e193c960802afba73b5d38sm
1687cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SHADOWSLIME, object, sprite);
1688cfd74d65d832137e20e193c960802afba73b5d38sm
1689cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1690cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation appear = sprite.findAnimation(EnemyAnimations.APPEAR.ordinal());
1691cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null && appear != null) {
1692cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(attack.getLength() / 2.0f);
1693cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
1694cfd74d65d832137e20e193c960802afba73b5d38sm            gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 12));
1695cfd74d65d832137e20e193c960802afba73b5d38sm        }
1696cfd74d65d832137e20e193c960802afba73b5d38sm
1697cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1698cfd74d65d832137e20e193c960802afba73b5d38sm    }
1699cfd74d65d832137e20e193c960802afba73b5d38sm
1700cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyMudman(float positionX, float positionY, boolean flipHorizontal) {
1701cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1702cfd74d65d832137e20e193c960802afba73b5d38sm
1703cfd74d65d832137e20e193c960802afba73b5d38sm
1704cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1705cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1706cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1707cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
1708cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
1709cfd74d65d832137e20e193c960802afba73b5d38sm
1710cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.MUDMAN);
1711cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1712cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
1713cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1714cfd74d65d832137e20e193c960802afba73b5d38sm
1715cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1716cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1717cfd74d65d832137e20e193c960802afba73b5d38sm
1718cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1719cfd74d65d832137e20e193c960802afba73b5d38sm
1720cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
1721cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
1722cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
1723cfd74d65d832137e20e193c960802afba73b5d38sm            // house shape:
1724cfd74d65d832137e20e193c960802afba73b5d38sm            // / \      1/ \2
1725cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      3| |4
1726cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(32, 64);
1727cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(64, 96);
1728cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.707f, 0.707f);
1729cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
1730cfd74d65d832137e20e193c960802afba73b5d38sm
1731cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(64, 96);
1732cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(75, 64);
1733cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.9456f, 0.3250f);
1734cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
1735cfd74d65d832137e20e193c960802afba73b5d38sm
1736cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(32, 0);
1737cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(32, 64);
1738cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(-1, 0);
1739cfd74d65d832137e20e193c960802afba73b5d38sm
1740cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(75, 0);
1741cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(75, 64);
1742cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(1, 0);
1743cfd74d65d832137e20e193c960802afba73b5d38sm
1744cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
1745cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
1746cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
1747cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
1748cfd74d65d832137e20e193c960802afba73b5d38sm
1749cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 4);
1750cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1751cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_stand),
1752cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 12), null, null));
1753cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
1754cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01),
1755cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null);
1756cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
1757cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_idle01),
1758cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 7), null, null);
1759cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1760cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
1761cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
1762cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
1763cfd74d65d832137e20e193c960802afba73b5d38sm
1764cfd74d65d832137e20e193c960802afba73b5d38sm
1765cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6);
1766cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1767cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk01),
1768cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1769cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1770cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk02),
1771cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1772cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1773cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk03),
1774cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1775cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1776cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk04),
1777cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1778cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1779cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk05),
1780cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
1781cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1782cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_walk06),
1783cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1784cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1785cfd74d65d832137e20e193c960802afba73b5d38sm
1786cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> crushAttackVolume =
1787cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1788cfd74d65d832137e20e193c960802afba73b5d38sm            crushAttackVolume.add(new AABoxCollisionVolume(64, 0, 64, 96, HitType.HIT));
1789cfd74d65d832137e20e193c960802afba73b5d38sm
1790cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 8);
1791cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1792cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_stand),
1793cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1794cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1795cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack01),
1796cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1797cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1798cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack02),
1799cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1800cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1801cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack03),
1802cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
1803cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1804cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack04),
1805cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), crushAttackVolume, null));
1806cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1807cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack05),
1808cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), crushAttackVolume, null));
1809cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1810cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack06),
1811cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), crushAttackVolume, null));
1812cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1813cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_mud_attack07),
1814cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, null));
1815cfd74d65d832137e20e193c960802afba73b5d38sm
1816cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1817cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1818cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1819cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
1820cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1821cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1822cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1823cfd74d65d832137e20e193c960802afba73b5d38sm
1824cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.MUDMAN, staticData);
1825cfd74d65d832137e20e193c960802afba73b5d38sm        }
1826cfd74d65d832137e20e193c960802afba73b5d38sm
1827cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1828cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1829cfd74d65d832137e20e193c960802afba73b5d38sm
1830cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1831cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(80, 90);
1832cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(32, 5);
1833cfd74d65d832137e20e193c960802afba73b5d38sm
1834cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1835cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
1836cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1837cfd74d65d832137e20e193c960802afba73b5d38sm
1838cfd74d65d832137e20e193c960802afba73b5d38sm
1839cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1840cfd74d65d832137e20e193c960802afba73b5d38sm
1841cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1842cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1843cfd74d65d832137e20e193c960802afba73b5d38sm
1844cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1845cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 400.0f);
1846cfd74d65d832137e20e193c960802afba73b5d38sm
1847cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1848cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1849cfd74d65d832137e20e193c960802afba73b5d38sm
1850cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1851cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1852cfd74d65d832137e20e193c960802afba73b5d38sm
1853cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
1854cfd74d65d832137e20e193c960802afba73b5d38sm
1855cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
1856cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
1857cfd74d65d832137e20e193c960802afba73b5d38sm
1858cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
1859cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
1860cfd74d65d832137e20e193c960802afba73b5d38sm        }
1861cfd74d65d832137e20e193c960802afba73b5d38sm
1862cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
1863cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
1864cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
1865cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
1866cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
1867cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
1868cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
1869cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
1870cfd74d65d832137e20e193c960802afba73b5d38sm
1871cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.MUDMAN, object, sprite);
1872cfd74d65d832137e20e193c960802afba73b5d38sm
1873cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
1874cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
1875cfd74d65d832137e20e193c960802afba73b5d38sm            patrol.setupAttack(70.0f, attack.getLength(), 0.0f, true);
1876cfd74d65d832137e20e193c960802afba73b5d38sm        }
1877cfd74d65d832137e20e193c960802afba73b5d38sm
1878cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
1879cfd74d65d832137e20e193c960802afba73b5d38sm
1880cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
1881cfd74d65d832137e20e193c960802afba73b5d38sm    }
1882cfd74d65d832137e20e193c960802afba73b5d38sm
1883cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySkeleton(float positionX, float positionY, boolean flipHorizontal) {
1884cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
1885cfd74d65d832137e20e193c960802afba73b5d38sm
1886cfd74d65d832137e20e193c960802afba73b5d38sm
1887cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
1888cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
1889cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
1890cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
1891cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
1892cfd74d65d832137e20e193c960802afba73b5d38sm
1893cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SKELETON);
1894cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
1895cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
1896cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
1897cfd74d65d832137e20e193c960802afba73b5d38sm
1898cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
1899cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
1900cfd74d65d832137e20e193c960802afba73b5d38sm
1901cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
1902cfd74d65d832137e20e193c960802afba73b5d38sm
1903cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
1904cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
1905cfd74d65d832137e20e193c960802afba73b5d38sm
1906cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(25, 0);
1907cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(25, 64);
1908cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-1, 0);
1909cfd74d65d832137e20e193c960802afba73b5d38sm
1910cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(40, 0);
1911cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(40, 64);
1912cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(1, 0);
1913cfd74d65d832137e20e193c960802afba73b5d38sm
1914cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
1915cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
1916cfd74d65d832137e20e193c960802afba73b5d38sm
1917cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
1918cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1919cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
1920cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
1921cfd74d65d832137e20e193c960802afba73b5d38sm
1922cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
1923cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
1924cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 48, 32, HitType.HIT));
1925cfd74d65d832137e20e193c960802afba73b5d38sm
1926cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
1927cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
1928cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_stand),
1929cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
1930cfd74d65d832137e20e193c960802afba73b5d38sm
1931cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 6);
1932cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1933cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk01),
1934cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1935cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1936cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk02),
1937cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, basicVulnerabilityVolume));
1938cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1939cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03),
1940cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1941cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1942cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk04),
1943cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1944cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1945cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk05),
1946cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, basicVulnerabilityVolume));
1947cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
1948cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_walk03),
1949cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
1950cfd74d65d832137e20e193c960802afba73b5d38sm
1951cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
1952cfd74d65d832137e20e193c960802afba73b5d38sm
1953cfd74d65d832137e20e193c960802afba73b5d38sm
1954cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 3);
1955cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1956cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack01),
1957cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 5), null, basicVulnerabilityVolume));
1958cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1959cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack03),
1960cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1961cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
1962cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_skeleton_attack04),
1963cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
1964cfd74d65d832137e20e193c960802afba73b5d38sm
1965cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
1966cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
1967cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
1968cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
1969cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
1970cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
1971cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
1972cfd74d65d832137e20e193c960802afba73b5d38sm
1973cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.SKELETON, staticData);
1974cfd74d65d832137e20e193c960802afba73b5d38sm        }
1975cfd74d65d832137e20e193c960802afba73b5d38sm
1976cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
1977cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
1978cfd74d65d832137e20e193c960802afba73b5d38sm
1979cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
1980cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(32, 48);
1981cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(16, 5);
1982cfd74d65d832137e20e193c960802afba73b5d38sm
1983cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
1984cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
1985cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
1986cfd74d65d832137e20e193c960802afba73b5d38sm
1987cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
1988cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
1989cfd74d65d832137e20e193c960802afba73b5d38sm
1990cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
1991cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(20.0f, 1000.0f);
1992cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(true);
1993cfd74d65d832137e20e193c960802afba73b5d38sm
1994cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
1995cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
1996cfd74d65d832137e20e193c960802afba73b5d38sm
1997cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
1998cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
1999cfd74d65d832137e20e193c960802afba73b5d38sm
2000cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2001cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
2002cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2003cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2004cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2005cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2006cfd74d65d832137e20e193c960802afba73b5d38sm        }
2007cfd74d65d832137e20e193c960802afba73b5d38sm
2008cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2009cfd74d65d832137e20e193c960802afba73b5d38sm
2010cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2011cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2012cfd74d65d832137e20e193c960802afba73b5d38sm        }
2013cfd74d65d832137e20e193c960802afba73b5d38sm
2014cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2015cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2016cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2017cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2018cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2019cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2020cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2021cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2022cfd74d65d832137e20e193c960802afba73b5d38sm
2023cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.SKELETON, object, sprite);
2024cfd74d65d832137e20e193c960802afba73b5d38sm
2025cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation attack = sprite.findAnimation(EnemyAnimations.ATTACK.ordinal());
2026cfd74d65d832137e20e193c960802afba73b5d38sm        if (attack != null) {
2027cfd74d65d832137e20e193c960802afba73b5d38sm            patrol.setupAttack(75.0f, attack.getLength(), 2.0f, true);
2028cfd74d65d832137e20e193c960802afba73b5d38sm        }
2029cfd74d65d832137e20e193c960802afba73b5d38sm
2030cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2031cfd74d65d832137e20e193c960802afba73b5d38sm
2032cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2033cfd74d65d832137e20e193c960802afba73b5d38sm    }
2034cfd74d65d832137e20e193c960802afba73b5d38sm
2035cfd74d65d832137e20e193c960802afba73b5d38sm
2036cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKaraguin(float positionX, float positionY, boolean flipHorizontal) {
2037cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2038cfd74d65d832137e20e193c960802afba73b5d38sm
2039cfd74d65d832137e20e193c960802afba73b5d38sm
2040cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2041cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2042cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2043cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
2044cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
2045cfd74d65d832137e20e193c960802afba73b5d38sm
2046cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KARAGUIN);
2047cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2048cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2049cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2050cfd74d65d832137e20e193c960802afba73b5d38sm
2051cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2052cfd74d65d832137e20e193c960802afba73b5d38sm
2053cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2054cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2055cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 16, 16));
2056cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2057cfd74d65d832137e20e193c960802afba73b5d38sm
2058cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2059cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2060cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT));
2061cfd74d65d832137e20e193c960802afba73b5d38sm
2062cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
2063cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2064cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin01),
2065cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2066cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2067cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin02),
2068cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2069cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2070cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_karaguin03),
2071cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2072cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2073cfd74d65d832137e20e193c960802afba73b5d38sm
2074cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2075cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2076cfd74d65d832137e20e193c960802afba73b5d38sm
2077cfd74d65d832137e20e193c960802afba73b5d38sm
2078cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KARAGUIN, staticData);
2079cfd74d65d832137e20e193c960802afba73b5d38sm        }
2080cfd74d65d832137e20e193c960802afba73b5d38sm
2081cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2082cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2083cfd74d65d832137e20e193c960802afba73b5d38sm
2084cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2085cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2086cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2087cfd74d65d832137e20e193c960802afba73b5d38sm
2088cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2089cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
2090cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2091cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2092cfd74d65d832137e20e193c960802afba73b5d38sm
2093cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2094cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2095cfd74d65d832137e20e193c960802afba73b5d38sm
2096cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2097cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2098cfd74d65d832137e20e193c960802afba73b5d38sm
2099cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2100cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2101cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2102cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2103cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2104cfd74d65d832137e20e193c960802afba73b5d38sm        }
2105cfd74d65d832137e20e193c960802afba73b5d38sm
2106cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2107cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2108cfd74d65d832137e20e193c960802afba73b5d38sm
2109cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2110cfd74d65d832137e20e193c960802afba73b5d38sm
2111cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2112cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2113cfd74d65d832137e20e193c960802afba73b5d38sm        }
2114cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2115cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 50.0f * object.facingDirection.x;
2116cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 50.0f * object.facingDirection.x;
2117cfd74d65d832137e20e193c960802afba73b5d38sm
2118cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2119cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2120cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2121cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2122cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2123cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2124cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2125cfd74d65d832137e20e193c960802afba73b5d38sm
2126cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KARAGUIN, object, sprite);
2127cfd74d65d832137e20e193c960802afba73b5d38sm
2128cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2129cfd74d65d832137e20e193c960802afba73b5d38sm
2130cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2131cfd74d65d832137e20e193c960802afba73b5d38sm    }
2132cfd74d65d832137e20e193c960802afba73b5d38sm
2133cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyPinkNamazu(float positionX, float positionY, boolean flipHorizontal) {
2134cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2135cfd74d65d832137e20e193c960802afba73b5d38sm
2136cfd74d65d832137e20e193c960802afba73b5d38sm
2137cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2138cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2139cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
2140cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
2141cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2142cfd74d65d832137e20e193c960802afba73b5d38sm
2143cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.PINK_NAMAZU);
2144cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2145cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 7;
2146cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2147cfd74d65d832137e20e193c960802afba73b5d38sm
2148cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2149cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2150cfd74d65d832137e20e193c960802afba73b5d38sm
2151cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent physics = allocateComponent(SimplePhysicsComponent.class);
2152cfd74d65d832137e20e193c960802afba73b5d38sm
2153cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
2154cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
2155cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(5);
2156cfd74d65d832137e20e193c960802afba73b5d38sm            // circle shape:
2157cfd74d65d832137e20e193c960802afba73b5d38sm            //  __        __3
2158cfd74d65d832137e20e193c960802afba73b5d38sm            // /  \      2/ \4
2159cfd74d65d832137e20e193c960802afba73b5d38sm            // |   |     1|  |5
2160cfd74d65d832137e20e193c960802afba73b5d38sm            /*
2161cfd74d65d832137e20e193c960802afba73b5d38sm                0:12,6:22,52:0.98058067569092,-0.19611613513818
2162cfd74d65d832137e20e193c960802afba73b5d38sm                0:22,52:50,75:-0.62580046626293,0.77998318983495
2163cfd74d65d832137e20e193c960802afba73b5d38sm                0:50,75:81,75:0,1
2164cfd74d65d832137e20e193c960802afba73b5d38sm                0:81,75:104,49:0.74038072228541,0.67218776102228
2165cfd74d65d832137e20e193c960802afba73b5d38sm                0:104,49:104,6:-0.99997086544204,-0.00763336538505
2166cfd74d65d832137e20e193c960802afba73b5d38sm             */
2167cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(12, 3);
2168cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(22, 52);
2169cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.98058067569092f, -0.19611613513818f);
2170cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
2171cfd74d65d832137e20e193c960802afba73b5d38sm
2172cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(22, 52);
2173cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(50, 75);
2174cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(-0.62580046626293f, 0.77998318983495f);
2175cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
2176cfd74d65d832137e20e193c960802afba73b5d38sm
2177cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(50, 75);
2178cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(81, 75);
2179cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(0, 1);
2180cfd74d65d832137e20e193c960802afba73b5d38sm
2181cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(81, 75);
2182cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(104,49);
2183cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0.74038072228541f, 0.67218776102228f);
2184cfd74d65d832137e20e193c960802afba73b5d38sm
2185cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5Start = new Vector2(104,49);
2186cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5End = new Vector2(104, 3);
2187cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface5Normal = new Vector2(1.0f, 0.0f);
2188cfd74d65d832137e20e193c960802afba73b5d38sm
2189cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
2190cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
2191cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
2192cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
2193cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface5Start, surface5End, surface5Normal);
2194cfd74d65d832137e20e193c960802afba73b5d38sm
2195cfd74d65d832137e20e193c960802afba73b5d38sm
2196cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 4);
2197cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2198cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand),
2199cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, null));
2200cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle1 = new AnimationFrame(
2201cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep01),
2202cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2203cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame idle2 = new AnimationFrame(
2204cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_sleep02),
2205cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, null);
2206cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
2207cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle2);
2208cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(idle1);
2209cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2210cfd74d65d832137e20e193c960802afba73b5d38sm
2211cfd74d65d832137e20e193c960802afba73b5d38sm
2212cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation wake = new SpriteAnimation(GenericAnimationComponent.Animation.MOVE, 4);
2213cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame wake1 = new AnimationFrame(
2214cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_eyeopen),
2215cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2216cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame wake2 = new AnimationFrame(
2217cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_stand),
2218cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, null);
2219cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake1);
2220cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake2);
2221cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake1);
2222cfd74d65d832137e20e193c960802afba73b5d38sm            wake.addFrame(wake2);
2223cfd74d65d832137e20e193c960802afba73b5d38sm
2224cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> crushAttackVolume =
2225cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2226cfd74d65d832137e20e193c960802afba73b5d38sm            crushAttackVolume.add(new AABoxCollisionVolume(32, 0, 64, 32, HitType.HIT));
2227cfd74d65d832137e20e193c960802afba73b5d38sm
2228cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1);
2229cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2230cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_pinkdude_jump),
2231cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), crushAttackVolume, null));
2232cfd74d65d832137e20e193c960802afba73b5d38sm
2233cfd74d65d832137e20e193c960802afba73b5d38sm
2234cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2235cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2236cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2237cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
2238cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2239cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(wake);
2240cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
2241cfd74d65d832137e20e193c960802afba73b5d38sm
2242cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.PINK_NAMAZU, staticData);
2243cfd74d65d832137e20e193c960802afba73b5d38sm        }
2244cfd74d65d832137e20e193c960802afba73b5d38sm
2245cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2246cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2247cfd74d65d832137e20e193c960802afba73b5d38sm
2248cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2249cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(100, 75);
2250cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(12, 5);
2251cfd74d65d832137e20e193c960802afba73b5d38sm
2252cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2253cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2254cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2255cfd74d65d832137e20e193c960802afba73b5d38sm
2256cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent animation =
2257cfd74d65d832137e20e193c960802afba73b5d38sm            (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
2258cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2259cfd74d65d832137e20e193c960802afba73b5d38sm
2260cfd74d65d832137e20e193c960802afba73b5d38sm        SleeperComponent sleeper = (SleeperComponent)allocateComponent(SleeperComponent.class);
2261cfd74d65d832137e20e193c960802afba73b5d38sm        sleeper.setAttackImpulse(100.0f, 170.0f);
2262cfd74d65d832137e20e193c960802afba73b5d38sm        sleeper.setSlam(0.3f, 25.0f);
2263cfd74d65d832137e20e193c960802afba73b5d38sm
2264cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2265cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2266cfd74d65d832137e20e193c960802afba73b5d38sm
2267cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2268cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2269cfd74d65d832137e20e193c960802afba73b5d38sm
2270cfd74d65d832137e20e193c960802afba73b5d38sm
2271cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2272cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
2273cfd74d65d832137e20e193c960802afba73b5d38sm
2274cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2275cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2276cfd74d65d832137e20e193c960802afba73b5d38sm        }
2277cfd74d65d832137e20e193c960802afba73b5d38sm
2278cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2279cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2280cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2281cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2282cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2283cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2284cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sleeper);
2285cfd74d65d832137e20e193c960802afba73b5d38sm
2286cfd74d65d832137e20e193c960802afba73b5d38sm
2287cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.PINK_NAMAZU, object, sprite);
2288cfd74d65d832137e20e193c960802afba73b5d38sm
2289cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation wakeUp = sprite.findAnimation(GenericAnimationComponent.Animation.MOVE);
2290cfd74d65d832137e20e193c960802afba73b5d38sm        if (wakeUp != null) {
2291cfd74d65d832137e20e193c960802afba73b5d38sm            sleeper.setWakeUpDuration(wakeUp.getLength() + 1.0f);
2292cfd74d65d832137e20e193c960802afba73b5d38sm        }
2293cfd74d65d832137e20e193c960802afba73b5d38sm
2294cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(GenericAnimationComponent.Animation.IDLE);
2295cfd74d65d832137e20e193c960802afba73b5d38sm
2296cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2297cfd74d65d832137e20e193c960802afba73b5d38sm    }
2298cfd74d65d832137e20e193c960802afba73b5d38sm
2299cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyBat(float positionX, float positionY, boolean flipHorizontal) {
2300cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2301cfd74d65d832137e20e193c960802afba73b5d38sm
2302cfd74d65d832137e20e193c960802afba73b5d38sm
2303cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2304cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2305cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2306cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2307cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
2308cfd74d65d832137e20e193c960802afba73b5d38sm
2309cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BAT);
2310cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2311cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2312cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2313cfd74d65d832137e20e193c960802afba73b5d38sm
2314cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2315cfd74d65d832137e20e193c960802afba73b5d38sm
2316cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2317cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2318cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16));
2319cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2320cfd74d65d832137e20e193c960802afba73b5d38sm
2321cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2322cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2323cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT));
2324cfd74d65d832137e20e193c960802afba73b5d38sm
2325cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
2326cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2327cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat01),
2328cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2329cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2330cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat02),
2331cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2332cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2333cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat03),
2334cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2335cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2336cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_bat04),
2337cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2338cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2339cfd74d65d832137e20e193c960802afba73b5d38sm
2340cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2341cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2342cfd74d65d832137e20e193c960802afba73b5d38sm
2343cfd74d65d832137e20e193c960802afba73b5d38sm
2344cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BAT, staticData);
2345cfd74d65d832137e20e193c960802afba73b5d38sm        }
2346cfd74d65d832137e20e193c960802afba73b5d38sm
2347cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2348cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2349cfd74d65d832137e20e193c960802afba73b5d38sm
2350cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2351cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2352cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2353cfd74d65d832137e20e193c960802afba73b5d38sm
2354cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2355cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(75.0f, 1000.0f);
2356cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2357cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2358cfd74d65d832137e20e193c960802afba73b5d38sm
2359cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2360cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2361cfd74d65d832137e20e193c960802afba73b5d38sm
2362cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2363cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2364cfd74d65d832137e20e193c960802afba73b5d38sm
2365cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2366cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2367cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2368cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2369cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2370cfd74d65d832137e20e193c960802afba73b5d38sm        }
2371cfd74d65d832137e20e193c960802afba73b5d38sm
2372cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2373cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2374cfd74d65d832137e20e193c960802afba73b5d38sm
2375cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2376cfd74d65d832137e20e193c960802afba73b5d38sm
2377cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2378cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2379cfd74d65d832137e20e193c960802afba73b5d38sm        }
2380cfd74d65d832137e20e193c960802afba73b5d38sm
2381cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2382cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 75.0f * object.facingDirection.x;
2383cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 75.0f * object.facingDirection.x;
2384cfd74d65d832137e20e193c960802afba73b5d38sm
2385cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2386cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2387cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2388cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2389cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2390cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2391cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2392cfd74d65d832137e20e193c960802afba73b5d38sm
2393cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BAT, object, sprite);
2394cfd74d65d832137e20e193c960802afba73b5d38sm
2395cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2396cfd74d65d832137e20e193c960802afba73b5d38sm
2397cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2398cfd74d65d832137e20e193c960802afba73b5d38sm    }
2399cfd74d65d832137e20e193c960802afba73b5d38sm
2400cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemySting(float positionX, float positionY, boolean flipHorizontal) {
2401cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2402cfd74d65d832137e20e193c960802afba73b5d38sm
2403cfd74d65d832137e20e193c960802afba73b5d38sm
2404cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2405cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2406cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2407cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2408cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
2409cfd74d65d832137e20e193c960802afba73b5d38sm
2410cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.STING);
2411cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2412cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
2413cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2414cfd74d65d832137e20e193c960802afba73b5d38sm
2415cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2416cfd74d65d832137e20e193c960802afba73b5d38sm
2417cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2418cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2419cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 16));
2420cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.HIT);
2421cfd74d65d832137e20e193c960802afba73b5d38sm
2422cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2423cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2424cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 16, HitType.HIT));
2425cfd74d65d832137e20e193c960802afba73b5d38sm
2426cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
2427cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2428cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting01),
2429cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2430cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2431cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting02),
2432cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2433cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2434cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_sting03),
2435cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2436cfd74d65d832137e20e193c960802afba73b5d38sm
2437cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2438cfd74d65d832137e20e193c960802afba73b5d38sm
2439cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2440cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2441cfd74d65d832137e20e193c960802afba73b5d38sm
2442cfd74d65d832137e20e193c960802afba73b5d38sm
2443cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.STING, staticData);
2444cfd74d65d832137e20e193c960802afba73b5d38sm        }
2445cfd74d65d832137e20e193c960802afba73b5d38sm
2446cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2447cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2448cfd74d65d832137e20e193c960802afba73b5d38sm
2449cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2450cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2451cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2452cfd74d65d832137e20e193c960802afba73b5d38sm
2453cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2454cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(75.0f, 1000.0f);
2455cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setTurnToFacePlayer(false);
2456cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
2457cfd74d65d832137e20e193c960802afba73b5d38sm
2458cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2459cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2460cfd74d65d832137e20e193c960802afba73b5d38sm
2461cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2462cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2463cfd74d65d832137e20e193c960802afba73b5d38sm
2464cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2465cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2466cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2467cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2468cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2469cfd74d65d832137e20e193c960802afba73b5d38sm        }
2470cfd74d65d832137e20e193c960802afba73b5d38sm
2471cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2472cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2473cfd74d65d832137e20e193c960802afba73b5d38sm
2474cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2475cfd74d65d832137e20e193c960802afba73b5d38sm
2476cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2477cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2478cfd74d65d832137e20e193c960802afba73b5d38sm        }
2479cfd74d65d832137e20e193c960802afba73b5d38sm
2480cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK.  These guys originally moved on their own, so let's keep them that way.
2481cfd74d65d832137e20e193c960802afba73b5d38sm        object.getVelocity().x = 25.0f * object.facingDirection.x;
2482cfd74d65d832137e20e193c960802afba73b5d38sm        object.getTargetVelocity().x = 25.0f * object.facingDirection.x;
2483cfd74d65d832137e20e193c960802afba73b5d38sm
2484cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2485cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2486cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2487cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2488cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2489cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2490cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2491cfd74d65d832137e20e193c960802afba73b5d38sm
2492cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.STING, object, sprite);
2493cfd74d65d832137e20e193c960802afba73b5d38sm
2494cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2495cfd74d65d832137e20e193c960802afba73b5d38sm
2496cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2497cfd74d65d832137e20e193c960802afba73b5d38sm    }
2498cfd74d65d832137e20e193c960802afba73b5d38sm
2499cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyOnion(float positionX, float positionY, boolean flipHorizontal) {
2500cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2501cfd74d65d832137e20e193c960802afba73b5d38sm
2502cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2503cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2504cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
2505cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2506cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
2507cfd74d65d832137e20e193c960802afba73b5d38sm
2508cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ONION);
2509cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2510cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
2511cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2512cfd74d65d832137e20e193c960802afba73b5d38sm
2513cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2514cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2515cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2516cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.2f);
2517cfd74d65d832137e20e193c960802afba73b5d38sm
2518cfd74d65d832137e20e193c960802afba73b5d38sm
2519cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
2520cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2521cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2522cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
2523cfd74d65d832137e20e193c960802afba73b5d38sm
2524cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
2525cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2526cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 32, 32, HitType.HIT));
2527cfd74d65d832137e20e193c960802afba73b5d38sm
2528cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 1);
2529cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2530cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion01),
2531cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), basicAttackVolume, basicVulnerabilityVolume));
2532cfd74d65d832137e20e193c960802afba73b5d38sm
2533cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
2534cfd74d65d832137e20e193c960802afba73b5d38sm
2535cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(EnemyAnimations.MOVE.ordinal(), 3);
2536cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2537cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion01),
2538cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2539cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2540cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion02),
2541cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2542cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(new AnimationFrame(
2543cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_onion03),
2544cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, basicVulnerabilityVolume));
2545cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2546cfd74d65d832137e20e193c960802afba73b5d38sm
2547cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2548cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2549cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2550cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2551cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2552cfd74d65d832137e20e193c960802afba73b5d38sm
2553cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ONION, staticData);
2554cfd74d65d832137e20e193c960802afba73b5d38sm
2555cfd74d65d832137e20e193c960802afba73b5d38sm        }
2556cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2557cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_ENEMY);
2558cfd74d65d832137e20e193c960802afba73b5d38sm
2559cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision
2560cfd74d65d832137e20e193c960802afba73b5d38sm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2561cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 48);
2562cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
2563cfd74d65d832137e20e193c960802afba73b5d38sm
2564cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2565cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2566cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2567cfd74d65d832137e20e193c960802afba73b5d38sm
2568cfd74d65d832137e20e193c960802afba73b5d38sm        EnemyAnimationComponent animation
2569cfd74d65d832137e20e193c960802afba73b5d38sm            = (EnemyAnimationComponent)allocateComponent(EnemyAnimationComponent.class);
2570cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2571cfd74d65d832137e20e193c960802afba73b5d38sm
2572cfd74d65d832137e20e193c960802afba73b5d38sm        PatrolComponent patrol = (PatrolComponent)allocateComponent(PatrolComponent.class);
2573cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setMovementSpeed(50.0f, 1000.0f);
2574cfd74d65d832137e20e193c960802afba73b5d38sm
2575cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
2576cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2577cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2578cfd74d65d832137e20e193c960802afba73b5d38sm
2579cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
2580cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2581cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2582cfd74d65d832137e20e193c960802afba73b5d38sm
2583cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
2584cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setVulnerableToDeathTiles(true);
2585cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.SMOKE_POOF);
2586cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
2587cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
2588cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_stomp));
2589cfd74d65d832137e20e193c960802afba73b5d38sm        }
2590cfd74d65d832137e20e193c960802afba73b5d38sm
2591cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2592cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2593cfd74d65d832137e20e193c960802afba73b5d38sm
2594cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2595cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2596cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2597cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2598cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2599cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
2600cfd74d65d832137e20e193c960802afba73b5d38sm
2601cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2602cfd74d65d832137e20e193c960802afba73b5d38sm
2603cfd74d65d832137e20e193c960802afba73b5d38sm
2604cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2605cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2606cfd74d65d832137e20e193c960802afba73b5d38sm        }
2607cfd74d65d832137e20e193c960802afba73b5d38sm
2608cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ONION, object, sprite);
2609cfd74d65d832137e20e193c960802afba73b5d38sm
2610cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2611cfd74d65d832137e20e193c960802afba73b5d38sm
2612cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2613cfd74d65d832137e20e193c960802afba73b5d38sm    }
2614cfd74d65d832137e20e193c960802afba73b5d38sm
2615cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyWanda(float positionX, float positionY, boolean flipHorizontal) {
2616cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2617cfd74d65d832137e20e193c960802afba73b5d38sm
2618cfd74d65d832137e20e193c960802afba73b5d38sm
2619cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
2620cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
2621cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
2622cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
2623cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
2624cfd74d65d832137e20e193c960802afba73b5d38sm
2625cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2626cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2627cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
2628cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2629cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2630cfd74d65d832137e20e193c960802afba73b5d38sm
2631cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA);
2632cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2633cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 9;
2634cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2635cfd74d65d832137e20e193c960802afba73b5d38sm
2636cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2637cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2638cfd74d65d832137e20e193c960802afba73b5d38sm
2639cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2640cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
2641cfd74d65d832137e20e193c960802afba73b5d38sm
2642cfd74d65d832137e20e193c960802afba73b5d38sm
2643cfd74d65d832137e20e193c960802afba73b5d38sm
2644cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2645cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2646cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
2647cfd74d65d832137e20e193c960802afba73b5d38sm
2648cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
2649cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2650cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_stand),
2651cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2652cfd74d65d832137e20e193c960802afba73b5d38sm
2653cfd74d65d832137e20e193c960802afba73b5d38sm
2654cfd74d65d832137e20e193c960802afba73b5d38sm
2655cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
2656cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk01),
2657cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2658cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
2659cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk02),
2660cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2661cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
2662cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk03),
2663cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2664cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
2665cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk04),
2666cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2667cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
2668cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_walk05),
2669cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2670cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 8);
2671cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2672cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2673cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2674cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2675cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2676cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2677cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2678cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2679cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2680cfd74d65d832137e20e193c960802afba73b5d38sm
2681cfd74d65d832137e20e193c960802afba73b5d38sm
2682cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame runFrame4 = new AnimationFrame(
2683cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04),
2684cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2685cfd74d65d832137e20e193c960802afba73b5d38sm
2686cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 9);
2687cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2688cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run01),
2689cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2690cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2691cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run02),
2692cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2693cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2694cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run03),
2695cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2696cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(runFrame4);
2697cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2698cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run05),
2699cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2700cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2701cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run06),
2702cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2703cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2704cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run07),
2705cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2706cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(runFrame4);
2707cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2708cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run08),
2709cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2710cfd74d65d832137e20e193c960802afba73b5d38sm            run.setLoop(true);
2711cfd74d65d832137e20e193c960802afba73b5d38sm
2712cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 4);
2713cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump1 = new AnimationFrame(
2714cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01),
2715cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2716cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump2 = new AnimationFrame(
2717cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_jump01),
2718cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2719cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(new AnimationFrame(
2720cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_run04),
2721cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2722cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(new AnimationFrame(
2723cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_crouch),
2724cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2725cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(jump1);
2726cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(jump2);
2727cfd74d65d832137e20e193c960802afba73b5d38sm
2728cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2);
2729cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump1);
2730cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump2);
2731cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.setLoop(true);
2732cfd74d65d832137e20e193c960802afba73b5d38sm
2733cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(NPCAnimationComponent.SHOOT, 11);
2734cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2735cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01),
2736cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2737cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2738cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02),
2739cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 8), null, basicVulnerabilityVolume));
2740cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2741cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot03),
2742cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2743cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2744cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot04),
2745cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2746cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2747cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot05),
2748cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2749cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2750cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot06),
2751cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2752cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2753cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot07),
2754cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2755cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2756cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot08),
2757cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2758cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2759cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot09),
2760cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
2761cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2762cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot02),
2763cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
2764cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
2765cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_wanda_shoot01),
2766cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume));
2767cfd74d65d832137e20e193c960802afba73b5d38sm
2768cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2769cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2770cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2771cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2772cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2773cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(run);
2774cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpStart);
2775cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpAir);
2776cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
2777cfd74d65d832137e20e193c960802afba73b5d38sm
2778cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.WANDA, staticData);
2779cfd74d65d832137e20e193c960802afba73b5d38sm        }
2780cfd74d65d832137e20e193c960802afba73b5d38sm
2781cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2782cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
2783cfd74d65d832137e20e193c960802afba73b5d38sm
2784cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2785cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 82);
2786cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(20, 5);
2787cfd74d65d832137e20e193c960802afba73b5d38sm
2788cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2789cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2790cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2791cfd74d65d832137e20e193c960802afba73b5d38sm
2792cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
2793cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2794cfd74d65d832137e20e193c960802afba73b5d38sm
2795cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
2796cfd74d65d832137e20e193c960802afba73b5d38sm
2797cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2798cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2799cfd74d65d832137e20e193c960802afba73b5d38sm
2800cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2801cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2802cfd74d65d832137e20e193c960802afba73b5d38sm
2803cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
2804cfd74d65d832137e20e193c960802afba73b5d38sm
2805cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
2806cfd74d65d832137e20e193c960802afba73b5d38sm
2807cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
2808cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
2809cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
2810cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setSetsPerActivation(1);
2811cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(Utils.framesToTime(24, 11));
2812cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.WANDA_SHOT);
2813cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(45);
2814cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(42);
2815cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
2816cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(300.0f);
2817cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_poing));
2818cfd74d65d832137e20e193c960802afba73b5d38sm
2819cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
2820cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
2821cfd74d65d832137e20e193c960802afba73b5d38sm
2822cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
2823cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
2824cfd74d65d832137e20e193c960802afba73b5d38sm        }
2825cfd74d65d832137e20e193c960802afba73b5d38sm
2826cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
2827cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
2828cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
2829cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
2830cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
2831cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
2832cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
2833cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
2834cfd74d65d832137e20e193c960802afba73b5d38sm
2835cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.WANDA, object, sprite);
2836cfd74d65d832137e20e193c960802afba73b5d38sm
2837cfd74d65d832137e20e193c960802afba73b5d38sm
2838cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
2839cfd74d65d832137e20e193c960802afba73b5d38sm
2840cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
2841cfd74d65d832137e20e193c960802afba73b5d38sm    }
2842cfd74d65d832137e20e193c960802afba73b5d38sm
2843cfd74d65d832137e20e193c960802afba73b5d38sm
2844cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKyle(float positionX, float positionY, boolean flipHorizontal) {
2845cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
2846cfd74d65d832137e20e193c960802afba73b5d38sm
2847cfd74d65d832137e20e193c960802afba73b5d38sm
2848cfd74d65d832137e20e193c960802afba73b5d38sm
2849cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
2850cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
2851cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
2852cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
2853cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
2854cfd74d65d832137e20e193c960802afba73b5d38sm
2855cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE);
2856cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
2857cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 9;
2858cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
2859cfd74d65d832137e20e193c960802afba73b5d38sm
2860cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
2861cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
2862cfd74d65d832137e20e193c960802afba73b5d38sm
2863cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
2864cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
2865cfd74d65d832137e20e193c960802afba73b5d38sm
2866cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
2867cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
2868cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
2869cfd74d65d832137e20e193c960802afba73b5d38sm
2870cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
2871cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
2872cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_stand),
2873cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
2874cfd74d65d832137e20e193c960802afba73b5d38sm
2875cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
2876cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk01),
2877cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2878cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
2879cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk02),
2880cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2881cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
2882cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk03),
2883cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2884cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
2885cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk04),
2886cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2887cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
2888cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk05),
2889cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2890cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
2891cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk06),
2892cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2893cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame7 = new AnimationFrame(
2894cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_walk07),
2895cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
2896cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 12);
2897cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2898cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2899cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2900cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
2901cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
2902cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
2903cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
2904cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2905cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
2906cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame7);
2907cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
2908cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
2909cfd74d65d832137e20e193c960802afba73b5d38sm
2910cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
2911cfd74d65d832137e20e193c960802afba73b5d38sm
2912cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame crouch1 = new AnimationFrame(
2913cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch01),
2914cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2915cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame crouch2 = new AnimationFrame(
2916cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_crouch02),
2917cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
2918cfd74d65d832137e20e193c960802afba73b5d38sm
2919cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation runStart = new SpriteAnimation(NPCAnimationComponent.RUN_START, 2);
2920cfd74d65d832137e20e193c960802afba73b5d38sm            runStart.addFrame(crouch1);
2921cfd74d65d832137e20e193c960802afba73b5d38sm            runStart.addFrame(crouch2);
2922cfd74d65d832137e20e193c960802afba73b5d38sm
2923cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
2924cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(2);
2925cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.HIT));
2926cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(32, 32, 50, 32, HitType.COLLECT));
2927cfd74d65d832137e20e193c960802afba73b5d38sm
2928cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation run = new SpriteAnimation(NPCAnimationComponent.RUN, 2);
2929cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2930cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash01),
2931cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume));
2932cfd74d65d832137e20e193c960802afba73b5d38sm            run.addFrame(new AnimationFrame(
2933cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_dash02),
2934cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), attackVolume, basicVulnerabilityVolume));
2935cfd74d65d832137e20e193c960802afba73b5d38sm            run.setLoop(true);
2936cfd74d65d832137e20e193c960802afba73b5d38sm
2937cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpStart = new SpriteAnimation(NPCAnimationComponent.JUMP_START, 2);
2938cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(crouch1);
2939cfd74d65d832137e20e193c960802afba73b5d38sm            jumpStart.addFrame(crouch2);
2940cfd74d65d832137e20e193c960802afba73b5d38sm
2941cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation jumpAir = new SpriteAnimation(NPCAnimationComponent.JUMP_AIR, 2);
2942cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump1 = new AnimationFrame(
2943cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01),
2944cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2945cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame jump2 = new AnimationFrame(
2946cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kyle_jump01),
2947cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
2948cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump1);
2949cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.addFrame(jump2);
2950cfd74d65d832137e20e193c960802afba73b5d38sm            jumpAir.setLoop(true);
2951cfd74d65d832137e20e193c960802afba73b5d38sm
2952cfd74d65d832137e20e193c960802afba73b5d38sm
2953cfd74d65d832137e20e193c960802afba73b5d38sm
2954cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
2955cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
2956cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
2957cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
2958cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
2959cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(runStart);
2960cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(run);
2961cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpStart);
2962cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(jumpAir);
2963cfd74d65d832137e20e193c960802afba73b5d38sm
2964cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KYLE, staticData);
2965cfd74d65d832137e20e193c960802afba73b5d38sm        }
2966cfd74d65d832137e20e193c960802afba73b5d38sm
2967cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
2968cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
2969cfd74d65d832137e20e193c960802afba73b5d38sm
2970cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
2971cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(32, 90);
2972cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(20, 5);
2973cfd74d65d832137e20e193c960802afba73b5d38sm
2974cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
2975cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
2976cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
2977cfd74d65d832137e20e193c960802afba73b5d38sm
2978cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
2979cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
2980cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setStopAtWalls(false); // Kyle can run through walls
2981cfd74d65d832137e20e193c960802afba73b5d38sm
2982cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
2983cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(350.0f, 50.0f, 400.0f, -10.0f, 400.0f);
2984cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KYLE_DEATH, false);
2985cfd74d65d832137e20e193c960802afba73b5d38sm
2986cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
2987cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
2988cfd74d65d832137e20e193c960802afba73b5d38sm
2989cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
2990cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
2991cfd74d65d832137e20e193c960802afba73b5d38sm
2992cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
2993cfd74d65d832137e20e193c960802afba73b5d38sm
2994cfd74d65d832137e20e193c960802afba73b5d38sm        MotionBlurComponent motionBlur = (MotionBlurComponent)allocateComponent(MotionBlurComponent.class);
2995cfd74d65d832137e20e193c960802afba73b5d38sm        motionBlur.setTarget(render);
2996cfd74d65d832137e20e193c960802afba73b5d38sm
2997cfd74d65d832137e20e193c960802afba73b5d38sm        LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class);
2998cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setup((float)(Math.PI * 0.45f), 1000.0f, 0.0f, 0.0f, false);
2999cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setLaunchEffect(GameObjectType.FLASH, 70.0f, 50.0f);
3000cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setLauncherComponent(launcher, HitType.HIT);
3001cfd74d65d832137e20e193c960802afba73b5d38sm
3002cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
3003cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3004cfd74d65d832137e20e193c960802afba73b5d38sm
3005cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3006cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3007cfd74d65d832137e20e193c960802afba73b5d38sm        }
3008cfd74d65d832137e20e193c960802afba73b5d38sm
3009cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3010cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3011cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3012cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3013cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3014cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3015cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3016cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(motionBlur);
3017cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(launcher);
3018cfd74d65d832137e20e193c960802afba73b5d38sm
3019cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KYLE, object, sprite);
3020cfd74d65d832137e20e193c960802afba73b5d38sm
3021cfd74d65d832137e20e193c960802afba73b5d38sm
3022cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3023cfd74d65d832137e20e193c960802afba73b5d38sm
3024cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3025cfd74d65d832137e20e193c960802afba73b5d38sm    }
3026cfd74d65d832137e20e193c960802afba73b5d38sm
3027cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKyleDead(float positionX, float positionY) {
3028cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3029cfd74d65d832137e20e193c960802afba73b5d38sm
3030cfd74d65d832137e20e193c960802afba73b5d38sm
3031cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3032cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3033cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3034cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
3035cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
3036cfd74d65d832137e20e193c960802afba73b5d38sm
3037cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KYLE_DEAD);
3038cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3039cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3040cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3041cfd74d65d832137e20e193c960802afba73b5d38sm
3042cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3043cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3044cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(32, 5, 64, 32, HitType.COLLECT));
3045cfd74d65d832137e20e193c960802afba73b5d38sm
3046cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
3047cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.enemy_kyle_dead),
3048cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3049cfd74d65d832137e20e193c960802afba73b5d38sm
3050cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3051cfd74d65d832137e20e193c960802afba73b5d38sm
3052cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3053cfd74d65d832137e20e193c960802afba73b5d38sm
3054cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3055cfd74d65d832137e20e193c960802afba73b5d38sm
3056cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KYLE_DEAD, staticData);
3057cfd74d65d832137e20e193c960802afba73b5d38sm        }
3058cfd74d65d832137e20e193c960802afba73b5d38sm
3059cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3060cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3061cfd74d65d832137e20e193c960802afba73b5d38sm
3062cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3063cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3064cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3065cfd74d65d832137e20e193c960802afba73b5d38sm
3066cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3067cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3068cfd74d65d832137e20e193c960802afba73b5d38sm
3069cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3070cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3071cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3072cfd74d65d832137e20e193c960802afba73b5d38sm
3073cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3074cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3075cfd74d65d832137e20e193c960802afba73b5d38sm
3076cfd74d65d832137e20e193c960802afba73b5d38sm        // Since this object doesn't have gravity or background collision, adjust down to simulate the position
3077cfd74d65d832137e20e193c960802afba73b5d38sm        // at which a bounding volume would rest.
3078cfd74d65d832137e20e193c960802afba73b5d38sm
3079cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 5.0f;
3080cfd74d65d832137e20e193c960802afba73b5d38sm
3081cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3082cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3083cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3084cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3085cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3086cfd74d65d832137e20e193c960802afba73b5d38sm
3087cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KYLE_DEAD, object, sprite);
3088cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3089cfd74d65d832137e20e193c960802afba73b5d38sm
3090cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3091cfd74d65d832137e20e193c960802afba73b5d38sm    }
3092cfd74d65d832137e20e193c960802afba73b5d38sm
3093cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyAndouDead(float positionX, float positionY) {
3094cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3095cfd74d65d832137e20e193c960802afba73b5d38sm
3096cfd74d65d832137e20e193c960802afba73b5d38sm
3097cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3098cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3099cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3100cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3101cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3102cfd74d65d832137e20e193c960802afba73b5d38sm
3103cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ANDOU_DEAD);
3104cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3105cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3106cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3107cfd74d65d832137e20e193c960802afba73b5d38sm
3108cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
3109cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_explode12),
3110cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3111cfd74d65d832137e20e193c960802afba73b5d38sm
3112cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3113cfd74d65d832137e20e193c960802afba73b5d38sm
3114cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3115cfd74d65d832137e20e193c960802afba73b5d38sm
3116cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3117cfd74d65d832137e20e193c960802afba73b5d38sm
3118cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ANDOU_DEAD, staticData);
3119cfd74d65d832137e20e193c960802afba73b5d38sm        }
3120cfd74d65d832137e20e193c960802afba73b5d38sm
3121cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3122cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3123cfd74d65d832137e20e193c960802afba73b5d38sm
3124cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3125cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3126cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3127cfd74d65d832137e20e193c960802afba73b5d38sm
3128cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent smokeGun
3129cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3130cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setDelayBetweenShots(0.25f);
3131cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
3132cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetX(32);
3133cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setOffsetY(15);
3134cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityX(-150.0f);
3135cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setVelocityY(100.0f);
3136cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun.setThetaError(0.1f);
3137cfd74d65d832137e20e193c960802afba73b5d38sm
3138cfd74d65d832137e20e193c960802afba73b5d38sm	    LaunchProjectileComponent smokeGun2
3139cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3140cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setDelayBetweenShots(0.35f);
3141cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
3142cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetX(16);
3143cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setOffsetY(15);
3144cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityX(-150.0f);
3145cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setVelocityY(150.0f);
3146cfd74d65d832137e20e193c960802afba73b5d38sm	    smokeGun2.setThetaError(0.1f);
3147cfd74d65d832137e20e193c960802afba73b5d38sm
3148cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3149cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3150cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun);
3151cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(smokeGun2);
3152cfd74d65d832137e20e193c960802afba73b5d38sm
3153cfd74d65d832137e20e193c960802afba73b5d38sm        object.facingDirection.x = -1.0f;
3154cfd74d65d832137e20e193c960802afba73b5d38sm
3155cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ANDOU_DEAD, object, sprite);
3156cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3157cfd74d65d832137e20e193c960802afba73b5d38sm
3158cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3159cfd74d65d832137e20e193c960802afba73b5d38sm    }
3160cfd74d65d832137e20e193c960802afba73b5d38sm
3161cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyKabocha(float positionX, float positionY, boolean flipHorizontal) {
3162cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3163cfd74d65d832137e20e193c960802afba73b5d38sm
3164cfd74d65d832137e20e193c960802afba73b5d38sm
3165cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3166cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3167cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
3168cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3169cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3170cfd74d65d832137e20e193c960802afba73b5d38sm
3171cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA);
3172cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3173cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
3174cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3175cfd74d65d832137e20e193c960802afba73b5d38sm
3176cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
3177cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3178cfd74d65d832137e20e193c960802afba73b5d38sm
3179cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3180cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3181cfd74d65d832137e20e193c960802afba73b5d38sm
3182cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3183cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3184cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(20, 5, 26, 80, HitType.COLLECT));
3185cfd74d65d832137e20e193c960802afba73b5d38sm
3186cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3187cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3188cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_stand),
3189cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3190cfd74d65d832137e20e193c960802afba73b5d38sm
3191cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
3192cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk01),
3193cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3194cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
3195cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk02),
3196cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3197cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
3198cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk03),
3199cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3200cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
3201cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk04),
3202cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3203cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
3204cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk05),
3205cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3206cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
3207cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_walk06),
3208cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3209cfd74d65d832137e20e193c960802afba73b5d38sm
3210cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6);
3211cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
3212cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
3213cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
3214cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
3215cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
3216cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
3217cfd74d65d832137e20e193c960802afba73b5d38sm
3218cfd74d65d832137e20e193c960802afba73b5d38sm
3219cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
3220cfd74d65d832137e20e193c960802afba73b5d38sm
3221cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
3222cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3223cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3224cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3225cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
3226cfd74d65d832137e20e193c960802afba73b5d38sm
3227cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KABOCHA, staticData);
3228cfd74d65d832137e20e193c960802afba73b5d38sm        }
3229cfd74d65d832137e20e193c960802afba73b5d38sm
3230cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3231cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3232cfd74d65d832137e20e193c960802afba73b5d38sm
3233cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3234cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(38, 82);
3235cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(16, 5);
3236cfd74d65d832137e20e193c960802afba73b5d38sm
3237cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3238cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3239cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3240cfd74d65d832137e20e193c960802afba73b5d38sm
3241cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3242cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3243cfd74d65d832137e20e193c960802afba73b5d38sm
3244cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3245cfd74d65d832137e20e193c960802afba73b5d38sm
3246cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3247cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3248cfd74d65d832137e20e193c960802afba73b5d38sm
3249cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3250cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3251cfd74d65d832137e20e193c960802afba73b5d38sm
3252cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3253cfd74d65d832137e20e193c960802afba73b5d38sm
3254cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3255cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3256cfd74d65d832137e20e193c960802afba73b5d38sm
3257cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3258cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3259cfd74d65d832137e20e193c960802afba73b5d38sm        }
3260cfd74d65d832137e20e193c960802afba73b5d38sm
3261cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3262cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3263cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3264cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3265cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3266cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3267cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3268cfd74d65d832137e20e193c960802afba73b5d38sm
3269cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KABOCHA, object, sprite);
3270cfd74d65d832137e20e193c960802afba73b5d38sm
3271cfd74d65d832137e20e193c960802afba73b5d38sm
3272cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3273cfd74d65d832137e20e193c960802afba73b5d38sm
3274cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3275cfd74d65d832137e20e193c960802afba73b5d38sm    }
3276cfd74d65d832137e20e193c960802afba73b5d38sm
3277cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnRokudouTerminal(float positionX, float positionY) {
3278cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3279cfd74d65d832137e20e193c960802afba73b5d38sm
3280cfd74d65d832137e20e193c960802afba73b5d38sm
3281cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3282cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3283cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3284cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3285cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3286cfd74d65d832137e20e193c960802afba73b5d38sm
3287cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU_TERMINAL);
3288cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3289cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3290cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3291cfd74d65d832137e20e193c960802afba73b5d38sm
3292cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
3293cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64));
3294cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
3295cfd74d65d832137e20e193c960802afba73b5d38sm
3296cfd74d65d832137e20e193c960802afba73b5d38sm
3297cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3298cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3299cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02),
3300cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3301cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal03),
3302cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3303cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3304cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3305cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal02),
3306cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3307cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal01),
3308cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume);
3309cfd74d65d832137e20e193c960802afba73b5d38sm
3310cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 12);
3311cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3312cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame5);
3313cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame4);
3314cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3315cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3316cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3317cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3318cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3319cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3320cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3321cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3322cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3323cfd74d65d832137e20e193c960802afba73b5d38sm
3324cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3325cfd74d65d832137e20e193c960802afba73b5d38sm
3326cfd74d65d832137e20e193c960802afba73b5d38sm
3327cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3328cfd74d65d832137e20e193c960802afba73b5d38sm
3329cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ROKUDOU_TERMINAL, staticData);
3330cfd74d65d832137e20e193c960802afba73b5d38sm        }
3331cfd74d65d832137e20e193c960802afba73b5d38sm
3332cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3333cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3334cfd74d65d832137e20e193c960802afba73b5d38sm
3335cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3336cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3337cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3338cfd74d65d832137e20e193c960802afba73b5d38sm
3339cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3340cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3341cfd74d65d832137e20e193c960802afba73b5d38sm
3342cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3343cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3344cfd74d65d832137e20e193c960802afba73b5d38sm
3345cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3346cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3347cfd74d65d832137e20e193c960802afba73b5d38sm
3348cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3349cfd74d65d832137e20e193c960802afba73b5d38sm
3350cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3351cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3352cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3353cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3354cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3355cfd74d65d832137e20e193c960802afba73b5d38sm
3356cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ROKUDOU_TERMINAL, object, sprite);
3357cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3358cfd74d65d832137e20e193c960802afba73b5d38sm
3359cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3360cfd74d65d832137e20e193c960802afba73b5d38sm    }
3361cfd74d65d832137e20e193c960802afba73b5d38sm
3362cfd74d65d832137e20e193c960802afba73b5d38sm
3363cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnKabochaTerminal(float positionX, float positionY) {
3364cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3365cfd74d65d832137e20e193c960802afba73b5d38sm
3366cfd74d65d832137e20e193c960802afba73b5d38sm
3367cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3368cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3369cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3370cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3371cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3372cfd74d65d832137e20e193c960802afba73b5d38sm
3373cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.KABOCHA_TERMINAL);
3374cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3375cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
3376cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3377cfd74d65d832137e20e193c960802afba73b5d38sm
3378cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
3379cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 64, 64));
3380cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
3381cfd74d65d832137e20e193c960802afba73b5d38sm
3382cfd74d65d832137e20e193c960802afba73b5d38sm
3383cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3384cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3385cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02),
3386cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3387cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha03),
3388cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
3389cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3390cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3391cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame5 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha02),
3392cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
3393cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame6 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_terminal_kabocha01),
3394cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume);
3395cfd74d65d832137e20e193c960802afba73b5d38sm
3396cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 12);
3397cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3398cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame5);
3399cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame4);
3400cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3401cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3402cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3403cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3404cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame3);
3405cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3406cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
3407cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
3408cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame6);
3409cfd74d65d832137e20e193c960802afba73b5d38sm
3410cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3411cfd74d65d832137e20e193c960802afba73b5d38sm
3412cfd74d65d832137e20e193c960802afba73b5d38sm
3413cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3414cfd74d65d832137e20e193c960802afba73b5d38sm
3415cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.KABOCHA_TERMINAL, staticData);
3416cfd74d65d832137e20e193c960802afba73b5d38sm        }
3417cfd74d65d832137e20e193c960802afba73b5d38sm
3418cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3419cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
3420cfd74d65d832137e20e193c960802afba73b5d38sm
3421cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3422cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3423cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3424cfd74d65d832137e20e193c960802afba73b5d38sm
3425cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3426cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3427cfd74d65d832137e20e193c960802afba73b5d38sm
3428cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3429cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
3430cfd74d65d832137e20e193c960802afba73b5d38sm
3431cfd74d65d832137e20e193c960802afba73b5d38sm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
3432cfd74d65d832137e20e193c960802afba73b5d38sm        dialogSelect.setHitReact(hitReact);
3433cfd74d65d832137e20e193c960802afba73b5d38sm
3434cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3435cfd74d65d832137e20e193c960802afba73b5d38sm
3436cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dialogSelect);
3437cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3438cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3439cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3440cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3441cfd74d65d832137e20e193c960802afba73b5d38sm
3442cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.KABOCHA_TERMINAL, object, sprite);
3443cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3444cfd74d65d832137e20e193c960802afba73b5d38sm
3445cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3446cfd74d65d832137e20e193c960802afba73b5d38sm    }
3447cfd74d65d832137e20e193c960802afba73b5d38sm
3448cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyEvilKabocha(float positionX, float positionY, boolean flipHorizontal) {
3449cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3450cfd74d65d832137e20e193c960802afba73b5d38sm
3451cfd74d65d832137e20e193c960802afba73b5d38sm
3452cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3453cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3454cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
3455cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
3456cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3457cfd74d65d832137e20e193c960802afba73b5d38sm
3458cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EVIL_KABOCHA);
3459cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3460cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 8;
3461cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3462cfd74d65d832137e20e193c960802afba73b5d38sm
3463cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
3464cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3465cfd74d65d832137e20e193c960802afba73b5d38sm
3466cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3467cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3468cfd74d65d832137e20e193c960802afba73b5d38sm
3469cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3470cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3471cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(52, 5, 26, 80, HitType.HIT));
3472cfd74d65d832137e20e193c960802afba73b5d38sm
3473cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3474cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3475cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand),
3476cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3477cfd74d65d832137e20e193c960802afba73b5d38sm
3478cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame1 = new AnimationFrame(
3479cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk01),
3480cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3481cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame2 = new AnimationFrame(
3482cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk02),
3483cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3484cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame3 = new AnimationFrame(
3485cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk03),
3486cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3487cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame4 = new AnimationFrame(
3488cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk04),
3489cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3490cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame5 = new AnimationFrame(
3491cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk05),
3492cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3493cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame walkFrame6 = new AnimationFrame(
3494cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_walk06),
3495cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 3), null, basicVulnerabilityVolume);
3496cfd74d65d832137e20e193c960802afba73b5d38sm
3497cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation walk = new SpriteAnimation(NPCAnimationComponent.WALK, 6);
3498cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame1);
3499cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame2);
3500cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame3);
3501cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame4);
3502cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame5);
3503cfd74d65d832137e20e193c960802afba73b5d38sm            walk.addFrame(walkFrame6);
3504cfd74d65d832137e20e193c960802afba73b5d38sm
3505cfd74d65d832137e20e193c960802afba73b5d38sm            walk.setLoop(true);
3506cfd74d65d832137e20e193c960802afba73b5d38sm
3507cfd74d65d832137e20e193c960802afba73b5d38sm
3508cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1);
3509cfd74d65d832137e20e193c960802afba73b5d38sm            surprised.addFrame(new AnimationFrame(
3510cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_surprised),
3511cfd74d65d832137e20e193c960802afba73b5d38sm                    4.0f, null, null));
3512cfd74d65d832137e20e193c960802afba73b5d38sm
3513cfd74d65d832137e20e193c960802afba73b5d38sm
3514cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 2);
3515cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(new AnimationFrame(
3516cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit01),
3517cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
3518cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(new AnimationFrame(
3519cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_hit02),
3520cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 10), null, null));
3521cfd74d65d832137e20e193c960802afba73b5d38sm
3522cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5);
3523cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3524cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die01),
3525cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3526cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3527cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_stand),
3528cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3529cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3530cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die02),
3531cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3532cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3533cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die03),
3534cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3535cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3536cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_kabocha_evil_die04),
3537cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3538cfd74d65d832137e20e193c960802afba73b5d38sm
3539cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
3540cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3541cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3542cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3543cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(walk);
3544cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(surprised);
3545cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hit);
3546cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(die);
3547cfd74d65d832137e20e193c960802afba73b5d38sm
3548cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EVIL_KABOCHA, staticData);
3549cfd74d65d832137e20e193c960802afba73b5d38sm        }
3550cfd74d65d832137e20e193c960802afba73b5d38sm
3551cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3552cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3553cfd74d65d832137e20e193c960802afba73b5d38sm
3554cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3555cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(38, 82);
3556cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(45, 5);
3557cfd74d65d832137e20e193c960802afba73b5d38sm
3558cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3559cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3560cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3561cfd74d65d832137e20e193c960802afba73b5d38sm
3562cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3563cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3564cfd74d65d832137e20e193c960802afba73b5d38sm
3565cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
3566cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
3567cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
3568cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannel(surpriseChannel);
3569cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannelTrigger(NPCAnimationComponent.SURPRISED);
3570cfd74d65d832137e20e193c960802afba73b5d38sm
3571cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3572cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(50.0f, 50.0f, 0.0f, -10.0f, 200.0f);
3573cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setReactToHits(true);
3574cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.ROKUDOU_ENDING, true);
3575cfd74d65d832137e20e193c960802afba73b5d38sm
3576cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3577cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3578cfd74d65d832137e20e193c960802afba73b5d38sm
3579cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3580cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3581cfd74d65d832137e20e193c960802afba73b5d38sm
3582cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
3583cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
3584cfd74d65d832137e20e193c960802afba73b5d38sm        	hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_kabocha_hit));
3585cfd74d65d832137e20e193c960802afba73b5d38sm        }
3586cfd74d65d832137e20e193c960802afba73b5d38sm
3587cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3588cfd74d65d832137e20e193c960802afba73b5d38sm
3589cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3590cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 3;
3591cfd74d65d832137e20e193c960802afba73b5d38sm
3592cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3593cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3594cfd74d65d832137e20e193c960802afba73b5d38sm        }
3595cfd74d65d832137e20e193c960802afba73b5d38sm
3596cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3597cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3598cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3599cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3600cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3601cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3602cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3603cfd74d65d832137e20e193c960802afba73b5d38sm
3604cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EVIL_KABOCHA, object, sprite);
3605cfd74d65d832137e20e193c960802afba73b5d38sm
3606cfd74d65d832137e20e193c960802afba73b5d38sm
3607cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3608cfd74d65d832137e20e193c960802afba73b5d38sm
3609cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3610cfd74d65d832137e20e193c960802afba73b5d38sm    }
3611cfd74d65d832137e20e193c960802afba73b5d38sm
3612cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnemyRokudou(float positionX, float positionY, boolean flipHorizontal) {
3613cfd74d65d832137e20e193c960802afba73b5d38sm    	TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3614cfd74d65d832137e20e193c960802afba73b5d38sm
3615cfd74d65d832137e20e193c960802afba73b5d38sm    	// Make sure related textures are loaded.
3616cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball01);
3617cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball02);
3618cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball03);
3619cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.energy_ball04);
3620cfd74d65d832137e20e193c960802afba73b5d38sm
3621cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet01);
3622cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet02);
3623cfd74d65d832137e20e193c960802afba73b5d38sm
3624cfd74d65d832137e20e193c960802afba73b5d38sm
3625cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3626cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3627cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mNormalActivationRadius;
3628cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 128;
3629cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
3630cfd74d65d832137e20e193c960802afba73b5d38sm
3631cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ROKUDOU);
3632cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3633cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 8;
3634cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3635cfd74d65d832137e20e193c960802afba73b5d38sm
3636cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3637cfd74d65d832137e20e193c960802afba73b5d38sm
3638cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3639cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.0f);
3640cfd74d65d832137e20e193c960802afba73b5d38sm
3641cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
3642cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3643cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(45, 23, 42, 75, HitType.HIT));
3644cfd74d65d832137e20e193c960802afba73b5d38sm
3645cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(NPCAnimationComponent.IDLE, 1);
3646cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3647cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand),
3648cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
3649cfd74d65d832137e20e193c960802afba73b5d38sm
3650cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation fly = new SpriteAnimation(NPCAnimationComponent.WALK, 2);
3651cfd74d65d832137e20e193c960802afba73b5d38sm            fly.addFrame(new AnimationFrame(
3652cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly01),
3653cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
3654cfd74d65d832137e20e193c960802afba73b5d38sm            fly.addFrame(new AnimationFrame(
3655cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_fly02),
3656cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
3657cfd74d65d832137e20e193c960802afba73b5d38sm            fly.setLoop(true);
3658cfd74d65d832137e20e193c960802afba73b5d38sm
3659cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation shoot = new SpriteAnimation(NPCAnimationComponent.SHOOT, 2);
3660cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(new AnimationFrame(
3661cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot01),
3662cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
3663cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(new AnimationFrame(
3664cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_shoot02),
3665cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
3666cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.setLoop(true);
3667cfd74d65d832137e20e193c960802afba73b5d38sm
3668cfd74d65d832137e20e193c960802afba73b5d38sm
3669cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation surprised = new SpriteAnimation(NPCAnimationComponent.SURPRISED, 1);
3670cfd74d65d832137e20e193c960802afba73b5d38sm            surprised.addFrame(new AnimationFrame(
3671cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_surprise),
3672cfd74d65d832137e20e193c960802afba73b5d38sm                    4.0f, null, null));
3673cfd74d65d832137e20e193c960802afba73b5d38sm
3674cfd74d65d832137e20e193c960802afba73b5d38sm
3675cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation hit = new SpriteAnimation(NPCAnimationComponent.TAKE_HIT, 7);
3676cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame1 = new AnimationFrame(
3677cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit01),
3678cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null);
3679cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame2 = new AnimationFrame(
3680cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit02),
3681cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3682cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame hitFrame3 = new AnimationFrame(
3683cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_hit03),
3684cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
3685cfd74d65d832137e20e193c960802afba73b5d38sm
3686cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame1);
3687cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3688cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3689cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3690cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3691cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame2);
3692cfd74d65d832137e20e193c960802afba73b5d38sm            hit.addFrame(hitFrame3);
3693cfd74d65d832137e20e193c960802afba73b5d38sm
3694cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation die = new SpriteAnimation(NPCAnimationComponent.DEATH, 5);
3695cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3696cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_stand),
3697cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3698cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3699cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die01),
3700cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, null));
3701cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3702cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die02),
3703cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 4), null, null));
3704cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3705cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die03),
3706cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3707cfd74d65d832137e20e193c960802afba73b5d38sm            die.addFrame(new AnimationFrame(
3708cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_rokudou_fight_die04),
3709cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 6), null, null));
3710cfd74d65d832137e20e193c960802afba73b5d38sm
3711cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3712cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3713cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3714cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(fly);
3715cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(surprised);
3716cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(hit);
3717cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(die);
3718cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(shoot);
3719cfd74d65d832137e20e193c960802afba73b5d38sm
3720cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ROKUDOU, staticData);
3721cfd74d65d832137e20e193c960802afba73b5d38sm        }
3722cfd74d65d832137e20e193c960802afba73b5d38sm
3723cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3724cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.NPC);
3725cfd74d65d832137e20e193c960802afba73b5d38sm
3726cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3727cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(45, 75);
3728cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(45, 23);
3729cfd74d65d832137e20e193c960802afba73b5d38sm
3730cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3731cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
3732cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3733cfd74d65d832137e20e193c960802afba73b5d38sm
3734cfd74d65d832137e20e193c960802afba73b5d38sm
3735cfd74d65d832137e20e193c960802afba73b5d38sm
3736cfd74d65d832137e20e193c960802afba73b5d38sm        NPCAnimationComponent animation = (NPCAnimationComponent)allocateComponent(NPCAnimationComponent.class);
3737cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
3738cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setFlying(true);
3739cfd74d65d832137e20e193c960802afba73b5d38sm
3740cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
3741cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
3742cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
3743cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannel(surpriseChannel);
3744cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setChannelTrigger(NPCAnimationComponent.SURPRISED);
3745cfd74d65d832137e20e193c960802afba73b5d38sm
3746cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
3747cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setSpeeds(500.0f, 100.0f, 100.0f, -100.0f, 400.0f);
3748cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setFlying(true);
3749cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setReactToHits(true);
3750cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.KABOCHA_ENDING, true);
3751cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setPauseOnAttack(false);
3752cfd74d65d832137e20e193c960802afba73b5d38sm
3753cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3754cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
3755cfd74d65d832137e20e193c960802afba73b5d38sm
3756cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3757cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
3758cfd74d65d832137e20e193c960802afba73b5d38sm
3759cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
3760cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
3761cfd74d65d832137e20e193c960802afba73b5d38sm        	hitReact.setTakeHitSound(HitType.HIT, sound.load(R.raw.sound_rokudou_hit));
3762cfd74d65d832137e20e193c960802afba73b5d38sm        }
3763cfd74d65d832137e20e193c960802afba73b5d38sm
3764cfd74d65d832137e20e193c960802afba73b5d38sm        patrol.setHitReactionComponent(hitReact);
3765cfd74d65d832137e20e193c960802afba73b5d38sm
3766cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent deathSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
3767cfd74d65d832137e20e193c960802afba73b5d38sm        deathSwap.addSwapInComponent(allocateComponent(GravityComponent.class));
3768cfd74d65d832137e20e193c960802afba73b5d38sm        deathSwap.setSwapAction(ActionType.DEATH);
3769cfd74d65d832137e20e193c960802afba73b5d38sm
3770cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
3771cfd74d65d832137e20e193c960802afba73b5d38sm	        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3772cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setShotsPerSet(1);
3773cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setSetsPerActivation(-1);
3774cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setDelayBetweenSets(1.5f);
3775cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setObjectTypeToSpawn(GameObjectType.ENERGY_BALL);
3776cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setOffsetX(75);
3777cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setOffsetY(42);
3778cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setRequiredAction(GameObject.ActionType.ATTACK);
3779cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setVelocityX(300.0f);
3780cfd74d65d832137e20e193c960802afba73b5d38sm	    gun.setVelocityY(-300.0f);
3781cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_poing));
3782cfd74d65d832137e20e193c960802afba73b5d38sm
3783cfd74d65d832137e20e193c960802afba73b5d38sm
3784cfd74d65d832137e20e193c960802afba73b5d38sm	    LaunchProjectileComponent gun2
3785cfd74d65d832137e20e193c960802afba73b5d38sm        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
3786cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setShotsPerSet(5);
3787cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setDelayBetweenShots(0.1f);
3788cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setSetsPerActivation(-1);
3789cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setDelayBetweenSets(2.5f);
3790cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET);
3791cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setOffsetX(75);
3792cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setOffsetY(42);
3793cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setRequiredAction(GameObject.ActionType.ATTACK);
3794cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setVelocityX(300.0f);
3795cfd74d65d832137e20e193c960802afba73b5d38sm	    gun2.setVelocityY(-300.0f);
3796cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_gun));
3797cfd74d65d832137e20e193c960802afba73b5d38sm
3798cfd74d65d832137e20e193c960802afba73b5d38sm
3799cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
3800cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 3;
3801cfd74d65d832137e20e193c960802afba73b5d38sm
3802cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
3803cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
3804cfd74d65d832137e20e193c960802afba73b5d38sm        }
3805cfd74d65d832137e20e193c960802afba73b5d38sm
3806cfd74d65d832137e20e193c960802afba73b5d38sm        // HACK! Since there's no gravity and this is a big character, align him to the floor
3807cfd74d65d832137e20e193c960802afba73b5d38sm        // manually.
3808cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().y -= 23;
3809cfd74d65d832137e20e193c960802afba73b5d38sm
3810cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3811cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3812cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3813cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
3814cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
3815cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
3816cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3817cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(deathSwap);
3818cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
3819cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun2);
3820cfd74d65d832137e20e193c960802afba73b5d38sm
3821cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ROKUDOU, object, sprite);
3822cfd74d65d832137e20e193c960802afba73b5d38sm
3823cfd74d65d832137e20e193c960802afba73b5d38sm
3824cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3825cfd74d65d832137e20e193c960802afba73b5d38sm
3826cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3827cfd74d65d832137e20e193c960802afba73b5d38sm    }
3828cfd74d65d832137e20e193c960802afba73b5d38sm
3829cfd74d65d832137e20e193c960802afba73b5d38sm
3830cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnPlayerGhost(float positionX, float positionY, GameObject player, float lifeTime) {
3831cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
3832cfd74d65d832137e20e193c960802afba73b5d38sm
3833cfd74d65d832137e20e193c960802afba73b5d38sm
3834cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3835cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3836cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
3837cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
3838cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
3839cfd74d65d832137e20e193c960802afba73b5d38sm
3840cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST);
3841cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3842cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
3843cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3844cfd74d65d832137e20e193c960802afba73b5d38sm
3845cfd74d65d832137e20e193c960802afba73b5d38sm            //GravityComponent gravity = (GravityComponent)allocateComponent(GravityComponent.class);
3846cfd74d65d832137e20e193c960802afba73b5d38sm            //gravity.setGravityMultiplier(0.1f);
3847cfd74d65d832137e20e193c960802afba73b5d38sm
3848cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3849cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
3850cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.6f);
3851cfd74d65d832137e20e193c960802afba73b5d38sm
3852cfd74d65d832137e20e193c960802afba73b5d38sm            GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
3853cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setMovementSpeed(2000.0f);
38549d4cc2572d37983607df38b0f4216ed76ac51814sm            ghost.setAcceleration(700.0f);	//300
3855cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setUseOrientationSensor(true);
3856cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setKillOnRelease(true);
3857cfd74d65d832137e20e193c960802afba73b5d38sm
3858cfd74d65d832137e20e193c960802afba73b5d38sm            SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
3859cfd74d65d832137e20e193c960802afba73b5d38sm            if (sound != null) {
3860cfd74d65d832137e20e193c960802afba73b5d38sm            	ghost.setAmbientSound(sound.load(R.raw.sound_possession));
3861cfd74d65d832137e20e193c960802afba73b5d38sm            }
3862cfd74d65d832137e20e193c960802afba73b5d38sm
3863cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
3864cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3865cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.POSSESS));
3866cfd74d65d832137e20e193c960802afba73b5d38sm
3867cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
3868cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3869cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball01),
3870cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3871cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3872cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball02),
3873cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3874cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3875cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball03),
3876cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3877cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3878cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_energyball04),
3879cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3880cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3881cfd74d65d832137e20e193c960802afba73b5d38sm
3882cfd74d65d832137e20e193c960802afba73b5d38sm            //staticData.add(gravity);
3883cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3884cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
3885cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(ghost);
3886cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3887cfd74d65d832137e20e193c960802afba73b5d38sm
3888cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GHOST, staticData);
3889cfd74d65d832137e20e193c960802afba73b5d38sm        }
3890cfd74d65d832137e20e193c960802afba73b5d38sm
3891cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3892cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
3893cfd74d65d832137e20e193c960802afba73b5d38sm
3894cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
3895cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setSize(64, 64);
3896cfd74d65d832137e20e193c960802afba73b5d38sm		bgcollision.setOffset(0, 0);
3897cfd74d65d832137e20e193c960802afba73b5d38sm
3898cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3899cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
3900cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3901cfd74d65d832137e20e193c960802afba73b5d38sm
3902cfd74d65d832137e20e193c960802afba73b5d38sm
3903cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3904cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3905cfd74d65d832137e20e193c960802afba73b5d38sm
3906cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3907cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
3908cfd74d65d832137e20e193c960802afba73b5d38sm
3909cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3910cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
3911cfd74d65d832137e20e193c960802afba73b5d38sm        // when the ghost dies it either releases itself or passes control to another object, so we
3912cfd74d65d832137e20e193c960802afba73b5d38sm        // don't want control to return to the player.
3913cfd74d65d832137e20e193c960802afba73b5d38sm
3914cfd74d65d832137e20e193c960802afba73b5d38sm        life.setReleaseGhostOnDeath(false);
3915cfd74d65d832137e20e193c960802afba73b5d38sm
3916cfd74d65d832137e20e193c960802afba73b5d38sm
3917cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
3918cfd74d65d832137e20e193c960802afba73b5d38sm
3919cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
3920cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
3921cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
3922cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
3923cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
3924cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
3925cfd74d65d832137e20e193c960802afba73b5d38sm
3926cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GHOST, object, sprite);
3927cfd74d65d832137e20e193c960802afba73b5d38sm
3928cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
3929cfd74d65d832137e20e193c960802afba73b5d38sm
3930cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent ghost = object.findByClass(GhostComponent.class);
3931cfd74d65d832137e20e193c960802afba73b5d38sm        if (ghost != null) {
3932cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setLifeTime(lifeTime);
3933cfd74d65d832137e20e193c960802afba73b5d38sm        }
3934cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
3935cfd74d65d832137e20e193c960802afba73b5d38sm
3936cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
3937cfd74d65d832137e20e193c960802afba73b5d38sm    }
3938cfd74d65d832137e20e193c960802afba73b5d38sm
3939cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEnergyBall(float positionX, float positionY, boolean flipHorizontal) {
3940cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
3941cfd74d65d832137e20e193c960802afba73b5d38sm
3942cfd74d65d832137e20e193c960802afba73b5d38sm
3943cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
3944cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
3945cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
3946cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
3947cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
3948cfd74d65d832137e20e193c960802afba73b5d38sm
3949cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.ENERGY_BALL);
3950cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
3951cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
3952cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
3953cfd74d65d832137e20e193c960802afba73b5d38sm
3954cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
3955cfd74d65d832137e20e193c960802afba73b5d38sm
3956cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
3957cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
3958cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
3959cfd74d65d832137e20e193c960802afba73b5d38sm
3960cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
3961cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3962cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball01),
3963cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3964cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3965cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball02),
3966cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3967cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3968cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball03),
3969cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3970cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
3971cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball04),
3972cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
3973cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
3974cfd74d65d832137e20e193c960802afba73b5d38sm
3975cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
3976cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
3977cfd74d65d832137e20e193c960802afba73b5d38sm
3978cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.ENERGY_BALL, staticData);
3979cfd74d65d832137e20e193c960802afba73b5d38sm
3980cfd74d65d832137e20e193c960802afba73b5d38sm        }
3981cfd74d65d832137e20e193c960802afba73b5d38sm
3982cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
3983cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
3984cfd74d65d832137e20e193c960802afba73b5d38sm
3985cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
3986cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(5.0f);
3987cfd74d65d832137e20e193c960802afba73b5d38sm
3988cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
3989cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
3990cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
3991cfd74d65d832137e20e193c960802afba73b5d38sm
3992cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
3993cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
3994cfd74d65d832137e20e193c960802afba73b5d38sm
3995cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
3996cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
3997cfd74d65d832137e20e193c960802afba73b5d38sm
3998cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
3999cfd74d65d832137e20e193c960802afba73b5d38sm
4000cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4001cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4002cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4003cfd74d65d832137e20e193c960802afba73b5d38sm
4004cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4005cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4006cfd74d65d832137e20e193c960802afba73b5d38sm        }
4007cfd74d65d832137e20e193c960802afba73b5d38sm
4008cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4009cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4010cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4011cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4012cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4013cfd74d65d832137e20e193c960802afba73b5d38sm
4014cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.ENERGY_BALL, object, sprite);
4015cfd74d65d832137e20e193c960802afba73b5d38sm
4016cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4017cfd74d65d832137e20e193c960802afba73b5d38sm
4018cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4019cfd74d65d832137e20e193c960802afba73b5d38sm    }
4020cfd74d65d832137e20e193c960802afba73b5d38sm
4021cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnWandaShot(float positionX, float positionY, boolean flipHorizontal) {
4022cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4023cfd74d65d832137e20e193c960802afba73b5d38sm
4024cfd74d65d832137e20e193c960802afba73b5d38sm
4025cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4026cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4027cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4028cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4029cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4030cfd74d65d832137e20e193c960802afba73b5d38sm
4031cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.WANDA_SHOT);
4032cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4033cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4034cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4035cfd74d65d832137e20e193c960802afba73b5d38sm
4036cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4037cfd74d65d832137e20e193c960802afba73b5d38sm
4038cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4039cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4040cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
4041cfd74d65d832137e20e193c960802afba73b5d38sm
4042cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 4);
4043cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4044cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball01),
4045cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4046cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4047cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball02),
4048cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4049cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4050cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball03),
4051cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4052cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4053cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.energy_ball04),
4054cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4055cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4056cfd74d65d832137e20e193c960802afba73b5d38sm
4057cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4058cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4059cfd74d65d832137e20e193c960802afba73b5d38sm
4060cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.WANDA_SHOT, staticData);
4061cfd74d65d832137e20e193c960802afba73b5d38sm
4062cfd74d65d832137e20e193c960802afba73b5d38sm        }
4063cfd74d65d832137e20e193c960802afba73b5d38sm
4064cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4065cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4066cfd74d65d832137e20e193c960802afba73b5d38sm
4067cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4068cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(5.0f);
4069cfd74d65d832137e20e193c960802afba73b5d38sm
4070cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4071cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4072cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4073cfd74d65d832137e20e193c960802afba73b5d38sm
4074cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4075cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4076cfd74d65d832137e20e193c960802afba73b5d38sm
4077cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4078cfd74d65d832137e20e193c960802afba73b5d38sm        //hitReact.setDieOnAttack(true);
4079cfd74d65d832137e20e193c960802afba73b5d38sm
4080cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4081cfd74d65d832137e20e193c960802afba73b5d38sm
4082cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4083cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4084cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4085cfd74d65d832137e20e193c960802afba73b5d38sm
4086cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4087cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4088cfd74d65d832137e20e193c960802afba73b5d38sm        }
4089cfd74d65d832137e20e193c960802afba73b5d38sm
4090cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4091cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4092cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4093cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4094cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4095cfd74d65d832137e20e193c960802afba73b5d38sm
4096cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.WANDA_SHOT, object, sprite);
4097cfd74d65d832137e20e193c960802afba73b5d38sm
4098cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4099cfd74d65d832137e20e193c960802afba73b5d38sm
4100cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4101cfd74d65d832137e20e193c960802afba73b5d38sm    }
4102cfd74d65d832137e20e193c960802afba73b5d38sm
4103cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnCannonBall(float positionX, float positionY, boolean flipHorizontal) {
4104cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4105cfd74d65d832137e20e193c960802afba73b5d38sm
4106cfd74d65d832137e20e193c960802afba73b5d38sm
4107cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4108cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4109cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4110cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4111cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4112cfd74d65d832137e20e193c960802afba73b5d38sm
4113cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON_BALL);
4114cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4115cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4116cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4117cfd74d65d832137e20e193c960802afba73b5d38sm
4118cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4119cfd74d65d832137e20e193c960802afba73b5d38sm
4120cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4121cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4122cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 16, 16, HitType.HIT));
4123cfd74d65d832137e20e193c960802afba73b5d38sm
4124cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
4125cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.snail_bomb),
4126cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4127cfd74d65d832137e20e193c960802afba73b5d38sm
4128cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4129cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4130cfd74d65d832137e20e193c960802afba73b5d38sm
4131cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CANNON_BALL, staticData);
4132cfd74d65d832137e20e193c960802afba73b5d38sm        }
4133cfd74d65d832137e20e193c960802afba73b5d38sm
4134cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4135cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4136cfd74d65d832137e20e193c960802afba73b5d38sm
4137cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4138cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4139cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setDieOnHitBackground(true);
4140cfd74d65d832137e20e193c960802afba73b5d38sm
4141cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4142cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4143cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4144cfd74d65d832137e20e193c960802afba73b5d38sm
4145cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4146cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4147cfd74d65d832137e20e193c960802afba73b5d38sm
4148cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4149cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
4150cfd74d65d832137e20e193c960802afba73b5d38sm
4151cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4152cfd74d65d832137e20e193c960802afba73b5d38sm
4153cfd74d65d832137e20e193c960802afba73b5d38sm        SimpleCollisionComponent collision = (SimpleCollisionComponent)allocateComponent(SimpleCollisionComponent.class);
4154cfd74d65d832137e20e193c960802afba73b5d38sm
4155cfd74d65d832137e20e193c960802afba73b5d38sm
4156cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4157cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4158cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4159cfd74d65d832137e20e193c960802afba73b5d38sm
4160cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4161cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4162cfd74d65d832137e20e193c960802afba73b5d38sm        }
4163cfd74d65d832137e20e193c960802afba73b5d38sm
4164cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4165cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4166cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4167cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4168cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4169cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
4170cfd74d65d832137e20e193c960802afba73b5d38sm
4171cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CANNON_BALL, object, sprite);
4172cfd74d65d832137e20e193c960802afba73b5d38sm
4173cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4174cfd74d65d832137e20e193c960802afba73b5d38sm
4175cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4176cfd74d65d832137e20e193c960802afba73b5d38sm    }
4177cfd74d65d832137e20e193c960802afba73b5d38sm
4178cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnTurretBullet(float positionX, float positionY, boolean flipHorizontal) {
4179cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4180cfd74d65d832137e20e193c960802afba73b5d38sm
4181cfd74d65d832137e20e193c960802afba73b5d38sm
4182cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4183cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4184cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4185cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
4186cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
4187cfd74d65d832137e20e193c960802afba73b5d38sm
4188cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET_BULLET);
4189cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4190cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4191cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4192cfd74d65d832137e20e193c960802afba73b5d38sm
4193cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4194cfd74d65d832137e20e193c960802afba73b5d38sm
4195cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
4196cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4197cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(8, 8, 8, HitType.HIT));
4198cfd74d65d832137e20e193c960802afba73b5d38sm
4199cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 2);
4200cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet01),
4201cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4202cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.effect_bullet02),
4203cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
4204cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4205cfd74d65d832137e20e193c960802afba73b5d38sm
4206cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4207cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4208cfd74d65d832137e20e193c960802afba73b5d38sm
4209cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.TURRET_BULLET, staticData);
4210cfd74d65d832137e20e193c960802afba73b5d38sm        }
4211cfd74d65d832137e20e193c960802afba73b5d38sm
4212cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4213cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4214cfd74d65d832137e20e193c960802afba73b5d38sm
4215cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4216cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4217cfd74d65d832137e20e193c960802afba73b5d38sm
4218cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4219cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4220cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4221cfd74d65d832137e20e193c960802afba73b5d38sm
4222cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4223cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4224cfd74d65d832137e20e193c960802afba73b5d38sm
4225cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4226cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieOnAttack(true);
4227cfd74d65d832137e20e193c960802afba73b5d38sm
4228cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4229cfd74d65d832137e20e193c960802afba73b5d38sm
4230cfd74d65d832137e20e193c960802afba73b5d38sm
4231cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4232cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4233cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4234cfd74d65d832137e20e193c960802afba73b5d38sm
4235cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4236cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4237cfd74d65d832137e20e193c960802afba73b5d38sm        }
4238cfd74d65d832137e20e193c960802afba73b5d38sm
4239cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4240cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4241cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4242cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4243cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4244cfd74d65d832137e20e193c960802afba73b5d38sm
4245cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.TURRET_BULLET, object, sprite);
4246cfd74d65d832137e20e193c960802afba73b5d38sm
4247cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4248cfd74d65d832137e20e193c960802afba73b5d38sm
4249cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4250cfd74d65d832137e20e193c960802afba73b5d38sm    }
4251cfd74d65d832137e20e193c960802afba73b5d38sm
4252cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBrobotBullet(float positionX, float positionY, boolean flipHorizontal) {
4253cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4254cfd74d65d832137e20e193c960802afba73b5d38sm
4255cfd74d65d832137e20e193c960802afba73b5d38sm
4256cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4257cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4258cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4259cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
4260cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
4261cfd74d65d832137e20e193c960802afba73b5d38sm
4262cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_BULLET);
4263cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4264cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4265cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4266cfd74d65d832137e20e193c960802afba73b5d38sm
4267cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
4268cfd74d65d832137e20e193c960802afba73b5d38sm
4269cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 3);
4270cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4271cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01),
4272cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4273cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4274cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02),
4275cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4276cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4277cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03),
4278cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null));
4279cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4280cfd74d65d832137e20e193c960802afba73b5d38sm
4281cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
4282cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4283cfd74d65d832137e20e193c960802afba73b5d38sm
4284cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT_BULLET, staticData);
4285cfd74d65d832137e20e193c960802afba73b5d38sm        }
4286cfd74d65d832137e20e193c960802afba73b5d38sm
4287cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4288cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.PROJECTILE);
4289cfd74d65d832137e20e193c960802afba73b5d38sm
4290cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4291cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
4292cfd74d65d832137e20e193c960802afba73b5d38sm
4293cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4294cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4295cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4296cfd74d65d832137e20e193c960802afba73b5d38sm
4297cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4298cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
4299cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
4300cfd74d65d832137e20e193c960802afba73b5d38sm
4301cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
4302cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
4303cfd74d65d832137e20e193c960802afba73b5d38sm        }
4304cfd74d65d832137e20e193c960802afba73b5d38sm
4305cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
4306cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4307cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4308cfd74d65d832137e20e193c960802afba73b5d38sm
4309cfd74d65d832137e20e193c960802afba73b5d38sm
4310cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT_BULLET, object, sprite);
4311cfd74d65d832137e20e193c960802afba73b5d38sm
4312cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4313cfd74d65d832137e20e193c960802afba73b5d38sm
4314cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4315cfd74d65d832137e20e193c960802afba73b5d38sm    }
4316cfd74d65d832137e20e193c960802afba73b5d38sm
4317cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnCoin(float positionX, float positionY) {
4318cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4319cfd74d65d832137e20e193c960802afba73b5d38sm
4320cfd74d65d832137e20e193c960802afba73b5d38sm
4321cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4322cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4323cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4324cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
4325cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
4326cfd74d65d832137e20e193c960802afba73b5d38sm
4327cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.COIN);
4328cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4329cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4330cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4331cfd74d65d832137e20e193c960802afba73b5d38sm
4332cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = null; /*new FixedSizeArray<CollisionVolume>(1);
4333cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(8, 8, 8));
4334cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);*/
4335cfd74d65d832137e20e193c960802afba73b5d38sm
4336cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
4337cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin01),
4338cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 30), null, basicVulnerabilityVolume));
4339cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin02),
4340cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4341cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin03),
4342cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4343cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin04),
4344cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4345cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_coin05),
4346cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4347cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4348cfd74d65d832137e20e193c960802afba73b5d38sm
4349cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addCoin = new InventoryComponent.UpdateRecord();
4350cfd74d65d832137e20e193c960802afba73b5d38sm            addCoin.coinCount = 1;
4351cfd74d65d832137e20e193c960802afba73b5d38sm
4352cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addCoin);
4353cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4354cfd74d65d832137e20e193c960802afba73b5d38sm
4355cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.COIN, staticData);
4356cfd74d65d832137e20e193c960802afba73b5d38sm        }
4357cfd74d65d832137e20e193c960802afba73b5d38sm
4358cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4359cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4360cfd74d65d832137e20e193c960802afba73b5d38sm
4361cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4362cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4363cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4364cfd74d65d832137e20e193c960802afba73b5d38sm
4365cfd74d65d832137e20e193c960802afba73b5d38sm        //DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4366cfd74d65d832137e20e193c960802afba73b5d38sm        //sprite.setCollisionComponent(dynamicCollision);
4367cfd74d65d832137e20e193c960802afba73b5d38sm
4368cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4369cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4370cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4371cfd74d65d832137e20e193c960802afba73b5d38sm
4372cfd74d65d832137e20e193c960802afba73b5d38sm        HitPlayerComponent hitPlayer = (HitPlayerComponent)allocateComponent(HitPlayerComponent.class);
4373cfd74d65d832137e20e193c960802afba73b5d38sm        hitPlayer.setup(32, hitReact, HitType.COLLECT, false);
4374cfd74d65d832137e20e193c960802afba73b5d38sm
4375cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
4376cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4377cfd74d65d832137e20e193c960802afba73b5d38sm            hitReact.setTakeHitSound(HitType.COLLECT, sound.load(R.raw.ding));
4378cfd74d65d832137e20e193c960802afba73b5d38sm        }
4379cfd74d65d832137e20e193c960802afba73b5d38sm
4380cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4381cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4382cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4383cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4384cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4385cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4386cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4387cfd74d65d832137e20e193c960802afba73b5d38sm            }
4388cfd74d65d832137e20e193c960802afba73b5d38sm        }
4389cfd74d65d832137e20e193c960802afba73b5d38sm
4390cfd74d65d832137e20e193c960802afba73b5d38sm        //dynamicCollision.setHitReactionComponent(hitReact);
4391cfd74d65d832137e20e193c960802afba73b5d38sm
4392cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
43932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        life.setIncrementEventCounter(EventRecorder.COUNTER_PEARLS_COLLECTED);
43942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
4395cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4396cfd74d65d832137e20e193c960802afba73b5d38sm
4397cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4398cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4399cfd74d65d832137e20e193c960802afba73b5d38sm        //object.add(dynamicCollision);
4400cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitPlayer);
4401cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4402cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4403cfd74d65d832137e20e193c960802afba73b5d38sm
4404cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.COIN, object, sprite);
4405cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
44062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
44072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        EventRecorder recorder = sSystemRegistry.eventRecorder;
44082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        recorder.incrementEventCounter(EventRecorder.COUNTER_PEARLS_TOTAL);
4409cfd74d65d832137e20e193c960802afba73b5d38sm
4410cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4411cfd74d65d832137e20e193c960802afba73b5d38sm    }
4412cfd74d65d832137e20e193c960802afba73b5d38sm
4413cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnRuby(float positionX, float positionY) {
4414cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4415cfd74d65d832137e20e193c960802afba73b5d38sm
4416cfd74d65d832137e20e193c960802afba73b5d38sm
4417cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4418cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4419cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4420cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4421cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4422cfd74d65d832137e20e193c960802afba73b5d38sm
4423cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.RUBY);
4424cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4425cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4426cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4427cfd74d65d832137e20e193c960802afba73b5d38sm
4428cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
4429cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16));
4430cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
4431cfd74d65d832137e20e193c960802afba73b5d38sm
4432cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
4433cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4434cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby01),
4435cfd74d65d832137e20e193c960802afba73b5d38sm                    2.0f, null, basicVulnerabilityVolume));
4436cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4437cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby02),
4438cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4439cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4440cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby03),
4441cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4442cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4443cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby04),
4444cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
4445cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
4446cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_ruby05),
4447cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4448cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4449cfd74d65d832137e20e193c960802afba73b5d38sm
4450cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addRuby = new InventoryComponent.UpdateRecord();
4451cfd74d65d832137e20e193c960802afba73b5d38sm            addRuby.rubyCount = 1;
4452cfd74d65d832137e20e193c960802afba73b5d38sm
4453cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addRuby);
4454cfd74d65d832137e20e193c960802afba73b5d38sm
4455cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4456cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.RUBY, staticData);
4457cfd74d65d832137e20e193c960802afba73b5d38sm        }
4458cfd74d65d832137e20e193c960802afba73b5d38sm
4459cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4460cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4461cfd74d65d832137e20e193c960802afba73b5d38sm
4462cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4463cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
4464cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4465cfd74d65d832137e20e193c960802afba73b5d38sm
4466cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4467cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4468cfd74d65d832137e20e193c960802afba73b5d38sm
4469cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4470cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4471cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4472cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4473cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4474cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4475cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4476cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4477cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4478cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4479cfd74d65d832137e20e193c960802afba73b5d38sm            }
4480cfd74d65d832137e20e193c960802afba73b5d38sm        }
4481cfd74d65d832137e20e193c960802afba73b5d38sm
4482cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4483cfd74d65d832137e20e193c960802afba73b5d38sm
4484cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4485cfd74d65d832137e20e193c960802afba73b5d38sm        life.setObjectToSpawnOnDeath(GameObjectType.GEM_EFFECT_SPAWNER);
4486cfd74d65d832137e20e193c960802afba73b5d38sm
4487cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4488cfd74d65d832137e20e193c960802afba73b5d38sm
4489cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4490cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4491cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4492cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4493cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4494cfd74d65d832137e20e193c960802afba73b5d38sm
4495cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.RUBY, object, sprite);
4496cfd74d65d832137e20e193c960802afba73b5d38sm
4497cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4498cfd74d65d832137e20e193c960802afba73b5d38sm
4499cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4500cfd74d65d832137e20e193c960802afba73b5d38sm    }
4501cfd74d65d832137e20e193c960802afba73b5d38sm
4502cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnDiary(float positionX, float positionY) {
4503cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4504cfd74d65d832137e20e193c960802afba73b5d38sm
4505cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem level = sSystemRegistry.levelSystem;
4506cfd74d65d832137e20e193c960802afba73b5d38sm        if (level != null) {
4507cfd74d65d832137e20e193c960802afba73b5d38sm        	final LevelTree.Level currentLevel = level.getCurrentLevel();
4508cfd74d65d832137e20e193c960802afba73b5d38sm        	if (currentLevel != null && currentLevel.diaryCollected) {
4509cfd74d65d832137e20e193c960802afba73b5d38sm        		return null;
4510cfd74d65d832137e20e193c960802afba73b5d38sm        	}
4511cfd74d65d832137e20e193c960802afba73b5d38sm        }
4512cfd74d65d832137e20e193c960802afba73b5d38sm
4513cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4514cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4515cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4516cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4517cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4518cfd74d65d832137e20e193c960802afba73b5d38sm
4519cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DIARY);
4520cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4521cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4522cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4523cfd74d65d832137e20e193c960802afba73b5d38sm
4524cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume = new FixedSizeArray<CollisionVolume>(1);
4525cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 16, 16));
4526cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.COLLECT);
4527cfd74d65d832137e20e193c960802afba73b5d38sm
4528cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 8);
4529cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01),
4530cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
4531cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary02),
4532cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume);
4533cfd74d65d832137e20e193c960802afba73b5d38sm
4534cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary01),
4535cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
4536cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
4537cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4538cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame2);
4539cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary03),
4540cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4541cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary04),
4542cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4543cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary05),
4544cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4545cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_diary06),
4546cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
4547cfd74d65d832137e20e193c960802afba73b5d38sm
4548cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
4549cfd74d65d832137e20e193c960802afba73b5d38sm
4550cfd74d65d832137e20e193c960802afba73b5d38sm            InventoryComponent.UpdateRecord addDiary = new InventoryComponent.UpdateRecord();
4551cfd74d65d832137e20e193c960802afba73b5d38sm            addDiary.diaryCount = 1;
4552cfd74d65d832137e20e193c960802afba73b5d38sm
4553cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(addDiary);
4554cfd74d65d832137e20e193c960802afba73b5d38sm
4555cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4556cfd74d65d832137e20e193c960802afba73b5d38sm
4557cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.DIARY, staticData);
4558cfd74d65d832137e20e193c960802afba73b5d38sm        }
4559cfd74d65d832137e20e193c960802afba73b5d38sm
4560cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4561cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4562cfd74d65d832137e20e193c960802afba73b5d38sm
4563cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4564cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4565cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4566cfd74d65d832137e20e193c960802afba73b5d38sm
4567cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4568cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4569cfd74d65d832137e20e193c960802afba73b5d38sm
4570cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4571cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setDieWhenCollected(true);
4572cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(true);
4573cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setSpawnGameEventOnHit(CollisionParameters.HitType.COLLECT,
4574cfd74d65d832137e20e193c960802afba73b5d38sm                GameFlowEvent.EVENT_SHOW_DIARY, 0);
4575cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is pretty dumb.  The static data binding needs to be made generic.
4576cfd74d65d832137e20e193c960802afba73b5d38sm        final int staticDataSize = staticData.getCount();
4577cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < staticDataSize; x++) {
4578cfd74d65d832137e20e193c960802afba73b5d38sm            final BaseObject entry = staticData.get(x);
4579cfd74d65d832137e20e193c960802afba73b5d38sm            if (entry instanceof InventoryComponent.UpdateRecord) {
4580cfd74d65d832137e20e193c960802afba73b5d38sm                hitReact.setInventoryUpdate((InventoryComponent.UpdateRecord)entry);
4581cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4582cfd74d65d832137e20e193c960802afba73b5d38sm            }
4583cfd74d65d832137e20e193c960802afba73b5d38sm        }
4584cfd74d65d832137e20e193c960802afba73b5d38sm
4585cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4586cfd74d65d832137e20e193c960802afba73b5d38sm
4587cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
4588cfd74d65d832137e20e193c960802afba73b5d38sm
4589cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
4590cfd74d65d832137e20e193c960802afba73b5d38sm
4591cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4592cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4593cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4594cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4595cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
4596cfd74d65d832137e20e193c960802afba73b5d38sm
4597cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.DIARY, object, sprite);
4598cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4599cfd74d65d832137e20e193c960802afba73b5d38sm
4600cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4601cfd74d65d832137e20e193c960802afba73b5d38sm    }
4602cfd74d65d832137e20e193c960802afba73b5d38sm
4603cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectDoor(float positionX, float positionY, GameObjectType type, boolean solid) {
4604cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4605cfd74d65d832137e20e193c960802afba73b5d38sm
4606cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4607cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4608cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4609cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4610cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
4611cfd74d65d832137e20e193c960802afba73b5d38sm
4612cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
4613cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4614cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 5;
4615cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4616cfd74d65d832137e20e193c960802afba73b5d38sm
4617cfd74d65d832137e20e193c960802afba73b5d38sm            final int red_frames[] = {
4618cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red01,
4619cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red02,
4620cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red03,
4621cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_red04,
4622cfd74d65d832137e20e193c960802afba73b5d38sm            };
4623cfd74d65d832137e20e193c960802afba73b5d38sm
4624cfd74d65d832137e20e193c960802afba73b5d38sm            final int blue_frames[] = {
4625cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue01,
4626cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue02,
4627cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue03,
4628cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_blue04,
4629cfd74d65d832137e20e193c960802afba73b5d38sm            };
4630cfd74d65d832137e20e193c960802afba73b5d38sm
4631cfd74d65d832137e20e193c960802afba73b5d38sm            final int green_frames[] = {
4632cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green01,
4633cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green02,
4634cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green03,
4635cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_door_green04,
4636cfd74d65d832137e20e193c960802afba73b5d38sm            };
4637cfd74d65d832137e20e193c960802afba73b5d38sm
4638cfd74d65d832137e20e193c960802afba73b5d38sm            int frames[] = red_frames;
4639cfd74d65d832137e20e193c960802afba73b5d38sm
4640cfd74d65d832137e20e193c960802afba73b5d38sm            if (type == GameObjectType.DOOR_GREEN) {
4641cfd74d65d832137e20e193c960802afba73b5d38sm                frames = green_frames;
4642cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (type == GameObjectType.DOOR_BLUE) {
4643cfd74d65d832137e20e193c960802afba73b5d38sm                frames = blue_frames;
4644cfd74d65d832137e20e193c960802afba73b5d38sm            }
4645cfd74d65d832137e20e193c960802afba73b5d38sm
4646cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> vulnerabilityVolume = null;
4647cfd74d65d832137e20e193c960802afba73b5d38sm
4648cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]),
4649cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4650cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4651cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2));
4652cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame3 = new AnimationFrame(textureLibrary.allocateTexture(frames[2]),
4653cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2));
4654cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame4 = new AnimationFrame(textureLibrary.allocateTexture(frames[3]),
4655cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1));
4656cfd74d65d832137e20e193c960802afba73b5d38sm
4657cfd74d65d832137e20e193c960802afba73b5d38sm            // one frame of closing is deadly
4658cfd74d65d832137e20e193c960802afba73b5d38sm
4659cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
4660cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4661cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(12, 8, 8, 56));
4662cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.get(0).setHitType(HitType.DEATH);
4663cfd74d65d832137e20e193c960802afba73b5d38sm
4664cfd74d65d832137e20e193c960802afba73b5d38sm
4665cfd74d65d832137e20e193c960802afba73b5d38sm
4666cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame closeFrame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4667cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), attackVolume, vulnerabilityVolume);
4668cfd74d65d832137e20e193c960802afba73b5d38sm
4669cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle_closed = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSED, 1);
4670cfd74d65d832137e20e193c960802afba73b5d38sm            idle_closed.addFrame(frame1);
4671cfd74d65d832137e20e193c960802afba73b5d38sm
4672cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle_open = new SpriteAnimation(DoorAnimationComponent.Animation.OPEN, 1);
4673cfd74d65d832137e20e193c960802afba73b5d38sm            idle_open.addFrame(frame4);
4674cfd74d65d832137e20e193c960802afba73b5d38sm
4675cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation open = new SpriteAnimation(DoorAnimationComponent.Animation.OPENING, 2);
4676cfd74d65d832137e20e193c960802afba73b5d38sm            open.addFrame(frame2);
4677cfd74d65d832137e20e193c960802afba73b5d38sm            open.addFrame(frame3);
4678cfd74d65d832137e20e193c960802afba73b5d38sm
4679cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation close = new SpriteAnimation(DoorAnimationComponent.Animation.CLOSING, 2);
4680cfd74d65d832137e20e193c960802afba73b5d38sm            close.addFrame(frame3);
4681cfd74d65d832137e20e193c960802afba73b5d38sm            close.addFrame(closeFrame2);
4682cfd74d65d832137e20e193c960802afba73b5d38sm
4683cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
4684cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
4685cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
4686cfd74d65d832137e20e193c960802afba73b5d38sm            // box shape:
4687cfd74d65d832137e20e193c960802afba73b5d38sm            // ___       ___1
4688cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      2| |3
4689cfd74d65d832137e20e193c960802afba73b5d38sm            // ---       ---4
4690cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0, object.height);
4691cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(object.width, object.height);
4692cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(0.0f, -1.0f);
4693cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
4694cfd74d65d832137e20e193c960802afba73b5d38sm
4695cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(0, object.height);
4696cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(0, 0);
4697cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(-1.0f, 0.0f);
4698cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
4699cfd74d65d832137e20e193c960802afba73b5d38sm
4700cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(object.width, object.height);
4701cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(object.width, 0);
4702cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0);
4703cfd74d65d832137e20e193c960802afba73b5d38sm
4704cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(0, 0);
4705cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(object.width, 0);
4706cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0, 1.0f);
4707cfd74d65d832137e20e193c960802afba73b5d38sm
4708cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
4709cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
4710cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
4711cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
4712cfd74d65d832137e20e193c960802afba73b5d38sm
4713cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle_open);
4714cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle_closed);
4715cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(open);
4716cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(close);
4717cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
4718cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(type, staticData);
4719cfd74d65d832137e20e193c960802afba73b5d38sm        }
4720cfd74d65d832137e20e193c960802afba73b5d38sm
4721cfd74d65d832137e20e193c960802afba73b5d38sm
4722cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4723cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.FOREGROUND_OBJECT);
4724cfd74d65d832137e20e193c960802afba73b5d38sm
4725cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4726cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4727cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4728cfd74d65d832137e20e193c960802afba73b5d38sm
4729cfd74d65d832137e20e193c960802afba73b5d38sm        DoorAnimationComponent doorAnim = (DoorAnimationComponent)allocateComponent(DoorAnimationComponent.class);
4730cfd74d65d832137e20e193c960802afba73b5d38sm        doorAnim.setSprite(sprite);
4731cfd74d65d832137e20e193c960802afba73b5d38sm
4732cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4733cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4734cfd74d65d832137e20e193c960802afba73b5d38sm        	doorAnim.setSounds(sound.load(R.raw.sound_open), sound.load(R.raw.sound_close));
4735cfd74d65d832137e20e193c960802afba73b5d38sm        }
4736cfd74d65d832137e20e193c960802afba73b5d38sm
4737cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel doorChannel = null;
4738cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
4739cfd74d65d832137e20e193c960802afba73b5d38sm        switch (type) {
4740cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_RED:
4741cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sRedButtonChannel);
4742cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4743cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_BLUE:
4744cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sBlueButtonChannel);
4745cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4746cfd74d65d832137e20e193c960802afba73b5d38sm            case DOOR_GREEN:
4747cfd74d65d832137e20e193c960802afba73b5d38sm                doorChannel = channelSystem.registerChannel(sGreenButtonChannel);
4748cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4749cfd74d65d832137e20e193c960802afba73b5d38sm        }
4750cfd74d65d832137e20e193c960802afba73b5d38sm        doorAnim.setChannel(doorChannel);
4751cfd74d65d832137e20e193c960802afba73b5d38sm
4752cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4753cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4754cfd74d65d832137e20e193c960802afba73b5d38sm
4755cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
4756cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4757cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4758cfd74d65d832137e20e193c960802afba73b5d38sm
4759cfd74d65d832137e20e193c960802afba73b5d38sm
4760cfd74d65d832137e20e193c960802afba73b5d38sm
4761cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4762cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4763cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(doorAnim);
4764cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4765cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4766cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(type, object, sprite);
4767cfd74d65d832137e20e193c960802afba73b5d38sm
4768cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
4769cfd74d65d832137e20e193c960802afba73b5d38sm
4770cfd74d65d832137e20e193c960802afba73b5d38sm        SolidSurfaceComponent solidSurface = object.findByClass(SolidSurfaceComponent.class);
4771cfd74d65d832137e20e193c960802afba73b5d38sm        if (solid) {
4772cfd74d65d832137e20e193c960802afba73b5d38sm            doorAnim.setSolidSurface(solidSurface);
4773cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
4774cfd74d65d832137e20e193c960802afba73b5d38sm            object.remove(solidSurface);
4775cfd74d65d832137e20e193c960802afba73b5d38sm            object.commitUpdates();
4776cfd74d65d832137e20e193c960802afba73b5d38sm        }
4777cfd74d65d832137e20e193c960802afba73b5d38sm
4778cfd74d65d832137e20e193c960802afba73b5d38sm
4779cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4780cfd74d65d832137e20e193c960802afba73b5d38sm
4781cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4782cfd74d65d832137e20e193c960802afba73b5d38sm    }
4783cfd74d65d832137e20e193c960802afba73b5d38sm
4784cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectButton(float positionX, float positionY, GameObjectType type) {
4785cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4786cfd74d65d832137e20e193c960802afba73b5d38sm
4787cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4788cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4789cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4790cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
4791cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
4792cfd74d65d832137e20e193c960802afba73b5d38sm
4793cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(type);
4794cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4795cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4796cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4797cfd74d65d832137e20e193c960802afba73b5d38sm
4798cfd74d65d832137e20e193c960802afba73b5d38sm            final int red_frames[] = {
4799cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_red,
4800cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_red,
4801cfd74d65d832137e20e193c960802afba73b5d38sm            };
4802cfd74d65d832137e20e193c960802afba73b5d38sm
4803cfd74d65d832137e20e193c960802afba73b5d38sm            final int blue_frames[] = {
4804cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_blue,
4805cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_blue,
4806cfd74d65d832137e20e193c960802afba73b5d38sm            };
4807cfd74d65d832137e20e193c960802afba73b5d38sm
4808cfd74d65d832137e20e193c960802afba73b5d38sm            final int green_frames[] = {
4809cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_green,
4810cfd74d65d832137e20e193c960802afba73b5d38sm                    R.drawable.object_button_pressed_green,
4811cfd74d65d832137e20e193c960802afba73b5d38sm            };
4812cfd74d65d832137e20e193c960802afba73b5d38sm
4813cfd74d65d832137e20e193c960802afba73b5d38sm            int frames[] = red_frames;
4814cfd74d65d832137e20e193c960802afba73b5d38sm
4815cfd74d65d832137e20e193c960802afba73b5d38sm            if (type == GameObjectType.BUTTON_GREEN) {
4816cfd74d65d832137e20e193c960802afba73b5d38sm                frames = green_frames;
4817cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (type == GameObjectType.BUTTON_BLUE) {
4818cfd74d65d832137e20e193c960802afba73b5d38sm                frames = blue_frames;
4819cfd74d65d832137e20e193c960802afba73b5d38sm            }
4820cfd74d65d832137e20e193c960802afba73b5d38sm
4821cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> vulnerabilityVolume =
4822cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4823cfd74d65d832137e20e193c960802afba73b5d38sm            vulnerabilityVolume.add(new AABoxCollisionVolume(0, 0, 32, 16));
4824cfd74d65d832137e20e193c960802afba73b5d38sm            vulnerabilityVolume.get(0).setHitType(HitType.DEPRESS);
4825cfd74d65d832137e20e193c960802afba73b5d38sm
4826cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(frames[0]),
4827cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4828cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame2 = new AnimationFrame(textureLibrary.allocateTexture(frames[1]),
4829cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, vulnerabilityVolume);
4830cfd74d65d832137e20e193c960802afba73b5d38sm
4831cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(ButtonAnimationComponent.Animation.UP, 1);
4832cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4833cfd74d65d832137e20e193c960802afba73b5d38sm
4834cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation pressed = new SpriteAnimation(ButtonAnimationComponent.Animation.DOWN, 1);
4835cfd74d65d832137e20e193c960802afba73b5d38sm            pressed.addFrame(frame2);
4836cfd74d65d832137e20e193c960802afba73b5d38sm
4837cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4838cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(pressed);
4839cfd74d65d832137e20e193c960802afba73b5d38sm
4840cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(type, staticData);
4841cfd74d65d832137e20e193c960802afba73b5d38sm        }
4842cfd74d65d832137e20e193c960802afba73b5d38sm
4843cfd74d65d832137e20e193c960802afba73b5d38sm
4844cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4845cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
4846cfd74d65d832137e20e193c960802afba73b5d38sm
4847cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4848cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4849cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4850cfd74d65d832137e20e193c960802afba73b5d38sm
4851cfd74d65d832137e20e193c960802afba73b5d38sm        ButtonAnimationComponent button = (ButtonAnimationComponent)allocateComponent(ButtonAnimationComponent.class);
4852cfd74d65d832137e20e193c960802afba73b5d38sm        button.setSprite(sprite);
4853cfd74d65d832137e20e193c960802afba73b5d38sm
4854cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4855cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4856cfd74d65d832137e20e193c960802afba73b5d38sm        	button.setDepressSound(sound.load(R.raw.sound_button));
4857cfd74d65d832137e20e193c960802afba73b5d38sm        }
4858cfd74d65d832137e20e193c960802afba73b5d38sm
4859cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel buttonChannel = null;
4860cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
4861cfd74d65d832137e20e193c960802afba73b5d38sm        switch (type) {
4862cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_RED:
4863cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sRedButtonChannel);
4864cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4865cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_BLUE:
4866cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sBlueButtonChannel);
4867cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4868cfd74d65d832137e20e193c960802afba73b5d38sm            case BUTTON_GREEN:
4869cfd74d65d832137e20e193c960802afba73b5d38sm                buttonChannel = channelSystem.registerChannel(sGreenButtonChannel);
4870cfd74d65d832137e20e193c960802afba73b5d38sm                break;
4871cfd74d65d832137e20e193c960802afba73b5d38sm        }
4872cfd74d65d832137e20e193c960802afba73b5d38sm        button.setChannel(buttonChannel);
4873cfd74d65d832137e20e193c960802afba73b5d38sm
4874cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4875cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4876cfd74d65d832137e20e193c960802afba73b5d38sm
4877cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4878cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(false);
4879cfd74d65d832137e20e193c960802afba73b5d38sm
4880cfd74d65d832137e20e193c960802afba73b5d38sm
4881cfd74d65d832137e20e193c960802afba73b5d38sm
4882cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4883cfd74d65d832137e20e193c960802afba73b5d38sm
4884cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4885cfd74d65d832137e20e193c960802afba73b5d38sm
4886cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4887cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4888cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(button);
4889cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4890cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4891cfd74d65d832137e20e193c960802afba73b5d38sm
4892cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(type, object, sprite);
4893cfd74d65d832137e20e193c960802afba73b5d38sm
4894cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4895cfd74d65d832137e20e193c960802afba73b5d38sm
4896cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4897cfd74d65d832137e20e193c960802afba73b5d38sm    }
4898cfd74d65d832137e20e193c960802afba73b5d38sm
4899cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectCannon(float positionX, float positionY) {
4900cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4901cfd74d65d832137e20e193c960802afba73b5d38sm
4902cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4903cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4904cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4905cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
4906cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 128;
4907cfd74d65d832137e20e193c960802afba73b5d38sm
4908cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CANNON);
4909cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
4910cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
4911cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
4912cfd74d65d832137e20e193c960802afba73b5d38sm
4913cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> attackVolume =
4914cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
4915cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.add(new AABoxCollisionVolume(16, 16, 32, 80));
4916cfd74d65d832137e20e193c960802afba73b5d38sm            attackVolume.get(0).setHitType(HitType.LAUNCH);
4917cfd74d65d832137e20e193c960802afba73b5d38sm
4918cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1 = new AnimationFrame(
4919cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_cannon),
4920cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, attackVolume, null);
4921cfd74d65d832137e20e193c960802afba73b5d38sm
4922cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(GenericAnimationComponent.Animation.IDLE, 1);
4923cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(frame1);
4924cfd74d65d832137e20e193c960802afba73b5d38sm
4925cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame frame1NoAttack = new AnimationFrame(
4926cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_cannon),
4927cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, null);
4928cfd74d65d832137e20e193c960802afba73b5d38sm
4929cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation shoot = new SpriteAnimation(GenericAnimationComponent.Animation.ATTACK, 1);
4930cfd74d65d832137e20e193c960802afba73b5d38sm            shoot.addFrame(frame1NoAttack);
4931cfd74d65d832137e20e193c960802afba73b5d38sm
4932cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
4933cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(shoot);
4934cfd74d65d832137e20e193c960802afba73b5d38sm
4935cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CANNON, staticData);
4936cfd74d65d832137e20e193c960802afba73b5d38sm        }
4937cfd74d65d832137e20e193c960802afba73b5d38sm
4938cfd74d65d832137e20e193c960802afba73b5d38sm
4939cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
4940cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.FOREGROUND_OBJECT);
4941cfd74d65d832137e20e193c960802afba73b5d38sm
4942cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
4943cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
4944cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
4945cfd74d65d832137e20e193c960802afba73b5d38sm
4946cfd74d65d832137e20e193c960802afba73b5d38sm        LauncherComponent launcher = (LauncherComponent)allocateComponent(LauncherComponent.class);
4947cfd74d65d832137e20e193c960802afba73b5d38sm        launcher.setLaunchEffect(GameObjectType.SMOKE_POOF, 32.0f, 85.0f);
4948cfd74d65d832137e20e193c960802afba73b5d38sm
4949cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
4950cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
4951cfd74d65d832137e20e193c960802afba73b5d38sm        	launcher.setLaunchSound(sound.load(R.raw.sound_cannon));
4952cfd74d65d832137e20e193c960802afba73b5d38sm        }
4953cfd74d65d832137e20e193c960802afba73b5d38sm
4954cfd74d65d832137e20e193c960802afba73b5d38sm
4955cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
4956cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
4957cfd74d65d832137e20e193c960802afba73b5d38sm
4958cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
4959cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincible(false);
4960cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setLauncherComponent(launcher, HitType.LAUNCH);
4961cfd74d65d832137e20e193c960802afba73b5d38sm
4962cfd74d65d832137e20e193c960802afba73b5d38sm        dynamicCollision.setHitReactionComponent(hitReact);
4963cfd74d65d832137e20e193c960802afba73b5d38sm
4964cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent anim = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
4965cfd74d65d832137e20e193c960802afba73b5d38sm        anim.setSprite(sprite);
4966cfd74d65d832137e20e193c960802afba73b5d38sm
4967cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
4968cfd74d65d832137e20e193c960802afba73b5d38sm
4969cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
4970cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
4971cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
4972cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
4973cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(launcher);
4974cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(anim);
4975cfd74d65d832137e20e193c960802afba73b5d38sm
4976cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CANNON, object, sprite);
4977cfd74d65d832137e20e193c960802afba73b5d38sm
4978cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
4979cfd74d65d832137e20e193c960802afba73b5d38sm
4980cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
4981cfd74d65d832137e20e193c960802afba73b5d38sm    }
4982cfd74d65d832137e20e193c960802afba73b5d38sm
4983cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectBrobotSpawner(float positionX, float positionY, boolean flipHorizontal) {
4984cfd74d65d832137e20e193c960802afba73b5d38sm
4985cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
4986cfd74d65d832137e20e193c960802afba73b5d38sm
4987cfd74d65d832137e20e193c960802afba73b5d38sm        // This is pretty heavy-handed.
4988cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: figure out a general solution for objects that depend on other objects.
4989cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle01);
4990cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle02);
4991cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_idle03);
4992cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk01);
4993cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk02);
4994cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.enemy_brobot_walk03);
4995cfd74d65d832137e20e193c960802afba73b5d38sm
4996cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
4997cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
4998cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
4999cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5000cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5001cfd74d65d832137e20e193c960802afba73b5d38sm
5002cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BROBOT_SPAWNER);
5003cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
50042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            final int staticObjectCount = 2;
5005cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5006cfd74d65d832137e20e193c960802afba73b5d38sm
5007cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
5008cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5009cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32));
5010cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS);
5011cfd74d65d832137e20e193c960802afba73b5d38sm
5012cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
5013cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5014cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_brobot_machine),
5015cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
5016cfd74d65d832137e20e193c960802afba73b5d38sm
5017cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
5018cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
5019cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(3);
5020cfd74d65d832137e20e193c960802afba73b5d38sm            /*
5021cfd74d65d832137e20e193c960802afba73b5d38sm                0:2,0:8,59:-0.99532399996093,0.09659262446878
5022cfd74d65d832137e20e193c960802afba73b5d38sm                0:8,59:61,33:0.44551558813576,0.89527418187282
5023cfd74d65d832137e20e193c960802afba73b5d38sm                0:61,33:61,-1:1,0
5024cfd74d65d832137e20e193c960802afba73b5d38sm
5025cfd74d65d832137e20e193c960802afba73b5d38sm             */
5026cfd74d65d832137e20e193c960802afba73b5d38sm            // trapezoid shape:
5027cfd74d65d832137e20e193c960802afba73b5d38sm            // |\        |\2
5028cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      1| |3
5029cfd74d65d832137e20e193c960802afba73b5d38sm
5030cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0, 0);
5031cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(8.0f, 59.0f);
5032cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-0.9953f, 0.0965f);
5033cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
5034cfd74d65d832137e20e193c960802afba73b5d38sm
5035cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(8.0f, 59.0f);
5036cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(61.0f, 33.0f);
5037cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.445515f, 0.89527f);
5038cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
5039cfd74d65d832137e20e193c960802afba73b5d38sm
5040cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(61.0f, 33.0f);
5041cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(61.0f, 0.0f);
5042cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0.0f);
5043cfd74d65d832137e20e193c960802afba73b5d38sm
5044cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
5045cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
5046cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
5047cfd74d65d832137e20e193c960802afba73b5d38sm
5048cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
5049cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5050cfd74d65d832137e20e193c960802afba73b5d38sm
5051cfd74d65d832137e20e193c960802afba73b5d38sm
5052cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BROBOT_SPAWNER, staticData);
5053cfd74d65d832137e20e193c960802afba73b5d38sm        }
5054cfd74d65d832137e20e193c960802afba73b5d38sm
5055cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5056cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5057cfd74d65d832137e20e193c960802afba73b5d38sm
5058cfd74d65d832137e20e193c960802afba73b5d38sm
5059cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5060cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5061cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5062cfd74d65d832137e20e193c960802afba73b5d38sm
5063cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5064cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5065cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5066cfd74d65d832137e20e193c960802afba73b5d38sm
5067cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5068cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5069cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5070cfd74d65d832137e20e193c960802afba73b5d38sm
5071cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
5072cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
5073cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBeforeFirstSet(3.0f);
5074cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.BROBOT);
5075cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(36);
5076cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(50);
5077cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(100.0f);
5078cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityY(300.0f);
5079cfd74d65d832137e20e193c960802afba73b5d38sm        gun.enableProjectileTracking(1);
5080cfd74d65d832137e20e193c960802afba73b5d38sm
5081cfd74d65d832137e20e193c960802afba73b5d38sm
5082cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5083cfd74d65d832137e20e193c960802afba73b5d38sm
5084cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5085cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5086cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
5087cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = 1.0f;
5088cfd74d65d832137e20e193c960802afba73b5d38sm        }
5089cfd74d65d832137e20e193c960802afba73b5d38sm
5090cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5091cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5092cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
5093cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5094cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5095cfd74d65d832137e20e193c960802afba73b5d38sm
5096cfd74d65d832137e20e193c960802afba73b5d38sm
5097cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BROBOT_SPAWNER, object, sprite);
5098cfd74d65d832137e20e193c960802afba73b5d38sm
5099cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
5100cfd74d65d832137e20e193c960802afba73b5d38sm
51012b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
5102cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5103cfd74d65d832137e20e193c960802afba73b5d38sm
5104cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5105cfd74d65d832137e20e193c960802afba73b5d38sm    }
5106cfd74d65d832137e20e193c960802afba73b5d38sm
51079d4cc2572d37983607df38b0f4216ed76ac51814sm    public GameObject spawnObjectInfiniteSpawner(float positionX, float positionY) {
51089d4cc2572d37983607df38b0f4216ed76ac51814sm    	GameObject object = spawnObjectBrobotSpawner(positionX, positionY, false);
51099d4cc2572d37983607df38b0f4216ed76ac51814sm    	object.facingDirection.y = -1; //vertical flip
51109d4cc2572d37983607df38b0f4216ed76ac51814sm    	LaunchProjectileComponent gun = object.findByClass(LaunchProjectileComponent.class);
51119d4cc2572d37983607df38b0f4216ed76ac51814sm    	if (gun != null) {
51122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		gun.disableProjectileTracking();
51132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		gun.setDelayBetweenShots(0.15f);
51142b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		gun.setSetsPerActivation(1);
51152b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    		gun.setShotsPerSet(60);
51169d4cc2572d37983607df38b0f4216ed76ac51814sm    	}
51179d4cc2572d37983607df38b0f4216ed76ac51814sm
51189d4cc2572d37983607df38b0f4216ed76ac51814sm    	return object;
51199d4cc2572d37983607df38b0f4216ed76ac51814sm    }
51209d4cc2572d37983607df38b0f4216ed76ac51814sm
51212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    public GameObject spawnObjectCrusherAndou(float positionX, float positionY) {
51222b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
51232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        GameObject object = mGameObjectPool.allocate();
51252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.getPosition().set(positionX, positionY);
51262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.activationRadius = mAlwaysActive;
51272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.width = 64;
51282b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.height = 64;
51292b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CRUSHER_ANDOU);
51312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (staticData == null) {
51332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            final int staticObjectCount = 5;
51342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
51352b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51362b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            GameComponent gravity = allocateComponent(GravityComponent.class);
51372b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            GameComponent movement = allocateComponent(MovementComponent.class);
51382b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            PhysicsComponent physics = (PhysicsComponent)allocateComponent(PhysicsComponent.class);
51392b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51402b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            physics.setMass(9.1f);   // ~90kg w/ earth gravity
51412b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            physics.setDynamicFrictionCoeffecient(0.2f);
51422b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            physics.setStaticFrictionCoeffecient(0.01f);
51432b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            // Animation Data
51452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
51462b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                new FixedSizeArray<CollisionVolume>(1);
51472b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            basicVulnerabilityVolume.add(new SphereCollisionVolume(16, 32, 32));
51482b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51492b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            SpriteAnimation idle = new SpriteAnimation(Animation.IDLE, 1);
51502b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            idle.addFrame(new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stand),
51512b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    1.0f, null, basicVulnerabilityVolume));
51522b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51532b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51542b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            FixedSizeArray<CollisionVolume> stompAttackVolume =
51552b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                new FixedSizeArray<CollisionVolume>(1);
51562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            stompAttackVolume.add(new AABoxCollisionVolume(16, -5.0f, 32, 37, HitType.HIT));
51572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            SpriteAnimation stomp = new SpriteAnimation(Animation.ATTACK, 4);
51602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            stomp.addFrame(
51612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp01),
51622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
51632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            stomp.addFrame(
51642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp02),
51652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
51662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            stomp.addFrame(
51672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp03),
51682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
51692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            stomp.addFrame(
51702b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new AnimationFrame(textureLibrary.allocateTexture(R.drawable.andou_stomp04),
51712b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    		Utils.framesToTime(24, 1), stompAttackVolume, null));
51722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            // Save static data
51762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(gravity);
51772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(movement);
51782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(physics);
51792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(idle);
51822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(stomp);
51832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            setStaticData(GameObjectType.CRUSHER_ANDOU, staticData);
51862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        }
51872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
51902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        render.setPriority(SortConstants.PLAYER);
51912b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        BackgroundCollisionComponent bgcollision
51922b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
51932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        bgcollision.setSize(32, 48);
51942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        bgcollision.setOffset(16, 0);
51952b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        GenericAnimationComponent animation = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
51972b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
51982b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
51992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setSize((int)object.width, (int)object.height);
52002b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setRenderComponent(render);
52012b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        animation.setSprite(sprite);
52022b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        DynamicCollisionComponent dynamicCollision
52052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
52062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setCollisionComponent(dynamicCollision);
52072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
52092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        hitReact.setBounceOnHit(true);
52102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        hitReact.setPauseOnAttack(true);
52112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        hitReact.setInvincibleTime(3.0f);
52122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        hitReact.setSpawnOnDealHit(HitType.HIT, GameObjectType.CRUSH_FLASH, false, true);
52132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52142b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52152b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        dynamicCollision.setHitReactionComponent(hitReact);
52162b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52172b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52182b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52192b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.life = 1;
52202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.team = Team.PLAYER;
52212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52222b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(animation);
52232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(bgcollision);
52242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(render);
52252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(sprite);
52262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(dynamicCollision);
52272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(hitReact);
52282b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52292b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        addStaticData(GameObjectType.CRUSHER_ANDOU, object, sprite);
52302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.playAnimation(Animation.IDLE);
52322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.commitUpdates();
52342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52352b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        ChangeComponentsComponent swap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
52362b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52372b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        final int count = object.getCount();
52382b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        for (int x = 0; x < count; x++) {
52392b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	swap.addSwapInComponent((GameComponent)object.get(x));
52402b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        }
52412b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52422b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.removeAll();
52432b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        CrusherAndouComponent crusher = (CrusherAndouComponent)allocateComponent(CrusherAndouComponent.class);
52452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52462b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        crusher.setSwap(swap);
52472b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52482b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(swap);
52492b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(crusher);
52502b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52512b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.commitUpdates();
52522b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52532b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        return object;
52542b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    }
52552b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
52569d4cc2572d37983607df38b0f4216ed76ac51814sm    public GameObject spawnObjectBreakableBlock(float positionX, float positionY) {
5257cfd74d65d832137e20e193c960802afba73b5d38sm
5258cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5259cfd74d65d832137e20e193c960802afba73b5d38sm
5260cfd74d65d832137e20e193c960802afba73b5d38sm        // Preload block piece texture.
5261cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.object_debris_piece);
5262cfd74d65d832137e20e193c960802afba73b5d38sm
5263cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5264cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5265cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5266cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5267cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5268cfd74d65d832137e20e193c960802afba73b5d38sm
5269cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK);
5270cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5271cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
5272cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5273cfd74d65d832137e20e193c960802afba73b5d38sm
5274cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
5275cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5276cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(7, 0, 32 - 7, 42, HitType.HIT));
5277cfd74d65d832137e20e193c960802afba73b5d38sm
5278cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 1);
5279cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5280cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_debris_block),
5281cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
5282cfd74d65d832137e20e193c960802afba73b5d38sm
5283cfd74d65d832137e20e193c960802afba73b5d38sm            SolidSurfaceComponent solidSurface
5284cfd74d65d832137e20e193c960802afba73b5d38sm                = (SolidSurfaceComponent)allocateComponent(SolidSurfaceComponent.class);
5285cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.inititalize(4);
5286cfd74d65d832137e20e193c960802afba73b5d38sm
5287cfd74d65d832137e20e193c960802afba73b5d38sm            // box shape:
5288cfd74d65d832137e20e193c960802afba73b5d38sm            // ___       ___2
5289cfd74d65d832137e20e193c960802afba73b5d38sm            // | |      1| |3
5290cfd74d65d832137e20e193c960802afba73b5d38sm            // ---       ---4
5291cfd74d65d832137e20e193c960802afba73b5d38sm
5292cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Start = new Vector2(0.0f, 0.0f);
5293cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1End = new Vector2(0.0f, 32.0f);
5294cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface1Normal = new Vector2(-1.0f, 0.0f);
5295cfd74d65d832137e20e193c960802afba73b5d38sm            surface1Normal.normalize();
5296cfd74d65d832137e20e193c960802afba73b5d38sm
5297cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Start = new Vector2(0.0f, 32.0f);
5298cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2End = new Vector2(32.0f, 32.0f);
5299cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface2Normal = new Vector2(0.0f, 1.0f);
5300cfd74d65d832137e20e193c960802afba73b5d38sm            surface2Normal.normalize();
5301cfd74d65d832137e20e193c960802afba73b5d38sm
5302cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Start = new Vector2(32.0f, 32.0f);
5303cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3End = new Vector2(32.0f, 0.0f);
5304cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface3Normal = new Vector2(1.0f, 0.0f);
5305cfd74d65d832137e20e193c960802afba73b5d38sm
5306cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Start = new Vector2(32.0f, 0.0f);
5307cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4End = new Vector2(0.0f, 0.0f);
5308cfd74d65d832137e20e193c960802afba73b5d38sm            Vector2 surface4Normal = new Vector2(0.0f, -1.0f);
5309cfd74d65d832137e20e193c960802afba73b5d38sm
5310cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface1Start, surface1End, surface1Normal);
5311cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface2Start, surface2End, surface2Normal);
5312cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface3Start, surface3End, surface3Normal);
5313cfd74d65d832137e20e193c960802afba73b5d38sm            solidSurface.addSurface(surface4Start, surface4End, surface4Normal);
5314cfd74d65d832137e20e193c960802afba73b5d38sm
5315cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(solidSurface);
5316cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5317cfd74d65d832137e20e193c960802afba73b5d38sm
5318cfd74d65d832137e20e193c960802afba73b5d38sm
5319cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BREAKABLE_BLOCK, staticData);
5320cfd74d65d832137e20e193c960802afba73b5d38sm        }
5321cfd74d65d832137e20e193c960802afba73b5d38sm
5322cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5323cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5324cfd74d65d832137e20e193c960802afba73b5d38sm
5325cfd74d65d832137e20e193c960802afba73b5d38sm
5326cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5327cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5328cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5329cfd74d65d832137e20e193c960802afba73b5d38sm
5330cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5331cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5332cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5333cfd74d65d832137e20e193c960802afba73b5d38sm
5334cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5335cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5336cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5337cfd74d65d832137e20e193c960802afba73b5d38sm
5338cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5339cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.BREAKABLE_BLOCK_PIECE_SPAWNER);
5340cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = BaseObject.sSystemRegistry.soundSystem;
5341cfd74d65d832137e20e193c960802afba73b5d38sm        if (sound != null) {
5342cfd74d65d832137e20e193c960802afba73b5d38sm        	lifetime.setDeathSound(sound.load(R.raw.sound_break_block));
5343cfd74d65d832137e20e193c960802afba73b5d38sm        }
5344cfd74d65d832137e20e193c960802afba73b5d38sm
5345cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
5346cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5347cfd74d65d832137e20e193c960802afba73b5d38sm
5348cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5349cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5350cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5351cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5352cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5353cfd74d65d832137e20e193c960802afba73b5d38sm
5354cfd74d65d832137e20e193c960802afba73b5d38sm
5355cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BREAKABLE_BLOCK, object, sprite);
5356cfd74d65d832137e20e193c960802afba73b5d38sm
5357cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5358cfd74d65d832137e20e193c960802afba73b5d38sm
5359cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5360cfd74d65d832137e20e193c960802afba73b5d38sm    }
5361cfd74d65d832137e20e193c960802afba73b5d38sm
5362cfd74d65d832137e20e193c960802afba73b5d38sm	public GameObject spawnObjectTheSource(float positionX, float positionY) {
5363cfd74d65d832137e20e193c960802afba73b5d38sm
5364cfd74d65d832137e20e193c960802afba73b5d38sm	    final TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5365cfd74d65d832137e20e193c960802afba73b5d38sm
5366cfd74d65d832137e20e193c960802afba73b5d38sm	    GameObject object = mGameObjectPool.allocate();
5367cfd74d65d832137e20e193c960802afba73b5d38sm	    object.activationRadius = mAlwaysActive;
5368cfd74d65d832137e20e193c960802afba73b5d38sm	    object.width = 512;
5369cfd74d65d832137e20e193c960802afba73b5d38sm	    object.height = 512;
5370cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5371cfd74d65d832137e20e193c960802afba73b5d38sm
5372cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer1Render = (RenderComponent)allocateComponent(RenderComponent.class);
5373cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Render.setPriority(SortConstants.THE_SOURCE_START);
5374cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer1Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5375cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setRenderComponent(layer1Render);
5376cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spikes));
5377cfd74d65d832137e20e193c960802afba73b5d38sm	    layer1Fade.setupFade(1.0f, 0.2f, 1.9f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5378cfd74d65d832137e20e193c960802afba73b5d38sm
5379cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer2Render = (RenderComponent)allocateComponent(RenderComponent.class);
5380cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Render.setPriority(SortConstants.THE_SOURCE_START + 1);
5381cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer2Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5382cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setRenderComponent(layer2Render);
5383cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_body));
5384cfd74d65d832137e20e193c960802afba73b5d38sm	    layer2Fade.setupFade(1.0f, 0.8f, 5.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5385cfd74d65d832137e20e193c960802afba73b5d38sm
5386cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer3Render = (RenderComponent)allocateComponent(RenderComponent.class);
5387cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Render.setPriority(SortConstants.THE_SOURCE_START + 2);
5388cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer3Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5389cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setRenderComponent(layer3Render);
5390cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_black));
5391cfd74d65d832137e20e193c960802afba73b5d38sm	    layer3Fade.setupFade(0.0f, 1.0f, 6.0f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_LINEAR, 0.0f);
5392cfd74d65d832137e20e193c960802afba73b5d38sm
5393cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer4Render = (RenderComponent)allocateComponent(RenderComponent.class);
5394cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Render.setPriority(SortConstants.THE_SOURCE_START + 3);
5395cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer4Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5396cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setRenderComponent(layer4Render);
5397cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_spots));
5398cfd74d65d832137e20e193c960802afba73b5d38sm	    layer4Fade.setupFade(0.0f, 1.0f, 2.3f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5399cfd74d65d832137e20e193c960802afba73b5d38sm
5400cfd74d65d832137e20e193c960802afba73b5d38sm	    RenderComponent layer5Render = (RenderComponent)allocateComponent(RenderComponent.class);
5401cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Render.setPriority(SortConstants.THE_SOURCE_START + 4);
5402cfd74d65d832137e20e193c960802afba73b5d38sm	    FadeDrawableComponent layer5Fade = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
5403cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setRenderComponent(layer5Render);
5404cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setTexture(textureLibrary.allocateTexture(R.drawable.enemy_source_core));
5405cfd74d65d832137e20e193c960802afba73b5d38sm	    layer5Fade.setupFade(0.2f, 1.0f, 1.2f, FadeDrawableComponent.LOOP_TYPE_PING_PONG, FadeDrawableComponent.FADE_EASE, 0.0f);
5406cfd74d65d832137e20e193c960802afba73b5d38sm
5407cfd74d65d832137e20e193c960802afba73b5d38sm
5408cfd74d65d832137e20e193c960802afba73b5d38sm	    OrbitalMagnetComponent orbit = (OrbitalMagnetComponent)allocateComponent(OrbitalMagnetComponent.class);
5409cfd74d65d832137e20e193c960802afba73b5d38sm	    orbit.setup(320.0f, 220.0f);
5410cfd74d65d832137e20e193c960802afba73b5d38sm
5411cfd74d65d832137e20e193c960802afba73b5d38sm	    DynamicCollisionComponent collision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5412cfd74d65d832137e20e193c960802afba73b5d38sm	    FixedSizeArray<CollisionVolume> vulnerabilityVolume =
5413cfd74d65d832137e20e193c960802afba73b5d38sm            new FixedSizeArray<CollisionVolume>(1);
5414cfd74d65d832137e20e193c960802afba73b5d38sm	    vulnerabilityVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT));
5415cfd74d65d832137e20e193c960802afba73b5d38sm	    FixedSizeArray<CollisionVolume> attackVolume =
5416cfd74d65d832137e20e193c960802afba73b5d38sm            new FixedSizeArray<CollisionVolume>(1);
5417cfd74d65d832137e20e193c960802afba73b5d38sm	    attackVolume.add(new SphereCollisionVolume(256, 256, 256, HitType.HIT));
5418cfd74d65d832137e20e193c960802afba73b5d38sm	    collision.setCollisionVolumes(attackVolume, vulnerabilityVolume);
5419cfd74d65d832137e20e193c960802afba73b5d38sm
5420cfd74d65d832137e20e193c960802afba73b5d38sm	    HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5421cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5422cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setInvincibleTime(TheSourceComponent.SHAKE_TIME);
5423cfd74d65d832137e20e193c960802afba73b5d38sm
5424cfd74d65d832137e20e193c960802afba73b5d38sm        TheSourceComponent theSource = (TheSourceComponent)allocateComponent(TheSourceComponent.class);
5425cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem.Channel surpriseChannel = null;
5426cfd74d65d832137e20e193c960802afba73b5d38sm        ChannelSystem channelSystem = BaseObject.sSystemRegistry.channelSystem;
5427cfd74d65d832137e20e193c960802afba73b5d38sm        surpriseChannel = channelSystem.registerChannel(sSurprisedNPCChannel);
5428cfd74d65d832137e20e193c960802afba73b5d38sm        theSource.setChannel(surpriseChannel);
5429cfd74d65d832137e20e193c960802afba73b5d38sm        theSource.setGameEvent(GameFlowEvent.EVENT_SHOW_ANIMATION, AnimationPlayerActivity.WANDA_ENDING);
5430cfd74d65d832137e20e193c960802afba73b5d38sm
5431cfd74d65d832137e20e193c960802afba73b5d38sm
5432cfd74d65d832137e20e193c960802afba73b5d38sm	    object.life = 3;
5433cfd74d65d832137e20e193c960802afba73b5d38sm	    object.team = Team.PLAYER;
5434cfd74d65d832137e20e193c960802afba73b5d38sm
5435cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer1Render);
5436cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer2Render);
5437cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer3Render);
5438cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer4Render);
5439cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer5Render);
5440cfd74d65d832137e20e193c960802afba73b5d38sm
5441cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer1Fade);
5442cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer2Fade);
5443cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer3Fade);
5444cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer4Fade);
5445cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(layer5Fade);
5446cfd74d65d832137e20e193c960802afba73b5d38sm
5447cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(orbit);
5448cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(collision);
5449cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(hitReact);
5450cfd74d65d832137e20e193c960802afba73b5d38sm	    object.add(theSource);
5451cfd74d65d832137e20e193c960802afba73b5d38sm
5452cfd74d65d832137e20e193c960802afba73b5d38sm	    return object;
5453cfd74d65d832137e20e193c960802afba73b5d38sm	}
54542b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54552b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public GameObject spawnObjectSign(float positionX, float positionY) {
54562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
54572b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54582b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        GameObject object = mGameObjectPool.allocate();
54592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.getPosition().set(positionX, positionY);
54602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.activationRadius = mTightActivationRadius;
54612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.width = 32;
54622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.height = 32;
54632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.HINT_SIGN);
54652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (staticData == null) {
54662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            final int staticObjectCount = 1;
54672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
54682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
54702b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                new FixedSizeArray<CollisionVolume>(1);
54712b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            basicVulnerabilityVolume.add(new AABoxCollisionVolume(8, 0, 24, 32, HitType.COLLECT));
54722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            SpriteAnimation idle = new SpriteAnimation(0, 1);
54742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            AnimationFrame frame1 = new AnimationFrame(textureLibrary.allocateTexture(R.drawable.object_sign),
54752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume);
54762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            idle.addFrame(frame1);
54782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            idle.setLoop(true);
54802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            staticData.add(idle);
54822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            setStaticData(GameObjectType.HINT_SIGN, staticData);
54842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        }
54852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
54872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        render.setPriority(SortConstants.GENERAL_OBJECT);
54882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
54902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setSize((int)object.width, (int)object.height);
54912b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setRenderComponent(render);
54922b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
54942b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.setCollisionComponent(dynamicCollision);
54952b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
54962b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        HitReactionComponent hitReact = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
54972b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        dynamicCollision.setHitReactionComponent(hitReact);
54982b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        hitReact.setSpawnGameEventOnHit(HitType.COLLECT, GameFlowEvent.EVENT_SHOW_DIALOG_CHARACTER2, 0);
54992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
55002b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        SelectDialogComponent dialogSelect = (SelectDialogComponent)allocateComponent(SelectDialogComponent.class);
55012b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        dialogSelect.setHitReact(hitReact);
55022b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
55032b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(dialogSelect);
55042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(render);
55052b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(sprite);
55062b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(dynamicCollision);
55072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        object.add(hitReact);
55082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
55092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        addStaticData(GameObjectType.HINT_SIGN, object, sprite);
55102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        sprite.playAnimation(0);
55112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
55122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        return object;
55132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    }
5514cfd74d65d832137e20e193c960802afba73b5d38sm
5515cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnObjectTurret(float positionX, float positionY, boolean flipHorizontal) {
5516cfd74d65d832137e20e193c960802afba73b5d38sm
5517cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
5518cfd74d65d832137e20e193c960802afba73b5d38sm
5519cfd74d65d832137e20e193c960802afba73b5d38sm        // Make sure related textures are loaded.
5520cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet01);
5521cfd74d65d832137e20e193c960802afba73b5d38sm        textureLibrary.allocateTexture(R.drawable.effect_bullet02);
5522cfd74d65d832137e20e193c960802afba73b5d38sm
5523cfd74d65d832137e20e193c960802afba73b5d38sm
5524cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5525cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5526cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5527cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5528cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5529cfd74d65d832137e20e193c960802afba73b5d38sm
5530cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.TURRET);
5531cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5532cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 3;
5533cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5534cfd74d65d832137e20e193c960802afba73b5d38sm
5535cfd74d65d832137e20e193c960802afba73b5d38sm            // Animations
5536cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicVulnerabilityVolume =
5537cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5538cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.add(new SphereCollisionVolume(32, 32, 32));
5539cfd74d65d832137e20e193c960802afba73b5d38sm            basicVulnerabilityVolume.get(0).setHitType(HitType.POSSESS);
5540cfd74d65d832137e20e193c960802afba73b5d38sm
5541cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(EnemyAnimations.IDLE.ordinal(), 2);
5542cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5543cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5544cfd74d65d832137e20e193c960802afba73b5d38sm                    1.0f, null, basicVulnerabilityVolume));
5545cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5546cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret_idle),
5547cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5548cfd74d65d832137e20e193c960802afba73b5d38sm            idle.setLoop(true);
5549cfd74d65d832137e20e193c960802afba73b5d38sm
5550cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation attack = new SpriteAnimation(EnemyAnimations.ATTACK.ordinal(), 4);
5551cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5552cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret02),
5553cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5554cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5555cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5556cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5557cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5558cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret03),
5559cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 2), null, basicVulnerabilityVolume));
5560cfd74d65d832137e20e193c960802afba73b5d38sm            attack.addFrame(new AnimationFrame(
5561cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.allocateTexture(R.drawable.object_gunturret01),
5562cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, basicVulnerabilityVolume));
5563cfd74d65d832137e20e193c960802afba73b5d38sm            attack.setLoop(true);
5564cfd74d65d832137e20e193c960802afba73b5d38sm
5565cfd74d65d832137e20e193c960802afba73b5d38sm            GhostComponent ghost = (GhostComponent)allocateComponent(GhostComponent.class);
5566cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.setTargetAction(ActionType.IDLE);
5567cfd74d65d832137e20e193c960802afba73b5d38sm            ghost.changeActionOnButton(ActionType.ATTACK);
5568cfd74d65d832137e20e193c960802afba73b5d38sm
5569cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5570cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(attack);
5571cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(ghost);
5572cfd74d65d832137e20e193c960802afba73b5d38sm
5573cfd74d65d832137e20e193c960802afba73b5d38sm
5574cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.TURRET, staticData);
5575cfd74d65d832137e20e193c960802afba73b5d38sm        }
5576cfd74d65d832137e20e193c960802afba73b5d38sm
5577cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5578cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.GENERAL_OBJECT);
5579cfd74d65d832137e20e193c960802afba73b5d38sm
5580cfd74d65d832137e20e193c960802afba73b5d38sm
5581cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5582cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setSize((int)object.width, (int)object.height);
5583cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5584cfd74d65d832137e20e193c960802afba73b5d38sm
5585cfd74d65d832137e20e193c960802afba73b5d38sm        GenericAnimationComponent animation
5586cfd74d65d832137e20e193c960802afba73b5d38sm            = (GenericAnimationComponent)allocateComponent(GenericAnimationComponent.class);
5587cfd74d65d832137e20e193c960802afba73b5d38sm        animation.setSprite(sprite);
5588cfd74d65d832137e20e193c960802afba73b5d38sm
5589cfd74d65d832137e20e193c960802afba73b5d38sm        AttackAtDistanceComponent attack = (AttackAtDistanceComponent)
5590cfd74d65d832137e20e193c960802afba73b5d38sm            allocateComponent(AttackAtDistanceComponent.class);
5591cfd74d65d832137e20e193c960802afba73b5d38sm        attack.setupAttack(300, 0.0f, 1.0f, true);
5592cfd74d65d832137e20e193c960802afba73b5d38sm
5593cfd74d65d832137e20e193c960802afba73b5d38sm
5594cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent collision
5595cfd74d65d832137e20e193c960802afba73b5d38sm            = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5596cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(collision);
5597cfd74d65d832137e20e193c960802afba73b5d38sm
5598cfd74d65d832137e20e193c960802afba73b5d38sm        HitReactionComponent hitReact
5599cfd74d65d832137e20e193c960802afba73b5d38sm            = (HitReactionComponent)allocateComponent(HitReactionComponent.class);
5600cfd74d65d832137e20e193c960802afba73b5d38sm        collision.setHitReactionComponent(hitReact);
5601cfd74d65d832137e20e193c960802afba73b5d38sm
5602cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5603cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setObjectToSpawnOnDeath(GameObjectType.EXPLOSION_LARGE);
5604cfd74d65d832137e20e193c960802afba73b5d38sm
5605cfd74d65d832137e20e193c960802afba73b5d38sm        SoundSystem sound = sSystemRegistry.soundSystem;
5606cfd74d65d832137e20e193c960802afba73b5d38sm
5607cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent gun
5608cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
5609cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShotsPerSet(1);
5610cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenShots(0.0f);
5611cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setDelayBetweenSets(0.3f);
5612cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setObjectTypeToSpawn(GameObjectType.TURRET_BULLET);
5613cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetX(54);
5614cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setOffsetY(13);
5615cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setRequiredAction(GameObject.ActionType.ATTACK);
5616cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityX(300.0f);
5617cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setVelocityY(-300.0f);
5618cfd74d65d832137e20e193c960802afba73b5d38sm        gun.setShootSound(sound.load(R.raw.sound_gun));
5619cfd74d65d832137e20e193c960802afba73b5d38sm
5620cfd74d65d832137e20e193c960802afba73b5d38sm        // Components for possession
5621cfd74d65d832137e20e193c960802afba73b5d38sm
5622cfd74d65d832137e20e193c960802afba73b5d38sm        ChangeComponentsComponent componentSwap = (ChangeComponentsComponent)allocateComponent(ChangeComponentsComponent.class);
5623cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.addSwapOutComponent(attack);
5624cfd74d65d832137e20e193c960802afba73b5d38sm        componentSwap.setPingPongBehavior(true);
5625cfd74d65d832137e20e193c960802afba73b5d38sm
5626cfd74d65d832137e20e193c960802afba73b5d38sm        hitReact.setPossessionComponent(componentSwap);
5627cfd74d65d832137e20e193c960802afba73b5d38sm
5628cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.ENEMY;
5629cfd74d65d832137e20e193c960802afba73b5d38sm
5630cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5631cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5632cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
5633cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = 1.0f;
5634cfd74d65d832137e20e193c960802afba73b5d38sm        }
5635cfd74d65d832137e20e193c960802afba73b5d38sm
5636cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5637cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5638cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(animation);
5639cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(attack);
5640cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(collision);
5641cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(hitReact);
5642cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5643cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(gun);
5644cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(componentSwap);
5645cfd74d65d832137e20e193c960802afba73b5d38sm
5646cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.TURRET, object, sprite);
5647cfd74d65d832137e20e193c960802afba73b5d38sm
5648cfd74d65d832137e20e193c960802afba73b5d38sm        object.commitUpdates();
5649cfd74d65d832137e20e193c960802afba73b5d38sm
5650cfd74d65d832137e20e193c960802afba73b5d38sm        GhostComponent possessedGhost = object.findByClass(GhostComponent.class);
5651cfd74d65d832137e20e193c960802afba73b5d38sm        if (possessedGhost != null) {
5652cfd74d65d832137e20e193c960802afba73b5d38sm            object.remove(possessedGhost);   // Not supposed to be added yet.
5653cfd74d65d832137e20e193c960802afba73b5d38sm            componentSwap.addSwapInComponent(possessedGhost);
5654cfd74d65d832137e20e193c960802afba73b5d38sm        }
5655cfd74d65d832137e20e193c960802afba73b5d38sm
5656cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5657cfd74d65d832137e20e193c960802afba73b5d38sm
5658cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5659cfd74d65d832137e20e193c960802afba73b5d38sm    }
5660cfd74d65d832137e20e193c960802afba73b5d38sm
5661cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnDust(float positionX, float positionY, boolean flipHorizontal) {
5662cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5663cfd74d65d832137e20e193c960802afba73b5d38sm
5664cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5665cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5666cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
5667cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5668cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5669cfd74d65d832137e20e193c960802afba73b5d38sm
5670cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.DUST);
5671cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5672cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5673cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5674cfd74d65d832137e20e193c960802afba73b5d38sm
5675cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 5);
5676cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust01),
5677cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5678cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust02),
5679cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5680cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust03),
5681cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5682cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust04),
5683cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5684cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(textureLibrary.getTextureByResource(R.drawable.dust05),
5685cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1)));
5686cfd74d65d832137e20e193c960802afba73b5d38sm
5687cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5688cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.DUST, staticData);
5689cfd74d65d832137e20e193c960802afba73b5d38sm        }
5690cfd74d65d832137e20e193c960802afba73b5d38sm
5691cfd74d65d832137e20e193c960802afba73b5d38sm
5692cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5693cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5694cfd74d65d832137e20e193c960802afba73b5d38sm
5695cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5696cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.30f);
5697cfd74d65d832137e20e193c960802afba73b5d38sm
5698cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5699cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5700cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5701cfd74d65d832137e20e193c960802afba73b5d38sm
5702cfd74d65d832137e20e193c960802afba73b5d38sm
5703cfd74d65d832137e20e193c960802afba73b5d38sm        if (flipHorizontal) {
5704cfd74d65d832137e20e193c960802afba73b5d38sm            object.facingDirection.x = -1.0f;
5705cfd74d65d832137e20e193c960802afba73b5d38sm        }
5706cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
5707cfd74d65d832137e20e193c960802afba73b5d38sm
5708cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5709cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5710cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5711cfd74d65d832137e20e193c960802afba73b5d38sm
5712cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.DUST, object, sprite);
5713cfd74d65d832137e20e193c960802afba73b5d38sm
5714cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5715cfd74d65d832137e20e193c960802afba73b5d38sm
5716cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5717cfd74d65d832137e20e193c960802afba73b5d38sm    }
5718cfd74d65d832137e20e193c960802afba73b5d38sm
5719cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionSmall(float positionX, float positionY) {
5720cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5721cfd74d65d832137e20e193c960802afba73b5d38sm
5722cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5723cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5724cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5725cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
5726cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
5727cfd74d65d832137e20e193c960802afba73b5d38sm
5728cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_SMALL);
5729cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5730cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5731cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5732cfd74d65d832137e20e193c960802afba73b5d38sm
5733cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
5734cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5735cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(16, 16, 16, HitType.HIT));
5736cfd74d65d832137e20e193c960802afba73b5d38sm
5737cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 7);
5738cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5739cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01),
5740cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5741cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5742cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02),
5743cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5744cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5745cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03),
5746cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5747cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5748cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04),
5749cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5750cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5751cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05),
5752cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5753cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5754cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06),
5755cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5756cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5757cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07),
5758cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5759cfd74d65d832137e20e193c960802afba73b5d38sm
5760cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5761cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_SMALL, staticData);
5762cfd74d65d832137e20e193c960802afba73b5d38sm        }
5763cfd74d65d832137e20e193c960802afba73b5d38sm
5764cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5765cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5766cfd74d65d832137e20e193c960802afba73b5d38sm
5767cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5768cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5769cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5770cfd74d65d832137e20e193c960802afba73b5d38sm
5771cfd74d65d832137e20e193c960802afba73b5d38sm
5772cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5773cfd74d65d832137e20e193c960802afba73b5d38sm
5774cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5775cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
5776cfd74d65d832137e20e193c960802afba73b5d38sm
5777cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
5778cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5779cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5780cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5781cfd74d65d832137e20e193c960802afba73b5d38sm
5782cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EXPLOSION_SMALL, object, sprite);
5783cfd74d65d832137e20e193c960802afba73b5d38sm
5784cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(0);
5785cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
5786cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
5787cfd74d65d832137e20e193c960802afba73b5d38sm        }
5788cfd74d65d832137e20e193c960802afba73b5d38sm
5789cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5790cfd74d65d832137e20e193c960802afba73b5d38sm
5791cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5792cfd74d65d832137e20e193c960802afba73b5d38sm    }
5793cfd74d65d832137e20e193c960802afba73b5d38sm
5794cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionLarge(float positionX, float positionY) {
5795cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5796cfd74d65d832137e20e193c960802afba73b5d38sm
5797cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5798cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5799cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5800cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5801cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5802cfd74d65d832137e20e193c960802afba73b5d38sm
5803cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_LARGE);
5804cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5805cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
5806cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5807cfd74d65d832137e20e193c960802afba73b5d38sm
5808cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume =
5809cfd74d65d832137e20e193c960802afba73b5d38sm                new FixedSizeArray<CollisionVolume>(1);
5810cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(32, 32, 32, HitType.HIT));
5811cfd74d65d832137e20e193c960802afba73b5d38sm
5812cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 9);
5813cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5814cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01),
5815cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5816cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5817cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02),
5818cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5819cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5820cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03),
5821cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5822cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5823cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04),
5824cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5825cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5826cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05),
5827cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5828cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5829cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06),
5830cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5831cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5832cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07),
5833cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5834cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5835cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08),
5836cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5837cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5838cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09),
5839cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5840cfd74d65d832137e20e193c960802afba73b5d38sm
5841cfd74d65d832137e20e193c960802afba73b5d38sm
5842cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5843cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_LARGE, staticData);
5844cfd74d65d832137e20e193c960802afba73b5d38sm        }
5845cfd74d65d832137e20e193c960802afba73b5d38sm
5846cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5847cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5848cfd74d65d832137e20e193c960802afba73b5d38sm
5849cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5850cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5851cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5852cfd74d65d832137e20e193c960802afba73b5d38sm
5853cfd74d65d832137e20e193c960802afba73b5d38sm
5854cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
5855cfd74d65d832137e20e193c960802afba73b5d38sm
5856cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision =
5857cfd74d65d832137e20e193c960802afba73b5d38sm            (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
5858cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
5859cfd74d65d832137e20e193c960802afba73b5d38sm
5860cfd74d65d832137e20e193c960802afba73b5d38sm        PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class);
5861cfd74d65d832137e20e193c960802afba73b5d38sm        soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion));
5862cfd74d65d832137e20e193c960802afba73b5d38sm
5863cfd74d65d832137e20e193c960802afba73b5d38sm
5864cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(soundEffect);
5865cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
5866cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
5867cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
5868cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
5869cfd74d65d832137e20e193c960802afba73b5d38sm
5870cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.EXPLOSION_LARGE, object, sprite);
5871cfd74d65d832137e20e193c960802afba73b5d38sm
5872cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = sprite.findAnimation(0);
5873cfd74d65d832137e20e193c960802afba73b5d38sm        if (idle != null) {
5874cfd74d65d832137e20e193c960802afba73b5d38sm            lifetime.setTimeUntilDeath(idle.getLength());
5875cfd74d65d832137e20e193c960802afba73b5d38sm        }
5876cfd74d65d832137e20e193c960802afba73b5d38sm
5877cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
5878cfd74d65d832137e20e193c960802afba73b5d38sm
5879cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
5880cfd74d65d832137e20e193c960802afba73b5d38sm    }
5881cfd74d65d832137e20e193c960802afba73b5d38sm
5882cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectExplosionGiant(float positionX, float positionY) {
5883cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
5884cfd74d65d832137e20e193c960802afba73b5d38sm
5885cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
5886cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
5887cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
5888cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 64;
5889cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 64;
5890cfd74d65d832137e20e193c960802afba73b5d38sm
5891cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.EXPLOSION_GIANT);
5892cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
5893cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
5894cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
5895cfd74d65d832137e20e193c960802afba73b5d38sm
5896cfd74d65d832137e20e193c960802afba73b5d38sm            FixedSizeArray<CollisionVolume> basicAttackVolume = new FixedSizeArray<CollisionVolume>(1);
5897cfd74d65d832137e20e193c960802afba73b5d38sm            basicAttackVolume.add(new SphereCollisionVolume(64, 32, 32, HitType.HIT));
5898cfd74d65d832137e20e193c960802afba73b5d38sm
5899cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation idle = new SpriteAnimation(0, 9);
5900cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5901cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big01),
5902cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5903cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5904cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big02),
5905cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5906cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5907cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big03),
5908cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5909cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5910cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big04),
5911cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5912cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5913cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big05),
5914cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5915cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5916cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big06),
5917cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5918cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5919cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big07),
5920cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5921cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5922cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big08),
5923cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5924cfd74d65d832137e20e193c960802afba73b5d38sm            idle.addFrame(new AnimationFrame(
5925cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_big09),
5926cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), basicAttackVolume, null));
5927cfd74d65d832137e20e193c960802afba73b5d38sm
5928cfd74d65d832137e20e193c960802afba73b5d38sm
5929cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame1 = new AnimationFrame(
5930cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small01),
5931cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5932cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame2 = new AnimationFrame(
5933cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small02),
5934cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5935cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame3 = new AnimationFrame(
5936cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small03),
5937cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5938cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame4 = new AnimationFrame(
5939cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small04),
5940cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5941cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame5 = new AnimationFrame(
5942cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small05),
5943cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5944cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame6 = new AnimationFrame(
5945cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.effect_explosion_small06),
5946cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5947cfd74d65d832137e20e193c960802afba73b5d38sm            AnimationFrame smallFrame7 = new AnimationFrame
5948cfd74d65d832137e20e193c960802afba73b5d38sm            (textureLibrary.getTextureByResource(R.drawable.effect_explosion_small07),
5949cfd74d65d832137e20e193c960802afba73b5d38sm                    Utils.framesToTime(24, 1), null, null);
5950cfd74d65d832137e20e193c960802afba73b5d38sm
5951cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast1 = new SpriteAnimation(0, 7);
5952cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame1);
5953cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame2);
5954cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame3);
5955cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame4);
5956cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame5);
5957cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame6);
5958cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast1.addFrame(smallFrame7);
5959cfd74d65d832137e20e193c960802afba73b5d38sm
5960cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast2 = new SpriteAnimation(0, 8);
5961cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 4), null, null));
5962cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame1);
5963cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame2);
5964cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame3);
5965cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame4);
5966cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame5);
5967cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame6);
5968cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast2.addFrame(smallFrame7);
5969cfd74d65d832137e20e193c960802afba73b5d38sm
5970cfd74d65d832137e20e193c960802afba73b5d38sm            SpriteAnimation smallBlast3 = new SpriteAnimation(0, 8);
5971cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(new AnimationFrame(null, Utils.framesToTime(24, 8), null, null));
5972cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame1);
5973cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame2);
5974cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame3);
5975cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame4);
5976cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame5);
5977cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame6);
5978cfd74d65d832137e20e193c960802afba73b5d38sm            smallBlast3.addFrame(smallFrame7);
5979cfd74d65d832137e20e193c960802afba73b5d38sm
5980cfd74d65d832137e20e193c960802afba73b5d38sm
5981cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(idle);
5982cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast1);
5983cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast2);
5984cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(smallBlast3);
5985cfd74d65d832137e20e193c960802afba73b5d38sm
5986cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.EXPLOSION_GIANT, staticData);
5987cfd74d65d832137e20e193c960802afba73b5d38sm        }
5988cfd74d65d832137e20e193c960802afba73b5d38sm
5989cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
5990cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
5991cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
5992cfd74d65d832137e20e193c960802afba73b5d38sm		sprite.setSize((int)object.width, (int)object.height);
5993cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setRenderComponent(render);
5994cfd74d65d832137e20e193c960802afba73b5d38sm
5995cfd74d65d832137e20e193c960802afba73b5d38sm        // Hack.  Use static data differently for this object so we can share three animations
5996cfd74d65d832137e20e193c960802afba73b5d38sm        // amongst three separate sprites.
5997cfd74d65d832137e20e193c960802afba73b5d38sm
5998cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation idle = (SpriteAnimation)staticData.get(0);
5999cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast1 = (SpriteAnimation)staticData.get(1);
6000cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast2 = (SpriteAnimation)staticData.get(2);
6001cfd74d65d832137e20e193c960802afba73b5d38sm        final SpriteAnimation smallBlast3 = (SpriteAnimation)staticData.get(3);
6002cfd74d65d832137e20e193c960802afba73b5d38sm
6003cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.addAnimation(idle);
6004cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.playAnimation(0);
6005cfd74d65d832137e20e193c960802afba73b5d38sm
6006cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast1Render = (RenderComponent)allocateComponent(RenderComponent.class);
6007cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6008cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast1Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6009cfd74d65d832137e20e193c960802afba73b5d38sm		blast1Sprite.setSize(32, 32);
6010cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.setRenderComponent(blast1Render);
6011cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Render.setDrawOffset(40, 50);
6012cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.addAnimation(smallBlast1);
6013cfd74d65d832137e20e193c960802afba73b5d38sm        blast1Sprite.playAnimation(0);
6014cfd74d65d832137e20e193c960802afba73b5d38sm
6015cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast2Render = (RenderComponent)allocateComponent(RenderComponent.class);
6016cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6017cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast2Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6018cfd74d65d832137e20e193c960802afba73b5d38sm		blast2Sprite.setSize(32, 32);
6019cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.setRenderComponent(blast2Render);
6020cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Render.setDrawOffset(-10, 0);
6021cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.addAnimation(smallBlast2);
6022cfd74d65d832137e20e193c960802afba73b5d38sm        blast2Sprite.playAnimation(0);
6023cfd74d65d832137e20e193c960802afba73b5d38sm
6024cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent blast3Render = (RenderComponent)allocateComponent(RenderComponent.class);
6025cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6026cfd74d65d832137e20e193c960802afba73b5d38sm        SpriteComponent blast3Sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
6027cfd74d65d832137e20e193c960802afba73b5d38sm		blast3Sprite.setSize(32, 32);
6028cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.setRenderComponent(blast3Render);
6029cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Render.setDrawOffset(0, 32);
6030cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.addAnimation(smallBlast3);
6031cfd74d65d832137e20e193c960802afba73b5d38sm        blast3Sprite.playAnimation(0);
6032cfd74d65d832137e20e193c960802afba73b5d38sm
6033cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6034cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(Math.max(
6035cfd74d65d832137e20e193c960802afba73b5d38sm                Math.max(
6036cfd74d65d832137e20e193c960802afba73b5d38sm                        Math.max(idle.getLength(), smallBlast1.getLength()),
6037cfd74d65d832137e20e193c960802afba73b5d38sm                        smallBlast2.getLength()),
6038cfd74d65d832137e20e193c960802afba73b5d38sm                smallBlast3.getLength()));
6039cfd74d65d832137e20e193c960802afba73b5d38sm
6040cfd74d65d832137e20e193c960802afba73b5d38sm        DynamicCollisionComponent dynamicCollision =
6041cfd74d65d832137e20e193c960802afba73b5d38sm            (DynamicCollisionComponent)allocateComponent(DynamicCollisionComponent.class);
6042cfd74d65d832137e20e193c960802afba73b5d38sm        sprite.setCollisionComponent(dynamicCollision);
6043cfd74d65d832137e20e193c960802afba73b5d38sm
6044cfd74d65d832137e20e193c960802afba73b5d38sm        PlaySingleSoundComponent soundEffect = (PlaySingleSoundComponent)allocateComponent(PlaySingleSoundComponent.class);
6045cfd74d65d832137e20e193c960802afba73b5d38sm        soundEffect.setSound(sSystemRegistry.soundSystem.load(R.raw.quick_explosion));
6046cfd74d65d832137e20e193c960802afba73b5d38sm
6047cfd74d65d832137e20e193c960802afba73b5d38sm
6048cfd74d65d832137e20e193c960802afba73b5d38sm
6049cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.PLAYER;  // Maybe this should be an argument to this function.
6050cfd74d65d832137e20e193c960802afba73b5d38sm
6051cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(dynamicCollision);
6052cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6053cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
6054cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(sprite);
6055cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(soundEffect);
6056cfd74d65d832137e20e193c960802afba73b5d38sm
6057cfd74d65d832137e20e193c960802afba73b5d38sm
6058cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast1Render);
6059cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast1Sprite);
6060cfd74d65d832137e20e193c960802afba73b5d38sm
6061cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast2Render);
6062cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast2Sprite);
6063cfd74d65d832137e20e193c960802afba73b5d38sm
6064cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast3Render);
6065cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(blast3Sprite);
6066cfd74d65d832137e20e193c960802afba73b5d38sm
6067cfd74d65d832137e20e193c960802afba73b5d38sm
6068cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6069cfd74d65d832137e20e193c960802afba73b5d38sm    }
6070cfd74d65d832137e20e193c960802afba73b5d38sm
6071cfd74d65d832137e20e193c960802afba73b5d38sm
6072cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGhostNPC(float positionX, float positionY) {
6073cfd74d65d832137e20e193c960802afba73b5d38sm
6074cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6075cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6076cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
6077cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
6078cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
6079cfd74d65d832137e20e193c960802afba73b5d38sm
6080cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GHOST_NPC);
6081cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6082cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
6083cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6084cfd74d65d832137e20e193c960802afba73b5d38sm
6085cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
6086cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6087cfd74d65d832137e20e193c960802afba73b5d38sm
6088cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
6089cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6090cfd74d65d832137e20e193c960802afba73b5d38sm
6091cfd74d65d832137e20e193c960802afba73b5d38sm
6092cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GHOST_NPC, staticData);
6093cfd74d65d832137e20e193c960802afba73b5d38sm        }
6094cfd74d65d832137e20e193c960802afba73b5d38sm
6095cfd74d65d832137e20e193c960802afba73b5d38sm        NPCComponent patrol = (NPCComponent)allocateComponent(NPCComponent.class);
6096cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent life = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6097cfd74d65d832137e20e193c960802afba73b5d38sm
6098cfd74d65d832137e20e193c960802afba73b5d38sm        object.team = Team.NONE;
6099cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6100cfd74d65d832137e20e193c960802afba73b5d38sm
6101cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(patrol);
6102cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(life);
6103cfd74d65d832137e20e193c960802afba73b5d38sm
6104cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GHOST_NPC, object, null);
6105cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6106cfd74d65d832137e20e193c960802afba73b5d38sm    }
6107cfd74d65d832137e20e193c960802afba73b5d38sm
6108cfd74d65d832137e20e193c960802afba73b5d38sm    private GameObject spawnCameraBias(float positionX, float positionY) {
6109cfd74d65d832137e20e193c960802afba73b5d38sm    	GameObject object = mGameObjectPool.allocate();
6110cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6111cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6112cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
6113cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
6114cfd74d65d832137e20e193c960802afba73b5d38sm
6115cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CAMERA_BIAS);
6116cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6117cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 1;
6118cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6119cfd74d65d832137e20e193c960802afba73b5d38sm
6120cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent bias = allocateComponent(CameraBiasComponent.class);
6121cfd74d65d832137e20e193c960802afba73b5d38sm
6122cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(bias);
6123cfd74d65d832137e20e193c960802afba73b5d38sm
6124cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.CAMERA_BIAS, staticData);
6125cfd74d65d832137e20e193c960802afba73b5d38sm        }
6126cfd74d65d832137e20e193c960802afba73b5d38sm
6127cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.CAMERA_BIAS, object, null);
6128cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6129cfd74d65d832137e20e193c960802afba73b5d38sm	}
6130cfd74d65d832137e20e193c960802afba73b5d38sm
6131cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectSmokeBig(float positionX, float positionY) {
6132cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6133cfd74d65d832137e20e193c960802afba73b5d38sm
61349d4cc2572d37983607df38b0f4216ed76ac51814sm        GameObject object = null;
61359d4cc2572d37983607df38b0f4216ed76ac51814sm        // This is just an effect, so we can live without it if our pools are exhausted.
61369d4cc2572d37983607df38b0f4216ed76ac51814sm        if (componentAvailable(RenderComponent.class, 1)) {
61379d4cc2572d37983607df38b0f4216ed76ac51814sm        	object = mGameObjectPool.allocate();
61389d4cc2572d37983607df38b0f4216ed76ac51814sm
61399d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.getPosition().set(positionX, positionY);
61409d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.activationRadius = mTightActivationRadius;
61419d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.width = 32;
61429d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.height = 32;
61439d4cc2572d37983607df38b0f4216ed76ac51814sm
61449d4cc2572d37983607df38b0f4216ed76ac51814sm	        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_BIG);
61459d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (staticData == null) {
61469d4cc2572d37983607df38b0f4216ed76ac51814sm	            final int staticObjectCount = 6;
61479d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
61489d4cc2572d37983607df38b0f4216ed76ac51814sm
61499d4cc2572d37983607df38b0f4216ed76ac51814sm	            GameComponent movement = allocateComponent(MovementComponent.class);
61509d4cc2572d37983607df38b0f4216ed76ac51814sm
61519d4cc2572d37983607df38b0f4216ed76ac51814sm
61529d4cc2572d37983607df38b0f4216ed76ac51814sm	            AnimationFrame frame2 = new AnimationFrame(
61539d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big02),
61549d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null);
61559d4cc2572d37983607df38b0f4216ed76ac51814sm
61569d4cc2572d37983607df38b0f4216ed76ac51814sm	            AnimationFrame frame3 = new AnimationFrame(
61579d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big03),
61589d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null);
61599d4cc2572d37983607df38b0f4216ed76ac51814sm
61609d4cc2572d37983607df38b0f4216ed76ac51814sm	            AnimationFrame frame4 = new AnimationFrame(
61619d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big04),
61629d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null);
61639d4cc2572d37983607df38b0f4216ed76ac51814sm
61649d4cc2572d37983607df38b0f4216ed76ac51814sm	            AnimationFrame frame5 = new AnimationFrame(
61659d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big05),
61669d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null);
61679d4cc2572d37983607df38b0f4216ed76ac51814sm
61689d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle = new SpriteAnimation(0, 5);
61699d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
61709d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
61719d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 10), null, null));
61729d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(frame2);
61739d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(frame3);
61749d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(frame4);
61759d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(frame5);
61769d4cc2572d37983607df38b0f4216ed76ac51814sm
61779d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle2 = new SpriteAnimation(1, 5);
61789d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle2.addFrame(new AnimationFrame(
61799d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
61809d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 13), null, null));
61819d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle2.addFrame(frame2);
61829d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle2.addFrame(frame3);
61839d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle2.addFrame(frame4);
61849d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle2.addFrame(frame5);
61859d4cc2572d37983607df38b0f4216ed76ac51814sm
61869d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle3 = new SpriteAnimation(2, 5);
61879d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle3.addFrame(new AnimationFrame(
61889d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
61899d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 8), null, null));
61909d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle3.addFrame(frame2);
61919d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle3.addFrame(frame3);
61929d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle3.addFrame(frame4);
61939d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle3.addFrame(frame5);
61949d4cc2572d37983607df38b0f4216ed76ac51814sm
61959d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle4 = new SpriteAnimation(3, 5);
61969d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle4.addFrame(new AnimationFrame(
61979d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
61989d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 5), null, null));
61999d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle4.addFrame(frame2);
62009d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle4.addFrame(frame3);
62019d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle4.addFrame(frame4);
62029d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle4.addFrame(frame5);
62039d4cc2572d37983607df38b0f4216ed76ac51814sm
62049d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle5 = new SpriteAnimation(4, 5);
62059d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle5.addFrame(new AnimationFrame(
62069d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_big01),
62079d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 15), null, null));
62089d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle5.addFrame(frame2);
62099d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle5.addFrame(frame3);
62109d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle5.addFrame(frame4);
62119d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle5.addFrame(frame5);
62129d4cc2572d37983607df38b0f4216ed76ac51814sm
62139d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle);
62149d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle2);
62159d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle3);
62169d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle4);
62179d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle5);
62189d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(movement);
62199d4cc2572d37983607df38b0f4216ed76ac51814sm	            setStaticData(GameObjectType.SMOKE_BIG, staticData);
62209d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
62219d4cc2572d37983607df38b0f4216ed76ac51814sm
62229d4cc2572d37983607df38b0f4216ed76ac51814sm	        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
62239d4cc2572d37983607df38b0f4216ed76ac51814sm	        render.setPriority(SortConstants.EFFECT);
62249d4cc2572d37983607df38b0f4216ed76ac51814sm
62259d4cc2572d37983607df38b0f4216ed76ac51814sm	        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
62269d4cc2572d37983607df38b0f4216ed76ac51814sm	        sprite.setSize((int)object.width, (int)object.height);
62279d4cc2572d37983607df38b0f4216ed76ac51814sm	        sprite.setRenderComponent(render);
62289d4cc2572d37983607df38b0f4216ed76ac51814sm
62299d4cc2572d37983607df38b0f4216ed76ac51814sm	        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
62309d4cc2572d37983607df38b0f4216ed76ac51814sm	        lifetime.setDieWhenInvisible(true);
62319d4cc2572d37983607df38b0f4216ed76ac51814sm
62329d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.destroyOnDeactivation = true;
62339d4cc2572d37983607df38b0f4216ed76ac51814sm
62349d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(lifetime);
62359d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(render);
62369d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(sprite);
62379d4cc2572d37983607df38b0f4216ed76ac51814sm
62389d4cc2572d37983607df38b0f4216ed76ac51814sm	        addStaticData(GameObjectType.SMOKE_BIG, object, sprite);
62399d4cc2572d37983607df38b0f4216ed76ac51814sm
62409d4cc2572d37983607df38b0f4216ed76ac51814sm	        final int animIndex = (int)(Math.random() * sprite.getAnimationCount());
62419d4cc2572d37983607df38b0f4216ed76ac51814sm	        final SpriteAnimation idle = sprite.findAnimation(animIndex);
62429d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (idle != null) {
62439d4cc2572d37983607df38b0f4216ed76ac51814sm	            lifetime.setTimeUntilDeath(idle.getLength());
62449d4cc2572d37983607df38b0f4216ed76ac51814sm	            sprite.playAnimation(animIndex);
62459d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
62469d4cc2572d37983607df38b0f4216ed76ac51814sm
6247cfd74d65d832137e20e193c960802afba73b5d38sm
6248cfd74d65d832137e20e193c960802afba73b5d38sm        }
6249cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6250cfd74d65d832137e20e193c960802afba73b5d38sm    }
6251cfd74d65d832137e20e193c960802afba73b5d38sm
6252cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectSmokeSmall(float positionX, float positionY) {
6253cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6254cfd74d65d832137e20e193c960802afba73b5d38sm
62559d4cc2572d37983607df38b0f4216ed76ac51814sm        GameObject object = null;
62569d4cc2572d37983607df38b0f4216ed76ac51814sm        // This is just an effect, so we can live without it if our pools are exhausted.
62579d4cc2572d37983607df38b0f4216ed76ac51814sm        if (componentAvailable(RenderComponent.class, 1)) {
62589d4cc2572d37983607df38b0f4216ed76ac51814sm	        object = mGameObjectPool.allocate();
62599d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.getPosition().set(positionX, positionY);
62609d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.activationRadius = mAlwaysActive;
62619d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.width = 16;
62629d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.height = 16;
62639d4cc2572d37983607df38b0f4216ed76ac51814sm
62649d4cc2572d37983607df38b0f4216ed76ac51814sm	        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.SMOKE_SMALL);
62659d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (staticData == null) {
62669d4cc2572d37983607df38b0f4216ed76ac51814sm	            final int staticObjectCount = 2;
62679d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
62689d4cc2572d37983607df38b0f4216ed76ac51814sm
62699d4cc2572d37983607df38b0f4216ed76ac51814sm	            GameComponent movement = allocateComponent(MovementComponent.class);
62709d4cc2572d37983607df38b0f4216ed76ac51814sm
62719d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation idle = new SpriteAnimation(0, 5);
62729d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
62739d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small01),
62749d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 10), null, null));
62759d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
62769d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small02),
62779d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
62789d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
62799d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small03),
62809d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
62819d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
62829d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small04),
62839d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
62849d4cc2572d37983607df38b0f4216ed76ac51814sm	            idle.addFrame(new AnimationFrame(
62859d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_smoke_small05),
62869d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
62879d4cc2572d37983607df38b0f4216ed76ac51814sm
62889d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(idle);
62899d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(movement);
62909d4cc2572d37983607df38b0f4216ed76ac51814sm	            setStaticData(GameObjectType.SMOKE_SMALL, staticData);
62919d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
62929d4cc2572d37983607df38b0f4216ed76ac51814sm
62939d4cc2572d37983607df38b0f4216ed76ac51814sm	        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
62949d4cc2572d37983607df38b0f4216ed76ac51814sm	        render.setPriority(SortConstants.EFFECT);
62959d4cc2572d37983607df38b0f4216ed76ac51814sm
62969d4cc2572d37983607df38b0f4216ed76ac51814sm	        SpriteComponent sprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
62979d4cc2572d37983607df38b0f4216ed76ac51814sm	        sprite.setSize((int)object.width, (int)object.height);
62989d4cc2572d37983607df38b0f4216ed76ac51814sm	        sprite.setRenderComponent(render);
62999d4cc2572d37983607df38b0f4216ed76ac51814sm
63009d4cc2572d37983607df38b0f4216ed76ac51814sm	        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
63019d4cc2572d37983607df38b0f4216ed76ac51814sm	        lifetime.setDieWhenInvisible(true);
63029d4cc2572d37983607df38b0f4216ed76ac51814sm
63039d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.destroyOnDeactivation = true;
63049d4cc2572d37983607df38b0f4216ed76ac51814sm
63059d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(lifetime);
63069d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(render);
63079d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(sprite);
63089d4cc2572d37983607df38b0f4216ed76ac51814sm
63099d4cc2572d37983607df38b0f4216ed76ac51814sm	        addStaticData(GameObjectType.SMOKE_SMALL, object, sprite);
63109d4cc2572d37983607df38b0f4216ed76ac51814sm
63119d4cc2572d37983607df38b0f4216ed76ac51814sm	        final SpriteAnimation idle = sprite.findAnimation(0);
63129d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (idle != null) {
63139d4cc2572d37983607df38b0f4216ed76ac51814sm	            lifetime.setTimeUntilDeath(idle.getLength());
63149d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
63159d4cc2572d37983607df38b0f4216ed76ac51814sm
63169d4cc2572d37983607df38b0f4216ed76ac51814sm	        sprite.playAnimation(0);
6317cfd74d65d832137e20e193c960802afba73b5d38sm        }
6318cfd74d65d832137e20e193c960802afba73b5d38sm
6319cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6320cfd74d65d832137e20e193c960802afba73b5d38sm    }
6321cfd74d65d832137e20e193c960802afba73b5d38sm
6322cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnEffectCrushFlash(float positionX, float positionY) {
6323cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
6324cfd74d65d832137e20e193c960802afba73b5d38sm
63259d4cc2572d37983607df38b0f4216ed76ac51814sm        GameObject object = null;
63269d4cc2572d37983607df38b0f4216ed76ac51814sm        // This is just an effect, so we can live without it if our pools are exhausted.
63279d4cc2572d37983607df38b0f4216ed76ac51814sm        if (componentAvailable(RenderComponent.class, 1)) {
63289d4cc2572d37983607df38b0f4216ed76ac51814sm	        object = mGameObjectPool.allocate();
63299d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.getPosition().set(positionX, positionY);
63309d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.activationRadius = mAlwaysActive;
63319d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.width = 64;
63329d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.height = 64;
63339d4cc2572d37983607df38b0f4216ed76ac51814sm
63349d4cc2572d37983607df38b0f4216ed76ac51814sm	        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.CRUSH_FLASH);
63359d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (staticData == null) {
63369d4cc2572d37983607df38b0f4216ed76ac51814sm	            final int staticObjectCount = 2;
63379d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
63389d4cc2572d37983607df38b0f4216ed76ac51814sm
63399d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation back = new SpriteAnimation(0, 3);
63409d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
63419d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back01),
63429d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63439d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
63449d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back02),
63459d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63469d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
63479d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back03),
63489d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63499d4cc2572d37983607df38b0f4216ed76ac51814sm
63509d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation front = new SpriteAnimation(1, 7);
63519d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63529d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front01),
63539d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63549d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63559d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front02),
63569d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63579d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63589d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front03),
63599d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63609d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63619d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front04),
63629d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63639d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63649d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front05),
63659d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63669d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63679d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front06),
63689d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63699d4cc2572d37983607df38b0f4216ed76ac51814sm	            front.addFrame(new AnimationFrame(
63709d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_front07),
63719d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
63729d4cc2572d37983607df38b0f4216ed76ac51814sm
63739d4cc2572d37983607df38b0f4216ed76ac51814sm
63749d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(back);
63759d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(front);
63769d4cc2572d37983607df38b0f4216ed76ac51814sm	            setStaticData(GameObjectType.CRUSH_FLASH, staticData);
63779d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
63789d4cc2572d37983607df38b0f4216ed76ac51814sm
63799d4cc2572d37983607df38b0f4216ed76ac51814sm
63809d4cc2572d37983607df38b0f4216ed76ac51814sm	        RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class);
63819d4cc2572d37983607df38b0f4216ed76ac51814sm	        backRender.setPriority(SortConstants.EFFECT);
63829d4cc2572d37983607df38b0f4216ed76ac51814sm
63839d4cc2572d37983607df38b0f4216ed76ac51814sm	        SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
63849d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.setSize((int)object.width, (int)object.height);
63859d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.setRenderComponent(backRender);
63869d4cc2572d37983607df38b0f4216ed76ac51814sm
63879d4cc2572d37983607df38b0f4216ed76ac51814sm	        RenderComponent foreRender = (RenderComponent)allocateComponent(RenderComponent.class);
63889d4cc2572d37983607df38b0f4216ed76ac51814sm	        foreRender.setPriority(SortConstants.FOREGROUND_EFFECT);
63899d4cc2572d37983607df38b0f4216ed76ac51814sm
63909d4cc2572d37983607df38b0f4216ed76ac51814sm	        SpriteComponent foreSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
63919d4cc2572d37983607df38b0f4216ed76ac51814sm	        foreSprite.setSize((int)object.width, (int)object.height);
63929d4cc2572d37983607df38b0f4216ed76ac51814sm	        foreSprite.setRenderComponent(foreRender);
63939d4cc2572d37983607df38b0f4216ed76ac51814sm
63949d4cc2572d37983607df38b0f4216ed76ac51814sm	        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
63959d4cc2572d37983607df38b0f4216ed76ac51814sm
63969d4cc2572d37983607df38b0f4216ed76ac51814sm
63979d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(lifetime);
63989d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(backRender);
63999d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(foreRender);
64009d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(foreSprite);
64019d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(backSprite);
64029d4cc2572d37983607df38b0f4216ed76ac51814sm
64039d4cc2572d37983607df38b0f4216ed76ac51814sm	        addStaticData(GameObjectType.CRUSH_FLASH, object, backSprite);
64049d4cc2572d37983607df38b0f4216ed76ac51814sm	        addStaticData(GameObjectType.CRUSH_FLASH, null, foreSprite);
64059d4cc2572d37983607df38b0f4216ed76ac51814sm
64069d4cc2572d37983607df38b0f4216ed76ac51814sm
64079d4cc2572d37983607df38b0f4216ed76ac51814sm	        final SpriteAnimation idle = foreSprite.findAnimation(1);
64089d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (idle != null) {
64099d4cc2572d37983607df38b0f4216ed76ac51814sm	            lifetime.setTimeUntilDeath(idle.getLength());
64109d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
64119d4cc2572d37983607df38b0f4216ed76ac51814sm
64129d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.playAnimation(0);
64139d4cc2572d37983607df38b0f4216ed76ac51814sm	        foreSprite.playAnimation(1);
6414cfd74d65d832137e20e193c960802afba73b5d38sm        }
6415cfd74d65d832137e20e193c960802afba73b5d38sm
64169d4cc2572d37983607df38b0f4216ed76ac51814sm        return object;
64179d4cc2572d37983607df38b0f4216ed76ac51814sm    }
6418cfd74d65d832137e20e193c960802afba73b5d38sm
64199d4cc2572d37983607df38b0f4216ed76ac51814sm    public GameObject spawnEffectFlash(float positionX, float positionY) {
64209d4cc2572d37983607df38b0f4216ed76ac51814sm        TextureLibrary textureLibrary = sSystemRegistry.longTermTextureLibrary;
64219d4cc2572d37983607df38b0f4216ed76ac51814sm        GameObject object = null;
64229d4cc2572d37983607df38b0f4216ed76ac51814sm        // This is just an effect, so we can live without it if our pools are exhausted.
64239d4cc2572d37983607df38b0f4216ed76ac51814sm        if (componentAvailable(RenderComponent.class, 1)) {
64249d4cc2572d37983607df38b0f4216ed76ac51814sm	        object = mGameObjectPool.allocate();
64259d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.getPosition().set(positionX, positionY);
64269d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.activationRadius = mAlwaysActive;
64279d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.width = 64;
64289d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.height = 64;
64299d4cc2572d37983607df38b0f4216ed76ac51814sm
64309d4cc2572d37983607df38b0f4216ed76ac51814sm	        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.FLASH);
64319d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (staticData == null) {
64329d4cc2572d37983607df38b0f4216ed76ac51814sm	            final int staticObjectCount = 1;
64339d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
64349d4cc2572d37983607df38b0f4216ed76ac51814sm
64359d4cc2572d37983607df38b0f4216ed76ac51814sm	            SpriteAnimation back = new SpriteAnimation(0, 3);
64369d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
64379d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back01),
64389d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
64399d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
64409d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back02),
64419d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
64429d4cc2572d37983607df38b0f4216ed76ac51814sm	            back.addFrame(new AnimationFrame(
64439d4cc2572d37983607df38b0f4216ed76ac51814sm	                    textureLibrary.getTextureByResource(R.drawable.effect_crush_back03),
64449d4cc2572d37983607df38b0f4216ed76ac51814sm	                    Utils.framesToTime(24, 1), null, null));
64459d4cc2572d37983607df38b0f4216ed76ac51814sm
64469d4cc2572d37983607df38b0f4216ed76ac51814sm
64479d4cc2572d37983607df38b0f4216ed76ac51814sm	            staticData.add(back);
64489d4cc2572d37983607df38b0f4216ed76ac51814sm	            setStaticData(GameObjectType.FLASH, staticData);
64499d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
64509d4cc2572d37983607df38b0f4216ed76ac51814sm
64519d4cc2572d37983607df38b0f4216ed76ac51814sm
64529d4cc2572d37983607df38b0f4216ed76ac51814sm	        RenderComponent backRender = (RenderComponent)allocateComponent(RenderComponent.class);
64539d4cc2572d37983607df38b0f4216ed76ac51814sm	        backRender.setPriority(SortConstants.EFFECT);
64549d4cc2572d37983607df38b0f4216ed76ac51814sm
64559d4cc2572d37983607df38b0f4216ed76ac51814sm	        SpriteComponent backSprite = (SpriteComponent)allocateComponent(SpriteComponent.class);
64569d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.setSize((int)object.width, (int)object.height);
64579d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.setRenderComponent(backRender);
64589d4cc2572d37983607df38b0f4216ed76ac51814sm
64599d4cc2572d37983607df38b0f4216ed76ac51814sm
64609d4cc2572d37983607df38b0f4216ed76ac51814sm
64619d4cc2572d37983607df38b0f4216ed76ac51814sm	        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
64629d4cc2572d37983607df38b0f4216ed76ac51814sm
64639d4cc2572d37983607df38b0f4216ed76ac51814sm
64649d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(lifetime);
64659d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(backRender);
64669d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(backSprite);
64679d4cc2572d37983607df38b0f4216ed76ac51814sm
64689d4cc2572d37983607df38b0f4216ed76ac51814sm	        addStaticData(GameObjectType.FLASH, object, backSprite);
64699d4cc2572d37983607df38b0f4216ed76ac51814sm
64709d4cc2572d37983607df38b0f4216ed76ac51814sm
64719d4cc2572d37983607df38b0f4216ed76ac51814sm	        final SpriteAnimation idle = backSprite.findAnimation(0);
64729d4cc2572d37983607df38b0f4216ed76ac51814sm	        if (idle != null) {
64739d4cc2572d37983607df38b0f4216ed76ac51814sm	            lifetime.setTimeUntilDeath(idle.getLength());
64749d4cc2572d37983607df38b0f4216ed76ac51814sm	        }
64759d4cc2572d37983607df38b0f4216ed76ac51814sm
64769d4cc2572d37983607df38b0f4216ed76ac51814sm	        backSprite.playAnimation(0);
6477cfd74d65d832137e20e193c960802afba73b5d38sm        }
6478cfd74d65d832137e20e193c960802afba73b5d38sm
6479cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6480cfd74d65d832137e20e193c960802afba73b5d38sm    }
6481cfd74d65d832137e20e193c960802afba73b5d38sm
6482cfd74d65d832137e20e193c960802afba73b5d38sm
64839d4cc2572d37983607df38b0f4216ed76ac51814sm    public GameObject spawnFrameRateWatcher(float positionX, float positionY) {
64849d4cc2572d37983607df38b0f4216ed76ac51814sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
64859d4cc2572d37983607df38b0f4216ed76ac51814sm        ContextParameters params = sSystemRegistry.contextParameters;
64869d4cc2572d37983607df38b0f4216ed76ac51814sm
6487cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
64889d4cc2572d37983607df38b0f4216ed76ac51814sm        object.getPosition().set(250, 0);	// HACK!
6489cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mAlwaysActive;
64909d4cc2572d37983607df38b0f4216ed76ac51814sm        object.width = params.gameWidth;
64919d4cc2572d37983607df38b0f4216ed76ac51814sm        object.height = params.gameHeight;
6492cfd74d65d832137e20e193c960802afba73b5d38sm
64939d4cc2572d37983607df38b0f4216ed76ac51814sm        DrawableBitmap indicator = new DrawableBitmap(
64949d4cc2572d37983607df38b0f4216ed76ac51814sm                textureLibrary.allocateTexture(R.drawable.framerate_warning),
64959d4cc2572d37983607df38b0f4216ed76ac51814sm                (int)object.width,
64969d4cc2572d37983607df38b0f4216ed76ac51814sm                (int)object.height);
6497cfd74d65d832137e20e193c960802afba73b5d38sm
64989d4cc2572d37983607df38b0f4216ed76ac51814sm        indicator.setCrop(0, 8, 8, 8); // hack!  this shouldn't be hard-coded.
6499cfd74d65d832137e20e193c960802afba73b5d38sm
65009d4cc2572d37983607df38b0f4216ed76ac51814sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
65019d4cc2572d37983607df38b0f4216ed76ac51814sm        render.setPriority(SortConstants.OVERLAY);
65029d4cc2572d37983607df38b0f4216ed76ac51814sm        render.setCameraRelative(false);
6503cfd74d65d832137e20e193c960802afba73b5d38sm
65049d4cc2572d37983607df38b0f4216ed76ac51814sm        FrameRateWatcherComponent watcher = (FrameRateWatcherComponent)allocateComponent(FrameRateWatcherComponent.class);
65059d4cc2572d37983607df38b0f4216ed76ac51814sm        watcher.setup(render, indicator);
6506cfd74d65d832137e20e193c960802afba73b5d38sm
65079d4cc2572d37983607df38b0f4216ed76ac51814sm        object.add(render);
65089d4cc2572d37983607df38b0f4216ed76ac51814sm        object.add(watcher);
6509cfd74d65d832137e20e193c960802afba73b5d38sm
65109d4cc2572d37983607df38b0f4216ed76ac51814sm
6511cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6512cfd74d65d832137e20e193c960802afba73b5d38sm    }
6513cfd74d65d832137e20e193c960802afba73b5d38sm
6514cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBreakableBlockPiece(float positionX, float positionY) {
6515cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
6516cfd74d65d832137e20e193c960802afba73b5d38sm
6517cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6518cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6519cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6520cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 16;
6521cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 16;
6522cfd74d65d832137e20e193c960802afba73b5d38sm
6523cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE);
6524cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6525cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 4;
6526cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6527cfd74d65d832137e20e193c960802afba73b5d38sm
6528cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent gravity = allocateComponent(GravityComponent.class);
6529cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6530cfd74d65d832137e20e193c960802afba73b5d38sm
6531cfd74d65d832137e20e193c960802afba73b5d38sm            SimplePhysicsComponent physics = (SimplePhysicsComponent)allocateComponent(SimplePhysicsComponent.class);
6532cfd74d65d832137e20e193c960802afba73b5d38sm            physics.setBounciness(0.3f);
6533cfd74d65d832137e20e193c960802afba73b5d38sm
6534cfd74d65d832137e20e193c960802afba73b5d38sm            DrawableBitmap piece = new DrawableBitmap(
6535cfd74d65d832137e20e193c960802afba73b5d38sm                    textureLibrary.getTextureByResource(R.drawable.object_debris_piece),
6536cfd74d65d832137e20e193c960802afba73b5d38sm                    (int)object.width,
6537cfd74d65d832137e20e193c960802afba73b5d38sm                    (int)object.height);
6538cfd74d65d832137e20e193c960802afba73b5d38sm
6539cfd74d65d832137e20e193c960802afba73b5d38sm
6540cfd74d65d832137e20e193c960802afba73b5d38sm            RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6541cfd74d65d832137e20e193c960802afba73b5d38sm            render.setPriority(SortConstants.GENERAL_OBJECT);
6542cfd74d65d832137e20e193c960802afba73b5d38sm            render.setDrawable(piece);
6543cfd74d65d832137e20e193c960802afba73b5d38sm
6544cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(render);
6545cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6546cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(gravity);
6547cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(physics);
6548cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, staticData);
6549cfd74d65d832137e20e193c960802afba73b5d38sm        }
6550cfd74d65d832137e20e193c960802afba73b5d38sm
6551cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6552cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(3.0f);
6553cfd74d65d832137e20e193c960802afba73b5d38sm
6554cfd74d65d832137e20e193c960802afba73b5d38sm        BackgroundCollisionComponent bgcollision = (BackgroundCollisionComponent)allocateComponent(BackgroundCollisionComponent.class);
6555cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setSize(12, 12);
6556cfd74d65d832137e20e193c960802afba73b5d38sm        bgcollision.setOffset(2, 2);
6557cfd74d65d832137e20e193c960802afba73b5d38sm
6558cfd74d65d832137e20e193c960802afba73b5d38sm
6559cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6560cfd74d65d832137e20e193c960802afba73b5d38sm
6561cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6562cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(bgcollision);
6563cfd74d65d832137e20e193c960802afba73b5d38sm
6564cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.BREAKABLE_BLOCK_PIECE, object, null);
6565cfd74d65d832137e20e193c960802afba73b5d38sm
6566cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6567cfd74d65d832137e20e193c960802afba73b5d38sm    }
6568cfd74d65d832137e20e193c960802afba73b5d38sm
6569cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnBreakableBlockPieceSpawner(float positionX, float positionY) {
6570cfd74d65d832137e20e193c960802afba73b5d38sm
6571cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6572cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6573cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6574cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 1;
6575cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 1;
6576cfd74d65d832137e20e193c960802afba73b5d38sm
6577cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6578cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6579cfd74d65d832137e20e193c960802afba73b5d38sm
6580cfd74d65d832137e20e193c960802afba73b5d38sm        LaunchProjectileComponent pieceSpawner
6581cfd74d65d832137e20e193c960802afba73b5d38sm            = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6582cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setObjectTypeToSpawn(GameObjectType.BREAKABLE_BLOCK_PIECE);
6583cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setDelayBeforeFirstSet(0.0f);
6584cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setSetsPerActivation(1);
6585cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setShotsPerSet(3);
6586cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setDelayBetweenShots(0.0f);
6587cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setOffsetX(16);
6588cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setOffsetY(16);
6589cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setVelocityX(600.0f);
6590cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setVelocityY(-1000.0f);
6591cfd74d65d832137e20e193c960802afba73b5d38sm        pieceSpawner.setThetaError(1.0f);
6592cfd74d65d832137e20e193c960802afba73b5d38sm
6593cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6594cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6595cfd74d65d832137e20e193c960802afba73b5d38sm
6596cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6597cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(pieceSpawner);
6598cfd74d65d832137e20e193c960802afba73b5d38sm
6599cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6600cfd74d65d832137e20e193c960802afba73b5d38sm    }
6601cfd74d65d832137e20e193c960802afba73b5d38sm
6602cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnSmokePoof(float positionX, float positionY) {
6603cfd74d65d832137e20e193c960802afba73b5d38sm
66049d4cc2572d37983607df38b0f4216ed76ac51814sm    	GameObject object = null;
66059d4cc2572d37983607df38b0f4216ed76ac51814sm        // This is just an effect, so we can live without it if our pools are exhausted.
66069d4cc2572d37983607df38b0f4216ed76ac51814sm        if (componentAvailable(LaunchProjectileComponent.class, 2)) {
66079d4cc2572d37983607df38b0f4216ed76ac51814sm	        object = mGameObjectPool.allocate();
66089d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.getPosition().set(positionX, positionY);
66099d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.activationRadius = mTightActivationRadius;
66109d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.width = 1;
66119d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.height = 1;
66129d4cc2572d37983607df38b0f4216ed76ac51814sm
66139d4cc2572d37983607df38b0f4216ed76ac51814sm	        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
66149d4cc2572d37983607df38b0f4216ed76ac51814sm	        lifetime.setTimeUntilDeath(0.5f);
66159d4cc2572d37983607df38b0f4216ed76ac51814sm
66169d4cc2572d37983607df38b0f4216ed76ac51814sm	        LaunchProjectileComponent smokeGun
66179d4cc2572d37983607df38b0f4216ed76ac51814sm		        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
66189d4cc2572d37983607df38b0f4216ed76ac51814sm	        smokeGun.setSetsPerActivation(1);
66199d4cc2572d37983607df38b0f4216ed76ac51814sm	        smokeGun.setShotsPerSet(3);
66209d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setDelayBetweenShots(0.0f);
66219d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setObjectTypeToSpawn(GameObjectType.SMOKE_BIG);
66229d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setVelocityX(200.0f);
66239d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setVelocityY(200.0f);
66249d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setOffsetX(16);
66259d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setOffsetY(16);
66269d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun.setThetaError(1.0f);
66279d4cc2572d37983607df38b0f4216ed76ac51814sm
66289d4cc2572d37983607df38b0f4216ed76ac51814sm		    LaunchProjectileComponent smokeGun2
66299d4cc2572d37983607df38b0f4216ed76ac51814sm		        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
66309d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setSetsPerActivation(1);
66319d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setShotsPerSet(3);
66329d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setDelayBetweenShots(0.0f);
66339d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setObjectTypeToSpawn(GameObjectType.SMOKE_SMALL);
66349d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setVelocityX(200.0f);
66359d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setVelocityY(200.0f);
66369d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setThetaError(1.0f);
66379d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setOffsetX(16);
66389d4cc2572d37983607df38b0f4216ed76ac51814sm		    smokeGun2.setOffsetY(16);
66399d4cc2572d37983607df38b0f4216ed76ac51814sm
66409d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.life = 1;
66419d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.destroyOnDeactivation = true;
66429d4cc2572d37983607df38b0f4216ed76ac51814sm
66439d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(lifetime);
66449d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(smokeGun);
66459d4cc2572d37983607df38b0f4216ed76ac51814sm	        object.add(smokeGun2);
66469d4cc2572d37983607df38b0f4216ed76ac51814sm        }
6647cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6648cfd74d65d832137e20e193c960802afba73b5d38sm    }
6649cfd74d65d832137e20e193c960802afba73b5d38sm
6650cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGemEffect(float positionX, float positionY) {
6651cfd74d65d832137e20e193c960802afba73b5d38sm        TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary;
6652cfd74d65d832137e20e193c960802afba73b5d38sm
6653cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6654cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6655cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6656cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 32;
6657cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 32;
6658cfd74d65d832137e20e193c960802afba73b5d38sm
6659cfd74d65d832137e20e193c960802afba73b5d38sm        FixedSizeArray<BaseObject> staticData = getStaticData(GameObjectType.GEM_EFFECT);
6660cfd74d65d832137e20e193c960802afba73b5d38sm        if (staticData == null) {
6661cfd74d65d832137e20e193c960802afba73b5d38sm            final int staticObjectCount = 2;
6662cfd74d65d832137e20e193c960802afba73b5d38sm            staticData = new FixedSizeArray<BaseObject>(staticObjectCount);
6663cfd74d65d832137e20e193c960802afba73b5d38sm
6664cfd74d65d832137e20e193c960802afba73b5d38sm            GameComponent movement = allocateComponent(MovementComponent.class);
6665cfd74d65d832137e20e193c960802afba73b5d38sm
6666cfd74d65d832137e20e193c960802afba73b5d38sm            staticData.add(movement);
6667cfd74d65d832137e20e193c960802afba73b5d38sm
6668cfd74d65d832137e20e193c960802afba73b5d38sm            setStaticData(GameObjectType.GEM_EFFECT, staticData);
6669cfd74d65d832137e20e193c960802afba73b5d38sm        }
6670cfd74d65d832137e20e193c960802afba73b5d38sm
6671cfd74d65d832137e20e193c960802afba73b5d38sm        RenderComponent render = (RenderComponent)allocateComponent(RenderComponent.class);
6672cfd74d65d832137e20e193c960802afba73b5d38sm        render.setPriority(SortConstants.EFFECT);
6673cfd74d65d832137e20e193c960802afba73b5d38sm
6674cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6675cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6676cfd74d65d832137e20e193c960802afba73b5d38sm
6677cfd74d65d832137e20e193c960802afba73b5d38sm        FadeDrawableComponent fadeOut = (FadeDrawableComponent)allocateComponent(FadeDrawableComponent.class);
6678cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setupFade(1.0f, 0.0f, 0.5f, FadeDrawableComponent.LOOP_TYPE_NONE, FadeDrawableComponent.FADE_LINEAR, 0.0f);
6679cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setTexture(textureLibrary.allocateTexture(R.drawable.object_ruby01));
6680cfd74d65d832137e20e193c960802afba73b5d38sm        fadeOut.setRenderComponent(render);
6681cfd74d65d832137e20e193c960802afba73b5d38sm
6682cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6683cfd74d65d832137e20e193c960802afba73b5d38sm
6684cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6685cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(fadeOut);
6686cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(render);
6687cfd74d65d832137e20e193c960802afba73b5d38sm
6688cfd74d65d832137e20e193c960802afba73b5d38sm        addStaticData(GameObjectType.GEM_EFFECT, object, null);
6689cfd74d65d832137e20e193c960802afba73b5d38sm
6690cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6691cfd74d65d832137e20e193c960802afba73b5d38sm    }
6692cfd74d65d832137e20e193c960802afba73b5d38sm
6693cfd74d65d832137e20e193c960802afba73b5d38sm    public GameObject spawnGemEffectSpawner(float positionX, float positionY) {
6694cfd74d65d832137e20e193c960802afba73b5d38sm
6695cfd74d65d832137e20e193c960802afba73b5d38sm        GameObject object = mGameObjectPool.allocate();
6696cfd74d65d832137e20e193c960802afba73b5d38sm        object.getPosition().set(positionX, positionY);
6697cfd74d65d832137e20e193c960802afba73b5d38sm        object.activationRadius = mTightActivationRadius;
6698cfd74d65d832137e20e193c960802afba73b5d38sm        object.width = 1;
6699cfd74d65d832137e20e193c960802afba73b5d38sm        object.height = 1;
6700cfd74d65d832137e20e193c960802afba73b5d38sm
6701cfd74d65d832137e20e193c960802afba73b5d38sm        LifetimeComponent lifetime = (LifetimeComponent)allocateComponent(LifetimeComponent.class);
6702cfd74d65d832137e20e193c960802afba73b5d38sm        lifetime.setTimeUntilDeath(0.5f);
6703cfd74d65d832137e20e193c960802afba73b5d38sm
6704cfd74d65d832137e20e193c960802afba73b5d38sm        final int gems = 6;
6705cfd74d65d832137e20e193c960802afba73b5d38sm        final float angleIncrement = (float)(2.0f * Math.PI) / gems;
6706cfd74d65d832137e20e193c960802afba73b5d38sm        for (int x = 0; x < gems; x++) {
6707cfd74d65d832137e20e193c960802afba73b5d38sm	        LaunchProjectileComponent gemGun
6708cfd74d65d832137e20e193c960802afba73b5d38sm		        = (LaunchProjectileComponent)allocateComponent(LaunchProjectileComponent.class);
6709cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setSetsPerActivation(1);
6710cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setShotsPerSet(1);
6711cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setDelayBetweenShots(0.0f);
6712cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setObjectTypeToSpawn(GameObjectType.GEM_EFFECT);
6713cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setVelocityX((float)Math.sin(angleIncrement * x) * 150.0f);
6714cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setVelocityY((float)Math.cos(angleIncrement * x) * 150.0f);
6715cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setOffsetX(16);
6716cfd74d65d832137e20e193c960802afba73b5d38sm	        gemGun.setOffsetY(16);
6717cfd74d65d832137e20e193c960802afba73b5d38sm
6718cfd74d65d832137e20e193c960802afba73b5d38sm	        object.add(gemGun);
6719cfd74d65d832137e20e193c960802afba73b5d38sm        }
6720cfd74d65d832137e20e193c960802afba73b5d38sm
6721cfd74d65d832137e20e193c960802afba73b5d38sm
6722cfd74d65d832137e20e193c960802afba73b5d38sm
6723cfd74d65d832137e20e193c960802afba73b5d38sm        object.life = 1;
6724cfd74d65d832137e20e193c960802afba73b5d38sm        object.destroyOnDeactivation = true;
6725cfd74d65d832137e20e193c960802afba73b5d38sm
6726cfd74d65d832137e20e193c960802afba73b5d38sm        object.add(lifetime);
6727cfd74d65d832137e20e193c960802afba73b5d38sm
6728cfd74d65d832137e20e193c960802afba73b5d38sm
6729cfd74d65d832137e20e193c960802afba73b5d38sm        return object;
6730cfd74d65d832137e20e193c960802afba73b5d38sm    }
6731cfd74d65d832137e20e193c960802afba73b5d38sm
6732cfd74d65d832137e20e193c960802afba73b5d38sm    /** Comparator for game objects objects. */
6733cfd74d65d832137e20e193c960802afba73b5d38sm    private final static class ComponentPoolComparator implements Comparator<GameComponentPool> {
6734cfd74d65d832137e20e193c960802afba73b5d38sm        public int compare(final GameComponentPool object1, final GameComponentPool object2) {
6735cfd74d65d832137e20e193c960802afba73b5d38sm            int result = 0;
6736cfd74d65d832137e20e193c960802afba73b5d38sm            if (object1 == null && object2 != null) {
6737cfd74d65d832137e20e193c960802afba73b5d38sm                result = 1;
6738cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 == null) {
6739cfd74d65d832137e20e193c960802afba73b5d38sm                result = -1;
6740cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (object1 != null && object2 != null) {
6741cfd74d65d832137e20e193c960802afba73b5d38sm                result = object1.objectClass.hashCode() - object2.objectClass.hashCode();
6742cfd74d65d832137e20e193c960802afba73b5d38sm            }
6743cfd74d65d832137e20e193c960802afba73b5d38sm            return result;
6744cfd74d65d832137e20e193c960802afba73b5d38sm        }
6745cfd74d65d832137e20e193c960802afba73b5d38sm    }
6746cfd74d65d832137e20e193c960802afba73b5d38sm
6747cfd74d65d832137e20e193c960802afba73b5d38sm    public class GameObjectPool extends TObjectPool<GameObject> {
6748cfd74d65d832137e20e193c960802afba73b5d38sm
6749cfd74d65d832137e20e193c960802afba73b5d38sm        public GameObjectPool() {
6750cfd74d65d832137e20e193c960802afba73b5d38sm            super();
6751cfd74d65d832137e20e193c960802afba73b5d38sm        }
6752cfd74d65d832137e20e193c960802afba73b5d38sm
6753cfd74d65d832137e20e193c960802afba73b5d38sm        public GameObjectPool(int size) {
6754cfd74d65d832137e20e193c960802afba73b5d38sm            super(size);
6755cfd74d65d832137e20e193c960802afba73b5d38sm        }
6756cfd74d65d832137e20e193c960802afba73b5d38sm
6757cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
6758cfd74d65d832137e20e193c960802afba73b5d38sm        protected void fill() {
6759cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < getSize(); x++) {
6760cfd74d65d832137e20e193c960802afba73b5d38sm                getAvailable().add(new GameObject());
6761cfd74d65d832137e20e193c960802afba73b5d38sm            }
6762cfd74d65d832137e20e193c960802afba73b5d38sm        }
6763cfd74d65d832137e20e193c960802afba73b5d38sm
6764cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
6765cfd74d65d832137e20e193c960802afba73b5d38sm        public void release(Object entry) {
6766cfd74d65d832137e20e193c960802afba73b5d38sm            ((GameObject)entry).reset();
6767cfd74d65d832137e20e193c960802afba73b5d38sm            super.release(entry);
6768cfd74d65d832137e20e193c960802afba73b5d38sm        }
6769cfd74d65d832137e20e193c960802afba73b5d38sm
6770cfd74d65d832137e20e193c960802afba73b5d38sm    }
6771cfd74d65d832137e20e193c960802afba73b5d38sm}
6772cfd74d65d832137e20e193c960802afba73b5d38sm
6773