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 android.content.Context;
202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport android.os.Build;
219d4cc2572d37983607df38b0f4216ed76ac51814smimport android.view.KeyEvent;
22cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.MotionEvent;
232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport android.view.WindowManager;
24cfd74d65d832137e20e193c960802afba73b5d38smimport android.widget.Toast;
25cfd74d65d832137e20e193c960802afba73b5d38sm
26cfd74d65d832137e20e193c960802afba73b5d38sm/**
27cfd74d65d832137e20e193c960802afba73b5d38sm * High-level setup object for the AndouKun game engine.
28cfd74d65d832137e20e193c960802afba73b5d38sm * This class sets up the core game engine objects and threads.  It also passes events to the
29cfd74d65d832137e20e193c960802afba73b5d38sm * game thread from the main UI thread.
30cfd74d65d832137e20e193c960802afba73b5d38sm */
31cfd74d65d832137e20e193c960802afba73b5d38smpublic class Game extends AllocationGuard {
32cfd74d65d832137e20e193c960802afba73b5d38sm    private GameThread mGameThread;
33cfd74d65d832137e20e193c960802afba73b5d38sm    private Thread mGame;
34cfd74d65d832137e20e193c960802afba73b5d38sm    private ObjectManager mGameRoot;
35cfd74d65d832137e20e193c960802afba73b5d38sm
36cfd74d65d832137e20e193c960802afba73b5d38sm    private GameRenderer mRenderer;
37cfd74d65d832137e20e193c960802afba73b5d38sm    private GLSurfaceView mSurfaceView;
38cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mRunning;
39cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mBootstrapComplete;
40cfd74d65d832137e20e193c960802afba73b5d38sm    private LevelTree.Level mPendingLevel;
41cfd74d65d832137e20e193c960802afba73b5d38sm    private LevelTree.Level mCurrentLevel;
42cfd74d65d832137e20e193c960802afba73b5d38sm    private LevelTree.Level mLastLevel;
43cfd74d65d832137e20e193c960802afba73b5d38sm    private boolean mGLDataLoaded;
44cfd74d65d832137e20e193c960802afba73b5d38sm    private ContextParameters mContextParameters;
452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private TouchFilter mTouchFilter;
46cfd74d65d832137e20e193c960802afba73b5d38sm
47cfd74d65d832137e20e193c960802afba73b5d38sm    public Game() {
48cfd74d65d832137e20e193c960802afba73b5d38sm        super();
49cfd74d65d832137e20e193c960802afba73b5d38sm        mRunning = false;
50cfd74d65d832137e20e193c960802afba73b5d38sm        mBootstrapComplete = false;
51cfd74d65d832137e20e193c960802afba73b5d38sm        mGLDataLoaded = false;
52cfd74d65d832137e20e193c960802afba73b5d38sm        mContextParameters = new ContextParameters();
53cfd74d65d832137e20e193c960802afba73b5d38sm    }
54cfd74d65d832137e20e193c960802afba73b5d38sm
55cfd74d65d832137e20e193c960802afba73b5d38sm    /**
56cfd74d65d832137e20e193c960802afba73b5d38sm     * Creates core game objects and constructs the game engine object graph.  Note that the
57cfd74d65d832137e20e193c960802afba73b5d38sm     * game does not actually begin running after this function is called (see start() below).
58cfd74d65d832137e20e193c960802afba73b5d38sm     * Also note that textures are not loaded from the resource pack by this function, as OpenGl
59cfd74d65d832137e20e193c960802afba73b5d38sm     * isn't yet available.
60cfd74d65d832137e20e193c960802afba73b5d38sm     * @param context
61cfd74d65d832137e20e193c960802afba73b5d38sm     */
622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    public void bootstrap(Context context, int viewWidth, int viewHeight, int gameWidth, int gameHeight, int difficulty) {
63cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mBootstrapComplete) {
64cfd74d65d832137e20e193c960802afba73b5d38sm            mRenderer = new GameRenderer(context, this, gameWidth, gameHeight);
65cfd74d65d832137e20e193c960802afba73b5d38sm
66cfd74d65d832137e20e193c960802afba73b5d38sm            // Create core systems
67cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.openGLSystem = new OpenGLSystem(null);
68cfd74d65d832137e20e193c960802afba73b5d38sm
69cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.customToastSystem = new CustomToastSystem(context);
70cfd74d65d832137e20e193c960802afba73b5d38sm
71cfd74d65d832137e20e193c960802afba73b5d38sm            ContextParameters params = mContextParameters;
72cfd74d65d832137e20e193c960802afba73b5d38sm            params.viewWidth = viewWidth;
73cfd74d65d832137e20e193c960802afba73b5d38sm            params.viewHeight = viewHeight;
74cfd74d65d832137e20e193c960802afba73b5d38sm            params.gameWidth = gameWidth;
75cfd74d65d832137e20e193c960802afba73b5d38sm            params.gameHeight = gameHeight;
76cfd74d65d832137e20e193c960802afba73b5d38sm            params.viewScaleX = (float)viewWidth / gameWidth;
77cfd74d65d832137e20e193c960802afba73b5d38sm            params.viewScaleY = (float)viewHeight / gameHeight;
78cfd74d65d832137e20e193c960802afba73b5d38sm            params.context = context;
792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            params.difficulty = difficulty;
80cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.contextParameters = params;
812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            final int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            if (sdkVersion < Build.VERSION_CODES.ECLAIR) {
842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	mTouchFilter = new SingleTouchFilter();
852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            } else {
862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            	mTouchFilter = new MultiTouchFilter();
872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            }
88cfd74d65d832137e20e193c960802afba73b5d38sm
89cfd74d65d832137e20e193c960802afba73b5d38sm            // Short-term textures are cleared between levels.
90cfd74d65d832137e20e193c960802afba73b5d38sm            TextureLibrary shortTermTextureLibrary = new TextureLibrary();
91cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.shortTermTextureLibrary = shortTermTextureLibrary;
92cfd74d65d832137e20e193c960802afba73b5d38sm
93cfd74d65d832137e20e193c960802afba73b5d38sm            // Long-term textures persist between levels.
94cfd74d65d832137e20e193c960802afba73b5d38sm            TextureLibrary longTermTextureLibrary = new TextureLibrary();
95cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.longTermTextureLibrary = longTermTextureLibrary;
96cfd74d65d832137e20e193c960802afba73b5d38sm
97cfd74d65d832137e20e193c960802afba73b5d38sm            // The buffer library manages hardware VBOs.
98cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.bufferLibrary = new BufferLibrary();
99cfd74d65d832137e20e193c960802afba73b5d38sm
100cfd74d65d832137e20e193c960802afba73b5d38sm
101cfd74d65d832137e20e193c960802afba73b5d38sm
102cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.soundSystem = new SoundSystem();
103cfd74d65d832137e20e193c960802afba73b5d38sm
104cfd74d65d832137e20e193c960802afba73b5d38sm            // The root of the game graph.
105cfd74d65d832137e20e193c960802afba73b5d38sm            MainLoop gameRoot = new MainLoop();
106cfd74d65d832137e20e193c960802afba73b5d38sm
107cfd74d65d832137e20e193c960802afba73b5d38sm            InputSystem input = new InputSystem();
108cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.inputSystem = input;
1099d4cc2572d37983607df38b0f4216ed76ac51814sm            BaseObject.sSystemRegistry.registerForReset(input);
1102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
1112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            WindowManager windowMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
1122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            int rotationIndex = windowMgr.getDefaultDisplay().getOrientation();
1132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            input.setScreenRotation(rotationIndex);
114cfd74d65d832137e20e193c960802afba73b5d38sm
1159d4cc2572d37983607df38b0f4216ed76ac51814sm            InputGameInterface inputInterface = new InputGameInterface();
1169d4cc2572d37983607df38b0f4216ed76ac51814sm            gameRoot.add(inputInterface);
1179d4cc2572d37983607df38b0f4216ed76ac51814sm            BaseObject.sSystemRegistry.inputGameInterface = inputInterface;
118cfd74d65d832137e20e193c960802afba73b5d38sm
119cfd74d65d832137e20e193c960802afba73b5d38sm            LevelSystem level = new LevelSystem();
120cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.levelSystem = level;
121cfd74d65d832137e20e193c960802afba73b5d38sm
122cfd74d65d832137e20e193c960802afba73b5d38sm            CollisionSystem collision = new CollisionSystem();
123cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.collisionSystem = collision;
124cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.hitPointPool = new HitPointPool();
125cfd74d65d832137e20e193c960802afba73b5d38sm
126cfd74d65d832137e20e193c960802afba73b5d38sm            GameObjectManager gameManager = new GameObjectManager(params.viewWidth * 2);
127cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.gameObjectManager = gameManager;
128cfd74d65d832137e20e193c960802afba73b5d38sm
129cfd74d65d832137e20e193c960802afba73b5d38sm            GameObjectFactory objectFactory = new GameObjectFactory();
130cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.gameObjectFactory = objectFactory;
131cfd74d65d832137e20e193c960802afba73b5d38sm
132cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.hotSpotSystem = new HotSpotSystem();
133cfd74d65d832137e20e193c960802afba73b5d38sm
134cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.levelBuilder = new LevelBuilder();
135cfd74d65d832137e20e193c960802afba73b5d38sm
136cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.channelSystem = new ChannelSystem();
137cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.registerForReset(BaseObject.sSystemRegistry.channelSystem);
138cfd74d65d832137e20e193c960802afba73b5d38sm
139cfd74d65d832137e20e193c960802afba73b5d38sm            CameraSystem camera = new CameraSystem();
140cfd74d65d832137e20e193c960802afba73b5d38sm
141cfd74d65d832137e20e193c960802afba73b5d38sm
142cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.cameraSystem = camera;
143cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.registerForReset(camera);
144cfd74d65d832137e20e193c960802afba73b5d38sm
145cfd74d65d832137e20e193c960802afba73b5d38sm            collision.loadCollisionTiles(context.getResources().openRawResource(R.raw.collision));
146cfd74d65d832137e20e193c960802afba73b5d38sm
147cfd74d65d832137e20e193c960802afba73b5d38sm            gameRoot.add(gameManager);
148cfd74d65d832137e20e193c960802afba73b5d38sm
149cfd74d65d832137e20e193c960802afba73b5d38sm            // Camera must come after the game manager so that the camera target moves before the camera
150cfd74d65d832137e20e193c960802afba73b5d38sm            // centers.
151cfd74d65d832137e20e193c960802afba73b5d38sm
152cfd74d65d832137e20e193c960802afba73b5d38sm            gameRoot.add(camera);
153cfd74d65d832137e20e193c960802afba73b5d38sm
154cfd74d65d832137e20e193c960802afba73b5d38sm
155cfd74d65d832137e20e193c960802afba73b5d38sm            // More basic systems.
156cfd74d65d832137e20e193c960802afba73b5d38sm
157cfd74d65d832137e20e193c960802afba73b5d38sm            GameObjectCollisionSystem dynamicCollision = new GameObjectCollisionSystem();
158cfd74d65d832137e20e193c960802afba73b5d38sm            gameRoot.add(dynamicCollision);
159cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.gameObjectCollisionSystem = dynamicCollision;
160cfd74d65d832137e20e193c960802afba73b5d38sm
161cfd74d65d832137e20e193c960802afba73b5d38sm
162cfd74d65d832137e20e193c960802afba73b5d38sm            RenderSystem renderer = new RenderSystem();
163cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.renderSystem = renderer;
164cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.vectorPool = new VectorPool();
165cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.drawableFactory = new DrawableFactory();
166cfd74d65d832137e20e193c960802afba73b5d38sm
167cfd74d65d832137e20e193c960802afba73b5d38sm            HudSystem hud = new HudSystem();
168cfd74d65d832137e20e193c960802afba73b5d38sm            hud.setFuelDrawable(
169cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
170cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_bar), 0, 0),
171cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
172cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_bar_bg), 0, 0));
173cfd74d65d832137e20e193c960802afba73b5d38sm            hud.setFadeTexture(longTermTextureLibrary.allocateTexture(R.drawable.black));
174cfd74d65d832137e20e193c960802afba73b5d38sm            hud.setButtonDrawables(
175cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
176cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_button_fly_disabled), 0, 0),
177cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
178cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_button_fly_off), 0, 0),
179cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
180cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_button_fly_on), 0, 0),
181cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
182cfd74d65d832137e20e193c960802afba73b5d38sm                            R.drawable.ui_button_stomp_off), 0, 0),
183cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
1842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                            R.drawable.ui_button_stomp_on), 0, 0),
1852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
1862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                            R.drawable.ui_movement_slider_base), 0, 0),
1872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
1882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                            R.drawable.ui_movement_slider_button_off), 0, 0),
1892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                    new DrawableBitmap(longTermTextureLibrary.allocateTexture(
1902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm                            R.drawable.ui_movement_slider_button_on), 0, 0));
191cfd74d65d832137e20e193c960802afba73b5d38sm            Texture[] digitTextures = {
192cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_0),
193cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_1),
194cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_2),
195cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_3),
196cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_4),
197cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_5),
198cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_6),
199cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_7),
200cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_8),
201cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_9)
202cfd74d65d832137e20e193c960802afba73b5d38sm            };
203cfd74d65d832137e20e193c960802afba73b5d38sm            DrawableBitmap[] digits = {
204cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[0], 0, 0),
205cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[1], 0, 0),
206cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[2], 0, 0),
207cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[3], 0, 0),
208cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[4], 0, 0),
209cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[5], 0, 0),
210cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[6], 0, 0),
211cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[7], 0, 0),
212cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[8], 0, 0),
213cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(digitTextures[9], 0, 0)
214cfd74d65d832137e20e193c960802afba73b5d38sm            };
215cfd74d65d832137e20e193c960802afba73b5d38sm            DrawableBitmap xDrawable = new DrawableBitmap(
216cfd74d65d832137e20e193c960802afba73b5d38sm                    longTermTextureLibrary.allocateTexture(R.drawable.ui_x), 0, 0);
217cfd74d65d832137e20e193c960802afba73b5d38sm
218cfd74d65d832137e20e193c960802afba73b5d38sm            hud.setDigitDrawables(digits, xDrawable);
219cfd74d65d832137e20e193c960802afba73b5d38sm            hud.setCollectableDrawables(
220cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(
221cfd74d65d832137e20e193c960802afba73b5d38sm                            longTermTextureLibrary.allocateTexture(R.drawable.ui_pearl), 0, 0),
222cfd74d65d832137e20e193c960802afba73b5d38sm                    new DrawableBitmap(
223cfd74d65d832137e20e193c960802afba73b5d38sm                            longTermTextureLibrary.allocateTexture(R.drawable.ui_gem), 0, 0));
224cfd74d65d832137e20e193c960802afba73b5d38sm
225cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.hudSystem = hud;
2269d4cc2572d37983607df38b0f4216ed76ac51814sm            if (AndouKun.VERSION < 0) {
2279d4cc2572d37983607df38b0f4216ed76ac51814sm            	hud.setShowFPS(true);
2289d4cc2572d37983607df38b0f4216ed76ac51814sm            }
229cfd74d65d832137e20e193c960802afba73b5d38sm            gameRoot.add(hud);
230cfd74d65d832137e20e193c960802afba73b5d38sm
231cfd74d65d832137e20e193c960802afba73b5d38sm            BaseObject.sSystemRegistry.vibrationSystem = new VibrationSystem();
232cfd74d65d832137e20e193c960802afba73b5d38sm
2332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            EventRecorder eventRecorder = new EventRecorder();
2342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            BaseObject.sSystemRegistry.eventRecorder = eventRecorder;
2352b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm            BaseObject.sSystemRegistry.registerForReset(eventRecorder);
236cfd74d65d832137e20e193c960802afba73b5d38sm
237cfd74d65d832137e20e193c960802afba73b5d38sm            gameRoot.add(collision);
238cfd74d65d832137e20e193c960802afba73b5d38sm
239cfd74d65d832137e20e193c960802afba73b5d38sm            // debug systems
240cfd74d65d832137e20e193c960802afba73b5d38sm            //BaseObject.sSystemRegistry.debugSystem = new DebugSystem(longTermTextureLibrary);
241cfd74d65d832137e20e193c960802afba73b5d38sm            //dynamicCollision.setDebugPrefs(false, true);
242cfd74d65d832137e20e193c960802afba73b5d38sm
243cfd74d65d832137e20e193c960802afba73b5d38sm
244cfd74d65d832137e20e193c960802afba73b5d38sm            objectFactory.preloadEffects();
245cfd74d65d832137e20e193c960802afba73b5d38sm
246cfd74d65d832137e20e193c960802afba73b5d38sm            mGameRoot = gameRoot;
247cfd74d65d832137e20e193c960802afba73b5d38sm
248cfd74d65d832137e20e193c960802afba73b5d38sm            mGameThread = new GameThread(mRenderer);
249cfd74d65d832137e20e193c960802afba73b5d38sm            mGameThread.setGameRoot(mGameRoot);
250cfd74d65d832137e20e193c960802afba73b5d38sm
251cfd74d65d832137e20e193c960802afba73b5d38sm
252cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentLevel = null;
253cfd74d65d832137e20e193c960802afba73b5d38sm
254cfd74d65d832137e20e193c960802afba73b5d38sm            mBootstrapComplete = true;
255cfd74d65d832137e20e193c960802afba73b5d38sm        }
256cfd74d65d832137e20e193c960802afba73b5d38sm    }
257cfd74d65d832137e20e193c960802afba73b5d38sm
258cfd74d65d832137e20e193c960802afba73b5d38sm
259cfd74d65d832137e20e193c960802afba73b5d38sm    protected synchronized void stopLevel() {
260cfd74d65d832137e20e193c960802afba73b5d38sm        stop();
261cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectManager manager = BaseObject.sSystemRegistry.gameObjectManager;
262cfd74d65d832137e20e193c960802afba73b5d38sm        manager.destroyAll();
263cfd74d65d832137e20e193c960802afba73b5d38sm        manager.commitUpdates();
264cfd74d65d832137e20e193c960802afba73b5d38sm
265cfd74d65d832137e20e193c960802afba73b5d38sm        //TODO: it's not strictly necessary to clear the static data here, but if I don't do it
266cfd74d65d832137e20e193c960802afba73b5d38sm        // then two things happen: first, the static data will refer to junk Texture objects, and
267cfd74d65d832137e20e193c960802afba73b5d38sm        // second, memory that may not be needed for the next level will hang around.  One solution
268cfd74d65d832137e20e193c960802afba73b5d38sm        // would be to break up the texture library into static and non-static things, and
269cfd74d65d832137e20e193c960802afba73b5d38sm        // then selectively clear static game components based on their usefulness next level,
270cfd74d65d832137e20e193c960802afba73b5d38sm        // but this is way simpler.
271cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectFactory factory = BaseObject.sSystemRegistry.gameObjectFactory;
272cfd74d65d832137e20e193c960802afba73b5d38sm        factory.clearStaticData();
273cfd74d65d832137e20e193c960802afba73b5d38sm        factory.sanityCheckPools();
274cfd74d65d832137e20e193c960802afba73b5d38sm
275cfd74d65d832137e20e193c960802afba73b5d38sm        // Reset the level
276cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.levelSystem.reset();
277cfd74d65d832137e20e193c960802afba73b5d38sm
2782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        // Ensure sounds have stopped.
2792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        BaseObject.sSystemRegistry.soundSystem.stopAll();
2802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
281cfd74d65d832137e20e193c960802afba73b5d38sm        // Reset systems that need it.
282cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.reset();
283cfd74d65d832137e20e193c960802afba73b5d38sm
284cfd74d65d832137e20e193c960802afba73b5d38sm        // Dump the short-term texture objects only.
285cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView.flushTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary);
286cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.shortTermTextureLibrary.removeAll();
287cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView.flushBuffers(BaseObject.sSystemRegistry.bufferLibrary);
288cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.bufferLibrary.removeAll();
289cfd74d65d832137e20e193c960802afba73b5d38sm    }
290cfd74d65d832137e20e193c960802afba73b5d38sm
291cfd74d65d832137e20e193c960802afba73b5d38sm    public synchronized void requestNewLevel() {
292cfd74d65d832137e20e193c960802afba73b5d38sm    	// tell the Renderer to call us back when the
293cfd74d65d832137e20e193c960802afba73b5d38sm    	// render thread is ready to manage some texture memory.
294cfd74d65d832137e20e193c960802afba73b5d38sm    	mRenderer.requestCallback();
295cfd74d65d832137e20e193c960802afba73b5d38sm    }
296cfd74d65d832137e20e193c960802afba73b5d38sm
297cfd74d65d832137e20e193c960802afba73b5d38sm    public synchronized void restartLevel() {
298cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "Restarting...");
299cfd74d65d832137e20e193c960802afba73b5d38sm        final LevelTree.Level level = mCurrentLevel;
300cfd74d65d832137e20e193c960802afba73b5d38sm        stop();
301cfd74d65d832137e20e193c960802afba73b5d38sm
302cfd74d65d832137e20e193c960802afba73b5d38sm        // Destroy all game objects and respawn them.  No need to destroy other systems.
303cfd74d65d832137e20e193c960802afba73b5d38sm        GameObjectManager manager = BaseObject.sSystemRegistry.gameObjectManager;
304cfd74d65d832137e20e193c960802afba73b5d38sm        manager.destroyAll();
305cfd74d65d832137e20e193c960802afba73b5d38sm        manager.commitUpdates();
306cfd74d65d832137e20e193c960802afba73b5d38sm
3072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        // Ensure sounds have stopped.
3082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        BaseObject.sSystemRegistry.soundSystem.stopAll();
3092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
310cfd74d65d832137e20e193c960802afba73b5d38sm        // Reset systems that need it.
311cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.reset();
312cfd74d65d832137e20e193c960802afba73b5d38sm
313cfd74d65d832137e20e193c960802afba73b5d38sm        LevelSystem levelSystem = BaseObject.sSystemRegistry.levelSystem;
314cfd74d65d832137e20e193c960802afba73b5d38sm        levelSystem.incrementAttemptsCount();
315cfd74d65d832137e20e193c960802afba73b5d38sm        levelSystem.spawnObjects();
316cfd74d65d832137e20e193c960802afba73b5d38sm
317cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.hudSystem.startFade(true, 0.2f);
318cfd74d65d832137e20e193c960802afba73b5d38sm
319cfd74d65d832137e20e193c960802afba73b5d38sm        mCurrentLevel = level;
320cfd74d65d832137e20e193c960802afba73b5d38sm        mPendingLevel = null;
321cfd74d65d832137e20e193c960802afba73b5d38sm        start();
322cfd74d65d832137e20e193c960802afba73b5d38sm    }
323cfd74d65d832137e20e193c960802afba73b5d38sm
324cfd74d65d832137e20e193c960802afba73b5d38sm    protected synchronized void goToLevel(LevelTree.Level level) {
325cfd74d65d832137e20e193c960802afba73b5d38sm
326cfd74d65d832137e20e193c960802afba73b5d38sm        ContextParameters params = BaseObject.sSystemRegistry.contextParameters;
327cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.levelSystem.loadLevel(level,
328cfd74d65d832137e20e193c960802afba73b5d38sm                params.context.getResources().openRawResource(level.resource), mGameRoot);
329cfd74d65d832137e20e193c960802afba73b5d38sm
330cfd74d65d832137e20e193c960802afba73b5d38sm        Context context = params.context;
331cfd74d65d832137e20e193c960802afba73b5d38sm        mRenderer.setContext(context);
332cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView.loadTextures(BaseObject.sSystemRegistry.longTermTextureLibrary);
333cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView.loadTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary);
334cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView.loadBuffers(BaseObject.sSystemRegistry.bufferLibrary);
335cfd74d65d832137e20e193c960802afba73b5d38sm
336cfd74d65d832137e20e193c960802afba73b5d38sm        mGLDataLoaded = true;
337cfd74d65d832137e20e193c960802afba73b5d38sm
338cfd74d65d832137e20e193c960802afba73b5d38sm        mCurrentLevel = level;
339cfd74d65d832137e20e193c960802afba73b5d38sm        mPendingLevel = null;
340cfd74d65d832137e20e193c960802afba73b5d38sm
341cfd74d65d832137e20e193c960802afba73b5d38sm        TimeSystem time = BaseObject.sSystemRegistry.timeSystem;
342cfd74d65d832137e20e193c960802afba73b5d38sm        time.reset();
343cfd74d65d832137e20e193c960802afba73b5d38sm
344cfd74d65d832137e20e193c960802afba73b5d38sm        HudSystem hud = BaseObject.sSystemRegistry.hudSystem;
345cfd74d65d832137e20e193c960802afba73b5d38sm        if (hud != null) {
346cfd74d65d832137e20e193c960802afba73b5d38sm            hud.startFade(true, 1.0f);
347cfd74d65d832137e20e193c960802afba73b5d38sm        }
348cfd74d65d832137e20e193c960802afba73b5d38sm
3492b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
350cfd74d65d832137e20e193c960802afba73b5d38sm        CustomToastSystem toast = BaseObject.sSystemRegistry.customToastSystem;
351cfd74d65d832137e20e193c960802afba73b5d38sm        if (toast != null) {
352cfd74d65d832137e20e193c960802afba73b5d38sm        	if (level.inThePast) {
353cfd74d65d832137e20e193c960802afba73b5d38sm        		toast.toast(context.getString(R.string.memory_playback_start), Toast.LENGTH_LONG);
354cfd74d65d832137e20e193c960802afba73b5d38sm        	} else {
355cfd74d65d832137e20e193c960802afba73b5d38sm        		if (mLastLevel != null && mLastLevel.inThePast) {
356cfd74d65d832137e20e193c960802afba73b5d38sm            		toast.toast(context.getString(R.string.memory_playback_complete), Toast.LENGTH_LONG);
357cfd74d65d832137e20e193c960802afba73b5d38sm        		}
358cfd74d65d832137e20e193c960802afba73b5d38sm        	}
359cfd74d65d832137e20e193c960802afba73b5d38sm        }
360cfd74d65d832137e20e193c960802afba73b5d38sm
361cfd74d65d832137e20e193c960802afba73b5d38sm        mLastLevel = level;
362cfd74d65d832137e20e193c960802afba73b5d38sm
363cfd74d65d832137e20e193c960802afba73b5d38sm        start();
364cfd74d65d832137e20e193c960802afba73b5d38sm    }
365cfd74d65d832137e20e193c960802afba73b5d38sm
366cfd74d65d832137e20e193c960802afba73b5d38sm    /** Starts the game running. */
367cfd74d65d832137e20e193c960802afba73b5d38sm    public void start() {
368cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mRunning) {
369cfd74d65d832137e20e193c960802afba73b5d38sm            assert mGame == null;
370cfd74d65d832137e20e193c960802afba73b5d38sm            // Now's a good time to run the GC.
371cfd74d65d832137e20e193c960802afba73b5d38sm            Runtime r = Runtime.getRuntime();
372cfd74d65d832137e20e193c960802afba73b5d38sm            r.gc();
373cfd74d65d832137e20e193c960802afba73b5d38sm            DebugLog.d("AndouKun", "Start!");
374cfd74d65d832137e20e193c960802afba73b5d38sm            mGame = new Thread(mGameThread);
375cfd74d65d832137e20e193c960802afba73b5d38sm            mGame.setName("Game");
376cfd74d65d832137e20e193c960802afba73b5d38sm            mGame.start();
377cfd74d65d832137e20e193c960802afba73b5d38sm            mRunning = true;
378cfd74d65d832137e20e193c960802afba73b5d38sm            AllocationGuard.sGuardActive = false;
379cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
380cfd74d65d832137e20e193c960802afba73b5d38sm            mGameThread.resumeGame();
381cfd74d65d832137e20e193c960802afba73b5d38sm        }
382cfd74d65d832137e20e193c960802afba73b5d38sm    }
383cfd74d65d832137e20e193c960802afba73b5d38sm
384cfd74d65d832137e20e193c960802afba73b5d38sm    public void stop() {
385cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
386cfd74d65d832137e20e193c960802afba73b5d38sm            DebugLog.d("AndouKun", "Stop!");
387cfd74d65d832137e20e193c960802afba73b5d38sm            if (mGameThread.getPaused()) {
388cfd74d65d832137e20e193c960802afba73b5d38sm                mGameThread.resumeGame();
389cfd74d65d832137e20e193c960802afba73b5d38sm            }
390cfd74d65d832137e20e193c960802afba73b5d38sm            mGameThread.stopGame();
391cfd74d65d832137e20e193c960802afba73b5d38sm            try {
392cfd74d65d832137e20e193c960802afba73b5d38sm                mGame.join();
393cfd74d65d832137e20e193c960802afba73b5d38sm            } catch (InterruptedException e) {
394cfd74d65d832137e20e193c960802afba73b5d38sm                mGame.interrupt();
395cfd74d65d832137e20e193c960802afba73b5d38sm            }
396cfd74d65d832137e20e193c960802afba73b5d38sm            mGame = null;
397cfd74d65d832137e20e193c960802afba73b5d38sm            mRunning = false;
398cfd74d65d832137e20e193c960802afba73b5d38sm            mCurrentLevel = null;
399cfd74d65d832137e20e193c960802afba73b5d38sm            AllocationGuard.sGuardActive = false;
400cfd74d65d832137e20e193c960802afba73b5d38sm        }
401cfd74d65d832137e20e193c960802afba73b5d38sm    }
402cfd74d65d832137e20e193c960802afba73b5d38sm
403cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onTrackballEvent(MotionEvent event) {
404cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
4059d4cc2572d37983607df38b0f4216ed76ac51814sm        	if (event.getAction() == MotionEvent.ACTION_MOVE) {
4069d4cc2572d37983607df38b0f4216ed76ac51814sm        		BaseObject.sSystemRegistry.inputSystem.roll(event.getRawX(), event.getRawY());
4079d4cc2572d37983607df38b0f4216ed76ac51814sm        	} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
4089d4cc2572d37983607df38b0f4216ed76ac51814sm        		onKeyDownEvent(KeyEvent.KEYCODE_DPAD_CENTER);
4099d4cc2572d37983607df38b0f4216ed76ac51814sm        	} else if (event.getAction() == MotionEvent.ACTION_UP) {
4109d4cc2572d37983607df38b0f4216ed76ac51814sm        		onKeyUpEvent(KeyEvent.KEYCODE_DPAD_CENTER);
4119d4cc2572d37983607df38b0f4216ed76ac51814sm        	}
412cfd74d65d832137e20e193c960802afba73b5d38sm        }
413cfd74d65d832137e20e193c960802afba73b5d38sm        return true;
414cfd74d65d832137e20e193c960802afba73b5d38sm    }
415cfd74d65d832137e20e193c960802afba73b5d38sm
416cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onOrientationEvent(float x, float y, float z) {
417cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
4189d4cc2572d37983607df38b0f4216ed76ac51814sm        	BaseObject.sSystemRegistry.inputSystem.setOrientation(x, y, z);
419cfd74d65d832137e20e193c960802afba73b5d38sm        }
420cfd74d65d832137e20e193c960802afba73b5d38sm        return true;
421cfd74d65d832137e20e193c960802afba73b5d38sm    }
422cfd74d65d832137e20e193c960802afba73b5d38sm
423cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onTouchEvent(MotionEvent event) {
424cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
4252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        	mTouchFilter.updateTouch(event);
426cfd74d65d832137e20e193c960802afba73b5d38sm        }
427cfd74d65d832137e20e193c960802afba73b5d38sm        return true;
428cfd74d65d832137e20e193c960802afba73b5d38sm    }
429cfd74d65d832137e20e193c960802afba73b5d38sm
4302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
4312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
432cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onKeyDownEvent(int keyCode) {
433cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = false;
434cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
4359d4cc2572d37983607df38b0f4216ed76ac51814sm            BaseObject.sSystemRegistry.inputSystem.keyDown(keyCode);
436cfd74d65d832137e20e193c960802afba73b5d38sm        }
437cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
438cfd74d65d832137e20e193c960802afba73b5d38sm    }
439cfd74d65d832137e20e193c960802afba73b5d38sm
440cfd74d65d832137e20e193c960802afba73b5d38sm    public boolean onKeyUpEvent(int keyCode) {
441cfd74d65d832137e20e193c960802afba73b5d38sm        boolean result = false;
442cfd74d65d832137e20e193c960802afba73b5d38sm        if (mRunning) {
4439d4cc2572d37983607df38b0f4216ed76ac51814sm        	BaseObject.sSystemRegistry.inputSystem.keyUp(keyCode);
444cfd74d65d832137e20e193c960802afba73b5d38sm        }
445cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
446cfd74d65d832137e20e193c960802afba73b5d38sm    }
447cfd74d65d832137e20e193c960802afba73b5d38sm
448cfd74d65d832137e20e193c960802afba73b5d38sm    public GameRenderer getRenderer() {
449cfd74d65d832137e20e193c960802afba73b5d38sm        return mRenderer;
450cfd74d65d832137e20e193c960802afba73b5d38sm    }
451cfd74d65d832137e20e193c960802afba73b5d38sm
452cfd74d65d832137e20e193c960802afba73b5d38sm    public void onPause() {
453cfd74d65d832137e20e193c960802afba73b5d38sm    	if (mRunning) {
454cfd74d65d832137e20e193c960802afba73b5d38sm    		mGameThread.pauseGame();
455cfd74d65d832137e20e193c960802afba73b5d38sm    	}
456cfd74d65d832137e20e193c960802afba73b5d38sm    }
457cfd74d65d832137e20e193c960802afba73b5d38sm
458cfd74d65d832137e20e193c960802afba73b5d38sm    public void onResume(Context context, boolean force) {
459cfd74d65d832137e20e193c960802afba73b5d38sm    	if (force && mRunning) {
460cfd74d65d832137e20e193c960802afba73b5d38sm    		mGameThread.resumeGame();
461cfd74d65d832137e20e193c960802afba73b5d38sm    	} else {
462cfd74d65d832137e20e193c960802afba73b5d38sm	        mRenderer.setContext(context);
463cfd74d65d832137e20e193c960802afba73b5d38sm	        // Don't explicitly resume the game here.  We'll do that in
464cfd74d65d832137e20e193c960802afba73b5d38sm	        // the SurfaceReady() callback, which will prevent the game
465cfd74d65d832137e20e193c960802afba73b5d38sm	        // starting before the render thread is ready to go.
466cfd74d65d832137e20e193c960802afba73b5d38sm	        BaseObject.sSystemRegistry.contextParameters.context = context;
467cfd74d65d832137e20e193c960802afba73b5d38sm    	}
468cfd74d65d832137e20e193c960802afba73b5d38sm    }
469cfd74d65d832137e20e193c960802afba73b5d38sm
470cfd74d65d832137e20e193c960802afba73b5d38sm    public void onSurfaceReady() {
471cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "Surface Ready");
472cfd74d65d832137e20e193c960802afba73b5d38sm
473cfd74d65d832137e20e193c960802afba73b5d38sm        if (mPendingLevel != null && mPendingLevel != mCurrentLevel) {
474cfd74d65d832137e20e193c960802afba73b5d38sm            if (mRunning) {
475cfd74d65d832137e20e193c960802afba73b5d38sm                stopLevel();
476cfd74d65d832137e20e193c960802afba73b5d38sm            }
477cfd74d65d832137e20e193c960802afba73b5d38sm            goToLevel(mPendingLevel);
478cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (mGameThread.getPaused() && mRunning) {
479cfd74d65d832137e20e193c960802afba73b5d38sm            mGameThread.resumeGame();
480cfd74d65d832137e20e193c960802afba73b5d38sm        }
481cfd74d65d832137e20e193c960802afba73b5d38sm    }
482cfd74d65d832137e20e193c960802afba73b5d38sm
483cfd74d65d832137e20e193c960802afba73b5d38sm    public void setSurfaceView(GLSurfaceView view) {
484cfd74d65d832137e20e193c960802afba73b5d38sm        mSurfaceView = view;
485cfd74d65d832137e20e193c960802afba73b5d38sm    }
486cfd74d65d832137e20e193c960802afba73b5d38sm
487cfd74d65d832137e20e193c960802afba73b5d38sm    public void onSurfaceLost() {
488cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "Surface Lost");
489cfd74d65d832137e20e193c960802afba73b5d38sm
490cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.shortTermTextureLibrary.invalidateAll();
491cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.longTermTextureLibrary.invalidateAll();
492cfd74d65d832137e20e193c960802afba73b5d38sm        BaseObject.sSystemRegistry.bufferLibrary.invalidateHardwareBuffers();
493cfd74d65d832137e20e193c960802afba73b5d38sm
494cfd74d65d832137e20e193c960802afba73b5d38sm        mGLDataLoaded = false;
495cfd74d65d832137e20e193c960802afba73b5d38sm    }
496cfd74d65d832137e20e193c960802afba73b5d38sm
497cfd74d65d832137e20e193c960802afba73b5d38sm    public void onSurfaceCreated() {
498cfd74d65d832137e20e193c960802afba73b5d38sm        DebugLog.d("AndouKun", "Surface Created");
499cfd74d65d832137e20e193c960802afba73b5d38sm
500cfd74d65d832137e20e193c960802afba73b5d38sm        // TODO: this is dumb.  SurfaceView doesn't need to control everything here.
501cfd74d65d832137e20e193c960802afba73b5d38sm        // GL should just be passed to this function and then set up directly.
502cfd74d65d832137e20e193c960802afba73b5d38sm
503cfd74d65d832137e20e193c960802afba73b5d38sm        if (!mGLDataLoaded && mGameThread.getPaused() && mRunning && mPendingLevel == null) {
504cfd74d65d832137e20e193c960802afba73b5d38sm
505cfd74d65d832137e20e193c960802afba73b5d38sm            mSurfaceView.loadTextures(BaseObject.sSystemRegistry.longTermTextureLibrary);
506cfd74d65d832137e20e193c960802afba73b5d38sm            mSurfaceView.loadTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary);
507cfd74d65d832137e20e193c960802afba73b5d38sm            mSurfaceView.loadBuffers(BaseObject.sSystemRegistry.bufferLibrary);
508cfd74d65d832137e20e193c960802afba73b5d38sm            mGLDataLoaded = true;
509cfd74d65d832137e20e193c960802afba73b5d38sm        }
510cfd74d65d832137e20e193c960802afba73b5d38sm    }
511cfd74d65d832137e20e193c960802afba73b5d38sm
512cfd74d65d832137e20e193c960802afba73b5d38sm    public void setPendingLevel(LevelTree.Level level) {
513cfd74d65d832137e20e193c960802afba73b5d38sm        mPendingLevel = level;
514cfd74d65d832137e20e193c960802afba73b5d38sm    }
515cfd74d65d832137e20e193c960802afba73b5d38sm
516cfd74d65d832137e20e193c960802afba73b5d38sm	public void setSoundEnabled(boolean soundEnabled) {
517cfd74d65d832137e20e193c960802afba73b5d38sm		BaseObject.sSystemRegistry.soundSystem.setSoundEnabled(soundEnabled);
518cfd74d65d832137e20e193c960802afba73b5d38sm	}
519cfd74d65d832137e20e193c960802afba73b5d38sm
5202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public void setControlOptions(boolean clickAttack,
5212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm			boolean tiltControls, int tiltSensitivity, int movementSensitivity, boolean onScreenControls) {
5229d4cc2572d37983607df38b0f4216ed76ac51814sm		BaseObject.sSystemRegistry.inputGameInterface.setUseClickForAttack(clickAttack);
5239d4cc2572d37983607df38b0f4216ed76ac51814sm		BaseObject.sSystemRegistry.inputGameInterface.setUseOrientationForMovement(tiltControls);
5249d4cc2572d37983607df38b0f4216ed76ac51814sm		BaseObject.sSystemRegistry.inputGameInterface.setOrientationMovementSensitivity((tiltSensitivity / 100.0f));
5259d4cc2572d37983607df38b0f4216ed76ac51814sm		BaseObject.sSystemRegistry.inputGameInterface.setMovementSensitivity((movementSensitivity / 100.0f));
5262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		BaseObject.sSystemRegistry.inputGameInterface.setUseOnScreenControls(onScreenControls);
5272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		BaseObject.sSystemRegistry.hudSystem.setMovementSliderMode(onScreenControls);
5289d4cc2572d37983607df38b0f4216ed76ac51814sm	}
5299d4cc2572d37983607df38b0f4216ed76ac51814sm
5309d4cc2572d37983607df38b0f4216ed76ac51814sm	public void setSafeMode(boolean safe) {
5319d4cc2572d37983607df38b0f4216ed76ac51814sm		mSurfaceView.setSafeMode(safe);
532cfd74d65d832137e20e193c960802afba73b5d38sm	}
533cfd74d65d832137e20e193c960802afba73b5d38sm
534cfd74d65d832137e20e193c960802afba73b5d38sm	public float getGameTime() {
535cfd74d65d832137e20e193c960802afba73b5d38sm		return BaseObject.sSystemRegistry.timeSystem.getGameTime();
536cfd74d65d832137e20e193c960802afba73b5d38sm	}
537cfd74d65d832137e20e193c960802afba73b5d38sm
538cfd74d65d832137e20e193c960802afba73b5d38sm	public Vector2 getLastDeathPosition() {
539cfd74d65d832137e20e193c960802afba73b5d38sm		return BaseObject.sSystemRegistry.eventRecorder.getLastDeathPosition();
540cfd74d65d832137e20e193c960802afba73b5d38sm	}
5412b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
5422b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public void setLastEnding(int ending) {
5432b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		BaseObject.sSystemRegistry.eventRecorder.setLastEnding(ending);
5442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	}
5452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
5462b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public int getLastEnding() {
5472b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		return BaseObject.sSystemRegistry.eventRecorder.getLastEnding();
5482b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	}
549cfd74d65d832137e20e193c960802afba73b5d38sm
550cfd74d65d832137e20e193c960802afba73b5d38sm	public boolean isPaused() {
551cfd74d65d832137e20e193c960802afba73b5d38sm		return (mRunning && mGameThread != null && mGameThread.getPaused());
552cfd74d65d832137e20e193c960802afba73b5d38sm	}
553cfd74d65d832137e20e193c960802afba73b5d38sm
5543c1e67e433728684b5f228c5d4f3e5b1457bb271sm	public void setKeyConfig(int leftKey, int rightKey, int jumpKey,
5553c1e67e433728684b5f228c5d4f3e5b1457bb271sm			int attackKey) {
5569d4cc2572d37983607df38b0f4216ed76ac51814sm		BaseObject.sSystemRegistry.inputGameInterface.setKeys(leftKey, rightKey, jumpKey, attackKey);
5573c1e67e433728684b5f228c5d4f3e5b1457bb271sm	}
5583c1e67e433728684b5f228c5d4f3e5b1457bb271sm
5592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public int getRobotsDestroyed() {
5602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		return BaseObject.sSystemRegistry.eventRecorder.getRobotsDestroyed();
5612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	}
5622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
5632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public int getPearlsCollected() {
5642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		return BaseObject.sSystemRegistry.eventRecorder.getPearlsCollected();
5652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	}
5662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm
5672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	public int getPearlsTotal() {
5682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm		return BaseObject.sSystemRegistry.eventRecorder.getPearlsTotal();
5692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm	}
570cfd74d65d832137e20e193c960802afba73b5d38sm}
571