aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--README_BUILD.md34
-rw-r--r--include/courtroom.h1
-rwxr-xr-xscripts/configure_macos.sh42
-rwxr-xr-xscripts/configure_ubuntu.sh11
-rw-r--r--[-rwxr-xr-x]scripts/macos_post_build.sh24
-rwxr-xr-xscripts/release_macos.sh22
-rw-r--r--src/courtroom.cpp93
8 files changed, 198 insertions, 30 deletions
diff --git a/.gitignore b/.gitignore
index 6ac11d6..0b767f1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
*.so
*.pro.autosave
base_override.h
+.DS_Store
base-full/
bass.lib
diff --git a/README_BUILD.md b/README_BUILD.md
index 685699c..f7441b8 100644
--- a/README_BUILD.md
+++ b/README_BUILD.md
@@ -8,22 +8,40 @@ This program has five main dependencies
* Discord Rich Presence (https://github.com/discordapp/discord-rpc/releases)
* Qt Apng Plugin (https://github.com/Skycoder42/QtApng/releases)
+### Help
+
+If you're having issues with any of this, ask in the offical Discord: https://discord.gg/wWvQ3pw
+Alternatively, you can ask OmniTroid#4004 on Discord.
+
### How to build dynamically (the easy way)
+#### General preparation
+
What you want to do is first download the latest version of Qt from the first link. (get the prebuilt dynamic version)
-If you're on Ubuntu, go to the scripts/ folder and run configure_ubuntu.sh. This should fetch all the required dependencies automatically.
-If not, go to each one of the links above and find the right dynamic library for your platform:
-* Windows: .dll
-* Linux: .so
-* Mac: .dylib
+After going through the OS-specific steps below, compiling in Qt creator should work.
+
+#### Windows
+
+If you're on Windows, you need to go find all the dependencies (see above) and put them in the lib/ folder.
+
+#### MacOS
+
+If you're on MacOS, you can simply go to terminal and run ./scripts/configure_macos.sh
+This will automatically fetch all the required dependencies. Additionally, if you need to create a standalone release, just run ./scripts/release_macos.sh
+This will make the .app bundle in bin/ able to execute as a standalone.
+
+#### Ubuntu
+
+If you're on Ubuntu, just go to terminal and run ./scripts/configure_ubuntu.sh
+This should fetch all the required dependencies automatically.
-And put them in BOTH lib/ and the repository root (lib/ is required for linking and root is required for runtime)
+#### Other Linux
-Launch Qt creator, open the .pro file and try running it. Ask in the Discord if you're having issues: https://discord.gg/wWvQ3pw
+With some tweaks to the ubuntu script, it shouldn't be a big hassle to compile it on a modern linux. Look in the script and see what you may have to modify.
### How to build statically (the hard way)
-You're gonna have a bad time.
+You're gonna have a bad time.
Building statically means you can distribute the final program without needing to pack alongside a lot of dynamic libraries.
This is a tricky process and is not recommended unless you know what you're doing.
diff --git a/include/courtroom.h b/include/courtroom.h
index ec9f9ef..cc08f65 100644
--- a/include/courtroom.h
+++ b/include/courtroom.h
@@ -48,6 +48,7 @@
#include <QFont>
#include <QInputDialog>
#include <QFileDialog>
+#include <QTextBoundaryFinder>
#include <stack>
diff --git a/scripts/configure_macos.sh b/scripts/configure_macos.sh
new file mode 100755
index 0000000..af08966
--- /dev/null
+++ b/scripts/configure_macos.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# This script fetches all build dependencies for MacOS
+# Tested on MacOS 10.14 (Mojave), Qt 5.13 and XCode 10.2
+
+# Exit on errors and unset variables
+set -eu
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
+
+cd ${ROOT_DIR}
+
+LIB_TARGET="../../lib"
+BASS_LINK="http://uk.un4seen.com/files/bass24-osx.zip"
+BASSOPUS_LINK="http://www.un4seen.com/files/bassopus24-osx.zip"
+DISCORD_RPC_LINK="https://github.com/discordapp/discord-rpc/releases/download/v3.4.0/discord-rpc-osx.zip"
+APNG_LINK="https://github.com/Skycoder42/QtApng/releases/download/1.1.2-2/qtapng_clang_64_5.13.0.tar.xz"
+
+# Easier if we don't need to worry about an existing tmp folder tbh smh
+# v Add a slash here for free tmp folder cleanup in true javascript community style
+rm -rf tmp
+mkdir tmp
+cd tmp
+
+curl -Ls ${BASS_LINK} -o bass.zip
+unzip -qq bass.zip
+cp libbass.dylib ${LIB_TARGET}
+
+curl -Ls ${BASSOPUS_LINK} -o bassopus.zip
+unzip -qq bassopus.zip
+cp libbassopus.dylib ${LIB_TARGET}
+
+curl -Ls ${DISCORD_RPC_LINK} -o discord_rpc.zip
+unzip -qq discord_rpc.zip
+cp discord-rpc/osx-dynamic/lib/libdiscord-rpc.dylib ${LIB_TARGET}
+
+curl -Ls ${APNG_LINK} -o apng.tar.xz
+tar -xf apng.tar.xz
+cp clang_64/plugins/imageformats/libqapng.dylib ../../lib
+
+cd ..
+rm -rf tmp
diff --git a/scripts/configure_ubuntu.sh b/scripts/configure_ubuntu.sh
index 3817997..159dc4d 100755
--- a/scripts/configure_ubuntu.sh
+++ b/scripts/configure_ubuntu.sh
@@ -1,6 +1,13 @@
-#!/bin/bash
+#!/bin/sh
-#assumes a somewhat recent 64-bit ubuntu
+# Assumes a somewhat recent 64-bit ubuntu
+
+# Exit on errors and unset variables
+set -eu
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
+
+cd ${ROOT_DIR}
#need some openGL stuff
sudo apt install libgl1-mesa-dev
diff --git a/scripts/macos_post_build.sh b/scripts/macos_post_build.sh
index 700361e..50acb40 100755..100644
--- a/scripts/macos_post_build.sh
+++ b/scripts/macos_post_build.sh
@@ -1,14 +1,22 @@
-#!/bin/bash
+#!/bin/sh
-DST_FOLDER="./bin/Attorney_Online.app/Contents/Frameworks"
+# This script prepares the compiled bundle for shipping as a standalone release
+# Assumes the Qt bin folder is in PATH
+# Should be used on a "Release" build from QT creator
+# Note that this DOES NOT add the base/ folder
-mkdir $DST_FOLDER
+# Exit on errors and unset variables
+set -eu
-cp ./lib/libbass.dylib $DST_FOLDER
-cp ./lib/libbassopus.dylib $DST_FOLDER
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
-install_name_tool -id @executable_path/../Frameworks/libbass.dylib $DST_FOLDER/libbass.dylib
+cd ${ROOT_DIR}
-install_name_tool -id @executable_path/../Frameworks/libbassopus.dylib $DST_FOLDER/libbassopus.dylib
+# This thing basically does all the work
+macdeployqt ../bin/Attorney_Online.app
-install_name_tool -change @loader_path/libbass.dylib @executable_path/../Frameworks/libbass.dylib ./bin/Attorney_Online.app/Contents/MacOS/Attorney_Online
+# Need to add the dependencies
+cp ../lib/* ../bin/Attorney_Online.app/Contents/Frameworks
+
+# libbass has a funny path for some reason, just use rpath
+install_name_tool -change @loader_path/libbass.dylib @rpath/libbass.dylib ../bin/Attorney_Online.app/Contents/MacOS/Attorney_Online
diff --git a/scripts/release_macos.sh b/scripts/release_macos.sh
new file mode 100755
index 0000000..50acb40
--- /dev/null
+++ b/scripts/release_macos.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# This script prepares the compiled bundle for shipping as a standalone release
+# Assumes the Qt bin folder is in PATH
+# Should be used on a "Release" build from QT creator
+# Note that this DOES NOT add the base/ folder
+
+# Exit on errors and unset variables
+set -eu
+
+ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/"
+
+cd ${ROOT_DIR}
+
+# This thing basically does all the work
+macdeployqt ../bin/Attorney_Online.app
+
+# Need to add the dependencies
+cp ../lib/* ../bin/Attorney_Online.app/Contents/Frameworks
+
+# libbass has a funny path for some reason, just use rpath
+install_name_tool -change @loader_path/libbass.dylib @rpath/libbass.dylib ../bin/Attorney_Online.app/Contents/MacOS/Attorney_Online
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index be7629b..da05fe9 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -2024,6 +2024,7 @@ 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();
@@ -2038,7 +2039,7 @@ void Courtroom::chat_tick()
f_message.remove(0,2);
}
- if (tick_pos >= f_message.size())
+ if (f_message.size() == 0)
{
text_state = 2;
if (anim_state != 4)
@@ -2050,7 +2051,16 @@ void Courtroom::chat_tick()
else
{
- QString f_character = f_message.at(tick_pos);
+ QTextBoundaryFinder tbf(QTextBoundaryFinder::Grapheme, f_message);
+ QString f_character;
+
+ tbf.toNextBoundary();
+
+ if (tbf.position() == -1)
+ f_character = f_message;
+ else
+ f_character = f_message.left(tbf.position());
+
f_character = f_character.toHtmlEscaped();
if (f_character == " ")
@@ -2265,7 +2275,7 @@ void Courtroom::chat_tick()
if(blank_blip)
qDebug() << "blank_blip found true";
- if (f_message.at(tick_pos) != ' ' || blank_blip)
+ if (f_character != ' ' || blank_blip)
{
if (blip_pos % blip_rate == 0 && !formatting_char)
@@ -2277,7 +2287,7 @@ void Courtroom::chat_tick()
++blip_pos;
}
- ++tick_pos;
+ tick_pos += f_character.length();
// Restart the timer, but according to the newly set speeds, if there were any.
// Keep the speed at bay.
@@ -2304,6 +2314,7 @@ void Courtroom::chat_tick()
}
}
+
void Courtroom::show_testimony()
{
if (!testimony_in_progress || m_chatmessage[SIDE] != "wit")
@@ -2696,6 +2707,7 @@ void Courtroom::on_ooc_return_pressed()
}
else
{
+ other_charid = -1;
append_server_chatmessage("CLIENT", "You are no longer paired with anyone.", "1");
}
}
@@ -2852,6 +2864,58 @@ void Courtroom::on_ooc_return_pressed()
ui_ooc_chat_message->clear();
return;
}
+ else if(ooc_message.startsWith("/save_case"))
+ {
+ QStringList command = ooc_message.split(" ", QString::SkipEmptyParts);
+
+ QDir casefolder("base/cases");
+ if (!casefolder.exists())
+ {
+ QDir::current().mkdir("base/" + casefolder.dirName());
+ append_server_chatmessage("CLIENT", "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.", "1");
+ ui_ooc_chat_message->clear();
+ return;
+ }
+ QStringList caseslist = casefolder.entryList();
+ caseslist.removeOne(".");
+ caseslist.removeOne("..");
+ caseslist.replaceInStrings(".ini","");
+
+ if (command.size() < 2)
+ {
+ append_server_chatmessage("CLIENT", "You need to give a filename to save (extension not needed) and the courtroom status!" + caseslist.join(", "), "1");
+ ui_ooc_chat_message->clear();
+ return;
+ }
+
+
+ if (command.size() > 3)
+ {
+ append_server_chatmessage("CLIENT", "Too many arguments to save a case! You only need a filename without extension and the courtroom status!", "1");
+ ui_ooc_chat_message->clear();
+ return;
+ }
+ QSettings casefile("base/cases/" + command[1] + ".ini", QSettings::IniFormat);
+ casefile.setValue("author",ui_ooc_chat_name->text());
+ casefile.setValue("cmdoc","");
+ casefile.setValue("doc", "");
+ casefile.setValue("status",command[2]);
+ casefile.sync();
+ for(int i = local_evidence_list.size() - 1; i >= 0; i--)
+ {
+ casefile.beginGroup(QString::number(i));
+ casefile.sync();
+ casefile.setValue("name",local_evidence_list[i].name);
+ casefile.setValue("description",local_evidence_list[i].description);
+ casefile.setValue("image",local_evidence_list[i].image);
+ casefile.endGroup();
+ }
+ casefile.sync();
+ append_server_chatmessage("CLIENT", "Succesfully saved, edit doc and cmdoc link on the ini!", "1");
+ ui_ooc_chat_message->clear();
+ return;
+
+ }
QStringList packet_contents;
packet_contents.append(ui_ooc_chat_name->text());
@@ -2981,6 +3045,7 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
QListWidgetItem *f_item = ui_pair_list->item(p_index.row());
QString f_char = f_item->text();
QString real_char;
+ int f_cid = -1;
if (f_char.endsWith(" [x]"))
{
@@ -2988,17 +3053,19 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
f_item->setText(real_char);
}
else
- real_char = f_char;
-
- int f_cid = -1;
-
- for (int n_char = 0 ; n_char < char_list.size() ; n_char++)
{
+ real_char = f_char;
+ for (int n_char = 0 ; n_char < char_list.size() ; n_char++)
+ {
if (char_list.at(n_char).name == real_char)
f_cid = n_char;
+ }
}
- if (f_cid < 0 || f_cid >= char_list.size())
+
+
+
+ if (f_cid < -2 || f_cid >= char_list.size())
{
qDebug() << "W: " << real_char << " not present in char_list";
return;
@@ -3017,8 +3084,10 @@ void Courtroom::on_pair_list_clicked(QModelIndex p_index)
for (int i = 0; i < ui_pair_list->count(); i++) {
ui_pair_list->item(i)->setText(sorted_pair_list.at(i));
}
-
- f_item->setText(real_char + " [x]");
+ if(other_charid != -1)
+ {
+ f_item->setText(real_char + " [x]");
+ }
}
void Courtroom::on_music_list_double_clicked(QModelIndex p_model)