DEADSOFTWARE

Add update blocks logic actions
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / world / GameWorld.java
1 package ru.deadsoftware.cavedroid.game.world;
3 import kotlin.Pair;
4 import ru.deadsoftware.cavedroid.game.GameItems;
5 import ru.deadsoftware.cavedroid.game.GameScope;
6 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
7 import ru.deadsoftware.cavedroid.game.model.world.generator.WorldGeneratorConfig;
8 import ru.deadsoftware.cavedroid.game.objects.Block;
9 import ru.deadsoftware.cavedroid.game.objects.DropController;
11 import javax.annotation.CheckForNull;
12 import javax.inject.Inject;
14 @GameScope
15 public class GameWorld {
17 private final DropController mDropController;
18 private final MobsController mMobsController;
20 private final int mWidth;
21 private final int mHeight;
22 private final int[][] mForeMap;
23 private final int[][] mBackMap;
25 @Inject
26 public GameWorld(DropController dropController,
27 MobsController mobsController,
28 @CheckForNull int[][] foreMap,
29 @CheckForNull int[][] backMap) {
30 mDropController = dropController;
31 mMobsController = mobsController;
33 boolean isNewGame = foreMap == null || backMap == null;
35 if (isNewGame) {
36 final WorldGeneratorConfig config = WorldGeneratorConfig.Companion.getDefault();
37 mWidth = config.getWidth();
38 mHeight = config.getHeight();
39 Pair<int[][], int[][]> maps = new GameWorldGenerator(config).generate();
40 mForeMap = maps.getFirst();
41 mBackMap = maps.getSecond();
42 mMobsController.getPlayer().respawn(this);
43 } else {
44 mForeMap = foreMap;
45 mBackMap = backMap;
46 mWidth = mForeMap.length;
47 mHeight = mForeMap[0].length;
48 }
49 }
51 public int getWidth() {
52 return mWidth;
53 }
55 public int getHeight() {
56 return mHeight;
57 }
59 public float getWidthPx() {
60 return mWidth * 16f;
61 }
63 public float getHeightPx() {
64 return mHeight * 16f;
65 }
67 public int[][] getFullForeMap() {
68 return mForeMap;
69 }
71 public int[][] getFullBackMap() {
72 return mBackMap;
73 }
75 private int transformX(int x) {
76 x = x % getWidth();
77 if (x < 0) {
78 x = getWidth() - Math.abs(x);
79 }
80 return x;
81 }
83 private int getMap(int x, int y, int layer) {
84 int map = 0;
85 try {
86 x = transformX(x);
87 map = (layer == 0) ? mForeMap[x][y] : mBackMap[x][y];
88 } catch (ArrayIndexOutOfBoundsException ignored) {
89 }
90 return map;
91 }
93 private void setMap(int x, int y, int layer, int value) {
94 try {
95 x = transformX(x);
96 if (layer == 0) {
97 mForeMap[x][y] = value;
98 } else {
99 mBackMap[x][y] = value;
101 } catch (ArrayIndexOutOfBoundsException ignored) {
105 public boolean hasForeAt(int x, int y) {
106 return getMap(x, y, 0) != 0;
109 public boolean hasBackAt(int x, int y) {
110 return getMap(x, y, 1) != 0;
113 public int getForeMap(int x, int y) {
114 return getMap(x, y, 0);
117 public Block getForeMapBlock(int x, int y) {
118 return GameItems.getBlock(getMap(x, y, 0));
121 public void setForeMap(int x, int y, int id) {
122 setMap(x, y, 0, id);
125 public int getBackMap(int x, int y) {
126 return getMap(x, y, 1);
129 public Block getBackMapBlock(int x, int y) {
130 return GameItems.getBlock(getMap(x, y, 1));
133 public void setBackMap(int x, int y, int id) {
134 setMap(x, y, 1, id);
137 private void placeSlab(int x, int y, int value) {
138 switch (value) {
139 case 51:
140 setForeMap(x, y, 52);
141 break;
142 case 53:
143 setForeMap(x, y, 21);
144 break;
145 case 54:
146 setForeMap(x, y, 5);
147 break;
148 case 55:
149 setForeMap(x, y, 4);
150 break;
151 case 56:
152 setForeMap(x, y, 28);
153 break;
154 case 58:
155 setForeMap(x, y, 57);
156 break;
160 public void placeToForeground(int x, int y, int value) {
161 if (!hasForeAt(x, y) || value == 0 || !GameItems.getBlock(getForeMap(x, y)).hasCollision()) {
162 setForeMap(x, y, value);
163 } else if (GameItems.isSlab(value) && getForeMap(x, y) == value) {
164 placeSlab(x, y, value);
168 public void placeToBackground(int x, int y, int value) {
169 if (value == 0 || (getBackMap(x, y) == 0 && GameItems.getBlock(value).hasCollision()) &&
170 (!GameItems.getBlock(value).isTransparent() || value == 18)) {
171 setBackMap(x, y, value);
175 public void destroyForeMap(int x, int y) {
176 Block block = GameItems.getBlock(getForeMap(x, y));
177 if (block.hasDrop()) {
178 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, GameItems.getItemId(block.getDrop()));
180 placeToForeground(x, y, 0);
183 public void destroyBackMap(int x, int y) {
184 Block block = GameItems.getBlock(getBackMap(x, y));
185 if (block.hasDrop()) {
186 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, GameItems.getItemId(block.getDrop()));
188 placeToBackground(x, y, 0);