DEADSOFTWARE

Add furnace, more craft and items
[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.GameItemsHolder;
5 import ru.deadsoftware.cavedroid.game.GameScope;
6 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
7 import ru.deadsoftware.cavedroid.game.model.block.Block;
8 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
9 import ru.deadsoftware.cavedroid.game.model.item.Item;
10 import ru.deadsoftware.cavedroid.game.model.world.generator.WorldGeneratorConfig;
11 import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
12 import ru.deadsoftware.cavedroid.game.objects.furnace.Furnace;
13 import ru.deadsoftware.cavedroid.game.objects.furnace.FurnaceController;
14 import ru.deadsoftware.cavedroid.misc.utils.MeasureUnitsUtilsKt;
16 import javax.annotation.CheckForNull;
17 import javax.inject.Inject;
19 @GameScope
20 public class GameWorld {
22 private final DropController mDropController;
23 private final MobsController mMobsController;
24 private final GameItemsHolder mGameItemsHolder;
25 private final FurnaceController mFurnaceController;
27 private final int mWidth;
28 private final int mHeight;
29 private final Block[][] mForeMap;
30 private final Block[][] mBackMap;
32 private final WorldGeneratorConfig mWorldConfig = WorldGeneratorConfig.Companion.getDefault();
34 @Inject
35 public GameWorld(DropController dropController,
36 MobsController mobsController,
37 GameItemsHolder gameItemsHolder,
38 FurnaceController furnaceController,
39 @CheckForNull Block[][] foreMap,
40 @CheckForNull Block[][] backMap) {
41 mDropController = dropController;
42 mMobsController = mobsController;
43 mGameItemsHolder = gameItemsHolder;
44 mFurnaceController = furnaceController;
46 boolean isNewGame = foreMap == null || backMap == null;
48 if (isNewGame) {
49 mWidth = mWorldConfig.getWidth();
50 mHeight = mWorldConfig.getHeight();
51 Pair<Block[][], Block[][]> maps = new GameWorldGenerator(mWorldConfig, mGameItemsHolder).generate();
52 mForeMap = maps.getFirst();
53 mBackMap = maps.getSecond();
54 mMobsController.getPlayer().respawn(this, mGameItemsHolder);
55 } else {
56 mForeMap = foreMap;
57 mBackMap = backMap;
58 mWidth = mForeMap.length;
59 mHeight = mForeMap[0].length;
60 }
61 }
63 public int getWidth() {
64 return mWidth;
65 }
67 public int getHeight() {
68 return mHeight;
69 }
71 /**
72 * @deprecated for kotlin use {@link MeasureUnitsUtilsKt#getPx } extension val
73 */
74 @Deprecated
75 public float getWidthPx() {
76 return MeasureUnitsUtilsKt.getPx(mWidth);
77 }
79 /**
80 * @deprecated for kotlin use {@link MeasureUnitsUtilsKt#getPx } extension val
81 */
82 @Deprecated
83 public float getHeightPx() {
84 return MeasureUnitsUtilsKt.getPx(mHeight);
85 }
87 public Block[][] getFullForeMap() {
88 return mForeMap;
89 }
91 public Block[][] getFullBackMap() {
92 return mBackMap;
93 }
95 private int transformX(int x) {
96 x = x % getWidth();
97 if (x < 0) {
98 x = getWidth() - Math.abs(x);
99 }
100 return x;
103 private Block getMap(int x, int y, int layer) {
104 Block map = mGameItemsHolder.getFallbackBlock();
106 if (y < 0 || y >= getHeight()) {
107 return map;
110 x = transformX(x);
112 if (x < 0 || x >= getWidth()) {
113 return map;
116 map = (layer == 0) ? mForeMap[x][y] : mBackMap[x][y];
118 return map;
121 private void setMap(int x, int y, int layer, Block value) {
122 if (y < 0 || y >= getHeight()) {
123 return;
126 x = transformX(x);
128 if (x < 0 || x >= getWidth()) {
129 return;
132 if (layer == 0) {
133 mForeMap[x][y] = value;
134 } else {
135 mBackMap[x][y] = value;
139 private boolean isSameSlab(Block slab1, Block slab2) {
140 if (!(slab1 instanceof Block.Slab) || !(slab2 instanceof Block.Slab)) {
141 return false;
144 return slab1.getParams().getKey().equals(((Block.Slab) slab2).getOtherPartBlockKey())
145 || slab1.getParams().getKey().equals(slab2.getParams().getKey());
148 public boolean hasForeAt(int x, int y) {
149 return getMap(x, y, 0) != mGameItemsHolder.getFallbackBlock();
152 public boolean hasBackAt(int x, int y) {
153 return getMap(x, y, 1) != mGameItemsHolder.getFallbackBlock();
156 public Block getForeMap(int x, int y) {
157 return getMap(x, y, 0);
160 public void setForeMap(int x, int y, Block block) {
161 setMap(x, y, 0, block);
164 public void resetForeMap(int x, int y) {
165 setForeMap(x, y, mGameItemsHolder.getFallbackBlock());
168 public Block getBackMap(int x, int y) {
169 return getMap(x, y, 1);
172 public void setBackMap(int x, int y, Block block) {
173 setMap(x, y, 1, block);
176 public boolean placeToForeground(int x, int y, Block value) {
177 if (!hasForeAt(x, y) || value == mGameItemsHolder.getFallbackBlock() || !getForeMap(x, y).hasCollision()) {
179 if (value.isFurnace()) {
180 mFurnaceController.addFurnace(x, y, 0);
183 setForeMap(x, y, value);
184 return true;
185 } else if (value instanceof Block.Slab && isSameSlab(value, getForeMap(x, y))) {
186 setForeMap(x, y, mGameItemsHolder.getBlock(((Block.Slab) value).getFullBlockKey()));
187 return true;
189 return false;
192 public boolean placeToBackground(int x, int y, Block value) {
193 if (value == mGameItemsHolder.getFallbackBlock() || (getBackMap(x, y) == mGameItemsHolder.getFallbackBlock() && value.hasCollision()) &&
194 (!value.isTransparent() || value == mGameItemsHolder.getBlock("glass"))) {
195 if (value.isFurnace()) {
196 mFurnaceController.addFurnace(x, y, 1);
198 setBackMap(x, y, value);
199 return true;
201 return false;
204 private void playerDurateTool() {
205 final InventoryItem playerCurrentItem = mMobsController.getPlayer().inventory.getActiveItem();
206 if (playerCurrentItem.getItem().isTool()) {
207 mMobsController.getPlayer().decreaseCurrentItemCount(mGameItemsHolder);
211 private boolean shouldDrop(Block block) {
212 final Item item = mMobsController.getPlayer().inventory.getActiveItem().getItem();
213 int toolLevel = item.isTool() ? ((Item.Tool) item).getLevel() : 0;
214 if (item.isTool() && block.getParams().getToolType() != item.getClass()) {
215 toolLevel = 0;
217 return toolLevel >= block.getParams().getToolLevel();
220 public void destroyForeMap(int x, int y) {
221 Block block = getForeMap(x, y);
222 if (block.isFurnace()) {
223 mFurnaceController.destroyFurnace(x, y, 0, mDropController);
225 if (block.hasDrop() && shouldDrop(block)) {
226 for (int i = 0; i < block.getParams().getDropInfo().getCount(); i++) {
227 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, mGameItemsHolder.getItem(block.getDrop()));
230 playerDurateTool();
231 placeToForeground(x, y, mGameItemsHolder.getFallbackBlock());
234 public WorldGeneratorConfig getWorldConfig() {
235 return mWorldConfig;
238 public void destroyBackMap(int x, int y) {
239 Block block = getBackMap(x, y);
240 if (block.isFurnace()) {
241 mFurnaceController.destroyFurnace(x, y, 0, mDropController);
243 if (block.hasDrop() && shouldDrop(block)) {
244 for (int i = 0; i < block.getParams().getDropInfo().getCount(); i++) {
245 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, mGameItemsHolder.getItem(block.getDrop()));
248 playerDurateTool();
249 placeToBackground(x, y, mGameItemsHolder.getFallbackBlock());
252 @CheckForNull
253 public Furnace getForegroundFurnace(int x, int y) {
254 return mFurnaceController.getFurnace(x, y, 0);
257 @CheckForNull
258 public Furnace getBackgroundFurnace(int x, int y) {
259 return mFurnaceController.getFurnace(x, y, 1);