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
;
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
;
40 int creativeScroll
, maxCreativeScroll
;
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));
52 physics
= new GamePhysics();
54 renderer
= new GameRenderer(320,
55 320 * ((float) GameScreen
.getHeight() / GameScreen
.getWidth()));
58 renderer
= new GameRenderer(480,
59 480 * ((float) GameScreen
.getHeight() / GameScreen
.getWidth()));
61 maxCreativeScroll
= GameItems
.getItemsSize() / 8;
69 private void createFluidThread() {
70 fluidThread
= new GameFluidsThread();
73 public void resetRenderer() {
75 renderer
= new GameRenderer(320,
76 320 * ((float) GameScreen
.getHeight() / GameScreen
.getWidth()));
78 renderer
= new GameRenderer(480,
79 480 * ((float) GameScreen
.getHeight() / GameScreen
.getWidth()));
83 private boolean isAutoselectable(int x
, int y
) {
84 return (world
.getForeMap(x
, y
) > 0 &&
85 GameItems
.getBlock(world
.getForeMap(x
, y
)).hasCollision());
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
--;
94 curY
= (int) (player
.pos
.y
+ player
.getWidth()) / 16;
95 if (!isAutoselectable(curX
, curY
)) {
98 if (!isAutoselectable(curX
, curY
)) {
101 if (!isAutoselectable(curX
, curY
)) {
102 if (player
.getDir() == 0) 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)
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;
121 if (curX
* 16 + 8 < player
.pos
.x
+ player
.getWidth() / 2)
123 if (curX
* 16 + 8 > player
.pos
.x
+ player
.getWidth() / 2)
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
) {
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
));
168 world
.placeToForeground(x
, y
, 8);
169 player
.inv
[player
.invSlot
] = 64;
172 world
.placeToForeground(x
, y
, 9);
173 player
.inv
[player
.invSlot
] = 64;
180 public void update(float delta
) {
182 for (int y
= UPD_Y
; y
< UPD_Y
+ 16; y
++)
183 for (int x
= UPD_X
; x
< UPD_X
+ 16; x
++) {
189 physics
.update(delta
);
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) {
200 if (world
.getForeMap(curX
, curY
) > 0) {
201 if (blockDmg
>= GameItems
.getBlock(world
.getForeMap(curX
, curY
)).getHp()) {
202 world
.destroyForeMap(curX
, curY
);
205 } else if (world
.getBackMap(curX
, curY
) > 0) {
206 if (blockDmg
>= GameItems
.getBlock(world
.getBackMap(curX
, curY
)).getHp()) {
207 world
.destroyBackMap(curX
, curY
);
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);
219 if (isTouchDown
&& TimeUtils
.timeSinceMillis(touchDownTime
) > 500) {
220 if (touchDownBtn
== Input
.Buttons
.RIGHT
) {
221 useItem(curX
, curY
, player
.inv
[player
.invSlot
], true);
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
;
231 if (fluidThread
== null || !fluidThread
.isAlive()) {
238 public void dispose() {
239 fluidThread
.interrupt();