Implemented more sector launch mechanics
This commit is contained in:
@@ -9,6 +9,7 @@ import arc.math.*;
|
|||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import arc.util.ArcAnnotate.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.audio.*;
|
import mindustry.audio.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
@@ -255,6 +256,10 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void playSector(Sector sector){
|
public void playSector(Sector sector){
|
||||||
|
playSector(sector, sector);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void playSector(@Nullable Sector origin, Sector sector){
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
ui.planet.hide();
|
ui.planet.hide();
|
||||||
SaveSlot slot = sector.save;
|
SaveSlot slot = sector.save;
|
||||||
@@ -294,7 +299,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
sector.save = null;
|
sector.save = null;
|
||||||
Time.runTask(10f, () -> ui.showErrorMessage("$save.corrupted"));
|
Time.runTask(10f, () -> ui.showErrorMessage("$save.corrupted"));
|
||||||
slot.delete();
|
slot.delete();
|
||||||
playSector(sector);
|
playSector(origin, sector);
|
||||||
}
|
}
|
||||||
ui.planet.hide();
|
ui.planet.hide();
|
||||||
}else{
|
}else{
|
||||||
@@ -302,6 +307,8 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
logic.reset();
|
logic.reset();
|
||||||
world.loadSector(sector);
|
world.loadSector(sector);
|
||||||
state.rules.sector = sector;
|
state.rules.sector = sector;
|
||||||
|
//assign origin when launching
|
||||||
|
state.secinfo.origin = origin;
|
||||||
logic.play();
|
logic.play();
|
||||||
control.saves.saveSector(sector);
|
control.saves.saveSector(sector);
|
||||||
Events.fire(Trigger.newGame);
|
Events.fire(Trigger.newGame);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mindustry.core;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
@@ -99,14 +100,25 @@ public class Logic implements ApplicationListener{
|
|||||||
//add resources based on turns passed
|
//add resources based on turns passed
|
||||||
if(state.rules.sector.save != null && core != null){
|
if(state.rules.sector.save != null && core != null){
|
||||||
|
|
||||||
|
//add produced items
|
||||||
|
//TODO move to recieved items
|
||||||
state.rules.sector.save.meta.secinfo.production.each((item, stat) -> {
|
state.rules.sector.save.meta.secinfo.production.each((item, stat) -> {
|
||||||
core.items.add(item, (int)(stat.mean * passed));
|
core.items.add(item, (int)(stat.mean * passed));
|
||||||
|
});
|
||||||
|
|
||||||
|
//add recieved items
|
||||||
|
state.rules.sector.getRecievedItems().each(stack -> core.items.add(stack.item, stack.amount));
|
||||||
|
|
||||||
|
//clear recieved items
|
||||||
|
state.rules.sector.setRecievedItems(new Seq<>());
|
||||||
|
|
||||||
|
//validation
|
||||||
|
for(Item item : content.items()){
|
||||||
//ensure positive items
|
//ensure positive items
|
||||||
if(core.items.get(item) < 0) core.items.set(item, 0);
|
if(core.items.get(item) < 0) core.items.set(item, 0);
|
||||||
//cap the items
|
//cap the items
|
||||||
if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity);
|
if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state.rules.sector.setTurnsPassed(0);
|
state.rules.sector.setTurnsPassed(0);
|
||||||
@@ -255,14 +267,22 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
//TODO containers must be launched too
|
//TODO containers must be launched too
|
||||||
Time.runTask(30f, () -> {
|
Time.runTask(30f, () -> {
|
||||||
for(Building entity : state.teams.playerCores()){
|
Sector origin = sector.save.meta.secinfo.origin;
|
||||||
for(Item item : content.items()){
|
if(origin != null){
|
||||||
//TODO where do the items go?
|
Seq<ItemStack> stacks = origin.getRecievedItems();
|
||||||
//data.addItem(item, entity.items.get(item));
|
|
||||||
//Events.fire(new LaunchItemEvent(new ItemStack(item, entity.items.get(item))));
|
//add up all items into list
|
||||||
|
for(Building entity : state.teams.playerCores()){
|
||||||
|
entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount));
|
||||||
}
|
}
|
||||||
entity.tile().remove();
|
|
||||||
|
//save recieved items
|
||||||
|
origin.setRecievedItems(stacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//remove all the cores
|
||||||
|
state.teams.playerCores().each(b -> b.tile.remove());
|
||||||
|
|
||||||
state.launched = true;
|
state.launched = true;
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
|
|
||||||
@@ -271,8 +291,11 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
//run a turn, since launching takes up a turn
|
//run a turn, since launching takes up a turn
|
||||||
universe.runTurn();
|
universe.runTurn();
|
||||||
|
|
||||||
|
//TODO ???
|
||||||
sector.setTurnsPassed(sector.getTurnsPassed() + 3);
|
sector.setTurnsPassed(sector.getTurnsPassed() + 3);
|
||||||
|
|
||||||
|
//TODO load the sector that was launched from
|
||||||
Events.fire(new LaunchEvent());
|
Events.fire(new LaunchEvent());
|
||||||
//manually fire game over event now
|
//manually fire game over event now
|
||||||
Events.fire(new GameOverEvent(state.rules.defaultTeam));
|
Events.fire(new GameOverEvent(state.rules.defaultTeam));
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mindustry.game;
|
|||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import arc.util.ArcAnnotate.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
@@ -28,6 +29,8 @@ public class SectorInfo{
|
|||||||
public int storageCapacity = 0;
|
public int storageCapacity = 0;
|
||||||
/** Whether a core is available here. */
|
/** Whether a core is available here. */
|
||||||
public boolean hasCore = true;
|
public boolean hasCore = true;
|
||||||
|
/** Sector that was launched from. */
|
||||||
|
public @Nullable Sector origin;
|
||||||
|
|
||||||
/** Counter refresh state. */
|
/** Counter refresh state. */
|
||||||
private transient Interval time = new Interval();
|
private transient Interval time = new Interval();
|
||||||
@@ -124,11 +127,14 @@ public class SectorInfo{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return the items in this sector now, taking into account production. */
|
/** @return the items in this sector now, taking into account production and items recieved. */
|
||||||
public ObjectIntMap<Item> getCurrentItems(float turnsPassed){
|
public ObjectIntMap<Item> getCurrentItems(Sector sector){
|
||||||
ObjectIntMap<Item> map = new ObjectIntMap<>();
|
ObjectIntMap<Item> map = new ObjectIntMap<>();
|
||||||
map.putAll(coreItems);
|
map.putAll(coreItems);
|
||||||
production.each((item, stat) -> map.increment(item, (int)(stat.mean * turnsPassed)));
|
int turns = sector.getTurnsPassed();
|
||||||
|
production.each((item, stat) -> map.increment(item, (int)(stat.mean * turns)));
|
||||||
|
//increment based on recieved items
|
||||||
|
sector.getRecievedItems().each(stack -> map.increment(stack.item, stack.amount));
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,15 @@ public class ItemStack implements Comparable<ItemStack>{
|
|||||||
return stacks;
|
return stacks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void insert(Seq<ItemStack> stacks, Item item, int amount){
|
||||||
|
ItemStack stack = stacks.find(i -> i.item == item);
|
||||||
|
if(stack == null){
|
||||||
|
stacks.add(new ItemStack(item, amount));
|
||||||
|
}else{
|
||||||
|
stack.amount += amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(ItemStack itemStack){
|
public int compareTo(ItemStack itemStack){
|
||||||
return item.compareTo(itemStack.item);
|
return item.compareTo(itemStack.item);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package mindustry.type;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.ArcAnnotate.*;
|
import arc.util.ArcAnnotate.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
@@ -110,6 +111,16 @@ public class Sector{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO this should be stored in a more efficient structure, and be updated each turn
|
||||||
|
public Seq<ItemStack> getRecievedItems(){
|
||||||
|
return Core.settings.getJson(key("recieved-items"),Seq.class, ItemStack.class, Seq::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecievedItems(Seq<ItemStack> stacks){
|
||||||
|
Core.settings.putJson(key("recieved-items"), ItemStack.class, stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO these methods should maybe move somewhere else and/or be contained in a data object
|
||||||
public void setSpawnPosition(int position){
|
public void setSpawnPosition(int position){
|
||||||
put("spawn-position", position);
|
put("spawn-position", position);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean canLaunch(Sector sector){
|
boolean canLaunch(Sector sector){
|
||||||
return mode == launch && sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2);
|
return mode == launch &&
|
||||||
|
(sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range
|
||||||
|
//TODO completely untested
|
||||||
|
|| (sector.preset != null && sector.preset.unlocked() && sector.preset.requirements.contains(r -> r.zone() != null && r.zone() == sector.preset))); //is an unlocked preset
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -308,7 +311,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
t.left();
|
t.left();
|
||||||
|
|
||||||
t.table(res -> {
|
t.table(res -> {
|
||||||
ObjectIntMap<Item> map = sector.save.meta.secinfo.getCurrentItems(sector.getTurnsPassed());
|
ObjectIntMap<Item> map = sector.save.meta.secinfo.getCurrentItems(sector);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
@@ -355,6 +358,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mode == launch && !sector.hasBase()){
|
if(mode == launch && !sector.hasBase()){
|
||||||
|
Sector current = state.rules.sector;
|
||||||
shouldHide = false;
|
shouldHide = false;
|
||||||
loadouts.show((CoreBlock)launcher.block, launcher, () -> {
|
loadouts.show((CoreBlock)launcher.block, launcher, () -> {
|
||||||
control.handleLaunch(launcher);
|
control.handleLaunch(launcher);
|
||||||
@@ -362,7 +366,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
zoom = 0.5f;
|
zoom = 0.5f;
|
||||||
|
|
||||||
ui.hudfrag.showLaunchDirect();
|
ui.hudfrag.showLaunchDirect();
|
||||||
Time.runTask(launchDuration, () -> control.playSector(sector));
|
Time.runTask(launchDuration, () -> control.playSector(current, sector));
|
||||||
});
|
});
|
||||||
}else{
|
}else{
|
||||||
control.playSector(sector);
|
control.playSector(sector);
|
||||||
|
|||||||
Reference in New Issue
Block a user