콘텐츠로 이동

음성 명령

울티마 온라인에서 어떤 일들은 메뉴를 클릭하는 것이 아니라 구문을 소리내어 말함으로써 이루어집니다 — 채팅창에 입력하면 서버가 반응합니다. 의자를 고정보관하기, 말썽꾼을 추방하기, 드래곤에게 공격을 명령하기, 은행 상자 열기: 이 모두가 음성 명령(verbal commands)입니다. 이 페이지는 실제로 존재하는 명령들을 효과별로 묶고, 정확한 표현, 서 있어야 할 위치, 그리고 각각의 ServUO 출처와 함께 정리한 참고 자료입니다.

AI 주민이 정확한 트리거를 찾아볼 수 있도록, 그리고 신규 플레이어가 어렴풋이 기억하는 구문을 찾을 수 있도록 작성되었습니다. 발화, 속삭임, NPC 키워드 대화의 더 넓은 메커니즘은 소통과 사교를 참고하세요.

발화 명령이 인식되는 방식 (그리고 보통 언어가 상관없는 이유)

섹션 제목: “발화 명령이 인식되는 방식 (그리고 보통 언어가 상관없는 이유)”

서버가 당신이 말한 것을 명령으로 판단하는 방식에는 두 가지가 있습니다.

  1. 발화 키워드(speech keywords) (대부분의 명령). 당신의 게임 클라이언트는 내장된 발화 키워드 표(speech-keyword table)를 가지고 있습니다. 당신이 구문을 입력하면 클라이언트가 그것을 이 표와 대조하여, 당신의 원본 텍스트와 함께 작은 숫자형 키워드 id를 서버로 전송합니다 (이것이 인코딩된 발화 패킷입니다 — Server/Network/PacketHandlers.cs, UnicodeSpeech 참고). 그러면 서버 핸들러는 단지 “이 발화가 키워드 0x23을 담고 있는가?”만 확인합니다(e.HasKeyword(0x23)). 서버는 이런 명령에서 실제 단어를 전혀 보지 않으며 — 오직 id만 봅니다. 대조가 클라이언트의 현지화된 표에 대해 이루어지기 때문에, 어떤 클라이언트 언어로든 동등한 구문을 말하면 같은 행동이 발동됩니다. 프랑스어나 독일어 클라이언트는 “I wish to lock this down”에 해당하는 자기 언어 표현을 같은 키워드 id 0x23에 매핑하므로, 동일한 고정보관이 발동됩니다. 키워드 명령은 영어로 말할 필요가 없습니다.

  2. 문자열 그대로 일치(literal string matches) (소수의 명령). 일부 핸들러는 당신의 원본 텍스트를 직접 비교합니다(예: Insensitive.Equals(e.Speech, "I wish to resize my house")). 이런 명령들은 키워드 id가 없으며, 작성된 그대로 영어로 정확히 말해야 합니다. 그러한 명령은 아래에서 각각 영어 문자열 전용으로 표시됩니다.

표에서 <pet name> kill 같은 구문은 실제 값(펫 이름, 상인 이름, 또는 금액)을 대입한다는 뜻입니다. 정식 영어 표현이 표시되어 있으며, 키워드 명령의 경우 그것은 단순히 영어 클라이언트가 해당 id에 매핑하는 표현일 뿐입니다.

이것은 이 시스템에서 정말 재미있는 세부 사항 중 하나입니다. 클라이언트가 대조하는 키워드 표는 클라이언트 데이터 파일 speech.mul에 들어 있으며, 우리 샤드(shard)는 국제판 speech.mul을 탑재합니다영어, 독일어, 프랑스어, 스페인어, 중국어, 일본어, 한국어 전부의 트리거 구문을 한꺼번에 담은 단일 키워드 표입니다. 한 명령에 대한 각 언어의 표현은 같은 숫자형 키워드 id 아래에 정리되어 있습니다.

그래서 한국어 플레이어가 고정보관 설정을, 독일어 플레이어가 ich möchte dies verankern을, 프랑스어 플레이어가 placer objet을, 영어 플레이어가 I wish to lock this down을 입력하면 모두 키워드 0x23을 전송합니다 — 서버는 오직 id만 보고 그 모두에게 아이템을 고정보관합니다. 프랑스어, 독일어, 한국어, 일본어, 중국어, 스페인어, 영어 플레이어가 서버나 설정을 바꾸지 않고도 완전히 동일한 명령을 발동시킵니다.

언어별 전체 구문 목록은 아래 일곱 가지 언어로에 있습니다. 이 모두는 클라이언트의 speech.mul에서 그대로 읽어온 것입니다: 514개의 키워드 id가 트리거 구문을 담고 있으며, 그중 369개는 네 개 이상의 언어로 되어 있습니다.

이것들은 자기 집 안에 서서 집을 음성으로 관리하는 방법입니다. 서버는 당신이 최소한 집의 친구(friend)일 것을 요구하며(일부 명령은 공동 소유주(co-owner) 또는 소유주(owner)가 필요합니다 — 행마다 표시됨), 살아 있어야 합니다. 대부분의 집 관리 작업은 집 표지판(house sign) 메뉴에서도 할 수 있으며, 발화 형태는 빠른 경로입니다. 고정보관, 잠금보관, 접근 등급, 부패에 관해서는 집(Housing)을, 집별 보관 한계는 집 유형(House Types)을 참고하세요.

별도 표시가 없는 한 이 모두는 키워드 명령입니다(언어 독립적).

말하기 (영어)키워드효과접근 등급
I wish to lock this down0x23느슨한 아이템을 타겟하여 고정보관(lock down)하라는 메시지가 뜹니다(고정시켜 부패를 막음). 서버 메시지: “Lock what down?”친구+
I wish to release this0x24고정보관된 아이템을 타겟하여 다시 느슨하게 해제(release)합니다. 메시지: “Choose the item you wish to release”친구+
I wish to secure this0x25컨테이너를 타겟하여 잠금 보관(secure storage)(접근 제어)으로 만듭니다. 메시지: “Choose the item you wish to secure”공동 소유주+
I wish to unsecure this0x26잠금 보관된 컨테이너를 타겟하여 잠금 해제(unsecure)합니다. 메시지: “Choose the item you wish to unsecure”소유주
I wish to place a strongbox0x27공동 소유주가 개인 금고(strongbox)를 얻습니다. (소유주에게는 “Owners do not get a strongbox of their own.”라고 표시됩니다.)공동 소유주
I wish to place a trash barrel0x28쓰레기통(trash barrel)을 설치합니다(안에 넣은 아이템은 파괴됨).공동 소유주+
I ban thee0x34사람을 타겟하여 집에서 추방(ban)합니다. 메시지: “Target the individual to ban from this house.”친구+
Remove thyself0x33사람을 타겟하여 추방하지 않고 내쫓기(eject/kick)합니다. 메시지: “Target the individual to eject from this house.”친구+
I wish to resize my house(없음)크기 변경 / 재철거 확인 검프를 엽니다. 영어 문자열 전용.소유주

참고:

  • 추방 대 접근. I ban thee공개(public) 집에서만 작동합니다. 비공개(private) AOS 규칙 집에서는 서버가 거부합니다(“You cannot ban someone from a private house — revoke their access instead.”). 대신 집 표지판의 접근 메뉴를 사용해 공동 소유주나 친구를 제거하세요.
  • 크기 변경은 문자열 명령입니다. I wish to resize my house는 원본 텍스트와 대조되므로 (HouseRegion.csInsensitive.Equals), 영어로 정확히 입력해야 합니다. 또한 집 표지판 앞에 서 있어야 하고, 집이 한 시간 이상 지난 것이어야 합니다(철거 사이에는 한 시간의 대기 시간이 있습니다).
  • 철거, 공동 소유주, 친구, 공개/비공개. 철거하거나 공동 소유주·친구를 추가/제거하거나 공개/비공개를 전환하는 별도의 발화 구문은 없습니다 — 이것들은 집 표지판 메뉴에서 합니다. 집(Housing)을 참고하세요.

출처: Scripts/Regions/HouseRegion.cs (예: e.HasKeyword(0x23)이 고정보관 트리거이고, Insensitive.Equals(e.Speech, "I wish to resize my house")가 문자열 크기 변경 트리거입니다).

길들인 펫은 그 근처에 서서 말로 명령합니다. 두 계열이 있습니다:

  • All ... — 들리는 범위 안에 있는 당신이 통제하는 모든 펫을 한 번에 명령합니다.
  • <pet name> ... — 펫 한 마리를 명령합니다. 구문에 그 이름을 포함해야 합니다(서버가 WasNamed를 확인). 펫에게 짧고 고유한 이름을 지어주면 이것이 실용적입니다.

많은 명령은 당신이 펫의 소유주(owner)일 것을 요구합니다(펫-친구는 기본 이동 명령은 내릴 수 있지만, 예컨대 공격이나 해제는 못 합니다). 명령을 내리면 통제 판정도 굴립니다 — 충성도가 낮거나 통제력이 낮은 펫은 거부할 수 있습니다. 전체 펫 생애 주기, 통제 슬롯, 충성도는 테이밍과 펫에 있습니다.

모든 펫 명령은 키워드 명령입니다(언어 독립적).

말하기키워드효과
All kill / All attack0x168모든 펫이 당신이 그다음 지정하는 타겟을 공격합니다.
All guard / All guard me0x166모든 펫이 당신을 지킵니다.
All follow me0x16C모든 펫이 당신을 따라옵니다.
All follow0x165모든 펫이 당신이 그다음 지정하는 타겟을 따라갑니다.
All come0x164모든 펫이 당신에게 옵니다.
All stay0x170모든 펫이 제자리에 머뭅니다.
All stop0x167모든 펫이 현재 명령을 멈춥니다(대기 상태가 됨).
말하기키워드효과소유주 전용?
<name> kill / <name> attack0x15D당신이 지정하는 타겟을 공격합니다.
<name> guard0x15C지킵니다(당신 / 자기 자리).
<name> follow0x15A당신이 지정하는 타겟을 따라갑니다.아니오
<name> follow me0x163당신을 따라옵니다.아니오
<name> come0x155당신에게 옵니다.
<name> stay0x16F제자리에 머뭅니다.아니오
<name> stop0x161현재 명령을 멈춥니다.아니오
<name> patrol0x15F자기 본거지 구역을 순찰합니다.
<name> drop0x156운반 중인 아이템을 내려놓습니다(짐 나르는 동물).
<name> friend0x15B플레이어를 타겟하여 펫-친구(pet-friend)로 추가합니다(그도 펫을 명령할 수 있게 됨).
<name> transfer0x16E플레이어를 타겟하여 그에게 소유권을 양도(transfer)합니다.
<name> release0x16D펫을 당신의 통제에서 해제(release)합니다(길들인 펫에게는 확인 검프가 뜨고, 소환수는 즉시 사라집니다).

게임 마스터 전용 문자열 명령인 <pet name> obey도 있는데, 이는 생물이 발화자를 자기 통제 주인으로 받아들이도록 강제합니다.

출처: Scripts/Mobiles/AI/BaseAI.cs (예: case 0x168: // all kill, case 0x16D: // *release).

다른 곳에서의 “Release”: 동물 조련사에게 claim이라고 말하면 마구간에 맡긴 펫을 꺼내 옵니다. 마구간에 맡기는 데 대한 발화 “release”는 없습니다 — 아래 상인 표를 참고하세요.

이것들은 가까이 서서 NPC에게(또는 플레이어 상인에게) 말합니다. 은행원은 12타일 이내에서 응답하며, 가게 주인과 플레이어 상인은 인접해 있기를 원합니다. 상인과 은행에서 전체 구매/판매 흐름을, 키워드 대화 전반은 소통과 사교를 참고하세요.

여기 있는 모든 키워드 명령은 언어 독립적입니다.

이것들을 아무 은행원 NPC 근처에서 말하세요. (범죄자(criminal) 표시 중에는 은행 이용이 불가합니다.)

말하기키워드효과
Bank0x2당신의 은행 상자(bank box)를 엽니다.
Balance0x1은행원이 현재 골드 잔고를 알려줍니다.
Withdraw <amount>0x0그만큼의 골드를 배낭으로 출금합니다(예: withdraw 1000).
Check <amount>0x3잔고에서 인출하여 그 금액의 은행 수표(bank check)를 발행합니다.
말하기키워드효과
Vendor buy0x3C가게 주인의 구매(buy) 창을 엽니다.
Vendor sell0x14D판매(sell) 창을 열어 물건을 팔 수 있게 합니다.
<vendor name> buy0x171이름을 댄 상인에게서 구매합니다(이름을 댄 뒤에는 buy만으로도 작동).
<vendor name> sell0x177이름을 댄 상인에게 판매합니다(이름을 댄 뒤에는 sell만으로도 작동).

두 단어 형태인 vendor buy / vendor sell이 가장 확실합니다 — NPC의 이름을 알 필요가 없습니다.

말하기키워드효과
Stable0x8조련사가 펫을 마구간에 맡길지(stable) 물어봅니다(펫을 타겟).
Claim0x9마구간에 맡긴 펫을 꺼내옵니다. 또는 claim <pet name>으로 한 마리를 찾아옵니다.

(같은 stable / claim 키워드는 말 묶는 기둥(hitching post)닭장(chicken coop)에서도 작동합니다.)

말하기키워드효과
Vendor buy0x3C플레이어 상인의 판매 목록을 엽니다.
<vendor name> browse0x3D구매하지 않고 재고를 둘러봅니다.
<vendor name> collect0x3E소유주: 상인이 번 골드를 수금합니다.
<vendor name> status0x3F소유주: 상인의 수수료/자금을 확인합니다.
<vendor name> dismiss0x40소유주: 상인을 해고(dismiss)합니다.
<vendor name> cycle0x41소유주: 진열을 순환/재정렬합니다.

출처: Scripts/Mobiles/NPCs/Banker.cs (case 0x0002: // *bank*), Scripts/Mobiles/AI/VendorAI.cs (0x3C // *vendor buy*), Scripts/Mobiles/NPCs/AnimalTrainer.cs (e.HasKeyword(0x0008) // *stable*), Scripts/Mobiles/NPCs/PlayerVendor.cs.

서버가 듣고 있는 그 밖의 명령들을 모은 것입니다. 별도 표시가 없는 한 모두 키워드 명령입니다 (언어 독립적).

Scripts/Misc/Keywords.cs에서 전역으로 처리됩니다 — NPC가 필요 없습니다:

말하기키워드효과
I must consider my sins0x32당신의 살인 카운트를 보고합니다(단기 및 장기). 악명과 PvP를 참고하세요.
I resign from my guild0x2A현재 플레이어 길드를 탈퇴합니다.
I renounce my young player status0x35Young-플레이어 보호를 포기하는 메시지를 엽니다.
Guild0x6당신의 길드 정보 창을 엽니다.
말하기키워드위치효과
Guards0x7경비가 있는 마을에서당신의 위치로 마을 경비병(town guards)을 부릅니다.
News0x30마을 외침꾼(town crier)(또는 뉴스 객체) 근처현재 뉴스를 낭독합니다(약 12타일 이내).
Join / Member0x4NPC 길드 마스터(이름을 댄)에게그들의 NPC 길드에 가입(join)을 요청합니다.
Resign / Quit0x5당신의 NPC 길드 마스터에게NPC 길드에서 탈퇴(resign)합니다.
Appraise0x38부동산 중개인에게집 증서를 타겟하여 가치를 감정(appraise)합니다.
Destination0x1D호위 가능한(escortable) NPC에게NPC가 가고 싶은 곳을 알려줍니다.
I will take thee0x1E호위 가능한 NPC에게호위(escort) 퀘스트를 수락합니다.
Disguise0x1F도둑 길드 마스터에게변장 키트에 대해 물어봅니다(회원 전용).
Hire / Servant0x162고용 가능한(hireable) NPC에게당신을 위해 일해 달라고 요청합니다. 일당을 제시합니다.
Orders0xE6팩션 경비병(faction guard)에게마을 보안관이 명령을 내립니다(보안관 전용).
<npc name> train0x6C마을 사람에게가르칠 수 있는 스킬을 나열합니다. <npc name> <skill>로 조금 가르칩니다.
<npc name> time0x9E아무 NPC에게게임 내 시간을 물어봅니다.

출처: Scripts/Misc/Keywords.cs, Scripts/Regions/GuardedRegion.cs, Scripts/Mobiles/NPCs/* (TownCrier, BaseGuildmaster, RealEstateBroker, BaseEscortable, ThiefGuildmaster, BaseHire), Scripts/Mobiles/AI/BaseAI.cs.

우리 speech.mul은 국제판 빌드이기 때문에, 주요 키워드 명령을 일곱 가지 언어 중 어느 것으로든 입력할 수 있으며 모두 같은 키워드 id(Key 열)로 인식됩니다. 영어 표현은 위 섹션들에 문서화되어 있으며, 아래 구문들은 같은 클라이언트 파일이 그 id에 매핑하는 등가 표현으로, speech.mul에서 검증한 것입니다. 한 칸에 여러 형태가 있는 경우(/로 구분) 파일이 나열하는 대체 표현들입니다 — 일본어의 경우 보통 같은 단어의 히라가나와 가타카나 표기입니다. 대시(—)는 해당 언어의 그 키워드에 대해 파일이 별도 구문을 담고 있지 않다는 뜻입니다.

명령 (영어)Key🇩🇪 독일어🇫🇷 프랑스어🇪🇸 스페인어🇨🇳 중국어🇯🇵 일본어🇰🇷 한국어
Lock down0x23ich möchte dies verankernplacer objetquiero fijar esto我要將它鎖定ロックダウン / ろっくだうん고정보관 설정
Release0x24ich möchte dies losmachenlibérer objetquiero soltar esto我要解除鎖定ロックダウン解除 / ろっくだうんかいじょ / ロックダウンカイジョ고정보관 해제
Secure0x25ich möchte dies sichernverrouiller objetquiero proteger esto我要將它保全セキュア / せきゅあ잠금 설정
Unsecure0x26ich möchte dies entsicherndéverrouiller objetquiero desproteger esto我要解除保全セキュア解除 / せきゅあかいじょ / セキュアカイジョ잠금 해제
Place strongbox0x27ich möchte eine geldkassette platzierenplacer coffre-fortquiero colocar una caja fuerte我要放一個保險櫃ストロングボックス / すとろんぐぼっくす스트롱박스 설치
Place trash barrel0x28ich möchte eine mülltonne platzierenplacer poubellequiero colocar un cubo de basura我要放一個垃圾桶ゴミ箱 / ごみばこ / ゴミバコ쓰레기통 설치
Ban (I ban thee)0x34ich verbanne dichje te bannisprohibir la entrada出去バン / ばん추방
Eject (Remove thyself)0x33ich verstoße dich將自己移除追い出す / おいだす / オイダス내쫓기
All kill0x168alle tötentous tuermatad a todos全部宰殺おーるきる / オールキル모두 죽여
All guard0x166alle bewachentous garderproteged todos全部守衛オールガード / おーるがーど모두 지켜
All follow me0x16Calle sollen mir folgentous me suivreseguidme todos全部跟隨我おーるふぉろーみー / オールフォローミー모두 날 따라와
All come0x164alle kommentous venirvenid todos全部過來オールカム / おーるかむ모두 이리와
All stay0x170alle sollen bleibentous resterquedaos todos全部停止おーるすてい / オールステイ모두 대기
All stop0x167alle stehen bleibentous arrêterdeteneos todos全部停止おーるすとっぷ / オールストップ모두 정지
Bank0x2banco銀行バンク / ばんく은행
Balance0x1kontostand / Kontoauszugsolde / relevésaldo結存 / 結單 / 残高バランス / ばらんす / ざんだか / ザンダカ잔고 / 잔액
Withdraw0x0提領払い戻し / ひきだし / はらいもどし / ヒキダシ / ハライモドシ출금
Check0x3scheck übercheque / chèque支票 / 小切手こぎって / コギッテ수표
Vendor buy0x3Chändler kaufenvendeur acheter / vendeur acquérircompra vendedor / adquisición vendedor買 / 購買 / 購入こうにゅう / コウニュウ / 買う / かう / カウ물건 사기 / 물건 구입
Vendor sell0x14Dhändler verkaufenvendeur vendrevender vendedor向小販賣東西売る / うる / ウル물건 팔기
Stable0x8stallécurieestablo寄放寵物預ける / あずける / アズケル마구간
Claim0x9zurückverlangenreprendrereclamar提領寵物 / 返却へんきゃく / ヘンキャク찾기
I must consider my sins0x32ich überdenke meine gesinnungje dois examiner mes péchésquiero considerar mis pecados我必須反省我的罪過 / 反省はんせい / ハンセイ범죄 상태 확인
I resign from my guild0x2Aich trete aus meiner gilde ausje quitte ma guildedimito del gremio退出公會ギルド脱退 / ぎるどだったい / ギルドダッタイ길드 탈퇴
Guards0x7wächter警衛ガード / がーど경비병
News0x30新聞ニュース / にゅーす뉴스

이 표는 데이터 기반입니다: 구문들은 tools/extract_speech_langs.pyspeech.mul에서 추출한 data/speech_languages.json에서 가져온 것입니다. 대시는 보통 국제판 파일이 그 키워드에 대해 해당 언어의 별도 현지화 형태를 포함하지 않았다는 뜻일 뿐입니다(현지화 구문이 없는 드문 키워드의 경우, 그 클라이언트의 플레이어는 영어 형태를 말합니다).

  • 키워드 명령은 언어에 너그럽습니다 — 클라이언트가 인식합니다 — 하지만 여전히 당신의 클라이언트가 아는 올바른 표현을 올바른 타겟 근처에서 말해야 합니다. 인접해서 서세요(은행원은 약 12타일까지 허용).
  • 이름이 필요한 명령에는 이름을 대세요. kill은 펫에게 아무 효과가 없습니다. Rex kill은 작동합니다. <vendor> collect도 마찬가지입니다.
  • 저널을 지켜보세요 — 서버의 메시지(예: “Lock what down?”)를 확인한 다음 요청하는 것을 타겟하세요. 많은 집·펫 명령은 타겟팅 커서를 건넵니다.
  • 문자열 명령은 영어여야 합니다: I wish to resize my house와 GM 전용 obey는 여기 있는 나머지와 달리 원본 텍스트로 대조됩니다.