Implemented more sector launch mechanics

This commit is contained in:
Anuken 2020-06-29 11:58:43 -04:00
parent fb032eb763
commit d58e3ac235
6 changed files with 74 additions and 14 deletions

View File

@ -9,6 +9,7 @@ import arc.math.*;
import arc.scene.ui.*;
import arc.struct.*;
import arc.util.*;
import arc.util.ArcAnnotate.*;
import mindustry.*;
import mindustry.audio.*;
import mindustry.content.*;
@ -255,6 +256,10 @@ public class Control implements ApplicationListener, Loadable{
}
public void playSector(Sector sector){
playSector(sector, sector);
}
public void playSector(@Nullable Sector origin, Sector sector){
ui.loadAnd(() -> {
ui.planet.hide();
SaveSlot slot = sector.save;
@ -294,7 +299,7 @@ public class Control implements ApplicationListener, Loadable{
sector.save = null;
Time.runTask(10f, () -> ui.showErrorMessage("$save.corrupted"));
slot.delete();
playSector(sector);
playSector(origin, sector);
}
ui.planet.hide();
}else{
@ -302,6 +307,8 @@ public class Control implements ApplicationListener, Loadable{
logic.reset();
world.loadSector(sector);
state.rules.sector = sector;
//assign origin when launching
state.secinfo.origin = origin;
logic.play();
control.saves.saveSector(sector);
Events.fire(Trigger.newGame);

View File

@ -2,6 +2,7 @@ package mindustry.core;
import arc.*;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
@ -99,14 +100,25 @@ public class Logic implements ApplicationListener{
//add resources based on turns passed
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) -> {
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
if(core.items.get(item) < 0) core.items.set(item, 0);
//cap the items
if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity);
});
}
}
state.rules.sector.setTurnsPassed(0);
@ -255,14 +267,22 @@ public class Logic implements ApplicationListener{
//TODO containers must be launched too
Time.runTask(30f, () -> {
for(Building entity : state.teams.playerCores()){
for(Item item : content.items()){
//TODO where do the items go?
//data.addItem(item, entity.items.get(item));
//Events.fire(new LaunchItemEvent(new ItemStack(item, entity.items.get(item))));
Sector origin = sector.save.meta.secinfo.origin;
if(origin != null){
Seq<ItemStack> stacks = origin.getRecievedItems();
//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.gameOver = true;
@ -271,8 +291,11 @@ public class Logic implements ApplicationListener{
//run a turn, since launching takes up a turn
universe.runTurn();
//TODO ???
sector.setTurnsPassed(sector.getTurnsPassed() + 3);
//TODO load the sector that was launched from
Events.fire(new LaunchEvent());
//manually fire game over event now
Events.fire(new GameOverEvent(state.rules.defaultTeam));

View File

@ -3,6 +3,7 @@ package mindustry.game;
import arc.math.*;
import arc.struct.*;
import arc.util.*;
import arc.util.ArcAnnotate.*;
import mindustry.content.*;
import mindustry.type.*;
import mindustry.world.*;
@ -28,6 +29,8 @@ public class SectorInfo{
public int storageCapacity = 0;
/** Whether a core is available here. */
public boolean hasCore = true;
/** Sector that was launched from. */
public @Nullable Sector origin;
/** Counter refresh state. */
private transient Interval time = new Interval();
@ -124,11 +127,14 @@ public class SectorInfo{
}
}
/** @return the items in this sector now, taking into account production. */
public ObjectIntMap<Item> getCurrentItems(float turnsPassed){
/** @return the items in this sector now, taking into account production and items recieved. */
public ObjectIntMap<Item> getCurrentItems(Sector sector){
ObjectIntMap<Item> map = new ObjectIntMap<>();
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;
}

View File

@ -59,6 +59,15 @@ public class ItemStack implements Comparable<ItemStack>{
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
public int compareTo(ItemStack itemStack){
return item.compareTo(itemStack.item);

View File

@ -2,6 +2,7 @@ package mindustry.type;
import arc.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import arc.util.*;
import arc.util.io.*;
@ -110,6 +111,16 @@ public class Sector{
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){
put("spawn-position", position);
}

View File

@ -109,7 +109,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
}
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
@ -308,7 +311,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
t.left();
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;
for(Item item : content.items()){
@ -355,6 +358,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
}
if(mode == launch && !sector.hasBase()){
Sector current = state.rules.sector;
shouldHide = false;
loadouts.show((CoreBlock)launcher.block, launcher, () -> {
control.handleLaunch(launcher);
@ -362,7 +366,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
zoom = 0.5f;
ui.hudfrag.showLaunchDirect();
Time.runTask(launchDuration, () -> control.playSector(sector));
Time.runTask(launchDuration, () -> control.playSector(current, sector));
});
}else{
control.playSector(sector);