diff options
| author | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
| commit | c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch) | |
| tree | df9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/console/Shaper.java | |
| download | worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip | |
Initial commit
Diffstat (limited to 'NET/worlds/console/Shaper.java')
| -rw-r--r-- | NET/worlds/console/Shaper.java | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/NET/worlds/console/Shaper.java b/NET/worlds/console/Shaper.java new file mode 100644 index 0000000..eb9644d --- /dev/null +++ b/NET/worlds/console/Shaper.java @@ -0,0 +1,277 @@ +package NET.worlds.console; + +import NET.worlds.network.URL; +import NET.worlds.scape.LoadedURLSelf; +import NET.worlds.scape.Manifest; +import NET.worlds.scape.Pilot; +import NET.worlds.scape.Saver; +import NET.worlds.scape.TeleportAction; +import NET.worlds.scape.URLSelf; +import NET.worlds.scape.World; +import java.awt.Container; +import java.awt.Event; +import java.awt.Menu; +import java.awt.MenuItem; +import java.io.IOException; +import java.util.Enumeration; + +public class Shaper implements MainCallback, DialogReceiver, LoadedURLSelf { + MenuItem newItem; + MenuItem openItem; + MenuItem saveItem; + MenuItem propItem; + MenuItem consolePropItem; + MenuItem pilotPropItem; + MenuItem undoItem; + MenuItem cutItem; + MenuItem copyItem; + MenuItem pasteItem; + MenuItem sortAttributesItem; + MenuItem snapToolItem; + MenuItem newLibraryItem; + MenuItem newLibraryEntryItem; + MenuItem iconsVisibleLibraryItem; + Menu worldsMenu; + MenuItem shaperVisibleItem; + private World newWorldTemplate; + private boolean makeNew = true; + private static URL newworld = URL.make("home:NewWorld.world"); + private boolean quitFlag; + private FileSaver fileSaver; + private boolean worldListHasChanged = false; + + public Shaper() { + Main.register(this); + } + + public void activate(Console c, Container f, Console prev) { + this.newItem = c.addMenuItem(Console.message("New"), "File", 78, false); + this.openItem = c.addMenuItem(Console.message("Open"), "File", 79, false); + this.saveItem = c.addMenuItem(Console.message("Save"), "File", 83, false); + this.propItem = c.addMenuItem(Console.message("World-Prop"), "File"); + this.consolePropItem = c.addMenuItem(Console.message("Console-Prop"), "File"); + this.pilotPropItem = c.addMenuItem(Console.message("Pilot-Prop"), "File"); + this.undoItem = c.addMenuItem(Console.message("Undo"), "Edit", 90, false); + c.getMenu("Edit").addSeparator(); + this.cutItem = c.addMenuItem(Console.message("Cut"), "Edit", 88, false); + this.copyItem = c.addMenuItem(Console.message("Copy"), "Edit", 67, false); + this.pasteItem = c.addMenuItem(Console.message("Paste"), "Edit", 86, false); + this.sortAttributesItem = c.addMenuItem(Console.message("Sort-Attributes"), "Edit"); + this.snapToolItem = c.addMenuItem(Console.message("Snap-Tool-Settings"), "Edit"); + this.newLibraryItem = c.addMenuItem(Console.message("New-Library"), "Libraries"); + this.newLibraryEntryItem = c.addMenuItem(Console.message("New-Library-Entry"), "Libraries"); + this.iconsVisibleLibraryItem = c.addMenuItem(Console.message("Icons-On-Off"), "Libraries", 73, false); + this.worldsMenu = c.getMenu("Worlds"); + this.worldListChange(); + this.shaperVisibleItem = c.addMenuItem(Console.message("Shaper-On-Off"), "Options"); + } + + public void deactivate() { + this.worldsMenu = null; + } + + public boolean action(Event event, Object what) { + GammaFrame f = Console.getFrame(); + if (event.target == this.newItem) { + this.makeNew = true; + } else if (event.target == this.openItem) { + new FileSysDialog( + f, this, Console.message("Open-World"), 0, "World Save Files|*.world|World Class Files|*.class|World Files|*.class;*.world", "", true + ); + } else if (event.target == this.saveItem) { + new FileSysDialog(f, this, Console.message("Save-World"), 1, "World Save Files|*.world|World Manifest (text) Files|*.mft", this.getSaveName(), true); + } else if (event.target == this.propItem) { + if (Pilot.getActiveRoom() != null) { + f.getEditTile().viewProperties(Pilot.getActiveWorld()); + } + } else if (event.target == this.consolePropItem) { + f.getEditTile().viewProperties(Console.getActive()); + } else if (event.target == this.pilotPropItem) { + f.getEditTile().viewProperties(Pilot.getActive()); + } else if (event.target == this.sortAttributesItem) { + new AttributeSortPanel(f); + } else if (event.target == this.snapToolItem) { + new SnapToolPanel(f); + } else if (event.target == this.undoItem) { + f.getEditTile().undo(); + } else if (event.target == this.cutItem) { + f.getEditTile().cut(); + } else if (event.target == this.copyItem) { + f.getEditTile().copy(); + } else if (event.target == this.pasteItem) { + f.getEditTile().paste(); + } else if (event.target == this.newLibraryItem) { + f.getLibrariesTile().addLibrary(); + } else if (event.target == this.newLibraryEntryItem) { + f.getLibrariesTile().addElement(); + } else if (event.target == this.iconsVisibleLibraryItem) { + f.getLibrariesTile().setIconsVisible(!f.getLibrariesTile().isIconsVisible()); + } else if (event.target == this.shaperVisibleItem) { + f.setShaperVisible(!f.isShaperVisible()); + } else { + int i = this.worldsMenu.getItemCount(); + + do { + i--; + } while (i >= 0 && this.worldsMenu.getItem(i) != event.target); + + if (i < 0) { + return false; + } + + String url = (String)what; + if (url.endsWith(" (changed)")) { + url = url.substring(0, url.length() - 10); + } + + TeleportAction.teleport(url, null); + } + + return true; + } + + public String getSaveName() { + return getSaveName(Pilot.getActive().getWorld()); + } + + public static String getSaveName(World w) { + URL url = w.getSourceURL(); + String name = url.unalias(); + int index = name.indexOf(58); + return index != -1 && index != 1 ? url.getBase() : name.replace('/', '\\'); + } + + @Override + public void dialogDone(Object who, boolean confirmed) { + if (confirmed) { + FileSysDialog fileDialog = (FileSysDialog)who; + String name = fileDialog.fileName(); + if (fileDialog.getMode() == 0) { + TeleportAction.teleport(name, null, true); + } else { + this.doSave(name); + } + } + } + + @Override + public void loadedURLSelf(URLSelf o, URL url, String err) { + this.newWorldTemplate = (World)o; + } + + @Override + public void mainCallback() { + if (this.quitFlag) { + if (this.fileSaver == null) { + this.fileSaver = new FileSaver(); + } + + switch (this.fileSaver.getState()) { + case 0: + GammaFrameState.saveBorder(); + Main.end(); + case 1: + default: + break; + case 2: + this.quitFlag = false; + this.fileSaver = null; + } + } + + if (this.newWorldTemplate != null) { + this.newWorldTemplate.incRef(); + } + + if (this.makeNew) { + this.makeNew = false; + if (this.newWorldTemplate == null) { + World.load(newworld, this, true); + } else { + World w = (World)this.newWorldTemplate.clone(); + w.setEdited(true); + TeleportAction.teleport(w.getSourceURL().getAbsolute(), null); + } + } + + if (this.worldListHasChanged) { + this.worldListHasChanged = false; + this.rebuildWorldsMenu(); + } + } + + public void maybeQuit() { + this.quitFlag = true; + } + + public void worldListChange() { + this.worldListHasChanged = true; + } + + private void rebuildWorldsMenu() { + if (this.worldsMenu != null) { + while (this.worldsMenu.getItemCount() > 0) { + this.worldsMenu.remove(0); + } + + Enumeration<World> e = World.getWorlds(); + + while (e.hasMoreElements()) { + World w = e.nextElement(); + URL url = w.getSourceURL(); + String name; + if (url == null) { + name = w.getName(); + } else { + name = url.getAbsolute(); + if (url.equals(newworld)) { + continue; + } + } + + if (w.getEdited()) { + name = name + " (changed)"; + } + + this.worldsMenu.add(new MenuItem(name)); + } + } + } + + public void doSave(String name) { + doSave(name, Pilot.getActive().getWorld(), true); + } + + public static boolean doSave(String name, World world, boolean allowManifest) { + if (allowManifest && name.endsWith(".mft")) { + try { + Manifest mft = new Manifest(name); + mft.saveProps(world); + mft.done(); + return true; + } catch (IOException var4) { + Console.println(Console.message("Error-manifest") + var4.toString()); + } + } else { + if (name.toLowerCase().endsWith(".wor")) { + name = name.substring(0, name.length() - 4); + } + + if (!name.toLowerCase().endsWith(".world")) { + name = name + ".world"; + } + + try { + Saver saver = new Saver(new URL(URL.getCurDir(), name)); + saver.save(world); + saver.done(); + world.setEdited(false); + return true; + } catch (IOException var5) { + Console.println(Console.message("Error-saving") + var5.toString()); + } + } + + return false; + } +} |