mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-21 20:18:06 +07:00
Custom map weather definition
This commit is contained in:
parent
24baa77c47
commit
306a660e87
@ -20,7 +20,7 @@ gameover = Game Over
|
||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||
highscore = [accent]New highscore!
|
||||
copied = Copied.
|
||||
indevpopup = [accent]v6[] is currently in [accent]pre-alpha[].\n[lightgray]This means:[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work\n- Many units are unfinished\n- The campaign is completely unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
||||
indevpopup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- The campaign is completely unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
||||
|
||||
load.sound = Sounds
|
||||
load.map = Maps
|
||||
@ -509,6 +509,11 @@ error.io = Network I/O error.
|
||||
error.any = Unknown network error.
|
||||
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
||||
|
||||
weather.rain.name = Rain
|
||||
weather.snow.name = Snow
|
||||
weather.sandstorm.name = Sandstorm
|
||||
weather.sporestorm.name = Sporestorm
|
||||
|
||||
sectors.unexplored = [lightgray]Unexplored
|
||||
sectors.resources = Resources:
|
||||
sectors.production = Production:
|
||||
@ -652,6 +657,7 @@ unit.liquidunits = liquid units
|
||||
unit.powerunits = power units
|
||||
unit.degrees = degrees
|
||||
unit.seconds = seconds
|
||||
unit.minutes = mins
|
||||
unit.persecond = /sec
|
||||
unit.perminute = /min
|
||||
unit.timesspeed = x speed
|
||||
@ -842,7 +848,9 @@ rules.lighting = Lighting
|
||||
rules.fire = Fire
|
||||
rules.explosions = Block/Unit Explosion Damage
|
||||
rules.ambientlight = Ambient Light
|
||||
rules.solarpowermultiplier = Solar Power Multiplier
|
||||
rules.weather = Weather
|
||||
rules.weather.frequency = Frequency:
|
||||
rules.weather.duration = Duration:
|
||||
|
||||
content.item.name = Items
|
||||
content.liquid.name = Liquids
|
||||
|
@ -638,6 +638,7 @@ unit.liquidunits = жидкостных единиц
|
||||
unit.powerunits = энерг. единиц
|
||||
unit.degrees = град.
|
||||
unit.seconds = сек.
|
||||
unit.minutes = мин.
|
||||
unit.persecond = /сек
|
||||
unit.timesspeed = x скорость
|
||||
unit.percent = %
|
||||
@ -823,6 +824,7 @@ rules.title.environment = Окружение
|
||||
rules.lighting = Освещение
|
||||
rules.ambientlight = Окружающий свет
|
||||
rules.solarpowermultiplier = Множитель солнечной энергии
|
||||
rules.weather = Погода
|
||||
|
||||
content.item.name = Предметы
|
||||
content.liquid.name = Жидкости
|
||||
|
@ -329,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
public void playTutorial(){
|
||||
ui.showInfo("There is no tutorial yet.");
|
||||
//TODO implement
|
||||
//ui.showInfo("death");
|
||||
/*
|
||||
|
@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{
|
||||
}
|
||||
}).grow().left().pad(6).top();
|
||||
}).width(280f).pad(3).top().left().fillY();
|
||||
|
||||
|
||||
if(++i % cols == 0){
|
||||
filterTable.row();
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import arc.func.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.util.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
@ -14,7 +15,7 @@ import mindustry.world.blocks.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public abstract class Weather extends MappableContent{
|
||||
public abstract class Weather extends UnlockableContent{
|
||||
/** Default duration of this weather event in ticks. */
|
||||
public float duration = 9f * Time.toMinutes;
|
||||
public Attributes attrs = new Attributes();
|
||||
@ -89,6 +90,16 @@ public abstract class Weather extends MappableContent{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayInfo(Table table){
|
||||
//do not
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHidden(){
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContentType getContentType(){
|
||||
return ContentType.weather;
|
||||
@ -104,7 +115,7 @@ public abstract class Weather extends MappableContent{
|
||||
public Weather weather;
|
||||
/** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */
|
||||
public float minFrequency, maxFrequency, minDuration, maxDuration;
|
||||
/** Cooldown time before the next weather event takes place. */
|
||||
/** Cooldown time before the next weather event takes place This is *state*, not configuration. */
|
||||
public float cooldown;
|
||||
/** Intensity of the weather produced. */
|
||||
public float intensity = 1f;
|
||||
@ -146,7 +157,7 @@ public abstract class Weather extends MappableContent{
|
||||
@Override
|
||||
public void update(){
|
||||
if(life < fadeTime){
|
||||
opacity = life / fadeTime;
|
||||
opacity = Math.min(life / fadeTime, opacity);
|
||||
}else{
|
||||
opacity = Mathf.lerpDelta(opacity, 1f, 0.004f);
|
||||
}
|
||||
|
@ -3,19 +3,24 @@ package mindustry.ui.dialogs;
|
||||
import arc.*;
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.math.*;
|
||||
import arc.scene.style.*;
|
||||
import arc.scene.ui.*;
|
||||
import arc.scene.ui.ImageButton.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.type.Weather.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
import static arc.util.Time.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class CustomRulesDialog extends BaseDialog{
|
||||
@ -176,8 +181,9 @@ public class CustomRulesDialog extends BaseDialog{
|
||||
}}).grow();
|
||||
}).margin(4).size(50f).padRight(10);
|
||||
b.add("@rules.ambientlight");
|
||||
}, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f);
|
||||
main.row();
|
||||
}, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row();
|
||||
|
||||
main.button("@rules.weather", this::weatherDialog).width(250f).left().row();
|
||||
|
||||
//TODO add weather patterns
|
||||
}
|
||||
@ -214,4 +220,110 @@ public class CustomRulesDialog extends BaseDialog{
|
||||
main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20);
|
||||
main.row();
|
||||
}
|
||||
|
||||
Cell<TextField> field(Table table, float value, Floatc setter){
|
||||
return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v)))
|
||||
.valid(Strings::canParsePositiveFloat)
|
||||
.size(90f, 40f).pad(2f).addInputDialog();
|
||||
}
|
||||
|
||||
void weatherDialog(){
|
||||
BaseDialog dialog = new BaseDialog("@rules.weather");
|
||||
Runnable[] rebuild = {null};
|
||||
|
||||
dialog.cont.pane(base -> {
|
||||
|
||||
rebuild[0] = () -> {
|
||||
base.clearChildren();
|
||||
int cols = Math.max(1, Core.graphics.getWidth() / 460);
|
||||
int idx = 0;
|
||||
|
||||
for(WeatherEntry entry : rules.weather){
|
||||
base.top();
|
||||
//main container
|
||||
base.table(Tex.pane, c -> {
|
||||
c.margin(0);
|
||||
|
||||
//icons to perform actions
|
||||
c.table(Tex.whiteui, t -> {
|
||||
t.setColor(Pal.gray);
|
||||
|
||||
t.top().left();
|
||||
t.add(entry.weather.localizedName).left().padLeft(6);
|
||||
|
||||
t.add().growX();
|
||||
|
||||
ImageButtonStyle style = Styles.geni;
|
||||
t.defaults().size(42f);
|
||||
|
||||
t.button(Icon.cancel, style, () -> {
|
||||
rules.weather.remove(entry);
|
||||
rebuild[0].run();
|
||||
});
|
||||
}).growX();
|
||||
|
||||
c.row();
|
||||
|
||||
//all the options
|
||||
c.table(f -> {
|
||||
f.marginLeft(4);
|
||||
f.left().top();
|
||||
|
||||
f.defaults().padRight(4).left();
|
||||
|
||||
f.add("@rules.weather.duration");
|
||||
field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes);
|
||||
f.add("@waves.to");
|
||||
field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes);
|
||||
f.add("@unit.minutes");
|
||||
|
||||
f.row();
|
||||
|
||||
f.add("@rules.weather.frequency");
|
||||
field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes);
|
||||
f.add("@waves.to");
|
||||
field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes);
|
||||
f.add("@unit.minutes");
|
||||
|
||||
//intensity can't currently be customized
|
||||
|
||||
}).grow().left().pad(6).top();
|
||||
}).width(410f).pad(3).top().left().fillY();
|
||||
|
||||
if(++idx % cols == 0){
|
||||
base.row();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
rebuild[0].run();
|
||||
}).grow();
|
||||
|
||||
dialog.addCloseButton();
|
||||
|
||||
dialog.buttons.button("@add", Icon.add, () -> {
|
||||
BaseDialog addd = new BaseDialog("@add");
|
||||
addd.cont.pane(t -> {
|
||||
t.background(Tex.button);
|
||||
int i = 0;
|
||||
for(Weather weather : content.<Weather>getBy(ContentType.weather)){
|
||||
|
||||
t.button(weather.localizedName, Styles.cleart, () -> {
|
||||
rules.weather.add(new WeatherEntry(weather));
|
||||
rebuild[0].run();
|
||||
|
||||
addd.hide();
|
||||
}).size(140f, 50f);
|
||||
if(++i % 2 == 0) t.row();
|
||||
}
|
||||
});
|
||||
addd.addCloseButton();
|
||||
addd.show();
|
||||
}).width(170f);
|
||||
|
||||
//reset cooldown to random number
|
||||
dialog.hidden(() -> rules.weather.each(w -> w.cooldown = Mathf.random(w.minFrequency, w.maxFrequency)));
|
||||
|
||||
dialog.show();
|
||||
}
|
||||
}
|
||||
|
@ -70,10 +70,10 @@ public class ForceProjector extends Block{
|
||||
|
||||
Draw.color(Pal.gray);
|
||||
Lines.stroke(3f);
|
||||
Lines.poly(x * tilesize, y * tilesize, 6, radius);
|
||||
Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
|
||||
Draw.color(player.team().color);
|
||||
Lines.stroke(1f);
|
||||
Lines.poly(x * tilesize, y * tilesize, 6, radius);
|
||||
Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius);
|
||||
Draw.color();
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@ public enum StatUnit{
|
||||
powerUnits,
|
||||
degrees,
|
||||
seconds,
|
||||
minutes,
|
||||
perSecond,
|
||||
perMinute,
|
||||
timesSpeed(false),
|
||||
|
Loading…
Reference in New Issue
Block a user