package mightypork.rogue.world; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Random; import mightypork.gamecore.eventbus.BusAccess; import mightypork.gamecore.eventbus.EventBus; import mightypork.gamecore.eventbus.clients.DelegatingClient; import mightypork.gamecore.eventbus.events.Updateable; import mightypork.gamecore.logging.Log; import mightypork.gamecore.util.ion.IonBundle; import mightypork.gamecore.util.ion.IonObjBundled; import mightypork.gamecore.util.math.algo.Coord; import mightypork.gamecore.util.math.timing.Pauseable; import mightypork.rogue.world.entity.Entities; import mightypork.rogue.world.entity.Entity; import mightypork.rogue.world.level.Level; /** * World on a server. To a server, all players and levels are equal. * * @author MightyPork */ public class World implements DelegatingClient, BusAccess, IonObjBundled, Pauseable, Updateable { // not saved stuffs private final PlayerFacade playerFacade = new PlayerFacade(this); final WorldConsole console = new WorldConsole(); Entity playerEntity; private BusAccess bus; private int pauseDepth = 0; /** List of world's levels */ final ArrayList levels = new ArrayList<>(); /** Player data saved together with world */ final PlayerData playerData = new PlayerData(); /** World seed */ private long seed; /** Next entity ID */ private int eid; private File saveFile; @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Collection getChildClients() { return levels; } @Override public boolean doesDelegate() { return !isPaused(); } @Override public void load(IonBundle in) throws IOException { seed = in.get("seed", seed); eid = in.get("next_eid", eid); in.loadSequence("levels", levels); // join levels to world for (final Level lvl : levels) { lvl.setWorld(this); } in.loadBundled("player", playerData); int eid = playerData.getEID(); int lvl = playerData.getLevelNumber(); playerEntity = levels.get(lvl).getEntity(eid); if (playerEntity == null) { Log.e("Player entity not found in the world: " + eid + " on floor " + lvl); for(int i=0; i 0) pauseDepth--; } @Override public boolean isPaused() { return pauseDepth > 0; } public PlayerFacade getPlayer() { return playerFacade; } @Override public void update(double delta) { if (isPaused()) return; // update console timing - not as child client console.update(delta); if (saveFile == null) Log.w("World has no save file."); } public WorldConsole getConsole() { return console; } public void setSaveFile(File file) { this.saveFile = file; } public File getSaveFile() { return saveFile; } }