diff --git a/Fk/Pages/Lobby.qml b/Fk/Pages/Lobby.qml
index 3140d411..9e73489c 100644
--- a/Fk/Pages/Lobby.qml
+++ b/Fk/Pages/Lobby.qml
@@ -84,7 +84,10 @@ Item {
text: (playerNum < capacity) ? Backend.translate("Enter") :
Backend.translate("Observe")
+ enabled: !opTimer.running
+
onClicked: {
+ opTimer.start();
if (hasPassword) {
lobby_dialog.sourceComponent = enterPassword;
lobby_dialog.item.roomId = roomId;
diff --git a/Fk/Pages/Room.qml b/Fk/Pages/Room.qml
index 9f4f1157..b2d9798c 100644
--- a/Fk/Pages/Room.qml
+++ b/Fk/Pages/Room.qml
@@ -81,15 +81,13 @@ Item {
}
}
- ToolButton {
+ Button {
id: menuButton
anchors.top: parent.top
anchors.topMargin: 12
anchors.right: parent.right
- anchors.rightMargin: 36
- icon.source: AppPath + "/image/modmaker/menu"
- icon.width: 36
- icon.height: 36
+ anchors.rightMargin: 12
+ text: Backend.translate("Menu")
onClicked: {
if (menuContainer.visible){
menuContainer.close();
@@ -98,122 +96,48 @@ Item {
}
}
- background.implicitWidth: 60
- background.implicitHeight: 60
-
Menu {
id: menuContainer
y: menuButton.height - 12
- width: 115
- height: menuRow.height
- verticalPadding: 0
- spacing: 15
- z: 2
- background: Rectangle {
- implicitWidth: 200
- implicitHeight: 40
- color: "transparent"
- border.color: "transparent"
+ width: 100
+
+ MenuItem {
+ id: quitButton
+ text: Backend.translate("Quit")
+ onClicked: {
+ if (config.replaying) {
+ Backend.controlReplayer("shutdown");
+ mainStack.pop();
+ } else if (config.observing) {
+ ClientInstance.notifyServer("QuitRoom", "[]");
+ } else {
+ quitDialog.open();
+ }
+ }
}
- Column {
- id: menuRow
- width: menuContainer.width
- Layout.fillWidth: true
- spacing: 7
-
- Button {
- id: quitButton
- text: Backend.translate("Quit")
- font.pixelSize: 28
- Layout.fillWidth: true
- width: menuContainer.width
- height: menuContainer.width * 0.65
- onClicked: {
- if (config.replaying) {
- Backend.controlReplayer("shutdown");
- mainStack.pop();
- } else if (config.observing) {
- ClientInstance.notifyServer("QuitRoom", "[]");
+ MenuItem {
+ id: surrenderButton
+ enabled: !config.observing && !config.replaying
+ text: Backend.translate("Surrender")
+ onClicked: {
+ if (isStarted && !getPhoto(Self.id).dead) {
+ const surrenderCheck = JSON.parse(Backend.callLuaFunction('CheckSurrenderAvailable', [miscStatus.playedTime]));
+ if (!surrenderCheck.length) {
+ surrenderDialog.informativeText = Backend.translate('Surrender is disabled in this mode');
} else {
- quitDialog.open();
+ surrenderDialog.informativeText = surrenderCheck.map(str => `${Backend.translate(str.text)}(${str.passed ? '√' : '×'})`).join('
');
}
+ surrenderDialog.open();
}
}
+ }
- MessageDialog {
- id: quitDialog
- title: Backend.translate("Quit")
- informativeText: Backend.translate("Are you sure to quit?")
- buttons: MessageDialog.Ok | MessageDialog.Cancel
- onButtonClicked: function (button) {
- switch (button) {
- case MessageDialog.Ok: {
- ClientInstance.notifyServer("QuitRoom", "[]");
- break;
- }
- case MessageDialog.Cancel: {
- quitDialog.close();
- }
- }
- }
- }
-
- Button {
- id: surrenderButton
- enabled: !config.observing && !config.replaying
- text: Backend.translate("Surrender")
- font.pixelSize: 28
- Layout.fillWidth: true
- width: menuContainer.width
- height: menuContainer.width * 0.65
- onClicked: {
- if (isStarted && !getPhoto(Self.id).dead) {
- const surrenderCheck = JSON.parse(Backend.callLuaFunction('CheckSurrenderAvailable', [miscStatus.playedTime]));
- if (!surrenderCheck.length) {
- surrenderDialog.informativeText = Backend.translate('Surrender is disabled in this mode');
- } else {
- surrenderDialog.informativeText = surrenderCheck.map(str => `${Backend.translate(str.text)}(${str.passed ? '√' : '×'})`).join('
');
- }
- surrenderDialog.open();
- }
- }
- }
-
- MessageDialog {
- id: surrenderDialog
- title: Backend.translate("Surrender")
- informativeText: ''
- buttons: MessageDialog.Ok | MessageDialog.Cancel
- onButtonClicked: function (button, role) {
- switch (button) {
- case MessageDialog.Ok: {
- const surrenderCheck = JSON.parse(Backend.callLuaFunction('CheckSurrenderAvailable', [miscStatus.playedTime]));
- if (surrenderCheck.length && !surrenderCheck.find(check => !check.passed)) {
- ClientInstance.notifyServer("PushRequest", [
- "surrender", true
- ]);
- }
- surrenderDialog.close();
- break;
- }
- case MessageDialog.Cancel: {
- surrenderDialog.close();
- }
- }
- }
- }
-
- Button {
- id: volumeButton
- text: Backend.translate("Audio Settings")
- font.pixelSize: 28
- Layout.fillWidth: true
- width: menuContainer.width
- height: menuContainer.width * 0.65
- onClicked: {
- volumeDialog.open();
- }
+ MenuItem {
+ id: volumeButton
+ text: Backend.translate("Audio Settings")
+ onClicked: {
+ volumeDialog.open();
}
}
}
@@ -988,57 +912,66 @@ Item {
anchors.fill: parent
}
- Dialog {
+ MessageDialog {
+ id: quitDialog
+ title: Backend.translate("Quit")
+ informativeText: Backend.translate("Are you sure to quit?")
+ buttons: MessageDialog.Ok | MessageDialog.Cancel
+ onButtonClicked: function (button) {
+ switch (button) {
+ case MessageDialog.Ok: {
+ ClientInstance.notifyServer("QuitRoom", "[]");
+ break;
+ }
+ case MessageDialog.Cancel: {
+ quitDialog.close();
+ }
+ }
+ }
+ }
+
+ MessageDialog {
+ id: surrenderDialog
+ title: Backend.translate("Surrender")
+ informativeText: ''
+ buttons: MessageDialog.Ok | MessageDialog.Cancel
+ onButtonClicked: function (button, role) {
+ switch (button) {
+ case MessageDialog.Ok: {
+ const surrenderCheck = JSON.parse(Backend.callLuaFunction('CheckSurrenderAvailable', [miscStatus.playedTime]));
+ if (surrenderCheck.length && !surrenderCheck.find(check => !check.passed)) {
+ ClientInstance.notifyServer("PushRequest", [
+ "surrender", true
+ ]);
+ }
+ surrenderDialog.close();
+ break;
+ }
+ case MessageDialog.Cancel: {
+ surrenderDialog.close();
+ }
+ }
+ }
+ }
+
+ Popup {
id: volumeDialog
- title: Backend.translate("Audio Settings")
- anchors.centerIn: roomScene
- ColumnLayout {
- RowLayout {
- anchors.rightMargin: 8
- spacing: 16
- Text {
- text: Backend.translate("BGM Volume")
- }
- Slider {
- Layout.rightMargin: 16
- Layout.fillWidth: true
- from: 0
- to: 100
- value: config.bgmVolume
- onValueChanged: config.bgmVolume = value;
- }
- }
-
- RowLayout {
- anchors.rightMargin: 8
- spacing: 16
- Text {
- text: Backend.translate("Effect Volume")
- }
- Slider {
- Layout.rightMargin: 16
- Layout.fillWidth: true
- from: 0
- to: 100
- value: Backend.volume
- onValueChanged: Backend.volume = value;
- }
- }
-
- Switch {
- text: Backend.translate("Disable message audio")
- checked: config.disableMsgAudio
- onCheckedChanged: config.disableMsgAudio = checked;
- }
-
- Switch {
- text: Backend.translate("Hide unselectable cards")
- checked: config.hideUseless
- onCheckedChanged: {
- config.hideUseless = checked;
- }
- }
+ width: realMainWin.width * 0.5
+ height: realMainWin.height * 0.5
+ anchors.centerIn: parent
+ background: Rectangle {
+ color: "#EEEEEEEE"
+ radius: 5
+ border.color: "#A6967A"
+ border.width: 1
+ }
+ Loader {
+ anchors.centerIn: parent
+ width: parent.width / mainWindow.scale
+ height: parent.height / mainWindow.scale
+ scale: mainWindow.scale
+ source: AppPath + "/Fk/LobbyElement/AudioSetting.qml"
}
}
diff --git a/android/src/org/notify/FreeKill/Helper.java b/android/src/org/notify/FreeKill/Helper.java
index 8229bee4..5963a30f 100644
--- a/android/src/org/notify/FreeKill/Helper.java
+++ b/android/src/org/notify/FreeKill/Helper.java
@@ -63,8 +63,11 @@ public class Helper {
return java.util.Locale.getDefault().toString();
}
- public static void PlaySound(String path) {
- MediaPlayer mp = new MediaPlayer();
+ static MediaPlayer mp;
+
+ public static void PlaySound(String path, float vol) {
+ // FIXME: 此法中途会被GC
+ mp = new MediaPlayer();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
@@ -74,6 +77,7 @@ public class Helper {
});
try {
mp.setDataSource(path);
+ mp.setVolume(vol, vol);
mp.prepare();
mp.start();
} catch (Exception e) {
diff --git a/lua/server/ai/random_ai.lua b/lua/server/ai/random_ai.lua
index aee2894f..1108b17b 100644
--- a/lua/server/ai/random_ai.lua
+++ b/lua/server/ai/random_ai.lua
@@ -15,17 +15,18 @@ function RandomAI:useActiveSkill(skill, card)
filter_func = Util.FalseFunc
end
- if self.command == "PlayCard" and card and (not skill:canUse(player, card) or player:prohibitUse(card)) then
+ if self.command == "PlayCard" and (not skill:canUse(player, card) or player:prohibitUse(card)) then
return ""
end
local max_try_times = 100
local selected_targets = {}
local selected_cards = {}
- local min = skill:getMinTargetNum()
- local max = skill:getMaxTargetNum(player, card)
- local min_card = skill:getMinCardNum()
- local max_card = skill:getMaxCardNum()
+ -- FIXME: ...
+ -- local min = skill:getMinTargetNum()
+ -- local max = skill:getMaxTargetNum(player, card)
+ -- local min_card = skill:getMinCardNum()
+ -- local max_card = skill:getMaxCardNum()
for _ = 0, max_try_times do
if skill:feasible(selected_targets, selected_cards, self.player, card) then break end
local avail_targets = table.filter(room:getAlivePlayers(), function(p)
diff --git a/src/ui/qmlbackend.cpp b/src/ui/qmlbackend.cpp
index 080d4f4b..5123c3ff 100644
--- a/src/ui/qmlbackend.cpp
+++ b/src/ui/qmlbackend.cpp
@@ -324,7 +324,8 @@ void QmlBackend::playSound(const QString &name, int index) {
#ifdef Q_OS_ANDROID
QJniObject::callStaticMethod("org/notify/FreeKill/Helper", "PlaySound",
- "(Ljava/lang/String;)V", QJniObject::fromString(fname).object());
+ "(Ljava/lang/String;D)V", QJniObject::fromString(fname).object(),
+ (float)(m_volume / 100));
#else
auto player = new QMediaPlayer;
auto output = new QAudioOutput;