先这么写
This commit is contained in:
parent
1005863b1e
commit
874e681868
|
@ -0,0 +1,169 @@
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Fk.Pages
|
||||||
|
|
||||||
|
GraphicsBox {
|
||||||
|
id: root
|
||||||
|
property string prompt
|
||||||
|
property var data
|
||||||
|
property var old_cards: []
|
||||||
|
property var cards: []
|
||||||
|
property var areaNames: []
|
||||||
|
property int length: 1
|
||||||
|
property var extra_data
|
||||||
|
property bool cancelable: true
|
||||||
|
property string yuqi_type
|
||||||
|
property int padding: 25
|
||||||
|
|
||||||
|
signal returnResults(var ids)
|
||||||
|
|
||||||
|
title.text: Backend.callLuaFunction("YuqiPrompt", [yuqi_type, data, extra_data])
|
||||||
|
width: body.width + padding * 2
|
||||||
|
height: title.height + body.height + padding * 2
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: body
|
||||||
|
x: padding
|
||||||
|
y: parent.height - padding - height
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: areaRepeater
|
||||||
|
model: old_cards
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: 5
|
||||||
|
|
||||||
|
property int areaCapacity: modelData
|
||||||
|
property string areaName: index < data.length ? qsTr(areaNames.name[index]) : ""
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: "#6B5D42"
|
||||||
|
width: 20
|
||||||
|
height: 100
|
||||||
|
radius: 5
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.fill: parent
|
||||||
|
width: 20
|
||||||
|
height: 100
|
||||||
|
text: Backend.translate(areaName)
|
||||||
|
color: "white"
|
||||||
|
font.family: fontLibian.name
|
||||||
|
font.pixelSize: 18
|
||||||
|
style: Text.Outline
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: cardRepeater
|
||||||
|
model: areaCapacity
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
color: "#1D1E19"
|
||||||
|
width: 93
|
||||||
|
height: 130
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: Backend.translate(areaName)
|
||||||
|
color: "#59574D"
|
||||||
|
width: parent.width * 0.8
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property alias cardRepeater: cardRepeater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Row {
|
||||||
|
anchors.margins: 8
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
spacing: 32
|
||||||
|
|
||||||
|
MetroButton {
|
||||||
|
width: 120
|
||||||
|
height: 35
|
||||||
|
text: Backend.translate("OK")
|
||||||
|
enabled: {
|
||||||
|
return JSON.parse(Backend.callLuaFunction(
|
||||||
|
"YuqiFeasible",
|
||||||
|
[root.yuqi_type, root.cards, root.data, root.extra_data]
|
||||||
|
));
|
||||||
|
}
|
||||||
|
onClicked: root.getResult(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
MetroButton {
|
||||||
|
width: 120
|
||||||
|
height: 35
|
||||||
|
text: Backend.translate("Cancel")
|
||||||
|
enabled: root.cancelable
|
||||||
|
onClicked: root.getResult(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: cardItem
|
||||||
|
model: cards
|
||||||
|
|
||||||
|
CardItem {
|
||||||
|
x: index
|
||||||
|
y: -1
|
||||||
|
cid: modelData.cid
|
||||||
|
name: modelData.name
|
||||||
|
suit: modelData.suit
|
||||||
|
number: modelData.number
|
||||||
|
draggable: {
|
||||||
|
return JSON.parse(Backend.callLuaFunction(
|
||||||
|
"YuqiOutFilter",
|
||||||
|
[root.yuqi_type, model.cid, root.cards, root.extra_data]
|
||||||
|
));
|
||||||
|
}
|
||||||
|
onReleased: arrangeCards(model.cid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function arrangeCards(var moved_card) {
|
||||||
|
let pos;
|
||||||
|
for (i = 0; i < cards.length; i++) {
|
||||||
|
let pile = cards[i];
|
||||||
|
if (moved_card != null) {
|
||||||
|
if (pile[j] == moved_card)
|
||||||
|
}
|
||||||
|
for (j = 0; j < pile.length; j++) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let box, pos, pile;
|
||||||
|
for (j = 0; j < areaRepeater.count; j++) {
|
||||||
|
pile = areaRepeater.itemAt(j);
|
||||||
|
if (pile.y === 0){
|
||||||
|
pile.y = j * 150
|
||||||
|
}
|
||||||
|
for (i = 0; i < result[j].length; i++) {
|
||||||
|
box = pile.cardRepeater.itemAt(i);
|
||||||
|
pos = mapFromItem(pile, box.x, box.y);
|
||||||
|
card = result[j][i];
|
||||||
|
card.origX = pos.x;
|
||||||
|
card.origY = pos.y;
|
||||||
|
card.goBack(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getResult(var bol) {
|
||||||
|
if (!bol) return old_cards;
|
||||||
|
return cards;
|
||||||
|
}
|
||||||
|
}
|
|
@ -748,4 +748,29 @@ function GetQmlMark(mtype, name, value, p)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function YuqiPrompt(yuqi_type, data, extra_data)
|
||||||
|
local yuqi = Fk.yuqi_methods[yuqi_type]
|
||||||
|
if not yuqi or not yuqi.prompt then return "" end
|
||||||
|
if type(yuqi.prompt) == "string" then return Fk:translate(yuqi.prompt) end
|
||||||
|
return yuqi.prompt(data, extra_data)
|
||||||
|
end
|
||||||
|
|
||||||
|
function YuqiEntryFilter(yuqi_type, to_select, position, to_pile, data, extra_data)
|
||||||
|
local yuqi = Fk.yuqi_methods[yuqi_type]
|
||||||
|
if not yuqi then return "false" end
|
||||||
|
return json.encode(yuqi.entry_filter(to_select, position, to_pile, data, extra_data))
|
||||||
|
end
|
||||||
|
|
||||||
|
function YuqiOutFilter(yuqi_type, to_select, data, extra_data)
|
||||||
|
local yuqi = Fk.yuqi_methods[yuqi_type]
|
||||||
|
if not yuqi then return "false" end
|
||||||
|
return json.encode(yuqi.out_filter(to_select, data, extra_data))
|
||||||
|
end
|
||||||
|
|
||||||
|
function YuqiFeasible(yuqi_type, current, origin, extra_data)
|
||||||
|
local yuqi = Fk.yuqi_methods[yuqi_type]
|
||||||
|
if not yuqi then return "false" end
|
||||||
|
return json.encode(yuqi.feasible(current, origin, extra_data))
|
||||||
|
end
|
||||||
|
|
||||||
dofile "lua/client/i18n/init.lua"
|
dofile "lua/client/i18n/init.lua"
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
---@field private _custom_events any[] @ 自定义事件列表
|
---@field private _custom_events any[] @ 自定义事件列表
|
||||||
---@field public poxi_methods table<string, PoxiSpec> @ “魄袭”框操作方法表
|
---@field public poxi_methods table<string, PoxiSpec> @ “魄袭”框操作方法表
|
||||||
---@field public qml_marks table<string, QmlMarkSpec> @ 自定义Qml标记的表
|
---@field public qml_marks table<string, QmlMarkSpec> @ 自定义Qml标记的表
|
||||||
|
---@field public yuqi_methods table<string, YuqiSpec> @ “隅泣”框操作方法表
|
||||||
local Engine = class("Engine")
|
local Engine = class("Engine")
|
||||||
|
|
||||||
--- Engine的构造函数。
|
--- Engine的构造函数。
|
||||||
|
@ -343,6 +344,7 @@ function Engine:addGameEvent(name, pfunc, mfunc, cfunc, efunc)
|
||||||
table.insert(self._custom_events, { name = name, p = pfunc, m = mfunc, c = cfunc, e = efunc })
|
table.insert(self._custom_events, { name = name, p = pfunc, m = mfunc, c = cfunc, e = efunc })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- 向Engine中添加一个魄袭用方法。
|
||||||
---@param spec PoxiSpec
|
---@param spec PoxiSpec
|
||||||
function Engine:addPoxiMethod(spec)
|
function Engine:addPoxiMethod(spec)
|
||||||
assert(type(spec.name) == "string")
|
assert(type(spec.name) == "string")
|
||||||
|
@ -356,6 +358,8 @@ function Engine:addPoxiMethod(spec)
|
||||||
spec.post_select = spec.post_select or function(s) return s end
|
spec.post_select = spec.post_select or function(s) return s end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- 向Engine中添加一个隅泣用方法。
|
||||||
|
---@param spec QmlMarkSpec
|
||||||
function Engine:addQmlMark(spec)
|
function Engine:addQmlMark(spec)
|
||||||
assert(type(spec.name) == "string")
|
assert(type(spec.name) == "string")
|
||||||
if self.qml_marks[spec.name] then
|
if self.qml_marks[spec.name] then
|
||||||
|
@ -364,6 +368,16 @@ function Engine:addQmlMark(spec)
|
||||||
self.qml_marks[spec.name] = spec
|
self.qml_marks[spec.name] = spec
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- 向Engine中添加一个隅泣用方法。
|
||||||
|
---@param spec YuqiSpec
|
||||||
|
function Engine:addYuqiMethod(spec)
|
||||||
|
assert(type(spec.name) == "string")
|
||||||
|
assert(type(spec.feasible) == "function")
|
||||||
|
self.yuqi_methods[spec.name] = spec
|
||||||
|
spec.entry_filter = spec.entry_filter or function() return true end
|
||||||
|
spec.out_filter = spec.out_filter or function() return true end
|
||||||
|
end
|
||||||
|
|
||||||
--- 从已经开启的拓展包中,随机选出若干名武将。
|
--- 从已经开启的拓展包中,随机选出若干名武将。
|
||||||
---
|
---
|
||||||
--- 对于同名武将不会重复选取。
|
--- 对于同名武将不会重复选取。
|
||||||
|
|
|
@ -608,3 +608,10 @@ end
|
||||||
---@field name string
|
---@field name string
|
||||||
---@field qml_path string | fun(name: string, value?: any, player?: Player): string
|
---@field qml_path string | fun(name: string, value?: any, player?: Player): string
|
||||||
---@field how_to_show fun(name: string, value?: any, player?: Player): string?
|
---@field how_to_show fun(name: string, value?: any, player?: Player): string?
|
||||||
|
|
||||||
|
---@class YuqiSpec
|
||||||
|
---@field name string
|
||||||
|
---@field feasible fun(current_data: any, old_data: any, extra_data: any): bool
|
||||||
|
---@field entry_filter fun(card: int, pos: int, pile: int[], data: any, extra_data: any): bool
|
||||||
|
---@field out_filter fun(card: int, data: any, extra_data: any): bool
|
||||||
|
---@field prompt? string | fun(data: any, extra_data: any): string
|
Loading…
Reference in New Issue