33import arc .*;
44import arc .graphics .g2d .*;
55import arc .math .geom .*;
6+ import arc .scene .ui .layout .*;
7+ import arc .struct .*;
68import arc .util .*;
79import mindustry .*;
810import mindustry .content .*;
9- import mindustry .game .*;
11+ import mindustry .gen .*;
1012import mindustry .graphics .*;
13+ import mindustry .ui .*;
1114import mindustry .world .*;
12- import omaloon .core .*;
13-
14- import static arc .Core .*;
1515
1616public 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