DEADSOFTWARE

Rewrite fluid updater
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameProc.java
1 package ru.deadsoftware.cavedroid.game;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.Input;
5 import com.badlogic.gdx.utils.Disposable;
6 import com.badlogic.gdx.utils.TimeUtils;
7 import ru.deadsoftware.cavedroid.CaveGame;
8 import ru.deadsoftware.cavedroid.GameScreen;
9 import ru.deadsoftware.cavedroid.game.mobs.FallingGravel;
10 import ru.deadsoftware.cavedroid.game.mobs.FallingSand;
11 import ru.deadsoftware.cavedroid.game.mobs.Mob;
12 import ru.deadsoftware.cavedroid.game.mobs.Pig;
13 import ru.deadsoftware.cavedroid.game.objects.Drop;
14 import ru.deadsoftware.cavedroid.game.objects.Player;
15 import ru.deadsoftware.cavedroid.misc.AppState;
16 import ru.deadsoftware.cavedroid.misc.Assets;
18 import java.io.Serializable;
19 import java.util.ArrayList;
21 public class GameProc implements Serializable, Disposable {
22 static boolean DO_UPD = false;
23 static int UPD_X = -1, UPD_Y = -1;
25 private transient GameFluidsThread fluidThread;
27 public transient GameWorld world;
28 public transient GameRenderer renderer;
29 public transient GamePhysics physics;
31 public Player player;
32 public ArrayList<Mob> mobs;
33 public ArrayList<Drop> drops;
35 public boolean isTouchDown, isKeyDown;
36 public int ctrlMode, touchDownX, touchDownY, touchDownBtn, keyDownCode;
37 public long touchDownTime;
39 int curX, curY;
40 int creativeScroll, maxCreativeScroll;
41 int blockDmg = 0;
43 public void initGame(int gameMode) {
44 world = new GameWorld();
45 world.generate(1024, 256);
46 player = new Player(gameMode);
47 drops = new ArrayList<>();
48 mobs = new ArrayList<>();
49 for (int i = 0; i < 16; i++) {
50 mobs.add(new Pig(i * 256, 196 * 16));
51 }
52 physics = new GamePhysics();
53 if (CaveGame.TOUCH) {
54 renderer = new GameRenderer(320,
55 320 * ((float) GameScreen.getHeight() / GameScreen.getWidth()));
56 } else {
57 ctrlMode = 1;
58 renderer = new GameRenderer(480,
59 480 * ((float) GameScreen.getHeight() / GameScreen.getWidth()));
60 }
61 maxCreativeScroll = GameItems.getItemsSize() / 8;
63 createFluidThread();
64 fluidThread.start();
66 GameSaver.save(this);
67 }
69 private void createFluidThread() {
70 fluidThread = new GameFluidsThread();
71 }
73 public void resetRenderer() {
74 if (CaveGame.TOUCH) {
75 renderer = new GameRenderer(320,
76 320 * ((float) GameScreen.getHeight() / GameScreen.getWidth()));
77 } else {
78 renderer = new GameRenderer(480,
79 480 * ((float) GameScreen.getHeight() / GameScreen.getWidth()));
80 }
81 }
83 private boolean isAutoselectable(int x, int y) {
84 return (world.getForeMap(x, y) > 0 &&
85 GameItems.getBlock(world.getForeMap(x, y)).hasCollision());
86 }
88 private void moveCursor() {
89 int pastX = curX, pastY = curY;
90 if (ctrlMode == 0 && CaveGame.TOUCH) {
91 curX = player.getMapX();
92 if (player.getDir() == 0) curX--;
93 else curX++;
94 curY = (int) (player.pos.y + player.getWidth()) / 16;
95 if (!isAutoselectable(curX, curY)) {
96 curY++;
97 }
98 if (!isAutoselectable(curX, curY)) {
99 curY++;
101 if (!isAutoselectable(curX, curY)) {
102 if (player.getDir() == 0) curX++;
103 else curX--;
105 } else if (!CaveGame.TOUCH) {
106 curX = (int) (Gdx.input.getX() *
107 (renderer.getWidth() / GameScreen.getWidth()) + renderer.getCamX()) / 16;
108 curY = (int) (Gdx.input.getY() *
109 (renderer.getHeight() / GameScreen.getHeight()) + renderer.getCamY()) / 16;
110 if ((Gdx.input.getX() *
111 (renderer.getWidth() / GameScreen.getWidth()) + renderer.getCamX()) < 0)
112 curX--;
114 if (pastX != curX || pastY != curY) blockDmg = 0;
117 private void checkCursorBounds() {
118 if (curY < 0) curY = 0;
119 if (curY >= world.getHeight()) curY = world.getHeight() - 1;
120 if (ctrlMode == 1) {
121 if (curX * 16 + 8 < player.pos.x + player.getWidth() / 2)
122 player.setDir(0);
123 if (curX * 16 + 8 > player.pos.x + player.getWidth() / 2)
124 player.setDir(1);
128 private void updateBlock(int x, int y) {
129 if (world.getForeMap(x, y) == 10) {
130 if (world.getForeMap(x, y + 1) == 0 || !GameItems.getBlock(world.getForeMap(x, y + 1)).hasCollision()) {
131 world.setForeMap(x, y, 0);
132 mobs.add(new FallingSand(x * 16, y * 16));
133 updateBlock(x, y - 1);
137 if (world.getForeMap(x, y) == 11) {
138 if (world.getForeMap(x, y + 1) == 0 || !GameItems.getBlock(world.getForeMap(x, y + 1)).hasCollision()) {
139 world.setForeMap(x, y, 0);
140 mobs.add(new FallingGravel(x * 16, y * 16));
141 updateBlock(x, y - 1);
145 if (world.getForeMap(x, y) > 0 && GameItems.getBlock(world.getForeMap(x, y)).requiresBlock()) {
146 if (world.getForeMap(x, y + 1) == 0 || !GameItems.getBlock(world.getForeMap(x, y + 1)).hasCollision()) {
147 world.destroyForeMap(x, y);
148 updateBlock(x, y - 1);
152 if (world.getForeMap(x, y) == 2) {
153 if (world.getForeMap(x, y - 1) > 0 && (GameItems.getBlock(world.getForeMap(x, y - 1)).hasCollision() ||
154 GameItems.isFluid(world.getForeMap(x, y - 1)))) {
155 world.setForeMap(x, y, 3);
160 void useItem(int x, int y, int id, boolean bg) {
161 if (id > 0) {
162 if (GameItems.getItem(id).isBlock()) {
163 if (!bg) world.placeToForeground(x, y, GameItems.getBlockIdByItemId(id));
164 else world.placeToBackground(x, y, GameItems.getBlockIdByItemId(id));
165 } else {
166 switch (id) {
167 case 65:
168 world.placeToForeground(x, y, 8);
169 player.inv[player.invSlot] = 64;
170 break;
171 case 66:
172 world.placeToForeground(x, y, 9);
173 player.inv[player.invSlot] = 64;
174 break;
180 public void update(float delta) {
181 if (DO_UPD) {
182 for (int y = UPD_Y; y < UPD_Y + 16; y++)
183 for (int x = UPD_X; x < UPD_X + 16; x++) {
184 updateBlock(x, y);
186 DO_UPD = false;
189 physics.update(delta);
190 moveCursor();
191 checkCursorBounds();
193 if (isTouchDown && touchDownBtn == Input.Buttons.LEFT) {
194 if ((world.getForeMap(curX, curY) > 0 && GameItems.getBlock(world.getForeMap(curX, curY)).getHp() >= 0) ||
195 (world.getForeMap(curX, curY) == 0 &&
196 world.getBackMap(curX, curY) > 0 &&
197 GameItems.getBlock(world.getBackMap(curX, curY)).getHp() >= 0)) {
198 if (player.gameMode == 0) {
199 blockDmg++;
200 if (world.getForeMap(curX, curY) > 0) {
201 if (blockDmg >= GameItems.getBlock(world.getForeMap(curX, curY)).getHp()) {
202 world.destroyForeMap(curX, curY);
203 blockDmg = 0;
205 } else if (world.getBackMap(curX, curY) > 0) {
206 if (blockDmg >= GameItems.getBlock(world.getBackMap(curX, curY)).getHp()) {
207 world.destroyBackMap(curX, curY);
208 blockDmg = 0;
211 } else {
212 if (world.getForeMap(curX, curY) > 0) world.placeToForeground(curX, curY, 0);
213 else if (world.getBackMap(curX, curY) > 0) world.placeToBackground(curX, curY, 0);
214 isTouchDown = false;
219 if (isTouchDown && TimeUtils.timeSinceMillis(touchDownTime) > 500) {
220 if (touchDownBtn == Input.Buttons.RIGHT) {
221 useItem(curX, curY, player.inv[player.invSlot], true);
222 isTouchDown = false;
223 } else if (touchDownY < Assets.invBar.getRegionHeight() &&
224 touchDownX > renderer.getWidth() / 2 - (float) Assets.invBar.getRegionWidth() / 2 &&
225 touchDownX < renderer.getWidth() / 2 + (float) Assets.invBar.getRegionWidth() / 2) {
226 CaveGame.STATE = AppState.GAME_CREATIVE_INV;
227 isTouchDown = false;
231 if (fluidThread == null || !fluidThread.isAlive()) {
232 createFluidThread();
233 fluidThread.start();
237 @Override
238 public void dispose() {
239 fluidThread.interrupt();