Skip to content

Commit 50157d5

Browse files
author
Buj
committed
Rosepad Config API
1 parent 92eab9b commit 50157d5

File tree

9 files changed

+449
-0
lines changed

9 files changed

+449
-0
lines changed

build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ plugins {
66
group 'net.buj'
77
version '1.1-SNAPSHOT'
88

9+
java {
10+
toolchain {
11+
languageVersion = JavaLanguageVersion.of(8)
12+
}
13+
}
14+
915
repositories {
1016
mavenCentral()
1117
}

src/main/java/net/buj/rml/Game.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.buj.rml;
22

3+
import net.buj.rml.options.GameOptions;
34
import net.buj.rml.registry.Blocks;
45
import net.buj.rml.registry.Items;
56
import net.buj.rml.registry.Materials;
@@ -13,6 +14,7 @@ private Game() {}
1314

1415
public static MinecraftImpl minecraft;
1516
public static Environment environment;
17+
public static GameOptions options;
1618

1719
public static Items items;
1820
public static Blocks blocks;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
package net.buj.rml.annotations;
22

3+
import java.lang.annotation.Retention;
4+
import java.lang.annotation.RetentionPolicy;
5+
6+
@Retention(RetentionPolicy.CLASS)
37
public @interface Nullable {
48
}
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
package net.buj.rml.options;
2+
3+
import net.buj.rml.annotations.Nullable;
4+
5+
import java.util.Objects;
6+
7+
public abstract class GameOption<T> {
8+
public interface OnChangedListener<T> {
9+
void run(GameOption<T> newValue);
10+
}
11+
12+
private final String[] category;
13+
private @Nullable String displayName;
14+
private final GameOptionUI<T> ui;
15+
private final String name;
16+
private T value;
17+
private @Nullable OnChangedListener<T> onChangedListener = null;
18+
19+
public GameOption(String name, GameOptionUI<T> ui, String[] category, T value) {
20+
this.name = name;
21+
this.category = category;
22+
this.ui = ui;
23+
this.value = value;
24+
}
25+
26+
public String[] getCategory() {
27+
return category;
28+
}
29+
30+
public GameOptionUI<T> getUI() {
31+
return ui;
32+
}
33+
34+
public @Nullable <U> GameOption<U> cast() {
35+
try {
36+
return (GameOption<U>) this;
37+
} catch (Throwable e) {
38+
System.err.println("Cast failed on option " + name);
39+
e.printStackTrace();
40+
return null;
41+
}
42+
}
43+
44+
public String getDisplayName() {
45+
return Objects.toString(displayName, name);
46+
}
47+
48+
public GameOption<T> withName(String displayName) {
49+
this.displayName = displayName;
50+
return this;
51+
}
52+
53+
public GameOption<T> withListener(OnChangedListener<T> listener) {
54+
onChangedListener = listener;
55+
return this;
56+
}
57+
58+
public String getName() {
59+
return name;
60+
}
61+
62+
public T getValue() {
63+
return value;
64+
}
65+
66+
public void setValue(T value) {
67+
this.value = value;
68+
if (onChangedListener != null)
69+
onChangedListener.run(this);
70+
}
71+
72+
public abstract void from(String data);
73+
public abstract String into();
74+
75+
public static class SliderIntegerGameOption extends GameOption<Integer> {
76+
public SliderIntegerGameOption(String name, String[] category, Integer value, Integer min, Integer max) {
77+
super(name, new GameOptionUI.Slider<Integer>() {
78+
79+
@Override
80+
public void change(GameOption<Integer> option, float percent) {
81+
option.setValue(Math.round(min + (float) (max - min) * percent));
82+
}
83+
84+
@Override
85+
public float percent(GameOption<Integer> option) {
86+
return (float) (option.getValue() - min) / (max - min);
87+
}
88+
89+
@Override
90+
public String getName(GameOption<Integer> option) {
91+
return option.getDisplayName() + ": " + option.getValue();
92+
}
93+
}, category, value);
94+
}
95+
96+
@Override
97+
public void from(String data) {
98+
try {
99+
setValue(Integer.parseInt(data));
100+
} catch (Exception e) {
101+
System.err.println("Failed to parse property " + getName());
102+
e.printStackTrace();
103+
}
104+
}
105+
106+
@Override
107+
public String into() {
108+
return getValue().toString();
109+
}
110+
}
111+
112+
public static class IntegerGameOption extends GameOption<Integer> {
113+
public IntegerGameOption(String name, String[] category, Integer value) {
114+
super(name, new GameOptionUI.Text<Integer>() {
115+
@Override
116+
public String getInput(GameOption<Integer> option) {
117+
return option.getValue().toString();
118+
}
119+
120+
@Override
121+
public void input(GameOption<Integer> option, char ch) {
122+
try {
123+
option.setValue(Integer.parseInt(option.getValue().toString() + ch));
124+
} catch (Exception ignored) {}
125+
}
126+
127+
@Override
128+
public void backspace(GameOption<Integer> option) {
129+
if (option.getValue().toString().length() == 1) {
130+
option.setValue(0);
131+
}
132+
else try {
133+
String value = option.getValue().toString();
134+
option.setValue(Integer.parseInt(value.substring(0, value.length() - 1)));
135+
} catch (Exception ignored) {}
136+
}
137+
138+
@Override
139+
public String getName(GameOption<Integer> option) {
140+
return option.getDisplayName();
141+
}
142+
}, category, value);
143+
}
144+
145+
@Override
146+
public void from(String data) {
147+
try {
148+
setValue(Integer.parseInt(data));
149+
} catch (Exception e) {
150+
System.err.println("Failed to parse property " + getName());
151+
e.printStackTrace();
152+
}
153+
}
154+
155+
@Override
156+
public String into() {
157+
return getValue().toString();
158+
}
159+
}
160+
161+
public static class BooleanGameOption extends GameOption<Boolean> {
162+
public BooleanGameOption(String name, String[] category, Boolean value, String yesValue, String noValue) {
163+
super(name, new GameOptionUI.Button<Boolean>() {
164+
@Override
165+
public void execute(GameOption<Boolean> option) {
166+
option.setValue(!option.getValue());
167+
}
168+
169+
@Override
170+
public boolean getEnabled(GameOption<Boolean> option) {
171+
return true;
172+
}
173+
174+
@Override
175+
public String getName(GameOption<Boolean> option) {
176+
return option.getDisplayName() + ": " + (option.getValue() ? yesValue : noValue);
177+
}
178+
}, category, value);
179+
}
180+
181+
@Override
182+
public void from(String data) {
183+
setValue(data.equals("true"));
184+
}
185+
186+
@Override
187+
public String into() {
188+
return getValue() ? "true" : "false";
189+
}
190+
}
191+
192+
public static class StringGameOption extends GameOption<String> {
193+
public StringGameOption(String name, String[] category, String value) {
194+
super(name, new GameOptionUI.Text<String>() {
195+
@Override
196+
public String getInput(GameOption<String> option) {
197+
return option.getValue();
198+
}
199+
200+
@Override
201+
public void input(GameOption<String> option, char ch) {
202+
option.setValue(option.getValue() + ch);
203+
}
204+
205+
@Override
206+
public void backspace(GameOption<String> option) {
207+
String value = option.getValue();
208+
option.setValue(value.substring(0, value.length() - 1));
209+
}
210+
211+
@Override
212+
public String getName(GameOption<String> option) {
213+
return option.getDisplayName();
214+
}
215+
}, category, value);
216+
}
217+
218+
@Override
219+
public void from(String data) {
220+
setValue(data);
221+
}
222+
223+
@Override
224+
public String into() {
225+
return getValue();
226+
}
227+
}
228+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.buj.rml.options;
2+
3+
public interface GameOptionUI<T> {
4+
String getName(GameOption<T> option);
5+
6+
interface Button<T> extends GameOptionUI<T> {
7+
void execute(GameOption<T> option);
8+
boolean getEnabled(GameOption<T> option);
9+
}
10+
11+
interface Slider<T> extends GameOptionUI<T> {
12+
void change(GameOption<T> option, float percent);
13+
float percent(GameOption<T> option);
14+
}
15+
16+
interface Text<T> extends GameOptionUI<T> {
17+
String getInput(GameOption<T> option);
18+
void input(GameOption<T> option, char ch);
19+
void backspace(GameOption<T> option);
20+
}
21+
22+
class None<T> implements GameOptionUI<T> {
23+
private final String name;
24+
public None(String name) {
25+
this.name = name;
26+
}
27+
28+
@Override
29+
public String getName(GameOption<T> option) {
30+
return name;
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)