Fix wordwrapping for rpgmakermvmz 401 color codes

This commit is contained in:
dazedanon 2025-05-31 11:42:14 -05:00
parent 5b2a3e3801
commit a5c6047b1f
4 changed files with 324 additions and 160 deletions

View file

@ -3,6 +3,7 @@ import json
import os
import re
import textwrap
import util.dazedwrap as dazedwrap
import threading
import time
import traceback
@ -324,7 +325,7 @@ def translateNote(event, regex, wordwrap=False):
# Textwrap
if wordwrap:
translatedText = textwrap.fill(translatedText, width=NOTEWIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=NOTEWIDTH)
translatedText = translatedText.replace('"', "")
jaString = jaString.replace(initialJAString, translatedText)
@ -569,7 +570,7 @@ def searchNames(data, pbar, context):
nameList.append(data[i]["name"])
if "description" in data[i] and data[i]["description"] != "":
description = data[i]["description"]
# description = description.replace("\n", " ")
description = description.replace("\n", " ")
descriptionList.append(description)
if "<hint:" in data[i]["note"]:
tokensResponse = translateNote(data[i], r"<hint:(.*?)>")
@ -639,6 +640,10 @@ def searchNames(data, pbar, context):
tokensResponse = translateNote(data[i], r"<infowindow:(.*?)>", True)
totalTokens[0] += tokensResponse[0]
totalTokens[1] += tokensResponse[1]
if "ExtendDesc" in data[i]["note"]:
tokensResponse = translateNote(data[i], r"<ExtendDesc:(.*?)>", True)
totalTokens[0] += tokensResponse[0]
totalTokens[1] += tokensResponse[1]
i += 1
@ -762,7 +767,7 @@ def searchNames(data, pbar, context):
data[j]["nickname"] = translatedNicknameBatch[0]
translatedNicknameBatch.pop(0)
if "profile" in data[j] and data[j]["profile"]:
data[j]["profile"] = textwrap.fill(translatedProfileBatch[0], LISTWIDTH)
data[j]["profile"] = dazedwrap.wrapText(translatedProfileBatch[0], LISTWIDTH)
translatedProfileBatch.pop(0)
# If Batch is empty. Move on.
@ -809,7 +814,7 @@ def searchNames(data, pbar, context):
data[j]["name"] = translatedNameBatch[0]
translatedNameBatch.pop(0)
if "description" in data[j] and data[j]["description"] != "":
# translatedDescriptionBatch[0] = textwrap.fill(translatedDescriptionBatch[0], LISTWIDTH)
translatedDescriptionBatch[0] = dazedwrap.wrapText(translatedDescriptionBatch[0], LISTWIDTH)
data[j]["description"] = translatedDescriptionBatch[0]
translatedDescriptionBatch.pop(0)
@ -999,7 +1004,7 @@ def searchCodes(page, pbar, jobList, filename):
if len(speakerList) == 0 and FIRSTLINESPEAKERS is True:
# Remove any RPGMaker Code at start
ffMatch = re.search(
r"^(\s*[\\]+[aAbBdDeEfFgGhHjJlLmMoOpPqQrRsStTuUwWxXyYzZ]+\[[\w\d\[\]\\]+\])",
r"^((?:[\\]+[^cCnNiIkKvV]+\[[\d\w]+\])+)",
jaString,
)
if ffMatch != None:
@ -1097,7 +1102,6 @@ def searchCodes(page, pbar, jobList, filename):
codeList[i]["parameters"] = [finalJAString]
### \\n<Speaker>
nCase = None
regex = r"([\\]+[kKnN][wWcCrRrEe]?[\[<](.*?)[>\]])"
match = re.search(regex, finalJAString)
@ -1135,12 +1139,12 @@ def searchCodes(page, pbar, jobList, filename):
# Remove any RPGMaker Code at start
ffMatch = re.search(
r"^(\s*[\\]+[aAbBdDeEfFgGhHjJlLmMoOpPqQrRsStTuUwWxXyYzZ]+\[[\w\d\[\]\\]+?\])",
r"^((?:[\\]+[^cCnNiIkKvV]+\[[\d\w]+\])+)",
finalJAString,
)
if ffMatch != None:
finalJAString = finalJAString.replace(ffMatch.group(1), "")
nametag += ffMatch.group(1)
nametag = ffMatch.group(1) + nametag
# Remove _ABL Codes
ffMatch = re.search(r"^(_ABL).*", finalJAString)
@ -1208,9 +1212,9 @@ def searchCodes(page, pbar, jobList, filename):
finalJAString = finalJAString.replace("<br>", " ")
if FIXTEXTWRAP is True and "_ABL" in nametag:
translatedText = textwrap.fill(translatedText, width=100)
translatedText = dazedwrap.wrapText(translatedText, width=100)
elif FIXTEXTWRAP is True:
translatedText = textwrap.fill(translatedText, width=WIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
# Formatting Code
if instantLineFlag:
@ -1234,11 +1238,8 @@ def searchCodes(page, pbar, jobList, filename):
translatedText = re.sub(r"[\\]+?ac\s+", r"\\ac ", translatedText)
CLFlag = False
# Nametag
if nCase == 0:
translatedText = translatedText + nametag
else:
translatedText = nametag + translatedText
# Add Nametag Back In
translatedText = nametag + translatedText
nametag = ""
# Endtag
@ -1281,7 +1282,7 @@ def searchCodes(page, pbar, jobList, filename):
## Event Code: 122 [Set Variables]
if "code" in codeList[i] and codeList[i]["code"] == 122 and CODE122 is True:
# This is going to be the var being set. (IMPORTANT)
if codeList[i]["parameters"][0] not in list(range(150, 160)):
if codeList[i]["parameters"][0] not in list(range(0, 2000)):
i += 1
continue
@ -1316,7 +1317,7 @@ def searchCodes(page, pbar, jobList, filename):
matchedText = None
if len(re.findall(r"([\'\"\`])", jaString)) >= 2:
matchedText = re.search(r"[\'\"\`](.*)[\'\"\`]", jaString)
if matchedText and matchedText.group(1) != " ":
if matchedText and matchedText.group(1).strip():
# Remove Textwrap
finalJAString = matchedText.group(1).replace("\\n", " ")
@ -1341,7 +1342,7 @@ def searchCodes(page, pbar, jobList, filename):
translatedText = re.sub(r'(?<![\\])([\\]{1})(?=\w)', r'\\\\', translatedText)
# Textwrap
translatedText = textwrap.fill(translatedText, width=1000)
translatedText = dazedwrap.wrapText(translatedText, width=LISTWIDTH)
translatedText = translatedText.replace("\n", "\\n")
# Set
@ -1393,7 +1394,7 @@ def searchCodes(page, pbar, jobList, filename):
translatedText = translatedText.replace(char, "")
# Textwrap
# translatedText = textwrap.fill(translatedText, 80)
# translatedText = dazedwrap.wrapText(translatedText, 80)
# translatedText = translatedText.replace("\n", "\\n")
# translatedText = re.sub(r"[\\]+c", r"\\\\c", translatedText)
translatedText = re.sub(r"[\\]+\*item", r"\\\\*item", translatedText)
@ -1443,7 +1444,7 @@ def searchCodes(page, pbar, jobList, filename):
totalTokens[1] += response[1][1]
# Textwrap & Set
translatedText = textwrap.fill(translatedText, width=WIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
codeList[i]["parameters"][3]["messageText"] = translatedText
### Choices
@ -1515,7 +1516,7 @@ def searchCodes(page, pbar, jobList, filename):
translatedText = translatedText.replace(char, "")
# Textwrap
translatedText = textwrap.fill(translatedText, width=WIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
translatedText = startString + translatedText + endString
# Set Data
@ -1646,7 +1647,7 @@ def searchCodes(page, pbar, jobList, filename):
if "code" in codeList[i] and (codeList[i]["code"] == 408) and CODE408 is True:
# Remove Textwrap
jaString = codeList[i]["parameters"][0]
jaString = jaString.replace("\n", " ")
# jaString = jaString.replace("\n", " ")
# Pass 1
if setData:
@ -1658,11 +1659,10 @@ def searchCodes(page, pbar, jobList, filename):
list408.pop(0)
# Textwrap
# translatedText = textwrap.fill(translatedText, width=LISTWIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=1000)
# Set Data
translatedText = jaString.replace("\\fs[18]", "")
codeList[i]["parameters"][0] = f"\\fs[18]{translatedText}"
codeList[i]["parameters"][0] = f"{translatedText}"
## Event Code: 108 (Script)
if "code" in codeList[i] and (codeList[i]["code"] == 108) and CODE108 is True:
@ -1709,7 +1709,7 @@ def searchCodes(page, pbar, jobList, filename):
# Textwrap
if codeList[i + 1]["code"] == 408:
translatedText = textwrap.fill(translatedText, WIDTH)
translatedText = dazedwrap.wrapText(translatedText, WIDTH)
# Remove characters that may break scripts
charList = ['"']
@ -1753,8 +1753,8 @@ def searchCodes(page, pbar, jobList, filename):
continue
# Want to translate this script
if "D_TEXT " in jaString:
regex = r"D_TEXT\s(.+)\s.+"
if "D____TEXT " in jaString:
regex = r"D_TEXT\s(.+)\s?.*"
elif "ShowInfo" in jaString:
regex = r"ShowInfo\s(.*)"
elif "PushGab" in jaString:
@ -1765,6 +1765,8 @@ def searchCodes(page, pbar, jobList, filename):
regex = r"DW_.*?\s(.*)"
elif "CommonPopup" in jaString:
regex = r"CommonPopup\sadd\stext:(.*?)[\\]+}"
elif "AddCustomChoice" in jaString:
regex = r"AddCustomChoice\s\d+\s(.+)\s\d"
else:
regex = r""
@ -1862,7 +1864,7 @@ def searchCodes(page, pbar, jobList, filename):
totalTokens[1] += response[1][1]
# Textwrap & Replace Whitespace
translatedText = textwrap.fill(translatedText, width=WIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
translatedText = translatedText.replace(" ", "_")
# Replace and Set
@ -1924,14 +1926,14 @@ def searchCodes(page, pbar, jobList, filename):
if len(textHistory) > 0:
response = translateGPT(
choiceList,
f"Previous text for context: {str(textHistory)}\n",
f"Reply with the English translation of the dialogue choice.\n\nPrevious text for context: {str(textHistory)}\n",
True,
)
translatedTextList = response[0]
totalTokens[0] += response[1][0]
totalTokens[1] += response[1][1]
else:
response = translateGPT(choiceList, "", True)
response = translateGPT(choiceList, "Reply with the English translation of the dialogue choice.", True)
translatedTextList = response[0]
totalTokens[0] += response[1][0]
totalTokens[1] += response[1][1]
@ -2313,7 +2315,7 @@ Translate 'Taroを倒した' as 'Taro was defeated!'",
if "description" in state:
# Textwrap
translatedText = descriptionResponse[0]
translatedText = textwrap.fill(translatedText, width=LISTWIDTH)
translatedText = dazedwrap.wrapText(translatedText, width=LISTWIDTH)
state["description"] = translatedText.replace('"', "")
if "message1" in state:
state["message1"] = message1Response[0].replace('"', "").replace("Taro", "")

View file

@ -91,7 +91,7 @@ CODE150 = False
# Other
CODE210 = False
CODE300 = False
CODE250 = False
CODE250 = True
# Database
SCENARIOFLAG = False
@ -677,11 +677,10 @@ def searchCodes(events, pbar, jobList, filename):
### Event Code: 250 DB Read/Writes
if codeList[i]["code"] == 250 and CODE250 == True:
# Validate size
stringArg = 0
stringArg = 2
if len(codeList[i]["stringArgs"]) == 4:
if codeList[i]["stringArgs"][1] == "万能ウィンドウ一時DB"\
and codeList[i]["stringArgs"][stringArg] != ""\
and codeList[i]["intArgs"][0] == 13:
if codeList[i]["stringArgs"][1] == "unit"\
and codeList[i]["stringArgs"][stringArg] != "":
# Font Size
fontSize = 0
@ -930,7 +929,7 @@ def searchDB(events, pbar, jobList, filename):
try:
for table in tableList:
# Grab NPCs
if table["name"] == "Hシナリオ" and NPCFLAG == True:
if table["name"] == "マップ選択画面" and NPCFLAG == True:
with open("translations.txt", "a", encoding="utf-8") as file:
if setData:
file.write(f"\n#Actors\n")
@ -940,7 +939,7 @@ def searchDB(events, pbar, jobList, filename):
# Parse
for j in range(len(dataList)):
# Name
if dataList[j].get("name") == "タイトル":
if dataList[j].get("name") == "マップ名":
# Pass 1 (Grab Data)
if setData == False:
if dataList[j].get("value") != "":

54
util/dazedwrap.py Normal file
View file

@ -0,0 +1,54 @@
import re
def _get_visible_length(text: str) -> int:
"""
Calculate the visible length of text, ignoring RPG Maker color codes.
Args:
text (str): The text to measure
Returns:
int: The length of the text excluding color codes
"""
# Remove all color codes like \c[5] or \C[35]
cleaned_text = re.sub(r'[\\]+[cC]\[\d+\]', '', text)
return len(cleaned_text)
def wrapText(text: str, width: int) -> str:
"""
Wrap text to the specified width, preserving RPG Maker color codes.
Args:
text (str): The text to wrap
width (int): The maximum number of characters per line
Returns:
str: The wrapped text with lines separated by \n
"""
if not text:
return ""
words = text.split()
lines = []
current_line = []
current_length = 0
for word in words:
# Calculate visible length ignoring color codes
word_length = _get_visible_length(word)
# Check if adding this word would exceed the width
if current_length + word_length + len(current_line) <= width:
current_line.append(word)
current_length += word_length
else:
if current_line: # Only add line if we have words
lines.append(" ".join(current_line))
current_line = [word]
current_length = word_length
# Add the last line if it has any words
if current_line:
lines.append(" ".join(current_line))
return "\n".join(lines)

351
vocab.txt
View file

@ -1,126 +1,35 @@
Here are some vocabulary and terms so that you know the proper spelling and translation.
```
# Game Characters
アイリス (Iris)
フランシスカ (Francisca)
リサ (Lisa)
エリーゼ (Elise)
エルフィナ (Elphina)
カリン (Karin)
リルナ (Riruna)
アルフォンス (Alphonse)
グスタフ (Gustav)
ルカ (Luca)
クラウディオ (Claudio)
ジェフリー (Jeffrey)
シオン (Sion)
エドワード (Edward)
シャルロット (Charlotte)
ジーク (Sieg)
オーディン (Odin)
アクア (Aqua)
フィーラ (Fira)
レイア (Leia)
サン (Sun)
ケイ (Kei)
トリーニヒ (Triuni)
エメラルダ (Emeralda)
転生ちゃん (Reincarnation-chan)
神楽ちゃん (Kagura-chan)
ミル (Miru)
メリッサ (Melissa)
クレア (Claire)
コレット (Colette)
モニカ (Monica)
ノーラ (Nora)
ルチア (Lucia)
シオン (Sion)
ミル (Miru)
女王カリーナ (Queen Karina)
竜のじいちゃん (Old Dragon)
ローナ (Rona)
ヒルト (Hilt)
ノエル (Noel)
ロベリア皇帝 (Emperor Lobelia)
ペトラ (Petra)
エルエス (Elles)
ナツメ (Natsume)
フブキ (Fubuki)
ノブチカ (Nobuchika)
ルビー (Ruby)
マルティナ (Martina)
マリー (Marie)
ブラック (Black)
悪魔アイリス (Devil Iris)
ロキ (Loki)
アイリスの子どもA (Iris's Child A)
アイリスの子どもB (Iris's Child B)
アイリスの子どもC (Iris's Child C)
衛兵 (Guard)
男吸血鬼 (Male Vampire)
騎士A (Knight A)
騎士B (Knight B)
騎士C (Knight C)
騎士たち (Knights)
観客たち (Audience)
ファンたち (Fans)
店長 (Manager)
ドワーフ (Dwarf)
スタッフ (Staff)
門番 (Gatekeeper)
城の従者 (Castle Servant)
吸血鬼 (Vampire)
エルフの村長 (Elf Village Chief)
竜族たち (Dragon Tribe)
魔物たち (Monsters)
神族の男 (Divine Man)
ロベリア騎士 (Lobelia Knight)
ロベリア騎士たち (Lobelia Knights)
メイド (Maid)
ペチュニア兵士 (Petunia Soldier)
ペチュニア騎士 (Petunia Knight)
フォクレー兄妹 (Forqueray Siblings)
アイリス変身用 (Iris Transformation)
天翔院ひいな (Hina Tenjouin)
園原あいり (Airi Sonohara)
瑠璃川えみり (Emiri Rurukawa)
頼州うめる (Umeru Yorisu)
穂香てまり (Temari Honoka)
夢宮ありす (Arisu Yumemiya)
相晴ひなた (Hinata Aihare)
猫田ぺぺろ (Pepero Nekota)
アイリス (Iris) - Female
フランシスカ (Francisca) - Female
リサ (Lisa) - Female
エリーゼ (Elise) - Female
エルフィナ (Elphina) - Female
カリン (Karin) - Female
リルナ (Riruna) - Female
アルフォンス (Alphonse) - Male
グスタフ (Gustav) - Male
ルカ (Luca) - Male
クラウディオ (Claudio) - Male
ジェフリー (Jeffrey) - Male
シオン (Sion) - Female
フォルクレー兄妹 (Forqueray) - Male & Female
(妹)(Sister) - Female
アクア (Aqua) - Male
フィーラ (Fira)
レイア (Leia)
サン (Sun)
ケイ (Kei)
トリウーニヒ (Triuni)
エメラルダ (Emeralda)
転生ちゃん (Reincarnation-chan)
神楽ちゃん (Kagura-chan) - Female
ミル (Miru) - Female
メリッサ (Melissa) - Female
クレア (Claire) - Female
コレット (Colette) - Female
モニカ (Monica) - Female
ノーラ (Nora) - Female
ルチア (Lucia) - Female
悪魔竜アイリス (Devil Dragon Iris) - Female
# Game Characters
アイカ (Aika) - Female
カナエ (Kanae) - Female
マドカ (Madoka) - Female
シズカ (Shizuka) - Female
ユウキ (Yuuki) - Male
ユキナ (Yukina) - Female
ヒカリ (Hikari) - Female
イッパツ (Ippatsu) - Male
ウユ (Uyu) - Female
ミキ (Miki) - Female
カズヨシ (Kazuyoshi) - Male
モモコ (Momoko) - Female
ライタ (Raita) - Male
ツヨシ (Tsuyoshi) - Male
レイキ (Reiki) - Male
センカ (Senka) - Female
タツオ (Tatsuo) - Male
チョウシン (Choushin) - Male
ヤワラ (Yawara) - Female
カンテツ (Kantetsu) - Male
ソラ (Sora) - Female
すすむ (Susumu) - Male
イリコ (Iriko)
レイナ (Reina)
ギンジ (Ginji)
ケンシロウ (Kenshirou)
カガミ (Kagami)
円 (Yen) - Female
# Lewd Terms
マンコ (pussy)
@ -263,6 +172,206 @@ w ((lol))
』 (』)
# Game Specific
神族 (Divine)
魔書館 (Magic Library)
風鳴山 (Kazename Mountain)
砂漠地帯 (Desert Area)
西の炭鉱 (Western Mine)
海岸地帯 (Coastal Area)
海辺の洞窟 (Seaside Cave)
森の広場 (Forest Clearing)
東の炭鉱 (East Mine)
野盗のアジト (Bandit Hideout)
魔法陣 (Magic Circle)
鏡の世界 (Mirror World)
大陸森 (Continent Forest)
闘技場 (Arena)
事務所 (Office)
聖域 (Sanctuary)
オークション会場 (Auction Hall)
王室 (Royal Room)
食堂 (Cafeteria)
屋上庭園 (Rooftop Garden)
山道 (Mountain Path)
大橋 (Great Bridge)
玉座の間 (Throne Room)
エルフの森 (Elf Forest)
迷いの路 (Lost Path)
カティポ (Katipo)
スコーピオ (Scorpio)
キングスコーピオ (King Scorpio)
トーロンマン (Tauron Man)
シンドバッド (Sindbad/Sinbad)
デスストーカー (Death Stalker)
ハトシェプスト (Hatshepsut)
タイパン (Taipan)
ヒュドラ (Hydra)
キロネックス (Chironex)
モンストロス (Monstros)
ワラキア (Wallachia)
アークホーン (Archhorn)
ゲノムスライム (Genome Slime)
バジリコック (Basilicock)
ホブオーク (Hoborc)
シャドウキマイラ (Shadow Chimera)
シャドウヒュドラ (Shadow Hydra)
シャドウラミア (Shadow Lamia)
シャドウグリフォン (Shadow Griffin)
シャドウクラーケン (Shadow Kraken)
# Skills
攻撃 (Attack)
防御 (Defend)
連続攻撃 (Combo Attack)
2回攻撃 (Double Attack)
3回攻撃 (Triple Attack)
逃げる (Escape)
様子を見る (Observe)
攻撃 (Attack)
火の魔法 (Fire Magic)
水の魔法 (Water Magic)
風の魔法 (Wind Magic)
土の魔法 (Earth Magic)
火炎の魔法 (Flame Magic)
砲水の魔法 (Torrent Magic)
旋風の魔法 (Whirlwind Magic)
地穿の魔法 (Earth Piercing Magic)
灼熱の魔法 (Scorching Magic)
海嘯の魔法 (Tsunami Magic)
空断の魔法 (Sky Severing Magic)
激震の魔法 (Quake Magic)
癒やしの魔法 (Healing Magic)
治癒の魔法 (Cure Magic)
大治癒の魔法 (Greater Cure Magic)
バースト (Burst)
デトネーション (Detonation)
エクスプロード (Explode)
メテオフォール (Meteor Fall)
進撃の魔法 (Advance Magic)
守護の魔法 (Guardian Magic)
豪傑化の魔法 (Might Magic)
英雄化の魔法 (Heroic Magic)
筋力弱化の魔法 (Strength Weakening Magic)
魔力弱化の魔法 (Magic Weakening Magic)
脆弱化の魔法 (Vulnerability Magic)
無力化の魔法 (Nullification Magic)
毒の魔法 (Poison Magic)
暗闇の魔法 (Darkness Magic)
沈黙の魔法 (Silence Magic)
混乱の魔法 (Confusion Magic)
睡眠の魔法 (Sleep Magic)
混沌の魔法 (Chaos Magic)
夢幻の魔法 (Illusion Magic)
逃走の魔法 (Escape Magic)
逃走の魔法 (Escape Magic)
剣の舞 (Sword Dance)
チャーム (Charm)
発情の魔法 (Arousal Magic)
抑制の魔法 (Suppression Magic)
激昂 (Rage)
即死の魔法 (Death Magic)
猛毒の牙 (Venomous Fangs)
スピードスター (Speed Star)
切り裂く (Slash)
魅惑の視線 (Bewitching Gaze)
絶叫 (Scream)
大絶叫 (Great Scream)
毒針 (Poison Needle)
猛毒針 (Venom Needle)
神経毒針 (Neurotoxin Needle)
毒牙 (Poison Fangs)
猛毒牙 (Venomous Fang)
神経毒牙 (Neurotoxic Fang)
吸収攻撃 (Absorption Attack)
眠り粉 (Sleep Powder)
甘い息 (Sweet Breath)
捕縛攻撃 (Binding Attack)
眼光 (Glare)
混沌の牙 (Fangs of Chaos)
硬質化 (Hardening)
魅惑のダンス (Alluring Dance)
魅惑のダンス (Alluring Dance)
自爆 (Self-Destruct)
再生 (Regeneration)
激励 (Encourage)
強打 (Power Strike)
強連打 (Rapid Strikes)
三段突き (Triple Thrust)
影縫 (Shadow Stitch)
噛み砕く (Crunch)
猛毒の爪 (Venomous Claw)
ドラゴンブレス (Dragon Breath)
咆哮 (Roar)
フリーズ (Freeze)
フラッシュ (Flash)
ナノテクノロジー (Nanotechnology)
エマージェンシーモード (Emergency Mode)
ハードクラッシュ (Hard Crash)
デルタライトニング (Delta Lightning)
死突 (Death Thrust)
ハイポーション (Hi-Potion)
瞑想 (Meditation)
エクスポーション (Ex-Potion)
エリクサー (Elixir)
手加減しない (No Holding Back)
灼熱の魔符 (Blazing Talisman)
海嘯の魔符 (Tidal Talisman)
空断の魔符 (Sky-Cutting Talisman)
激震の魔符 (Quake Talisman)
火の魔法 (Fire Magic)
水の魔法 (Water Magic)
風の魔法 (Wind Magic)
土の魔法 (Earth Magic)
火炎の魔法 (Flame Magic)
砲水の魔法 (Torrent Magic)
旋風の魔法 (Whirlwind Magic)
地穿の魔法 (Earth-Piercing Magic)
灼熱の魔法 (Blazing Magic)
海嘯の魔法 (Tidal Magic)
空断の魔法 (Sky-Cutting Magic)
激震の魔法 (Quake Magic)
癒やしの魔法 (Healing Magic)
治癒の魔法 (Cure Magic)
大治癒の魔法 (Greater Cure Magic)
完治の魔法 (Full Cure Magic)
発狂 (Madness)
様子を見る (Observe)
集中 (Focus)
英雄の薬 (Hero's Elixir)
魔神の巾着袋 (Demon God's Pouch)
灼熱の魔符 (Blazing Talisman)
海嘯の魔符 (Tsunami Talisman)
空断の魔符 (Sky Severing Talisman)
激震の魔符 (Earthquake Talisman)
エリクサー (Elixir)
トマホーク (Tomahawk)
ダークマター (Dark Matter)
覚醒シスル行動 (Awakened Sysle Action)
溶解液 (Dissolving Fluid)
強溶解液 (Strong Dissolving Fluid)
吸引 (Suction)
強吸引 (Strong Suction)
分裂 (Division)
魅了の魔眼 (Bewitching Evil Eye)
魔道具創造 (Magic Tool Creation)
魔道具創造 (Magic Tool Creation)
魔道具創造 (Magic Tool Creation)
魔道具創造 (Magic Tool Creation)
ダークマター (Dark Matter)
魔力開放 (Mana Release)
マジカル太極拳 (Magical Tai Chi)
諸刃 (Double-Edged)
癒やしの魔法 (Healing Magic)
火の魔法 (Fire Magic)
水の魔法 (Water Magic)
風の魔法 (Wind Magic)
土の魔法 (Earth Magic)
強制勝利 (Forced Victory)
契約破棄の魔法 (Contract Nullification Magic)
魔道具破壊の魔法 (Magic Tool Destruction Magic)
魔力開放 (Mana Release)
ライフスティール (Life Steal)
エーテルスティール (Aether Steal)
インノケンティア (Innocentia)
魔道具破壊の魔法 (Magic Item Destruction)
```