diff --git a/core/assets/maps/fortress.msav b/core/assets/maps/fortress.msav index 5e1c0a367c..fdfa666271 100644 Binary files a/core/assets/maps/fortress.msav and b/core/assets/maps/fortress.msav differ diff --git a/core/assets/maps/islands.msav b/core/assets/maps/islands.msav index 34b00910cf..ce9a3baedc 100644 Binary files a/core/assets/maps/islands.msav and b/core/assets/maps/islands.msav differ diff --git a/core/assets/maps/labyrinth.msav b/core/assets/maps/labyrinth.msav index ab7bf64c9d..e1d51492aa 100644 Binary files a/core/assets/maps/labyrinth.msav and b/core/assets/maps/labyrinth.msav differ diff --git a/core/assets/maps/maze.msav b/core/assets/maps/maze.msav index e35b7a4e4b..775b9c83cf 100644 Binary files a/core/assets/maps/maze.msav and b/core/assets/maps/maze.msav differ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 191abb61b3..8b27bdc9c2 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Tile; import static io.anuke.mindustry.Vars.*; @@ -59,6 +60,15 @@ public class Logic implements ApplicationListener{ state.set(State.playing); state.wavetime = state.rules.waveSpacing * 2; //grace period of 2x wave time before game starts Events.fire(new PlayEvent()); + + //add starting items + if(!world.isZone()){ + for(Tile core : state.teams.get(defaultTeam).cores){ + for(ItemStack stack : state.rules.startingItems){ + core.entity.items.add(stack.item, stack.amount); + } + } + } } public void reset(){ diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/io/anuke/mindustry/game/Rules.java index 63babc963b..d60c6d82e6 100644 --- a/core/src/io/anuke/mindustry/game/Rules.java +++ b/core/src/io/anuke/mindustry/game/Rules.java @@ -2,7 +2,9 @@ package io.anuke.mindustry.game; import io.anuke.annotations.Annotations.Serialize; import io.anuke.arc.collection.Array; +import io.anuke.mindustry.content.Items; import io.anuke.mindustry.io.JsonIO; +import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Zone; /** @@ -63,6 +65,8 @@ public class Rules{ public boolean attackMode = false; /** Whether this is the editor gamemode. */ public boolean editor = false; + /** Items that the player starts with here. Not applicable to zones.*/ + public Array startingItems = Array.with(new ItemStack(Items.copper, 100)); /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ public Rules copy(){ diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index da5182fc32..064e97cbd8 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -5,13 +5,13 @@ import io.anuke.arc.util.serialization.JsonValue; import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.type.ContentType; -import io.anuke.mindustry.type.Zone; +import io.anuke.mindustry.type.*; public class JsonIO{ private static Json json = new Json(){{ setIgnoreUnknownFields(true); setElementType(Rules.class, "spawns", SpawnGroup.class); + setElementType(Rules.class, "startingItems", ItemStack.class); setSerializer(Zone.class, new Serializer(){ @Override @@ -24,6 +24,18 @@ public class JsonIO{ return Vars.content.getByName(ContentType.zone, jsonData.asString()); } }); + + setSerializer(Item.class, new Serializer(){ + @Override + public void write(Json json, Item object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Item read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.item, jsonData.asString()); + } + }); }}; public static String write(Object object){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index 062b85b567..6233e762f2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java @@ -42,10 +42,10 @@ public class CustomRulesDialog extends FloatingDialog{ title("$rules.title.waves"); check("$rules.waves", b -> rules.waves = b, () -> rules.waves); - check("$rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer, () -> rules.waves); - check("$rules.waitForWaveToEnd", b -> rules.waitForWaveToEnd = b, () -> rules.waitForWaveToEnd, () -> rules.waves); - number("$rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> rules.waves); - number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> rules.waves); + check("$rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer); + check("$rules.waitForWaveToEnd", b -> rules.waitForWaveToEnd = b, () -> rules.waitForWaveToEnd); + number("$rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> true); + number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> true); title("$rules.title.respawns"); check("$rules.limitedRespawns", b -> rules.limitedRespawns = b, () -> rules.limitedRespawns);