Qml (#238)
修复了qml的一些问题;增加利好私服的服主配置项。 --------- Co-authored-by: YoumuKon <38815081+YoumuKon@users.noreply.github.com>
|
@ -2,6 +2,12 @@
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
|
## v0.3.0
|
||||||
|
|
||||||
|
修复了测试版的诸多bug,更换了一些素材。
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
## v0.2.11
|
## v0.2.11
|
||||||
|
|
||||||
新测试版
|
新测试版
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
project(FreeKill VERSION 0.2.11)
|
project(FreeKill VERSION 0.3.0)
|
||||||
add_definitions(-DFK_VERSION=\"${CMAKE_PROJECT_VERSION}\")
|
add_definitions(-DFK_VERSION=\"${CMAKE_PROJECT_VERSION}\")
|
||||||
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS
|
find_package(Qt6 REQUIRED COMPONENTS
|
||||||
|
|
|
@ -38,6 +38,8 @@ QtObject {
|
||||||
property string aeskey
|
property string aeskey
|
||||||
|
|
||||||
// Client data
|
// Client data
|
||||||
|
property string serverMotd: ""
|
||||||
|
property var serverHiddenPacks: []
|
||||||
property int roomCapacity: 0
|
property int roomCapacity: 0
|
||||||
property int roomTimeout: 0
|
property int roomTimeout: 0
|
||||||
property bool enableFreeAssign: false
|
property bool enableFreeAssign: false
|
||||||
|
|
|
@ -14,7 +14,7 @@ Item {
|
||||||
anchors.rightMargin: 8
|
anchors.rightMargin: 8
|
||||||
spacing: 16
|
spacing: 16
|
||||||
Text {
|
Text {
|
||||||
text: "禁将方案"
|
text: Backend.translate("Ban List")
|
||||||
}
|
}
|
||||||
ComboBox {
|
ComboBox {
|
||||||
id: banCombo
|
id: banCombo
|
||||||
|
@ -30,18 +30,18 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "新建"
|
text: Backend.translate("New")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
const i = config.disableGeneralSchemes.length;
|
const i = config.disableGeneralSchemes.length;
|
||||||
banComboList.append({
|
banComboList.append({
|
||||||
name: "方案" + (i + 1),
|
name: Backend.translate("List") + (i + 1),
|
||||||
});
|
});
|
||||||
config.disableGeneralSchemes.push([]);
|
config.disableGeneralSchemes.push([]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "清空"
|
text: Backend.translate("Clear")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
config.disabledGenerals = [];
|
config.disabledGenerals = [];
|
||||||
}
|
}
|
||||||
|
@ -52,42 +52,41 @@ Item {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.margins: 8
|
Layout.margins: 8
|
||||||
wrapMode: Text.WrapAnywhere
|
wrapMode: Text.WrapAnywhere
|
||||||
text: "导出键会将这个方案的内容复制到剪贴板中;" +
|
text: Backend.translate("Help_Ban_List")
|
||||||
"导入键会自动读取剪贴板,若可以导入则导入,不能导入则报错。"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
Button {
|
Button {
|
||||||
text: "导出"
|
text: Backend.translate("Export")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Backend.copyToClipboard(JSON.stringify(config.disabledGenerals));
|
Backend.copyToClipboard(JSON.stringify(config.disabledGenerals));
|
||||||
toast.show("该禁将方案已经复制到剪贴板。");
|
toast.show(Backend.translate("Export Success"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "导入"
|
text: Backend.translate("Import")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
const str = Backend.readClipboard();
|
const str = Backend.readClipboard();
|
||||||
let data;
|
let data;
|
||||||
try {
|
try {
|
||||||
data = JSON.parse(str);
|
data = JSON.parse(str);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
toast.show("导入失败:不是合法的JSON字符串。");
|
toast.show(Backend.translate("Not Legal"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!data instanceof Array) {
|
if (!data instanceof Array) {
|
||||||
toast.show("导入失败:数据格式不对。");
|
toast.show(Backend.translate("Not JSON"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let d = [];
|
||||||
for (let e of data) {
|
for (let e of data) {
|
||||||
if (!(typeof e === "string" && Backend.translate(e) !== e)) {
|
if (typeof e === "string" && Backend.translate(e) !== e) {
|
||||||
toast.show("导入失败:含有未知的武将。");
|
d.push(e);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config.disabledGenerals = data;
|
config.disabledGenerals = d;
|
||||||
toast.show("导入禁将方案成功。");
|
toast.show(Backend.translate("Import Success"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +117,7 @@ Item {
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
for (let i = 0; i < config.disableGeneralSchemes.length; i++) {
|
for (let i = 0; i < config.disableGeneralSchemes.length; i++) {
|
||||||
banComboList.append({
|
banComboList.append({
|
||||||
name: "方案" + (i + 1),
|
name: Backend.translate("List") + (i + 1),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
banCombo.currentIndex = config.disableSchemeIdx;
|
banCombo.currentIndex = config.disableSchemeIdx;
|
||||||
|
|
|
@ -22,6 +22,9 @@ Item {
|
||||||
TabButton {
|
TabButton {
|
||||||
text: Backend.translate("Package Settings")
|
text: Backend.translate("Package Settings")
|
||||||
}
|
}
|
||||||
|
TabButton {
|
||||||
|
text: Backend.translate("Ban General Settings")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SwipeView {
|
SwipeView {
|
||||||
|
@ -37,5 +40,6 @@ Item {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BanGeneralSetting {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,6 @@ Item {
|
||||||
TabButton {
|
TabButton {
|
||||||
text: Backend.translate("Audio Settings")
|
text: Backend.translate("Audio Settings")
|
||||||
}
|
}
|
||||||
TabButton {
|
|
||||||
text: Backend.translate("Ban General Settings")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SwipeView {
|
SwipeView {
|
||||||
|
@ -39,6 +36,5 @@ Item {
|
||||||
UserInfo {}
|
UserInfo {}
|
||||||
BGSetting {}
|
BGSetting {}
|
||||||
AudioSetting {}
|
AudioSetting {}
|
||||||
BanGeneralSetting {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
TapHandler {
|
TapHandler {
|
||||||
|
gesturePolicy: TapHandler.WithinBounds
|
||||||
|
|
||||||
onTapped: {
|
onTapped: {
|
||||||
lobby_dialog.sourceComponent = Qt.createComponent("EditProfile.qml");
|
lobby_dialog.sourceComponent = Qt.createComponent("EditProfile.qml");
|
||||||
lobby_drawer.open();
|
lobby_drawer.open();
|
||||||
|
|
|
@ -179,13 +179,30 @@ Flickable {
|
||||||
disabledGenerals = Array.from(new Set(disabledGenerals));
|
disabledGenerals = Array.from(new Set(disabledGenerals));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let disabledPack = config.disabledPack.slice();
|
||||||
|
config.serverHiddenPacks.forEach(p => {
|
||||||
|
if (!disabledPack.includes(p)) {
|
||||||
|
disabledPack.push(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const generalPacks = JSON.parse(Backend.callLuaFunction("GetAllGeneralPack", []));
|
||||||
|
for (let pk of generalPacks) {
|
||||||
|
if (disabledPack.includes(pk)) continue;
|
||||||
|
let generals = JSON.parse(Backend.callLuaFunction("GetGenerals", [pk]));
|
||||||
|
let t = generals.filter(g => !disabledGenerals.includes(g));
|
||||||
|
if (t.length === 0) {
|
||||||
|
disabledPack.push(pk);
|
||||||
|
disabledGenerals = disabledGenerals.filter(g1 => !generals.includes(g1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ClientInstance.notifyServer(
|
ClientInstance.notifyServer(
|
||||||
"CreateRoom",
|
"CreateRoom",
|
||||||
JSON.stringify([roomName.text, playerNum.value, config.preferredTimeout, {
|
JSON.stringify([roomName.text, playerNum.value, config.preferredTimeout, {
|
||||||
enableFreeAssign: freeAssignCheck.checked,
|
enableFreeAssign: freeAssignCheck.checked,
|
||||||
enableDeputy: deputyCheck.checked,
|
enableDeputy: deputyCheck.checked,
|
||||||
gameMode: config.preferedMode,
|
gameMode: config.preferedMode,
|
||||||
disabledPack: config.disabledPack,
|
disabledPack: disabledPack,
|
||||||
generalNum: config.preferredGeneralNum,
|
generalNum: config.preferredGeneralNum,
|
||||||
luckTime: config.preferredLuckTime,
|
luckTime: config.preferredLuckTime,
|
||||||
password: roomPassword.text,
|
password: roomPassword.text,
|
||||||
|
|
|
@ -22,7 +22,7 @@ Flickable {
|
||||||
anchors.topMargin: 8
|
anchors.topMargin: 8
|
||||||
|
|
||||||
Switch {
|
Switch {
|
||||||
text: "禁用Lua拓展 (重启后生效)"
|
text: Backend.translate("Disable Extension")
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
|
@ -132,19 +132,25 @@ Flickable {
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
const g = JSON.parse(Backend.callLuaFunction("GetAllGeneralPack", []));
|
const g = JSON.parse(Backend.callLuaFunction("GetAllGeneralPack", []));
|
||||||
for (let orig of g) {
|
for (let orig of g) {
|
||||||
|
if (config.serverHiddenPacks.includes(orig)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
gpacklist.append({
|
gpacklist.append({
|
||||||
name: Backend.translate(orig),
|
name: Backend.translate(orig),
|
||||||
orig_name: orig,
|
orig_name: orig,
|
||||||
pkg_enabled: config.disabledPack.indexOf(orig) === -1,
|
pkg_enabled: !config.disabledPack.includes(orig),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const c = JSON.parse(Backend.callLuaFunction("GetAllCardPack", []));
|
const c = JSON.parse(Backend.callLuaFunction("GetAllCardPack", []));
|
||||||
for (let orig of c) {
|
for (let orig of c) {
|
||||||
|
if (config.serverHiddenPacks.includes(orig)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
cpacklist.append({
|
cpacklist.append({
|
||||||
name: Backend.translate(orig),
|
name: Backend.translate(orig),
|
||||||
orig_name: orig,
|
orig_name: orig,
|
||||||
pkg_enabled: config.disabledPack.indexOf(orig) === -1,
|
pkg_enabled: !config.disabledPack.includes(orig),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,13 @@ callbacks["BackToStart"] = (jsonData) => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
callbacks["SetServerSettings"] = (j) => {
|
||||||
|
const data = JSON.parse(j);
|
||||||
|
const [ motd, hiddenPacks ] = data;
|
||||||
|
config.serverMotd = motd;
|
||||||
|
config.serverHiddenPacks = hiddenPacks;
|
||||||
|
};
|
||||||
|
|
||||||
callbacks["EnterLobby"] = (jsonData) => {
|
callbacks["EnterLobby"] = (jsonData) => {
|
||||||
// depth == 1 means the lobby page is not present in mainStack
|
// depth == 1 means the lobby page is not present in mainStack
|
||||||
// createClientPages();
|
// createClientPages();
|
||||||
|
|
|
@ -302,7 +302,11 @@ Item {
|
||||||
function loadPackages() {
|
function loadPackages() {
|
||||||
if (loaded) return;
|
if (loaded) return;
|
||||||
const packs = JSON.parse(Backend.callLuaFunction("GetAllCardPack", []));
|
const packs = JSON.parse(Backend.callLuaFunction("GetAllCardPack", []));
|
||||||
packs.forEach((name) => packages.append({ name: name }));
|
packs.forEach(name => {
|
||||||
|
if (!config.serverHiddenPacks.includes(name)) {
|
||||||
|
packages.append({ name: name });
|
||||||
|
}
|
||||||
|
});
|
||||||
loaded = true;
|
loaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -359,7 +359,11 @@ Item {
|
||||||
function loadPackages() {
|
function loadPackages() {
|
||||||
if (loaded) return;
|
if (loaded) return;
|
||||||
const packs = JSON.parse(Backend.callLuaFunction("GetAllGeneralPack", []));
|
const packs = JSON.parse(Backend.callLuaFunction("GetAllGeneralPack", []));
|
||||||
packs.forEach((name) => packages.append({ name: name }));
|
packs.forEach(name => {
|
||||||
|
if (!config.serverHiddenPacks.includes(name)) {
|
||||||
|
packages.append({ name: name });
|
||||||
|
}
|
||||||
|
});
|
||||||
generalDetail.updateGeneral();
|
generalDetail.updateGeneral();
|
||||||
loaded = true;
|
loaded = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ Item {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
wrapMode: TextEdit.WordWrap
|
wrapMode: TextEdit.WordWrap
|
||||||
textFormat: Text.MarkdownText
|
textFormat: Text.MarkdownText
|
||||||
text: Backend.translate('Bulletin Info')
|
text: config.serverMotd + "\n___\n" + Backend.translate('Bulletin Info')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,9 +223,9 @@ Item {
|
||||||
x: 8; y: 8
|
x: 8; y: 8
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
const data = JSON.parse(Backend.callLuaFunction("GetRoomConfig", []));
|
const data = JSON.parse(Backend.callLuaFunction("GetRoomConfig", []));
|
||||||
text = "手气卡次数:" + data.luckTime + "<br />出手时间:" + config.roomTimeout
|
text = Backend.translate("LuckCardNum") + data.luckTime + "<br />" + Backend.translate("ResponseTime") + config.roomTimeout
|
||||||
+ "<br />选将框数:" + data.generalNum + (data.enableFreeAssign ? "<br /><font color=\"red\">可自由点将</font>" : "")
|
+ "<br />" + Backend.translate("GeneralBoxNum") + data.generalNum + (data.enableFreeAssign ? "<br />" + Backend.translate("IncludeFreeAssign") : "")
|
||||||
+ (data.enableDeputy ? "<br /><font color=\"red\">启用副将机制</font>" : "")
|
+ (data.enableDeputy ? "<br />" + Backend.translate("IncludeDeputy") : "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -478,13 +478,13 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
Switch {
|
Switch {
|
||||||
text: "匀速"
|
text: Backend.translate("Speed Resume")
|
||||||
checked: false
|
checked: false
|
||||||
onCheckedChanged: Backend.controlReplayer("uniform");
|
onCheckedChanged: Backend.controlReplayer("uniform");
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "减速"
|
text: Backend.translate("Speed Down")
|
||||||
onClicked: Backend.controlReplayer("slowdown");
|
onClicked: Backend.controlReplayer("slowdown");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,13 +495,13 @@ Item {
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "加速"
|
text: Backend.translate("Speed Up")
|
||||||
onClicked: Backend.controlReplayer("speedup");
|
onClicked: Backend.controlReplayer("speedup");
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
property bool running: true
|
property bool running: true
|
||||||
text: running ? "暂停" : "继续"
|
text: Backend.translate(running ? "Pause" : "Resume")
|
||||||
onClicked: {
|
onClicked: {
|
||||||
running = !running;
|
running = !running;
|
||||||
Backend.controlReplayer("toggle");
|
Backend.controlReplayer("toggle");
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.notify.FreeKill"
|
package="org.notify.FreeKill"
|
||||||
android:installLocation="preferExternal"
|
android:installLocation="preferExternal"
|
||||||
android:versionCode="211"
|
android:versionCode="300"
|
||||||
android:versionName="0.2.11">
|
android:versionName="0.3.0">
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
|
@ -3,5 +3,7 @@
|
||||||
"description": "FreeKill Server",
|
"description": "FreeKill Server",
|
||||||
"iconUrl": "https://img1.imgtp.com/2023/07/01/DGUdj8eu.png",
|
"iconUrl": "https://img1.imgtp.com/2023/07/01/DGUdj8eu.png",
|
||||||
"capacity": 100,
|
"capacity": 100,
|
||||||
"tempBanTime": 20
|
"tempBanTime": 20,
|
||||||
|
"motd": "Welcome!",
|
||||||
|
"hiddenPacks": []
|
||||||
}
|
}
|
||||||
|
|
BIN
image/icon.ico
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
BIN
image/icon.png
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 10 KiB |
BIN
image/splash.jpg
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 71 KiB |
|
@ -29,6 +29,7 @@ Fk:loadTranslationTable{
|
||||||
|
|
||||||
["Refresh Room List"] = "刷新房间列表",
|
["Refresh Room List"] = "刷新房间列表",
|
||||||
|
|
||||||
|
["Disable Extension"] = "禁用Lua拓展 (重启后生效)",
|
||||||
["Create Room"] = "创建房间",
|
["Create Room"] = "创建房间",
|
||||||
["Room Name"] = "房间名字",
|
["Room Name"] = "房间名字",
|
||||||
["$RoomName"] = "%1的房间",
|
["$RoomName"] = "%1的房间",
|
||||||
|
@ -65,6 +66,19 @@ Fk:loadTranslationTable{
|
||||||
["Win=%1 Run=%2 Total=%3"] = "胜率%1% 逃率%2% 总场次%3",
|
["Win=%1 Run=%2 Total=%3"] = "胜率%1% 逃率%2% 总场次%3",
|
||||||
["Win=%1\nRun=%2\nTotal=%3"] = "胜率: %1%\n逃率: %2%\n总场次: %3",
|
["Win=%1\nRun=%2\nTotal=%3"] = "胜率: %1%\n逃率: %2%\n总场次: %3",
|
||||||
|
|
||||||
|
["Ban List"] = "禁将方案",
|
||||||
|
["List"] = "方案",
|
||||||
|
["New"] = "新建",
|
||||||
|
["Clear"] = "清空",
|
||||||
|
["Help_Ban_List"] = "导出键会将这个方案的内容复制到剪贴板中;" ..
|
||||||
|
"导入键会自动读取剪贴板,若可以导入则导入,不能导入则报错。",
|
||||||
|
["Export"] = "导出",
|
||||||
|
["Export Success"] = "禁将方案已经复制到剪贴板。",
|
||||||
|
["Import"] = "导入",
|
||||||
|
["Not Legal"] = "导入失败:不是合法的JSON字符串。",
|
||||||
|
["Not JSON"] = "导入失败:数据格式不对。",
|
||||||
|
["Import Success"] = "从剪贴板导入禁将方案成功。",
|
||||||
|
|
||||||
["$OnlineInfo"] = "大厅人数:%1,总在线人数:%2",
|
["$OnlineInfo"] = "大厅人数:%1,总在线人数:%2",
|
||||||
|
|
||||||
["Generals Overview"] = "武将一览",
|
["Generals Overview"] = "武将一览",
|
||||||
|
@ -164,6 +178,11 @@ FreeKill使用的是libgit2的C API,与此同时使用Git完成拓展包的下
|
||||||
["Death audio"] = "阵亡",
|
["Death audio"] = "阵亡",
|
||||||
|
|
||||||
["$WelcomeToLobby"] = "欢迎进入新月杀游戏大厅!",
|
["$WelcomeToLobby"] = "欢迎进入新月杀游戏大厅!",
|
||||||
|
["LuckCardNum"] = "手气卡次数:",
|
||||||
|
["ResponseTime"] = "出手时间:",
|
||||||
|
["GeneralBoxNum"] = "选将框数:",
|
||||||
|
["IncludeFreeAssign"] = "<font color=\"red\">可自由点将</font>",
|
||||||
|
["IncludeDeputy"] = "<font color=\"red\">启用副将机制</font>",
|
||||||
|
|
||||||
-- Room
|
-- Room
|
||||||
["$EnterRoom"] = "成功加入房间。",
|
["$EnterRoom"] = "成功加入房间。",
|
||||||
|
@ -256,12 +275,18 @@ FreeKill使用的是libgit2的C API,与此同时使用Git完成拓展包的下
|
||||||
["Back To Lobby"] = "返回大厅",
|
["Back To Lobby"] = "返回大厅",
|
||||||
["Save Replay"] = "保存录像",
|
["Save Replay"] = "保存录像",
|
||||||
|
|
||||||
|
["Speed Resume"] = "匀速",
|
||||||
|
["Speed Up"] = "加速",
|
||||||
|
["Speed Down"] = "减速",
|
||||||
|
["Pause"] = "暂停",
|
||||||
|
["Resume"] = "继续",
|
||||||
|
|
||||||
["Bulletin Info"] = [==[
|
["Bulletin Info"] = [==[
|
||||||
## v0.2.10
|
## v0.3.0
|
||||||
|
|
||||||
测试用版本,主要的新功能是录像功能。
|
0.3.0版本,新增录像和禁将方案切换功能,同时修复不少bug。
|
||||||
|
|
||||||
这种东西小范围传播就行了,大家还是先玩0.2.9
|
加强谋徐盛。
|
||||||
]==],
|
]==],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,6 +325,7 @@ Fk:loadTranslationTable{
|
||||||
["pile_draw"] = "牌堆",
|
["pile_draw"] = "牌堆",
|
||||||
["pile_discard"] = "弃牌堆",
|
["pile_discard"] = "弃牌堆",
|
||||||
["processing_area"] = "处理区",
|
["processing_area"] = "处理区",
|
||||||
|
["Pile"] = "牌堆",
|
||||||
["Top"] = "牌堆顶",
|
["Top"] = "牌堆顶",
|
||||||
["Bottom"] = "牌堆底",
|
["Bottom"] = "牌堆底",
|
||||||
["Shuffle"] = "洗牌",
|
["Shuffle"] = "洗牌",
|
||||||
|
|
|
@ -59,7 +59,7 @@ function UsableSkill:withinDistanceLimit(player, isattack, card, to)
|
||||||
end
|
end
|
||||||
local temp_suf = table.simpleClone(MarkEnum.TempMarkSuffix)
|
local temp_suf = table.simpleClone(MarkEnum.TempMarkSuffix)
|
||||||
table.insert(temp_suf, "-tmp")
|
table.insert(temp_suf, "-tmp")
|
||||||
return isattack and player:inMyAttackRange(to, self:getDistanceLimit(player, card, to)) or player:distanceTo(to) <= self:getDistanceLimit(player, card, to) or
|
return isattack and player:inMyAttackRange(to) or player:distanceTo(to) <= self:getDistanceLimit(player, card, to) or
|
||||||
(player:getMark(MarkEnum.BypassDistancesLimit) ~= 0 or
|
(player:getMark(MarkEnum.BypassDistancesLimit) ~= 0 or
|
||||||
table.find(temp_suf, function(s)
|
table.find(temp_suf, function(s)
|
||||||
return player:getMark(MarkEnum.BypassDistancesLimit .. s) ~= 0
|
return player:getMark(MarkEnum.BypassDistancesLimit .. s) ~= 0
|
||||||
|
|
|
@ -121,10 +121,13 @@ local function _waitForReply(player, timeout)
|
||||||
end
|
end
|
||||||
local rest = timeout * 1000 - (os.getms() - start) / 1000
|
local rest = timeout * 1000 - (os.getms() - start) / 1000
|
||||||
if timeout and rest <= 0 then
|
if timeout and rest <= 0 then
|
||||||
player._timewaste_count = player._timewaste_count + 1
|
if timeout >= 15 then
|
||||||
|
player._timewaste_count = player._timewaste_count + 1
|
||||||
|
end
|
||||||
player.serverplayer:setThinking(false)
|
player.serverplayer:setThinking(false)
|
||||||
|
|
||||||
if player._timewaste_count >= 3 then
|
if player._timewaste_count >= 3 then
|
||||||
|
player._timewaste_count = 0
|
||||||
player.serverplayer:emitKick()
|
player.serverplayer:emitKick()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,7 @@ local snatchSkill = fk.CreateActiveSkill{
|
||||||
mod_target_filter = function(self, to_select, selected, user, card, distance_limited)
|
mod_target_filter = function(self, to_select, selected, user, card, distance_limited)
|
||||||
local player = Fk:currentRoom():getPlayerById(to_select)
|
local player = Fk:currentRoom():getPlayerById(to_select)
|
||||||
local from = Fk:currentRoom():getPlayerById(user)
|
local from = Fk:currentRoom():getPlayerById(user)
|
||||||
return from ~= player and not (player:isAllNude() or (distance_limited and not self:withinDistanceLimit(from, true, card, player)))
|
return from ~= player and not (player:isAllNude() or (distance_limited and not self:withinDistanceLimit(from, false, card, player)))
|
||||||
end,
|
end,
|
||||||
target_filter = function(self, to_select, selected, _, card)
|
target_filter = function(self, to_select, selected, _, card)
|
||||||
if #selected == 0 then
|
if #selected == 0 then
|
||||||
|
|
|
@ -508,6 +508,11 @@ void Server::handleNameAndPassword(ClientSocket *client, const QString &name,
|
||||||
arr << player->getAvatar();
|
arr << player->getAvatar();
|
||||||
player->doNotify("Setup", JsonArray2Bytes(arr));
|
player->doNotify("Setup", JsonArray2Bytes(arr));
|
||||||
|
|
||||||
|
player->doNotify("SetServerSettings", JsonArray2Bytes({
|
||||||
|
getConfig("motd"),
|
||||||
|
getConfig("hiddenPacks"),
|
||||||
|
}));
|
||||||
|
|
||||||
lobby()->addPlayer(player);
|
lobby()->addPlayer(player);
|
||||||
} else {
|
} else {
|
||||||
qInfo() << client->peerAddress() << "lost connection:" << error_msg;
|
qInfo() << client->peerAddress() << "lost connection:" << error_msg;
|
||||||
|
@ -613,6 +618,8 @@ void Server::readConfig() {
|
||||||
SET_DEFAULT_CONFIG("iconUrl", "https://img1.imgtp.com/2023/07/01/DGUdj8eu.png");
|
SET_DEFAULT_CONFIG("iconUrl", "https://img1.imgtp.com/2023/07/01/DGUdj8eu.png");
|
||||||
SET_DEFAULT_CONFIG("capacity", 100);
|
SET_DEFAULT_CONFIG("capacity", 100);
|
||||||
SET_DEFAULT_CONFIG("tempBanTime", 20);
|
SET_DEFAULT_CONFIG("tempBanTime", 20);
|
||||||
|
SET_DEFAULT_CONFIG("motd", "Welcome!");
|
||||||
|
SET_DEFAULT_CONFIG("hiddenPacks", QJsonArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonValue Server::getConfig(const QString &key) { return config.value(key); }
|
QJsonValue Server::getConfig(const QString &key) { return config.value(key); }
|
||||||
|
|