diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7b9dc7cf..e9915a46 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -16,5 +16,17 @@ + + + + + + + + + + + + diff --git a/android/build-manual.sh b/android/build-manual.sh index 34b828b2..db7f32a4 100644 --- a/android/build-manual.sh +++ b/android/build-manual.sh @@ -2,12 +2,15 @@ ANDROID_JAR=../android-13.jar AAPT=./../aapt DX=./../dx APKBUILDER=./../apkbuilder -NAME=mod +NAME=gravgun mkdir bin mkdir bin/classes +mkdir assets/ $AAPT package -M AndroidManifest.xml -m -S res -I $ANDROID_JAR -$JAVA_HOME/bin/javac -d bin/classes -s bin/classes -cp $ANDROID_JAR src/in/celest/xash3d/LauncherActivity.java +$JAVA_HOME/bin/javac -d bin/classes -s bin/classes -cp $ANDROID_JAR src/in/celest/xash3d/* $DX --dex --output=bin/classes.dex bin/classes/ $AAPT package -f -M AndroidManifest.xml -S res -I $ANDROID_JAR -F bin/$NAME.apk.unaligned +python2 makepak.py pak/ assets/extras.pak +zip -r bin/$NAME.apk.unaligned assets/ $APKBUILDER bin/$NAME.apk -u -nf libs/ -rj libs -f bin/classes.dex -z bin/$NAME.apk.unaligned #java -jar /mnt/app/apktool/signapk.jar /mnt/app/apktool/testkey.x509.pem /mnt/app/apktool/testkey.pk8 bin/$NAME.apk bin/$NAME-signed.apk diff --git a/android/pak/models/p_gravcannon.mdl b/android/pak/models/p_gravcannon.mdl new file mode 100644 index 00000000..53ebfe0e Binary files /dev/null and b/android/pak/models/p_gravcannon.mdl differ diff --git a/android/pak/models/v_gravcannon.mdl b/android/pak/models/v_gravcannon.mdl new file mode 100644 index 00000000..dd886c31 Binary files /dev/null and b/android/pak/models/v_gravcannon.mdl differ diff --git a/android/pak/models/w_gravcannon.mdl b/android/pak/models/w_gravcannon.mdl new file mode 100644 index 00000000..a024326e Binary files /dev/null and b/android/pak/models/w_gravcannon.mdl differ diff --git a/android/pak/models/w_gravcannont.mdl b/android/pak/models/w_gravcannont.mdl new file mode 100644 index 00000000..c999697c Binary files /dev/null and b/android/pak/models/w_gravcannont.mdl differ diff --git a/android/pak/sprites/weapon_gravgun.txt b/android/pak/sprites/weapon_gravgun.txt new file mode 100644 index 00000000..632ffa04 --- /dev/null +++ b/android/pak/sprites/weapon_gravgun.txt @@ -0,0 +1,9 @@ +8 +weapon 320 320hud1 80 120 80 20 +weapon_s 320 320hud1 80 140 80 20 +ammo 320 320hud2 0 34 18 18 +crosshair 320 crosshairs 72 48 24 24 +weapon 640 640hud2 0 135 170 45 +weapon_s 640 640hud5 0 135 170 45 +ammo 640 640hud7 0 96 24 24 +crosshair 640 crosshairs 72 48 24 24 \ No newline at end of file diff --git a/android/src/in/celest/xash3d/InstallReceiver.java b/android/src/in/celest/xash3d/InstallReceiver.java new file mode 100644 index 00000000..7aee5cf3 --- /dev/null +++ b/android/src/in/celest/xash3d/InstallReceiver.java @@ -0,0 +1,14 @@ +package in.celest.xash3d; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +public class InstallReceiver extends BroadcastReceiver { +private static final String TAG = "MOD_LAUNCHER"; +@Override +public void onReceive(Context context, Intent arg1) { + Log.d( TAG, "Install received, extracting PAK" ); + LauncherActivity.extractPAK( context, true ); + } +} diff --git a/android/src/in/celest/xash3d/LauncherActivity.java b/android/src/in/celest/xash3d/LauncherActivity.java index 91619ee3..2271a7c1 100644 --- a/android/src/in/celest/xash3d/LauncherActivity.java +++ b/android/src/in/celest/xash3d/LauncherActivity.java @@ -16,10 +16,19 @@ import android.widget.TextView; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.SharedPreferences; +import java.lang.reflect.Method; +import java.io.FileOutputStream; +import java.io.File; +import java.io.InputStream; +import android.content.Context; +import android.util.Log; public class LauncherActivity extends Activity { + private static final int PAK_VERSION = 1; + static Boolean isExtracting = false; static EditText cmdArgs; static SharedPreferences mPref; + private static final String TAG = "MOD_LAUNCHER"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -51,6 +60,7 @@ public class LauncherActivity extends Activity { launcher.addView(startButton); setContentView(launcher); mPref = getSharedPreferences("mod", 0); + extractPAK(this, false); cmdArgs.setText(mPref.getString("argv","-dev 3 -log")); } @@ -68,6 +78,83 @@ public class LauncherActivity extends Activity { // Uncomment to set gamedir here // intent.putExtra("gamedir", "mod" ); intent.putExtra("gamelibdir", getFilesDir().getAbsolutePath().replace("/files","/lib")); + intent.putExtra("pakfile", getFilesDir().getAbsolutePath() + "/extras.pak" ); startActivity(intent); } + private static int chmod(String path, int mode) { + int ret = -1; + try + { + ret = Runtime.getRuntime().exec("chmod " + Integer.toOctalString(mode) + " " + path).waitFor(); + Log.d(TAG, "chmod " + Integer.toOctalString(mode) + " " + path + ": " + ret ); + } + catch(Exception e) + { + ret = -1; + Log.d(TAG, "chmod: Runtime not worked: " + e.toString() ); + } + try + { + Class fileUtils = Class.forName("android.os.FileUtils"); + Method setPermissions = fileUtils.getMethod("setPermissions", + String.class, int.class, int.class, int.class); + ret = (Integer) setPermissions.invoke(null, path, + mode, -1, -1); + } + catch(Exception e) + { + ret = -1; + Log.d(TAG, "chmod: FileUtils not worked: " + e.toString() ); + } + return ret; + } + + private static void extractFile(Context context, String path) { + try + { + InputStream is = null; + FileOutputStream os = null; + is = context.getAssets().open(path); + File out = new File(context.getFilesDir().getPath()+'/'+path); + out.getParentFile().mkdirs(); + chmod( out.getParent(), 0777 ); + os = new FileOutputStream(out); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + os.close(); + is.close(); + chmod( context.getFilesDir().getPath()+'/'+path, 0777 ); + } catch( Exception e ) + { + Log.e( TAG, "Failed to extract file:" + e.toString() ); + e.printStackTrace(); + } + + } + + public static void extractPAK(Context context, Boolean force) { + if(isExtracting) + return; + isExtracting = true; + try { + if( mPref == null ) + mPref = context.getSharedPreferences("mod", 0); + if( mPref.getInt( "pakversion", 0 ) == PAK_VERSION && !force ) + return; + extractFile(context, "extras.pak"); + + SharedPreferences.Editor editor = mPref.edit(); + editor.putInt( "pakversion", PAK_VERSION ); + editor.commit(); + editor.apply(); + } catch( Exception e ) + { + Log.e( TAG, "Failed to extract PAK:" + e.toString() ); + } + isExtracting = false; + } + }