1 package ru
.deadsoftware
.cavedroid
.game
.world
;
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
;
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
;
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;
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);
46 mWidth
= mForeMap
.length
;
47 mHeight
= mForeMap
[0].length
;
51 public int getWidth() {
55 public int getHeight() {
59 public float getWidthPx() {
63 public float getHeightPx() {
67 public int[][] getFullForeMap() {
71 public int[][] getFullBackMap() {
75 private int transformX(int x
) {
78 x
= getWidth() - Math
.abs(x
);
83 private int getMap(int x
, int y
, int layer
) {
87 map
= (layer
== 0) ? mForeMap
[x
][y
] : mBackMap
[x
][y
];
88 } catch (ArrayIndexOutOfBoundsException ignored
) {
93 private void setMap(int x
, int y
, int layer
, int value
) {
97 mForeMap
[x
][y
] = value
;
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
) {
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
) {
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);