diff --git a/.gitignore b/.gitignore
index 1adb744..8530700 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
*.dll
*.so
*.pro.autosave
+*.pro.user
base_override.h
.DS_Store
@@ -21,6 +22,7 @@ debug/
Makefile*
object_script*
+/android/gradle*
/Attorney_Online_remake_resource.rc
/attorney_online_remake_plugin_import.cpp
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e2abad6..92209a1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,6 +23,8 @@ build linux x86_64:
- >
apt-get install --no-install-recommends -y qt5-default qtmultimedia5-dev
clang make git sudo curl ca-certificates pkg-config upx unzip
+ - git submodule init
+ - git submodule update
# Print versions
- qmake --version
@@ -75,6 +77,8 @@ build windows i686:
# Install dependencies
- apt-get update
- apt-get install --no-install-recommends -y make curl ca-certificates upx unzip
+ - git submodule init
+ - git submodule update
# Extract BASS
- mkdir bass
@@ -124,7 +128,7 @@ deploy linux x86_64:
- *deploy_misc
# Platform-specific
- - cp -a ../lib/*.so .
+ - cp -a ../lib/* .
- cp -a ../bin/Attorney_Online .
- echo "#!/bin/sh" >> ./run.sh
- echo "LD_LIBRARY_PATH=.:\$LD_LIBRARY_PATH ./Attorney_Online" >> ./run.sh
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..1376cc1
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "base/themes"]
+ path = base/themes
+ url = https://github.com/AttorneyOnline/AO2-Themes
diff --git a/Attorney_Online.pro b/Attorney_Online.pro
index 32781a1..941f89b 100644
--- a/Attorney_Online.pro
+++ b/Attorney_Online.pro
@@ -3,7 +3,7 @@ QT += core gui widgets network
TARGET = Attorney_Online
TEMPLATE = app
-VERSION = 2.6.2.0
+VERSION = 2.7.2.0
INCLUDEPATH += $$PWD/include
DESTDIR = $$PWD/bin
@@ -34,6 +34,10 @@ contains(DEFINES, QTAUDIO) {
QT += multimedia
}
+contains(CONFIG, qml_debug) {
+DEFINES += DEBUG_NETWORK
+}
+
macx:LIBS += -framework CoreFoundation -framework Foundation -framework CoreServices
@@ -45,7 +49,19 @@ TRANSLATIONS = resource/translations/ao_en.ts \
resource/translations/ao_jp.ts \
resource/translations/ao_de.ts \
resource/translations/ao_ru.ts \
- resource/translations/ao_es.ts
+ resource/translations/ao_es.ts \
+ resource/translations/ao_pl.ts
win32:RC_ICONS = resource/logo.ico
macx:ICON = resource/logo.icns
+
+android:DISTFILES += \
+ android/AndroidManifest.xml \
+ android/build.gradle \
+ android/gradle/wrapper/gradle-wrapper.jar \
+ android/gradle/wrapper/gradle-wrapper.properties \
+ android/gradlew \
+ android/gradlew.bat \
+ android/res/values/libs.xml
+
+ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
diff --git a/README.md b/README.md
index 0416e4a..5d8e2c6 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,14 @@ If you begin a message with `~~` (two tildes), the two tildes are removed and th
If two players are in the same position and select each other's characters using the in-game pair list (or with `/pair [id]`), they will appear alongside each other. You can set the offset of your character using the provided spinbox (or with `/offset [percentage]`).
+### Screenflash (2.6+)
+
+Placing a `$` (dollar symbol) at any point in the message will cause a white flash to appear at that point, and the symbol will disappear. You can do this multiple times in one message and stack it up with any other markup symbol. The flash will be silent, unlike the equivalent button.
+
+### Screenshake (2.6+)
+
+Placing an `@` (at symbol) at any point in the message will cause the screen to shake at that point, and the symbol will disappear. You can do this multiple times in one message and stack it up with any other markup symbol (including the screenflash).
+
### Non-interrupting preanimations (2.6+)
When checked, this will force text to immediately begin displaying without waiting for the preanimation to finish.
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000..0792ce8
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..3087d08
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,62 @@
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.5.0'
+ }
+}
+
+repositories {
+ google()
+ jcenter()
+}
+
+apply plugin: 'com.android.application'
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
+}
+
+android {
+ /*******************************************************
+ * The following variables:
+ * - androidBuildToolsVersion,
+ * - androidCompileSdkVersion
+ * - qt5AndroidDir - holds the path to qt android files
+ * needed to build any Qt application
+ * on Android.
+ *
+ * are defined in gradle.properties file. This file is
+ * updated by QtCreator and androiddeployqt tools.
+ * Changing them manually might break the compilation!
+ *******************************************************/
+
+ compileSdkVersion androidCompileSdkVersion.toInteger()
+
+ buildToolsVersion '28.0.3'
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
+ aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
+ res.srcDirs = [qt5AndroidDir + '/res', 'res']
+ resources.srcDirs = ['resources']
+ renderscript.srcDirs = ['src']
+ assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ // Do not compress Qt binary resources file
+ aaptOptions {
+ noCompress 'rcc'
+ }
+}
diff --git a/android/project.properties b/android/project.properties
new file mode 100644
index 0000000..a08f37e
--- /dev/null
+++ b/android/project.properties
@@ -0,0 +1 @@
+target=android-21
\ No newline at end of file
diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000..f53fe30
Binary files /dev/null and b/android/res/drawable-ldpi/icon.png differ
diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml
new file mode 100644
index 0000000..6b1a4a2
--- /dev/null
+++ b/android/res/values/libs.xml
@@ -0,0 +1,22 @@
+
+
+
+ https://download.qt.io/ministro/android/qt5/qt-5.14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/base/sounds/general/adminhelp.ogg b/base/sounds/general/adminhelp.ogg
new file mode 100644
index 0000000..704c0fd
Binary files /dev/null and b/base/sounds/general/adminhelp.ogg differ
diff --git a/base/sounds/general/case_announced.ogg b/base/sounds/general/case_announced.ogg
new file mode 100644
index 0000000..1e9c3d4
Binary files /dev/null and b/base/sounds/general/case_announced.ogg differ
diff --git a/base/sounds/music/failed_login.opus b/base/sounds/music/failed_login.opus
new file mode 100644
index 0000000..33532ee
Binary files /dev/null and b/base/sounds/music/failed_login.opus differ
diff --git a/base/themes b/base/themes
new file mode 160000
index 0000000..6e1317e
--- /dev/null
+++ b/base/themes
@@ -0,0 +1 @@
+Subproject commit 6e1317ed93a9a4831047aa151c28742b1dd8afb5
diff --git a/base/themes/1.8/arrow_left.png b/base/themes/1.8/arrow_left.png
deleted file mode 100644
index f1098c4..0000000
Binary files a/base/themes/1.8/arrow_left.png and /dev/null differ
diff --git a/base/themes/1.8/arrow_right.png b/base/themes/1.8/arrow_right.png
deleted file mode 100644
index 2b5ad70..0000000
Binary files a/base/themes/1.8/arrow_right.png and /dev/null differ
diff --git a/base/themes/1.8/chatmed.png b/base/themes/1.8/chatmed.png
deleted file mode 100644
index 0c3bae1..0000000
Binary files a/base/themes/1.8/chatmed.png and /dev/null differ
diff --git a/base/themes/1.8/favorites.png b/base/themes/1.8/favorites.png
deleted file mode 100644
index 0eec611..0000000
Binary files a/base/themes/1.8/favorites.png and /dev/null differ
diff --git a/base/themes/1.8/favorites_selected.png b/base/themes/1.8/favorites_selected.png
deleted file mode 100644
index f6a2abf..0000000
Binary files a/base/themes/1.8/favorites_selected.png and /dev/null differ
diff --git a/base/themes/1.8/holdit.png b/base/themes/1.8/holdit.png
deleted file mode 100644
index 09d1d37..0000000
Binary files a/base/themes/1.8/holdit.png and /dev/null differ
diff --git a/base/themes/1.8/holdit_selected.png b/base/themes/1.8/holdit_selected.png
deleted file mode 100644
index 51586e7..0000000
Binary files a/base/themes/1.8/holdit_selected.png and /dev/null differ
diff --git a/base/themes/1.8/mute.png b/base/themes/1.8/mute.png
deleted file mode 100644
index e64f702..0000000
Binary files a/base/themes/1.8/mute.png and /dev/null differ
diff --git a/base/themes/1.8/mute_pressed.png b/base/themes/1.8/mute_pressed.png
deleted file mode 100644
index 334b4ba..0000000
Binary files a/base/themes/1.8/mute_pressed.png and /dev/null differ
diff --git a/base/themes/1.8/objection.png b/base/themes/1.8/objection.png
deleted file mode 100644
index 6fbcbc2..0000000
Binary files a/base/themes/1.8/objection.png and /dev/null differ
diff --git a/base/themes/1.8/objection_selected.png b/base/themes/1.8/objection_selected.png
deleted file mode 100644
index 384e4e9..0000000
Binary files a/base/themes/1.8/objection_selected.png and /dev/null differ
diff --git a/base/themes/1.8/publicservers.png b/base/themes/1.8/publicservers.png
deleted file mode 100644
index 650c20c..0000000
Binary files a/base/themes/1.8/publicservers.png and /dev/null differ
diff --git a/base/themes/1.8/publicservers_selected.png b/base/themes/1.8/publicservers_selected.png
deleted file mode 100644
index 308c79f..0000000
Binary files a/base/themes/1.8/publicservers_selected.png and /dev/null differ
diff --git a/base/themes/1.8/takethat.png b/base/themes/1.8/takethat.png
deleted file mode 100644
index 8ff2bef..0000000
Binary files a/base/themes/1.8/takethat.png and /dev/null differ
diff --git a/base/themes/1.8/takethat_selected.png b/base/themes/1.8/takethat_selected.png
deleted file mode 100644
index 3fe0a8c..0000000
Binary files a/base/themes/1.8/takethat_selected.png and /dev/null differ
diff --git a/base/themes/default/about.png b/base/themes/default/about.png
deleted file mode 100644
index 50fc821..0000000
Binary files a/base/themes/default/about.png and /dev/null differ
diff --git a/base/themes/default/addevidence.png b/base/themes/default/addevidence.png
deleted file mode 100644
index 7a432af..0000000
Binary files a/base/themes/default/addevidence.png and /dev/null differ
diff --git a/base/themes/default/addtofav.png b/base/themes/default/addtofav.png
deleted file mode 100644
index 7d98903..0000000
Binary files a/base/themes/default/addtofav.png and /dev/null differ
diff --git a/base/themes/default/addtofav_pressed.png b/base/themes/default/addtofav_pressed.png
deleted file mode 100644
index 7b62d52..0000000
Binary files a/base/themes/default/addtofav_pressed.png and /dev/null differ
diff --git a/base/themes/default/arrow_left.png b/base/themes/default/arrow_left.png
deleted file mode 100644
index 7ed9c05..0000000
Binary files a/base/themes/default/arrow_left.png and /dev/null differ
diff --git a/base/themes/default/arrow_right.png b/base/themes/default/arrow_right.png
deleted file mode 100644
index 5acc328..0000000
Binary files a/base/themes/default/arrow_right.png and /dev/null differ
diff --git a/base/themes/default/char_passworded.png b/base/themes/default/char_passworded.png
deleted file mode 100644
index e79d071..0000000
Binary files a/base/themes/default/char_passworded.png and /dev/null differ
diff --git a/base/themes/default/char_selector.png b/base/themes/default/char_selector.png
deleted file mode 100644
index e868cdb..0000000
Binary files a/base/themes/default/char_selector.png and /dev/null differ
diff --git a/base/themes/default/char_taken.png b/base/themes/default/char_taken.png
deleted file mode 100644
index efad48d..0000000
Binary files a/base/themes/default/char_taken.png and /dev/null differ
diff --git a/base/themes/default/charselect_background.png b/base/themes/default/charselect_background.png
deleted file mode 100644
index 4480e6f..0000000
Binary files a/base/themes/default/charselect_background.png and /dev/null differ
diff --git a/base/themes/default/chat.png b/base/themes/default/chat.png
deleted file mode 100644
index e11f8c8..0000000
Binary files a/base/themes/default/chat.png and /dev/null differ
diff --git a/base/themes/default/chatbig.png b/base/themes/default/chatbig.png
deleted file mode 100644
index 177dc02..0000000
Binary files a/base/themes/default/chatbig.png and /dev/null differ
diff --git a/base/themes/default/chatmed.png b/base/themes/default/chatmed.png
deleted file mode 100644
index d2fee4a..0000000
Binary files a/base/themes/default/chatmed.png and /dev/null differ
diff --git a/base/themes/default/connect.png b/base/themes/default/connect.png
deleted file mode 100644
index 6a41e86..0000000
Binary files a/base/themes/default/connect.png and /dev/null differ
diff --git a/base/themes/default/connect_pressed.png b/base/themes/default/connect_pressed.png
deleted file mode 100644
index a99d9ec..0000000
Binary files a/base/themes/default/connect_pressed.png and /dev/null differ
diff --git a/base/themes/default/courtroom_design.ini b/base/themes/default/courtroom_design.ini
deleted file mode 100644
index eee7625..0000000
--- a/base/themes/default/courtroom_design.ini
+++ /dev/null
@@ -1,245 +0,0 @@
-; Client size. Changing it to something other than 714, 668 will stretch or
-; compress courtroombackground.png accordingly.
-courtroom = 0, 0, 714, 668
-
-; IC Area. Changing 256, 192 will stretch or compress character gifs and the
-; /bgs being used accordingly
-viewport = 0, 0, 256, 192
-
-; IC chatbox
-chatbox = 0, 174, 256, 108
-
-; IC chatbox if the current background's folder contains stand.png,
-; defensedesk.png and prosecutiondesk.png
-ao2_chatbox = 0, 174, 256, 108
-
-; Textbox for custom IC name (the "showname")
-showname = 6, 1, 256, 15
-
-; IC message, positioned within the chatbox. Changing 250 affects how
-; long text goes on before going onto the next line. Changing 89 affects
-; how many lines you can see before the message starts scrolling, based on
-; the formula of n = 25+(n-1)*16, where n is the number of lines to be
-; displayed. (ie, set it to 25 for 1 line, 41 for 2, 57 for 3, 73 for 4,
-; 89 for 5, 105 for 6... Less than 25 displays nothing)
-message = 3, 18, 250, 89
-
-; Where you type to make an IC chat message
-ic_chat_message = 2, 283, 250, 23
-
-; IC chat message if the current background's folder contains stand.png,
-; defensedesk.png and prosecutiondesk.png
-ao2_ic_chat_message = 2, 283, 250, 23
-
-; IC chatlog
-ic_chatlog = 260, 0, 231, 319
-
-; Master server chatlog
-ms_chatlog = 490, 1, 224, 277
-
-; OOC Chatlog
-server_chatlog = 490, 1, 224, 277
-
-; Where you type to make an OOC chat message
-; NOTE: THIS DOES NOT HAVE ANY VISUAL APPEARANCE
-ooc_chat_message = 492, 281, 222, 19
-
-; Where you enter your OOC name, and also where it shows up
-ooc_chat_name = 492, 300, 85, 19
-
-; Toggle between Server and Master OOC chats
-ooc_toggle = 580, 300, 133, 19
-
-; Where the jukebox is
-music_list = 490, 342, 224, 326
-
-; Jukebox search bar
-music_search = 490, 319, 100, 23
-
-found_song_color = 100, 255, 100
-missing_song_color = 255, 100, 100
-
-; Labels and sliders for music/sfx/blips
-music_label = 282, 607, 41, 16
-sfx_label = 282, 627, 41, 16
-blip_label = 282, 647, 41, 16
-music_slider = 326, 608, 140, 16
-sfx_slider = 326, 628, 140, 16
-blip_slider = 326, 648, 140, 16
-
-; Emote buttons - [490, 98] determines how many columns and rows of buttons are
-; displayed per page. 49, 49 is the ABSOLUTE MINIMUM, and displays 1 button per
-; page. Having either number lower than 49 crashes the client when you try to
-; pick a character. If you want X columns and Y rows, you would change it to
-; 49X, 49Y (ie. 490, 147 if you want 10 columns and 3 rows)
-emotes = 5, 342, 490, 98
-emote_button_spacing = 9, 9
-
-; Page togglers for emotes
-emote_left = 5, 434, 60, 32
-emote_right = 428, 434, 60, 32
-
-; Emote dropdown/emote names - Change '125' to make it longer/shorter and
-; display the full emote name or truncate it based on length
-emote_dropdown = 5, 470, 105, 20
-
-; Hold it/Take That/Objection and the "BLING!" buttons
-hold_it = 10, 310, 76, 28
-objection = 90, 310, 76, 28
-take_that = 170, 310, 76, 28
-realization = 5, 515, 42, 42
-
-; If the server supports it (AOV does not currently) - if a character has a
-; custom.gif and custom.wav in their folder, this button acts as another
-; Objection/Take That/Hold It for that character that uses the custom animation
-; and sfx. (Think Satorah! Such Insolence!, Gotcha!)
-custom_objection = 340, 565, 76, 28
-
-; Text color dropdown menu
-text_color = 115, 470, 80, 20
-
-pos_dropdown = 200, 470, 80, 20
-
-; Preanimation toggle
-pre = 5, 490, 80, 21
-
-; Flip button
-flip = 104, 490, 51, 21
-
-; Guard button
-guard = 200, 580, 61, 21
-
-pre_no_interrupt = 200, 490, 80, 21
-
-; Penalty bars and judge's buttons for penalizing. Other than the bars, these
-; ONLY show up on a character with /pos jud
-defense_bar = 5, 566, 187, 9
-prosecution_bar = 5, 582, 187, 9
-defense_plus = 183, 566, 9, 9
-defense_minus = 5, 566, 9, 9
-prosecution_plus = 183, 582, 9, 9
-prosecution_minus = 5, 582, 9, 9
-
-; Judge's buttons for WT and CE. /pos jud
-witness_testimony = 290, 470, 85, 42
-cross_examination = 290, 515, 85, 42
-
-; Buttons to change character/Reload theme/Call Mod
-change_character = 5, 610, 120, 23
-reload_theme = 5, 637, 94, 23
-call_mod = 104, 637, 64, 23
-
-; Mute button
-mute_button = 150, 515, 42, 42
-
-; Where the Mute list pops up when you click Mute
-mute_list = 280, 469, 210, 198
-
-; ???? - if there was an Area button, where the area list would show up?
-; area_list = 270, 494, 224, 174
-
-; ???? - where a password box appears if an area is password locked?
-; area_password = 266, 471, 224, 23
-
-; >Evidence meme
-evidence_button = 627, 322, 85, 18
-evidence_background = 0, 385, 490, 284
-evidence_name = 112, 4, 264, 19
-evidence_buttons = 28, 27, 430, 216
-evidence_button_spacing = 2, 3
-evidence_overlay = 24, 24, 439, 222
-evidence_delete = 78, 8, 70, 20
-evidence_image_name = 150, 8, 130, 20
-evidence_image_button = 280, 8, 60, 20
-evidence_x = 341, 8, 20, 20
-evidence_description = 78, 28, 281, 166
-evidence_left = 28, 0, 60, 24
-evidence_right = 400, 0, 60, 24
-evidence_present = 165, 247, 158, 41
-left_evidence_icon = 13, 13, 70, 70
-right_evidence_icon = 173, 13, 70, 70
-
-; Character select widgets
-char_select = 0, 0, 714, 668
-back_to_lobby = 5, 5, 91, 23
-char_password = 297, 7, 120, 22
-char_buttons = 25, 36, 663, 596
-char_button_spacing = 7, 7
-char_select_left = 100, 5, 43, 24
-char_select_right = 146, 5, 43, 24
-spectator = 317, 640, 80, 23
-
-; -------------------------
-; New in 2.6.0
-; -------------------------
-
-; The log limiter explaining label. This is simply a piece of text that
-; explains what the spin box is for.
-; log_limit_label = 190, 612, 50, 30
-
-; The spinbox allows you to set the log limit ingame inbetween 1 and 10000,
-; with the option to set it to 0 as well (which is considered 'infinite' by
-; the log limiter).
-; log_limit_spinbox = 168, 636, 70, 25
-
-; This is an input field that allows you to change your in-character showname.
-ic_chat_name = 200, 534, 78, 23
-
-; I am sure there are some differences between the 'ao2_' versions and the
-; 'ao2_'-less versions of the IC text display and input, but I do not know
-; what. Still, here you go!
-ao2_ic_chat_name = 200, 534, 78, 23
-
-; An in-game tickbox that allows you to set whether your client should show
-; custom shownames where possible, or always keep to character names.
-; This is useful if you suspect someone is impersonating others, for example,
-; and they are using this in combination with ini-swapping to 'duplicate' a
-; character.
-showname_enable = 200, 510, 80, 21
-
-; A simple button that opens up the settings menu.
-; Equivalent to typing /settings in the OOC chat.
-settings = 130, 610, 60, 23
-
-; The character search text input in the character selecton screen.
-; The moment you enter some text, it immediately starts filtering.
-char_search = 420, 7, 120, 22
-
-; A tickbox that filters based on if a character requires password to access or not.
-; Note that this is actually only partially implemented in AO.
-; The interface exists for it, but no way to actually password the characters.
-char_passworded = 545, 7, 100, 22
-
-; A tickbox that filters characters based on if they are taken.
-char_taken = 635, 7, 80, 22
-
-; These buttons are similar to the CE / WT buttons, except they show a
-; Not Guilty or Guilty animation instead.
-not_guilty = 380, 470, 85, 42
-guilty = 380, 515, 85, 42
-
-; These are responsible for the pairing stuff.
-; These work much like muting, actually.
-pair_button = 104, 515, 42, 42
-pair_list = 280, 490, 210, 177
-pair_offset_spinbox = 280, 470, 210, 20
-
-; This button allows switching between music and areas.
-switch_area_music = 590, 319, 35, 23
-
-; These are colours for the various statuses an area can be in.
-area_free_color = 54, 198, 68
-area_lfp_color = 255, 255, 0
-area_casing_color = 255, 166, 0
-area_recess_color = 255, 190, 30
-area_rp_color = 200, 52, 252
-area_gaming_color = 55, 255, 255
-area_locked_color = 165, 43, 43
-
-; These two are casing-related inputs.
-; "casing" is a tickbox that toggles whether you should receive case alerts or
-; not (you can set your preferences, and its default value, in the Settings!)
-; "casing_button" is an interface to help you announce a case (you have to be
-; a CM first to be able to announce cases).
-casing = 200, 560, 80, 21
-casing_button = 173, 637, 60, 23
\ No newline at end of file
diff --git a/base/themes/default/courtroom_fonts.ini b/base/themes/default/courtroom_fonts.ini
deleted file mode 100644
index 16e2f41..0000000
--- a/base/themes/default/courtroom_fonts.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-showname = 8
-message = 10
-ic_chatlog = 10
-ms_chatlog = 10
-server_chatlog = 9
-music_list = 8
-
-ic_chatlog_color = 255, 255, 255
-
-; Color for all labels and checkboxes
-label_color = 255, 255, 255
diff --git a/base/themes/default/courtroom_sounds.ini b/base/themes/default/courtroom_sounds.ini
deleted file mode 100644
index b24e2ce..0000000
--- a/base/themes/default/courtroom_sounds.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-realization = sfx-realization.wav
-witness_testimony = sfx-testimony2.wav
-cross_examination = sfx-testimony.wav
-evidence_present = sfx-evidenceshoop.wav
-word_call = sfx-gaspen-yeah!.wav
-mod_call = sfx-gallery.wav
-not_guilty = sfx-notguilty.wav
-guilty = sfx-guilty.wav
\ No newline at end of file
diff --git a/base/themes/default/courtroombackground.png b/base/themes/default/courtroombackground.png
deleted file mode 100644
index 5ad8d51..0000000
Binary files a/base/themes/default/courtroombackground.png and /dev/null differ
diff --git a/base/themes/default/crossexamination.gif b/base/themes/default/crossexamination.gif
deleted file mode 100644
index a7754b6..0000000
Binary files a/base/themes/default/crossexamination.gif and /dev/null differ
diff --git a/base/themes/default/crossexamination.png b/base/themes/default/crossexamination.png
deleted file mode 100644
index 044a76b..0000000
Binary files a/base/themes/default/crossexamination.png and /dev/null differ
diff --git a/base/themes/default/custom.png b/base/themes/default/custom.png
deleted file mode 100644
index b58d162..0000000
Binary files a/base/themes/default/custom.png and /dev/null differ
diff --git a/base/themes/default/custom_selected.png b/base/themes/default/custom_selected.png
deleted file mode 100644
index d8dc525..0000000
Binary files a/base/themes/default/custom_selected.png and /dev/null differ
diff --git a/base/themes/default/defense_speedlines.gif b/base/themes/default/defense_speedlines.gif
deleted file mode 100644
index 5b454e5..0000000
Binary files a/base/themes/default/defense_speedlines.gif and /dev/null differ
diff --git a/base/themes/default/defensebar0.png b/base/themes/default/defensebar0.png
deleted file mode 100644
index e15b727..0000000
Binary files a/base/themes/default/defensebar0.png and /dev/null differ
diff --git a/base/themes/default/defensebar1.png b/base/themes/default/defensebar1.png
deleted file mode 100644
index ddc7c05..0000000
Binary files a/base/themes/default/defensebar1.png and /dev/null differ
diff --git a/base/themes/default/defensebar10.png b/base/themes/default/defensebar10.png
deleted file mode 100644
index 5c955b4..0000000
Binary files a/base/themes/default/defensebar10.png and /dev/null differ
diff --git a/base/themes/default/defensebar2.png b/base/themes/default/defensebar2.png
deleted file mode 100644
index 78835aa..0000000
Binary files a/base/themes/default/defensebar2.png and /dev/null differ
diff --git a/base/themes/default/defensebar3.png b/base/themes/default/defensebar3.png
deleted file mode 100644
index 8d8427a..0000000
Binary files a/base/themes/default/defensebar3.png and /dev/null differ
diff --git a/base/themes/default/defensebar4.png b/base/themes/default/defensebar4.png
deleted file mode 100644
index 0441683..0000000
Binary files a/base/themes/default/defensebar4.png and /dev/null differ
diff --git a/base/themes/default/defensebar5.png b/base/themes/default/defensebar5.png
deleted file mode 100644
index d9236c2..0000000
Binary files a/base/themes/default/defensebar5.png and /dev/null differ
diff --git a/base/themes/default/defensebar6.png b/base/themes/default/defensebar6.png
deleted file mode 100644
index 373bc1b..0000000
Binary files a/base/themes/default/defensebar6.png and /dev/null differ
diff --git a/base/themes/default/defensebar7.png b/base/themes/default/defensebar7.png
deleted file mode 100644
index 09c8d1a..0000000
Binary files a/base/themes/default/defensebar7.png and /dev/null differ
diff --git a/base/themes/default/defensebar8.png b/base/themes/default/defensebar8.png
deleted file mode 100644
index 13a4548..0000000
Binary files a/base/themes/default/defensebar8.png and /dev/null differ
diff --git a/base/themes/default/defensebar9.png b/base/themes/default/defensebar9.png
deleted file mode 100644
index d98ab4d..0000000
Binary files a/base/themes/default/defensebar9.png and /dev/null differ
diff --git a/base/themes/default/defminus.png b/base/themes/default/defminus.png
deleted file mode 100644
index 9709381..0000000
Binary files a/base/themes/default/defminus.png and /dev/null differ
diff --git a/base/themes/default/defplus.png b/base/themes/default/defplus.png
deleted file mode 100644
index a3adf51..0000000
Binary files a/base/themes/default/defplus.png and /dev/null differ
diff --git a/base/themes/default/deleteevidence.png b/base/themes/default/deleteevidence.png
deleted file mode 100644
index 396d990..0000000
Binary files a/base/themes/default/deleteevidence.png and /dev/null differ
diff --git a/base/themes/default/emote_selected.png b/base/themes/default/emote_selected.png
deleted file mode 100644
index 377dd07..0000000
Binary files a/base/themes/default/emote_selected.png and /dev/null differ
diff --git a/base/themes/default/evidence_appear_left.gif b/base/themes/default/evidence_appear_left.gif
deleted file mode 100644
index 352a7f1..0000000
Binary files a/base/themes/default/evidence_appear_left.gif and /dev/null differ
diff --git a/base/themes/default/evidence_appear_right.gif b/base/themes/default/evidence_appear_right.gif
deleted file mode 100644
index bc45e52..0000000
Binary files a/base/themes/default/evidence_appear_right.gif and /dev/null differ
diff --git a/base/themes/default/evidence_selected.png b/base/themes/default/evidence_selected.png
deleted file mode 100644
index 6230c83..0000000
Binary files a/base/themes/default/evidence_selected.png and /dev/null differ
diff --git a/base/themes/default/evidence_selector.png b/base/themes/default/evidence_selector.png
deleted file mode 100644
index 266493d..0000000
Binary files a/base/themes/default/evidence_selector.png and /dev/null differ
diff --git a/base/themes/default/evidencebackground.png b/base/themes/default/evidencebackground.png
deleted file mode 100644
index ca28532..0000000
Binary files a/base/themes/default/evidencebackground.png and /dev/null differ
diff --git a/base/themes/default/evidencebutton.png b/base/themes/default/evidencebutton.png
deleted file mode 100644
index 2c395ec..0000000
Binary files a/base/themes/default/evidencebutton.png and /dev/null differ
diff --git a/base/themes/default/evidenceoverlay.png b/base/themes/default/evidenceoverlay.png
deleted file mode 100644
index d409cc5..0000000
Binary files a/base/themes/default/evidenceoverlay.png and /dev/null differ
diff --git a/base/themes/default/evidencex.png b/base/themes/default/evidencex.png
deleted file mode 100644
index 6a6be36..0000000
Binary files a/base/themes/default/evidencex.png and /dev/null differ
diff --git a/base/themes/default/favorites.png b/base/themes/default/favorites.png
deleted file mode 100644
index 6fa3101..0000000
Binary files a/base/themes/default/favorites.png and /dev/null differ
diff --git a/base/themes/default/favorites_selected.png b/base/themes/default/favorites_selected.png
deleted file mode 100644
index 4c33d43..0000000
Binary files a/base/themes/default/favorites_selected.png and /dev/null differ
diff --git a/base/themes/default/guilty.gif b/base/themes/default/guilty.gif
deleted file mode 100644
index 3dd95d5..0000000
Binary files a/base/themes/default/guilty.gif and /dev/null differ
diff --git a/base/themes/default/guilty.png b/base/themes/default/guilty.png
deleted file mode 100644
index efe68f7..0000000
Binary files a/base/themes/default/guilty.png and /dev/null differ
diff --git a/base/themes/default/holdit.gif b/base/themes/default/holdit.gif
deleted file mode 100644
index 5f71ac6..0000000
Binary files a/base/themes/default/holdit.gif and /dev/null differ
diff --git a/base/themes/default/holdit.png b/base/themes/default/holdit.png
deleted file mode 100644
index 09d1d37..0000000
Binary files a/base/themes/default/holdit.png and /dev/null differ
diff --git a/base/themes/default/holdit_selected.png b/base/themes/default/holdit_selected.png
deleted file mode 100644
index 51586e7..0000000
Binary files a/base/themes/default/holdit_selected.png and /dev/null differ
diff --git a/base/themes/default/loadingbackground.png b/base/themes/default/loadingbackground.png
deleted file mode 100644
index 202a881..0000000
Binary files a/base/themes/default/loadingbackground.png and /dev/null differ
diff --git a/base/themes/default/lobby_design.ini b/base/themes/default/lobby_design.ini
deleted file mode 100644
index ef64114..0000000
--- a/base/themes/default/lobby_design.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-lobby = 0, 0, 517, 666
-public_servers = 46, 88, 114, 30
-favorites = 164, 88, 114, 30
-refresh = 56, 381, 132, 28
-add_to_fav = 194, 381, 132, 28
-connect = 332, 381, 132, 28
-version = 170, 1, 300, 21
-about = 428, 1, 88, 21
-server_list = 20, 125, 286, 240
-player_count = 336, 91, 173, 16
-description = 337, 109, 173, 245
-chatbox = 2, 445, 515, 198
-chatname = 3, 646, 85, 19
-chatmessage = 93, 646, 424, 19
-loading_label = 135, 92, 254, 95
-progress_bar = 135, 188, 254, 21
-cancel = 220, 220, 80, 20
diff --git a/base/themes/default/lobbybackground.png b/base/themes/default/lobbybackground.png
deleted file mode 100644
index 094f19c..0000000
Binary files a/base/themes/default/lobbybackground.png and /dev/null differ
diff --git a/base/themes/default/mute.png b/base/themes/default/mute.png
deleted file mode 100644
index a184cbf..0000000
Binary files a/base/themes/default/mute.png and /dev/null differ
diff --git a/base/themes/default/mute_pressed.png b/base/themes/default/mute_pressed.png
deleted file mode 100644
index e9793ce..0000000
Binary files a/base/themes/default/mute_pressed.png and /dev/null differ
diff --git a/base/themes/default/muted.png b/base/themes/default/muted.png
deleted file mode 100644
index 969da04..0000000
Binary files a/base/themes/default/muted.png and /dev/null differ
diff --git a/base/themes/default/muted_old.png b/base/themes/default/muted_old.png
deleted file mode 100644
index f9878f1..0000000
Binary files a/base/themes/default/muted_old.png and /dev/null differ
diff --git a/base/themes/default/notguilty.gif b/base/themes/default/notguilty.gif
deleted file mode 100644
index d057715..0000000
Binary files a/base/themes/default/notguilty.gif and /dev/null differ
diff --git a/base/themes/default/notguilty.png b/base/themes/default/notguilty.png
deleted file mode 100644
index b9cfe31..0000000
Binary files a/base/themes/default/notguilty.png and /dev/null differ
diff --git a/base/themes/default/objection.gif b/base/themes/default/objection.gif
deleted file mode 100644
index 6aae2e5..0000000
Binary files a/base/themes/default/objection.gif and /dev/null differ
diff --git a/base/themes/default/objection.png b/base/themes/default/objection.png
deleted file mode 100644
index 6fbcbc2..0000000
Binary files a/base/themes/default/objection.png and /dev/null differ
diff --git a/base/themes/default/objection_selected.png b/base/themes/default/objection_selected.png
deleted file mode 100644
index 384e4e9..0000000
Binary files a/base/themes/default/objection_selected.png and /dev/null differ
diff --git a/base/themes/default/pair_button.png b/base/themes/default/pair_button.png
deleted file mode 100644
index 19f6f22..0000000
Binary files a/base/themes/default/pair_button.png and /dev/null differ
diff --git a/base/themes/default/pair_button_pressed.png b/base/themes/default/pair_button_pressed.png
deleted file mode 100644
index aaf53fb..0000000
Binary files a/base/themes/default/pair_button_pressed.png and /dev/null differ
diff --git a/base/themes/default/placeholder.gif b/base/themes/default/placeholder.gif
deleted file mode 100644
index e35aaf4..0000000
Binary files a/base/themes/default/placeholder.gif and /dev/null differ
diff --git a/base/themes/default/present.png b/base/themes/default/present.png
deleted file mode 100644
index 134d742..0000000
Binary files a/base/themes/default/present.png and /dev/null differ
diff --git a/base/themes/default/present_disabled.png b/base/themes/default/present_disabled.png
deleted file mode 100644
index 9c6a702..0000000
Binary files a/base/themes/default/present_disabled.png and /dev/null differ
diff --git a/base/themes/default/prominus.png b/base/themes/default/prominus.png
deleted file mode 100644
index 1191e1e..0000000
Binary files a/base/themes/default/prominus.png and /dev/null differ
diff --git a/base/themes/default/proplus.png b/base/themes/default/proplus.png
deleted file mode 100644
index 5e9d563..0000000
Binary files a/base/themes/default/proplus.png and /dev/null differ
diff --git a/base/themes/default/prosecution_speedlines.gif b/base/themes/default/prosecution_speedlines.gif
deleted file mode 100644
index b48802a..0000000
Binary files a/base/themes/default/prosecution_speedlines.gif and /dev/null differ
diff --git a/base/themes/default/prosecutionbar0.png b/base/themes/default/prosecutionbar0.png
deleted file mode 100644
index 56b8d61..0000000
Binary files a/base/themes/default/prosecutionbar0.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar1.png b/base/themes/default/prosecutionbar1.png
deleted file mode 100644
index b44323c..0000000
Binary files a/base/themes/default/prosecutionbar1.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar10.png b/base/themes/default/prosecutionbar10.png
deleted file mode 100644
index f0a79c3..0000000
Binary files a/base/themes/default/prosecutionbar10.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar2.png b/base/themes/default/prosecutionbar2.png
deleted file mode 100644
index 8bb51da..0000000
Binary files a/base/themes/default/prosecutionbar2.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar3.png b/base/themes/default/prosecutionbar3.png
deleted file mode 100644
index d0b9c4c..0000000
Binary files a/base/themes/default/prosecutionbar3.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar4.png b/base/themes/default/prosecutionbar4.png
deleted file mode 100644
index b4ac6bb..0000000
Binary files a/base/themes/default/prosecutionbar4.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar5.png b/base/themes/default/prosecutionbar5.png
deleted file mode 100644
index 6bb5eb5..0000000
Binary files a/base/themes/default/prosecutionbar5.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar6.png b/base/themes/default/prosecutionbar6.png
deleted file mode 100644
index 9ee9638..0000000
Binary files a/base/themes/default/prosecutionbar6.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar7.png b/base/themes/default/prosecutionbar7.png
deleted file mode 100644
index 34e00da..0000000
Binary files a/base/themes/default/prosecutionbar7.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar8.png b/base/themes/default/prosecutionbar8.png
deleted file mode 100644
index 5035b51..0000000
Binary files a/base/themes/default/prosecutionbar8.png and /dev/null differ
diff --git a/base/themes/default/prosecutionbar9.png b/base/themes/default/prosecutionbar9.png
deleted file mode 100644
index b185a1a..0000000
Binary files a/base/themes/default/prosecutionbar9.png and /dev/null differ
diff --git a/base/themes/default/publicservers.png b/base/themes/default/publicservers.png
deleted file mode 100644
index 98cf2ad..0000000
Binary files a/base/themes/default/publicservers.png and /dev/null differ
diff --git a/base/themes/default/publicservers_selected.png b/base/themes/default/publicservers_selected.png
deleted file mode 100644
index bcfa4c4..0000000
Binary files a/base/themes/default/publicservers_selected.png and /dev/null differ
diff --git a/base/themes/default/realization.png b/base/themes/default/realization.png
deleted file mode 100644
index f791d29..0000000
Binary files a/base/themes/default/realization.png and /dev/null differ
diff --git a/base/themes/default/realization_pressed.png b/base/themes/default/realization_pressed.png
deleted file mode 100644
index 9a72ed3..0000000
Binary files a/base/themes/default/realization_pressed.png and /dev/null differ
diff --git a/base/themes/default/realizationflash.png b/base/themes/default/realizationflash.png
deleted file mode 100644
index 776c70d..0000000
Binary files a/base/themes/default/realizationflash.png and /dev/null differ
diff --git a/base/themes/default/refresh.png b/base/themes/default/refresh.png
deleted file mode 100644
index 0b49cd0..0000000
Binary files a/base/themes/default/refresh.png and /dev/null differ
diff --git a/base/themes/default/refresh_pressed.png b/base/themes/default/refresh_pressed.png
deleted file mode 100644
index 8036683..0000000
Binary files a/base/themes/default/refresh_pressed.png and /dev/null differ
diff --git a/base/themes/default/takethat.gif b/base/themes/default/takethat.gif
deleted file mode 100644
index dd03310..0000000
Binary files a/base/themes/default/takethat.gif and /dev/null differ
diff --git a/base/themes/default/takethat.png b/base/themes/default/takethat.png
deleted file mode 100644
index 8ff2bef..0000000
Binary files a/base/themes/default/takethat.png and /dev/null differ
diff --git a/base/themes/default/takethat_selected.png b/base/themes/default/takethat_selected.png
deleted file mode 100644
index 3fe0a8c..0000000
Binary files a/base/themes/default/takethat_selected.png and /dev/null differ
diff --git a/base/themes/default/testimony.gif b/base/themes/default/testimony.gif
deleted file mode 100644
index 6d5898d..0000000
Binary files a/base/themes/default/testimony.gif and /dev/null differ
diff --git a/base/themes/default/testimony.png b/base/themes/default/testimony.png
deleted file mode 100644
index 7b81fc8..0000000
Binary files a/base/themes/default/testimony.png and /dev/null differ
diff --git a/base/themes/default/witnesstestimony.gif b/base/themes/default/witnesstestimony.gif
deleted file mode 100644
index 03b4900..0000000
Binary files a/base/themes/default/witnesstestimony.gif and /dev/null differ
diff --git a/base/themes/default/witnesstestimony.png b/base/themes/default/witnesstestimony.png
deleted file mode 100644
index 47c2301..0000000
Binary files a/base/themes/default/witnesstestimony.png and /dev/null differ
diff --git a/include/aoapplication.h b/include/aoapplication.h
index 5475eb7..e4f2ee6 100644
--- a/include/aoapplication.h
+++ b/include/aoapplication.h
@@ -27,6 +27,11 @@
#include
#endif
+#include
+#include
+#include
+#include
+
class NetworkManager;
class Lobby;
class Courtroom;
@@ -78,6 +83,7 @@ public:
bool arup_enabled = false;
bool casing_alerts_enabled = false;
bool modcall_reason_enabled = false;
+ bool looping_sfx_support_enabled = false;
///////////////loading info///////////////////
@@ -93,6 +99,7 @@ public:
int loaded_evidence = 0;
int music_list_size = 0;
int loaded_music = 0;
+ int area_count = 0;
bool courtroom_loaded = false;
@@ -150,6 +157,12 @@ public:
//Returns true if blank blips is enabled in config.ini and false otherwise
bool get_blank_blip();
+ //Returns true if looping sound effects are enabled in the config.ini
+ bool get_looping_sfx();
+
+ //Returns true if kill music on object is enabled in the config.ini
+ bool get_objectmusic();
+
//Returns the value of default_music in config.ini
int get_default_music();
@@ -163,6 +176,10 @@ public:
// from the config.ini.
bool is_discord_enabled();
+ // Returns the value of whether shaking and flashing should be enabled.
+ // from the config.ini.
+ bool is_shakeandflash_enabled();
+
// Returns the value of the maximum amount of lines the IC chatlog
// may contain, from config.ini.
int get_max_log_size();
@@ -267,6 +284,18 @@ public:
//Returns the sfx of p_char's p_emote
QString get_sfx_name(QString p_char, int p_emote);
+ //Returns if an emote loops it's SFX
+ QString get_sfx_looping(QString p_char, int p_emote);
+
+ //Returns if an emote has a frame specific SFX for it
+ QString get_frame_sfx_name(QString p_char, QString p_emote, int n_frame);
+
+ //Returns if an emote has a frame specific SFX for it
+ QString get_realization_frame(QString p_char, QString p_emote, int n_frame);
+
+ //Returns if an emote has a frame specific SFX for it
+ QString get_screenshake_frame(QString p_char, QString p_emote, int n_frame);
+
//Not in use
int get_sfx_delay(QString p_char, int p_emote);
@@ -304,13 +333,16 @@ public:
// Same for CM.
bool get_casing_cm_enabled();
+ // Same for witnesses.
+ bool get_casing_wit_enabled();
+
// Get the message for the CM for casing alerts.
QString get_casing_can_host_cases();
private:
const int RELEASE = 2;
- const int MAJOR_VERSION = 6;
- const int MINOR_VERSION = 2;
+ const int MAJOR_VERSION = 7;
+ const int MINOR_VERSION = 0;
QString current_theme = "default";
diff --git a/include/aocaseannouncerdialog.h b/include/aocaseannouncerdialog.h
index a238c3f..da26fab 100644
--- a/include/aocaseannouncerdialog.h
+++ b/include/aocaseannouncerdialog.h
@@ -36,6 +36,7 @@ private:
QCheckBox *ui_judge_needed;
QCheckBox *ui_juror_needed;
QCheckBox *ui_steno_needed;
+ QCheckBox *ui_witness_needed;
public slots:
void ok_pressed();
diff --git a/include/aocharmovie.h b/include/aocharmovie.h
index 7ef7da3..6c127a6 100644
--- a/include/aocharmovie.h
+++ b/include/aocharmovie.h
@@ -6,9 +6,12 @@
#include
#include
#include
+#include
+#include "include/aosfxplayer.h"
+#include "include/courtroom.h"
+
class AOApplication;
-
class AOCharMovie : public QLabel
{
Q_OBJECT
@@ -22,36 +25,52 @@ public:
void play_idle(QString p_char, QString p_emote);
void set_flipped(bool p_flipped) {m_flipped = p_flipped;}
-
+ void LoadImageWithStupidMethodForFlipSupport(QImage image);
void stop();
void move(int ax, int ay);
-
void combo_resize(int w, int h);
+ void play_frame_sfx();
+ void sfx_two_network_boogaloo();
+ void screenshake_two_network_boogaloo();
+ void realization_two_network_boogaloo();
+
+ AOSfxPlayer *frame_specific_sfx_player;
+ Courtroom *mycourtroom;
+ QString frame_sfx_hellstring = "";
+ QString frame_screenshake_hellstring = "";
+ QString frame_realization_hellstring = "";
+ bool use_networked_framehell = false;
private:
AOApplication *ao_app;
QMovie *m_movie;
QVector movie_frames;
QTimer *preanim_timer;
+ QTimer *ticker;
+ QString last_path;
+ QString current_emote;
+ QString current_char;
const int time_mod = 62;
// These are the X and Y values before they are fixed based on the sprite's width.
int x = 0;
int y = 0;
+ int default_w;
+ int default_h;
bool m_flipped = false;
bool play_once = true;
+ bool apng = false;
signals:
void done();
private slots:
- void frame_change(int n_frame);
void timer_done();
+ void movie_ticker();
};
-
#endif // AOCHARMOVIE_H
diff --git a/include/aomusicplayer.h b/include/aomusicplayer.h
index b34267c..255cc45 100644
--- a/include/aomusicplayer.h
+++ b/include/aomusicplayer.h
@@ -6,31 +6,42 @@
#elif defined(QTAUDIO)
#include
#endif
+
#include "aoapplication.h"
#include
#include
#include
+#include
+#include
#if defined(BASSAUDIO)
-class AOMusicPlayer
+class AOMusicPlayer : public QObject
{
+ Q_OBJECT
public:
AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
- ~AOMusicPlayer();
+ virtual ~AOMusicPlayer();
void play(QString p_song);
void set_volume(int p_value);
+ void kill_loop();
+ QString get_path();
+ bool enable_looping = true;
+
private:
QWidget *m_parent;
AOApplication *ao_app;
int m_volume = 0;
+ QString f_path;
+
HSTREAM m_stream;
+
};
#elif defined(QTAUDIO)
-class AOMusicPlayer
+class AOMusicPlayer : public QObject
{
public:
AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
@@ -39,26 +50,39 @@ public:
void play(QString p_song);
void set_volume(int p_value);
+ void kill_loop();
+ QString get_path();
+ bool enable_looping = true;
+
private:
+ QWidget *m_parent;
+ AOApplication *ao_app;
+
QMediaPlayer m_player;
+
+ int m_volume = 0;
+ QString f_path;
+};
+#else
+class AOMusicPlayer : public QObject
+{
+public:
+ AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
+ ~AOMusicPlayer();
+
+ void play(QString p_song);
+ void set_volume(int p_value);
+
+ void kill_loop();
+ QString get_path();
+ bool enable_looping = true;
+
+private:
QWidget *m_parent;
AOApplication *ao_app;
int m_volume = 0;
-};
-#else
-class AOMusicPlayer
-{
-public:
- AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app);
- ~AOMusicPlayer();
-
- void play(QString p_song);
- void set_volume(int p_value);
-
-private:
- QWidget *m_parent;
- AOApplication *ao_app;
+ QString f_path;
};
#endif
diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h
index 934d257..233d079 100644
--- a/include/aooptionsdialog.h
+++ b/include/aooptionsdialog.h
@@ -61,6 +61,8 @@ private:
QLineEdit *ui_ms_textbox;
QLabel *ui_discord_lbl;
QCheckBox *ui_discord_cb;
+ QLabel *ui_epilepsy_lbl;
+ QCheckBox *ui_epilepsy_cb;
QLabel *ui_language_label;
QComboBox *ui_language_combobox;
@@ -88,6 +90,10 @@ private:
QLabel *ui_bliprate_lbl;
QCheckBox *ui_blank_blips_cb;
QLabel *ui_blank_blips_lbl;
+ QLabel *ui_loopsfx_lbl;
+ QCheckBox *ui_loopsfx_cb;
+ QLabel *ui_objectmusic_lbl;
+ QCheckBox *ui_objectmusic_cb;
QDialogButtonBox *ui_settings_buttons;
QWidget *ui_casing_tab;
@@ -108,6 +114,8 @@ private:
QCheckBox *ui_casing_steno_cb;
QLabel *ui_casing_cm_lbl;
QCheckBox *ui_casing_cm_cb;
+ QLabel *ui_casing_wit_lbl;
+ QCheckBox *ui_casing_wit_cb;
QLabel *ui_casing_cm_cases_lbl;
QLineEdit *ui_casing_cm_cases_textbox;
diff --git a/include/aosfxplayer.h b/include/aosfxplayer.h
index 19d4bdf..5b4d2ec 100644
--- a/include/aosfxplayer.h
+++ b/include/aosfxplayer.h
@@ -12,20 +12,24 @@
#include
#include
#include
+#include
-class AOSfxPlayer
+class AOSfxPlayer : public QObject
{
+ Q_OBJECT
public:
AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app);
void play(QString p_sfx, QString p_char = "", QString shout = "");
void stop();
void set_volume(qreal p_volume);
+ void setLooping(bool is_looping);
private:
QWidget *m_parent;
AOApplication *ao_app;
qreal m_volume = 0;
+ bool looping_sfx = false;
void set_volume_internal(qreal p_volume);
diff --git a/include/courtroom.h b/include/courtroom.h
index baefbfa..951a5a3 100644
--- a/include/courtroom.h
+++ b/include/courtroom.h
@@ -26,6 +26,7 @@
#include "datatypes.h"
#include "debug_functions.h"
#include "chatlogpiece.h"
+#include "aocharmovie.h"
#include
#include
@@ -35,11 +36,12 @@
#include
#include
#include
+#include
#include
#include
#include
#include
-
+#include
#include
#include
#include
@@ -48,12 +50,23 @@
#include
#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
#include
class AOApplication;
-
+class AOCharMovie;
class Courtroom : public QMainWindow
{
Q_OBJECT
@@ -66,15 +79,33 @@ public:
void append_area(QString f_area){area_list.append(f_area);}
void clear_music(){music_list.clear();}
void clear_areas(){area_list.clear();}
-
void fix_last_area()
+ void handle_failed_login();
+ QString threading_sfx = "";
+ QString threading_shake = "";
+ QString threading_flash = "";
+ QString threading_prefix = "";
+ //cid and this may differ in cases of ini-editing
+ QString current_char = "";
+ int current_emote = 0;
+ AOApplication *ao_app;
+ //abstract widget to hold char buttons
+ QWidget *ui_char_buttons;
+ QVector char_list;
+ QVector evidence_list;
+ QVector music_list;
+ QVector area_list;
+ QSignalMapper *char_button_mapper;
+ QVector ui_char_button_list;
+ QVector ui_char_button_list_filtered;
+ QLineEdit *ui_char_search;
+ QCheckBox *ui_char_passworded;
+ QCheckBox *ui_char_taken;
+ void mt_pre_framegetter(int frameNumber);
+ void mt_framegetter(int frameNumber);
+ void reset_music_list()
{
- if (area_list.size() > 0)
- {
- QString malplaced = area_list.last();
- area_list.removeLast();
- append_music(malplaced);
- }
+ music_list.clear();
}
void arup_append(int players, QString status, QString cm, QString locked)
@@ -123,7 +154,7 @@ public:
//reads theme inis and sets size and pos based on the identifier
void set_size_and_pos(QWidget *p_widget, QString p_identifier);
-
+ QPoint get_theme_pos(QString p_identifier);
//sets status as taken on character with cid n_char and places proper shading on charselect
void set_taken(int n_char, bool p_taken);
@@ -170,6 +201,9 @@ public:
//properly sets up some varibles: resets user state
void enter_courtroom(int p_cid);
+ // set the character using an ID
+ void set_character(int char_id);
+
//helper function that populates ui_music_list with the contents of music_list
void list_music();
void list_areas();
@@ -210,14 +244,15 @@ public:
//Toggles the judge buttons, whether they should appear or not.
void toggle_judge_buttons(bool is_on);
- void announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno);
+ void announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno, bool wit);
void check_connection_received();
+ void doScreenShake();
+ void doRealization();
~Courtroom();
private:
- AOApplication *ao_app;
int m_courtroom_width = 714;
int m_courtroom_height = 668;
@@ -230,7 +265,10 @@ private:
bool first_message_sent = false;
int maximumMessages = 0;
-
+ QPropertyAnimation *screenshake_animation;
+ QPropertyAnimation *chatbox_screenshake_animation;
+ QParallelAnimationGroup *screenshake_group;
+ QMovie *frame_emote_checker;
// This is for inline message-colouring.
enum INLINE_COLOURS {
@@ -249,7 +287,7 @@ private:
bool message_is_centered = false;
int current_display_speed = 3;
- int message_display_speed[7] = {30, 40, 50, 60, 75, 100, 120};
+ int message_display_speed[7] = {10, 20, 30, 40, 50, 60, 75};
// This is for checking if the character should start talking again
// when an inline blue text ends.
@@ -265,11 +303,6 @@ private:
// The offset this user has given if they want to appear alongside someone.
int offset_with_pair = 0;
- QVector char_list;
- QVector evidence_list;
- QVector music_list;
- QVector area_list;
-
QVector arup_players;
QVector arup_statuses;
QVector arup_cms;
@@ -319,7 +352,7 @@ private:
//every time point in char.inis times this equals the final time
const int time_mod = 40;
- static const int chatmessage_size = 23;
+ static const int chatmessage_size = 28;
QString m_chatmessage[chatmessage_size];
bool chatmessage_is_empty = false;
@@ -348,11 +381,10 @@ private:
//character id, which index of the char_list the player is
int m_cid = -1;
- //cid and this may differ in cases of ini-editing
- QString current_char = "";
int objection_state = 0;
int realization_state = 0;
+ int screenshake_state = 0;
int text_color = 0;
bool is_presenting_evidence = false;
@@ -368,7 +400,6 @@ private:
const int button_height = 60;
int current_emote_page = 0;
- int current_emote = 0;
int emote_columns = 5;
int emote_rows = 2;
int max_emotes_on_page = 10;
@@ -391,6 +422,9 @@ private:
AOMusicPlayer *music_player;
AOSfxPlayer *sfx_player;
+ AOSfxPlayer *misc_sfx_player;
+ AOSfxPlayer *frame_emote_sfx_player;
+ AOSfxPlayer *pair_frame_emote_sfx_player;
AOSfxPlayer *objection_player;
AOBlipPlayer *blip_player;
@@ -479,6 +513,7 @@ private:
AOButton *ui_custom_objection;
AOButton *ui_realization;
+ AOButton *ui_screenshake;
AOButton *ui_mute;
AOButton *ui_defense_plus;
@@ -515,11 +550,6 @@ private:
AOImage *ui_char_select_background;
- //abstract widget to hold char buttons
- QWidget *ui_char_buttons;
-
- QVector ui_char_button_list;
- QVector ui_char_button_list_filtered;
AOImage *ui_selector;
AOButton *ui_back_to_lobby;
@@ -531,14 +561,9 @@ private:
AOButton *ui_spectator;
- QLineEdit *ui_char_search;
- QCheckBox *ui_char_passworded;
- QCheckBox *ui_char_taken;
-
void construct_char_select();
void set_char_select();
void set_char_select_page();
- void char_clicked(int n_char);
void put_button_in_place(int starting, int chars_on_this_page);
void filter_character_list();
@@ -560,7 +585,7 @@ public slots:
void mod_called(QString p_ip);
- void case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno);
+ void case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno, bool witness);
private slots:
void start_chat_ticking();
@@ -607,6 +632,7 @@ private slots:
void on_custom_objection_clicked();
void on_realization_clicked();
+ void on_screenshake_clicked();
void on_mute_clicked();
void on_pair_clicked();
@@ -659,13 +685,17 @@ private slots:
void on_spectator_clicked();
+ void char_clicked(int n_char);
+
void on_switch_area_music_clicked();
void on_casing_clicked();
void ping_server();
+ #ifdef BASSAUDIO
void load_bass_opus_plugin();
+ #endif
};
#endif // COURTROOM_H
diff --git a/include/datatypes.h b/include/datatypes.h
index aaa5de5..1b76f72 100644
--- a/include/datatypes.h
+++ b/include/datatypes.h
@@ -100,7 +100,12 @@ enum CHAT_MESSAGE
SELF_OFFSET,
OTHER_OFFSET,
OTHER_FLIP,
- NONINTERRUPTING_PRE
+ NONINTERRUPTING_PRE,
+ LOOPING_SFX,
+ SCREENSHAKE,
+ FRAME_SCREENSHAKE,
+ FRAME_REALIZATION,
+ FRAME_SFX
};
enum COLOR
diff --git a/include/lobby.h b/include/lobby.h
index 4293ac3..d32debe 100644
--- a/include/lobby.h
+++ b/include/lobby.h
@@ -78,7 +78,8 @@ private:
QModelIndex last_model;
void set_size_and_pos(QWidget *p_widget, QString p_identifier);
-
+public slots:
+ void lobbyThreadHandler(QString loadingText);
private slots:
void on_public_servers_clicked();
void on_favorites_clicked();
diff --git a/resource/translations/ao_de.ts b/resource/translations/ao_de.ts
index 1c0675b..2fd6c7f 100644
--- a/resource/translations/ao_de.ts
+++ b/resource/translations/ao_de.ts
@@ -27,67 +27,68 @@ Wir verwenden mehrere Master Server um Ausfälle zu verhindern, jedoch hat der C
Bitte prüfe deine Internetverbindung und Firewall, und versuche es erneut.
-
+ Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.Version zu alt! Deine Version: %1
Bitte besuche aceattorneyonline.com für ein Update.
-
+ You have been exiled from AO.
Have a nice day.Du wurdest von AO befreit.
Schönen Urlaub.
-
+ Attorney Online 2Attorney Online 2
-
+ LoadingLaden
-
+ Loading evidence:
%1/%2Lade Beweisstücke:
%1/%2
-
-
+
+ Loading music:
%1/%2Lade Musik:
%1/%2
-
+
+ Loading chars:
%1/%2Lade Charaktere:
%1/%2
-
+ You have been kicked from the server.
Reason: %1Du wurdest von diesem Server geschmissen.
Grund: %1
-
+ You have been banned from the server.
Reason: %1Du wurdest von diesem Server verbannt.
Grund: %1
-
+ You are banned on this server.
Reason: %1Du bist von diesem Server verbannt.
@@ -151,271 +152,316 @@ Grund: Stenographer neededStenograph benötigt
+
+
+ Witness needed
+ Zeuge benötigt
+ AOOptionsDialog
-
+ SettingsEinstellungen
-
+ GameplaySpiel
-
+ Theme:Theme:
-
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.Setzt das Theme. Wenn das neue Theme auch das Aussehen der Lobby verändert, must du diese neu laden um die Änderungen zu sehen.
-
+ Log goes downwards:Verlauf geht nach unten:
-
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.Wenn angehakt werden neue Nachrichten unten erscheinen (wie beim OOC). Das traditionelle (AO1) Verhalten wäre nicht angehakt.
-
+ Log length:Länge:
-
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.Die Menge an Nachrichten die aufgehoben werden bevor alte gelöscht werden. 0 bedeutet unendlich.
-
+ Default username:Standard Benutzername:
-
+ Your OOC name will be automatically set to this value when you join a server.Dein OOC Name wird automatisch auf dies gesetzt.
-
+ Custom shownames:Eigener Anzeigename:
-
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.Standardwert für die Anzeigename Box, welche den In-Charakter Namen bestimmt.
-
+ Backup MS:Rückfall MS:
-
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.Wenn dereingebaute Master Server fehlschlägt, wird das Spiel diesen hier verwenden.
-
+ Discord:Discord:
-
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.Erlaubt anderen auf Discord zu sehen auf welchem Server du spielst, welchen Charakter du spielst und wie lange.
+
+
+ Allow Shake/Flash:
+ Schütteln/Geistesblitz erlauben:
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+ Erlaubt schütteln des Bildschirms und weiße Blitze. Deaktiviere dies falls du Bedenken wegen Photosensitivität hast.
+
+
+ Language:Sprache:
-
+ Sets the language if you don't want to use your system language.Setzte die Sprache falls du nicht die Systemsprache verwenden möchtest.
-
+ CallwordsAlarmwörter
-
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html><html><head/><body>Gib so viele Alarmwörter ein wie du möchtest. Groß/Kleinschreibung ist egal. Für jede Wort nur eine Zeile!<br>Bitte keine leere Zeile am Ende -- du bekommst sonst bei jeder Nachricht einen Alarm.</body></html>
-
+ AudioAudio
-
+ Audio device:Audiogerät:
-
+ Sets the audio device for all sounds.Setzt das Audiogerät für all Geräusche.
-
+ Music:Musik:
-
+ Sets the music's default volume.Setzt die Musiklautstärke.
-
+ SFX:SFX:
-
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.Setzt die Lautstärke der Soundeffekte wie Einsprüche und die Geräusche der Charaktere.
-
+ Blips:Blips:
-
+ Sets the volume of the blips, the talking sound effects.Setzt die Lautstärke der Blips, das ist das Geräusch das die Charaktere beim Reden machen.
-
+ Blip rate:Bliprate:
-
+ Sets the delay between playing the blip sounds.Setzt die Pause zwischen einzelnen Blips.
-
+ Blank blips:Leere Blips:
-
+ If true, the game will play a blip sound even when a space is 'being said'.Wenn angehakt wird das Spiel auch bei einem Leerzeichen einen Blip machen.
-
+
+ Enable Looping SFX:
+ Wiederholende Soundeffekte:
+
+
+
+ If true, the game will allow looping sound effects to play on preanimations.
+ Wenn aktiviert, werden wiederholende Soundeffekte bei den Voranimationen erlaubt.
+
+
+
+ Kill Music On Objection:
+ Stoppe Musik bei Einspruch:
+
+
+
+ If true, the game will stop music when someone objects, like in the actual games.
+ Hält die Musik an wenn jemand "Einspruch" ruft, wie im echten Spiel.
+
+
+ CasingFälle
-
+ This server supports case alerts.Dieser Server unterstützt Fallalarme.
-
+ This server does not support case alerts.Dieser Server unterstützt Fallalarme nicht.
-
+ Pretty self-explanatory.Eigentlich selbsterklärend.
-
+ Casing:Fälle:
-
+ If checked, you will get alerts about case announcements.Wenn angehakt wirst du benachrichtigt wenn ein Fall angekündigt wird.
-
+ Defense:Verteidigung:
-
+ If checked, you will get alerts about case announcements if a defense spot is open.Wenn angehakt wirst du benachrichtigt wenn ein Verteidiger benötigt wird.
-
+ Prosecution:Kläger:
-
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.Wenn angehakt wirst du benachrichtigt wenn ein Kläger benötigt wird.
-
+ Judge:Richter:
-
+ If checked, you will get alerts about case announcements if the judge spot is open.Wenn angehakt wirst du benachrichtigt wenn ein Richter benötigt wird.
-
+ Juror:Jury:
-
+ If checked, you will get alerts about case announcements if a juror spot is open.Wenn angehakt wirst du benachrichtigt wenn eine Jury benötigt wird.
-
+ Stenographer:Stenograph:
-
+ If checked, you will get alerts about case announcements if a stenographer spot is open.Wenn angehakt wirst du benachrichtigt wenn ein Stenograph benötigt wird.
-
+ CM:CM:
-
+ If checked, you will appear amongst the potential CMs on the server.Wenn angehakt wirst du als potentielle CM angezeigt.
-
+
+ Witness:
+ Zeuge:
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+ Wenn angehakt wirst du als potentielle Zeuge angezeigt.
+
+
+ Hosting cases:Fallleitung:
-
+ If you're a CM, enter what cases you are willing to host.Wenn du CM bist, gib ein welche Fälle du spielen möchtest.
@@ -423,36 +469,35 @@ Grund:
Courtroom
-
+ PasswordPasswort
-
+ SpectatorZuschauer
-
-
+
+ SearchSuche
-
+ PasswordedGesperrt
-
+ TakenBenutzt
- Generating chars:
%1/%2
- Generiere Charaktere:
+ Generiere Charaktere:
%1/%2
@@ -462,176 +507,182 @@ Grund:
+ Could not find %1
- Konnte %1 nicht finden.
+ Konnte %1 nicht finden
-
+ ShownameAnzeigename
-
+ MessageNachricht
-
+ NameName
-
+ PreVor
-
+ FlipSpiegeln
- Guard
- Wache
+ Wache
-
-
+
+ Disable Modcalls
+ Deaktiviere Moderatorenrufe
+
+
+
+ CasingFall
-
+ ShownamesAnzeigenamen
-
+ No InterruptKeine Unterbrechung
-
+ WhiteWeiß
-
+ GreenGrün
-
+ RedRot
-
+ OrangeOrange
-
+ BlueBlau
-
+ YellowGelb
-
+ MusicMusik
-
+ SfxSfx
-
+ BlipsBlips
-
+ Log limitVerlaufsgrenze
-
-
+
+ ServerServer
-
+ Change characterCharakter ändern
-
+ Reload themeAussehen neu laden
-
+ Call modModerator rufen
-
+ SettingsEinstellungen
-
+ A/MA/M
-
+ PreanimVoranimation
-
+ Back to LobbyZurück zur Lobby
+ You have been banned.
- Du wurdest verbannt.
+ Du wurdest verbannt.%1 has played a song: %2%1 hat ein Lied gespielt: %2
-
+ RainbowRegenbogen
-
+ PinkPink
-
+ CyanCyan
-
+ % offset% Abstand
-
+ You were granted the Guard button.Dir wurde der Wache Knopf gegeben.
@@ -640,104 +691,104 @@ Grund:
Dies bewirkt nichts, aber egal.
-
+ This does nothing, but there you go.Dies bewirkt nichts, aber egal.
-
+ You opened the settings menu.Du hast die Einstellungen geöffnet.
-
+ You will now pair up with Du wirst nun mit
-
+ if they also choose your character in return. gepaart, wenn der andere dies auch tut.
-
+ You are no longer paired with anyone.Du bist nicht mehr gepaart.
-
+ Are you sure you typed that well? The char ID could not be recognised.Hast du dich vertippt? Die ID konnte nicht erkannt werden.
-
+ You have set your offset to Dein Abstand ist auf
-
+ Your offset must be between -100% and 100%!Der Abstand muss zwischen -100% und 100% liegen!
-
+ That offset does not look like one.Das sieht nicht wie ein Abstand aus.
-
+ You switched your music and area list.Du hast zwischen Musik- und Gebitsliste umgeschaltet.
-
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.Du hast Funktionen erzwungen die der Server eventuell nicht unterstützt. Möglicherweise wirst du nicht mehr sprechen können.
-
+ Your pre-animations interrupt again.Deine Voranimation unterbrechen nun Text.
-
+ Your pre-animations will not interrupt text.Deine Voranimation unterbrechen Text nicht.
-
+ Couldn't open chatlog.txt to write into.Konnte chatlog.txt nicht öffnen.
-
+ The IC chatlog has been saved.Der IC Verlauf wurde gespeichert.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.Du hattest keinen 'base/cases' Ordner! Ich hab ihn nun angelegt aber bedenke das er leer sein wird.
-
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1Du musst einen Dateinamen angeben (ohne .ini). Stelle sicher das er im 'base/cases' Ordner ist und das er korrekt formatiert ist.
Verfügbare Fälle: %1
-
+ Case made by %1.Fall von %1.
-
+ Navigate to %1 for the CM doc.Gehe zu %1 für das CM Dokument.
-
+ Your case "%1" was loaded!Dein Fall "%1" wurde geladen!
@@ -748,7 +799,7 @@ Cases you can load:
Verfügbare Fälle:
-
+ Too many arguments to load a case! You only need one filename, without extension.Zu viele Argumente! Du brauchst nur den Dateinamen, ohne Erweiterung.
@@ -773,53 +824,53 @@ Verfügbare Fälle:
" wurde geladen!
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.Du hattest keinen 'base/cases' Ordner! Ich hab ihn nun angelegt aber bedenke das er leer sein wird.
-
+ You need to give a filename to save (extension not needed) and the courtroom status!Du musst einen Dateinamen (ohne Erweiterung) angebenn, sowie den Gebietsstatus!
-
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!Zu viele Argumente! Du brauchst nur den Dateinamen, ohne Erweiterung sowie den Gebietsstatus!
-
+ Succesfully saved, edit doc and cmdoc link on the ini!Erfolgreich gespeichert!
-
+ MasterMaster
-
+ Reason:Grund:
-
+ Call ModeratorModerator rufen
-
-
+
+ ErrorFehler
-
+ You must provide a reason.Du musst einen Grund angeben.
-
+ The message is too long.Die Nachricht ist zu lang.
@@ -883,34 +934,34 @@ Verfügbare Fälle:
Name
-
+ It doesn't look like your client is set up correctly.
Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?Dein Client ist nicht korrekt eingerichtet.
Hast du ALLES von tiny.cc/getao heruntergeladen und entpackt, auch den großen 'base' Ordner?
-
+ Version: %1Version: %1
-
+ LoadingLaden
-
+ CancelAbbrechen
-
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy<h2>Attorney Online %1</h2>Der Gerichtsdrama Simulator<p><b>Quelltext:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Leitende Entwicklung:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Danksagungen:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
-
+ Online: %1/%2Online: %1/%2
@@ -955,8 +1006,8 @@ Noevain
Cronnicossy
-
-
+
+ OfflineOffline
diff --git a/resource/translations/ao_en.ts b/resource/translations/ao_en.ts
index b917a41..7ea610b 100644
--- a/resource/translations/ao_en.ts
+++ b/resource/translations/ao_en.ts
@@ -21,60 +21,61 @@ Please check your Internet connection and firewall, and please try again.
-
+ Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.
-
+ You have been exiled from AO.
Have a nice day.
-
+ Attorney Online 2
-
+ Loading
-
+ Loading evidence:
%1/%2
-
-
+
+ Loading music:
%1/%2
-
+
+ Loading chars:
%1/%2
-
+ You have been kicked from the server.
Reason: %1
-
+ You have been banned from the server.
Reason: %1
-
+ You are banned on this server.
Reason: %1
@@ -117,271 +118,316 @@ Reason: %1
Stenographer needed
+
+
+ Witness needed
+
+ AOOptionsDialog
-
+ Settings
-
+ Gameplay
-
+ Theme:
-
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.
-
+ Log goes downwards:
-
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.
-
+ Log length:
-
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.
-
+ Default username:
-
+ Your OOC name will be automatically set to this value when you join a server.
-
+ Custom shownames:
-
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.
-
+ Backup MS:
-
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.
-
+ Discord:
-
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.
+
+
+ Allow Shake/Flash:
+
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+
+
+
+ Language:
-
+ Sets the language if you don't want to use your system language.
-
+ Callwords
-
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html>
-
+ Audio
-
+ Audio device:
-
+ Sets the audio device for all sounds.
-
+ Music:
-
+ Sets the music's default volume.
-
+ SFX:
-
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.
-
+ Blips:
-
+ Sets the volume of the blips, the talking sound effects.
-
+ Blip rate:
-
+ Sets the delay between playing the blip sounds.
-
+ Blank blips:
-
+ If true, the game will play a blip sound even when a space is 'being said'.
-
- Casing
-
-
-
-
- This server supports case alerts.
+
+ Enable Looping SFX:
- This server does not support case alerts.
+ If true, the game will allow looping sound effects to play on preanimations.
-
- Pretty self-explanatory.
+
+ Kill Music On Objection:
-
- Casing:
-
-
-
-
- If checked, you will get alerts about case announcements.
-
-
-
-
- Defense:
+
+ If true, the game will stop music when someone objects, like in the actual games.
- If checked, you will get alerts about case announcements if a defense spot is open.
-
-
-
-
- Prosecution:
+ Casing
+ This server supports case alerts.
+
+
+
+
+ This server does not support case alerts.
+
+
+
+
+ Pretty self-explanatory.
+
+
+
+
+ Casing:
+
+
+
+
+ If checked, you will get alerts about case announcements.
+
+
+
+
+ Defense:
+
+
+
+
+ If checked, you will get alerts about case announcements if a defense spot is open.
+
+
+
+
+ Prosecution:
+
+
+
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.
-
+ Judge:
-
+ If checked, you will get alerts about case announcements if the judge spot is open.
-
+ Juror:
-
+ If checked, you will get alerts about case announcements if a juror spot is open.
-
+ Stenographer:
-
+ If checked, you will get alerts about case announcements if a stenographer spot is open.
-
+ CM:
-
+ If checked, you will appear amongst the potential CMs on the server.
-
+
+ Witness:
+
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+
+
+
+ Hosting cases:
-
+ If you're a CM, enter what cases you are willing to host.
@@ -389,353 +435,357 @@ Reason: %1
Courtroom
-
+ Password
-
+ Spectator
-
-
+
+ Search
-
+ Passworded
-
+ Taken
-
- Generating chars:
-%1/%2
+
+ Could not find %1
-
+ Showname
-
+ Message
-
+ Name
-
+ Pre
-
+ Flip
-
- Guard
-
-
-
-
-
+
+ Casing
-
+ Shownames
-
+ No Interrupt
-
+ White
-
+ Green
-
+ Red
-
+ Orange
-
+ Blue
-
+ Yellow
-
+ This does nothing, but there you go.
-
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1
-
+ Case made by %1.
-
+ Navigate to %1 for the CM doc.
-
+ Your case "%1" was loaded!
-
-
+
+ Server
-
+ Back to Lobby
-
+ Rainbow
-
+
+ Disable Modcalls
+
+
+
+ Pink
-
+ Cyan
-
+ % offset
-
+ Music
-
+ Sfx
-
+ Blips
-
+ Log limit
-
+ Change character
-
+ Reload theme
-
+ Call mod
-
+ Settings
-
+ A/M
-
+ Preanim
-
+
+ You have been banned.
+
+
+
+ You were granted the Guard button.
-
+ You opened the settings menu.
-
+ You will now pair up with
-
+ if they also choose your character in return.
-
+ You are no longer paired with anyone.
-
+ Are you sure you typed that well? The char ID could not be recognised.
-
+ You have set your offset to
-
+ Your offset must be between -100% and 100%!
-
+ That offset does not look like one.
-
+ You switched your music and area list.
-
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.
-
+ Your pre-animations interrupt again.
-
+ Your pre-animations will not interrupt text.
-
+ Couldn't open chatlog.txt to write into.
-
+ The IC chatlog has been saved.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.
-
+ Too many arguments to load a case! You only need one filename, without extension.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.
-
+ You need to give a filename to save (extension not needed) and the courtroom status!
-
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!
-
+ Succesfully saved, edit doc and cmdoc link on the ini!
-
+ Master
-
+ Reason:
-
+ Call Moderator
-
-
+
+ Error
-
+ You must provide a reason.
-
+ The message is too long.
@@ -768,39 +818,39 @@ Cases you can load: %1
-
+ It doesn't look like your client is set up correctly.
Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?
-
+ Version: %1
-
+ Loading
-
+ Cancel
-
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
-
+ Online: %1/%2
-
-
+
+ Offline
diff --git a/resource/translations/ao_es.ts b/resource/translations/ao_es.ts
index 9c14710..aefae56 100644
--- a/resource/translations/ao_es.ts
+++ b/resource/translations/ao_es.ts
@@ -1,6 +1,6 @@
-
+AOApplication
@@ -22,66 +22,67 @@ Please check your Internet connection and firewall, and please try again.Hubo un error al obtener la lista de servidores. Verifique su conexión a Internet y firewall, y vuelva a intentarlo.
-
+ Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.¡Versión desactualizada! Su versión: %1 Vaya a aceattorneyonline.com para actualizar.
-
+ You have been exiled from AO.
Have a nice day.Has sido exiliado de AO.
Que tengas un buen día.
-
+ Attorney Online 2Attorney Online 2
-
+ LoadingCargando
-
+ Loading evidence:
%1/%2Cargando evidencia:
%1/%2
-
-
+
+ Loading music:
%1/%2Cargando música:
%1/%2
-
+
+ Loading chars:
%1/%2Cargando personajes:
%1/%2
-
+ You have been kicked from the server.
Reason: %1Has sido expulsado del servidor.
Razón: %1
-
+ You have been banned from the server.
Reason: %1Has sido bloqueado de este servidor.
Razón: %1
-
+ You are banned on this server.
Reason: %1Has sido bloqueado en este servidor.
@@ -137,271 +138,316 @@ Razón: Stenographer neededSe necesita taquígrafo
+
+
+ Witness needed
+
+ AOOptionsDialog
-
+ SettingsAjustes
-
+ GameplayJugabilidad
-
+ Theme:Tema visual:
-
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.Establece el tema visual utilizado en el juego. Si el nuevo tema también cambia el aspecto del lobby, deberá volver a cargar el lobby para que los cambios surtan efecto, como unirse a un servidor y volver al lobby.
-
+ Log goes downwards:Invertir historial IC:
-
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.Si está marcado, los nuevos mensajes aparecerán en la parte inferior (como el chat OOC).
-
+ Log length:Limite del historial:
-
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.La cantidad de mensajes que mantendrá el historial del chat IC antes de eliminar mensajes más antiguos. 0 significa 'infinito'.
-
+ Default username:Usuario predeterminado:
-
+ Your OOC name will be automatically set to this value when you join a server.Su nombre OOC se establecerá automáticamente a este cuando se una a un servidor.
-
+ Custom shownames:Mostrar nombres:
-
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.Activa la casilla 'Mostrar nombres' de forma predeterminada en el juego, que a su vez determina si el cliente debe mostrar nombres personalizados en los personajes.
-
+ Backup MS:Master SV de respaldo:
-
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.Si la lista de servidores predeterminada falla, el juego probará la dirección proporcionada aquí.
-
+ Discord:Discord:
-
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.Permite a otros en Discord ver en qué servidor estás, qué personaje juegas y cuánto tiempo has estado jugando.
+
+
+ Allow Shake/Flash:
+
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+
+
+
+ Language:Idioma:
-
+ Sets the language if you don't want to use your system language.Establece el idioma si no desea utilizar el idioma de su sistema.
-
+ CallwordsPalabras clave
-
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html><html><head/><body>Ingrese tantas palabras de llamada como desee.<br>Esto no distingue entre mayúsculas y minúsculas. ¡Asegúrese de dejar cada palabra en su propia línea!<br>No deje una línea con un espacio al final; recibirá una alerta cada vez que alguien use un espacio en sus mensajes.</body></html>
-
+ AudioAudio
-
+ Audio device:Dispositivo:
-
+ Sets the audio device for all sounds.Establece el dispositivo de audio.
-
+ Music:Música:
-
+ Sets the music's default volume.Establece el volumen predeterminado de la música.
-
+ SFX:SFX:
-
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.Establece el volumen predeterminado de SFX. Las interjecciones y los efectos de sonido reales cuentan como 'SFX'.
-
+ Blips:Blips:
-
+ Sets the volume of the blips, the talking sound effects.Establece el volumen de los blips, el sonido al hablar.
-
+ Blip rate:Tasa de blips:
-
+ Sets the delay between playing the blip sounds.Establece el retraso entre la reproducción de los sonidos blip.
-
+ Blank blips:Blips en blanco:
-
+ If true, the game will play a blip sound even when a space is 'being said'.Si está marcada, el juego reproducirá un sonido blip incluso cuando se 'dice' un espacio.
-
+
+ Enable Looping SFX:
+
+
+
+
+ If true, the game will allow looping sound effects to play on preanimations.
+
+
+
+
+ Kill Music On Objection:
+
+
+
+
+ If true, the game will stop music when someone objects, like in the actual games.
+
+
+
+ CasingCaso
-
+ This server supports case alerts.Este servidor admite alertas de casos.
-
+ This server does not support case alerts.Este servidor no admite alertas de casos.
-
+ Pretty self-explanatory.Bastante autoexplicativo.
-
+ Casing:Caso:
-
+ If checked, you will get alerts about case announcements.Si está marcado, recibirá anuncios de casos.
-
+ Defense:Abogado:
-
+ If checked, you will get alerts about case announcements if a defense spot is open.Si está marcado, recibirá alertas sobre anuncios de casos si hay un lugar de abogado libre.
-
+ Prosecution:Fiscal:
-
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.Si está marcada, recibirá alertas sobre anuncios de casos si hay un puesto de fiscal libre.
-
+ Judge:Juez:
-
+ If checked, you will get alerts about case announcements if the judge spot is open.Si está marcado, recibirá alertas sobre anuncios de casos si el puesto de juez está libre.
-
+ Juror:Jurado:
-
+ If checked, you will get alerts about case announcements if a juror spot is open.Si está marcado, recibirá alertas sobre anuncios de casos si hay un puesto de jurado libre.
-
+ Stenographer:Taquígrafo:
-
+ If checked, you will get alerts about case announcements if a stenographer spot is open.Si está marcado, recibirá alertas sobre anuncios de casos si hay un lugar de taquígrafo libre.
-
+ CM:CM:
-
+ If checked, you will appear amongst the potential CMs on the server.Si está marcado, aparecerá entre los posibles CM en el servidor.
-
+
+ Witness:
+
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+
+
+
+ Hosting cases:Casos:
-
+ If you're a CM, enter what cases you are willing to host.Si eres un CM, ingresa qué casos estás dispuesto a organizar.
@@ -409,36 +455,40 @@ Razón:
Courtroom
-
+ PasswordContraseña
-
+ SpectatorEspectador
-
-
+
+ SearchBuscar
-
+ PasswordedContraseña
-
+ TakenEn uso
-
+
+ Could not find %1
+
+
+ Generating chars:
%1/%2
- Generando personajes:
+ Generando personajes:
%1/%2
@@ -448,260 +498,264 @@ Razón:
-
+ Showname
-
+ MessageMensaje
-
+ NameNombre
-
+ Pre
-
+ Flip
- Guard
- Guardia
+ Guardia
-
-
+
+ CasingCaso
-
+ Shownames
-
+ No Interrupt
-
+ WhiteBlanco
-
+ GreenVerde
-
+ RedRojo
-
+ OrangeNaranja
-
+ BlueAzul
-
+ YellowAmarillo
-
+ RainbowArcoíris
-
+ PinkRosado
-
+ CyanCian
-
+ % offset% desplazamiento
-
+ Music
-
+ Sfx
-
+ Blips
-
+ Log limit
-
+ Change character
-
+ Reload theme
-
+ Call mod
-
+ SettingsAjustes
-
+ A/MA/M
-
+ Preanim
-
+ Back to LobbyVolver al lobby
-
+
+ You have been banned.
+
+
+
+ You were granted the Guard button.Te ha sido otorgado el botón Guardia.
-
+ This does nothing, but there you go.Esto no hace nada, pero ahí lo tienes.
-
+ You opened the settings menu.Abriste el menú de configuración.
-
+ You will now pair up with Ahora te emparejarás con
-
+ if they also choose your character in return. si ellos también eligen a tu personaje a cambio.
-
+ You are no longer paired with anyone.Ya no estás emparejado con nadie.
-
+ Are you sure you typed that well? The char ID could not be recognised.¿Estás seguro de que lo escribiste bien? El ID de personaje no pudo ser reconocido.
-
+ You have set your offset to Ha configurado su desplazamiento en
-
+ Your offset must be between -100% and 100%!¡Su desplazamiento debe estar entre -100% y 100%!
-
+ That offset does not look like one.Ese desplazamiento no se parece a uno.
-
+ You switched your music and area list.Cambiaste tu lista de música y área.
-
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.Ha habilitado forzosamente funciones que el servidor puede no admitir. Es posible que no pueda hablar IC, o peor, debido a esto.
-
+ Your pre-animations interrupt again.Sus pre-animaciones interrumpen de nuevo.
-
+ Your pre-animations will not interrupt text.Sus pre-animaciones no interrumpirán el texto.
-
+ Couldn't open chatlog.txt to write into.No se pudo abrir chatlog.txt para escribir.
-
+ The IC chatlog has been saved.El chat IC se ha guardado.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.¡No tienes una carpeta `base/cases /`! Ha sido creada para ti. Pero debido a que no existia la carpeta, tampoco habían casos guardados ahí.
-
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1¡Debe dar un nombre de archivo para cargar (no se necesita extensión)! Asegúrese de que esté en la carpeta `base/cases/` y de que tenga el formato correcto.
Casos que puede cargar: %1
-
+ Case made by %1.Caso hecho por %1.
-
+ Navigate to %1 for the CM doc.Navegue a %1 para el documento del CM.
-
+ Your case "%1" was loaded!Su caso "%1" fue cargado!
@@ -712,7 +766,7 @@ Cases you can load:
Casos que puede cargar:
-
+ Too many arguments to load a case! You only need one filename, without extension.¡Demasiados argumentos para cargar un caso! Solo necesita un nombre de archivo, sin extensión.
@@ -737,60 +791,65 @@ Casos que puede cargar:
" fue cargado!
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.¡No tienes una carpeta `base/cases /`! Fue creada para ti.
-
+ You need to give a filename to save (extension not needed) and the courtroom status!¡Debe dar un nombre de archivo para guardar (no se necesita la extensión) y el estado de la sala del tribunal!
-
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!why two exclamations, seems excesive.¡Demasiados argumentos para salvar un caso! Solo necesita un nombre de archivo sin extensión y el estado de la sala del tribunal.
-
+ Succesfully saved, edit doc and cmdoc link on the ini!¡Guardado con éxito, puede editar el doc y doc link en el archivo ini!
-
+ Master
-
-
+
+ Server
-
+
+ Disable Modcalls
+
+
+
+ Reason:Razón:
-
+ Call ModeratorLlamar Moderador
-
-
+
+ ErrorError
-
+ You must provide a reason.Debes proporcionar una razón.
-
+ The message is too long.El mensaje es muy largo.
@@ -823,40 +882,40 @@ Casos que puede cargar:
Nombre
-
+ It doesn't look like your client is set up correctly.
Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?No parece que su cliente esté configurado correctamente.
¿Descargó todos los recursos correctamente desde tiny.cc/getao, incluida la gran carpeta 'base'?
-
+ Version: %1Versión: %1
-
+ LoadingCargando
-
+ CancelCancelar
-
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy<h2>Attorney Online %1</h2>El simulador de drama legal<p><b>Código fuente:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https: //github.com/AttorneyOnline/AO2-Client</a><p><b>Desarrollo mayor:</b> <br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Agradecimiento especial:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (diseño de interfaz de usuario), Draxirch (diseño de interfaz de usuario), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
-
+ Online: %1/%2En línea: %1/%2
-
-
+
+ OfflineFuera de línea
diff --git a/resource/translations/ao_jp.ts b/resource/translations/ao_jp.ts
index 4f8153a..5e1e8b8 100644
--- a/resource/translations/ao_jp.ts
+++ b/resource/translations/ao_jp.ts
@@ -21,60 +21,61 @@ Please check your Internet connection and firewall, and please try again.
-
+ Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.
-
+ You have been exiled from AO.
Have a nice day.
-
+ Attorney Online 2
-
+ Loadingロード中
-
+ Loading evidence:
%1/%2証拠がロード中: %1/%2
-
-
+
+ Loading music:
%1/%2音楽がロード中: %1/%2
-
+
+ Loading chars:
%1/%2キャラがロード中: %1/%2
-
+ You have been kicked from the server.
Reason: %1
-
+ You have been banned from the server.
Reason: %1
-
+ You are banned on this server.
Reason: %1
@@ -117,271 +118,316 @@ Reason: %1
Stenographer needed
+
+
+ Witness needed
+
+ AOOptionsDialog
-
+ Settings
-
+ Gameplay
-
+ Theme:
-
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.
-
+ Log goes downwards:
-
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.
-
+ Log length:
-
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.
-
+ Default username:
-
+ Your OOC name will be automatically set to this value when you join a server.
-
+ Custom shownames:
-
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.
-
+ Backup MS:
-
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.
-
+ Discord:
-
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.
+
+
+ Allow Shake/Flash:
+
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+
+
+
+ Language:
-
+ Sets the language if you don't want to use your system language.
-
+ Callwords
-
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html>
-
+ Audio
-
+ Audio device:
-
+ Sets the audio device for all sounds.
-
+ Music:音楽:
-
+ Sets the music's default volume.
-
+ SFX:効果音:
-
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.
-
+ Blips:ブリップ:
-
+ Sets the volume of the blips, the talking sound effects.
-
+ Blip rate:
-
+ Sets the delay between playing the blip sounds.
-
+ Blank blips:
-
+ If true, the game will play a blip sound even when a space is 'being said'.
-
- Casing
-
-
-
-
- This server supports case alerts.
+
+ Enable Looping SFX:
- This server does not support case alerts.
+ If true, the game will allow looping sound effects to play on preanimations.
-
- Pretty self-explanatory.
+
+ Kill Music On Objection:
-
- Casing:
-
-
-
-
- If checked, you will get alerts about case announcements.
-
-
-
-
- Defense:
+
+ If true, the game will stop music when someone objects, like in the actual games.
- If checked, you will get alerts about case announcements if a defense spot is open.
-
-
-
-
- Prosecution:
+ Casing
+ This server supports case alerts.
+
+
+
+
+ This server does not support case alerts.
+
+
+
+
+ Pretty self-explanatory.
+
+
+
+
+ Casing:
+
+
+
+
+ If checked, you will get alerts about case announcements.
+
+
+
+
+ Defense:
+
+
+
+
+ If checked, you will get alerts about case announcements if a defense spot is open.
+
+
+
+
+ Prosecution:
+
+
+
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.
-
+ Judge:
-
+ If checked, you will get alerts about case announcements if the judge spot is open.
-
+ Juror:
-
+ If checked, you will get alerts about case announcements if a juror spot is open.
-
+ Stenographer:
-
+ If checked, you will get alerts about case announcements if a stenographer spot is open.
-
+ CM:
-
+ If checked, you will appear amongst the potential CMs on the server.
-
+
+ Witness:
+
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+
+
+
+ Hosting cases:
-
+ If you're a CM, enter what cases you are willing to host.
@@ -389,353 +435,361 @@ Reason: %1
Courtroom
-
+ Password
-
+ Spectator観客
-
-
+
+ Search
-
+ Passworded
-
+ Taken
-
- Generating chars:
-%1/%2
+
+ Could not find %1
-
+ Showname
-
+ Message
-
+ Name名前
-
+ Pre前
-
+ Flipフリップ
- Guard
- ガード
+ ガード
-
-
+
+ Casing
-
+ Shownames
-
+ No Interrupt
-
+ White白
-
+ Green緑
-
+ Red赤
-
+ Orangeオレンジ
-
+ Blue青
-
+ Yellow黄色
-
+ This does nothing, but there you go.
-
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1
-
+ Case made by %1.
-
+ Navigate to %1 for the CM doc.
-
+ Your case "%1" was loaded!
-
-
+
+ Server
-
+ Back to Lobbyロビーに戻る
-
+ Rainbow虹
-
+
+ Disable Modcalls
+
+
+
+ Pink
-
+ Cyan
-
+ % offset
-
+ Music音楽
-
+ Sfx効果音
-
+ Blipsブリップ
-
+ Log limit
-
+ Change character
-
+ Reload theme
-
+ Call mod
-
+ Settings
-
+ A/M
-
+ Preanim
-
+
+ You have been banned.
+
+
+
+ You were granted the Guard button.
-
+ You opened the settings menu.
-
+ You will now pair up with
-
+ if they also choose your character in return.
-
+ You are no longer paired with anyone.
-
+ Are you sure you typed that well? The char ID could not be recognised.
-
+ You have set your offset to
-
+ Your offset must be between -100% and 100%!
-
+ That offset does not look like one.
-
+ You switched your music and area list.
-
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.
-
+ Your pre-animations interrupt again.
-
+ Your pre-animations will not interrupt text.
-
+ Couldn't open chatlog.txt to write into.
-
+ The IC chatlog has been saved.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.
-
+ Too many arguments to load a case! You only need one filename, without extension.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.
-
+ You need to give a filename to save (extension not needed) and the courtroom status!
-
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!
-
+ Succesfully saved, edit doc and cmdoc link on the ini!
-
+ Masterマスター
-
+ Reason:
-
+ Call Moderatorモデレーターを呼ぶ
-
-
+
+ Errorエラー
-
+ You must provide a reason.
-
+ The message is too long.
@@ -791,39 +845,39 @@ Cases you can load: %1
名前
-
+ It doesn't look like your client is set up correctly.
Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?
-
+ Version: %1
-
+ Loadingロード中
-
+ Cancelキャンセル
-
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
-
+ Online: %1/%2
-
-
+
+ Offlineオフライン
diff --git a/resource/translations/ao_pl.qm b/resource/translations/ao_pl.qm
new file mode 100644
index 0000000..cdc1393
Binary files /dev/null and b/resource/translations/ao_pl.qm differ
diff --git a/resource/translations/ao_pl.ts b/resource/translations/ao_pl.ts
new file mode 100644
index 0000000..720288e
--- /dev/null
+++ b/resource/translations/ao_pl.ts
@@ -0,0 +1,900 @@
+
+
+
+
+ AOApplication
+
+
+ Disconnected from server.
+ Odłączono od serwera.
+
+
+
+ Error connecting to master server. Will try again in %1 seconds.
+ Błąd podczas łączenia się do głównego serwera. Spróbuj ponownie za %1 sekundy.
+
+
+
+ There was an error connecting to the master server.
+We deploy multiple master servers to mitigate any possible downtime, but the client appears to have exhausted all possible methods of finding and connecting to one.
+Please check your Internet connection and firewall, and please try again.
+ Odkryto błąd podczas łączania się do głównego serwera.
+Używamy wielu głównych serwerów, aby zminimalizować każdą możliwą przerwę, ale klient wyczerpał jaką kolwiek możliwość znalazienia i połączenia się do któregoś.
+Proszę sprawdzić swoje połączenie internetowe oraz zaporę ogniową i spróbować ponownie.
+
+
+
+ Outdated version! Your version: %1
+Please go to aceattorneyonline.com to update.
+ Nieaktualna wersja! Twoja wersja: %1
+Proszę udać się do aceattorneyonline.com, aby zaktualizować.
+
+
+
+ You have been exiled from AO.
+Have a nice day.
+ Zostałeś wygnany z AO2.
+Życzę miłego dnia.
+
+
+
+ Attorney Online 2
+
+
+
+
+ Loading
+ Ładowanie
+
+
+
+ Loading evidence:
+%1/%2
+ Ładowanie dowodów:
+%1/%2
+
+
+
+
+ Loading music:
+%1/%2
+ Ładowanie muzyki:
+%1/%2
+
+
+
+
+ Loading chars:
+%1/%2
+ Ładowanie postaci:
+%1/%2
+
+
+
+ You have been kicked from the server.
+Reason: %1
+ Zostałeś wyrzucony z tego serwera.
+Powód: %1
+
+
+
+ You have been banned from the server.
+Reason: %1
+ Zostałeś zbanowany z tego serwera.
+Powód: %1
+
+
+
+ You are banned on this server.
+Reason: %1
+ Jesteś zbanowany na tym serwerze.
+Powód: %1
+
+
+
+ AOCaseAnnouncerDialog
+
+
+ Case Announcer
+ Ogłaszanie rozpraw
+
+
+
+ Case title:
+ Tytuł rozprawy:
+
+
+
+ Defense needed
+ Potrzebny obrońca
+
+
+
+ Prosecution needed
+ Potrzebny prokurator
+
+
+
+ Judge needed
+ Potrzebny sędzia
+
+
+
+ Jurors needed
+ Potrzebny ławnik
+
+
+
+ Stenographer needed
+ Potrzebny stenograf
+
+
+
+ Witness needed
+
+
+
+
+ AOOptionsDialog
+
+
+ Settings
+ Ustawienia
+
+
+
+ Gameplay
+ Rozgrywka
+
+
+
+ Theme:
+ Motyw:
+
+
+
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.
+ Ustawia motyw używany w grze. Jeżeli nowy motyw równiesz zmienia wygląd poczekalni, musisz odświeżyć poczekalnię, aby zmiany zaczęły działać, np. poprzez dołączenie do serwera i wyjście z niego.
+
+
+
+ Log goes downwards:
+ Dziennik idzie w dół:
+
+
+
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.
+ Jeżeli zaznaczone, nowe wiadomości zaczną się pojawiać na dole (tak jak na czacie OOC). Tradycyjne (AO1) zachowanie jest równoważne do tego bycia nie zaznaczonym.
+
+
+
+ Log length:
+ Długość dziennika:
+
+
+
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.
+ Ilość wiadomości, jakie czat IC będzie zostawiał zanim usunie starsze wiadomości. Wartośc 0 albo niżej, liczy się jako 'nieskończone'.
+
+
+
+ Default username:
+ Domyślna nazwa użytkownika:
+
+
+
+ Your OOC name will be automatically set to this value when you join a server.
+ Twoja nazwa OOC będzie ustawiana automatycznie do tej wartości, kiedy dołączysz na serwer.
+
+
+
+ Custom shownames:
+ Niestandardowe ksywki:
+
+
+
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.
+ Daje domyślną wartość przyciskowi wyboru 'Niestandardowe ksywki', który określa czy klient powinien pokazywać niestandardowe IC nazwy.
+
+
+
+ Backup MS:
+ Kopia zapasowa głównego serwera:
+
+
+
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.
+ Jeśli wbudowane szukanie serwerów zawiedzie, gra spróbuje użyć adresu podanego tutaj i użyje go jako adresu zapasowego głównego serwera.
+
+
+
+ Discord:
+
+
+
+
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.
+ Pozwala innym na Discordzie zobaczyć na jakim serwerze się znajdujesz, jaką postać używasz i jak długo grałeś.
+
+
+
+ Allow Shake/Flash:
+
+
+
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+
+
+
+
+ Language:
+ Język:
+
+
+
+ Sets the language if you don't want to use your system language.
+ Ustawia język, jeśli nie chcesz używać języka systemowego.
+
+
+
+ Callwords
+ Zawołania
+
+
+
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html>
+ <html><head/><body>Wpisz tyle zawołań, ile dusza zapragnie. Wielkość liter nie ma znaczenia. Miej na uwadze, aby każde zawołanie było na swojej lini!<br>Nie zostawiaj spacji na końcu -- zostaniesz zaalarmowany za każdym razem, kiedy ktoś użyje spacji w swojej wiadomości.</body></html>
+
+
+
+ Audio
+ Dźwięk
+
+
+
+ Audio device:
+ Urządzenie dźwiękowe:
+
+
+
+ Sets the audio device for all sounds.
+ Ustawia urządzenie dźwiękowe na wszystkie dźwięki.
+
+
+
+ Music:
+ Muzyka:
+
+
+
+ Sets the music's default volume.
+ Ustawia domyślną głośność muzyki.
+
+
+
+ SFX:
+ Efekty dźwiękowe (SFX):
+
+
+
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.
+ Ustawia domyślną głośność efektów specjalnych (SFX). Wtrącenia się i same efekty specjalne są zaliczane jako 'SFX'.
+
+
+
+ Blips:
+ Blipy:
+
+
+
+ Sets the volume of the blips, the talking sound effects.
+ Ustawia głośność blipów, efektów dźwiękowych mówienia.
+
+
+
+ Blip rate:
+ Szybkość blipów:
+
+
+
+ Sets the delay between playing the blip sounds.
+ Ustawia opóźnienie pomiędzy graniem blipów.
+
+
+
+ Blank blips:
+ The 'blip' isn't an accurate polish representation of this english word.
+ Puste blipy:
+
+
+
+ If true, the game will play a blip sound even when a space is 'being said'.
+ Jeśli prawdziwe, gra zagra dźwięk blip za każdym razem spacja 'jest mówiona'.
+
+
+
+ Enable Looping SFX:
+
+
+
+
+ If true, the game will allow looping sound effects to play on preanimations.
+
+
+
+
+ Kill Music On Objection:
+
+
+
+
+ If true, the game will stop music when someone objects, like in the actual games.
+
+
+
+
+ Casing
+ Rozprawa
+
+
+
+ This server supports case alerts.
+ Ten serwer wspiera komunikaty rozpraw.
+
+
+
+ This server does not support case alerts.
+ Ten serwer nie wspiera komunikatów rozpraw.
+
+
+
+ Pretty self-explanatory.
+ Dosyć oczywiste.
+
+
+
+ Casing:
+ Rozprawy:
+
+
+
+ If checked, you will get alerts about case announcements.
+ Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw.
+
+
+
+ Defense:
+ Obrona:
+
+
+
+ If checked, you will get alerts about case announcements if a defense spot is open.
+ Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce obrony jest otwarte.
+
+
+
+ Prosecution:
+ Prokuratura:
+
+
+
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.
+ Jeżeli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce prokuratury jest otwarte.
+
+
+
+ Judge:
+ Sędzia:
+
+
+
+ If checked, you will get alerts about case announcements if the judge spot is open.
+ Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce sędzi jest otwarte.
+
+
+
+ Juror:
+ Ławnik:
+
+
+
+ If checked, you will get alerts about case announcements if a juror spot is open.
+ Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce ławnika jest otwarte.
+
+
+
+ Stenographer:
+ Stenograf:
+
+
+
+ If checked, you will get alerts about case announcements if a stenographer spot is open.
+ Jeśli zaznaczone, dostaniesz komunikaty o ogłoszeniach rozpraw, jeśli miejsce stenografa jest otwarte.
+
+
+
+ CM:
+ Mistrz rozpraw (CM):
+
+
+
+ If checked, you will appear amongst the potential CMs on the server.
+ Jeśli zaznaczone, pojawisz się wśród potencjalnych mistrzów rozpraw (CM) na serwerze.
+
+
+
+ Witness:
+
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+
+
+
+
+ Hosting cases:
+ Hostowane rozprawy:
+
+
+
+ If you're a CM, enter what cases you are willing to host.
+ Jeśli jesteś mistrzem rozpraw (CM), wpisz jakie rozprawy jesteś chętny hostowania.
+
+
+
+ Courtroom
+
+
+ Password
+ Hasło
+
+
+
+ Spectator
+ Widz
+
+
+
+
+ Search
+ Wyszukaj
+
+
+
+ Passworded
+ Zahasłowany
+
+
+
+ Taken
+ Zajęty
+
+
+
+ Could not find %1
+
+
+
+ Generating chars:
+%1/%2
+ Generowanie postaci:
+%1.%2
+
+
+
+ Showname
+ Ksywka
+
+
+
+ Message
+ Wiadomość
+
+
+
+ Name
+ Nazwa
+
+
+
+ Pre
+ przed-
+
+
+
+ Flip
+ Odwróć
+
+
+ Guard
+ Na Służbie (mod)
+
+
+
+
+ Casing
+ Rozprawa
+
+
+
+ Shownames
+ Ksywki
+
+
+
+ No Interrupt
+ Bez przerwy
+
+
+
+ White
+ Biały
+
+
+
+ Green
+ Zielony
+
+
+
+ Red
+ Czerwony
+
+
+
+ Orange
+ Pomarańczowy
+
+
+
+ Blue
+ Niebieski
+
+
+
+ Yellow
+ Żółty
+
+
+
+ This does nothing, but there you go.
+ To nic nie robi, ale proszę bardzo.
+
+
+
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
+Cases you can load: %1
+ Musisz podać nazwę pliku, którego chcesz załadować (rozszerzenie nie potrzebne!) Upewnij się, że jest w folderze `base/cases/` i że jest to poprawnie sformatowane ini.
+Rozprawy które możesz załadować: %1
+
+
+
+ Case made by %1.
+ Rozprawa zrobiona przez %1.
+
+
+
+ Navigate to %1 for the CM doc.
+ Przejdź do %1, aby dojść do dokumentu CM.
+
+
+
+ Your case "%1" was loaded!
+ Twoja rozprawa "%1" została wczytana!
+
+
+
+
+ Server
+ Serwer
+
+
+
+ Back to Lobby
+ Powrót do poczekalni
+
+
+
+ Rainbow
+ Tęczowy
+
+
+
+ Disable Modcalls
+
+
+
+
+ Pink
+ Różowy
+
+
+
+ Cyan
+ Turkusowy
+
+
+
+ % offset
+ % wyrówanie
+
+
+
+ Music
+ Muzyka
+
+
+
+ Sfx
+ Sfx
+
+
+
+ Blips
+ Blipy
+
+
+
+ Log limit
+ Limit dziennika
+
+
+
+ Change character
+ Zmiena postaci
+
+
+
+ Reload theme
+ Odśwież motyw
+
+
+
+ Call mod
+ Wezwij moda
+
+
+
+ Settings
+ Ustawienia
+
+
+
+ A/M
+ O meaning 'Obszar' and M meaning 'Muzyka'.
+ O/M
+
+
+
+ Preanim
+ przed-animacja
+
+
+
+ You have been banned.
+
+
+
+
+ You were granted the Guard button.
+ Zostałeś obdarzonym przyciskiem Na Służbie.
+
+
+
+ You opened the settings menu.
+ Otworzyłeś opcje.
+
+
+
+ You will now pair up with
+ Będzie teraz w parze z
+
+
+
+ if they also choose your character in return.
+ jeżeli oni również wybiorą ciebie spowrotem.
+
+
+
+ You are no longer paired with anyone.
+ Nie jesteś już w parze z kimkolwiek.
+
+
+
+ Are you sure you typed that well? The char ID could not be recognised.
+ Czy jesteś pewien, że dobrze to napisałeś? ID postaci nie zostało rozpoznane.
+
+
+
+ You have set your offset to
+ Musisz ustawić swoje wyrównanie do
+
+
+
+ Your offset must be between -100% and 100%!
+ Twoje wyrównanie musi być między -100%, a 100%!
+
+
+
+ That offset does not look like one.
+ To wyrównanie nie wygląda na jedno.
+
+
+
+ You switched your music and area list.
+ Przełączyłeś swoją listę obszarów i muzyki.
+
+
+
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.
+ Włączyłeś funkcje, które ten serwer może nie wspierać. Możliwe że, nie możesz rozmawiać na czacie IC lub gorzej przez to.
+
+
+
+ Your pre-animations interrupt again.
+ Twoje przed-animacje przerywają tekst spowrotem.
+
+
+
+ Your pre-animations will not interrupt text.
+ Twoje przed-animacje nie będą przerywać tekstu.
+
+
+
+ Couldn't open chatlog.txt to write into.
+ Nie można było otworzyć chatlog.txt, aby zapisać do niego.
+
+
+
+ The IC chatlog has been saved.
+ Dziennik czatu IC został zapisany.
+
+
+
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.
+ Nie masz folderu `base/cases/`! Został zrobiony tylko dla ciebie, ale widząc, że ZOSTAŁ zrobiony tylko dla ciebie, prawdopodobnie plik rozpraw, którego szukasz nie został znaleziony tutaj.
+
+
+
+ Too many arguments to load a case! You only need one filename, without extension.
+ Za dużo parametrów, aby załadować rozprawę! Potrzebujesz tylko jedną nazwę pliku, bez rozszerzenia nazwy pliku.
+
+
+
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.
+ Nie masz folderu `base/cases/`! Został zrobiony tylko dla ciebie, ale widząc, że ZOSTAŁ zrobiony tylko dla ciebie, prawdopodobnie jakoś usunąłeś go.
+
+
+
+ You need to give a filename to save (extension not needed) and the courtroom status!
+ Musisz podać nazwę pliku, aby go zapisać (rozszerzenie nie potrzebne) i status sali sądowej!
+
+
+
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!
+ Za dużo parametrów, aby zapisać rozprawę! Potrzebujesz tylko jedną nazwę pliku, bez rozszerzenia nazwy pliku i statusu sali sądowej!
+
+
+
+ Succesfully saved, edit doc and cmdoc link on the ini!
+ Zapisano pomyślnie, edytuj dokument i link cmdoc w .ini!
+
+
+
+ Master
+ Główny
+
+
+
+ Reason:
+ Powód:
+
+
+
+ Call Moderator
+ Wezwij Moderatora
+
+
+
+
+ Error
+ Błąd
+
+
+
+ You must provide a reason.
+ Musisz podać przyczynę.
+
+
+
+ The message is too long.
+ Ta wiadomość jest za długa.
+
+
+
+ Choose...
+ Wybierz...
+
+
+
+ Images (*.png)
+ Plik obrazu (*.png)
+
+
+
+ Add new evidence...
+ Dodaj nowe dowody...
+
+
+
+ Lobby
+
+
+ Attorney Online 2
+
+
+
+
+ Name
+ Nazwa
+
+
+
+ It doesn't look like your client is set up correctly.
+Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?
+ Wygłąda na to, że twój klient nie jest ustawiony poprawnie.
+Czy pobrałeś wszystkie zasoby poprawnie z tiny.cc/getao, włączając duży folder 'base'?
+
+
+
+ Version: %1
+ Wersja: %1
+
+
+
+ Loading
+ Ładowanie
+
+
+
+ Cancel
+ Anuluj
+
+
+
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
+ <h2>Attorney Online: %1</h2>Symulator dramy sądowej<p><b>Kod żródłowy:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Główny rozwój:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Szczególne podziękowania:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
+
+
+
+ Online: %1/%2
+
+
+
+
+
+ Offline
+
+
+
+
+ debug_functions
+
+
+ Error: %1
+ Błąd: %1
+
+
+
+ Error
+ Błąd
+
+
+
+ Notice
+ Ogłoszenie
+
+
+
diff --git a/resource/translations/ao_ru.ts b/resource/translations/ao_ru.ts
index 9714c9d..da481ae 100644
--- a/resource/translations/ao_ru.ts
+++ b/resource/translations/ao_ru.ts
@@ -22,66 +22,67 @@ Please check your Internet connection and firewall, and please try again.
-
+ Outdated version! Your version: %1
Please go to aceattorneyonline.com to update.Устаревшая версия! У вас установлена %1
Проследуйте на сайт aceattorneyonline.com для обновления.
-
+ You have been exiled from AO.
Have a nice day.Из AO вас отправили в жизнь.
Хорошего дня.
-
+ Attorney Online 2Attorney Online 2
-
+ LoadingЗагрузка
-
+ Loading evidence:
%1/%2Загрузка вещдоков:
%1/%2
-
-
+
+ Loading music:
%1/%2Загрузка музыки:
%1/%2
-
+
+ Loading chars:
%1/%2Загрузка персонажей:
%1/%2
-
+ You have been kicked from the server.
Reason: %1Вас выпнули с сервера.
Причина: %1
-
+ You have been banned from the server.
Reason: %1
-
+ You are banned on this server.
Reason: %1Вас отправили в баню.
@@ -137,271 +138,316 @@ Reason:
Stenographer neededНужен стенографист?
+
+
+ Witness needed
+
+ AOOptionsDialog
-
+ SettingsНастройки
-
+ GameplayИгра
-
+ Theme:Тема:
-
+ Sets the theme used in-game. If the new theme changes the lobby's look as well, you'll need to reload the lobby for the changes to take effect, such as by joining a server and leaving it.Устанавливает внешний вид игры. Может понадобиться перезайти на сервер.
-
+ Log goes downwards:Портянку вниз:
-
+ If ticked, new messages will appear at the bottom (like the OOC chatlog). The traditional (AO1) behaviour is equivalent to this being unticked.Отметьте галочку, если хотите, чтобы сообщения в игровом чате отображались снизу, а не сверху.
-
+ Log length:Длина игрового чата:
-
+ The amount of messages the IC chatlog will keep before deleting older messages. A value of 0 or below counts as 'infinite'.Количество сообщений, максимально хранимых в игровом чате. Значение, равное 0 или меньше, будет расценено как снятие такого ограничения.
-
+ Default username:Никнейм по умолчанию:
-
+ Your OOC name will be automatically set to this value when you join a server.Псевдоним, используемый при соединении с сервером. В основном, его видно в чате сервера.
-
+ Custom shownames:Произвольные имена:
-
+ Gives the default value for the in-game 'Custom shownames' tickbox, which in turn determines whether the client should display custom in-character names.Отображать произвольные имена персонажей, установленные самими игроками.
-
+ Backup MS:Запасной ГС:
-
+ If the built-in server lookups fail, the game will try the address given here and use it as a backup master server address.Отображать перечень серверов от главного сервера, указанного здесь, когда не удалось соединиться с первичным ГС.
-
+ Discord:Discord:
-
+ Allows others on Discord to see what server you are in, what character are you playing, and how long you have been playing for.Показать в Discord сервер, на котором вы играете, каким персонажем управляете и время игры.
+
+
+ Allow Shake/Flash:
+
+
+ Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures.
+
+
+
+ Language:Язык:
-
+ Sets the language if you don't want to use your system language.
-
+ CallwordsПозывные
-
+ <html><head/><body>Enter as many callwords as you would like. These are case insensitive. Make sure to leave every callword in its own line!<br>Do not leave a line with a space at the end -- you will be alerted everytime someone uses a space in their messages.</body></html><html><head/><body>Введите на отдельных строках свои позывные, при указании которых в сообщениях будет подан звуковой сигнал.</body></html>
-
+ AudioАудио
-
+ Audio device:Устройство воспроизведения:
-
+ Sets the audio device for all sounds.Куда вещать звук из игры.
-
+ Music:Музыка:
-
+ Sets the music's default volume.Громкость музыки по умолчанию.
-
+ SFX:Звук. эффекты:
-
+ Sets the SFX's default volume. Interjections and actual sound effects count as 'SFX'.Громкость звуковых эффектов по умолчанию.
-
+ Blips:Сигналы:
-
+ Sets the volume of the blips, the talking sound effects.Громкость сигналов, заменяющих голос, по умолчанию.
-
+ Blip rate:Пер. сигналов:
-
+ Sets the delay between playing the blip sounds.Период между сигналами, заменяющими голос, по умолчанию.
-
+ Blank blips:Пустые сигналы:
-
+ If true, the game will play a blip sound even when a space is 'being said'.Проигрывать сигналы даже для пробелов.
-
+
+ Enable Looping SFX:
+
+
+
+
+ If true, the game will allow looping sound effects to play on preanimations.
+
+
+
+
+ Kill Music On Objection:
+
+
+
+
+ If true, the game will stop music when someone objects, like in the actual games.
+
+
+
+ CasingЗаседание
-
+ This server supports case alerts.Этот сервер поддерживает объявление заседания.
-
+ This server does not support case alerts.Этот сервер не поддерживает объявление заседания.
-
+ Pretty self-explanatory.Весьма доходчиво.
-
+ Casing:Новое дело:
-
+ If checked, you will get alerts about case announcements.При заведении дела вы получите уведомление.
-
+ Defense:Защита:
-
+ If checked, you will get alerts about case announcements if a defense spot is open.При заведении дела, в котором нужна сторона защиты, вы получите уведомление.
-
+ Prosecution:Обвинение:
-
+ If checked, you will get alerts about case announcements if a prosecutor spot is open.При заведении дела, в котором нужна сторона обвинения, вы получите уведомление.
-
+ Judge:Судья:
-
+ If checked, you will get alerts about case announcements if the judge spot is open.При заведении дела, в котором нужен судья, вы получите уведомление.
-
+ Juror:Присяжный:
-
+ If checked, you will get alerts about case announcements if a juror spot is open.При заведении дела, в котором нужны присяжные заседатели, вы получите уведомление.
-
+ Stenographer:Стенографист:
-
+ If checked, you will get alerts about case announcements if a stenographer spot is open.При заведении дела, в котором нужна стенография, вы получите уведомление.
-
+ CM:ПД:
-
+ If checked, you will appear amongst the potential CMs on the server.Отметьте, если вы хотите состоять в числе производителей дел.
-
+
+ Witness:
+
+
+
+
+ If checked, you will appear amongst the potential witnesses on the server.
+
+
+
+ Hosting cases:ПД акт.:
-
+ If you're a CM, enter what cases you are willing to host.Будучи производителем дела (ПД), вы можете войти в зону и заниматься её оркестровкой.
@@ -409,36 +455,40 @@ Reason:
Courtroom
-
+ PasswordПароль
-
+ SpectatorНаблюдатель
-
-
+
+ SearchПоиск
-
+ PasswordedОграничен паролем
-
+ TakenЗанят
-
+
+ Could not find %1
+
+
+ Generating chars:
%1/%2
- Генерация персонажей:
+ Генерация персонажей:
%1/%2
@@ -448,322 +498,331 @@ Reason:
-
+ ShownameИмя
-
+ MessageСообщение
-
+ NameНикнейм
-
+ PreПред.
-
+ FlipРазв.
- Guard
- Охрана
+ Охрана
-
-
+
+ CasingДело
-
+ ShownamesПроизв. имена
-
+ No InterruptГоворить сразу
-
+ WhiteБелый
-
+ GreenЗелëный
-
+ RedКрасный
-
+ OrangeОранжевый
-
+ BlueСиний
-
+ YellowЖëлтый
-
+ This does nothing, but there you go.В общем-то, это ни на что не влияет...
-
+ You need to give a filename to load (extension not needed)! Make sure that it is in the `base/cases/` folder, and that it is a correctly formatted ini.
Cases you can load: %1Укажите имя файла с делом (без расширения) для загрузки. Убедитесь, что оно расположено в папке `base/cases`.
Были найдены: %1
-
+ Case made by %1.Дело завëл игрок: %1.
-
+ Navigate to %1 for the CM doc.Перейдите к %1 для получения материалов дела.
-
+ Your case "%1" was loaded!Дело под кодовым названием "%1" готово!
-
-
+
+ ServerСервер
-
+ Back to LobbyНазад в лобби
-
+ RainbowРадужный
-
+
+ Disable Modcalls
+
+
+
+ PinkРозовый
-
+ CyanГолубой
-
+ % offset% сдвига
-
+ MusicМузыка
-
+ SfxЗвук. эффекты
-
+ BlipsСигналы
-
+ Log limit
-
+ Change character
-
+ Reload theme
-
+ Call mod
-
+ SettingsНастройки
-
+ A/M
-
+ Preanim
-
+
+ You have been banned.
+
+
+
+ You were granted the Guard button.Теперь у вас есть кнопка "Охрана".
-
+ You opened the settings menu.Вы открыли меню настроек.
-
+ You will now pair up with Вы встанете парой с персонажем по имени
-
+ if they also choose your character in return. (если он выберет вас в ответ).
-
+ You are no longer paired with anyone.Теперь вы не стоите в парах.
-
+ Are you sure you typed that well? The char ID could not be recognised.Кажется, вам нужно поменять запрос: такой идентификатор персонажа не был найден.
-
+ You have set your offset to Вы установили сдвиг персонажа на
-
+ Your offset must be between -100% and 100%!Сдвиг персонажа должен быть между -100% и 100%!
-
+ That offset does not look like one.Неверный сдвиг персонажа.
-
+ You switched your music and area list.Вы переключили перечень зон и музыки.
-
+ You have forcefully enabled features that the server may not support. You may not be able to talk IC, or worse, because of this.Из-за того, что вы включили не поддержимаемые сервером возможности, он может не принять ваши сообщения.
-
+ Your pre-animations interrupt again.Персонаж будет говорить только после анимации.
-
+ Your pre-animations will not interrupt text.Персонаж будет говорить и во время анимации.
-
+ Couldn't open chatlog.txt to write into.Не могу открыть `chatlog.txt` для записи лога.
-
+ The IC chatlog has been saved.Лог игрового чата сохранëн.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely the case file you're looking for can't be found in there.Файл с делом не найден. Если найдëте, положите его в папку `base/cases/`, которую мы для вас создали.
-
+ Too many arguments to load a case! You only need one filename, without extension.Введите имя файла без расширения.
-
+ You don't have a `base/cases/` folder! It was just made for you, but seeing as it WAS just made for you, it's likely that you somehow deleted it.Папка `base/cases/` отсутствует!
-
+ You need to give a filename to save (extension not needed) and the courtroom status!Введите имя файла (без расширения) и предоставьте статус зоны.
-
+ Too many arguments to save a case! You only need a filename without extension and the courtroom status!Убедитесь, что имя файла не содержит расширение.
-
+ Succesfully saved, edit doc and cmdoc link on the ini!Сохранение прошло успешно!
-
+ MasterМастер
-
+ Reason:Причина:
-
+ Call ModeratorПозвать модератора
-
-
+
+ ErrorОшибка
-
+ You must provide a reason.Укажите причину.
-
+ The message is too long.Слишком длинный текст.
@@ -796,40 +855,40 @@ Cases you can load: %1
Никнейм
-
+ It doesn't look like your client is set up correctly.
Did you download all resources correctly from tiny.cc/getao, including the large 'base' folder?Не похоже, что ваш клиент установлен правильно.
Скачали ли вы все ресурсы (tiny.cc/getao), включая огромную папку `base`?
-
+ Version: %1Версия: %1
-
+ LoadingЗагрузка
-
+ CancelОтмена
-
+ <h2>Attorney Online %1</h2>The courtroom drama simulator<p><b>Source code:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Major development:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Special thanks:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (UI design), Draxirch (UI design), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy<h2>Attorney Online %1</h2>Симулятор судебной драмы<p><b>Исходный код:</b> <a href='https://github.com/AttorneyOnline/AO2-Client'>https://github.com/AttorneyOnline/AO2-Client</a><p><b>Основной разработкой занимались:</b><br>OmniTroid, stonedDiscord, longbyte1, gameboyprinter, Cerapter<p><b>Особенная благодарность:</b><br>Remy, Iamgoofball, Hibiki, Qubrick (webAO), Ruekasu (дизайн интерфейса), Draxirch (дизайн интерфейса), Unishred, Argoneus (tsuserver), Fiercy, Noevain, Cronnicossy
-
+ Online: %1/%2Онлайн: %1/%2
-
-
+
+ OfflineВне сети
diff --git a/resources.qrc b/resources.qrc
index b8f62d1..fce01eb 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -7,5 +7,6 @@
resource/translations/ao_jp.qmresource/translations/ao_es.qmresource/translations/ao_ru.qm
+ resource/translations/ao_pl.qm
diff --git a/src/aocaseannouncerdialog.cpp b/src/aocaseannouncerdialog.cpp
index 5b82b64..4b36fe6 100644
--- a/src/aocaseannouncerdialog.cpp
+++ b/src/aocaseannouncerdialog.cpp
@@ -54,12 +54,15 @@ AOCaseAnnouncerDialog::AOCaseAnnouncerDialog(QWidget *parent, AOApplication *p_a
ui_juror_needed->setText(tr("Jurors needed"));
ui_steno_needed = new QCheckBox(this);
ui_steno_needed->setText(tr("Stenographer needed"));
+ ui_witness_needed = new QCheckBox(this);
+ ui_witness_needed->setText(tr("Witness needed"));
ui_form_layout->setWidget(1, QFormLayout::FieldRole, ui_defense_needed);
ui_form_layout->setWidget(2, QFormLayout::FieldRole, ui_prosecutor_needed);
ui_form_layout->setWidget(3, QFormLayout::FieldRole, ui_judge_needed);
ui_form_layout->setWidget(4, QFormLayout::FieldRole, ui_juror_needed);
ui_form_layout->setWidget(5, QFormLayout::FieldRole, ui_steno_needed);
+ ui_form_layout->setWidget(6, QFormLayout::FieldRole, ui_witness_needed);
setUpdatesEnabled(true);
}
@@ -71,7 +74,8 @@ void AOCaseAnnouncerDialog::ok_pressed()
ui_prosecutor_needed->isChecked(),
ui_judge_needed->isChecked(),
ui_juror_needed->isChecked(),
- ui_steno_needed->isChecked());
+ ui_steno_needed->isChecked(),
+ ui_witness_needed->isChecked());
done(0);
}
diff --git a/src/aocharmovie.cpp b/src/aocharmovie.cpp
index 5748723..e84c493 100644
--- a/src/aocharmovie.cpp
+++ b/src/aocharmovie.cpp
@@ -7,167 +7,187 @@
AOCharMovie::AOCharMovie(QWidget *p_parent, AOApplication *p_ao_app) : QLabel(p_parent)
{
ao_app = p_ao_app;
-
m_movie = new QMovie(this);
-
preanim_timer = new QTimer(this);
+ ticker = new QTimer(this);
preanim_timer->setSingleShot(true);
-
- connect(m_movie, SIGNAL(frameChanged(int)), this, SLOT(frame_change(int)));
- connect(preanim_timer, SIGNAL(timeout()), this, SLOT(timer_done()));
+ ticker->setSingleShot(true);
+ connect(ticker, SIGNAL(timeout()), this, SLOT(movie_ticker()));
+ this->setUpdatesEnabled(true);
}
void AOCharMovie::play(QString p_char, QString p_emote, QString emote_prefix)
{
+ apng = false;
QString original_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".gif");
- QString alt_path = ao_app->get_character_path(p_char, p_emote + ".png");
+ QString alt_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".png");
+ QString alt_path_still = ao_app->get_character_path(p_char, p_emote + ".png");
QString apng_path = ao_app->get_character_path(p_char, emote_prefix + p_emote + ".apng");
QString placeholder_path = ao_app->get_theme_path("placeholder.gif");
QString placeholder_default_path = ao_app->get_default_theme_path("placeholder.gif");
QString gif_path;
-
+ current_emote = emote_prefix + p_emote;
+ current_char = p_char;
if (file_exists(apng_path))
+ {
gif_path = apng_path;
+ apng = true;
+ }
else if (file_exists(original_path))
gif_path = original_path;
else if (file_exists(alt_path))
gif_path = alt_path;
+ else if (file_exists(alt_path_still))
+ gif_path = alt_path_still;
else if (file_exists(placeholder_path))
gif_path = placeholder_path;
else
gif_path = placeholder_default_path;
-
- m_movie->stop();
- m_movie->setFileName(gif_path);
-
- QImageReader *reader = new QImageReader(gif_path);
-
- movie_frames.clear();
- QImage f_image = reader->read();
- while (!f_image.isNull())
- {
- if (m_flipped)
- movie_frames.append(f_image.mirrored(true, false));
- else
- movie_frames.append(f_image);
- f_image = reader->read();
- }
-
- delete reader;
-
- this->show();
- m_movie->start();
-}
-
-void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
-{
- QString gif_path = ao_app->get_character_path(p_char, p_emote);
-
+ last_path = gif_path;
+ delete m_movie;
+ m_movie = new QMovie(this);
m_movie->stop();
this->clear();
m_movie->setFileName(gif_path);
m_movie->jumpToFrame(0);
+ this->LoadImageWithStupidMethodForFlipSupport(m_movie->currentImage());
+ this->show();
+ this->play_frame_sfx();
+ ticker->start(m_movie->nextFrameDelay());
+}
- int full_duration = duration * time_mod;
- int real_duration = 0;
-
- play_once = false;
-
- for (int n_frame = 0 ; n_frame < m_movie->frameCount() ; ++n_frame)
+void AOCharMovie::play_frame_sfx()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QString sfx_to_play = ao_app->get_frame_sfx_name(current_char, current_emote, current_frame);
+ QString screenshake_to_play = ao_app->get_screenshake_frame(current_char, current_emote, current_frame);
+ QString realization_to_play = ao_app->get_realization_frame(current_char, current_emote, current_frame);
+ if(sfx_to_play != "" && !use_networked_framehell)
{
- real_duration += m_movie->nextFrameDelay();
- m_movie->jumpToFrame(n_frame + 1);
+ frame_specific_sfx_player->play(ao_app->get_sfx_suffix(sfx_to_play));
}
-
-#ifdef DEBUG_GIF
- qDebug() << "full_duration: " << full_duration;
- qDebug() << "real_duration: " << real_duration;
-#endif
-
- double percentage_modifier = 100.0;
-
- if (real_duration != 0 && duration != 0)
+ else if(use_networked_framehell)
{
- double modifier = full_duration / static_cast(real_duration);
- percentage_modifier = 100 / modifier;
-
- if (percentage_modifier > 100.0)
- percentage_modifier = 100.0;
+ this->sfx_two_network_boogaloo();
}
-
-#ifdef DEBUG_GIF
- qDebug() << "% mod: " << percentage_modifier;
-#endif
-
- if (full_duration == 0 || full_duration >= real_duration)
+ if(screenshake_to_play != "" && !use_networked_framehell)
{
- play_once = true;
+ mycourtroom->doScreenShake();
+ }
+ else if(use_networked_framehell)
+ {
+ this->screenshake_two_network_boogaloo();
+ }
+ if(realization_to_play != "" && !use_networked_framehell)
+ {
+ mycourtroom->doRealization();
+ }
+ else if(use_networked_framehell)
+ {
+ this->realization_two_network_boogaloo();
+ }
+}
+
+void AOCharMovie::realization_two_network_boogaloo()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_realization_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ mycourtroom->doRealization();
+ }
+ }
+ }
+}
+
+void AOCharMovie::screenshake_two_network_boogaloo()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_screenshake_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ mycourtroom->doScreenShake();
+ }
+ }
+ }
+}
+
+void AOCharMovie::sfx_two_network_boogaloo()
+{
+ int current_frame = m_movie->currentFrameNumber();
+ QStringList realizationList = this->frame_sfx_hellstring.split("^");
+ for (int i = 0; i < realizationList.length(); i++) {
+ QString screenshakeList = realizationList.at(i);
+ QStringList extra_garbage = screenshakeList.split("|");
+ if(extra_garbage.at(0) != current_emote){
+ continue;
+ }
+ for (int ii = 1; ii < extra_garbage.length(); ii++) {
+ QString levels_of_garbage = extra_garbage.at(ii);
+ QStringList that_shouldnt_be_possible = levels_of_garbage.split("=");
+ if(that_shouldnt_be_possible.at(0).toInt() == current_frame && that_shouldnt_be_possible.at(1) != "") {
+ frame_specific_sfx_player->play(ao_app->get_sfx_suffix(that_shouldnt_be_possible.at(1)));
+ }
+ }
+ }
+}
+
+
+void AOCharMovie::movie_ticker()
+{
+ if(apng){
+ ticker->start(m_movie->nextFrameDelay());
+ }
+ if(m_movie->currentFrameNumber() == m_movie->frameCount() - 1)
+ {
+ delete m_movie;
+ m_movie = new QMovie(this);
+ m_movie->stop();
+ this->clear();
+ m_movie->setFileName(last_path);
+ m_movie->jumpToFrame(0);
+ if(play_once)
+ {
+ timer_done();
+ }
}
else
{
- play_once = false;
- preanim_timer->start(full_duration);
+ m_movie->jumpToNextFrame();
+ }
+ this->LoadImageWithStupidMethodForFlipSupport(m_movie->currentImage());
+ // imagine if QT had sane stuff like "mirror on QMovie" or "resize the image on QT" or "interface with the current QMovie image" or anything else
+
+ this->play_frame_sfx();
+ if(!apng){
+ ticker->start(m_movie->nextFrameDelay());
}
-
- m_movie->setSpeed(static_cast(percentage_modifier));
- play(p_char, p_emote, "");
}
-void AOCharMovie::play_talking(QString p_char, QString p_emote)
+void AOCharMovie::LoadImageWithStupidMethodForFlipSupport(QImage image)
{
- QString gif_path = ao_app->get_character_path(p_char, "(b)" + p_emote);
-
- m_movie->stop();
- this->clear();
- m_movie->setFileName(gif_path);
-
- play_once = false;
- m_movie->setSpeed(100);
- play(p_char, p_emote, "(b)");
-}
-
-void AOCharMovie::play_idle(QString p_char, QString p_emote)
-{
- QString gif_path = ao_app->get_character_path(p_char, "(a)" + p_emote);
-
- m_movie->stop();
- this->clear();
- m_movie->setFileName(gif_path);
-
- play_once = false;
- m_movie->setSpeed(100);
- play(p_char, p_emote, "(a)");
-}
-
-void AOCharMovie::stop()
-{
- //for all intents and purposes, stopping is the same as hiding. at no point do we want a frozen gif to display
- m_movie->stop();
- preanim_timer->stop();
- this->hide();
-}
-
-void AOCharMovie::combo_resize(int w, int h)
-{
- QSize f_size(w, h);
- this->resize(f_size);
- m_movie->setScaledSize(f_size);
-}
-
-void AOCharMovie::move(int ax, int ay)
-{
- x = ax;
- y = ay;
- QLabel::move(x, y);
-}
-
-void AOCharMovie::frame_change(int n_frame)
-{
-
- if (movie_frames.size() > n_frame)
- {
- QPixmap f_pixmap = QPixmap::fromImage(movie_frames.at(n_frame));
+ QPixmap f_pixmap;
+ if(m_flipped)
+ f_pixmap = QPixmap::fromImage(image.mirrored(true, false));
+ else
+ f_pixmap = QPixmap::fromImage(image);
auto aspect_ratio = Qt::KeepAspectRatio;
if (f_pixmap.size().width() > f_pixmap.size().height())
@@ -179,17 +199,54 @@ void AOCharMovie::frame_change(int n_frame)
this->setPixmap(f_pixmap.scaled(this->width(), this->height(), aspect_ratio, Qt::FastTransformation));
QLabel::move(x + (this->width() - this->pixmap()->width())/2, y);
- }
+}
- if (m_movie->frameCount() - 1 == n_frame && play_once)
- {
- preanim_timer->start(m_movie->nextFrameDelay());
- m_movie->stop();
- }
+void AOCharMovie::play_pre(QString p_char, QString p_emote, int duration)
+{
+ QString gif_path = ao_app->get_character_path(p_char, p_emote);
+
+ m_movie->stop();
+ m_movie->setFileName(gif_path);
+ m_movie->jumpToFrame(0);
+ int real_duration = 0;
+ play_once = true;
+ play(p_char, p_emote, "");
+}
+
+void AOCharMovie::play_talking(QString p_char, QString p_emote)
+{
+ play_once = false;
+ play(p_char, p_emote, "(b)");
+}
+
+void AOCharMovie::play_idle(QString p_char, QString p_emote)
+{
+ play_once = false;
+ play(p_char, p_emote, "(a)");
+}
+
+void AOCharMovie::stop()
+{
+ //for all intents and purposes, stopping is the same as hiding. at no point do we want a frozen gif to display
+ m_movie->stop();
+ frame_specific_sfx_player->stop();
+ this->hide();
+}
+
+void AOCharMovie::combo_resize(int w, int h)
+{
+ QSize f_size(w, h);
+ this->resize(f_size);
+ m_movie->setScaledSize(this->size());
+}
+void AOCharMovie::move(int ax, int ay)
+{
+ x = ax;
+ y = ay;
+ QLabel::move(x, y);
}
void AOCharMovie::timer_done()
{
-
done();
}
diff --git a/src/aoevidencebutton.cpp b/src/aoevidencebutton.cpp
index 15b598f..4dc0395 100644
--- a/src/aoevidencebutton.cpp
+++ b/src/aoevidencebutton.cpp
@@ -90,15 +90,11 @@ void AOEvidenceButton::mouseDoubleClickEvent(QMouseEvent *e)
void AOEvidenceButton::dragLeaveEvent(QMouseEvent *e)
{
//QWidget::dragLeaveEvent(e);
-
- qDebug() << "drag leave event";
}
void AOEvidenceButton::dragEnterEvent(QMouseEvent *e)
{
//QWidget::dragEnterEvent(e);
-
- qDebug() << "drag enter event";
}
*/
diff --git a/src/aomusicplayer.cpp b/src/aomusicplayer.cpp
index 2791809..74dcc63 100644
--- a/src/aomusicplayer.cpp
+++ b/src/aomusicplayer.cpp
@@ -1,7 +1,7 @@
#include "aomusicplayer.h"
#if defined(BASSAUDIO)
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -9,14 +9,14 @@ AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
AOMusicPlayer::~AOMusicPlayer()
{
- BASS_ChannelStop(m_stream);
+ kill_loop();
}
void AOMusicPlayer::play(QString p_song)
{
BASS_ChannelStop(m_stream);
- QString f_path = ao_app->get_music_path(p_song);
+ f_path = ao_app->get_music_path(p_song);
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
@@ -24,7 +24,18 @@ void AOMusicPlayer::play(QString p_song)
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
+ if(enable_looping)
+ {
+ BASS_ChannelFlags(m_stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);
+ }
+ else
+ {
+ BASS_ChannelFlags(m_stream, 0, BASS_SAMPLE_LOOP);
+ }
BASS_ChannelPlay(m_stream, false);
+
+
+
}
void AOMusicPlayer::set_volume(int p_value)
@@ -33,8 +44,19 @@ void AOMusicPlayer::set_volume(int p_value)
float volume = m_volume / 100.0f;
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+ BASS_ChannelStop(m_stream);
+}
+
#elif defined(QTAUDIO)
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -53,7 +75,7 @@ void AOMusicPlayer::play(QString p_song)
m_player.setMedia(QUrl::fromLocalFile(f_path));
- this->set_volume(m_volume);
+ this->set_volume(100);
m_player.play();
}
@@ -61,10 +83,25 @@ void AOMusicPlayer::play(QString p_song)
void AOMusicPlayer::set_volume(int p_value)
{
m_volume = p_value;
- m_player.setVolume(m_volume);
+
+ qreal linearVolume = QAudio::convertVolume(m_volume / qreal(100),
+ QAudio::LogarithmicVolumeScale,
+ QAudio::LinearVolumeScale);
+
+ m_player.setVolume(linearVolume*100);
+}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+ m_player.stop();
}
#else
-AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -83,5 +120,15 @@ void AOMusicPlayer::play(QString p_song)
void AOMusicPlayer::set_volume(int p_value)
{
+}
+
+QString AOMusicPlayer::get_path()
+{
+ return f_path;
+}
+
+void AOMusicPlayer::kill_loop()
+{
+
}
#endif
diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp
index 82507a1..37d4957 100644
--- a/src/aooptionsdialog.cpp
+++ b/src/aooptionsdialog.cpp
@@ -166,10 +166,21 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_gameplay_form->setWidget(9, QFormLayout::FieldRole, ui_discord_cb);
+ ui_epilepsy_lbl = new QLabel(ui_form_layout_widget);
+ ui_epilepsy_lbl->setText(tr("Allow Shake/Flash:"));
+ ui_epilepsy_lbl->setToolTip(tr("Allows screenshaking and flashing. Disable this if you have concerns or issues with photosensitivity and/or seizures."));
+
+ ui_gameplay_form->setWidget(10, QFormLayout::LabelRole, ui_epilepsy_lbl);
+
+ ui_epilepsy_cb = new QCheckBox(ui_form_layout_widget);
+ ui_epilepsy_cb->setChecked(ao_app->is_shakeandflash_enabled());
+
+ ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_epilepsy_cb);
+
ui_language_label = new QLabel(ui_form_layout_widget);
ui_language_label->setText(tr("Language:"));
ui_language_label->setToolTip(tr("Sets the language if you don't want to use your system language."));
- ui_gameplay_form->setWidget(10, QFormLayout::LabelRole, ui_language_label);
+ ui_gameplay_form->setWidget(11, QFormLayout::LabelRole, ui_language_label);
ui_language_combobox = new QComboBox(ui_form_layout_widget);
ui_language_combobox->addItem(configini->value("language", " ").value() + " - Keep current setting");
@@ -179,7 +190,7 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_language_combobox->addItem("es - Español");
ui_language_combobox->addItem("jp - 日本語");
ui_language_combobox->addItem("ru - Русский");
- ui_gameplay_form->setWidget(10, QFormLayout::FieldRole, ui_language_combobox);
+ ui_gameplay_form->setWidget(11, QFormLayout::FieldRole, ui_language_combobox);
// Here we start the callwords tab.
ui_callwords_tab = new QWidget();
@@ -334,6 +345,29 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_audio_layout->setWidget(7, QFormLayout::FieldRole, ui_blank_blips_cb);
+ ui_loopsfx_lbl = new QLabel(ui_audio_widget);
+ ui_loopsfx_lbl->setText(tr("Enable Looping SFX:"));
+ ui_loopsfx_lbl->setToolTip(tr("If true, the game will allow looping sound effects to play on preanimations."));
+
+ ui_audio_layout->setWidget(8, QFormLayout::LabelRole, ui_loopsfx_lbl);
+
+ ui_loopsfx_cb = new QCheckBox(ui_audio_widget);
+ ui_loopsfx_cb->setChecked(p_ao_app->get_looping_sfx());
+
+ ui_audio_layout->setWidget(8, QFormLayout::FieldRole, ui_loopsfx_cb);
+
+
+ ui_objectmusic_lbl = new QLabel(ui_audio_widget);
+ ui_objectmusic_lbl->setText(tr("Kill Music On Objection:"));
+ ui_objectmusic_lbl->setToolTip(tr("If true, the game will stop music when someone objects, like in the actual games."));
+
+ ui_audio_layout->setWidget(9, QFormLayout::LabelRole, ui_objectmusic_lbl);
+
+ ui_objectmusic_cb = new QCheckBox(ui_audio_widget);
+ ui_objectmusic_cb->setChecked(p_ao_app->get_objectmusic());
+
+ ui_audio_layout->setWidget(9, QFormLayout::FieldRole, ui_objectmusic_cb);
+
// The casing tab!
ui_casing_tab = new QWidget();
ui_settings_tabs->addTab(ui_casing_tab, tr("Casing"));
@@ -455,6 +489,18 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_casing_layout->setWidget(7, QFormLayout::FieldRole, ui_casing_cm_cb);
+ ui_casing_wit_lbl = new QLabel(ui_casing_widget);
+ ui_casing_wit_lbl->setText(tr("Witness:"));
+ ui_casing_wit_lbl->setToolTip(tr("If checked, you will appear amongst the potential "
+ "witnesses on the server."));
+
+ ui_casing_layout->setWidget(8, QFormLayout::LabelRole, ui_casing_wit_lbl);
+
+ ui_casing_wit_cb = new QCheckBox(ui_casing_widget);
+ ui_casing_wit_cb->setChecked(ao_app->get_casing_wit_enabled());
+
+ ui_casing_layout->setWidget(8, QFormLayout::FieldRole, ui_casing_wit_cb);
+
// -- CM CASES ANNOUNCEMENTS
ui_casing_cm_cases_lbl = new QLabel(ui_casing_widget);
@@ -462,12 +508,12 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDi
ui_casing_cm_cases_lbl->setToolTip(tr("If you're a CM, enter what cases you are "
"willing to host."));
- ui_casing_layout->setWidget(8, QFormLayout::LabelRole, ui_casing_cm_cases_lbl);
+ ui_casing_layout->setWidget(9, QFormLayout::LabelRole, ui_casing_cm_cases_lbl);
ui_casing_cm_cases_textbox = new QLineEdit(ui_casing_widget);
ui_casing_cm_cases_textbox->setText(ao_app->get_casing_can_host_cases());
- ui_casing_layout->setWidget(8, QFormLayout::FieldRole, ui_casing_cm_cases_textbox);
+ ui_casing_layout->setWidget(9, QFormLayout::FieldRole, ui_casing_cm_cases_textbox);
// When we're done, we should continue the updates!
setUpdatesEnabled(true);
@@ -485,6 +531,7 @@ void AOOptionsDialog::save_pressed()
configini->setValue("show_custom_shownames", ui_showname_cb->isChecked());
configini->setValue("master", ui_ms_textbox->text());
configini->setValue("discord", ui_discord_cb->isChecked());
+ configini->setValue("shakeandflash", ui_epilepsy_cb->isChecked());
configini->setValue("language", ui_language_combobox->currentText().left(2));
QFile* callwordsini = new QFile(ao_app->get_base_path() + "callwords.ini");
@@ -506,6 +553,8 @@ void AOOptionsDialog::save_pressed()
configini->setValue("default_blip", ui_blips_volume_spinbox->value());
configini->setValue("blip_rate", ui_bliprate_spinbox->value());
configini->setValue("blank_blip", ui_blank_blips_cb->isChecked());
+ configini->setValue("looping_sfx", ui_loopsfx_cb->isChecked());
+ configini->setValue("kill_music_on_object", ui_objectmusic_cb->isChecked());
configini->setValue("casing_enabled", ui_casing_enabled_cb->isChecked());
configini->setValue("casing_defence_enabled", ui_casing_def_cb->isChecked());
@@ -514,6 +563,7 @@ void AOOptionsDialog::save_pressed()
configini->setValue("casing_juror_enabled", ui_casing_jur_cb->isChecked());
configini->setValue("casing_steno_enabled", ui_casing_steno_cb->isChecked());
configini->setValue("casing_cm_enabled", ui_casing_cm_cb->isChecked());
+ configini->setValue("casing_wit_enabled", ui_casing_wit_cb->isChecked());
configini->setValue("casing_can_host_cases", ui_casing_cm_cases_textbox->text());
callwordsini->close();
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index ad8ced6..d2140e3 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -2,7 +2,7 @@
#include "file_functions.h"
#if defined(BASSAUDIO) //Using bass.dll for sfx
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -29,7 +29,7 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
f_path = misc_path;
else
f_path = sound_path;
-
+ BASS_ChannelStop(m_stream);
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
set_volume_internal(m_volume);
@@ -37,6 +37,19 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
if (ao_app->get_audio_output_device() != "default")
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
BASS_ChannelPlay(m_stream, false);
+ if(looping_sfx && ao_app->get_looping_sfx())
+ {
+ BASS_ChannelFlags(m_stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP);
+ }
+ else
+ {
+ BASS_ChannelFlags(m_stream, 0, BASS_SAMPLE_LOOP);
+ }
+}
+
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
}
void AOSfxPlayer::stop()
@@ -56,7 +69,7 @@ void AOSfxPlayer::set_volume_internal(qreal p_value)
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
}
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -94,6 +107,11 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
}
}
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
+}
+
void AOSfxPlayer::stop()
{
m_sfx.stop();
@@ -110,7 +128,7 @@ void AOSfxPlayer::set_volume_internal(qreal p_value)
m_sfx.setVolume(m_volume);
}
#else
-AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
+AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app): QObject()
{
m_parent = parent;
ao_app = p_ao_app;
@@ -121,6 +139,11 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
}
+void AOSfxPlayer::setLooping(bool is_looping)
+{
+ this->looping_sfx = is_looping;
+}
+
void AOSfxPlayer::stop()
{
diff --git a/src/charselect.cpp b/src/charselect.cpp
index 0cfb775..d6ee044 100644
--- a/src/charselect.cpp
+++ b/src/charselect.cpp
@@ -5,6 +5,59 @@
#include "debug_functions.h"
#include "hardware_functions.h"
+class AOCharSelectGenerationThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharButton *char_button;
+ AOCharSelectGenerationThreading(Courtroom *my_courtroom, int character_number, AOCharButton *charbut){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ char_button = charbut;
+ }
+ void run()
+ {
+ AOCharButton* thisCharacterButton = char_button;
+ thisCharacterButton->reset();
+ thisCharacterButton->hide();
+ thisCharacterButton->set_image(thisCourtroom->char_list.at(char_num).name);
+ thisCourtroom->ui_char_button_list.append(thisCharacterButton);
+
+ thisCourtroom->connect(thisCharacterButton, SIGNAL(clicked()), thisCourtroom->char_button_mapper, SLOT(map()));
+ thisCourtroom->char_button_mapper->setMapping(thisCharacterButton, thisCourtroom->ui_char_button_list.size() - 1);
+ }
+};
+
+class AOCharSelectFilterThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int char_num;
+ AOCharSelectFilterThreading(Courtroom *my_courtroom, int character_number){
+ thisCourtroom = my_courtroom;
+ char_num = character_number;
+ }
+ void run()
+ {
+ AOCharButton* current_char = thisCourtroom->ui_char_button_list.at(char_num);
+
+ if (!thisCourtroom->ui_char_taken->isChecked() && thisCourtroom->char_list.at(char_num).taken)
+ return;
+
+ if (!thisCourtroom->char_list.at(char_num).name.contains(thisCourtroom->ui_char_search->text(), Qt::CaseInsensitive))
+ return;
+
+ // We only really need to update the fact that a character is taken
+ // for the buttons that actually appear.
+ // You'd also update the passwordedness and etc. here later.
+ current_char->reset();
+ current_char->set_taken(thisCourtroom->char_list.at(char_num).taken);
+
+ thisCourtroom->ui_char_button_list_filtered.append(current_char);
+ }
+};
+
void Courtroom::construct_char_select()
{
ui_char_select_background = new AOImage(this, ao_app);
@@ -44,6 +97,7 @@ void Courtroom::construct_char_select()
set_size_and_pos(ui_char_buttons, "char_buttons");
+ connect(char_button_mapper, SIGNAL(mapped(int)), this, SLOT(char_clicked(int)));
connect(ui_back_to_lobby, SIGNAL(clicked()), this, SLOT(on_back_to_lobby_clicked()));
connect(ui_char_select_left, SIGNAL(clicked()), this, SLOT(on_char_select_left_clicked()));
@@ -125,7 +179,7 @@ void Courtroom::char_clicked(int n_char)
if (!file_exists(char_ini_path))
{
- call_notice("Could not find " + char_ini_path);
+ call_notice(tr("Could not find %1").arg(char_ini_path, 1));
return;
}
@@ -197,28 +251,15 @@ void Courtroom::character_loading_finished()
// Later on, we'll be revealing buttons as we need them.
for (int n = 0; n < char_list.size(); n++)
{
- AOCharButton* char_button = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
- char_button->reset();
- char_button->hide();
- char_button->set_image(char_list.at(n).name);
- ui_char_button_list.append(char_button);
-
- connect(char_button, &AOCharButton::clicked, [this, n](){
- this->char_clicked(n);
- });
-
- // This part here serves as a way of showing to the player that the game is still running, it is
- // just loading the pictures of the characters.
- if (ao_app->lobby_constructed)
- {
- ao_app->generated_chars++;
- int total_loading_size = ao_app->char_list_size * 2 + ao_app->evidence_list_size + ao_app->music_list_size;
- int loading_value = int(((ao_app->loaded_chars + ao_app->generated_chars + ao_app->loaded_music + ao_app->loaded_evidence) / static_cast(total_loading_size)) * 100);
- ao_app->w_lobby->set_loading_value(loading_value);
- ao_app->w_lobby->set_loading_text(tr("Generating chars:\n%1/%2").arg(QString::number(ao_app->generated_chars)).arg(QString::number(ao_app->char_list_size)));
- }
+ AOCharButton* characterButton = new AOCharButton(ui_char_buttons, ao_app, 0, 0, char_list.at(n).taken);
+ AOCharSelectGenerationThreading *char_generate = new AOCharSelectGenerationThreading(this, n, characterButton);
+ QThreadPool::globalInstance()->start(char_generate);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
-
+ QThreadPool::globalInstance()->waitForDone();
filter_character_list();
}
@@ -227,27 +268,14 @@ void Courtroom::filter_character_list()
ui_char_button_list_filtered.clear();
for (int i = 0; i < char_list.size(); i++)
{
- AOCharButton* current_char = ui_char_button_list.at(i);
-
- // It seems passwording characters is unimplemented yet?
- // Until then, this will stay here, I suppose.
- //if (ui_char_passworded->isChecked() && character_is_passworded??)
- // continue;
-
- if (!ui_char_taken->isChecked() && char_list.at(i).taken)
- continue;
-
- if (!char_list.at(i).name.contains(ui_char_search->text(), Qt::CaseInsensitive))
- continue;
-
- // We only really need to update the fact that a character is taken
- // for the buttons that actually appear.
- // You'd also update the passwordedness and etc. here later.
- current_char->reset();
- current_char->set_taken(char_list.at(i).taken);
-
- ui_char_button_list_filtered.append(current_char);
+ AOCharSelectFilterThreading *char_filter = new AOCharSelectFilterThreading(this, i);
+ QThreadPool::globalInstance()->start(char_filter);
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone();
+ }
}
+ QThreadPool::globalInstance()->waitForDone();
current_char_page = 0;
set_char_select_page();
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index c6a8749..718470f 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -1,5 +1,4 @@
#include "courtroom.h"
-
Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
{
ao_app = p_ao_app;
@@ -64,6 +63,8 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
testimony_hide_timer = new QTimer(this);
testimony_hide_timer->setSingleShot(true);
+ char_button_mapper = new QSignalMapper(this);
+
music_player = new AOMusicPlayer(this, ao_app);
music_player->set_volume(0);
@@ -73,6 +74,13 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
objection_player = new AOSfxPlayer(this, ao_app);
objection_player->set_volume(0);
+ misc_sfx_player = new AOSfxPlayer(this, ao_app);
+ misc_sfx_player->set_volume(0);
+ frame_emote_sfx_player = new AOSfxPlayer(this, ao_app);
+ frame_emote_sfx_player->set_volume(0);
+ pair_frame_emote_sfx_player = new AOSfxPlayer(this, ao_app); // todo: recode pair
+ pair_frame_emote_sfx_player->set_volume(0);
+
blip_player = new AOBlipPlayer(this, ao_app);
blip_player->set_volume(0);
@@ -86,7 +94,11 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_vp_speedlines = new AOMovie(ui_viewport, ao_app);
ui_vp_speedlines->set_play_once(false);
ui_vp_player_char = new AOCharMovie(ui_viewport, ao_app);
+ ui_vp_player_char->frame_specific_sfx_player = frame_emote_sfx_player;
+ ui_vp_player_char->mycourtroom = this;
ui_vp_sideplayer_char = new AOCharMovie(ui_viewport, ao_app);
+ ui_vp_sideplayer_char->frame_specific_sfx_player = pair_frame_emote_sfx_player;
+ ui_vp_sideplayer_char->mycourtroom = this;
ui_vp_sideplayer_char->hide();
ui_vp_desk = new AOScene(ui_viewport, ao_app);
ui_vp_legacy_desk = new AOScene(ui_viewport, ao_app);
@@ -201,7 +213,9 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_flip->hide();
ui_guard = new QCheckBox(this);
- ui_guard->setText(tr("Guard"));
+
+ ui_guard->setText(tr("Disable Modcalls"));
+
ui_guard->hide();
ui_casing = new QCheckBox(this);
@@ -219,6 +233,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
ui_custom_objection = new AOButton(this, ao_app);
ui_realization = new AOButton(this, ao_app);
+ ui_screenshake = new AOButton(this, ao_app);
ui_mute = new AOButton(this, ao_app);
ui_defense_plus = new AOButton(this, ao_app);
@@ -304,7 +319,7 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
connect(ui_custom_objection, SIGNAL(clicked()), this, SLOT(on_custom_objection_clicked()));
connect(ui_realization, SIGNAL(clicked()), this, SLOT(on_realization_clicked()));
-
+ connect(ui_screenshake, SIGNAL(clicked()), this, SLOT(on_screenshake_clicked()));
connect(ui_mute, SIGNAL(clicked()), this, SLOT(on_mute_clicked()));
connect(ui_defense_minus, SIGNAL(clicked()), this, SLOT(on_defense_minus_clicked()));
@@ -642,6 +657,9 @@ void Courtroom::set_widgets()
set_size_and_pos(ui_realization, "realization");
ui_realization->set_image("realization.png");
+ set_size_and_pos(ui_screenshake, "screenshake");
+ ui_screenshake->set_image("screenshake.png");
+
set_size_and_pos(ui_mute, "mute_button");
ui_mute->set_image("mute.png");
@@ -784,6 +802,24 @@ void Courtroom::set_size_and_pos(QWidget *p_widget, QString p_identifier)
}
}
+QPoint Courtroom::get_theme_pos(QString p_identifier)
+{
+ QString filename = "courtroom_design.ini";
+
+ pos_size_type design_ini_result = ao_app->get_element_dimensions(p_identifier, filename);
+
+ if (design_ini_result.width < 0 || design_ini_result.height < 0)
+ {
+ qDebug() << "W: could not find \"" << p_identifier << "\" in " << filename;
+ return QPoint(0,0);
+ }
+ else
+ {
+ return QPoint(design_ini_result.x, design_ini_result.y);
+ }
+}
+
+
void Courtroom::set_taken(int n_char, bool p_taken)
{
if (n_char >= char_list.size())
@@ -844,45 +880,58 @@ void Courtroom::set_background(QString p_background)
}
}
+void Courtroom::set_character(int char_id)
+{
+ m_cid = char_id;
+
+ QString f_char;
+
+ if (m_cid == -1)
+ {
+ if (ao_app->is_discord_enabled())
+ ao_app->discord->state_spectate();
+ f_char = "";
+ }
+ else
+ {
+ f_char = ao_app->get_char_name(char_list.at(m_cid).name);
+
+ if (ao_app->is_discord_enabled())
+ ao_app->discord->state_character(f_char.toStdString());
+ }
+
+ current_char = f_char;
+
+ current_emote_page = 0;
+ current_emote = 0;
+
+ if (m_cid == -1)
+ ui_emotes->hide();
+ else
+ ui_emotes->show();
+
+ set_emote_page();
+ set_emote_dropdown();
+
+ if (ao_app->custom_objection_enabled &&
+ (file_exists(ao_app->get_character_path(current_char, "custom.gif")) ||
+ file_exists(ao_app->get_character_path(current_char, "custom.apng"))) &&
+ file_exists(ao_app->get_character_path(current_char, "custom.wav")))
+ ui_custom_objection->show();
+ else
+ ui_custom_objection->hide();
+}
+
void Courtroom::enter_courtroom(int p_cid)
{
- m_cid = p_cid;
-
- QString f_char;
-
- if (m_cid == -1)
- {
- if (ao_app->is_discord_enabled())
- ao_app->discord->state_spectate();
- f_char = "";
- }
- else
- {
- f_char = ao_app->get_char_name(char_list.at(m_cid).name);
-
- if (ao_app->is_discord_enabled())
- ao_app->discord->state_character(f_char.toStdString());
- }
-
- current_char = f_char;
-
- current_emote_page = 0;
- current_emote = 0;
-
- if (m_cid == -1)
- ui_emotes->hide();
- else
- ui_emotes->show();
-
- set_emote_page();
- set_emote_dropdown();
+ this->set_character(p_cid);
current_evidence_page = 0;
current_evidence = 0;
set_evidence_page();
- QString side = ao_app->get_char_side(f_char);
+ QString side = ao_app->get_char_side(current_char);
if (side == "jud")
{
@@ -931,6 +980,9 @@ void Courtroom::enter_courtroom(int p_cid)
music_player->set_volume(ui_music_slider->value());
sfx_player->set_volume(ui_sfx_slider->value());
objection_player->set_volume(ui_sfx_slider->value());
+ misc_sfx_player->set_volume(ui_sfx_slider->value());
+ frame_emote_sfx_player->set_volume(ui_sfx_slider->value());
+ pair_frame_emote_sfx_player->set_volume(ui_sfx_slider->value());
blip_player->set_volume(ui_blip_slider->value());
testimony_in_progress = false;
@@ -960,12 +1012,10 @@ void Courtroom::list_music()
for (int n_song = 0 ; n_song < music_list.size() ; ++n_song)
{
QString i_song = music_list.at(n_song);
- QString i_song_listname = i_song;
- i_song_listname = i_song_listname.left(i_song_listname.lastIndexOf("."));
if (i_song.toLower().contains(ui_music_search->text().toLower()))
{
- ui_music_list->addItem(i_song_listname);
+ ui_music_list->addItem(i_song);
music_row_to_number.append(n_song);
QString song_path = ao_app->get_music_path(i_song);
@@ -1072,10 +1122,75 @@ void Courtroom::append_server_chatmessage(QString p_name, QString p_message, QSt
colour = ao_app->get_color("ooc_default_color", "courtroom_design.ini").name();
if (p_colour == "1")
colour = ao_app->get_color("ooc_server_color", "courtroom_design.ini").name();
+ if(p_message == "Logged in as a moderator.")
+ {
+ ui_guard->show();
+ append_server_chatmessage("CLIENT", tr("You were granted the Disable Modcalls button."), "1");
+ }
ui_server_chatlog->append_chatmessage(p_name, p_message, colour);
}
+class AOFrameThreadingPre : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int my_frameNumber;
+ AOFrameThreadingPre(Courtroom *my_courtroom, int frameNumber){
+ thisCourtroom = my_courtroom;
+ my_frameNumber = frameNumber;
+ }
+ void run()
+ {
+ qDebug() << my_frameNumber << " FRAME NUMBER" << " from" << QThread::currentThread();
+ QString sfx_to_play = thisCourtroom->ao_app->get_frame_sfx_name(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString screenshake_to_play = thisCourtroom->ao_app->get_screenshake_frame(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString realization_to_play = thisCourtroom->ao_app->get_realization_frame(thisCourtroom->current_char, thisCourtroom->ao_app->get_pre_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ if(sfx_to_play != "")
+ {
+ thisCourtroom->threading_sfx += "|" + QString::number(my_frameNumber) + "=" + sfx_to_play;
+ }
+ if(screenshake_to_play != "")
+ {
+ thisCourtroom->threading_shake += "|" + QString::number(my_frameNumber) + "=" + screenshake_to_play;
+ }
+ if(realization_to_play != "")
+ {
+ thisCourtroom->threading_flash += "|" + QString::number(my_frameNumber) + "=" + realization_to_play;
+ }
+ }
+};
+
+
+class AOFrameThreading : public QRunnable
+{
+public:
+ Courtroom *thisCourtroom;
+ int my_frameNumber;
+ AOFrameThreading(Courtroom *my_courtroom, int frameNumber){
+ thisCourtroom = my_courtroom;
+ my_frameNumber = frameNumber;
+ }
+ void run()
+ {
+ QString sfx_to_play = thisCourtroom->ao_app->get_frame_sfx_name(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString screenshake_to_play = thisCourtroom->ao_app->get_screenshake_frame(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ QString realization_to_play = thisCourtroom->ao_app->get_realization_frame(thisCourtroom->current_char, thisCourtroom->threading_prefix + thisCourtroom->ao_app->get_emote(thisCourtroom->current_char, thisCourtroom->current_emote), my_frameNumber);
+ if(sfx_to_play != "")
+ {
+ thisCourtroom->threading_sfx += "|" + QString::number(my_frameNumber) + "=" + sfx_to_play;
+ }
+ if(screenshake_to_play != "")
+ {
+ thisCourtroom->threading_shake += "|" + QString::number(my_frameNumber) + "=" + screenshake_to_play;
+ }
+ if(realization_to_play != "")
+ {
+ thisCourtroom->threading_flash += "|" + QString::number(my_frameNumber) + "=" + realization_to_play;
+ }
+ }
+};
+
void Courtroom::on_chat_return_pressed()
{
if (ui_ic_chat_message->text() == "" || is_muted)
@@ -1249,10 +1364,133 @@ void Courtroom::on_chat_return_pressed()
packet_contents.append("0");
}
}
+ // If the server we're on supports Looping SFX and Screenshake, use it if the emote uses it.
+ if (ao_app->looping_sfx_support_enabled)
+ {
+ packet_contents.append(ao_app->get_sfx_looping(current_char, current_emote));
+ qDebug() << "Are we looping this? " << ao_app->get_sfx_looping(current_char, current_emote);
+ packet_contents.append(QString::number(screenshake_state));
+ qDebug() << "Are we screen shaking this one? " << screenshake_state;
+ qDebug() << "MAX THREAD COUNT " << QThreadPool::globalInstance()->maxThreadCount();
+ QString frame_screenshake = "";
+ QString frame_realization = "";
+ QString frame_sfx = "";
+ QString preemote_sfx = "";
+ QString preemote_shake = "";
+ QString preemote_flash = "";
+
+ QString talkemote_sfx = "";
+ QString talkemote_shake = "";
+ QString talkemote_flash = "";
+
+ QString idleemote_sfx = "";
+ QString idleemote_shake = "";
+ QString idleemote_flash = "";
+
+ QString preemote = ao_app->get_image_suffix(ao_app->get_character_path(current_char, ao_app->get_pre_emote(current_char, current_emote)));
+ QString talkemote_to_check = ao_app->get_image_suffix(ao_app->get_character_path(current_char, "(b)" + ao_app->get_emote(current_char, current_emote)));
+ QString idleemote_to_check = ao_app->get_image_suffix(ao_app->get_character_path(current_char, "(a)" + ao_app->get_emote(current_char, current_emote)));
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(preemote);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "Premote: " << frame_emote_checker->frameCount();
+
+ preemote_sfx += ao_app->get_pre_emote(current_char, current_emote);
+ preemote_shake += ao_app->get_pre_emote(current_char, current_emote);
+ preemote_flash += ao_app->get_pre_emote(current_char, current_emote);
+
+ threading_sfx = preemote_sfx;
+ threading_shake = preemote_shake;
+ threading_flash = preemote_flash;
+
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreadingPre *testfuck = new AOFrameThreadingPre(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+ preemote_sfx = threading_sfx;
+ preemote_shake = threading_shake;
+ preemote_flash = threading_flash;
+ preemote_sfx += "^";
+ preemote_shake += "^";
+ preemote_flash += "^";
+ delete frame_emote_checker;
+
+
+
+ talkemote_sfx += "(b)" + ao_app->get_emote(current_char, current_emote);
+ talkemote_shake += "(b)" + ao_app->get_emote(current_char, current_emote);
+ talkemote_flash += "(b)" + ao_app->get_emote(current_char, current_emote);
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(talkemote_to_check);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "Talk: " << frame_emote_checker->frameCount();
+
+ threading_sfx = talkemote_sfx;
+ threading_shake = talkemote_shake;
+ threading_flash = talkemote_flash;
+ threading_prefix = QString("(b)");
+
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreading *testfuck = new AOFrameThreading(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+
+ talkemote_sfx = threading_sfx;
+ talkemote_shake = threading_shake;
+ talkemote_flash = threading_flash;
+ talkemote_sfx += "^";
+ talkemote_shake += "^";
+ talkemote_flash += "^";
+ delete frame_emote_checker;
+
+
+
+ idleemote_sfx += "(a)" + ao_app->get_emote(current_char, current_emote);
+ idleemote_shake += "(a)" + ao_app->get_emote(current_char, current_emote);
+ idleemote_flash += "(a)" + ao_app->get_emote(current_char, current_emote);
+
+ frame_emote_checker = new QMovie(this);
+ frame_emote_checker->setFileName(idleemote_to_check);
+ frame_emote_checker->jumpToFrame(0);
+ qDebug() << "idle: " << frame_emote_checker->frameCount();
+
+ threading_sfx = idleemote_sfx;
+ threading_shake = idleemote_shake;
+ threading_flash = idleemote_flash;
+ threading_prefix = QString("(a)");
+ for(int i=0; i < frame_emote_checker->frameCount(); i++){
+ AOFrameThreading *testfuck = new AOFrameThreading(this, i);
+ QThreadPool::globalInstance()->start(testfuck);
+ }
+ QThreadPool::globalInstance()->waitForDone();
+ idleemote_sfx = threading_sfx;
+ idleemote_shake = threading_shake;
+ idleemote_flash = threading_flash;
+ delete frame_emote_checker;
+
+ frame_screenshake += preemote_shake;
+ frame_screenshake += talkemote_shake;
+ frame_screenshake += idleemote_shake;
+
+ frame_realization += preemote_flash;
+ frame_realization += talkemote_flash;
+ frame_realization += idleemote_flash;
+
+ frame_sfx += preemote_sfx;
+ frame_sfx += talkemote_sfx;
+ frame_sfx += idleemote_sfx;
+
+ packet_contents.append(frame_screenshake);
+ packet_contents.append(frame_realization);
+ packet_contents.append(frame_sfx);
+ }
ao_app->send_server_packet(new AOPacket("MS", packet_contents));
}
-
void Courtroom::handle_chatmessage(QStringList *p_contents)
{
// Instead of checking for whether a message has at least chatmessage_size
@@ -1307,7 +1545,6 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
text_state = 0;
anim_state = 0;
ui_vp_objection->stop();
- ui_vp_player_char->stop();
chat_tick_timer->stop();
ui_vp_evidence_display->reset();
@@ -1318,6 +1555,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
ui_ic_chat_message->clear();
objection_state = 0;
realization_state = 0;
+ screenshake_state = 0;
is_presenting_evidence = false;
ui_pre->setChecked(false);
ui_hold_it->set_image("holdit.png");
@@ -1325,6 +1563,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
ui_take_that->set_image("takethat.png");
ui_custom_objection->set_image("custom.png");
ui_realization->set_image("realization.png");
+ ui_screenshake->set_image("screenshake.png");
ui_evidence_present->set_image("present_disabled.png");
}
@@ -1356,6 +1595,8 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
case 2:
ui_vp_objection->play("objection", f_char, f_custom_theme);
objection_player->play("objection.wav", f_char, f_custom_theme);
+ if(ao_app->get_objectmusic())
+ music_player->kill_loop();
break;
case 3:
ui_vp_objection->play("takethat", f_char, f_custom_theme);
@@ -1388,7 +1629,10 @@ void Courtroom::handle_chatmessage_2()
{
ui_vp_speedlines->stop();
ui_vp_player_char->stop();
-
+ ui_vp_player_char->frame_sfx_hellstring = m_chatmessage[FRAME_SFX];
+ ui_vp_player_char->frame_realization_hellstring = m_chatmessage[FRAME_REALIZATION];
+ ui_vp_player_char->frame_screenshake_hellstring = m_chatmessage[FRAME_SCREENSHAKE];
+ ui_vp_player_char->use_networked_framehell = true;
if (m_chatmessage[SHOWNAME].isEmpty() || !ui_showname_enable->isChecked())
{
QString real_name = char_list.at(m_chatmessage[CHAR_ID].toInt()).name;
@@ -1570,6 +1814,7 @@ void Courtroom::handle_chatmessage_2()
ui_vp_sideplayer_char->set_flipped(true);
else
ui_vp_sideplayer_char->set_flipped(false);
+ ui_vp_sideplayer_char->use_networked_framehell = false;
ui_vp_sideplayer_char->play_idle(m_chatmessage[OTHER_NAME], m_chatmessage[OTHER_EMOTE]);
}
else
@@ -1577,13 +1822,17 @@ void Courtroom::handle_chatmessage_2()
// If the server understands other characters, but there
// really is no second character, hide 'em, and center the first.
ui_vp_sideplayer_char->hide();
+ ui_vp_sideplayer_char->stop();
ui_vp_sideplayer_char->move(0,0);
ui_vp_player_char->move(0,0);
}
}
}
-
+ if (m_chatmessage[SCREENSHAKE] == "1")
+ {
+ this->doScreenShake();
+ }
switch (emote_mod)
{
case 1: case 2: case 6:
@@ -1600,6 +1849,55 @@ void Courtroom::handle_chatmessage_2()
}
}
+void Courtroom::doScreenShake()
+{
+ if(!ao_app->is_shakeandflash_enabled())
+ return;
+ screenshake_group = new QParallelAnimationGroup;
+ screenshake_animation = new QPropertyAnimation(ui_viewport, "pos", this);
+ chatbox_screenshake_animation = new QPropertyAnimation(ui_vp_chatbox, "pos", this);
+ int screen_x = get_theme_pos("viewport").x();
+ int screen_y = get_theme_pos("viewport").y();
+ QPoint pos_default = QPoint(screen_x, screen_y);
+ QPoint pos1 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos2 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos3 = QPoint(screen_x + -3, screen_y + 5);
+ QPoint pos4 = QPoint(screen_x + 3, screen_y + -5);
+ QPoint pos5 = QPoint(screen_x + -3,screen_y + -5);
+
+ int chatbox_x = get_theme_pos("ao2_chatbox").x();
+ int chatbox_y = get_theme_pos("ao2_chatbox").y();
+ QPoint chatbox_pos_default = QPoint(chatbox_x, chatbox_y);
+ QPoint chatbox_pos1 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos2 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos3 = QPoint(chatbox_x + -3, chatbox_y + 5);
+ QPoint chatbox_pos4 = QPoint(chatbox_x + 3, chatbox_y + -5);
+ QPoint chatbox_pos5 = QPoint(chatbox_x + -3,chatbox_y + -5);
+
+ screenshake_animation->setDuration(200);
+ screenshake_animation->setKeyValueAt(0, pos_default);
+ screenshake_animation->setKeyValueAt(0.1, pos1);
+ screenshake_animation->setKeyValueAt(0.3, pos2);
+ screenshake_animation->setKeyValueAt(0.5, pos3);
+ screenshake_animation->setKeyValueAt(0.7, pos4);
+ screenshake_animation->setKeyValueAt(0.9, pos5);
+ screenshake_animation->setEndValue(pos_default);
+ screenshake_animation->setEasingCurve(QEasingCurve::Linear);
+ chatbox_screenshake_animation->setDuration(200);
+ chatbox_screenshake_animation->setKeyValueAt(0, chatbox_pos_default);
+ chatbox_screenshake_animation->setKeyValueAt(0.1, chatbox_pos3);
+ chatbox_screenshake_animation->setKeyValueAt(0.3, chatbox_pos5);
+ chatbox_screenshake_animation->setKeyValueAt(0.5, chatbox_pos2);
+ chatbox_screenshake_animation->setKeyValueAt(0.7, chatbox_pos1);
+ chatbox_screenshake_animation->setKeyValueAt(0.9, chatbox_pos4);
+ chatbox_screenshake_animation->setEndValue(chatbox_pos_default);
+ chatbox_screenshake_animation->setEasingCurve(QEasingCurve::Linear);
+
+ screenshake_group->addAnimation(screenshake_animation);
+ screenshake_group->addAnimation(chatbox_screenshake_animation);
+ screenshake_group->start(QAbstractAnimation::DeletionPolicy::DeleteWhenStopped);
+}
+
void Courtroom::handle_chatmessage_3()
{
start_chat_ticking();
@@ -1731,6 +2029,17 @@ QString Courtroom::filter_ic_text(QString p_text)
p_text.remove(trick_check_pos,1);
}
+ else if (f_character == "$" and !ic_next_is_not_special)
+ {
+ p_text.remove(trick_check_pos,1);
+ }
+
+ else if (f_character == "@" and !ic_next_is_not_special)
+ {
+ p_text.remove(trick_check_pos,1);
+ }
+
+
// Orange inline colourisation.
else if (f_character == "|" and !ic_next_is_not_special)
{
@@ -1941,14 +2250,14 @@ void Courtroom::play_preanim(bool noninterrupting)
int ao2_duration = ao_app->get_ao2_preanim_duration(f_char, f_preanim);
int text_delay = ao_app->get_text_delay(f_char, f_preanim) * time_mod;
int sfx_delay = m_chatmessage[SFX_DELAY].toInt() * 60;
-
+ bool looping_sfx = m_chatmessage[LOOPING_SFX] == "1";
int preanim_duration;
if (ao2_duration < 0)
preanim_duration = ao_app->get_preanim_duration(f_char, f_preanim);
else
preanim_duration = ao2_duration;
-
+ sfx_player->setLooping(looping_sfx);
sfx_delay_timer->start(sfx_delay);
QString anim_to_find = ao_app->get_image_suffix(ao_app->get_character_path(f_char, f_preanim));
if (!file_exists(anim_to_find) ||
@@ -1964,7 +2273,6 @@ void Courtroom::play_preanim(bool noninterrupting)
}
ui_vp_player_char->play_pre(f_char, f_preanim, preanim_duration);
-
if (noninterrupting)
anim_state = 4;
else
@@ -1988,6 +2296,15 @@ void Courtroom::realization_done()
ui_vp_realization->hide();
}
+void Courtroom::doRealization()
+{
+ if(!ao_app->is_shakeandflash_enabled())
+ return;
+ realization_timer->start(60);
+ ui_vp_realization->show();
+
+}
+
void Courtroom::start_chat_ticking()
{
//we need to ensure that the text isn't already ticking because this function can be called by two logic paths
@@ -1996,11 +2313,9 @@ void Courtroom::start_chat_ticking()
if (m_chatmessage[REALIZATION] == "1")
{
- realization_timer->start(60);
- ui_vp_realization->show();
- sfx_player->play(ao_app->get_custom_realization(m_chatmessage[CHAR_NAME]));
+ this->doRealization();
+ misc_sfx_player->play(ao_app->get_custom_realization(m_chatmessage[CHAR_NAME]));
}
-
ui_vp_message->clear();
set_text_color();
rainbow_counter = 0;
@@ -2046,7 +2361,6 @@ void Courtroom::chat_tick()
//do not perform heavy operations here
QString f_message = m_chatmessage[MESSAGE];
- f_message.remove(0, tick_pos);
// Due to our new text speed system, we always need to stop the timer now.
chat_tick_timer->stop();
@@ -2061,7 +2375,7 @@ void Courtroom::chat_tick()
f_message.remove(0,2);
}
- if (f_message.size() == 0)
+ if (tick_pos >= f_message.size())
{
text_state = 2;
if (anim_state != 4)
@@ -2073,21 +2387,9 @@ void Courtroom::chat_tick()
else
{
- QTextBoundaryFinder tbf(QTextBoundaryFinder::Grapheme, f_message);
- QString f_character;
- int f_char_length;
-
- tbf.toNextBoundary();
-
- if (tbf.position() == -1)
- f_character = f_message;
- else
- f_character = f_message.left(tbf.position());
-
- f_char_length = f_character.length();
+ QString f_character = f_message.at(tick_pos);
f_character = f_character.toHtmlEscaped();
-
if (f_character == " ")
ui_vp_message->insertPlainText(" ");
@@ -2111,6 +2413,18 @@ void Courtroom::chat_tick()
formatting_char = true;
}
+ else if (f_character == "@" and !next_character_is_not_special)
+ {
+ this->doScreenShake();
+ formatting_char = true;
+ }
+
+ else if (f_character == "$" and !next_character_is_not_special)
+ {
+ this->doRealization();
+ formatting_char = true;
+ }
+
// Orange inline colourisation.
else if (f_character == "|" and !next_character_is_not_special)
{
@@ -2180,7 +2494,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
- tick_pos -= f_char_length;
+ tick_pos--;
}
}
@@ -2201,7 +2515,7 @@ void Courtroom::chat_tick()
else
{
next_character_is_not_special = true;
- tick_pos -= f_char_length;
+ tick_pos--;
}
}
@@ -2245,7 +2559,11 @@ void Courtroom::chat_tick()
case INLINE_GREY:
ui_vp_message->insertHtml("" + f_character + "");
break;
+ default:
+ ui_vp_message->insertHtml(f_character);
+ break;
}
+
}
else
{
@@ -2296,7 +2614,7 @@ void Courtroom::chat_tick()
if(blank_blip)
qDebug() << "blank_blip found true";
- if (f_character != ' ' || blank_blip)
+ if (f_message.at(tick_pos) != ' ' || blank_blip)
{
if (blip_pos % blip_rate == 0 && !formatting_char)
@@ -2308,7 +2626,7 @@ void Courtroom::chat_tick()
++blip_pos;
}
- tick_pos += f_char_length;
+ ++tick_pos;
// Restart the timer, but according to the newly set speeds, if there were any.
// Keep the speed at bay.
@@ -2335,7 +2653,6 @@ void Courtroom::chat_tick()
}
}
-
void Courtroom::show_testimony()
{
if (!testimony_in_progress || m_chatmessage[SIDE] != "wit")
@@ -2518,7 +2835,7 @@ void Courtroom::set_ban(int p_cid)
if (p_cid != m_cid && p_cid != -1)
return;
- call_notice("You have been banned.");
+ call_notice(tr("You have been banned."));
ao_app->construct_lobby();
ao_app->destruct_courtroom();
@@ -2533,9 +2850,10 @@ void Courtroom::handle_song(QStringList *p_contents)
QString f_song = f_contents.at(0);
QString f_song_clear = f_song;
- f_song_clear = f_song_clear.left(f_song_clear.lastIndexOf("."));
int n_char = f_contents.at(1).toInt();
+ qDebug() << "playing song "+ao_app->get_music_path(f_song);
+
if (n_char < 0 || n_char >= char_list.size())
{
music_player->play(f_song);
@@ -2547,9 +2865,22 @@ void Courtroom::handle_song(QStringList *p_contents)
if (p_contents->length() > 2)
{
- str_show = p_contents->at(2);
+ if(p_contents->at(2) != "")
+ {
+ str_show = p_contents->at(2);
+ }
+ }
+ if (p_contents->length() > 3)
+ {
+ if(p_contents->at(3) != "-1")
+ {
+ music_player->enable_looping = false;
+ }
+ else
+ {
+ music_player->enable_looping = true;
+ }
}
-
if (!mute_map.value(n_char))
{
chatlogpiece* temp = new chatlogpiece(str_char, str_show, f_song, true);
@@ -2560,12 +2891,18 @@ void Courtroom::handle_song(QStringList *p_contents)
ic_chatlog_history.removeFirst();
}
- append_ic_text(f_song_clear, str_show, true);
+ append_ic_text(f_song, str_show, true);
music_player->play(f_song);
}
}
}
+void Courtroom::handle_failed_login()
+{
+ music_player->enable_looping = false;
+ music_player->play("failed_login");
+}
+
void Courtroom::handle_wtce(QString p_wtce, int variant)
{
QString sfx_file = "courtroom_sounds.ini";
@@ -2573,7 +2910,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
//witness testimony
if (p_wtce == "testimony1")
{
- sfx_player->play(ao_app->get_sfx("witness_testimony"));
+ misc_sfx_player->play(ao_app->get_sfx("witness_testimony"));
ui_vp_wtce->play("witnesstestimony");
testimony_in_progress = true;
show_testimony();
@@ -2581,7 +2918,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
//cross examination
else if (p_wtce == "testimony2")
{
- sfx_player->play(ao_app->get_sfx("cross_examination"));
+ misc_sfx_player->play(ao_app->get_sfx("cross_examination"));
ui_vp_wtce->play("crossexamination");
testimony_in_progress = false;
}
@@ -2589,12 +2926,12 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
{
if (variant == 0)
{
- sfx_player->play(ao_app->get_sfx("not_guilty"));
+ misc_sfx_player->play(ao_app->get_sfx("not_guilty"));
ui_vp_wtce->play("notguilty");
testimony_in_progress = false;
}
else if (variant == 1) {
- sfx_player->play(ao_app->get_sfx("guilty"));
+ misc_sfx_player->play(ao_app->get_sfx("guilty"));
ui_vp_wtce->play("guilty");
testimony_in_progress = false;
}
@@ -2647,14 +2984,14 @@ void Courtroom::toggle_judge_buttons(bool is_on)
void Courtroom::mod_called(QString p_ip)
{
ui_server_chatlog->append(p_ip);
- if (ui_guard->isChecked())
+ if (!ui_guard->isChecked())
{
modcall_player->play(ao_app->get_sfx("mod_call"));
ao_app->alert(this);
}
}
-void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno)
+void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur, bool steno, bool witness)
{
if (ui_casing->isChecked())
{
@@ -2663,7 +3000,8 @@ void Courtroom::case_called(QString msg, bool def, bool pro, bool jud, bool jur,
(ao_app->get_casing_prosecution_enabled() && pro) ||
(ao_app->get_casing_judge_enabled() && jud) ||
(ao_app->get_casing_juror_enabled() && jur) ||
- (ao_app->get_casing_steno_enabled() && steno))
+ (ao_app->get_casing_steno_enabled() && steno) ||
+ (ao_app->get_casing_wit_enabled() && witness))
{
modcall_player->play(ao_app->get_sfx("case_call"));
ao_app->alert(this);
@@ -2692,7 +3030,7 @@ void Courtroom::on_ooc_return_pressed()
else if (ooc_message.startsWith("/login"))
{
ui_guard->show();
- append_server_chatmessage("CLIENT", tr("You were granted the Guard button."), "1");
+ append_server_chatmessage("CLIENT", tr("You were granted the Disable Modcalls button."), "1");
}
else if (ooc_message.startsWith("/rainbow") && ao_app->yellow_text_enabled && !rainbow_appended)
{
@@ -3232,6 +3570,22 @@ void Courtroom::on_realization_clicked()
ui_ic_chat_message->setFocus();
}
+void Courtroom::on_screenshake_clicked()
+{
+ if (screenshake_state == 0)
+ {
+ screenshake_state = 1;
+ ui_screenshake->set_image("screenshake_pressed.png");
+ }
+ else
+ {
+ screenshake_state = 0;
+ ui_screenshake->set_image("screenshake.png");
+ }
+
+ ui_ic_chat_message->setFocus();
+}
+
void Courtroom::on_mute_clicked()
{
if (ui_mute_list->isHidden())
@@ -3315,6 +3669,9 @@ void Courtroom::on_sfx_slider_moved(int p_value)
{
sfx_player->set_volume(p_value);
objection_player->set_volume(p_value);
+ misc_sfx_player->set_volume(p_value);
+ frame_emote_sfx_player->set_volume(p_value);
+ pair_frame_emote_sfx_player->set_volume(p_value);
ui_ic_chat_message->setFocus();
}
@@ -3419,7 +3776,7 @@ void Courtroom::on_char_select_right_clicked()
void Courtroom::on_spectator_clicked()
{
- enter_courtroom(-1);
+ this->set_character(-1);
ui_emotes->hide();
@@ -3557,15 +3914,16 @@ void Courtroom::on_casing_clicked()
f_packet.append(QString::number(ao_app->get_casing_judge_enabled()));
f_packet.append(QString::number(ao_app->get_casing_juror_enabled()));
f_packet.append(QString::number(ao_app->get_casing_steno_enabled()));
+ f_packet.append(QString::number(ao_app->get_casing_wit_enabled()));
ao_app->send_server_packet(new AOPacket("SETCASE", f_packet));
}
else
- ao_app->send_server_packet(new AOPacket("SETCASE#\"\"#0#0#0#0#0#0#%"));
+ ao_app->send_server_packet(new AOPacket("SETCASE#\"\"#0#0#0#0#0#0#0#%"));
}
}
-void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno)
+void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool jur, bool steno, bool wit)
{
if (ao_app->casing_alerts_enabled)
{
@@ -3577,6 +3935,7 @@ void Courtroom::announce_case(QString title, bool def, bool pro, bool jud, bool
f_packet.append(QString::number(jud));
f_packet.append(QString::number(jur));
f_packet.append(QString::number(steno));
+ f_packet.append(QString::number(wit));
ao_app->send_server_packet(new AOPacket("CASEA", f_packet));
}
@@ -3590,30 +3949,25 @@ Courtroom::~Courtroom()
delete blip_player;
}
-
+#ifdef BASSAUDIO
#if (defined (_WIN32) || defined (_WIN64))
void Courtroom::load_bass_opus_plugin()
{
- #ifdef BASSAUDIO
BASS_PluginLoad("bassopus.dll", 0);
- #endif
}
#elif (defined (LINUX) || defined (__linux__))
void Courtroom::load_bass_opus_plugin()
{
- #ifdef BASSAUDIO
BASS_PluginLoad("libbassopus.so", 0);
- #endif
}
#elif defined __APPLE__
void Courtroom::load_bass_opus_plugin()
{
QString libpath = ao_app->get_base_path() + "../../Frameworks/libbassopus.dylib";
QByteArray ba = libpath.toLocal8Bit();
- #ifdef BASSAUDIO
BASS_PluginLoad(ba.data(), 0);
- #endif
}
#else
#error This operating system is unsupported for bass plugins.
#endif
+#endif
diff --git a/src/lobby.cpp b/src/lobby.cpp
index 6f257ce..d817266 100644
--- a/src/lobby.cpp
+++ b/src/lobby.cpp
@@ -69,7 +69,7 @@ void Lobby::set_widgets()
if (f_lobby.width < 0 || f_lobby.height < 0)
{
- qDebug() << "W: did not find lobby width or height in " << filename;
+ qDebug() << "W: did not find lobby width or height in " << ao_app->get_theme_path(filename);
// Most common symptom of bad config files and missing assets.
call_notice(tr("It doesn't look like your client is set up correctly.\n"
@@ -173,6 +173,10 @@ void Lobby::set_size_and_pos(QWidget *p_widget, QString p_identifier)
}
}
+void Lobby::lobbyThreadHandler(QString loadingText){
+ this->set_loading_text(loadingText);
+}
+
void Lobby::set_loading_text(QString p_text)
{
ui_loading_text->clear();
diff --git a/src/main.cpp b/src/main.cpp
index 6c7b151..778323f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -37,7 +37,7 @@ int main(int argc, char *argv[])
main_app.installTranslator(&appTranslator);
main_app.construct_lobby();
- main_app.net_manager->connect_to_master();
main_app.w_lobby->show();
+ main_app.net_manager->connect_to_master();
return main_app.exec();
}
diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp
index cfd6d8c..5538c15 100644
--- a/src/packet_distribution.cpp
+++ b/src/packet_distribution.cpp
@@ -7,6 +7,35 @@
#include "hardware_functions.h"
#include "debug_functions.h"
+class AOPacketLoadMusicThreading : public QRunnable
+{
+public:
+ AOApplication *myapp;
+ QString filename;
+ bool ismusic;
+ AOPacketLoadMusicThreading(AOApplication *my_app, QString file_name, bool is_music){
+ myapp = my_app;
+ filename = file_name;
+ ismusic = is_music;
+ }
+ void run()
+ {
+ if(ismusic)
+ {
+ myapp->w_courtroom->append_music(filename);
+ }
+ else
+ {
+ myapp->w_courtroom->append_area(filename);
+ myapp->area_count++;
+ }
+ for (int area_n = 0; area_n < myapp->area_count; area_n++)
+ {
+ myapp->w_courtroom->arup_append(0, "Unknown", "Unknown", "Unknown");
+ }
+ }
+};
+
void AOApplication::ms_packet_received(AOPacket *p_packet)
{
p_packet->net_decode();
@@ -156,6 +185,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
arup_enabled = false;
casing_alerts_enabled = false;
modcall_reason_enabled = false;
+ looping_sfx_support_enabled = false;
//workaround for tsuserver4
if (f_contents.at(0) == "NOENCRYPT")
@@ -216,6 +246,10 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
casing_alerts_enabled = true;
if (f_packet.contains("modcall_reason",Qt::CaseInsensitive))
modcall_reason_enabled = true;
+ if (f_packet.contains("looping_sfx",Qt::CaseInsensitive))
+ looping_sfx_support_enabled = true;
+
+ w_lobby->enable_connect_button();
}
else if (header == "PN")
{
@@ -316,7 +350,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
++loaded_chars;
- w_lobby->set_loading_text("Loading chars:\n" + QString::number(loaded_chars) + "/" + QString::number(char_list_size));
+ w_lobby->set_loading_text(tr("Loading chars:\n%1/%2").arg(QString::number(loaded_chars)).arg(QString::number(char_list_size)));
w_courtroom->append_char(f_char);
@@ -408,7 +442,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
musics_time = true;
areas--;
- w_courtroom->fix_last_area();
+ //w_courtroom->fix_last_area();
w_courtroom->append_music(f_music);
}
else
@@ -477,53 +511,39 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "SM")
{
- if (!courtroom_constructed)
- goto end;
+ if (!courtroom_constructed)
+ goto end;
- bool musics_time = false;
- int areas = 0;
+ bool musics_time = false;
+ area_count = 0;
- for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
- {
- ++loaded_music;
-
- w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
-
- if (musics_time)
- {
- w_courtroom->append_music(f_contents.at(n_element));
- }
- else
- {
- if (f_contents.at(n_element).endsWith(".wav") ||
- f_contents.at(n_element).endsWith(".mp3") ||
- f_contents.at(n_element).endsWith(".mp4") ||
- f_contents.at(n_element).endsWith(".ogg") ||
- f_contents.at(n_element).endsWith(".opus"))
+ for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
{
- musics_time = true;
- w_courtroom->fix_last_area();
- w_courtroom->append_music(f_contents.at(n_element));
- areas--;
+ if (!musics_time && (f_contents.at(n_element).startsWith("==") ||
+ f_contents.at(n_element).endsWith(".wav") ||
+ f_contents.at(n_element).endsWith(".mp3") ||
+ f_contents.at(n_element).endsWith(".mp4") ||
+ f_contents.at(n_element).endsWith(".ogg") ||
+ f_contents.at(n_element).endsWith(".opus")))
+ {
+ musics_time = true;
+ continue;
+ }
+ AOPacketLoadMusicThreading *music_load = new AOPacketLoadMusicThreading(this, f_contents.at(n_element), musics_time);
+ QThreadPool::globalInstance()->start(music_load);
+ ++loaded_music;
+ int total_loading_size = char_list_size * 2 + evidence_list_size + music_list_size;
+ int loading_value = int(((loaded_chars + generated_chars + loaded_music + loaded_evidence) / static_cast(total_loading_size)) * 100);
+ w_lobby->set_loading_value(loading_value);
+ w_lobby->set_loading_text(tr("Loading music:\n%1/%2").arg(QString::number(loaded_music)).arg(QString::number(music_list_size)));
+ if(QThreadPool::globalInstance()->activeThreadCount() == QThreadPool::globalInstance()->maxThreadCount())
+ {
+ QThreadPool::globalInstance()->waitForDone(); //out of order music is bad
+ }
}
- else
- {
- w_courtroom->append_area(f_contents.at(n_element));
- areas++;
- }
- }
+ QThreadPool::globalInstance()->waitForDone();
- for (int area_n = 0; area_n < areas; area_n++)
- {
- w_courtroom->arup_append(0, "Unknown", "Unknown", "Unknown");
- }
-
- int total_loading_size = char_list_size * 2 + evidence_list_size + music_list_size;
- int loading_value = int(((loaded_chars + generated_chars + loaded_music + loaded_evidence) / static_cast(total_loading_size)) * 100);
- w_lobby->set_loading_value(loading_value);
- }
-
- send_server_packet(new AOPacket("RD#%"));
+ send_server_packet(new AOPacket("RD#%"));
}
else if (header == "FM")
{
@@ -582,6 +602,16 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
destruct_lobby();
}
+ else if (header == "REFMUSIC")
+ {
+ if (courtroom_constructed)
+ w_courtroom->reset_music_list();
+ for (int n_element = 0 ; n_element < f_contents.size() ; ++n_element)
+ {
+ w_courtroom->append_music(f_contents.at(n_element));
+ }
+ w_courtroom->list_music();
+ }
else if (header == "BN")
{
if (f_contents.size() < 1)
@@ -595,9 +625,24 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
{
if (f_contents.size() < 3)
goto end;
-
- if (courtroom_constructed)
- w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ if(f_contents.size() < 4){
+ if (courtroom_constructed)
+ w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ }
+ else
+ {
+ if (courtroom_constructed)
+ {
+ if(f_contents.at(3) == "True")
+ {
+ w_courtroom->set_character(f_contents.at(2).toInt());
+ }
+ else
+ {
+ w_courtroom->enter_courtroom(f_contents.at(2).toInt());
+ }
+ }
+ }
}
else if (header == "MS")
{
@@ -662,6 +707,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
}
}
+ else if (header == "FAILEDLOGIN")
+ {
+ if (courtroom_constructed)
+ w_courtroom->handle_failed_login();
+ }
else if (header == "IL")
{
if (courtroom_constructed && f_contents.size() > 0)
@@ -707,8 +757,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
}
else if (header == "CASEA")
{
- if (courtroom_constructed && f_contents.size() > 6)
- w_courtroom->case_called(f_contents.at(0), f_contents.at(1) == "1", f_contents.at(2) == "1", f_contents.at(3) == "1", f_contents.at(4) == "1", f_contents.at(5) == "1");
+ if (courtroom_constructed && f_contents.size() > 7)
+ w_courtroom->case_called(f_contents.at(0), f_contents.at(1) == "1", f_contents.at(2) == "1", f_contents.at(3) == "1", f_contents.at(4) == "1", f_contents.at(5) == "1", f_contents.at(6) == "1");
}
end:
diff --git a/src/path_functions.cpp b/src/path_functions.cpp
index 5eb97a3..72b7acc 100644
--- a/src/path_functions.cpp
+++ b/src/path_functions.cpp
@@ -96,11 +96,37 @@ QString AOApplication::get_sounds_path(QString p_file)
QString AOApplication::get_music_path(QString p_song)
{
- QString path = get_base_path() + "sounds/music/" + p_song;
+ QString withending_check = get_base_path() + "sounds/music/" + p_song;
+ QString mp3_check = get_base_path() + "sounds/music/" + p_song + ".mp3";
+ QString opus_check = get_base_path() + "sounds/music/" + p_song + ".opus";
+ if (file_exists(opus_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return opus_check;
+ #else
+ return get_case_sensitive_path(opus_check);
+ #endif
+ }
+ else if (file_exists(mp3_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return mp3_check;
+ #else
+ return get_case_sensitive_path(mp3_check);
+ #endif
+ }
+ else if (file_exists(withending_check))
+ {
+ #ifndef CASE_SENSITIVE_FILESYSTEM
+ return withending_check;
+ #else
+ return get_case_sensitive_path(withending_check);
+ #endif
+ }
#ifndef CASE_SENSITIVE_FILESYSTEM
- return path;
+ return get_base_path() + "sounds/music/" + p_song + ".wav";
#else
- return get_case_sensitive_path(path);
+ return get_case_sensitive_path(get_base_path() + "sounds/music/" + p_song + ".wav");
#endif
}
diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp
index 5a34ac8..1e1c474 100644
--- a/src/text_file_functions.cpp
+++ b/src/text_file_functions.cpp
@@ -8,7 +8,7 @@ QString AOApplication::read_theme()
int AOApplication::read_blip_rate()
{
- int result = configini->value("blip_rate", 1).toInt();
+ int result = configini->value("blip_rate", 2).toInt();
if (result < 1)
return 1;
@@ -568,6 +568,42 @@ QString AOApplication::get_sfx_name(QString p_char, int p_emote)
else return f_result;
}
+QString AOApplication::get_sfx_looping(QString p_char, int p_emote)
+{
+ QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundL");
+
+ if (f_result == "")
+ return "0";
+ else return f_result;
+}
+
+QString AOApplication::get_frame_sfx_name(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameSFX"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+QString AOApplication::get_screenshake_frame(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameScreenshake"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+
+QString AOApplication::get_realization_frame(QString p_char, QString p_emote, int n_frame)
+{
+ QString f_result = read_char_ini(p_char, QString::number(n_frame), p_emote.append("_FrameRealization"));
+ if (f_result == "")
+ return "";
+ else return f_result;
+}
+
+
+
int AOApplication::get_sfx_delay(QString p_char, int p_emote)
{
QString f_result = read_char_ini(p_char, QString::number(p_emote + 1), "SoundT");
@@ -601,12 +637,31 @@ bool AOApplication::get_blank_blip()
return result.startsWith("true");
}
+bool AOApplication::get_looping_sfx()
+{
+ QString result = configini->value("looping_sfx", "true").value();
+ return result.startsWith("true");
+}
+
+bool AOApplication::get_objectmusic()
+{
+ QString result = configini->value("kill_music_on_object", "false").value();
+ return result.startsWith("true");
+}
+
bool AOApplication::is_discord_enabled()
{
QString result = configini->value("discord", "true").value();
return result.startsWith("true");
}
+bool AOApplication::is_shakeandflash_enabled()
+{
+ QString result = configini->value("shakeandflash", "true").value();
+ return result.startsWith("true");
+}
+
+
bool AOApplication::get_casing_enabled()
{
QString result = configini->value("casing_enabled", "false").value();
@@ -643,6 +698,12 @@ bool AOApplication::get_casing_steno_enabled()
return result.startsWith("true");
}
+bool AOApplication::get_casing_wit_enabled()
+{
+ QString result = configini->value("casing_wit_enabled", "false").value();
+ return result.startsWith("true");
+}
+
bool AOApplication::get_casing_cm_enabled()
{
QString result = configini->value("casing_cm_enabled", "false").value();