project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java
changeset 7508 763d3961400b
parent 7485 0481bd74267c
child 7558 983ff426f91e
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java	Sat Aug 18 00:22:33 2012 +0200
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/frontlib/Frontlib.java	Sat Aug 18 00:47:51 2012 +0200
@@ -12,7 +12,7 @@
 import org.hedgewars.hedgeroid.Datastructures.MetaScheme.Mod;
 import org.hedgewars.hedgeroid.Datastructures.MetaScheme.Setting;
 import org.hedgewars.hedgeroid.Datastructures.GameConfig;
-import org.hedgewars.hedgeroid.Datastructures.RoomlistRoom;
+import org.hedgewars.hedgeroid.Datastructures.Room;
 import org.hedgewars.hedgeroid.Datastructures.Scheme;
 import org.hedgewars.hedgeroid.Datastructures.Team;
 import org.hedgewars.hedgeroid.Datastructures.TeamInGame;
@@ -26,7 +26,6 @@
 import com.sun.jna.Pointer;
 import com.sun.jna.PointerType;
 import com.sun.jna.Structure;
-import com.sun.jna.ptr.IntByReference;
 
 /**
  * Here is an introduction to the most important aspects of the JNA code.
@@ -51,14 +50,12 @@
  * representing the data (e.g. SchemePtr.deref() will give you a Scheme object).
  * 
  * Remember that you usually have to destroy structs that you receive from the
- * library, because they are owned by the native code, not Java. For example, if
- * you obtain a {@link MetaschemePtr} metaPtr using flib_metascheme_from_ini,
- * you have to call flib_metascheme_release(metaPtr) after you are done using
- * it. The recommended pattern for most cases is to call deref() on the pointer
- * to get a Java object (that you can keep as long as you like), and then
- * immediately destroy the struct if it needs destroying. To find out whether
- * and how the struct needs to be destroyed, see the library's documentation of
- * the function that you got the struct from.
+ * library, because they are owned by the native code, not Java. The recommended
+ * pattern for most cases is to call deref() on the pointer to get a Java object
+ * (that you can keep as long as you like), and then immediately destroy the
+ * struct if it needs destroying. To find out whether and how the struct needs
+ * to be destroyed, see the library's documentation of the function that you got
+ * the struct from.
  * 
  * To pass new structs to the library, you can use the static createJavaOwned()
  * function in each PointerType, which creates a new struct from the Java object
@@ -146,13 +143,13 @@
 	}
 	
 	public static class RoomArrayPtr extends PointerType { 
-		public RoomlistRoom[] getRooms(int count) {
+		public Room[] getRooms(int count) {
 			Pointer ptr = getPointer();
 			if(ptr == null) {
-				return new RoomlistRoom[0];
+				return new Room[0];
 			}
 			Pointer[] untypedPtrs = ptr.getPointerArray(0, count);
-			RoomlistRoom[] result = new RoomlistRoom[count];
+			Room[] result = new Room[count];
 			for(int i=0; i<count; i++) {
 				result[i] = RoomPtr.deref(untypedPtrs[i]);
 			}
@@ -161,11 +158,11 @@
 	}
 	
 	public static class RoomPtr extends PointerType {
-		public RoomlistRoom deref() {
+		public Room deref() {
 			return deref(getPointer());
 		}
 		
-		public static RoomlistRoom deref(Pointer p) {
+		public static Room deref(Pointer p) {
 			RoomStruct struct = new RoomStruct(p);
 			struct.read();
 			return struct.toRoomlistRoom();
@@ -420,13 +417,12 @@
 	static class WeaponsetStruct extends Structure {
 		public static class ByVal extends WeaponsetStruct implements Structure.ByValue {}
 		public static class ByRef extends WeaponsetStruct implements Structure.ByReference {}
-		private static String[] FIELD_ORDER = new String[] {"_referenceCount", "loadout", "crateprob", "crateammo", "delay", "name"};
+		private static String[] FIELD_ORDER = new String[] {"loadout", "crateprob", "crateammo", "delay", "name"};
 		
 		public WeaponsetStruct() { super(); setFieldOrder(FIELD_ORDER); }
 		public WeaponsetStruct(Pointer ptr) { super(ptr); setFieldOrder(FIELD_ORDER); }
 		
 		public void fillFrom(Weaponset weaponset) {
-			_referenceCount = 0;
 			fillWeaponInfo(loadout, weaponset.loadout);
 			fillWeaponInfo(crateprob, weaponset.crateProb);
 			fillWeaponInfo(crateammo, weaponset.crateAmmo);
@@ -453,7 +449,6 @@
 			}
 		}
 		
-		public int _referenceCount;
 		public byte[] loadout = new byte[Weaponset.WEAPONS_COUNT+1];
 		public byte[] crateprob = new byte[Weaponset.WEAPONS_COUNT+1];
 		public byte[] crateammo = new byte[Weaponset.WEAPONS_COUNT+1];
@@ -483,13 +478,17 @@
 		
 		public void fillFrom(List<Weaponset> list) {
 			weaponsetCount = list.size();
-			weaponsets = new WeaponsetPointerByReference();
-			Structure[] structs = weaponsets.toArray(weaponsetCount);
-			
-			for(int i=0; i<weaponsetCount; i++) {
-				WeaponsetPointerByReference pstruct = (WeaponsetPointerByReference)structs[i];
-				pstruct.weaponset = new WeaponsetStruct.ByRef();
-				pstruct.weaponset.fillFrom(list.get(i));
+			if(weaponsetCount<=0) {
+				weaponsets = null;
+			} else {
+				weaponsets = new WeaponsetPointerByReference();
+				Structure[] structs = weaponsets.toArray(weaponsetCount);
+				
+				for(int i=0; i<weaponsetCount; i++) {
+					WeaponsetPointerByReference pstruct = (WeaponsetPointerByReference)structs[i];
+					pstruct.weaponset = new WeaponsetStruct.ByRef();
+					pstruct.weaponset.fillFrom(list.get(i));
+				}
 			}
 		}
 		
@@ -525,8 +524,8 @@
 		public RoomStruct() { super(); setFieldOrder(FIELD_ORDER); }
 		public RoomStruct(Pointer ptr) { super(ptr); setFieldOrder(FIELD_ORDER); }
 
-		public RoomlistRoom toRoomlistRoom() {
-			return new RoomlistRoom(name, map, scheme, weapons, owner, playerCount, teamCount, inProgress);
+		public Room toRoomlistRoom() {
+			return new Room(name, map, scheme, weapons, owner, playerCount, teamCount, inProgress);
 		}
 		
 	    public boolean inProgress;
@@ -641,31 +640,11 @@
 		public static class ByVal extends MetaschemeStruct implements Structure.ByValue {}
 		public static class ByRef extends MetaschemeStruct implements Structure.ByReference {}
 
-		private static String[] FIELD_ORDER = new String[] {"_referenceCount", "settingCount", "modCount", "settings", "mods"};
+		private static String[] FIELD_ORDER = new String[] {"settingCount", "modCount", "settings", "mods"};
 		
 		public MetaschemeStruct() { super(); setFieldOrder(FIELD_ORDER); }
 		public MetaschemeStruct(Pointer ptr) { super(ptr); setFieldOrder(FIELD_ORDER); }
 		
-		public void fillFrom(MetaScheme metascheme) {
-			settingCount = metascheme.settings.size();
-			modCount = metascheme.mods.size();
-			
-			settings = new MetaschemeSettingStruct.ByRef();
-			Structure[] settingStructs = settings.toArray(settingCount);
-			mods = new MetaschemeModStruct.ByRef();
-			Structure[] modStructs = mods.toArray(modCount);
-			
-			for(int i=0; i<settingCount; i++) {
-				MetaschemeSettingStruct mss = (MetaschemeSettingStruct)settingStructs[i];
-				mss.fillFrom(metascheme.settings.get(i));
-			}
-			
-			for(int i=0; i<modCount; i++) {
-				MetaschemeModStruct mms = (MetaschemeModStruct)modStructs[i];
-				mms.fillFrom(metascheme.mods.get(i));
-			}
-		}
-		
 		/**
 		 * Only use on native-owned structs!
 		 * Calling this method on a Java-owned struct could cause garbage collection of referenced
@@ -691,7 +670,6 @@
 			return new MetaScheme(modList, settingList);
 		}
 		
-		public int _referenceCount;
 		public int settingCount;
 		public int modCount;
 		public MetaschemeSettingStruct.ByRef settings;
@@ -701,41 +679,39 @@
 	static class SchemeStruct extends Structure {
 		public static class ByVal extends SchemeStruct implements Structure.ByValue {}
 		public static class ByRef extends SchemeStruct implements Structure.ByReference {}
-		private static String[] FIELD_ORDER = new String[] {"meta", "name", "settings", "mod"};
+		private static String[] FIELD_ORDER = new String[] {"name", "settings", "mod"};
 		
 		public SchemeStruct() { super(); setFieldOrder(FIELD_ORDER); }
 		public SchemeStruct(Pointer ptr) { super(ptr); setFieldOrder(FIELD_ORDER); }
 		
 		public void fillFrom(Scheme scheme) {
-			meta = new MetaschemeStruct.ByRef();
-			meta.fillFrom(scheme.metascheme);
+			MetaScheme meta = MetaScheme.INSTANCE;
 			name = scheme.name;
-			settings = new Memory(NATIVE_INT_SIZE * scheme.metascheme.settings.size());
-			for(int i=0; i<scheme.metascheme.settings.size(); i++) {
-				Integer value = scheme.settings.get(scheme.metascheme.settings.get(i).name);
+			settings = new Memory(NATIVE_INT_SIZE * meta.settings.size());
+			for(int i=0; i<meta.settings.size(); i++) {
+				Integer value = scheme.settings.get(meta.settings.get(i).name);
 				settings.setInt(NATIVE_INT_SIZE*i, value);
 			}
-			mods = new Memory(NATIVE_BOOL_SIZE * scheme.metascheme.mods.size());
-			for(int i=0; i<scheme.metascheme.mods.size(); i++) {
-				Boolean value = scheme.mods.get(scheme.metascheme.mods.get(i).name);
+			mods = new Memory(NATIVE_BOOL_SIZE * meta.mods.size());
+			for(int i=0; i<meta.mods.size(); i++) {
+				Boolean value = scheme.mods.get(meta.mods.get(i).name);
 				mods.setByte(NATIVE_BOOL_SIZE*i, (byte)(value ? 1 : 0));
 			}
 		}
 
 		public Scheme toScheme() {
-			MetaScheme metaScheme = meta.toMetaScheme();
 			Map<String, Integer> settingsMap = new HashMap<String, Integer>();
-			for(int i=0; i<metaScheme.settings.size(); i++) {
-				settingsMap.put(metaScheme.settings.get(i).name, settings.getInt(NATIVE_INT_SIZE*i));
+			MetaScheme meta = MetaScheme.INSTANCE;
+			for(int i=0; i<meta.settings.size(); i++) {
+				settingsMap.put(meta.settings.get(i).name, settings.getInt(NATIVE_INT_SIZE*i));
 			}
 			Map<String, Boolean> modsMap = new HashMap<String, Boolean>();
-			for(int i=0; i<metaScheme.mods.size(); i++) {
-				modsMap.put(metaScheme.mods.get(i).name, mods.getByte(i) != 0 ? Boolean.TRUE : Boolean.FALSE);
+			for(int i=0; i<meta.mods.size(); i++) {
+				modsMap.put(meta.mods.get(i).name, mods.getByte(i) != 0 ? Boolean.TRUE : Boolean.FALSE);
 			}
-			return new Scheme(metaScheme, name, settingsMap, modsMap);
+			return new Scheme(name, settingsMap, modsMap);
 		}
 		
-		public MetaschemeStruct.ByRef meta;
 		public String name;
 		public Pointer settings;
 		public Pointer mods;
@@ -763,13 +739,17 @@
 		
 		public void fillFrom(List<Scheme> schemeList) {
 			schemeCount = schemeList.size();
-			schemes = new SchemePointerByReference();
-			Structure[] schemePtrStructs = schemes.toArray(schemeCount);
-			
-			for(int i=0; i<this.schemeCount; i++) {
-				SchemePointerByReference spbr = (SchemePointerByReference)schemePtrStructs[i];
-				spbr.scheme = new SchemeStruct.ByRef();
-				spbr.scheme.fillFrom(schemeList.get(i));
+			if(schemeCount<=0) {
+				schemes = null;
+			} else {
+				schemes = new SchemePointerByReference();
+				Structure[] schemePtrStructs = schemes.toArray(schemeCount);
+				
+				for(int i=0; i<this.schemeCount; i++) {
+					SchemePointerByReference spbr = (SchemePointerByReference)schemePtrStructs[i];
+					spbr.scheme = new SchemeStruct.ByRef();
+					spbr.scheme.fillFrom(schemeList.get(i));
+				}
 			}
 		}
 
@@ -821,13 +801,17 @@
 		
 		public void fillFrom(List<TeamInGame> teamList, WeaponsetStruct.ByRef weaponset, int initialHealth) {
 			teamCount = teamList.size();
-			teams = new TeamPointerByReference();
-			Structure[] teamPtrStructs = teams.toArray(teamCount);
-			
-			for(int i=0; i<this.teamCount; i++) {
-				TeamPointerByReference tpbr = (TeamPointerByReference)teamPtrStructs[i];
-				tpbr.team = new TeamStruct.ByRef();
-				tpbr.team.fillFrom(teamList.get(i), weaponset, initialHealth);
+			if(teamCount <= 0) {
+				teams = null;
+			} else {
+				teams = new TeamPointerByReference();
+				Structure[] teamPtrStructs = teams.toArray(teamCount);
+				
+				for(int i=0; i<this.teamCount; i++) {
+					TeamPointerByReference tpbr = (TeamPointerByReference)teamPtrStructs[i];
+					tpbr.team = new TeamStruct.ByRef();
+					tpbr.team.fillFrom(teamList.get(i), weaponset, initialHealth);
+				}
 			}
 		}
 
@@ -986,7 +970,8 @@
     int flib_get_teamcolor_count();
     int flib_get_hedgehogs_per_team();
     int flib_get_weapons_count();
-    
+	MetaschemePtr flib_get_metascheme();
+	
     // net/netconn.h
 	static final int NETCONN_STATE_CONNECTING = 0;
 	static final int NETCONN_STATE_LOBBY = 1;
@@ -1016,7 +1001,7 @@
 	static final int NETCONN_MAPCHANGE_THEME = 6;
 	static final int NETCONN_MAPCHANGE_SEED = 7;
     
-	NetconnPtr flib_netconn_create(String playerName, MetaschemePtr meta, String dataDirPath, String host, int port);
+	NetconnPtr flib_netconn_create(String playerName, String dataDirPath, String host, int port);
 	void flib_netconn_destroy(NetconnPtr conn);
 
 	void flib_netconn_tick(NetconnPtr conn);
@@ -1036,7 +1021,7 @@
 	int flib_netconn_send_toggleReady(NetconnPtr conn);
 	int flib_netconn_send_addTeam(NetconnPtr conn, TeamPtr team);
 	int flib_netconn_send_removeTeam(NetconnPtr conn, String teamname);
-	int flib_netconn_send_engineMessage(NetconnPtr conn, Buffer message, NativeLong size);
+	int flib_netconn_send_engineMessage(NetconnPtr conn, Pointer message, NativeLong size);
 	int flib_netconn_send_teamHogCount(NetconnPtr conn, String teamname, int hogcount);
 	int flib_netconn_send_teamColor(NetconnPtr conn, String teamname, int colorIndex);
 	int flib_netconn_send_weaponset(NetconnPtr conn, WeaponsetPtr weaponset);
@@ -1047,7 +1032,7 @@
 	int flib_netconn_send_mapMazeSize(NetconnPtr conn, int mazeSize);
 	int flib_netconn_send_mapSeed(NetconnPtr conn, String seed);
 	int flib_netconn_send_mapTheme(NetconnPtr conn, String theme);
-	int flib_netconn_send_mapDrawdata(NetconnPtr conn, Buffer drawData, NativeLong size);
+	int flib_netconn_send_mapDrawdata(NetconnPtr conn, Pointer drawData, NativeLong size);
 	int flib_netconn_send_script(NetconnPtr conn, String scriptName);
 	int flib_netconn_send_scheme(NetconnPtr conn, SchemePtr scheme);
 	int flib_netconn_send_roundfinished(NetconnPtr conn, boolean withoutError);
@@ -1109,7 +1094,7 @@
 	int flib_gameconn_getport(GameconnPtr conn);
 	void flib_gameconn_tick(GameconnPtr conn);
 
-	int flib_gameconn_send_enginemsg(GameconnPtr conn, Buffer data, NativeLong len);
+	int flib_gameconn_send_enginemsg(GameconnPtr conn, Pointer data, NativeLong len);
 	int flib_gameconn_send_textmsg(GameconnPtr conn, int msgtype, String msg);
 	int flib_gameconn_send_chatmsg(GameconnPtr conn, String playername, String msg);
 	int flib_gameconn_send_quit(GameconnPtr conn);
@@ -1122,6 +1107,10 @@
 	void flib_gameconn_onEngineMessage(GameconnPtr conn, BytesCallback callback, Pointer context);
 	
 	// ipc/mapconn.h
+	public static final int MAPIMAGE_WIDTH = 256;
+	public static final int MAPIMAGE_HEIGHT = 128;
+	public static final int MAPIMAGE_BYTES = (MAPIMAGE_WIDTH/8*MAPIMAGE_HEIGHT);
+	
 	MapconnPtr flib_mapconn_create(MapRecipePtr mapdesc);
 	void flib_mapconn_destroy(MapconnPtr conn);
 	int flib_mapconn_getport(MapconnPtr conn);
@@ -1149,13 +1138,8 @@
 	public static final int MAZE_SIZE_MEDIUM_ISLANDS = 4;
 	public static final int MAZE_SIZE_LARGE_ISLANDS = 5;
 		
-	// model/scheme.h
-	MetaschemePtr flib_metascheme_from_ini(String filename);
-	MetaschemePtr flib_metascheme_retain(MetaschemePtr metainfo);
-	void flib_metascheme_release(MetaschemePtr metainfo);
-
 	// model/schemelist.h
-	SchemelistPtr flib_schemelist_from_ini(MetaschemePtr meta, String filename);
+	SchemelistPtr flib_schemelist_from_ini(String filename);
 	int flib_schemelist_to_ini(String filename, SchemelistPtr list);
 	void flib_schemelist_destroy(SchemelistPtr list);
 	
@@ -1169,6 +1153,9 @@
 	int flib_weaponsetlist_to_ini(String filename, WeaponsetListPtr weaponsets);
 	void flib_weaponsetlist_destroy(WeaponsetListPtr list);
 	
+	// model/gamesetup.h
+	void flib_gamesetup_destroy(GameSetupPtr gamesetup);
+	
 	// util/logging.h
 	public static final int FLIB_LOGLEVEL_ALL = -100;
 	public static final int FLIB_LOGLEVEL_DEBUG = -1;