From de06f665cd379f96fe14561822784b2512828716 Mon Sep 17 00:00:00 2001 From: Rynhardt Kruger Date: Mon, 28 Nov 2011 04:26:12 +0200 Subject: [PATCH] Added loading and saving of areas using javascript. --- examples/AlienRemake.java | 4 +-- src/org/alterverse/shapes/Box.java | 4 +++ src/org/alterverse/shapes/Shape.java | 10 ++++++ src/org/alterverse/world/Area.java | 56 ++++++++++++++++++++++++++++++++ src/org/alterverse/world/GameObject.java | 23 +++++++++++++ 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/examples/AlienRemake.java b/examples/AlienRemake.java index b610a1f..84a734f 100644 --- a/examples/AlienRemake.java +++ b/examples/AlienRemake.java @@ -128,10 +128,10 @@ case 'q': engine.quit(); break; case 's': -area.save("space.sav"); +area.saveJs("space.sav"); break; case 'l': -area.load("space.sav"); +area.loadJs("space.sav"); break; } else diff --git a/src/org/alterverse/shapes/Box.java b/src/org/alterverse/shapes/Box.java index 18961e7..b2b2be1 100644 --- a/src/org/alterverse/shapes/Box.java +++ b/src/org/alterverse/shapes/Box.java @@ -55,4 +55,8 @@ return y+d; public double maxZ() { return z+h; } + +public String toJs() { +return this.getClass().getName()+"("+x+","+y+","+z+","+w+","+d+","+h+")"; +} } diff --git a/src/org/alterverse/shapes/Shape.java b/src/org/alterverse/shapes/Shape.java index b18bb26..e0d54d4 100644 --- a/src/org/alterverse/shapes/Shape.java +++ b/src/org/alterverse/shapes/Shape.java @@ -28,6 +28,12 @@ double z; public Shape() { } +public Shape(double x, double y, double z) { +this.x=x; +this.y=y; +this.z=z; +} + public void setPosition(double x, double y, double z) { this.x=x; this.y=y; @@ -77,4 +83,8 @@ return (minZ()+maxZ())/2.0; public double getVolume() { return (maxX()-minX())*(maxY()-minY())*(maxZ()-minZ()); } + +public String toJs() { +return this.getClass().getName()+"("+x+","+y+","+z+")"; +} } diff --git a/src/org/alterverse/world/Area.java b/src/org/alterverse/world/Area.java index b4ee0e9..f699921 100644 --- a/src/org/alterverse/world/Area.java +++ b/src/org/alterverse/world/Area.java @@ -22,9 +22,11 @@ package org.alterverse.world; import java.io.*; import java.util.ArrayList; import java.util.Vector; +import javax.script.*; public class Area implements Serializable { ArrayList objects; +GameObject player = null; Vector dellist; boolean gravity; @@ -53,6 +55,11 @@ public void add(GameObject obj) { objects.add(obj); } +public void addAsPlayer(GameObject obj) { +add(obj); +setPlayer(obj); +} + public void remove(GameObject obj) { dellist.add(obj); } @@ -95,4 +102,53 @@ ret.add(i); } return ret; } + +public void setPlayer(GameObject obj) { +player=obj; +} + +public GameObject getPlayer() { +return player; +} + +public boolean loadJs(String file, boolean fixedOnly) { +try { +ScriptEngineManager sm = new ScriptEngineManager(); +ScriptEngine e = sm.getEngineByName("javascript"); +if (fixedOnly) { +for (int i = 0; i < objects.size(); i++) +if (! (objects.get(i) instanceof MovableObject)) { +objects.remove(objects.get(i)); +i--; +} +} else +objects.clear(); +e.put("area",this); +e.eval(new FileReader(file)); +return true; +} catch(Exception x) { +x.printStackTrace(); +return false; +} +} + +public void saveJs(String file,boolean fixedOnly) { +try { +FileWriter fw = new FileWriter(file); +if (getGravity()) +fw.write("area.setGravity(true);\n"); +else +fw.write("area.setGravity(false);\n"); +for (GameObject obj: objects) { +if (fixedOnly&&obj instanceof MovableObject) +continue; +String var = "v"+System.currentTimeMillis(); +fw.write(obj.toJs(var)+"\n"); +fw.write("area.add("+var+");\n"); +} +fw.close(); +} catch(Exception x) { +x.printStackTrace(); +} +} } diff --git a/src/org/alterverse/world/GameObject.java b/src/org/alterverse/world/GameObject.java index b77c56a..8ea72b4 100644 --- a/src/org/alterverse/world/GameObject.java +++ b/src/org/alterverse/world/GameObject.java @@ -35,6 +35,7 @@ double prevY; double prevZ; ArrayList sounds; boolean solid; +GameObject parent=null; Area myArea; Vector children; public GameObject(Area area) { @@ -252,6 +253,7 @@ return max; public void addChild(GameObject child) { children.add(child); myArea.add(child); +child.setParent(this); } public void onRemove() { @@ -262,6 +264,7 @@ myArea.remove(obj); public void removeChild(GameObject child) { children.remove(child); myArea.remove(child); +child.setParent(null); } public GameObject getChild(int i) { @@ -311,4 +314,24 @@ if (num>0) return true; return false; } + +public void setParent(GameObject obj) { +parent=obj; +} + +public GameObject getParent() { +return parent; +} + +public String toJs(String varname) { +String ret = "var "+varname+" = "+this.getClass().getName()+"(area);\n"; +ret+=varname+".setPosition("+x+","+y+","+z+");\n"; +if (getSolid()) +ret+=varname+".setSolid(true);\n"; +else +ret+=varname+".setSolid(false);\n"; +for (Shape s:shapes) +ret+=varname+".addShape("+s.toJs()+");\n"; +return ret; +} } -- 2.11.4.GIT