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