Skip to content
This repository has been archived by the owner on May 21, 2023. It is now read-only.

Commit

Permalink
ONM Update
Browse files Browse the repository at this point in the history
  • Loading branch information
docent27 committed Apr 2, 2022
1 parent e8c9229 commit b6910b7
Show file tree
Hide file tree
Showing 67 changed files with 3,892 additions and 617 deletions.
58 changes: 25 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,53 @@
# OMW (неофіційна збірка openmw для android)
# ВАЖЛИВА ІНФОРМАЦІЯ - У зв'язку з нападом росії на територію України, я припиняю підтримку ціеї програми на російскій мові!
# ВАЖЛИВА ІНФОРМАЦІЯ - У зв'язку з нападом росії на територію України, я припиняю підтримку цієї програми на російській мові!

Автор оригінального коду припинив підтримку. Тепер ви перебуваєте на сторінці форка цієї програми. Я не готовий дати 100% гарантію, що програма буде працювати ідеально у вас.

Я не є офіційним членом розробників OpenMW. Якщо у вас виникли проблеми з роботою цього додатка на вашому смартфоні, я щиро прошу, НЕ повідомляли про розробників OpenMW, вони офіційно не підтримують цей порт. Будь ласка, поставтеся з розумінням. Спасибі.
Я не є офіційним членом розробників OpenMW. Якщо у вас виникли проблеми з роботою цього додатка на вашому смартфоні, я щиро прошу, НЕ повідомляли про розробників OpenMW, вони офіційно не підтримують цей порт. Будь ласка, поставитися з розумінням. Спасибі.

Існує два кроки для створення OpenMW для Android. Першим кроком є створення бібліотек C/C++. Другим кроком є створення програми запуску Java.

# Передумови
# Підготовка до гри

Вам знадобляться встановлені стандартні інструменти, які, ймовірно, у вас вже є (bash, gcc, g++, sha256sum, unzip).
Для того, щоб грати в гру, яка має назву The Elder Scrolls III: Morrowind на вашому Android пристрої, у вас в першу чергу повинна бути ліцензійна копія самої гри, яку ви можете придбати у магазинах Steam чи GOG. Посилання на придбання ліцензії за посиланнями на вибір.
https://store.steampowered.com/app/22320/The_Elder_Scrolls_III_Morrowind_Game_of_the_Year_Edition/
https://www.gog.com/game/the_elder_scrolls_iii_morrowind_goty_edition

CMake 3.6.0 або новіша версія **потрібна**, ви можете завантажити останню версію [тут](https://cmake.org/download/) (і розмістити у своєму `PATH`), якщо ваш дистрибутив постачається із застарілою версія.
Далі вам потрібно завантажити на свій телефон з вашого ПК папку з ресурсами гри, яка має назву "Data Files".
Після цього ви можете запустити лаунчер гри.

Крім того, щоб створити програму запуску, вам знадобиться встановлений Android SDK. Рекомендується використовувати Android Studio, яка може налаштувати його для вас (див. крок 2).
# Налаштування в лаунчері

# Крок 1: Створіть бібліотеки
Мова - тут ви можете настроїти мову, на якій у вас файли гри.

Перейдіть до каталогу `buildscripts` і запустіть `./build.sh`. Сценарій автоматично завантажить набір інструментів Android і всі залежності, а також скомпілює та встановить їх.
Файли гри - тут потрібно вибрати директорію, куди ви завантажили файли гри, це повинен буди каталог, в якому є morrowind.ini та папка Data Files.

# Крок 2: Створіть програму запуску Java
Моди - тут ви можете вибрати додаткові моди та ресурси гри.

Щоб отримати файл APK, який можна встановити, відкрийте каталог `openmw-android` в Android Studio та запустіть проект.
Екранне керування - тут можно налаштувати всі елементи екранного керування за своїм смаком.

Крім того, якщо у вас не встановлена ​​Android Studio або ви не хочете її використовувати, запустіть `./gradlew assembleDebug` з кореневого каталогу цього репозиторію. Отриманий файл .apk, розташований за адресою `./app/build/outputs/apk/debug/app-debug.apk`, можна перенести на пристрій та встановити.
Режим керування - тип керування у грі. Джойстик - керування імітуе роботу тачпада на ноутбуці. Тачскрін - керування більш класичне для пристроїв з сенсорним екраном. Гібрид - поєднує всі переваги кожного з типів (тип керування за дефолтом).

# Примітки для розробників
Масштаб інтерфейсу - можно налаштувати масштаб ігрового інтерфейсу (окна, текст), якщо текст дуже маленький, або навпаки, дуже великий масштаб та текст не поміщається в єкран.

Сховати екранне керування - якщо включити, на екрані не буде жодного елементу керування. Добре підходить для гри на геймпаді та на смарт-тв.

Відображати всі кнопки - якщо включити, на екрані завжди будуть відображатись всі основні кнопки гри. Коли вимкнено - верхній ряд кнопок схований, його можно визвати під час гри нажавши на іконку з трїома рисочками.

# Налагодження рідного коду
Увімкнути швидкі кнопки - можна вивести на єкран додаткові кнопки (цифри від 0-9).

Ви можете налагодити рідний код за допомогою `ndk-gdb`. Щоб використовувати його, після того, як ви створили і бібліотеки, і apk, і встановили apk, запустіть програму і нехай вона залишиться в головному меню. Потім `cd` до `app/src/main` і запустіть `./gdb.sh [arch]`. Змінна `arch` має відповідати бібліотеці, яку використовуватиме ваш пристрій (один із `arm`, `arm64`, `x86_64`, `x86`; `arm` є за замовчуванням).
Увімкнути FN кнопки - можна вивести на єкран додаткові кнопки (F1, F3, F4, F10, F11).

Це також автоматично дозволяє gdb використовувати нерозчіслені бібліотеки, тож ви отримуєте правильні символи, посилання на вихідний код тощо.
Экран завжди увімкнено - якщо включено, єкран буде працювати постійно, поки ви не вийшли з гри, в іньшому разі, єкран буде з годом гаснути.

# Запущений Address Sanitizer
Графічна бібліотека - на вибір два варіанта вивода зображення на єкран, GLES1 - цей варіант дуже устарілий та вмикати його треба лише тоді, коли у вас є проблеми з продуктивністю. GLES2 - оптимальний варіант для гри.

Щоб зібрати все з ASAN:b267e232cd7a370ea45d096a551fcdab0d55a3e2
Деталізація LOG файлу - як що у вас е якісь проблеми з модами чи щось у грі працюе погано, можно включити LOG та подивитись проблему у вайлі openmw.log, який знаходится в діректорії OMW.

```
# Очистіть попередню збірку
./clean.sh
# Створення з увімкненим ASAN і символами налагодження
./build.sh --ccache --asan --debug
# Або: ./build.sh --ccache --asan --debug --arch arm64
```

Потім відкрийте Android Studio, скомпілюйте та встановіть проект.

Щоб отримати символізований вихід:

```
adb logcat | ./tool/asan_symbolize.py --demangle -s ./symbols/armeabi-v7a/
# Або: adb logcat | ./tool/asan_symbolize.py --demangle -s ./symbols/arm64-v8a/
```
Також, якщо натиснути у верхній правій частини лаунчеру на іконку "три крапки", зʼявиться меню, в якому ви можете зробити скидання налаштувань а також вибрати готовий пресет графічних налаштувань під ваш гаджет. Рекомендований пресет - сбалансований. Якщо у вас слабкий гаджет, ви можете вибрати пресет "продуктивність", та навпаки, якщо у вас дуже потужний девайс, виберіть "Якість зображення" та насолоджуйтесь дуже високою якістю графіки.

# Про це програмне забезпеченя

Оригінальний код Java, написаний Sandstranger та xyzz. Білдскипти були написані Sandstranger і bwhaine.


27 changes: 8 additions & 19 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,17 @@ android {
main {
resources {
srcDir {
// To include the wrap.sh script required by ASAN
"wrap/res"
}
}
}
}

defaultConfig {
applicationId "is.xyz.omw"
versionCode 46
versionName calculateVersion()

applicationId "is.docent27.omw"
versionCode 47
versionName "0.47"
minSdkVersion 21
// Do not update past 29 -- see https://github.com/xyzz/openmw-android/issues/30
targetSdkVersion 29

ndk {
Expand All @@ -54,22 +51,18 @@ android {
}

debug {
applicationIdSuffix ".debug"
debuggable true
debuggable false
}
}

flavorDimensions "version"

productFlavors {
mainline {
dimension "version"
}

nightly {
dimension "version"
applicationId "is.xyz.omw_nightly"
versionNameSuffix "-nightly"
}
}

Expand All @@ -81,16 +74,12 @@ android {
}

dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'

implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation project(':storagechooser')

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.anko:anko-sqlite:$anko_version"

implementation 'com.bugsnag:bugsnag-android-ndk:4.+'

testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.2'
}
7 changes: 3 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,20 @@
<!-- Allow writing to external storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
android:requestLegacyExternalStorage="true"
android:name="utils.MyApp"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:label="OpenNewerMind"
android:theme="@style/MyTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity
android:name="ui.activity.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:label="OpenNewerMind"
android:screenOrientation="fullUser">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down Expand Up @@ -47,4 +46,4 @@
/>
</application>

</manifest>
</manifest>
40 changes: 10 additions & 30 deletions app/src/main/java/ui/activity/GameActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import org.libsdl.app.SDLActivity

import constants.Constants
import cursor.MouseCursor
import parser.CommandlineParser
import ui.controls.Osc

import utils.Utils.hideAndroidControls
Expand Down Expand Up @@ -69,17 +68,6 @@ class GameActivity : SDLActivity() {
override fun loadLibraries() {
prefs = PreferenceManager.getDefaultSharedPreferences(this)
val graphicsLibrary = prefs!!.getString("pref_graphicsLibrary_v2", "")
val physicsFPS = prefs!!.getString("pref_physicsFPS2", "")
if (!physicsFPS!!.isEmpty()) {
try {
Os.setenv("OPENMW_PHYSICS_FPS", physicsFPS, true)
Os.setenv("OSG_TEXT_SHADER_TECHNIQUE", "NO_TEXT_SHADER", true)
} catch (e: ErrnoException) {
Log.e("OpenMW", "Failed setting environment variables.")
e.printStackTrace()
}

}

System.loadLibrary("c++_shared")
System.loadLibrary("openal")
Expand All @@ -88,25 +76,23 @@ class GameActivity : SDLActivity() {
try {
Os.setenv("OPENMW_GLES_VERSION", "2", true)
Os.setenv("LIBGL_ES", "2", true)
Os.setenv("OSG_VERTEX_BUFFER_HINT", "VBO", true)
Os.setenv("LIBGL_NOHIGHP", "1", true)
Os.setenv("LIBGL_NOPSA", "1", true)
Os.setenv("OSG_TEXT_SHADER_TECHNIQUE", "ALL", true)
} catch (e: ErrnoException) {
Log.e("OpenMW", "Failed setting environment variables.")
e.printStackTrace()
}

}

val envline: String = PreferenceManager.getDefaultSharedPreferences(this).getString("envLine", "").toString()
if (envline.length > 0) {
val envs: List<String> = envline.split(" ", "\n")
var i = 0

repeat(envs.count())
{
val env: List<String> = envs[i].split("=")
if (env.count() == 2) Os.setenv(env[0], env[1], true)
i = i + 1
}
}
val omwDebugLevel = prefs!!.getString("pref_debug_level", "")
if (omwDebugLevel == "DEBUG") Os.setenv("OPENMW_DEBUG_LEVEL", "DEBUG", true)
if (omwDebugLevel == "VERBOSE") Os.setenv("OPENMW_DEBUG_LEVEL", "VERBOSE", true)
if (omwDebugLevel == "INFO") Os.setenv("OPENMW_DEBUG_LEVEL", "INFO", true)
if (omwDebugLevel == "WARNING") Os.setenv("OPENMW_DEBUG_LEVEL", "WARNING", true)
if (omwDebugLevel == "ERROR") Os.setenv("OPENMW_DEBUG_LEVEL", "ERROR", true)

System.loadLibrary("GL")
System.loadLibrary("openmw")
Expand Down Expand Up @@ -159,12 +145,6 @@ class GameActivity : SDLActivity() {
}
}

override fun getArguments(): Array<String> {
val cmd = PreferenceManager.getDefaultSharedPreferences(this).getString("commandLine", "")
val commandlineParser = CommandlineParser(cmd!!)
return commandlineParser.argv
}

private external fun getPathToJni(path_global: String, path_user: String)

companion object {
Expand Down
Loading

0 comments on commit b6910b7

Please sign in to comment.