mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-21 20:18:06 +07:00
Implemented more sector launch mechanics
This commit is contained in:
parent
fb032eb763
commit
d58e3ac235
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user