DEADSOFTWARE

d4a66bcb8ad622ca43193d9df7f9cdb95d24d020
[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.block.Block;
8 import ru.deadsoftware.cavedroid.game.model.world.generator.WorldGeneratorConfig;
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 public void placeToForeground(int x, int y, int value) {
138 if (!hasForeAt(x, y) || value == 0 || !GameItems.getBlock(getForeMap(x, y)).hasCollision()) {
139 setForeMap(x, y, value);
140 } else if (GameItems.isSlab(value) && getForeMap(x, y) == value) {
141 final Block block = GameItems.getBlock(value);
142 if (block instanceof Block.Slab) {
143 setForeMap(x, y, GameItems.getBlockId(((Block.Slab) block).getFullBlockKey()));
148 public void placeToBackground(int x, int y, int value) {
149 if (value == 0 || (getBackMap(x, y) == 0 && GameItems.getBlock(value).hasCollision()) &&
150 (!GameItems.getBlock(value).isTransparent() || value == 18)) {
151 setBackMap(x, y, value);
155 public void destroyForeMap(int x, int y) {
156 Block block = GameItems.getBlock(getForeMap(x, y));
157 if (block.hasDrop()) {
158 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, GameItems.getItemId(block.getDrop()));
160 placeToForeground(x, y, 0);
163 public void destroyBackMap(int x, int y) {
164 Block block = GameItems.getBlock(getBackMap(x, y));
165 if (block.hasDrop()) {
166 mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, GameItems.getItemId(block.getDrop()));
168 placeToBackground(x, y, 0);