diff --git a/resource/tasks/MiniGame/PV-Reproduction.json b/resource/tasks/MiniGame/PV-Reproduction.json
new file mode 100644
index 0000000000..f6c55d913e
--- /dev/null
+++ b/resource/tasks/MiniGame/PV-Reproduction.json
@@ -0,0 +1,420 @@
+{
+ "MiniGame@PV@Begin": {
+ "algorithm": "JustReturn",
+ "next": ["MiniGame@PV@01"]
+ },
+ "MiniGame@PV@01": {
+ "action": "ClickSelf",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "maskRange": [0, 70],
+ "roi": [0, 350, 1280, 50],
+ "next": ["MiniGame@PV@02"]
+ },
+ "MiniGame@PV@02": {
+ "baseTask": "MiniGame@PV@01",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 620, 1280, 50],
+ "next": ["MiniGame@PV@03"]
+ },
+ "MiniGame@PV@03": {
+ "baseTask": "MiniGame@PV@01",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 330, 1280, 50],
+ "next": ["MiniGame@PV@04"]
+ },
+ "MiniGame@PV@04": {
+ "baseTask": "MiniGame@PV@01",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter3-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 580, 1280, 50],
+ "next": ["MiniGame@PV@05"]
+ },
+ "MiniGame@PV@05": {
+ "baseTask": "MiniGame@PV@01",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 460, 1280, 50],
+ "next": ["MiniGame@PV@06"]
+ },
+ "MiniGame@PV@06": {
+ "action": "ClickSelf",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "maskRange": [90, 140],
+ "rectMove": [0, -50, 10, 10],
+ "roi": [0, 450, 1280, 50],
+ "next": ["MiniGame@PV@07"]
+ },
+ "MiniGame@PV@07": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 230, 1280, 50],
+ "next": ["MiniGame@PV@08"]
+ },
+ "MiniGame@PV@08": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 380, 1280, 50],
+ "next": ["MiniGame@PV@09"]
+ },
+ "MiniGame@PV@09": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 520, 1280, 50],
+ "next": ["MiniGame@PV@10"]
+ },
+ "MiniGame@PV@10": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 670, 1280, 50],
+ "next": ["MiniGame@PV@11"]
+ },
+ "MiniGame@PV@11": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 590, 1280, 50],
+ "next": ["MiniGame@PV@12"]
+ },
+ "MiniGame@PV@12": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 670, 1280, 50],
+ "next": ["MiniGame@PV@13"]
+ },
+ "MiniGame@PV@13": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 520, 1280, 50],
+ "next": ["MiniGame@PV@14"]
+ },
+ "MiniGame@PV@14": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 380, 1280, 50],
+ "next": ["MiniGame@PV@15"]
+ },
+ "MiniGame@PV@15": {
+ "action": "ClickSelf",
+ "template": "MiniGame@PV@11.png",
+ "rectMove": [0, -350, 10, 10],
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 590, 1280, 50],
+ "next": ["MiniGame@PV@16"]
+ },
+ "MiniGame@PV@16": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 230, 1280, 50],
+ "next": ["MiniGame@PV@17"]
+ },
+ "MiniGame@PV@17": {
+ "baseTask": "MiniGame@PV@06",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm",
+ "SwipeToTheRight"
+ ],
+ "roi": [0, 450, 1280, 50],
+ "postDelay": 500,
+ "next": ["MiniGame@PV@18"]
+ },
+ "MiniGame@PV@18": {
+ "baseTask": "MiniGame@PV@20",
+ "template": "MiniGame@PV@20.png",
+ "rectMove": [-250, -350, 10, 10],
+ "sub": [
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "next": ["MiniGame@PV@19"]
+ },
+ "MiniGame@PV@19": {
+ "action": "ClickSelf",
+ "template": "MiniGame@PV@20.png",
+ "rectMove": [-250, -100, 10, 10],
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Options-4",
+ "MiniGame@PV@Filter2-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Confirm"
+ ],
+ "next": ["MiniGame@PV@20"]
+ },
+ "MiniGame@PV@20": {
+ "baseTask": "MiniGame@PV@01",
+ "sub": [
+ "MiniGame@PV@Filter1-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter2-1",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter3-1",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Filter1-2",
+ "MiniGame@PV@Options-3",
+ "MiniGame@PV@Filter3-2",
+ "MiniGame@PV@Options-1",
+ "MiniGame@PV@Options-2",
+ "MiniGame@PV@Confirm"
+ ],
+ "roi": [0, 630, 1280, 50],
+ "next": []
+ },
+ "MiniGame@PV@Filter1-1": {
+ "algorithm": "JustReturn",
+ "action": "ClickRect",
+ "specificRect": [1025, 93, 16, 16],
+ "preDelay": 500,
+ "postDelay": 500
+ },
+ "MiniGame@PV@Filter1-2": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1177, 98, 16, 16]
+ },
+ "MiniGame@PV@Filter2-1": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1020, 225, 16, 16]
+ },
+ "MiniGame@PV@Filter2-2": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1179, 230, 16, 16]
+ },
+ "MiniGame@PV@Filter3-1": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1011, 359, 16, 16]
+ },
+ "MiniGame@PV@Filter3-2": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1160, 363, 16, 16]
+ },
+ "MiniGame@PV@Filter4-1": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1010, 476, 16, 16]
+ },
+ "MiniGame@PV@Filter4-2": {
+ "baseTask": "MiniGame@PV@Filter1-1",
+ "specificRect": [1143, 478, 16, 16]
+ },
+ "MiniGame@PV@Options-1": {
+ "algorithm": "JustReturn",
+ "action": "ClickRect",
+ "specificRect": [866, 143, 16, 16]
+ },
+ "MiniGame@PV@Options-2": {
+ "baseTask": "MiniGame@PV@Options-1",
+ "specificRect": [860, 269, 16, 16]
+ },
+ "MiniGame@PV@Options-3": {
+ "baseTask": "MiniGame@PV@Options-1",
+ "specificRect": [854, 392, 16, 16]
+ },
+ "MiniGame@PV@Options-4": {
+ "baseTask": "MiniGame@PV@Options-1",
+ "specificRect": [846, 517, 16, 16]
+ },
+ "MiniGame@PV@Confirm": {
+ "action": "ClickSelf",
+ "roi": [1053, 588, 205, 132],
+ "preDelay": 500,
+ "postDelay": 1000,
+ "reduceOtherTimes": ["MiniGame@PV@ClickToMainInterface*20"],
+ "next": ["MiniGame@PV@ClickToMainInterface"]
+ },
+ "MiniGame@PV@ClickToMainInterface": {
+ "algorithm": "JustReturn",
+ "action": "ClickRect",
+ "specificRect": [640, 10, 1, 1],
+ "maxTimes": 20,
+ "next": ["MiniGame@PV@MainInterface", "MiniGame@PV@ClickToMainInterface"]
+ },
+ "MiniGame@PV@MainInterface": {
+ "roi": [0, 270, 339, 159],
+ "next": ["Stop"]
+ }
+}
diff --git a/resource/tasks/MiniGame/PV-Reproduction.py b/resource/tasks/MiniGame/PV-Reproduction.py
new file mode 100644
index 0000000000..4308a37957
--- /dev/null
+++ b/resource/tasks/MiniGame/PV-Reproduction.py
@@ -0,0 +1,77 @@
+import re
+
+# 攻略:https://www.bilibili.com/video/BV16NSZYbE85/
+# 视频格式:左1-1 2-3 3-1 右1-3 3-1 3-2
+# MAA 内部格式:
+# MiniGame@PV@Filter1-1 (左1-)
+# MiniGame@PV@Options-1 (-1)
+# 映射:左/右 → Filter 的第二位
+side_map = {"左": "1", "右": "2"}
+
+
+def convert_steps(text):
+ parts = text.split()
+ result = []
+
+ current_filter = None
+ current_side = None
+
+ for part in parts:
+ # 判断是否带 左/右
+ m = re.match(r"(左|右)?(\d+)-(\d+)", part)
+ if not m:
+ continue
+
+ side, group, option = m.groups()
+
+ # 如果没有写左/右,则沿用前一次
+ if side is None:
+ side = current_side
+
+ filter_id = f"Filter{group}-{side_map[side]}"
+ option_id = f"Options-{option}"
+
+ # 如果 Filter 改变了,先写 Filter
+ if filter_id != current_filter:
+ result.append(f"MiniGame@PV@{filter_id}")
+ current_filter = filter_id
+ current_side = side
+
+ # 再写 Options
+ result.append(f"MiniGame@PV@{option_id}")
+
+ result.append("MiniGame@PV@Confirm")
+ return result
+
+
+texts = [
+ "左1-4 2-2 右1-2 1-4 2-1 2-2",
+ "左1-1 2-3 右2-2 2-4",
+ "左1-2 1-4 2-1 3-2 右2-2",
+ "左1-4 3-2 右1-3 3-4",
+ "左1-1 1-3 2-1 2-3 右2-1 2-2",
+ "左1-2 1-4 2-2 2-3 右1-3 2-2",
+ "左1-1 1-3 2-3 右1-3 2-1",
+ "左1-2 1-4 2-1 3-1 右1-2",
+ "左1-4 2-2 3-3 右1-3 2-3",
+ "左1-1 1-4 2-3 右1-1 1-2 2-2",
+ "左1-2 2-3 3-2 右1-1",
+ "左2-2 2-4 右1-1 2-3",
+ "右1-1 2-2 2-4",
+ "左1-1 2-4 右1-2 2-4",
+ "左1-2 1-4 右1-2 1-4 2-1",
+ "左2-2 3-2 3-4 右1-1 1-3 2-2",
+ "左1-4 2-1 3-1 3-3 右1-2",
+ "左2-1 3-1 右1-2 1-4 2-2",
+ "左1-2 1-4 3-2 3-4 右2-1",
+ "左1-1 2-3 3-1 右1-3 3-1 3-2",
+]
+
+for idx, text in enumerate(texts):
+ print(f"\n// 第 {idx + 1} 行: {text}")
+ converted = convert_steps(text)
+ print('"sub": [')
+ for i, line in enumerate(converted):
+ comma = "," if i < len(converted) - 1 else ""
+ print(f' "{line}"{comma}')
+ print(" ],")
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@01.png b/resource/template/MiniGame/PV/MiniGame@PV@01.png
new file mode 100644
index 0000000000..bf301033fe
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@01.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@02.png b/resource/template/MiniGame/PV/MiniGame@PV@02.png
new file mode 100644
index 0000000000..fba78008eb
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@02.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@03.png b/resource/template/MiniGame/PV/MiniGame@PV@03.png
new file mode 100644
index 0000000000..7d39202166
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@03.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@04.png b/resource/template/MiniGame/PV/MiniGame@PV@04.png
new file mode 100644
index 0000000000..1e2795e8b2
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@04.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@05.png b/resource/template/MiniGame/PV/MiniGame@PV@05.png
new file mode 100644
index 0000000000..d6a9ae020d
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@05.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@06.png b/resource/template/MiniGame/PV/MiniGame@PV@06.png
new file mode 100644
index 0000000000..18f748548c
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@06.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@07.png b/resource/template/MiniGame/PV/MiniGame@PV@07.png
new file mode 100644
index 0000000000..55dd5a4f0c
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@07.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@08.png b/resource/template/MiniGame/PV/MiniGame@PV@08.png
new file mode 100644
index 0000000000..1d3bb48e43
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@08.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@09.png b/resource/template/MiniGame/PV/MiniGame@PV@09.png
new file mode 100644
index 0000000000..a1f69ce378
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@09.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@10.png b/resource/template/MiniGame/PV/MiniGame@PV@10.png
new file mode 100644
index 0000000000..b8e87c1183
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@10.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@11.png b/resource/template/MiniGame/PV/MiniGame@PV@11.png
new file mode 100644
index 0000000000..d45a3e47be
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@11.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@12.png b/resource/template/MiniGame/PV/MiniGame@PV@12.png
new file mode 100644
index 0000000000..b6ed01d6b4
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@12.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@13.png b/resource/template/MiniGame/PV/MiniGame@PV@13.png
new file mode 100644
index 0000000000..37d52e9772
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@13.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@14.png b/resource/template/MiniGame/PV/MiniGame@PV@14.png
new file mode 100644
index 0000000000..a22faee4db
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@14.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@16.png b/resource/template/MiniGame/PV/MiniGame@PV@16.png
new file mode 100644
index 0000000000..405fabc067
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@16.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@17.png b/resource/template/MiniGame/PV/MiniGame@PV@17.png
new file mode 100644
index 0000000000..49f8a33cff
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@17.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@20.png b/resource/template/MiniGame/PV/MiniGame@PV@20.png
new file mode 100644
index 0000000000..383a0c5329
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@20.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@Confirm.png b/resource/template/MiniGame/PV/MiniGame@PV@Confirm.png
new file mode 100644
index 0000000000..e5679caec8
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@Confirm.png differ
diff --git a/resource/template/MiniGame/PV/MiniGame@PV@MainInterface.png b/resource/template/MiniGame/PV/MiniGame@PV@MainInterface.png
new file mode 100644
index 0000000000..faa76907d5
Binary files /dev/null and b/resource/template/MiniGame/PV/MiniGame@PV@MainInterface.png differ
diff --git a/src/MaaWpfGui/Res/Localizations/en-us.xaml b/src/MaaWpfGui/Res/Localizations/en-us.xaml
index 7284f73570..ffb6d2c405 100644
--- a/src/MaaWpfGui/Res/Localizations/en-us.xaml
+++ b/src/MaaWpfGui/Res/Localizations/en-us.xaml
@@ -795,6 +795,8 @@ The video aspect ratio needs to be 16:9 without interference factors such as bla
Mini Game Name
+ PV - Fireworks Organizing Committee
+ Start from the leftmost side of the event page
Stronghold Protocol: Alliance
Start the task from the main event screen (where 「Independent Simulation」 is located)
Completing 「Standard Simulation」 manually allows faster score farming
diff --git a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml
index 22820e1550..e5d51287cb 100644
--- a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml
+++ b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml
@@ -795,6 +795,8 @@ C:\\leidian\\LDPlayer9
ミニゲーム名
+ PV-花火実行委員会
+ イベントページの最左側から開始
ガードプロトコル:盟約
イベントメイン画面(「独立シミュレーション」の場所)からタスクを開始
「スタンダードシミュレーション」を手動でクリアすると、より早くスコアを稼げます
diff --git a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml
index 6222d8dadb..167ca729b0 100644
--- a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml
+++ b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml
@@ -796,6 +796,8 @@ C:\\leidian\\LDPlayer9
미니 게임 이름
+ PV-불꽃놀이 집행위원회
+ 이벤트 페이지 가장 왼쪽에서 시작
위수 협의: 맹약
이벤트 메인 화면(「독립 시뮬레이션」 위치)에서 임무 시작
「스탠다드 시뮬레이션」 을 수동으로 클리어하면 점수를 더 빠르게 획득할 수 있습니다
diff --git a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
index dfbff39d8c..09ce934f45 100644
--- a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
+++ b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
@@ -795,6 +795,8 @@ C:\\leidian\\LDPlayer9。\n
小游戏名称
+ PV-烟花筹委会
+ 在活动页面最左侧开始
卫戍协议:盟约
在活动主界面(有 「独立模拟」 处开始任务)
手动通关 「标准模拟」 可以更快的刷分
diff --git a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml
index 3a15322285..de8696df95 100644
--- a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml
+++ b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml
@@ -796,6 +796,8 @@ C:\\leidian\\LDPlayer9。\n
小遊戲名稱
+ PV-煙花籌委會
+ 在活動頁面最左側開始
衛戍協議:盟約
在活動主界面(有「獨立模擬」處開始任務)
手動通關「標準模擬」可以更快刷分
diff --git a/src/MaaWpfGui/ViewModels/UI/ToolboxViewModel.cs b/src/MaaWpfGui/ViewModels/UI/ToolboxViewModel.cs
index aab37cbb20..e3f2d80983 100644
--- a/src/MaaWpfGui/ViewModels/UI/ToolboxViewModel.cs
+++ b/src/MaaWpfGui/ViewModels/UI/ToolboxViewModel.cs
@@ -1241,6 +1241,7 @@ public class ToolboxViewModel : Screen
new() { Display = LocalizationHelper.GetString("MiniGameNameRAStore"), Value = "RA@Store@Begin" },
// 活动
+ new() { Display = LocalizationHelper.GetString("MiniGame@PV"), Value = "MiniGame@PV@Begin" },
new() { Display = LocalizationHelper.GetString("MiniGame@SPA"), Value = "MiniGame@SPA@Begin" },
new() { Display = LocalizationHelper.GetString("MiniGame@OS"), Value = "MiniGame@OS@Begin" },
new() { Display = LocalizationHelper.GetString("MiniGame@RM-TR-1"), Value = "MiniGame@RM-TR-1@Begin" },
@@ -1286,6 +1287,7 @@ public class ToolboxViewModel : Screen
"RA@Store@Begin" => LocalizationHelper.GetString("MiniGameNameRAStoreTip"),
// 活动
+ "MiniGame@PV@Begin" => LocalizationHelper.GetString("MiniGame@PVTip"),
"MiniGame@SPA@Begin" => LocalizationHelper.GetString("MiniGame@SPATip"),
"MiniGame@OS@Begin" => LocalizationHelper.GetString("MiniGame@OSTip"),
"MiniGame@RM-TR-1@Begin" => LocalizationHelper.GetString("MiniGame@RM-TR-1Tip"),
diff --git a/tools/GetImageFromROI/cutter.py b/tools/GetImageFromROI/cutter.py
index 0b1af25313..96b2426161 100644
--- a/tools/GetImageFromROI/cutter.py
+++ b/tools/GetImageFromROI/cutter.py
@@ -2,6 +2,7 @@ import json
from pathlib import Path
import cv2
+
from tools.ImageCropper.main import crop
"""