diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | README_BUILD.md | 34 | ||||
| -rw-r--r-- | include/courtroom.h | 1 | ||||
| -rwxr-xr-x | scripts/configure_macos.sh | 42 | ||||
| -rwxr-xr-x | scripts/configure_ubuntu.sh | 11 | ||||
| -rw-r--r--[-rwxr-xr-x] | scripts/macos_post_build.sh | 24 | ||||
| -rwxr-xr-x | scripts/release_macos.sh | 22 | ||||
| -rw-r--r-- | src/courtroom.cpp | 93 |
8 files changed, 198 insertions, 30 deletions
@@ -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) |
