Skip to content

Commit bda91a8

Browse files
committed
better cliff editing
1 parent ebe6ec6 commit bda91a8

5 files changed

Lines changed: 127 additions & 70 deletions

File tree

main/assets/bundles/bundle.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ button.omaloon-install-update = Install it and restart now?
1818
fragment.omaloon-darkness-painter = [#FEB380]Darkness Painter
1919
fragment.omaloon-darkness-painter.clear-darkness = Clears all custom darkness from the map. [scarlet]This cannot be fully undone[].
2020
fragment.omaloon-darkness-painter.clear-darkness.confirm = Are you sure you want to remove all custom darkness from the map?
21+
keybind.open_darkness_painter.name = Show Darkness Painter
22+
keybind.paint_darkness.name = Paint Darkness
2123
ui.omaloon-flat-mode = Uniform Brush
2224
ui.omaloon-flat-mode.tooltip = Paints darkness in a square.
2325
ui.omaloon-noise-circle-mode = Noisy Circular Brush
@@ -96,7 +98,9 @@ item.omaloon-magnetite.name = Magnetite
9698

9799
## environment
98100
block.omaloon-cliff.name = Cliff
99-
block.omaloon-cliff-helper.name = Cliff Helper
101+
block.omaloon-cliff.draw-upward = Cliff
102+
block.omaloon-cliff.draw-downward = Canyon
103+
block.omaloon-cliff.cleanup = Clear Markers
100104

101105
block.omaloon-glasmore-metal.name = Glasmore Metal
102106
block.omaloon-glasmore-metal-plus.name = Glasmore Metal Plus

main/src/omaloon/content/blocks/OlEnvironmentBlocks.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
public class OlEnvironmentBlocks{
1919
public static Block
2020
// Cliff
21-
cliff, cliffHelper,
21+
cliff,
2222

2323
// Ores
2424
oreCobalt, oreNickel, oreCoal, magnetiteCrystals,
@@ -74,7 +74,6 @@ public class OlEnvironmentBlocks{
7474
public static void load(){
7575
// Cliff
7676
cliff = new OlCliff("cliff");
77-
cliffHelper = new CliffHelper("cliff-helper");
7877

7978
// Ores
8079
oreCobalt = new OreBlock("ore-cobalt", OlItems.cobalt){{

main/src/omaloon/core/OlBinding.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,5 @@ public class OlBinding {
66
public static final KeyBind
77

88
openDarknessPainter = KeyBind.add("open_darkness_painter", KeyCode.p, "omaloon"),
9-
paintDarkness = KeyBind.add("paint_darkness", KeyCode.mouseLeft, "omaloon"),
10-
11-
flushCliffs = KeyBind.add("flush_cliffs", KeyCode.l, "omaloon");
9+
paintDarkness = KeyBind.add("paint_darkness", KeyCode.mouseLeft, "omaloon");
1210
}

main/src/omaloon/world/blocks/environment/CliffHelper.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

main/src/omaloon/world/blocks/environment/OlCliff.java

Lines changed: 120 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,17 @@
33
import arc.*;
44
import arc.graphics.g2d.*;
55
import arc.math.geom.*;
6+
import arc.scene.ui.layout.*;
7+
import arc.struct.*;
68
import arc.util.*;
79
import mindustry.*;
810
import mindustry.content.*;
9-
import mindustry.game.*;
11+
import mindustry.gen.*;
1012
import mindustry.graphics.*;
13+
import mindustry.ui.*;
1114
import mindustry.world.*;
12-
import omaloon.core.*;
13-
14-
import static arc.Core.*;
1515

1616
public class OlCliff extends Block{
17-
static {
18-
Events.run(EventType.Trigger.update, () -> {
19-
if (input.keyTap(OlBinding.flushCliffs)) OlCliff.flushCliffs();
20-
});
21-
}
2217
public float colorMultiplier = 1.5f;
2318
public boolean useMapColor = true;
2419
public TextureRegion[] cliffs;
@@ -27,58 +22,140 @@ public OlCliff(String name){
2722
super(name);
2823
breakable = alwaysReplace = false;
2924
solid = true;
30-
saveData = true;
25+
saveData = saveConfig = true;
3126
cacheLayer = CacheLayer.walls;
32-
fillsTile = false;
33-
hasShadow = false;
27+
fillsTile = hasShadow = false;
28+
editorConfigurable = true;
3429
}
3530

36-
public static void flushCliffs(){
37-
Vars.world.tiles.eachTile(tile -> {
38-
if(tile.block() instanceof OlCliff && tile.data == 0){
39-
for(int i = 0; i < 4; i++){
40-
if(tile.nearby(i).block() instanceof CliffHelper) tile.data = (byte)(i + 1);
41-
}
42-
if(tile.data == 0) for(int i = 0; i < 4; i++){
43-
if(tile.nearby(Geometry.d8edge(i)).block() instanceof CliffHelper) tile.data = (byte)(i + 5);
44-
}
45-
for(int i = 0; i < 4; i++){
46-
if(
47-
tile.nearby(i).block() instanceof CliffHelper &&
48-
tile.nearby((i + 1) % 4).block() instanceof CliffHelper
49-
) tile.data = (byte)(i + 9);
50-
}
51-
if(tile.data == 0) tile.setBlock(Blocks.air);
52-
}
53-
});
54-
Vars.world.tiles.eachTile(tile -> {
55-
if(tile.block() instanceof CliffHelper) mindustry.gen.Call.setTile(tile, Blocks.air, Team.derelict, 0);
56-
});
31+
@Override
32+
public void init(){
33+
super.init();
34+
lastConfig = 0;
35+
}
36+
37+
@Override
38+
public void load(){
39+
super.load();
40+
cliffs = new TextureRegion[12];
41+
for(int i = 0; i < 12; i++){
42+
cliffs[i] = Core.atlas.find(name + "-" + (i + 1), "omaloon-cliff-" + (i + 1));
43+
}
44+
}
45+
46+
@Override
47+
public void buildEditorConfig(Table table){
48+
table.table(t -> {
49+
t.defaults().growX().height(42f).pad(2f);
50+
51+
t.button("@block." + name + ".draw-upward", Icon.upOpen, Styles.flatTogglet, () -> lastConfig = 0)
52+
.update(b -> b.setChecked(lastConfig instanceof Integer i && i == 0))
53+
.margin(12f);
54+
55+
t.button("@block." + name + ".draw-downward", Icon.downOpen, Styles.flatTogglet, () -> lastConfig = 1)
56+
.update(b -> b.setChecked(lastConfig instanceof Integer i && i == 1))
57+
.margin(12f);
58+
}).growX().padBottom(2f).row();
59+
60+
table.button("@block." + name + ".cleanup", Icon.trash, Styles.cleart, OlCliff::cleanUp)
61+
.growX().height(42f).pad(2f).margin(12f).row();
62+
}
63+
64+
@Override
65+
public Object getConfig(Tile tile){
66+
return tile.data >= 13 ? 0 : 1;
67+
}
68+
69+
@Override
70+
public void editorPicked(Tile tile){
71+
lastConfig = tile.data >= 13 ? 0 : 1;
72+
}
73+
74+
@Override
75+
public void placeEnded(Tile tile, @Nullable Unit builder, int rotation, @Nullable Object config){
76+
tile.data = (byte)((config instanceof Integer i && i == 0) ? 13 : 0);
5777
}
5878

5979
@Override
6080
public void drawBase(Tile tile){
61-
if(tile.data == 0){
81+
int d = tile.data;
82+
boolean down = d >= 13;
83+
int face = (d == 0 || d == 13) ? face(tile, down) : (down ? d - 13 : d);
84+
85+
if(face == 0){
6286
Draw.color();
6387
Draw.rect(region, tile.drawx(), tile.drawy());
6488
}else{
6589
if(useMapColor) Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(colorMultiplier));
66-
Draw.rect(cliffs[tile.data - 1], tile.drawx(), tile.drawy());
90+
Draw.rect(cliffs[face - 1], tile.drawx(), tile.drawy());
6791
}
6892
Draw.color();
6993
}
7094

7195
@Override
72-
public void load(){
73-
super.load();
74-
cliffs = new TextureRegion[12];
75-
for(int i = 0; i < 12; i++){
76-
cliffs[i] = Core.atlas.find(name + "-" + (i + 1), "omaloon-cliff-" + (i + 1));
96+
public int minimapColor(Tile tile){
97+
return Tmp.c1.set(tile.floor().mapColor).mul(1.2f).rgba();
98+
}
99+
100+
/** @return face index (1-12) based on neighbours, or 0 if none. */
101+
public static int face(Tile tile, boolean downward){
102+
return downward ? downFace(tile) : upFace(tile);
103+
}
104+
105+
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
106+
static final int[] upFaces = {0, 1, 2, 9, 3, 3, 10, 10, 4, 12, 4, 12, 11, 12, 11, 12};
107+
static final int[] downFaces = {0, 0, 0, 5, 0, 0, 6, 2, 0, 8, 0, 1, 7, 4, 3, 0};
108+
109+
static int upFace(Tile tile){
110+
int mask = 0;
111+
for(int i = 0; i < 4; i++) if(!cliff(tile.nearby(i))) mask |= (1 << i);
112+
if(mask != 0) return upFaces[mask];
113+
114+
for(int i = 3; i >= 0; i--){
115+
if(!cliff(tile.nearby(Geometry.d8edge(i)))) return i + 5;
77116
}
117+
return 0;
78118
}
79119

80-
@Override
81-
public int minimapColor(Tile tile){
82-
return Tmp.c1.set(tile.floor().mapColor).mul(1.2f).rgba();
120+
static int downFace(Tile tile){
121+
int mask = 0;
122+
for(int i = 0; i < 4; i++) if(cliff(tile.nearby(i))) mask |= (1 << i);
123+
if(mask != 0b1111) return downFaces[mask];
124+
125+
if(!cliff(tile.nearby(-1, -1))) return 9;
126+
if(!cliff(tile.nearby( 1, -1))) return 10;
127+
if(!cliff(tile.nearby( 1, 1))) return 11;
128+
if(!cliff(tile.nearby(-1, 1))) return 12;
129+
return 0;
130+
}
131+
132+
static boolean cliff(Tile t){
133+
return t != null && t.block() instanceof OlCliff;
134+
}
135+
136+
public static void cleanUp(){
137+
IntSeq remove = new IntSeq();
138+
Vars.world.tiles.eachTile(tile -> {
139+
if(!(tile.block() instanceof OlCliff)) return;
140+
int d = tile.data;
141+
boolean down = d >= 13;
142+
if(d != 0 && d != 13) return;
143+
144+
Vars.editor.addTileOp(TileOp.get(tile.x, tile.y, (byte)5 /*opData*/, TileOpData.get(tile.data, tile.floorData, tile.overlayData)));
145+
146+
int f = face(tile, down);
147+
if(f == 0){
148+
remove.add(tile.pos());
149+
}else{
150+
tile.data = (byte)(down ? f + 13 : f);
151+
}
152+
});
153+
154+
for(int i = 0; i < remove.size; i++){
155+
Tile t = Vars.world.tile(remove.get(i));
156+
if(t != null) t.setBlock(Blocks.air);
157+
}
158+
159+
Vars.editor.flushOp();
83160
}
84161
}

0 commit comments

Comments
 (0)