|
@ -0,0 +1,132 @@
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import Fk
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
anchors.fill: parent
|
||||||
|
property point start: Qt.point(0, 0)
|
||||||
|
property point end: Qt.point(0, 0)
|
||||||
|
property alias running: pointToAnimation.running
|
||||||
|
|
||||||
|
signal finished()
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: egg
|
||||||
|
source: SkinBank.PIXANIM_DIR + "/egg/egg"
|
||||||
|
x: start.x - width / 2
|
||||||
|
y: start.y - height / 2
|
||||||
|
scale: 0.7
|
||||||
|
opacity: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: whip
|
||||||
|
x: end.x - width / 2
|
||||||
|
y: end.y - height / 2
|
||||||
|
property int idx: 1
|
||||||
|
opacity: 0
|
||||||
|
scale: 0.7
|
||||||
|
source: SkinBank.PIXANIM_DIR + "/egg/egg" + idx
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
id: pointToAnimation
|
||||||
|
running: false
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: 400
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation {
|
||||||
|
duration: 350
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptAction {
|
||||||
|
script: Backend.playSound("./audio/system/fly" + (Math.floor(Math.random() * 2) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "scale"
|
||||||
|
to: 0.4
|
||||||
|
duration: 500
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "x"
|
||||||
|
to: end.x - egg.width / 2
|
||||||
|
duration: 500
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "y"
|
||||||
|
to: end.y - egg.height / 2
|
||||||
|
duration: 500
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "rotation"
|
||||||
|
to: 360
|
||||||
|
duration: 250
|
||||||
|
loops: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 400 }
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptAction {
|
||||||
|
script: Backend.playSound("./audio/system/egg" + (Math.floor(Math.random() * 2) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 160 }
|
||||||
|
ScriptAction { script: whip.idx++; }
|
||||||
|
loops: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation { duration: 160 }
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: whip
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation { duration: 300 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: whip
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onStopped: {
|
||||||
|
root.visible = false;
|
||||||
|
root.finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,169 @@
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import Fk
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
anchors.fill: parent
|
||||||
|
property point start: Qt.point(0, 0)
|
||||||
|
property point end: Qt.point(0, 0)
|
||||||
|
property alias running: pointToAnimation.running
|
||||||
|
|
||||||
|
signal finished()
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: egg
|
||||||
|
source: SkinBank.PIXANIM_DIR + "/flower/egg"
|
||||||
|
x: start.x - width / 2
|
||||||
|
y: start.y - height / 2
|
||||||
|
scale: 0.7
|
||||||
|
rotation: Math.atan(Math.abs(end.y - start.y) / Math.abs(end.x - start.x))
|
||||||
|
/ Math.PI * 180 + 90 * (end.x > start.x ? 1 : -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: whip
|
||||||
|
x: end.x - width / 2
|
||||||
|
y: end.y - height / 2
|
||||||
|
property int idx: 1
|
||||||
|
opacity: 0
|
||||||
|
scale: 0.7
|
||||||
|
source: SkinBank.PIXANIM_DIR + "/flower/egg" + idx
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: star
|
||||||
|
opacity: 0
|
||||||
|
source: SkinBank.PIXANIM_DIR + "/flower/star"
|
||||||
|
scale: 0.7
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
id: pointToAnimation
|
||||||
|
running: false
|
||||||
|
ScriptAction {
|
||||||
|
script: Backend.playSound("./audio/system/fly" + (Math.floor(Math.random() * 2) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "scale"
|
||||||
|
to: 0.5
|
||||||
|
duration: 360
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "x"
|
||||||
|
to: end.x - egg.width / 2
|
||||||
|
duration: 360
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "y"
|
||||||
|
to: end.y - egg.height / 2
|
||||||
|
duration: 360
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 300 }
|
||||||
|
PropertyAnimation {
|
||||||
|
target: egg
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 60
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptAction {
|
||||||
|
script: Backend.playSound("./audio/system/flower" + (Math.floor(Math.random() * 2) + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParallelAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
SequentialAnimation {
|
||||||
|
PauseAnimation { duration: 180 }
|
||||||
|
ScriptAction { script: whip.idx++; }
|
||||||
|
loops: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptAction {
|
||||||
|
script: {
|
||||||
|
star.x = end.x - 25;
|
||||||
|
star.y = end.y - 35;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: star
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation { duration: 100 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: star
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptAction {
|
||||||
|
script: {
|
||||||
|
star.x = end.x - 10;
|
||||||
|
star.y = end.y - 20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: star
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation { duration: 100 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: star
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: whip
|
||||||
|
property: "opacity"
|
||||||
|
to: 1
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
PauseAnimation { duration: 1100 }
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: whip
|
||||||
|
property: "opacity"
|
||||||
|
to: 0
|
||||||
|
duration: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onStopped: {
|
||||||
|
root.visible = false;
|
||||||
|
root.finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
module Fk.ChatAnim
|
||||||
|
Egg 1.0 Egg.qml
|
|
@ -8,6 +8,7 @@ Flickable {
|
||||||
id: root
|
id: root
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
property var extra_data: ({})
|
property var extra_data: ({})
|
||||||
|
property int pid
|
||||||
|
|
||||||
signal finish()
|
signal finish()
|
||||||
|
|
||||||
|
@ -19,6 +20,24 @@ Flickable {
|
||||||
width: parent.width - 40
|
width: parent.width - 40
|
||||||
x: 20
|
x: 20
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Button {
|
||||||
|
text: Backend.translate("Give Flower")
|
||||||
|
onClicked: {
|
||||||
|
root.givePresent("Flower");
|
||||||
|
root.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: Backend.translate("Give Egg")
|
||||||
|
onClicked: {
|
||||||
|
root.givePresent("Egg");
|
||||||
|
root.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: player details
|
// TODO: player details
|
||||||
Text {
|
Text {
|
||||||
id: screenName
|
id: screenName
|
||||||
|
@ -40,6 +59,16 @@ Flickable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function givePresent(p) {
|
||||||
|
ClientInstance.notifyServer(
|
||||||
|
"Chat",
|
||||||
|
JSON.stringify({
|
||||||
|
type: 2,
|
||||||
|
msg: "$!" + p + ":" + pid
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
onExtra_dataChanged: {
|
onExtra_dataChanged: {
|
||||||
if (!extra_data.photo) return;
|
if (!extra_data.photo) return;
|
||||||
screenName.text = "";
|
screenName.text = "";
|
||||||
|
@ -47,6 +76,9 @@ Flickable {
|
||||||
|
|
||||||
let id = extra_data.photo.playerid;
|
let id = extra_data.photo.playerid;
|
||||||
if (id == 0) return;
|
if (id == 0) return;
|
||||||
|
root.pid = id;
|
||||||
|
|
||||||
|
screenName.text = extra_data.photo.screenName;
|
||||||
|
|
||||||
let data = JSON.parse(Backend.callLuaFunction("GetPlayerSkills", [id]));
|
let data = JSON.parse(Backend.callLuaFunction("GetPlayerSkills", [id]));
|
||||||
data.forEach(t => {
|
data.forEach(t => {
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
import Fk.Pages
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
property bool isLobby: false
|
property bool isLobby: false
|
||||||
|
@ -26,6 +28,25 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GridView {
|
||||||
|
id: emojiSelector
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 120
|
||||||
|
cellHeight: 48
|
||||||
|
cellWidth: 48
|
||||||
|
model: 49
|
||||||
|
visible: false
|
||||||
|
delegate: ItemDelegate {
|
||||||
|
Image {
|
||||||
|
height: 32; width: 32
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: "../../image/emoji/" + index
|
||||||
|
}
|
||||||
|
onClicked: chatEdit.insert(chatEdit.cursorPosition, "{emoji" + index + "}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
Rectangle {
|
Rectangle {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.preferredHeight: 28
|
Layout.preferredHeight: 28
|
||||||
|
@ -35,6 +56,7 @@ Rectangle {
|
||||||
border.color: "#A6967A"
|
border.color: "#A6967A"
|
||||||
|
|
||||||
TextInput {
|
TextInput {
|
||||||
|
id: chatEdit
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 6
|
anchors.margins: 6
|
||||||
color: "white"
|
color: "white"
|
||||||
|
@ -55,5 +77,17 @@ Rectangle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MetroButton {
|
||||||
|
id: emojiBtn
|
||||||
|
text: "😃"
|
||||||
|
onClicked: emojiSelector.visible = !emojiSelector.visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetroButton {
|
||||||
|
text: "✔️"
|
||||||
|
onClicked: chatEdit.accepted();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,6 +277,8 @@ Item {
|
||||||
|
|
||||||
function addToChat(pid, raw, msg) {
|
function addToChat(pid, raw, msg) {
|
||||||
if (raw.type !== 1) return;
|
if (raw.type !== 1) return;
|
||||||
|
msg = msg.replace(/\{emoji([0-9]+)\}/g, '<img src="../../image/emoji/$1.png" height="24" width="24" />');
|
||||||
|
raw.msg = raw.msg.replace(/\{emoji([0-9]+)\}/g, '<img src="../../image/emoji/$1.png" height="24" width="24" />');
|
||||||
lobbyChat.append(msg);
|
lobbyChat.append(msg);
|
||||||
danmaku.sendLog("<b>" + raw.userName + "</b>: " + raw.msg);
|
danmaku.sendLog("<b>" + raw.userName + "</b>: " + raw.msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import Fk.Common
|
||||||
import Fk.RoomElement
|
import Fk.RoomElement
|
||||||
import "RoomLogic.js" as Logic
|
import "RoomLogic.js" as Logic
|
||||||
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: roomScene
|
id: roomScene
|
||||||
|
|
||||||
|
@ -693,6 +692,9 @@ Item {
|
||||||
function addToChat(pid, raw, msg) {
|
function addToChat(pid, raw, msg) {
|
||||||
if (raw.type === 1) return;
|
if (raw.type === 1) return;
|
||||||
|
|
||||||
|
msg = msg.replace(/\{emoji([0-9]+)\}/g, '<img src="../../image/emoji/$1.png" height="24" width="24" />');
|
||||||
|
raw.msg = raw.msg.replace(/\{emoji([0-9]+)\}/g, '<img src="../../image/emoji/$1.png" height="24" width="24" />');
|
||||||
|
|
||||||
if (raw.msg.startsWith("$")) {
|
if (raw.msg.startsWith("$")) {
|
||||||
if (specialChat(pid, raw, raw.msg.slice(1))) return;
|
if (specialChat(pid, raw, raw.msg.slice(1))) return;
|
||||||
}
|
}
|
||||||
|
@ -710,20 +712,32 @@ Item {
|
||||||
function specialChat(pid, data, msg) {
|
function specialChat(pid, data, msg) {
|
||||||
// skill audio: %s%d
|
// skill audio: %s%d
|
||||||
// death audio: ~%s
|
// death audio: ~%s
|
||||||
// something special: .%s:...
|
// something special: !%s:...
|
||||||
|
|
||||||
let time = data.time;
|
let time = data.time;
|
||||||
let userName = data.userName;
|
let userName = data.userName;
|
||||||
let general = Backend.translate(data.general);
|
let general = Backend.translate(data.general);
|
||||||
|
|
||||||
if (msg.startsWith(".")) {
|
if (msg.startsWith("!")) {
|
||||||
let splited = msg.split(":");
|
let splited = msg.split(":");
|
||||||
let type = splited[0].slice(1);
|
let type = splited[0].slice(1);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "egg": {
|
case "Egg":
|
||||||
return true;
|
case "Flower": {
|
||||||
}
|
const fromId = pid;
|
||||||
case "flower": {
|
const toId = parseInt(splited[1]);
|
||||||
|
const component = Qt.createComponent("../ChatAnim/" + type + ".qml");
|
||||||
|
//if (component.status !== Component.Ready)
|
||||||
|
// return false;
|
||||||
|
|
||||||
|
const fromItem = Logic.getPhoto(fromId);
|
||||||
|
const fromPos = mapFromItem(fromItem, fromItem.width / 2, fromItem.height / 2);
|
||||||
|
const toItem = Logic.getPhoto(toId);
|
||||||
|
const toPos = mapFromItem(toItem, toItem.width / 2, toItem.height / 2);
|
||||||
|
const egg = component.createObject(roomScene, { start: fromPos, end: toPos });
|
||||||
|
egg.finished.connect(() => egg.destroy());
|
||||||
|
egg.running = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -68,14 +68,15 @@ function arrangePhotos() {
|
||||||
|
|
||||||
function doOkButton() {
|
function doOkButton() {
|
||||||
if (roomScene.state == "playing" || roomScene.state == "responding") {
|
if (roomScene.state == "playing" || roomScene.state == "responding") {
|
||||||
replyToServer(JSON.stringify(
|
const reply = JSON.stringify(
|
||||||
{
|
{
|
||||||
card: dashboard.getSelectedCard(),
|
card: dashboard.getSelectedCard(),
|
||||||
targets: selected_targets,
|
targets: selected_targets,
|
||||||
special_skill: roomScene.getCurrentCardUseMethod(),
|
special_skill: roomScene.getCurrentCardUseMethod(),
|
||||||
interaction_data: roomScene.skillInteraction.item ? roomScene.skillInteraction.item.answer : undefined,
|
interaction_data: roomScene.skillInteraction.item ? roomScene.skillInteraction.item.answer : undefined,
|
||||||
}
|
}
|
||||||
));
|
);
|
||||||
|
replyToServer(reply);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (roomScene.extra_data.luckCard) {
|
if (roomScene.extra_data.luckCard) {
|
||||||
|
@ -823,6 +824,7 @@ callbacks["AskForUseActiveSkill"] = function(jsonData) {
|
||||||
let skill_name = data[0];
|
let skill_name = data[0];
|
||||||
let prompt = data[1];
|
let prompt = data[1];
|
||||||
let cancelable = data[2];
|
let cancelable = data[2];
|
||||||
|
let extra_data = data[3] ?? {};
|
||||||
if (prompt === "") {
|
if (prompt === "") {
|
||||||
roomScene.promptText = Backend.translate("#AskForUseActiveSkill")
|
roomScene.promptText = Backend.translate("#AskForUseActiveSkill")
|
||||||
.arg(Backend.translate(skill_name));
|
.arg(Backend.translate(skill_name));
|
||||||
|
@ -832,8 +834,11 @@ callbacks["AskForUseActiveSkill"] = function(jsonData) {
|
||||||
|
|
||||||
roomScene.respond_play = false;
|
roomScene.respond_play = false;
|
||||||
roomScene.state = "responding";
|
roomScene.state = "responding";
|
||||||
|
roomScene.responding_card = ".";
|
||||||
roomScene.autoPending = true;
|
roomScene.autoPending = true;
|
||||||
dashboard.startPending(skill_name);
|
roomScene.extra_data = extra_data;
|
||||||
|
// dashboard.startPending(skill_name);
|
||||||
|
roomScene.activateSkill(skill_name, true);
|
||||||
cancelButton.enabled = cancelable;
|
cancelButton.enabled = cancelable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,6 @@ Item {
|
||||||
config.winWidth = width;
|
config.winWidth = width;
|
||||||
config.winHeight = height;
|
config.winHeight = height;
|
||||||
config.saveConf();
|
config.saveConf();
|
||||||
Backend.quitLobby();
|
Backend.quitLobby(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 6.2 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 7.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
|
@ -40,6 +40,9 @@ Fk:loadTranslationTable{
|
||||||
["General Packages"] = "武将拓展包",
|
["General Packages"] = "武将拓展包",
|
||||||
["Card Packages"] = "卡牌拓展包",
|
["Card Packages"] = "卡牌拓展包",
|
||||||
|
|
||||||
|
["Give Flower"] = "送花",
|
||||||
|
["Give Egg"] = "砸蛋",
|
||||||
|
|
||||||
["$OnlineInfo"] = "大厅人数:%1,总在线人数:%2",
|
["$OnlineInfo"] = "大厅人数:%1,总在线人数:%2",
|
||||||
|
|
||||||
["Generals Overview"] = "武将一览",
|
["Generals Overview"] = "武将一览",
|
||||||
|
|
|
@ -871,7 +871,7 @@ function Room:askForUseActiveSkill(player, skill_name, prompt, cancelable, extra
|
||||||
cancelable = cancelable or false
|
cancelable = cancelable or false
|
||||||
extra_data = extra_data or {}
|
extra_data = extra_data or {}
|
||||||
local skill = Fk.skills[skill_name]
|
local skill = Fk.skills[skill_name]
|
||||||
if not (skill and skill:isInstanceOf(ActiveSkill)) then
|
if not (skill and (skill:isInstanceOf(ActiveSkill) or skill:isInstanceOf(ViewAsSkill))) then
|
||||||
print("Attempt ask for use non-active skill: " .. skill_name)
|
print("Attempt ask for use non-active skill: " .. skill_name)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
@ -894,11 +894,18 @@ function Room:askForUseActiveSkill(player, skill_name, prompt, cancelable, extra
|
||||||
local card_data = json.decode(card)
|
local card_data = json.decode(card)
|
||||||
local selected_cards = card_data.subcards
|
local selected_cards = card_data.subcards
|
||||||
self:doIndicate(player.id, targets)
|
self:doIndicate(player.id, targets)
|
||||||
|
|
||||||
|
if skill.interaction then
|
||||||
|
skill.interaction.data = data.interaction_data
|
||||||
|
end
|
||||||
|
|
||||||
|
if skill:isInstanceOf(ActiveSkill) then
|
||||||
skill:onUse(self, {
|
skill:onUse(self, {
|
||||||
from = player.id,
|
from = player.id,
|
||||||
cards = selected_cards,
|
cards = selected_cards,
|
||||||
tos = targets,
|
tos = targets,
|
||||||
})
|
})
|
||||||
|
end
|
||||||
|
|
||||||
return true, {
|
return true, {
|
||||||
cards = selected_cards,
|
cards = selected_cards,
|
||||||
|
@ -906,6 +913,8 @@ function Room:askForUseActiveSkill(player, skill_name, prompt, cancelable, extra
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Room.askForUseViewAsSkill = Room.askForUseActiveSkill
|
||||||
|
|
||||||
--- 询问一名角色弃牌。
|
--- 询问一名角色弃牌。
|
||||||
---
|
---
|
||||||
--- 在这个函数里面牌已经被弃掉了。
|
--- 在这个函数里面牌已经被弃掉了。
|
||||||
|
|
|
@ -78,9 +78,18 @@ local test_active = fk.CreateActiveSkill{
|
||||||
on_use = function(self, room, effect)
|
on_use = function(self, room, effect)
|
||||||
--room:doSuperLightBox("packages/test/qml/Test.qml")
|
--room:doSuperLightBox("packages/test/qml/Test.qml")
|
||||||
local from = room:getPlayerById(effect.from)
|
local from = room:getPlayerById(effect.from)
|
||||||
local to = room:getPlayerById(effect.tos[1])
|
--local to = room:getPlayerById(effect.tos[1])
|
||||||
-- room:swapSeat(from, to)
|
-- room:swapSeat(from, to)
|
||||||
from:control(to)
|
--from:control(to)
|
||||||
|
local success, dat = room:askForUseViewAsSkill(from, "test_vs", nil, true)
|
||||||
|
if success then
|
||||||
|
local card = Fk.skills["test_vs"]:viewAs(dat.cards)
|
||||||
|
room:useCard{
|
||||||
|
from = from.id,
|
||||||
|
tos = table.map(dat.targets, function(e) return {e} end),
|
||||||
|
card = card,
|
||||||
|
}
|
||||||
|
end
|
||||||
-- from:pindian({to})
|
-- from:pindian({to})
|
||||||
-- local result = room:askForCustomDialog(from, "simayi", "packages/test/qml/TestDialog.qml", "Hello, world. FROM LUA")
|
-- local result = room:askForCustomDialog(from, "simayi", "packages/test/qml/TestDialog.qml", "Hello, world. FROM LUA")
|
||||||
-- print(result)
|
-- print(result)
|
||||||
|
|
|
@ -106,10 +106,10 @@ void QmlBackend::joinServer(QString address) {
|
||||||
client->connectToHost(addr, port);
|
client->connectToHost(addr, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlBackend::quitLobby() {
|
void QmlBackend::quitLobby(bool close) {
|
||||||
if (ClientInstance)
|
if (ClientInstance)
|
||||||
ClientInstance->deleteLater();
|
delete ClientInstance;
|
||||||
if (ServerInstance)
|
if (ServerInstance && close)
|
||||||
ServerInstance->deleteLater();
|
ServerInstance->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
Q_INVOKABLE void joinServer(QString address);
|
Q_INVOKABLE void joinServer(QString address);
|
||||||
|
|
||||||
// Lobby
|
// Lobby
|
||||||
Q_INVOKABLE void quitLobby();
|
Q_INVOKABLE void quitLobby(bool close = true);
|
||||||
|
|
||||||
// lua --> qml
|
// lua --> qml
|
||||||
void emitNotifyUI(const QString &command, const QString &jsonData);
|
void emitNotifyUI(const QString &command, const QString &jsonData);
|
||||||
|
|