譯介|撰寫《Facade》:程序化創作的案例研究


3樓貓 發佈時間:2024-10-16 23:32:43 作者:強欲之阿爾泰爾 Language

原文:點擊跳轉

引語

Façade是一個由大量對話片段在戲劇管理器的組織下根據玩家輸入進行反應從而呈現一段完整劇情流程的實驗性敘事遊戲。由作者所撰寫的文章(https://electronicbookreview.com/essay/writing-facade-a-case-study-in-procedural-authorship/ )詳細介紹了他們創造這一體驗所使用的方法,並進行了反思。我對其中有參考性的中後部分在AI輔助下進行了翻譯。文章前面的部分若有興趣,前往原文用機翻看一下就行。
視頻地址:https://www.bilibili.com/video/BV1NZ4y1p7os/?spm_id_from=333.337.search-card.all.click
遊戲下載地址(免費,英文):https://www.playablstudios.com/facade

3.4 Richness Through Coherent Intermixing

3.4 通過連貫的交織混合實現豐富性
To dramatically perform Façade's social games as coherent, focused, well-paced narratives, an organizing principle is required that breaks away from the constraints of traditional branching narrative structures, to avoid the combinatorial explosion that occurs with complex causal event chains (Crawford 1989). Our approach to this in Façade is twofold: first, we divide the narrative into multiple fronts of progression, often causally independent, only occasionally interdependent. Second, we build a variety of narrative sequencers to sequence these multiple narrative progressions. These procedural sequencers, described next, operate in parallel and can coherently intermix their performances with one another. 為了將《Facade》的社交遊戲以連貫、專注、節奏良好的敘事方式進行戲劇化表演,需要一個組織原則,打破傳統分支敘事結構的限制,以避免複雜因果事件鏈所導致的組合爆炸(Crawford 1989)。我們在《Facade》中對此的處理有兩個方面:首先,我們將敘事分為多個進展前線,這些前線通常是因果獨立的,只有偶爾相互依賴。其次,我們構建了多種敘事序列器,以對這些多個敘事進展進行排序。這些接下來描述的程序序列器並行操作,並能夠連貫地相互交織混合它們的表現。
Façade's architecture and content structure are two sides of the same coin, and will be described in tandem; along the way, we will describe how the coherent intermixing is achieved. 《Facade》的架構和內容結構是同一事物的兩個方面,將同時進行描述;在此過程中,我們將闡述如何實現連貫的交織混合。

3.4.1 Architecture and Content Framework

3.4.1 架構和內容框架
The Façade system consists of several procedural subsystems that operate simultaneously and communicate with one another (Mateas and Stern 2000, 2003a, 2003b, 2004a, 2004b). Each is briefly described here. Façade系統由多個同時運行並相互通信的程序子系統組成(Mateas 和 Stern 2000、2003a、2003b、2004a、2004b)。以下是對每個子系統的簡要描述。
The dynamic, moment-by-moment performance of the characters Grace and Trip - how they perform their dialogue, how they express emotion, how they follow the player around and use objects - are written as a vast collection of behaviors, which are short reactive procedures representing numerous goals and sub-goals for the characters, arranged in a vast, hierarchical, dynamically changing tree structure. These behaviors are written in a reactive-planning language called "A Behavior Language" (ABL), developed as part of the Façade project, that manages both parallel and sequential behavior interrelations such as sub-goal success and failure, priority, conflict, preconditions and context conditions. 角色格蕾絲(Grace)和特里普(Trip)的動態、瞬息萬變的表演——他們如何進行對話,如何表達情感,如何跟隨玩家並使用物體——被編寫為一個龐大的行為集合,這些行為是短小的反應程序,代表了角色的眾多目標和子目標,排列在一個龐大、層次分明、動態變化的樹狀結構中。這些行為是用一種稱為“行為語言”(A Behavior Language,ABL)的反應規劃語言編寫的,該語言是《Facade》項目的一部分,管理著並行和順序行為之間的相互關係,如子目標的成功與失敗、優先級、衝突、前提條件和上下文條件。
The narrative sequencers for the social games are also written in ABL, taking advantage of ABL's ability to perform meta-behaviors that modify the runtime state of other behaviors. 社交遊戲的敘事序列器也使用 ABL 編寫,利用 ABL 能夠執行元行為的能力,從而修改其他行為的運行時狀態。
The highest-level narrative sequencer, a subsystem called the drama manager, sequences dramatic beats according to specifications written in a custom drama management language. Beats in Façade are large groups of behaviors organized around a particular topic, described in the next section. 最高級別的敘事序列器是一個名為戲劇管理器的子系統,它根據用自定義戲劇管理語言編寫的規範來排列戲劇節拍。在《Facade》中,節拍是圍繞特定主題組織的大組行為,下一部分將對此進行描述。
Another subsystem is a set of rules for understanding and interpreting natural language (NL) and gestural input from the player. These rules are written in a custom language implemented with Jess, a forward-chaining rule language. When the player enters dialogue, these NL rules interpret one or more meanings (the aforementioned discourse acts). A second set of rules called reaction proposers further interpret these discourse acts in context-specific ways, such as agreement, disagreement, alliance, or provocation, and send this interpretation to the behaviors and drama manager to react to. 另一個子系統是一套用於理解和解釋玩家自然語言(NL)和手勢輸入的規則。這些規則是用自定義語言編寫的,使用了 Jess 這一前向鏈規則語言實現。當玩家輸入對話時,這些 NL 規則會解釋出一個或多個含義(即前面提到的語篇行為)。第二套規則稱為反應提議者,它們以特定上下文的方式進一步解釋這些語篇行為,例如同意、不同意、結盟或挑釁,並將這種解釋發送給行為和戲劇管理器以作出反應。
The final subsystem is a custom animation engine that performs character action, emotional expression and spoken dialogue by way of real-time non-photorealistic procedural rendering, as well as music and sound. The animation engine is driven by the ABL behaviors; the engine also senses information about the location and actions of each character for the behaviors to use. 最後一個子系統是一個自定義動畫引擎,通過實時非寫實程序渲染來執行角色動作、情感表達和口語對話,以及音樂和聲音。動畫引擎由 ABL 行為驅動;該引擎還感知每個角色的位置和動作信息,以供行為使用。

Table 30.1. Façade's discourse acts.

表 30.1. 《Facade》的對話行為。
術語 術語翻譯 agree 同意 disagree 不同意 generalExclamation 一般感嘆 positiveExclamation 積極感嘆 negativeExclamation 消極感嘆 express <emotion> 表達<情感> maybeUnsure 可能不確定 dontUnderstand 不理解 thank 感謝 apologize 道歉 referTo <character> | <object> | <topic> | <theme> 提及 <角色> | <物體> | <話題> | <主題> physicallyFavor <object> 身體上偏愛<物體> praise 讚美 hugComfort 擁抱安慰 flirt 調情 kiss 吻 showConcern 表示關心 howAreYou 你好嗎 areYouOkay 你還好嗎 showSupport 表示支持 pacify 安撫 criticize 批評 oppose 反對 greet 問候 goodbye 再見 getAttention 引起注意 inappropriateObscene 不當/淫穢 explain <explainAdviceDescriptor> 解釋<解釋建議描述> advice <explainAdviceDescriptor> 建議<解釋建議描述> explainRelationship <character1> <relationshipDescriptor> <character2> 解釋關係<角色1> <關係描述> <角色2> leaveApartment 離開公寓 leaveForKitchen 離開去廚房 uncooperativeNotSpeaking 不合作不說話 uncooperativeNotMoving 不合作不動 uncooperativeFidgety 不合作坐立不安 systemDoesntUnderstand 系統無法理解

3.4.2 Beats, Beat Goals, and Beat Mix-ins

3.4.2 節拍、節拍目標、節拍混合
Façade's primary narrative sequencing occurs within a beat, inspired by the smallest unit of dramatic action in the theory of dramatic writing (McKee 1997). However, Façade's beats ended up being larger structures than the canonical beats of dramatic writing. In dramatic writing, a beat tends to consist of just a few lines of dialogue that convey a single narrative action/reaction pair. For example, in the scene in Casablanca where Rick confronts Ilsa about why she returned, the following exchange forms a single beat: RICK: "Why'd you come back? To tell me why you ran out on me at the railway station?" ILSA: "Yes." A Façade beat, however, is comprised of anywhere from 10 to 100 joint dialogue behaviors (JDBs), written in ABL. Each beat itself is a narrative sequencer, responsible for sequencing a subset of its JDBs in response to player interaction. Only one beat is active at any time. A JDB, Façade's atomic unit of dramatic action (and closer to the canonical beat of dramatic writing), consists of a tightly coordinated, dramatic exchange of 1 to 5 lines of dialogue between Grace and Trip, typically lasting a few seconds. JDBs typically consist of 50 to 200 lines of ABL code. A beat's JDBs are organized around a common narrative goal, such as a brief conflict about a topic, like Grace's obsession with redecorating, or the revelation of an important secret, like Trip's attempt to force Grace to enjoy their second honeymoon in Italy. Each JDB is capable of changing one or more values of story state, such as the affinity game's value, or any of the therapy game's self-revelation progression counters, or the overall story tension level. Within-beat narrative sequencers implement the affinity game; the topic of a beat is a particular instance of the affinity game. 《Facade》的主要敘事序列發生在一個節拍內,靈感來源於戲劇寫作理論中最小的戲劇動作單元(McKee 1997)。然而,《Facade》的節拍最終成為比戲劇寫作的經典節拍更大的結構。在戲劇寫作中,一個節拍通常由幾行對話組成,傳達一個單一的敘事動作/反應對。例如,在《卡薩布蘭卡》中,裡克質問伊爾莎為什麼她回來,以下對話構成一個單一的節拍:裡克:“你為什麼回來?是想告訴我你為什麼在火車站拋下我嗎?”伊爾莎:“是的。”然而,《Facade》的一個節拍由 10 到 100 個聯合對話行為( joint dialogue behaviors, JDB)組成,這些行為是用 ABL 編寫的。每個節拍本身是一個敘事序列器,負責根據玩家的互動對其 JDB 的子集進行排序。任何時候只有一個節拍處於活動狀態。JDB 是《Facade》的戲劇動作原子單元(更接近戲劇寫作的經典節拍),由格蕾絲和特里普之間緊密協調的 1 到 5 行對話組成,通常持續幾秒鐘。JDB 通常由 50 到 200 行 ABL 代碼組成。一個節拍的 JDB 圍繞一個共同的敘事目標組織,例如關於某個主題的簡短衝突,如格蕾絲對重新裝修的痴迷,或重要秘密的揭示,如特里普試圖強迫格蕾絲享受他們在意大利的第二次蜜月。每個 JDB 都能夠改變一個或多個故事狀態的值,例如親密度遊戲的值,或任何治療遊戲的自我揭示進度計,或整體故事緊張水平。節拍內的敘事序列器實現親密度遊戲;節拍的主題是親密度遊戲的特定實例。
Each beat can be viewed as a bag of procedural content, specifically JDBs, which are dynamically sequenced by the specific logic of each beat. The drama manager is, in turn, a bag of procedural content, specifically beats, which are dynamically sequenced by the general logic of the drama manager, as influenced by the preconditions, weights, priorities, etc. specified for each beat. The logic required to sequence individual lines of dialogue is more detailed and complex than can be easily described in the declarative annotations at the drama management level; this is precisely why our beats turned out to be larger than traditional beats of dramatic writing. The detailed sequencing and coordination of individual lines of dialogue is more readily expressed in ABL than in the beat description language, and in fact changes enough from context to context within the drama that a generic decision-making process for sequencing lines of dialogue is not feasible (at least, not without much deeper knowledge representation, deep reasoning about human social interaction, including common-sense reasoning, etc.). Thus, we push that detailed logic into the custom narrative sequencers, written in ABL, that live within each beat, leaving the drama manager to sequence larger blocks of narrative content whose interrelationships are simple enough that they can be managed by the more generic decision-making process operating at this level. 每個節拍可以視為一個程序內容的集合,特別是 JDBs,它們由每個節拍的特定邏輯動態排序。反過來,戲劇管理器也是一個程序內容的集合,特別是節拍,它們由戲劇管理器的一般邏輯動態排序,受每個節拍的前提條件、權重、優先級等的影響。對單獨對話行進行排序所需的邏輯比在戲劇管理層面的聲明性註釋中容易描述的要複雜得多;這正是我們的節拍比傳統戲劇寫作的節拍更大的原因。單獨對話行的詳細排序和協調在 ABL 中比在節拍描述語言中更容易表達,實際上在戲劇的不同上下文中變化足夠大,以至於不可能有一個通用的對話行排序決策過程(至少,沒有更深層次的知識表示、對人類社會互動的深度推理,包括常識推理等)。因此,我們將這種詳細邏輯推入每個節拍內的自定義敘事序列器,這些序列器用 ABL 編寫,留下戲劇管理器來排序更大塊的敘事內容,其相互關係簡單到可以由在此層面上運作的更通用的決策過程管理。
There are two typical uses of JDBs within beats: as beat goals and beat mix-ins. A beat consists of a canonical sequence of narrative goals called beat goals. The typical canonical sequence consists of a transition-in goal that provides a narrative transition into the beat (e.g., bringing up a new topic, perhaps connecting it to the previous topic), several body goals that accomplish the beat (in affinity game beats, the body goals establish topic-specific conflicts between Grace and Trip that force the player to choose sides), a wait goal in which Grace and Trip wait for the player to respond to the head game established by the beat, and a default transition-out that transitions out of the beat in the event of no player interaction. In general, transition-out goals both reveal information and communicate how the player's action within the beat has changed the affinity dynamic. 在節拍內,JDB 的典型用途有兩種:作為節拍目標,和節拍混合。一個節拍由一系列稱為節拍目標的經典敘事目標組成。典型的經典序列包括:
  1. 一個過渡目標,用於提供進入節拍的敘事過渡(例如,提出一個新主題,可能與前一個主題相關)
  2. 幾個實現節拍的主體目標(在親密度遊戲節拍中,主體目標在格蕾絲和特里普之間建立特定主題的衝突,迫使玩家選擇立場)
  3. 一個等待目標,在此目標中,格蕾絲和特里普等待玩家對節拍所建立的頭部遊戲作出反應
  4. 以及一個默認的過渡出目標,在沒有玩家互動的情況下從節拍中過渡出去。一般來說,過渡出目標既揭示信息,又傳達玩家在節拍內的行動如何改變了親密度動態。
A beat's canonical beat goal sequence captures how the beat would play out in the absence of interaction. In addition to the beat goals, there is a set of meta-behaviors, called handlers, which wait for specific interpretations of player dialogue (discourse acts), and modify the canonical sequence in response, typically using beat mix-ins. That is, the handler logic implements the custom narrative sequencer for the beat. Beat mix-in JDBs are beat-specific reactions used to respond to player actions and connect the interaction back to the canonical sequence. Handlers are responsible both for potentially adding, removing, and reordering future beat goals, as well as interjecting beat mix-ins into the canonical sequence. By factoring the narrative sequencing logic and the beat goals in this way, we avoid having to manually unwind the sequencing logic into the beat goal JDBs themselves, thus avoiding the dialogue tree problem mentioned earlier. 一個節拍的規範節拍目標序列捕捉了在沒有(玩家)互動的情況下節拍的展開方式。除了節拍目標外,還有一組稱為處理程序的元行為,它們等待對玩家對話(對話行為)的特定解釋,並通常使用節拍混合相應地修改規範序列。也就是說,處理程序邏輯實現了節拍的自定義敘事序列器。節拍混合 JDBs 是用於響應玩家行為並將(玩家)互動連接回規範序列的特定於節拍的反應。處理程序負責可能添加、刪除和重新排序未來的節拍目標,以及將節拍混合插入規範序列。通過以這種方式分解敘事排序邏輯和節拍目標,我們避免了必須手動將排序邏輯展開到節拍目標 JDBs 本身,從而避免了前面提到的對話樹問題。
For Façade, an experience that lasts about 20 minutes and requires several replays to see all of the content available (any one run-through performs at most 25% of the total content available), we authored about 2,500 JDBs. Approximately 66% of those 2,500 are in beat goals and beat mix-ins, organized into 27 distinct beats, of which approximately 15 are encountered by the player in any one run-through (see the drama management section). 對於《Facade》,一次體驗持續約 20 分鐘,需要多次重玩才能看到所有可用內容(一次通關最多體驗 25% 的內容),我們創作了大約 2500 個 JDBs。其中大約 66% 在節拍目標和節拍混合中,組織成了 27 個不同的節拍,其中大約 15 個在任何一次通關中都會被玩家遇到(參見3.4.4.戲劇管理部分)。

3.4.3 Global Mix-in Progressions

3.4.3 全局混入進程
Another type of narrative sequencer, which operates in parallel to, and can intermix with, beat goals and beat mix-ins, are global mix-ins. (How coherent intermixing is achieved is described later.) Each category of global mix-in has three tiers, progressively digging deeper into a topic; advancement of tiers is caused by player interaction, such as referring to the topic. Each tier in the progression is constructed from one or more JDBs, just like beat goals or beat mix-ins. They are focused on satellite topics such as marriage, divorce, sex, and therapy; or about objects such as the furniture, drinks, their wedding photo, the brass bull, or the view; or as generic reactions to praise, criticism, flirtations, oppositions, and the like. Additionally, there are a variety of generic deflection and recovery global mix-ins for responding to overly confusing or inappropriate input from the player. In total, there are about 20 instances of this type of narrative sequencer in Façade, comprising about 33% of the roughly 2,500 total JDBs. 另一種敘事序列器是全局混合,它與節拍目標和節拍混合並行操作,並可以與其交錯混合(如何實現連貫的交織混合將在後面描述)。每個全局混合類別有三個層級,逐步深入一個話題;層級的推進是由玩家互動引起的,例如提及該話題。每個層級的構建由一個或多個 JDB 組成,就像節拍目標或節拍混合一樣。它們專注於次要話題,如婚姻、離婚、性和治療;或關於物體,如傢俱、飲料、他們的婚禮照片、銅牛或風景;或作為對讚美、批評、調情、反對等的通用反應。此外,還有多種通用的偏轉和恢復全局混合,用於回應玩家的過於混亂或不當的輸入。總的來說,《Facade》中大約有 20 個此類敘事序列器,佔大約 2,500 個 JDB 總數的 33%。

3.4.4 Drama Management (Beat Sequencing)

3.4.4 戲劇管理(節拍排序)
The coarsest narrative sequencing in Façade occurs in the drama manager, or beat sequencer, as seen in table 30.2. 《Facade》中最粗略的敘事排序發生在戲劇管理器或節拍排序器中,如表 30.2 所示:(包含27個節拍,即前文提及的由2500個JDBs中的66%所組成的)
術語 術語翻譯 PlayerArrives 玩家到達 TripGreetsPlayer Trip問候玩家 PlayerEntersTripGetsGrace 玩家進入Trip並得到Grace GraceGreetsPlayer Grace問候玩家 ArgueOverRedecorating 爭論重新裝修 ExplainDatingAnniversary 解釋約會週年紀念 ArgueOverItalyVacation 爭論意大利假期 FightOverFixingDrinks 為調製飲料而爭吵 PhoneCallFromParents 來自父母的電話 TransitionToTension2 過渡到緊張2 GraceStormsToKitchen Grace衝進廚房 PlayerFollowsGraceToKitchen 玩家跟隨Grace去廚房 GraceReturnsFromKitchen Grace從廚房回來 TripStormsToKitchen Trip衝進廚房 PlayerFollowsTripToKitchen 玩家跟隨Trip去廚房 TripReturnsFromKitchen Trip從廚房回來 TripReenactsProposal Trip重演求婚 BlowupCrisis 爆發危機 PostCrisis 危機後 TherapyGame 治療遊戲 RevelationsBuildup 啟示積累 Revelations 啟示 EndingNoRevelations 結局無啟示 EndingSelfRevelationsOnly 結局僅有自我啟示 EndingRelationshipRevelationsOnly 結局僅有關係啟示 EndingBothNotFullySelfAware 結局雙方未完全自覺 EndingBothSelfAware 結局雙方自覺
This lies dormant most of the time, only active when the current beat is finished or is aborted (by the beat's own decision, or by a global mix-in). It is at the beat sequencing level where causal dependence between major events is handled - that is, where high-level plot decisions are made. 大部分時間,這個系統處於休眠狀態,只有在當前節拍完成或被中止(由節拍自身的決定或全局混合)時才會激活。在節拍排序層面上,處理主要事件之間的因果依賴關係——也就是說,在這裡做出高層次的情節決策。
In a beat sequencing language, the author annotates each beat with selection knowledge consisting of preconditions, weights, weight tests, priorities, priority tests, and story value effects - the overall tension level, in Façade's case. Given a collection of beats represented in the beat language, such as the twenty-seven listed in table 30.2, the beat sequencer selects the next beat to be performed. The unused beat whose preconditions are satisfied and whose story tension effects most closely match the near-term trajectory of an author-specified story tension arc (in Façade, an Aristotelian tension arc) is the one chosen; weights and priorities also influence the decision (Mateas and Stern 2003b). 在節拍排序語言中,作者為每個節拍註釋選擇知識,包括前提條件、權重、權重測試、優先級、優先級測試和故事價值效應——在《Facade》中是整體緊張水平。給定一組在節拍語言中表示的節拍,例如表 30.2 中列出的二十七個節拍,節拍排序器選擇下一個要執行的節拍。滿足前提條件且其故事緊張效應與作者指定的故事緊張弧(在《Facade》中是亞里士多德的緊張弧)(譯註:亞里士多德的緊張弧指亞里士多德在《詩學》中所提出的,包含引入、上升動作、高潮、下降動作、結局的一種情節結構)的短期軌跡最接近的未使用節拍將被選中;權重和優先級也會影響決策(Mateas 和 Stern 2003b)。
Beat sequencing is further discussed in the Coherent Intermixing section, as well as that on Failures and Successes. 節拍排序在“連貫的交織混合”部分以及“失敗與成功”部分中有進一步討論。

3.4.5 Long-term Autonomous Mix-in Behaviors

3.4.5 長期自主混合行為
Long-term autonomous behaviors, such as fixing drinks and sipping them over time, or compulsively playing with an advice ball toy, last longer than a sixty-second beat or a ten-second global mix-in. While perhaps performing only a minor narrative function, occasionally mixing in a JDB into the current beat (comprising only 1% of Façade's JDBs), they contribute a great deal to the appearance of intelligence in the characters, by having them perform extended, coherent series of low-level actions in the background over the course of many minutes, across several beat boundaries. By simultaneously performing completely autonomous behaviors and joint behaviors, Façade characters are a hybrid between the "one-mind" and "many-mind" extremes of approaches to agent coordination, becoming in effect "multi-mind" agents (Mateas and Stern 2004a). 長期自主行為,例如調製飲料並在一段時間內慢慢品嚐,或不禁地玩弄一個建議球玩具(一種內置多面體、每個面寫了不同答案的玩具)、持續時間超過六十秒的節拍或十秒的全局混合。雖然這些行為可能只在敘事中起到次要作用,偶爾在當前節拍中混入一個JDB(僅佔Façade的JDB的1%),但它們通過讓角色在幾分鐘內跨越多個節拍邊界執行延長的、連貫的低級動作系列,會使角色表現得更加智能。通過同時執行完全自主行為和聯合行為,Façade角色在代理協調方法的“單一心智”和“多重心智”極端之間成為一種混合體,實際上成為“多重心智”代理(Mateas和Stern 2004a)。

3.5 Strategies for Coherent Intermixing

3.5 連貫的交織混合策略 With only a few exceptions, the affinity game beats themselves are also designed to be causally independent of one another. For example, in terms of maintaining coherency, it does not matter in which order Grace and Trip argue about Italy, their parents, redecorating, fixing drinks, or their dating anniversary. When beat sequencing, this allows the drama manager to prefer sequencing any beats related to past topics brought up by the player. Likewise, hot-button mix-ins can be safely triggered in any order, into almost any beat at any time. 除了少數例外,親和力遊戲節拍本身也被設計為彼此之間在因果上獨立。例如,為了保持連貫性,Grace和Trip關於意大利、他們的父母、重新裝修、調酒,或者他們的約會週年紀念日的爭論的順序並不重要。在節拍排序時,這允許戲劇經理優先排序與玩家提出的過去話題相關的任何節拍。同樣,熱門混入可以在任何順序、任何時間安全地觸發到幾乎任何節拍。
However, great authorial effort was taken to make the tone of each beat goal/mix-in and global mix-in match each other during performance. Most JDBs are authored with three to five alternates for expressing their narrative contents at different combinations of player affinity and tension level. These include variations in word choice, voice acting, emotion, gesture, and appropriate variation of information revealed. By having the tone of hot-button global mix-ins and affinity game beat goals/mix-ins always match each other, players often perceive them as causally related, even though they are not. Additionally, for any one tone, most JDBs are authored with two to four dialogue alternates, equivalent in narrative functionality but helping create a sense of freshness and non-roboticness in the characters between run-throughs of the drama. 然而,作者付出了巨大的努力,使每個節拍目標/混入和全局混入在表演過程中的語氣相匹配。大多數JDB都有三到五個備選方案,用於在不同的玩家親和力和緊張水平的組合中表達他們的敘事內容。這些包括在詞彙選擇、配音、情感、手勢,以及適當的信息揭示變化上的變化。通過讓熱門全局混入和親和力遊戲節拍目標/混入的語氣始終相匹配,玩家通常會將它們視為因果相關,儘管它們並非如此。此外,對於任何一種語氣,大多數JDB都有兩到四個對話備選方案,這些方案在敘事功能上是等價的,但有助於在戲劇的演繹過程中為角色創造一種新鮮感和非機器人感。

4.1 Designing the Core Structure of a Façade Beat

4.1 設計立面節拍的核心結構
Our example will be the beat "FightOverFixingDrinks," in which Trip and Grace argue over what kind of drink to make for the player, intended to reveal some of the underlying tension between them, and to further develop their characters. In the first half of the drama during which this beat can occur, the couple Grace and Trip, whose marriage has reached its breaking point, are trying their best to act like nothing is wrong. Specifically in this beat, we'll have Trip use fixing drinks as way to brag about how well-off and cultured he thinks they are. Grace, however, emboldened by the presence of the player, will counter Trip with an attempted attack on Trip about his materialism and faux-sophistication. Both Grace and Trip will challenge the player to take sides on these differences. 我們的例子是“FightOverFishingDrinks”節拍,其中 Trip 和 Grace 爭論該為玩家制作哪種飲料,旨在揭示他們之間的一些潛在緊張關係,並進一步發展他們的角色。在劇情的前半段,婚姻已經到了破裂的邊緣,格蕾絲和特里普夫婦竭盡全力表現得好像什麼都沒有發生一樣。具體來說,在這一節中,我們將讓特里普使用配製飲料來吹噓他認為自己是多麼富裕和有文化。然而,格蕾絲因玩家的存在而膽大妄為,她會試圖攻擊特里普的唯物主義和虛假的複雜性,以此來反擊特里普。格蕾絲和特里普都會挑戰玩家在這些差異上採取立場。
We will first lay out a relatively simple outline for the beat, to which we can add additional richness as we go. We designed a basic structure for this beat as follows, as a sequence of beat goals: 我們將首先為節拍制定一個相對簡單的輪廓,我們可以在進行過程中添加額外的豐富性。我們為這個節拍設計瞭如下基本結構,作為節拍目標的序列:
• Transition-in to the beat - Trip brings up the idea of drinks. • 融入節奏——Trip 帶來了飲料的想法。
• Trip makes an initial suggestion, with bragging; Grace initially reacts to the brag. They wait for a few seconds for a player response, if any. • Trip 提出初步建議,並吹牛;格蕾絲最初對這個吹牛做出了反應。他們會等待幾秒鐘以等待玩家響應(如果有)。
• Grace counters with her own suggestion based on what the player said, attacking Trip; Trip resists. They wait for a few seconds for another player response, if any. • Grace根據玩家所說的內容提出了自己的建議,攻擊Trip;旅行抵抗。他們等待幾秒鐘以等待其他玩家的響應(如果有)。
• Transition-out of the beat - Trip and Grace each react to the player's decision, and Trip begins making the drinks. • 節奏轉換 - Trip 和 Grace 各自對玩家的決定做出反應,Trip 開始製作飲料。
It is important that each beat goal described here be relatively short, for example, no more than ten seconds each, ideally 5 seconds or less. A small granule size for beat goals allows other beat goals to be intermixed more easily into this sequence (as described next). If a beat goal were longer than ten seconds, we'd want to split it up into smaller multiple beat goals. 重要的是,這裡描述的每個節拍目標相對較短,例如,每個不超過十秒,最好是 5 秒或更短。節拍目標的小顆粒尺寸允許其他節拍目標更容易地混合到該序列中(如下所述)。如果一個節拍目標長於十秒,我們希望將其分成更小的多個節拍目標。

4.2 Reactivity Adds Richness

4.2 反應性增加豐富性
Next we will describe the additional reactivity requirements for this beat, which will add further richness to the interaction. These requirements include: 接下來我們將描述此節拍的額外反應性要求,這將進一步豐富交互。這些要求包括:
• At any time during the beat, the player should be able to interrupt what Grace and Trip are saying and get an immediate response of some sort. Whatever dialogue was interrupted should be re-spoken afterward in a believable way, as needed. • 在節拍期間的任何時候,玩家應該能夠打斷Grace 和Trip 的談話並立即得到某種回應。無論對話被打斷,之後都應根據需要以可信的方式重新講述。
• At any time during the beat, the player should be able to bring up other topics or do actions that are not directly related to the topic of fixing drinks, and still get a response from Grace and Trip, as described earlier. These global mix-ins include progressing responses to tangential topics such as divorce, sex, or therapy, or about objects such as the furniture, their wedding photo, or the brass bull, or generic reactions to praise, criticism, flirtations, oppositions, and the like. After the response, Grace and Trip should return to progressing the original beat itself, in a coherent way. • 在節拍期間的任何時間,玩家應該能夠提出其他主題或執行與調製飲料主題不直接相關的操作,並且仍然得到 Grace 和 Trip 的響應,如前所述。這些全球混合包括對離婚、性或治療等離題主題的漸進反應,或對傢俱、結婚照或銅牛等物體的漸進反應,或對讚美、批評、調情、反對和反對的一般反應。之類的。回應後,格蕾絲和特里普應該以連貫的方式返回原來的節拍本身。
• Any time after the beat, once in another beat, the player should be able to refer to what previously happened during this beat and get a response of some sort; we call this a post-beat mix-in. • 節拍之後的任何時間,一旦進入另一個節拍,玩家應該能夠參考該節拍中之前發生的事情並獲得某種響應;我們稱之為節拍後混入。
To support these reactivity requirements, we will add the following specific features to the beat's structure: 為了支持這些反應性要求,我們將在節拍結構中添加以下特定功能:
• Gist points: each beat goal needs to be annotated with a gist point, to know how far into a beat goal the player must have gotten to avoid needing to repeat it if interrupted to perform some other mix-in. • 要點:每個節拍目標都需要用要點進行註釋,以瞭解玩家必須進入節拍目標多遠,以避免在執行其他混入時被中斷時需要重複。
• Repeat-dialogue: Each beat goal needs dialogue variation used in case the beat goal needs to be repeated, because it got interrupted in order to perform a mix-in. • 重複對話:每個節拍目標都需要對話變體,以備在需要重複節拍目標時使用,因為它在執行混入時被打斷。
• Reestablish-dialogue: Each beat goal needs a prefatory line of dialogue that can re-establish its context, in case the previous beat goal was a global mix-in and the current beat goal is returning to what it was talking about. These often play as a prefix to the repeat-dialogue. • 重建對話:每個節拍目標都需要一句前導對話,以便在前一個節拍目標是全局混入,當前節拍目標正在回到它所談論的內容時,可以重新建立其上下文。這些通常作為重複對話的前綴。
• Local-deflect-dialogue: Each beat goal needs a small set of local deflect dialogue, to be used in case the player interrupts the beat goal with a very generic utterance, for which there is no appropriate global mix-in. These are essentially local mix-ins. • 局部轉移對話:每個節拍目標都需要一小組局部轉移對話,以備在玩家用非常通用的話語打斷節拍目標時使用,對於這種情況,沒有合適的全局混入。這些本質上是局部混入。

4.3 Performance in a Variety of Contexts Adds Richness

4.3 各種環境下的表現增加了豐富性
In addition to the reactivity requirements described thus far, we want this beat to operate in a variety of contexts. For example, its specific dialogue, and perhaps its structure, should vary if the beat is performed early in the drama when the tension is still low, versus a bit further along when the tension has increased. (Once the tension has reached a very high level, as authors we've decided that Trip won't be in the mood to fix anyone a drink, and this beat won't be allowed to occur.) 除了迄今為止描述的反應性要求之外,我們還希望此節拍能夠在各種環境中運行。例如,如果節拍是在戲劇早期緊張局勢仍較低時執行的,而不是在緊張局勢增加時執行的,則其具體對話及其結構可能會有所不同。 (一旦緊張氣氛達到非常高的水平,作為作者,我們決定特里普不會有心情請任何人喝一杯,並且不會允許這種節拍發生。)
Also, the beat should vary in specific dialogue, and perhaps structure, if the player has been siding with Grace, or with Trip, or stayed neutral, independent of tension level. In fact, if the player's affinity changes during the beat, the beat should use its varying dialogue/structure appropriately. 此外,如果玩家支持格蕾絲、特里普或保持中立,無論緊張程度如何,具體對話的節拍和結構可能會有所不同。事實上,如果玩家的親和力在節拍期間發生變化,則節拍應該適當地使用其不同的對話/結構。
Finally, this beat, by its nature, can be performed a second time, if enough time has passed since the first time it was performed. That is, if the player wants Trip to make a second drink for her, that should be possible. There needs to be enough internal dialogue and structure variation to avoid unbelievably repeating the same dialogue a second time. 最後,如果自第一次執行以來已經過去了足夠的時間,則該節拍本質上可以執行第二次。也就是說,如果玩家希望 Trip 為她再喝一杯,那應該是可能的。需要有足夠的內部對話和結構變化,以避免令人難以置信地重複相同的對話第二次。
To support such context variety, we will add the following specific features to our beat's structure: 為了支持這種上下文多樣性,我們將在節拍結構中添加以下特定功能:
• Each beat goal will be written with dialogue variations for each combination of tension level (low or medium) and each player affinity value (neutral, siding-with-Grace, siding-with-Trip), for a total of 2 x 3 = 6 variations. • 每個節拍目標都將根據緊張程度(低或中)和每個玩家親和力值(中性、與恩典一邊、與特里一邊一邊)的每種組合編寫對話變化,總共 2 x 3 = 6 種變化。
• When the beat is occurring at the second (medium) tension level, we will author alternate transition-out beat goals (endings) for the beat, in which Grace reveals aloud one of Trip's Façade-shattering alcohol-related secrets, such as a secret dislike of the taste of liquor, his secret job in college as a lowly bartender, or how he regularly sneaks off to a working-class sports bar down the street. We will divvy these up among the tension/affinity structure variations. • 當節拍發生在第二個(中等)緊張級別時,我們將為節拍編寫替代的過渡出節拍目標(結局),其中 Grace 大聲揭示了 Trip 的一個與酒精相關的令人震驚的秘密,例如對酒的味道秘密的厭惡,他在大學裡擔任卑微調酒師的秘密工作,或者他如何經常偷偷溜到街上的工人階級運動酒吧。我們將把它們分配到張力/親和力結構的變化中。
Meeting the requirements listed in this and the previous section contribute to creating agency for the player, because they allow the player to cause this beat to happen when she wishes. They also contribute to dramatic believability, because it only makes sense that drinks could be requested to be fixed at any time, at least until the tension level of the drama becomes too great. Without supporting these requirements, the timing and structure of the discourse and drama overall can seem arbitrarily and unnaturally constrained, significantly reducing agency and believability; that is, the aforementioned problems with the status quo of commercial and noncommercial interactive stories. 滿足本節和上一節中列出的要求有助於為玩家創造能動性,因為它們允許玩家在她希望的時候發生這個節拍。它們也有助於戲劇的可信度,因為只有在任何時候都可以要求調酒才有意義,至少在戲劇的緊張程度變得過大之前是這樣。如果不支持這些要求,整體的話語和戲劇的時間和結構可能會顯得任意和不自然地受到限制,大大降低了能動性和可信度;也就是前面提到的商業和非商業互動故事的現狀問題。

4.4 Alternate Dialogue Adds Richness

4.4 代替對話增加豐富性
Ideally each line of dialogue has several variations; for example, three to five alternates, all with the same dramatic meaning but with different phrasings and word choice. While only one alternate will be heard for any line of dialogue per performance, the player will have the opportunity to notice this variation the next time she plays Façade and experiences this beat again, or if this beat happens a second time in the same session. 理想情況下,每句對話都有幾個變體;例如,三到五個替代版本,所有版本具有相同的戲劇意義,但措辭和用詞不同。雖然在每次表演中每句對話只會聽到一個替代版本,但玩家在下次玩《Façade》並再次體驗這個節拍時,或者如果在同一場遊戲中這個節拍再次發生時,將有機會注意到這種變化。

4.5 Parallel Behavior Adds Richness

4.5 並行行為增加豐富性
Critical for lifelikeness and dramatic believability, Grace and Trip are required to perform expressive, parallel behavior as part of their beat goals: 為了實現逼真和戲劇性的可信度,Grace和Trip需要執行表達性的並行行為,作為他們節拍目標的一部分:
• As Grace and Trip speak their dialogue, they should emote their current mood through facial expression, gaze and gesture. The specific dialogue they are speaking during the beat will affect their mood, of course, but overall mood can also be affected by whatever other events happened before this beat, as well as by whatever mix-ins may occur during the beat. For example, if a global mix-in occurs about divorce during this beat, that may sour Trip's mood, even if he started off somewhat chipper about fixing drinks. Additionally, while a character is speaking, all nonspeaking characters should react dynamically to the speaking character. This is why the author must write joint dialogue behaviors for each character; behavior must still be written for the nonspeaking characters that control how they react to the dialogue being spoken by the speaking character. • 當Grace和Trip說他們的對話時,他們應該通過面部表情、目光和手勢來表達他們當前的情緒。當然,他們在節拍中說的具體對話會影響他們的情緒,但總體情緒也會受到在此節拍之前發生的其他事件以及在此節拍期間可能發生的任何混合事件的影響。例如,如果在此節拍期間發生了關於離婚的全局混合事件,即使Trip一開始對調製飲料感到有些愉快,這也可能會使他的情緒變得糟糕。此外,當一個角色在說話時,所有不說話的角色應該動態地對說話的角色做出反應。這就是為什麼作者必須為每個角色編寫聯合對話行為;仍然需要為不說話的角色編寫行為,以控制他們如何對說話角色的對話做出反應。
• As characters speak their dialogue, they should tend to follow the player to wherever she walks within the room. This means that, in general, the dialogue should be written to not depend on where the character is standing when it is spoken. There are beats whose dialogue does depend on being performed in a specific location in the room; for example, the dialogue in ArgueOverItalyVacation requires Trip to stand near the Italy photo next to the bar and gesture towards it (or from behind the bar, as a special case, since the photo happens to be near the bar). The FightOverFixingDrinks beat, however, is one of the more common beat types that should be performable anywhere in the room. • 當角色說他們的對話時,他們應該傾向於跟隨玩家走到房間內的任何地方。這意味著,通常情況下,對話的編寫不應依賴於角色在說話時所站的位置。有些節拍的對話確實依賴於在房間的特定位置進行;例如,ArgueOverItalyVacation中的對話要求Trip站在酒吧旁邊的意大利照片附近並指向它(或作為特例,從酒吧後面,因為照片恰好在酒吧附近)。然而,FightOverFixingDrinks節拍是更常見的節拍類型之一,應該可以在房間的任何地方進行。
• At almost any time during this beat, we could have Trip autonomously decide to walk behind the bar and begin preparing drinking glasses as he speaks, in anticipation of pouring drinks. Like alternate-dialogue variation, this timing variation will be noticed in subsequent performances of this beat in this session or next. This requires the beat's dialogue to be written to be believable whether or not Trip is behind the bar. • 在此節拍的幾乎任何時候,我們都可以讓Trip自主決定走到酒吧後面並開始準備飲用杯子,同時說話,預期倒飲料。像替代對話的變化一樣,這種時間變化將在此會話或下一次會話中此節拍的後續表演中被注意到。這要求節拍的對話無論Trip是否在酒吧後面都要寫得可信。

4.6 Simplifications/Abstractions to Reduce Complexity

4.6 簡化/抽象以減少複雜性
There are a few aspects of this design that can be simplified and/or abstracted to reduce the complexity of its implementation, while still achieving a satisfying level of agency and believability for the player. 為了在實現過程中減少複雜性,同時仍然為玩家提供令人滿意的能動性和可信度,這個設計的某些方面可以進行簡化和/或抽象。
• Simplify the mapping of player utterances/actions to meanings, reducing the number of story reactions to author. Ideally, we would create a distinct reaction (plus alternate dialogue) for each discourse act the player could express, for each distinct context in a beat. However, there are dozens of supported discourse acts (see table 30.1), and potentially as many contexts within a beat as there are beat goals; for example, anywhere from five to ten per beat. The permutations would result in hundreds of reactions to author per beat. Instead, to make this tractable, we grouped related discourse acts together in context-specific ways. For example, if Trip suggests a martini and is hoping for agreement from the player, several similar discourse acts can be grouped together to be interpreted as "agreement with Trip" in this context: agree ("yes"), positiveExclamation ("sweet!"), thank ("thanks"), express happy ("that makes me happy"), or a hug gesture. Although this requires authoring custom mappings per discourse context, it is less work than authoring dozens of individual reactions within every context. Generally, each beat defines a discourse context, though there can be multiple distinct contexts within a single beat. The smallest discourse contexts are associated with individual beat goals, though beats may have sub-beat contexts that span several beat goals. Because we can't always group the same discourse acts together, in general each beat will need custom mappings from discourse acts to beat-specific meanings. For example, though "thank" and "positiveExclamation" both have the beat-specific meaning of agreement in the FightOverFixingDrinks beat, they may have distinct and different beat-specific meanings during other contexts in the drama. • 簡化玩家話語/行為到意義的映射,以減少需要編寫的故事反應(對玩家輸入的反應)數量。理想情況下,我們會為玩家在每個節拍中的每個不同上下文中可能表達的每個話語行為創建一個獨特的反應(加上替代對話)。然而,支持的話語行為有幾十種(見表30.1),而一個節拍中可能有的上下文數量與節拍目標一樣多;例如,每個節拍有五到十個。排列組合會導致每個節拍需要編寫數百個反應。為了使其可行,我們將相關的話語行為在特定上下文中分組。例如,如果Trip建議喝馬提尼並希望得到玩家的同意,在這種情況下,可以將幾個類似的話語行為分組為“同意Trip”:同意(“是”)、積極感嘆(“太棒了!”)、感謝(“謝謝”)、表達快樂(“這讓我很高興”)或一個擁抱手勢。雖然這需要為每個話語上下文編寫自定義映射,但比在每個上下文中編寫幾十個單獨的反應要少工作量。通常,每個節拍定義一個話語上下文,儘管一個節拍中可以有多個不同的上下文。最小的話語上下文與單個節拍目標相關,儘管節拍可能有跨越多個節拍目標的子節拍上下文。因為我們不能總是將相同的話語行為分組在一起,所以通常每個節拍需要自定義映射話語行為到節拍特定的意義。例如,雖然“感謝”和“積極感嘆”在FightOverFixingDrinks節拍中都有同意的節拍特定意義,但在戲劇的其他上下文中,它們可能有不同的節拍特定意義。
• Reduce causal dependencies. Previously, we laid out the design goal of allowing tangential topic reactions to mix in at any time (aka global mix-ins, described earlier). For example, after Trip suggests a martini, if the player mentions divorce, Trip needs to respond about divorce, and hopefully return to his martini suggestion afterwards. But couldn't the mention of divorce, or anything else, change the situation enough that it doesn't make sense to continue suggesting martinis, or whatever was being talked about beforehand? To keep this tractable, we try to design the narrative and to write the specific dialogue to reduce such causal dependencies. Trip's dialogue responding to the topic of divorce, while subtly revealing some hidden tension or feeling about it, has him trying to sweep it under the rug, allowing him to believably return to what he was talking about. When re-suggesting martinis afterwards, Trip's mood may darken a bit, altering his facial expressions and body language from that point forward, but not necessarily requiring the FightOverFixingDrinks to alter its structure significantly. This strategy, of course, results in reducing global agency - although the player did cause an immediate local response (a reaction to the player's mention of divorce), that is, local agency, she causes fewer longer-term narrative effects (e.g., significantly changing the way drinks are discussed from that point onward). As authors we try to make up for that reduction in agency by delaying the narrative effect of having brought up divorce, responding to it later in the drama when it's easier to do so; for example, in a beat (such as the BlowupCrisis beat) that explicitly recounts the provocative things the player said earlier. • 減少因果依賴。之前,我們提出了允許切題話題反應隨時混入的設計目標(即全局混合,如前所述)。例如,在Trip建議喝馬提尼之後,如果玩家提到離婚,Trip需要對離婚做出反應,並希望之後能回到他的馬提尼建議。但提到離婚或其他任何事情,是否會改變情況,以至於繼續建議馬提尼或之前談論的內容不再有意義?為了使其可行,我們嘗試設計敘事並編寫具體對話以減少這種因果依賴。Trip對離婚話題的回應,雖然微妙地揭示了一些隱藏的緊張或感覺,但他試圖掩蓋它,使他能夠可信地回到他之前談論的內容。當之後重新建議馬提尼時,Trip的情緒可能會有些陰鬱,從那時起改變他的面部表情和肢體語言,但不一定需要顯著改變FightOverFixingDrinks的結構。當然,這種策略會減少全局能動性——儘管玩家確實引起了一個即時的本地反應(對玩家提到離婚的反應),即局部能動性,但她引起的長期敘事效果較少(例如,從那時起顯著改變討論飲料的方式)。作為作者,我們嘗試通過延遲提到離婚的敘事效果來彌補這種能動性的減少,在戲劇中更容易做到時再回應它;例如,在一個明確回顧玩家之前說的挑釁性話語的節拍(如BlowupCrisis節拍)中。
• Collapse contexts together when possible. Previously, we set the design goal that each beat goal will be written with dialogue variations for each combination of tension level (low or medium) and each player affinity value (neutral, siding-with-Grace, siding-with-Trip), for a total of 2 x 3 = 6 variations. However some of these contexts are similar enough that they can be collapsed together. Specifically, in the case of a beat about Trip suggesting drinks to the player, as authors we could imagine that Trip would act with similar levels of braggadocio if he has affinity with the player, or if the affinity is neutral, while acting differently if Grace has affinity with the player. Furthermore, as authors we could decide that once the tension has increased to a "medium" level, it makes no sense for player affinity to be neutral; if the player is still neutral when the tension rises to medium, we will force player affinity toward Trip or Grace. Each of these simplifications removes a context from the list, reducing the total to four, thereby reducing the authoring burden for FightOverFixingDrinks by 33%. • 儘可能合併上下文。之前,我們設定了每個節拍目標將根據緊張程度(低或中)和每個玩家親和值(中立、偏向Grace、偏向Trip)的組合編寫對話變體的設計目標,總共2 x 3 = 6種變體。然而,其中一些上下文足夠相似,可以合併在一起。具體來說,在一個關於Trip向玩家建議飲料的節拍中,作為作者,我們可以想象,如果Trip與玩家有親和力,或者親和力是中立的,他會表現出類似的自誇,而如果Grace與玩家有親和力,他會表現得不同。此外,作為作者,我們可以決定,一旦緊張程度增加到“中等”水平,玩家親和力中立就沒有意義了;如果緊張程度上升到中等時玩家仍然是中立的,我們將強制玩家親和力偏向Trip或Grace。每個這樣的簡化都會從列表中刪除一個上下文,從而將FightOverFixingDrinks的編寫負擔減少33%。
• Write the dialogue to allow for brief moments of uninterruptibility, reducing the need for repeat-dialogue in case of interruption. As described previously, each beat goal should have dialogue variation used, in case the beat goal was interrupted by a mix-in and needs to be repeated. However, we can eliminate the need for repeat dialogue for a beat goal if we can write the beat goal's dialogue to quickly communicate the gist of its meaning in its first few seconds, and annotate those first few seconds as uninterruptible. That is, if the player speaks during the first few seconds of such a beat goal, Grace and Trip's response is delayed until the beat goal's gist point is reached - a delay in reaction of a few seconds, which is just barely acceptable for believability. If the gist of the beat goal's meaning is communicated in those few seconds, we can interrupt the beat goal in order to perform a mix-in response to the interruption, and not bother repeating the interrupted beat goal later. This requires writing dialogue such that the minimum amount of content required for the beat's narrative progression to make sense is communicated close to the beginning of the beat goal, with the rest of the dialogue within the beat goal adding richness, color, and additional detail to the basic content. As a general rule, the author must avoid long, complex lines of dialogue, instead breaking dialogue down into multiple lines that can be interrupted at line boundaries at a minimum (a fully interruptible line can of course be interrupted anywhere). • 編寫對話時允許短暫的不可打斷時刻,減少因中斷而需要重複對話的情況。如前所述,每個節拍目標應該有對話變體,以防節拍目標被混入事件中斷並需要重複。然而,如果我們能編寫節拍目標的對話,使其在前幾秒內快速傳達其意義的要點,並將這幾秒標註為不可打斷的,我們就可以消除重複對話的需要。也就是說,如果玩家在這種節拍目標的前幾秒內說話,Grace和Trip的反應會延遲到節拍目標的要點傳達完畢——幾秒鐘的反應延遲,勉強可以接受的可信度。如果節拍目標的意義要點在這幾秒內傳達完畢,我們可以中斷節拍目標以執行對中斷的混入反應,而不必在之後重複被中斷的節拍目標。這需要編寫對話,使節拍敘事進展所需的最少內容在節拍目標的開頭附近傳達,其餘的對話為基本內容添加豐富性、色彩和額外細節。作為一般規則,作者必須避免長而複雜的對話行,而是將對話分解為多行,至少可以在行邊界處中斷(完全可中斷的行當然可以在任何地方中斷)。

4.7 Authoring of a Beat Goal

4.7 編寫節拍目標
Now that our design is in place, we are ready to author our beat goals. In the interest of space, we will only show the details of two beat goals for the FightOverFixingDrinks beat - the second and third beat goals listed in our core structure earlier, here given the names "TripSuggest" and "GraceCounterSuggest": 現在我們的設計已經就緒,我們準備編寫我們的節拍目標。為了節省空間,我們只展示FightOverFixingDrinks節拍中兩個節拍目標的詳細信息——在我們之前的核心結構中列出的第二和第三個節拍目標,這裡分別命名為“TripSuggest”和“GraceCounterSuggest”:
• TripSuggest: Trip makes an initial suggestion, with bragging; Grace initially reacts to the brag. They wait a few seconds for a player response, if any. (Grace and Trip's response to the player happens in the next beat goal, GraceCounterSuggest.) • TripSuggest:Trip做出初步建議,並帶有自誇;Grace最初對自誇做出反應。他們等待幾秒鐘,看看玩家是否有反應。(Grace和Trip對玩家的反應發生在下一個節拍目標GraceCounterSuggest中。)
• GraceCounterSuggest: Trip responds to the player, and Grace counters with her own suggestion, based on what the player said, attacking Trip; Trip resists. They wait a few seconds for another player response, if any. (Grace and Trip's response to the player happens in the next beat goal.) • GraceCounterSuggest:Trip對玩家做出反應,Grace根據玩家所說的內容提出自己的建議,攻擊Trip;Trip反抗。他們等待幾秒鐘,看看玩家是否有另一個反應。(Grace和Trip對玩家的反應發生在下一個節拍目標中。)
We will write the dialogue in phases, starting off simple with just "TripSuggest," and adding richness as we go. In each phase of the authoring, bold-italicized text will denote changes from the previous phase. In the interest of space, we will show pseudocode between angle brackets, not actual ABL behavior code. "T:" and "G:" denote dialogue spoken by Trip and Grace, respectively. Where the word "Player" appears in the dialogue, the player's actual name is substituted, for example, "Brenda." 我們將分階段編寫對話,從簡單的“TripSuggest”開始,並逐步增加豐富性。在每個編寫階段,粗體斜體文本將表示與前一階段的變化。為了節省空間,我們將在尖括號之間顯示偽代碼,而不是實際的ABL行為代碼。“T:”和“G:”分別表示Trip和Grace說的對話。對話中出現“玩家”一詞的地方,將替換為玩家的實際名字,例如,“Brenda”。

4.7.1 Scaffolding

4.7.1 腳手架
Here are some basic lines of dialogue for "TripSuggest" that can serve as scaffolding for the authoring process. 以下是一些“TripSuggest”的基本對話臺詞,可以作為編寫過程的腳手架。
"TripSuggest" “Trip的提議”
T: (cheery) What would you like? T: (愉快地) 你想要什麼?
T: (cheery) How about a martini? T: (愉快地) 來杯馬提尼怎麼樣?
T: (bragging) I'm a real expert at fixing these, at least that's what everybody tells me. T: (自誇地) 我可是調製這些的真正專家,至少大家都是這麼說的。
G: (a bit annoyed) Oh God, Trip, please...let's not go overboard with the drink preparation. G: (有點惱火) 天哪,Trip,拜託……別在準備飲料上太過了。

4.7.2 Uninterruptibility, Gist Point, and Reestablish-Dialogue

4.7.2 不可打斷性、要點和重新建立對話
As described earlier we will set this beat goal to be uninterruptible at first, then set it to be interruptible and set its gist point a few seconds later. Also, we will prefix a line of reestablish-dialogue, to be played if the context of the beat needs to be re-established because of an interruption by a global mix-in. 如前所述,我們將首先設置這個節拍目標為不可打斷的,然後在幾秒鐘後將其設置為可打斷並設置其要點。此外,如果由於全局混合插入導致需要重新建立節拍的上下文,我們將前綴一行重新建立對話的臺詞。
"TripSuggest" “Trip的提議”
<set uninterruptible> <設置不可打斷>
<if reestablish> T: (cheery) So! Drinks! <如果重新建立> T: (愉快地) 那麼!喝點什麼吧!
T: (cheery) What would you like? T: (愉快地) 你想要什麼?
T: (cheery) How about a martini? T: (愉快地) 來杯馬提尼怎麼樣?
<set interruptible> <設置可打斷>
<set gist point> <設置要點>
T: (bragging) I'm a real expert at fixing these, at least that's what everybody tells me. T: (自誇地) 我可是調製這些的真正專家,至少大家都是這麼說的。
G: (a bit annoyed) Oh God, Trip, please... let's not go overboard with the drink preparation. G: (有點惱火) 天哪,Trip,拜託……別在準備飲料上太過了。
This means that if the player speaks early on in the beat goal, Trip won't stop speaking until he's done saying, "How about a martini?" Then the reaction will occur (whatever it is), and the last two lines will go unheard. 這意味著如果玩家在節拍目標的早期說話,Trip不會停止說話,直到他說完“來杯馬提尼怎麼樣?”然後反應(無論是什麼)會發生,最後兩行將不會被聽到。

4.7.3 Custom Reactivity

4.7.3 自定義反應
The "TripSuggest" beat goal we are authoring is the second beat goal in this beat; what if earlier, during the first beat goal, the transition-in, the player requested a specific drink; e.g., said "I'd like a beer"? We should have dialogue variation in "TripSuggest" to react to that. 我們正在編寫的“TripSuggest”節拍目標是這個節拍中的第二個節拍目標;如果在之前的第一個節拍目標(過渡階段)中,玩家請求了一種特定的飲料,例如說“我想要一杯啤酒”怎麼辦?我們應該在“TripSuggest”中有對這種情況的對話變化。
"TripSuggest" “Trip的提議”
<set uninterruptible> <設置不可打斷>
<if reestablish> T: (cheery) So! Drinks! <如果重新建立> T: (愉快地) 那麼!喝點什麼吧!
<if nothing suggested so far> <如果到目前為止沒有建議>
T: (cheery) What would you like? T: (愉快地) 你想要什麼?
T: (cheery) How about a martini? T: (愉快地) 來杯馬提尼怎麼樣?
<set interruptible> <設置可打斷>
<set gist point> <設置要點>
T: (bragging) I'm a real expert at fixing these, at least that's what everybody tells me. T: (自誇地) 我可是調製這些的真正專家,至少大家都是這麼說的。
<if a fancy drink was just requested> <如果剛剛請求了一種花哨的飲料>
T: (excited) Sure, that sounds great, I'll have one too! T: (興奮地) 當然,那聽起來很棒,我也來一杯!
<if a boring drink was just requested> <如果剛剛請求了一種普通的飲料>
T: (a bit down) Oh, but let's enjoy ourselves tonight! T: (有點失望) 哦,但今晚我們要好好享受一下!
G: (a bit annoyed) Oh God, Trip, please... let's not go overboard with the drink preparation. G: (有點惱火) 天哪,Trip,拜託……別在準備飲料上太過了。

4.7.4 Map Player Utterances/Actions to Few Reactions

4.7.4 將玩家的發言/行動映射到少數反應
As described earlier for reacting to the player in our "TripSuggest" beat goal, we will group similar discourse acts together, and map them to a small set of reactions. Here, we map many of the discourse acts in table 30.1 to just five reaction types: 如前所述,為了在我們的“TripSuggest”節拍目標中對玩家做出反應,我們將相似的對話行為分組,並將它們映射到一小組反應中。在這裡,我們將表30.1中的許多對話行為映射到僅五種反應類型:
• AgreeTrip: agree ("yes"), positiveExclamation ("sweet!"), thank ("thanks"), express happy ("that makes me happy"), hug. • 同意Trip: 同意(“是”),積極的感嘆(“太棒了!”),感謝(“謝謝”),表達快樂(“這讓我很開心”),擁抱。
• DisagreeTrip: disagree ("nah"), negativeExclamation ("lame"), express angry ("I'm pissed"), express sad ("I'm suddenly bummed out"). • 不同意Trip: 不同意(“不”),消極的感嘆(“真糟糕”),表達憤怒(“我很生氣”),表達悲傷(“我突然感到沮喪”)。
• SpecificFancyRequest: referTo <fancyDrink> ("how about a cosmo?", or "got any Scotch in there?"). • 特定的花哨請求: 提到<花哨的飲料>(“來杯科斯莫怎麼樣?”或“有蘇格蘭威士忌嗎?”)。
• SpecificBoringRequest: referTo <nonFancyDrink> ("just water for me," or "Coors Lite, if you have it"). • 特定的乏味請求: 提到<普通的飲料>(“我只要水”或“如果有的話,來杯庫爾斯淡啤”)。
• NonAnswer: timeout (many seconds of silence from the player), referTo drink ("a drink sounds good"), express laugh ("ha ha"), maybe ("I guess so"), dontUnderstand ("I don't know what a martini is"), apologize ("sorry"), agree, etc. toward Grace ("sure Grace," "thanks Grace," etc.). • 不回答: 超時(玩家長時間沉默),提到飲料(“喝點東西不錯”),表達笑(“哈哈”),可能(“我想是的”),不理解(“我不知道馬提尼是什麼”),道歉(“對不起”),同意等對Grace的回應(“好的,Grace”,“謝謝,Grace”等)。
Note that the remaining discourse acts from table 30.1 not handled by this local mapping will still be handled by the global context. For example, if the player refers to sex during TripSuggest, since none of the TripSuggest-specific mappings handle references to sex, this context will suggest no reactions. The global context, on the other hand, will suggest a global mix-in reaction, which, since no more-specific context has a suggestion, will be selected as the reaction to perform. The global mix-in will be inserted between TripSuggest and GraceCounterSuggest; GraceCounterSuggest will then perform prefaced with its reestablish line. (Note that some other context in this or another beat might actually have a beat-specific response to a reference to sex, during which a global mix-in about sex would not be chosen to occur.) The reaction types listed here are implemented as dialogue variations in the beginning of the next beat goal, "GraceCounterSuggest": 請注意,表30.1中未被此本地映射處理的剩餘語篇行為仍將由全局上下文處理。例如,如果玩家在TripSuggest期間提到性,由於沒有TripSuggest特定的映射處理性相關的提及,這個上下文將不會建議任何反應。而全局上下文將建議一個全局混合反應,由於沒有更具體的上下文有建議,這個反應將被選為執行的反應。全局混合反應將插入在TripSuggest和GraceCounterSuggest之間;GraceCounterSuggest將以其重新建立對話的臺詞開始執行。(請注意,在這個或另一個節拍中,某些其他上下文可能實際上對性相關的提及有節拍特定的回應,在這種情況下,全局混合反應關於性的內容將不會被選擇發生。)這裡列出的反應類型將在下一個節拍目標“GraceCounterSuggest”的開頭作為對話變化實現:
"GraceCounterSuggest" “Grace的回覆提議”
<set uninterruptible> <設置不可打斷>
<if reestablish> T: About those drinks... <如果重新建立> T: 關於那些飲料……
<if AgreeTrip> T: (excited) Good choice! <如果同意Trip> T: (興奮地) 好選擇!
<if DisagreeTrip> T: (dismayed) What? Oh, I thought you'd love that... <如果不同意Trip> T: (沮喪地) 什麼?哦,我以為你會喜歡的……
<if SpecificFancyRequest> T: (excited) Oh yeah, that's even better! <如果特定的花哨請求> T: (興奮地) 哦,是的,那更好!
<if SpecificBoringRequest> T: (let down) Oh, but let's celebrate tonight...! <如果特定的乏味請求> T: (失望地) 哦,但今晚我們要慶祝一下……!
<if NonAnswer> T: (nervous) Uh, well, you know what, I'm just going to make you a martini. <如果不回答> T: (緊張地) 呃,你知道嗎,我還是給你做杯馬提尼吧。
<if current drink suggestion is fancy> G: No. no, Player, maybe you'd like some juice, or a mineral water? <如果當前的飲料建議是花哨的> G: 不,不,玩家,也許你想要一些果汁或礦泉水?
<if current drink suggestion is not fancy, e.g., a beer> <如果當前的飲料建議不是花哨的,例如啤酒>
G: Trip, we don't all share your infatuation with mixed drinks. G: Trip,我們並不都迷戀混合飲料。
G: Player, you'd prefer just a beer, right? G: 玩家,你更喜歡只喝啤酒,對吧?
<set interruptible> <設置可打斷>
<set gist point> <設置要點>
T: (dismayed, under breath) Oh come on... T: (沮喪地,低聲) 哦,拜託……

4.7.5 Physical Performance

4.7.5 物理表現
So far, our detailed beat goal authoring example has focused on the authoring of dialogue and dialogue logic. In addition, as mentioned previously, the author needs to specify physical performance. This includes deciding where the characters should stand in relation to the player's current position (staging), how close each character should be to the player (often determined by affinity), changes in mood (influences facial expression and body stance), any gestures the characters should perform, and how they are coordinated with the dialogue, base facial expression and momentary expressions (shock, surprise, etc.), and so forth. Besides participating in the dialogue logic, each JDB specifies procedural direction for how the character should perform its specific lines. The following is some example ABL code for a single JDB, in this case the JDB for the "TripSuggest" case, where the player has not made any specific fancy drink request. 到目前為止,我們詳細的節拍目標創作示例主要集中在對話和對話邏輯的創作。此外,如前所述,作者還需要指定物理表現。這包括決定角色在玩家當前位置的站位(舞臺佈置)、每個角色與玩家的距離(通常由親和度決定)、情緒變化(影響面部表情和身體姿態)、角色應執行的任何手勢,以及它們如何與對話、基本面部表情和瞬時表情(震驚、驚訝等)協調等等。除了參與對話邏輯外,每個JDB還指定了角色應如何執行其特定臺詞的程序性指示。以下是一個單一JDB的示例ABL代碼,在這種情況下是“TripSuggest”案例的JDB,其中玩家沒有提出任何特定的花哨飲料請求。
// ## 如果沒有特定的花哨飲料請求(但包括如果我們收到了特定的普通飲料請求)(譯註:這條是唯一的原作者註釋,後面的註釋如無“原注”的前綴均為譯者所加) // 這段代碼定義了一個並行行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff` 和一個順序行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq`。它們的目的是在沒有特定的花哨飲料請求時,處理普通飲料請求。 // 並行行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff` joint parallel behavior bFAskDrinkT1NTPA_TripSuggest_BodyStuff() { teammembers Trip Grace; // 前置條件:檢查 `bGotFancySpecificRequest` 是否為 `false`,並獲取當前的飲料想法 `curDrinkIdea` precondition { StoryMemory (BeatFAskDrinkT1WME bGotFancySpecificRequest == false curDrinkIdea :: drink) } with (ignore_failure, property isStagingGoal true) // 啟動對話場景 `StagingConverse` spawngoal StagingConverse(40, player, eConverseType_offCenterShared, eWalkType_normal); // 嘗試保持面向玩家 `TryToKeepFacingSprite` with (persistent, team_effect_only) subgoal TryToKeepFacingSprite(0, player); with (priority_modifier 1, ignore_failure, team_effect_only) // 設置表演信息 `SetPerformanceInfo` subgoal SetPerformanceInfo(40, 2, eHeadEmphType_nodStrong, eArmsEmphType_atSide, startWith, -1, eGazeType_normal, player, eFEBase_serious); // 設置情緒 `SetMood` with (priority_modifier 2) subgoal SetMood(eMood_happy, eMoodStrength_barely, -1, 0); // 調用順序行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq` subgoal bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq(drink); // 設置完成標誌 `SetLetBeatGoalFinishFlag` subgoal SetLetBeatGoalFinishFlag(true); } // 順序行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq` sequential behavior bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq(int drink) { // 變量:定義 `doOptionalPreface` int doOptionalPreface; // optional preface(原注)可選前言 // 隨機生成 `doOptionalPreface` 的值 mental_act { doOptionalPreface = randGen.nextInt(2); } // 調用子行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_dia1` with (ignore_failure) subgoal bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_dia1(doOptionalPreface); // possible second preface(原注)可能的第二個前言 // 調用子行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq2` with (ignore_failure) subgoal bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_seq2(drink); // the drink suggestion 飲料建議 // 完整表達 `DoFullExpressionBase` with (ignore_failure) subgoal DoFullExpressionBase(70, eFEBase_pleasant); // 調用子行為 `bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_dia3` with (ignore_failure) subgoal bFAskDrinkT1NTPA_TripSuggest_BodyStuff_NoSpReq_dia3(drink); }
The purpose of showing a code snippet here is not to go through the code in minute detail, but rather to point out a few features of the ABL code for JDBs: 展示代碼片段的目的是為了指出JDB的ABL代碼的一些特徵,而不是詳細解析代碼:
• The first thing to note is that it is code; it is not some static data structure or cutscene, but is rather a dynamic little machine that knows how to perform these particular lines, can perform them anywhere in the room, even as the player walks around, can perform them even if the player is engaged in other long-term physical behaviors (e.g., Trip walking around with his advice ball) and thus might require substituting or suppressing physical movements. This is not a cut-scene or statically prescripted performance, but is rather a behavior that dynamically adjusts the performance. • 首先要注意的是,這是一段代碼;它不是某種靜態數據結構或過場動畫,而是一個動態的小機器,知道如何執行這些特定的臺詞,可以在房間的任何地方執行,即使玩家在四處走動,也可以執行,即使玩家參與其他長期的物理行為(例如,Trip拿著他的建議球四處走動),也可能需要替換或抑制物理動作。這不是一個過場動畫或靜態預設的表演,而是一個動態調整表演的行為。
• The joint parallel behavior (this one is for Trip) automatically synchronizes with a paired behavior in Grace, allowing them to tightly coordinate their performance, even as they each simultaneously engage in parallel, unsynchronized behavior. (Grace's side of this joint behavior is not shown here.) • 聯合並行行為(這個是針對Trip的)會自動與Grace的配對行為同步,允許他們緊密協調他們的表演,即使他們各自同時從事並行的、不同步的行為。(Grace這一側的聯合行為在這裡沒有展示。)
• With the parallel behavior, the author is specifying a bunch of action that should happen at the same time, in this case that the character should initiate staging to the center of the player's current view and share this position with another character, should try to keep facing the player as the player moves around, should perform their lines using strong head nods and arms-at-side gestures for dialogue emphasis, should be in a barely happy mood (this will combine with a serious base facial expression), and that they should perform a certain sequence of lines that start out uninterruptible (uninterruptibility will be turned off when the gist point is hit - this occurs in the details of dialogue behaviors that are not shown here). 182 tokens • 通過並行行為,作者指定了一系列應該同時發生的動作,在這種情況下,角色應該開始在玩家當前視野的中心進行舞臺佈置,並與另一個角色共享這個位置,應該在玩家四處走動時儘量保持面向玩家,應該使用強烈的點頭和雙臂在側的手勢來強調對話,應該處於略微開心的情緒(這將與嚴肅的基本面部表情結合),並且他們應該執行一系列臺詞,這些臺詞在開始時是不可打斷的(當要點被擊中時,不可打斷性將被關閉——這發生在未展示的對話行為的細節中)。
At the beat-goal level, authoring for Façade combines being both a writer and a director, where both the dialogue logic and performance details are procedurally expressed. 在節拍目標層面,為《Façade》創作結合了編劇和導演的角色,既要程序化地表達對話邏輯,也要程序化地表達表演細節。

4.7.6 Dialogue Variation for Tension Level, Player Affinity, and Alternate-Dialogue

4.7.6 對話變體:緊張等級,玩家親和力,代替對話
To finish our authoring example, we need to fully list the dialogue of the remaining permutations of the two tension levels (low, medium) and three player affinities (neutral, Trip, Grace) for the "TripSuggest" and "GraceCounterSuggest" beat goals, including alternate-dialogue variation within each. As described earlier, the neutral and Trip affinities have been combined into one, thereby reducing the total number of permutations for this beat from 2 x 3 = 6, down to 2 x 2 = 4: TensionLow-AffinityNeutralTrip, TensionLow-AffinityGrace, TensionMedium-AffinityNeutralTrip, and TensionMedium-AffinityGrace. See the extended dialogue below for this listing. 為了完成我們的創作示例,我們需要完整列出“TripSuggest”和“GraceCounterSuggest”節拍目標的剩餘排列的對話,包括每個對話中的替代變體,涉及兩個緊張程度(低、中)和三種玩家親和力(中立、Trip、Grace)。如前所述,中立和Trip親和力已合併為一個,從而將此節拍的總排列數從2 x 3 = 6減少到2 x 2 = 4:TensionLow-AffinityNeutralTrip、TensionLow-AffinityGrace、TensionMedium-AffinityNeutralTrip和TensionMedium-AffinityGrace。請參見下面的擴展對話列表。
Extended Dialogue Listing 擴展對話列表
"TripSuggest" for TensionLow and PlayerAffinityNeutral/Trip “Trip的提議“,低緊張度,玩家中立/偏向Trip
<set uninterruptible> <設置不可打斷>
<if reestablish> <如果重新建立>
T: So! Drinks! T: 所以!喝點什麼!
<if nothing suggested so far> <如果到目前為止沒有建議>
T: What would you like? T: 你想要什麼?
T: So, what's your poison? T: 那麼,你的毒藥是什麼?
T: How about something fun, T: 來點有趣的怎麼樣,
T: Let's have something fun, T: 我們來點有趣的吧,
T: We should have something fun, T: 我們應該來點有趣的,
T: How does a martini sound? T: 馬提尼怎麼樣?
T: How about a martini? T: 來一杯馬提尼怎麼樣?
T: Like a cosmopolitan? T: 像是宇宙雞尾酒?
T: Like margaritas? T: 像是瑪格麗塔?
T: Like sangria? T: 像是桑格利亞?
T: I've got the perfect bottle of cabernet I've been saving for just such an occasion. T: 我有一瓶完美的赤霞珠,我一直在為這樣的場合保存。
T: Can I interest you in a single malt Scotch? It's primo. T: 我可以給你推薦一款單一麥芽威士忌嗎?這是頂級的。
<set interruptible> <設置可打斷>
<if a fancy drink was just requested> <如果剛剛請求了花哨的飲料>
T: Martinis...Great idea! Classic! T: 馬提尼...好主意!經典!
T: Ah, martinis...[Player], you've always had good taste. T: 啊,馬提尼...[玩家],你總是有好品味。
T: Fabulous suggestion. I'll have the same. T: 極好的建議。我也要一個。
T: Sure, that sounds great, I'll have one too! T: 當然,聽起來不錯,我也來一個!
<if a boring drink was just requested> <如果剛剛請求了無聊的飲料>
T: (wanting more) Oh, but we can do better than that...! T: (想要更多)哦,但我們可以做得更好...!
T: (wanting more) Oh, but let's enjoy ourselves tonight...! T: (想要更多)哦,但今晚我們應該好好享受...!
T: (wanting more) Oh, but let's celebrate tonight...! T: (想要更多)哦,但今晚我們應該慶祝...!
T: (wanting more) Oh, but let's live it up tonight...! T: (想要更多)哦,但今晚我們應該盡情享受...!
<brag> <自誇>
T: I'm a real expert at fixing these, at least that's what everybody tells me. T: 我在調製這些方面真是個專家,至少大家都是這麼告訴我的。
T: Everybody tells me I fix the best drinks, so I'm sure you're gonna love this. T: 大家都說我調的飲料最好,所以我相信你會喜歡這個。
T: I just got a hold of this rare imported Icelandic vermouth I want you to try! T: 我剛拿到一瓶稀有的進口冰島苦艾酒,我想讓你嚐嚐!
T: It's what we drink at these high-class poker games I go to with the execs at work. T: 這是我在和工作中的高管們參加的高檔撲克遊戲時喝的。
T: Grace's dad taught me how to make these, it's a really classy drink. T: Grace的爸爸教我怎麼調這些,這是非常高檔的飲料。
T: The guy I play squash with introduced me to this drink, it's really amazing. T: 我打壁球的朋友向我介紹了這種飲料,真的很棒。
T: We went wine tasting last year in Napa with Grace's parents and discovered this stuff, it's exquisite. T: 去年我們和Grace的父母在納帕品酒時發現了這種東西,真是精緻。
T: I served these at our last party, they were a smash. T: 我在我們上次的聚會上提供了這些,反響熱烈。
T: It's the latest thing, you'll love it. T: 這是最新的東西,你會喜歡的。
<Grace reaction to brag> <Grace對自誇的反應>
G: (a bit muted) Oh God, Trip, please...let's not go overboard with the drink preparation. G: (有點壓抑)哦,天哪,Trip,拜託...別在飲料準備上過火。
G: (a bit muted) (slightly annoyed) uhh...you and your 'high class' drinks... G: (有點壓抑)(稍微惱火)呃...你和你的“高檔”飲料...
G: (a bit muted) We don't need to make a big production out of this, Trip. G: (有點壓抑)我們不需要把這搞得很複雜,Trip。
G: (a bit muted) Trip, let's not go crazy with the drinks, okay? G: (有點壓抑)Trip,今晚別在飲料上搞得太瘋狂,好嗎?
G: (a bit muted) Now Trip don't get too worked up with the drinks tonight... G: (有點壓抑)現在Trip,今晚別太激動了...
"GraceCounterSuggest" for TensionLow and PlayerAffinityNeutral/Trip “Grace的回覆提議”,低緊張度,玩家中立/偏向Trip
<set uninterruptible> <設置不可打斷>
<if AgreeTrip> <如果同意Trip>
T: Beautiful! T: 太好了!
T: Perfect! T: 完美!
T: Great! Martini it is. T: 太棒了!馬提尼就好。
T: Alright...! Cosmopolitans! T: 好吧...!宇宙雞尾酒!
T: Ah margaritas! Yum yum! T: 啊,瑪格麗塔!好吃好喝!
T: Excellent. Mmm, mmm, sangria! T: 很好。嗯,嗯,桑格利亞!
T: You got it. Scotch coming right up! T: 你說得對。威士忌馬上來!
<if DisagreeTrip> <如果不同意Trip>
T: (dismayed) No...? T: (失望)不...?
T: (dismayed) What? Oh I thought you'd love that...! T: (失望)什麼?哦,我以為你會喜歡這個...!
T: (dismayed) Oh but we should enjoy ourselves tonight...! T: (失望)哦,但我們今晚應該好好享受...!
T: (dismayed) Oh, but everybody loves that! T: (失望)哦,但大家都喜歡這個!
<if SpecificFancyRequest> <如果具體的花哨請求>
T: Oh, oh, yeah, that sounds even better! Great! T: 哦,哦,是的,那聽起來更好!太棒了!
T: Oh yeah, great idea, great idea! T: 哦,是的,好主意,好主意!
T: Oh yeah, that's even better! T: 哦,是的,那更好!
T: Ooh, great, why didn't I think of that? T: 哦,太好了,為什麼我沒想到呢?
<if SpecificBoringRequest> <如果具體的無聊請求>
T: (let down) Oh, come on, let's enjoy ourselves tonight...! T: (失望)哦,來吧,今晚我們應該好好享受...!
T: (let down) Oh, but let's celebrate tonight...! T: (失望)哦,但今晚我們應該慶祝...!
T: (let down) Oh, but let's live it up tonight...! T: (失望)哦,但今晚我們應該盡情享受...!
T: (let down) Oh, that's no fun...! T: (失望)哦,這樣可不好...!
<if NonAnswer> <如果沒有回答>
T: Uh, well, you know what, I'm just going to make you a martini. T: 呃,好吧,你知道嗎,我就給你做一杯馬提尼。
T: Uh, well, you know what, I'm just going to make you a cosmopolitan. T: 呃,好吧,你知道嗎,我就給你做一杯宇宙雞尾酒。
T: Uh, well, I think I'll just make us all margaritas. T: 呃,好吧,我想我就給我們做一些瑪格麗塔。
T: Uh, well, I'm just going to make us all some nice sangria. T: 呃,好吧,我就給我們做一些好喝的桑格利亞。
T: Uh, well, I'm just going to pour you a glass of this wine. T: 呃,好吧,我就給你倒一杯這個酒。
T: Uh, well, I'm just going to make you a Scotch. T: 呃,好吧,我就給你做一杯威士忌。
<if current drink suggestion is fancy> <如果當前飲料建議是花哨的>
G: No no, [Player], maybe you'd like some juice, or a mineral water? G: 不不,[玩家],也許你想要一些果汁,或者礦泉水?
G: No no, [Player], maybe you'd like just a simple glass of white wine? G: 不不,[玩家],也許你只想要一杯簡單的白葡萄酒?
G: No no, [Player], how about something simple, like a nice glass of chardonnay? G: 不不,[玩家],怎麼不來點簡單的,比如一杯好喝的霞多麗?
<if current drink suggestion is not fancy, e.g., a beer> <如果當前飲料建議不是花哨的,例如啤酒>
G: Trip, that's not what [he|she] wants. G: Trip,這不是[他|她]想要的。
G: Trip, don't force your fancy drinks on [him|her]. G: Trip,不要把你的花哨飲料強加給[他|她]。
G: Trip, don't pressure our friend, okay? G: Trip,別給我們的朋友施加壓力,好嗎?
G: Trip, we don't all share your infatuation with mixed drinks. G: Trip,我們並不都對混合飲料情有獨鍾。
G: Trip, maybe our friend isn't as excited by your suggestion as you are. G: Trip,也許我們的朋友對你的建議並沒有你想象的那麼興奮。
G: [Player], you'd prefer a simple glass of water, right? G: [玩家],你更喜歡一杯簡單的水,對吧?
G: [Player], you'd prefer a simple glass of juice, right? G: [玩家],你更喜歡一杯簡單的果汁,對吧?
G: [Player], you'd prefer a simple glass of soda, right? G: [玩家],你更喜歡一杯簡單的汽水,對吧?
G: [Player], you'd prefer just a beer, right? G: [玩家],你更喜歡一杯啤酒,對吧?
G: [Player], you'd prefer a simple glass of white wine, right? G: [玩家],你更喜歡一杯簡單的白葡萄酒,對吧?
G: [Player], you'd prefer what you asked for, right? G: [玩家],你更喜歡你要求的飲料,對吧?
<set interruptible> <設置可打斷>
<Trip final comment> <Trip最後評論>
T: (dismayed, under breath) What...? T: (失望,低聲)什麼...?
T: (dismayed, under breath) Oh come on... T: (失望,低聲)哦,來吧...
T: (dismayed, under breath) uhh... T: (失望,低聲)呃...
T: (dismayed, under breath) but...uhh... T: (失望,低聲)但是...呃...
"TripSuggest" for TensionLow and PlayerAffinityGrace “Trip的提議”,低緊張度,玩家偏向Grace
<set uninterruptible> <設置不可打斷>
<if reestablish> <如果重新建立>
T: (overly earnest, a bit desperate) So! Drinks! T: (過於認真,有點絕望)所以!喝點什麼!
<if nothing suggested so far> <如果到目前為止沒有建議>
T: (overly earnest, a bit desperate) What can I get you? T: (過於認真,有點絕望)我能給你做點什麼?
T: (overly earnest, a bit desperate) I want to fix you something special. T: (過於認真,有點絕望)我想給你調製一些特別的東西。
T: (overly earnest, a bit desperate) Anything you want! T: (過於認真,有點絕望)你想要什麼都可以!
T: (overly earnest, a bit desperate) I'll make us something really fun, T: (過於認真,有點絕望)我會給我們做一些真的很有趣的,
T: (overly earnest, a bit desperate) Let's have something really fun, T: (過於認真,有點絕望)我們來點真的很有趣的,
T: (overly earnest, a bit desperate) We need to have something really fun, T: (過於認真,有點絕望)我們需要來點真的很有趣的,
<reuse suggestions from PlayerAffinityNeutralTrip> <重用來自玩家中立/偏向Trip的建議>
<set interruptible> <設置可打斷>
<if a fancy drink was just requested> <如果剛剛請求了花哨的飲料>
T: (relieved, excited) Martinis...Perfect! Classic! Great idea! T: (鬆了一口氣,興奮)馬提尼...完美!經典!好主意!
T: (relieved, excited) Ah, martinis...Sweet! [Player], you've always been a classy drinker. T: (鬆了一口氣,興奮)啊,馬提尼...太好了![玩家],你總是喝得很有品位。
T: (relieved, excited) Fabulous suggestion! I'll have the same. T: (鬆了一口氣,興奮)極好的建議!我也要一個。
T: (relieved, excited) Your suggestion is perfect! I'll have one too! T: (鬆了一口氣,興奮)你的建議太完美了!我也來一個!
<if a boring drink was just requested> <如果剛剛請求了無聊的飲料>
T: (nervous, wanting more) But...I'm hoping we can have some fun tonight... T: (緊張,想要更多)但是...我希望今晚我們能玩得開心...
T: (nervous, wanting more) But...I was hoping we'd enjoy ourselves tonight... T: (緊張,想要更多)但是...我希望我們今晚能享受一下...
T: (nervous, wanting more) But...I was hoping we would celebrate tonight...! T: (緊張,想要更多)但是...我希望我們今晚能慶祝一下...!
T: (nervous, wanting more) But...I was hoping we'd live it up a little tonight... T: (緊張,想要更多)但是...我希望今晚我們能盡情享受一下...
<brag> <自誇>
<use dialogue from with NeutralTrip version> <使用來自NeutralTrip版本的對話>
<Grace reaction to brag> <Grace對自誇的反應>
G: (confident) Trip, Trip, Trip... don't go overboard with the drink preparation tonight. G: (自信)Trip,Trip,Trip...今晚別在飲料準備上過火。
G: (confident) (slightly annoyed) Trip, you don't need to push the 'high class' drinks thing on our guests... G: (自信)(稍微惱火)Trip,你不需要把“高檔”飲料強加給我們的客人...
G: (confident) Trip, take it easy, don't make a big production out of this. G: (自信)Trip,放輕鬆,別把這搞得太複雜。
G: (confident) Trip, don't go crazy with the drinks. G: (自信)Trip,別在飲料上搞得太瘋狂。
G: (confident) Trip don't get yourself worked up with the drinks. G: (自信)Trip,今晚別在飲料上太激動。
T: (overly earnest, a bit desperate) Uh, [Player], come on, what do you say? T: (過於認真,有點絕望)呃,[玩家],來吧,你覺得怎麼樣?
T: (overly earnest, a bit desperate) Uh, [Player], it'll be great, what do you say? T: (過於認真,有點絕望)呃,[玩家],這會很棒,你覺得怎麼樣?
T: (overly earnest, a bit desperate) Uh, [Player], you'll love it, what do you say? T: (過於認真,有點絕望)呃,[玩家],你會喜歡的,你覺得怎麼樣?
T: (overly earnest, a bit desperate) Uh, [Player], let me make this for you, what do you say? T: (過於認真,有點絕望)呃,[玩家],讓我給你做這個,你覺得怎麼樣?
"GraceCounterSuggest" for TensionLow and PlayerAffinityGrace “Grace的回覆提議”,低緊張度,玩家偏向Grace
<set uninterruptible> <設置不可打斷>
<if AgreeTrip> <如果同意Trip>
T: (burst of relief, a bit desperate) Ah, I knew you'd agree! T: (鬆了一口氣,有點絕望)啊,我就知道你會同意的!
T: (burst of relief, a bit desperate) Ah! I knew it. T: (鬆了一口氣,有點絕望)啊!我就知道。
T: (burst of relief, a bit desperate) Ahh, yes. T: (鬆了一口氣,有點絕望)啊,是的。
T: (burst of relief, a bit desperate) Ahh, I was right. T: (鬆了一口氣,有點絕望)啊,我是對的。
<if DisagreeTrip> <如果不同意Trip>
T: (dismayed, defeated) No...? T: (失望,沮喪)不...?
T: (dismayed, defeated) Oh, I - I thought you'd love that... T: (失望,沮喪)哦,我以為你會喜歡這個...
T: (dismayed, defeated) Oh, but - but we should enjoy ourselves tonight... T: (失望,沮喪)哦,但我們今晚應該好好享受...
T: (dismayed, defeated) Oh, but everybody always likes my drinks... T: (失望,沮喪)哦,但大家總是喜歡我的飲料...
<if SpecificFancyRequest> <如果具體的花哨請求>
T: (at first dismayed, then burst of relief) What...? Oh, oh, yeah, that's even better! Great! T: (起初失望,然後鬆了一口氣)什麼...? 哦,哦,是的,那更好!太棒了!
T: (at first dismayed, then burst of relief) What...? Oh yeah, great idea, great idea! T: (起初失望,然後鬆了一口氣)什麼...? 哦,是的,好主意,好主意!
T: (at first dismayed, then burst of relief) What...? Oh yeah, that's even better! T: (起初失望,然後鬆了一口氣)什麼...? 哦,是的,那更好!
T: (at first dismayed, then burst of relief) What...? Yeah! Ooh, why didn't I think of that? T: (起初失望,然後鬆了一口氣)什麼...? 是的!哦,為什麼我沒想到呢?
<if SpecificBoringRequest> <如果具體的無聊請求>
<choose one of the Disagree dismayed/defeated> <選擇一個失望/沮喪的不同意>
<if current drink suggestion is fancy> <如果當前飲料建議是花哨的>
G: (sweet) [Player], Trip's getting a little carried away... maybe you just want some juice, or a mineral water? G: (甜美)[玩家],Trip有點過火了...也許你只想要一些果汁,或者礦泉水?
G: (sweet) [Player], I think Trip is pressuring you too much... how about just a simple glass of white wine? G: (甜美)[玩家],我覺得Trip對你施加了太多壓力...怎麼不來一杯簡單的白葡萄酒?
G: (sweet) [Player], I think you'd prefer something simple and light, like a nice glass of chardonnay, yes? G: (甜美)[玩家],我覺得你會更喜歡簡單清淡的東西,比如一杯好喝的霞多麗,是嗎?
<if current drink suggestion is not fancy, e.g., a beer> <如果當前飲料建議不是花哨的,例如啤酒>
G: (cordial admonish) Trip, darling, that's not what [he|she] wants. G: (友好地告誡)Trip,親愛的,這不是[他|她]想要的。
G: (cordial admonish) Trip, dear, don't force your fancy drinks on [him|her]. G: (友好地告誡)Trip,親愛的,不要把你的花哨飲料強加給[他|她]。
G: (cordial admonish) Trip, Trip, you're pressuring our friend. G: (友好地告誡)Trip,Trip,你在給我們的朋友施加壓力。
G: (cordial admonish) Trip, Trip, try to realize we don't all share your infatuation with mixed drinks. G: (友好地告誡)Trip,Trip,試著意識到我們並不都對混合飲料情有獨鍾。
G: (cordial admonish) Trip, Trip, our friend isn't as excited by your suggestion as you are. G: (友好地告誡)Trip,Trip,我們的朋友對你的建議並沒有你想象的那麼興奮。
G: (sweet) [Player], you'd prefer water, right? G: (甜美)[玩家],你更喜歡水,對吧?
G: (sweet) [Player], you'd prefer juice, right? G: (甜美)[玩家],你更喜歡果汁,對吧?
G: (sweet) [Player], you'd prefer soda, right? G: (甜美)[玩家],你更喜歡汽水,對吧?
G: (sweet) [Player], you'd prefer a beer, right? G: (甜美)[玩家],你更喜歡啤酒,對吧?
G: (sweet) [Player], you'd prefer a glass of white wine, right? G: (甜美)[玩家],你更喜歡一杯白葡萄酒,對吧?
G: (sweet) [Player], you simply want what you asked for, right? G: (甜美)[玩家],你只想要你要求的東西,對吧?
<set interruptible> <設置可打斷>
<Trip final comment> <Trip最後評論>
T: (impatient, a bit desperate) Grace...come on...! T: (不耐煩,有點絕望)Grace...來吧...!
T: (impatient, a bit desperate) Grace...! T: (不耐煩,有點絕望)Grace...!
T: (impatient, a bit desperate) uhh...Grace...! T: (不耐煩,有點絕望)呃...Grace...!
T: (impatient, a bit desperate) but...uhh...Grace, come on... T: (不耐煩,有點絕望)但是...呃...Grace,來吧...
"TripSuggest" for TensionMedium and PlayerAffinityTrip “Trip的提議”,中緊張度,玩家偏向Trip
<set uninterruptible> <設置不可打斷>
<if reestablish> <如果重新建立>
T: (tense, crafty) So...drinks... T: (緊張,狡猾)所以...喝點什麼...
<brag 1> <自誇1>
T: (tense, bragging) This is great...For us I'm going to open an amazing, I mean, exquisite Bordeaux. T: (緊張,自誇)這太棒了...為了我們,我要開一瓶驚人的,意思是,精緻的波爾多。
T: (tense, bragging) Ah I know...I'm going to open us a magnificent, I mean, astounding Bordeaux. T: (緊張,自誇)啊,我知道...我要給我們開一瓶宏偉的,意思是,令人驚歎的波爾多。
<local deflect dialogue: positive, negative, neutral> <局部偏轉對話:積極、消極、中立>
T: (interrupted, smiling) Y - yeah, I'm going to open an exquisite Bordeaux! T: (被打斷,微笑)是的,我要開一瓶精緻的波爾多!
T: (interrupted, puzzled, brow knit) N - no, I'm going to open an exquisite Bordeaux! T: (被打斷,困惑,皺眉)不,我要開一瓶精緻的波爾多!
T: (interrupted, a bit puzzled) W - well, I'm going to open an exquisite Bordeaux! T: (被打斷,有點困惑)嗯,我要開一瓶精緻的波爾多!
<if reestablish> <如果重新建立>
T: (tense, bragging) So...I'm going to open an exquisite Bordeaux... T: (緊張,自誇)所以...我要開一瓶精緻的波爾多...
<set interruptible> <設置可打斷>
<brag 2> <自誇2>
T: (tense, bragging) Top of the line, very rare, very difficult to acquire - T: (緊張,自誇)頂級,非常稀有,非常難以獲得 -
T: (tense, bragging) Best of the best, you can't buy this in stores...Very, very special - T: (緊張,自誇)最好的,你在商店裡買不到...非常,非常特別 -
G: God, Trip, you are such a wine snob. Just like my dad. G: 天哪,Trip,你真是個酒侍。就像我爸爸一樣。
G: God, Trip, you're just like my dad with the whole wine snob thing. G: 天哪,Trip,你就像我爸爸一樣,整天在那兒裝酒侍。
T: I'll take that as a compliment. [Player], what do you say? T: 我會把這當作讚美。[玩家],你覺得怎麼樣?
"GraceCounterSuggest" for TensionMedium and PlayerAffinityTrip “Grace的回覆建議”,中緊張度,玩家偏向Trip
<set uninterruptible> <設置不可打斷>
<if AgreeTrip> <如果同意Trip>
T: Excellent! You've got good taste. T: 太好了!你真有眼光。
T: Perfect! Ooh, you're going to love this. T: 完美!哦,你一定會喜歡這個的。
<if DisagreeTrip> <如果不同意Trip>
T: (dismayed) Oh, but this is a very special bottle of wine...! T: (失望)哦,但這是非常特別的一瓶酒...!
T: (dismayed) What? Oh, I thought you'd love that...! T: (失望)什麼?哦,我以為你會喜歡這個...!
T: (dismayed) Oh, but we should enjoy ourselves tonight...! T: (失望)哦,但我們今晚應該好好享受...!
<if SpecificFancyRequest, SpecificBoringRequest, or NonAnswer> <如果特定的花哨請求、具體的無聊請求或無回答>
T: No no, I really think we should have this wine, trust me, trust me! T: 不不,我真的認為我們應該喝這瓶酒,相信我,相信我!
T: Oh, come on, let's enjoy ourselves tonight, this wine will be so good. So good. T: 哦,來吧,今晚我們就好好享受,這酒會非常好。非常好。
<if current drink suggestion is fancy> <如果當前飲品建議是花哨的>
G: (angry) No no, [Player], maybe you'd like some juice, or a mineral water? G: (生氣)不不,[玩家],也許你想要一些果汁,或者礦泉水?
G: (angry) No no, [Player], maybe you'd like just a simple glass of white wine? G: (生氣)不不,[玩家],也許你只想要一杯簡單的白葡萄酒?
G: (angry) No no, [Player], how about something simple, like a nice glass of chardonnay? G: (生氣)不不,[玩家],那我們來點簡單的,比如一杯不錯的霞多麗怎麼樣?
<if current drink suggestion is not fancy, e.g., a beer> <如果當前飲品建議不是花哨的,例如啤酒>
G: (angry) Trip, that's not what [he|she] wants. G: (生氣)Trip,這不是[他|她]想要的。
G: (angry) Trip, don't force your fancy wine on [him|her]. G: (生氣)Trip,不要把你的花哨酒強加給[他|她]。
G: (angry) Trip, don't pressure our friend, okay? G: (生氣)Trip,不要給我們的朋友施加壓力,好嗎?
G: (angry) Trip, we don't all share your infatuation with overpriced wine. G: (生氣)Trip,我們並不都和你一樣迷戀於高價酒。
G: (angry) Trip, our friend isn't as excited by your suggestion as you are. G: (生氣)Trip,我們的朋友對你的建議並沒有像你那樣興奮。
G: (angry) [Player], you just want water, right? G: (生氣)[玩家],你只是想要水,對吧?
G: (angry) [Player], you just want juice, right? G: (生氣)[玩家],你只是想要果汁,對吧?
G: (angry) [Player], you just want soda, right? G: (生氣)[玩家],你只是想要汽水,對吧?
G: (angry) [Player], you just want a beer, right? G: (生氣)[玩家],你只是想要一杯啤酒,對吧?
G: (angry) [Player], you just want a glass of white wine, right? G: (生氣)[玩家],你只是想要一杯白葡萄酒,對吧?
G: (angry) [Player], you just want what you asked for, right? G: (生氣)[玩家],你只是想要你所要求的,對吧?
<set interruptible> <設置為可打斷>
<Trip final comment> <Trip最後評論>
T: (dismayed, under breath) What...? T: (失望,低聲)什麼...?
T: (dismayed, under breath) Oh come on... T: (失望,低聲)哦,來吧...
"TripSuggest" for TensionMedium and PlayerAffinityGrace “Trip的提議”,中緊張度,玩家偏向Grace
<set uninterruptible> <設置為不可打斷>
<if reestablish> <如果重新建立>
T: (tense, desperate) So...drinks... T: (緊張,絕望)那麼...飲料...
<grace comment 1> <Grace評論 1>
G: (biting) Trip thinks he's at his classiest when he's on the serving end of a swizzle stick. G: (尖刻)Trip認為當他在調酒時是最有品位的。
G: (biting) Trip's favorite pastime is to get the blood alcohol content of his guests higher than his golf score. G: (尖刻)Trip最喜歡的消遣是讓他的客人血液酒精濃度高於他的高爾夫得分。
G: (biting) Trip would try to serve you one of his 'high class' drinks before even saying hello if he could. G: (尖刻)如果可以的話,Trip會在打招呼之前就想給你端上一杯他的“高檔”飲品。
G: (biting) My dad bought Trip a silver-plated cocktail shaker for Christmas a few years back - the rest is history. G: (尖刻)幾年前我爸爸給Trip買了一個鍍銀的雞尾酒搖壺——其餘的就是歷史了。
T: (loud, angry, interrupting) Why don't I make us one of my new drink inventions, T: (大聲,生氣,打斷)為什麼我不為我們調製一杯我的新飲品,
T: (desperate, biting) I call it Grace's Inner Soul. It's a mixture of chardonnay, bitters, and lots of ice. T: (絕望,尖刻)我稱它為“Grace的內心靈魂”。它是霞多麗、苦味酒和大量冰塊的混合。
<set interruptible> <設置為可打斷>
<local deflect dialogue: positive, negative, neutral> <局部偏轉對話:積極,消極,中立>
T: (interrupted, smiling) W - wait, I want to make you one of my drink inventions! T: (被打斷,微笑)等,等,我想給你調一杯我的飲品發明!
T: (interrupted, puzzled, brow knit) W - wait, I want to make you one of my drink inventions! T: (被打斷,困惑,皺眉)等,等,我想給你調一杯我的飲品發明!
T: (interrupted, a bit puzzled) W - wait, I want to make you one of my drink inventions! T: (被打斷,有點困惑)等,等,我想給你調一杯我的飲品發明!
<if reestablish> <如果重新建立>
T: (desperate, biting) >So...I should make you one of my drink inventions... T: (絕望,尖刻)>那麼...我應該給你調一杯我的飲品發明...
<grace comment 2> <Grace評論 2>
G: (confident, pretending to be under breath, loud whisper) It's a secret - Trip doesn't even like the taste of alcohol. G: (自信,假裝低聲,輕聲說)這是個秘密——Trip甚至不喜歡酒精的味道。
T: (anxious, ignoring Grace) What?! So, [Player], how does that sound? T: (焦慮,忽視Grace)什麼?!那麼,[玩家],你覺得怎麼樣?
"GraceCounterSuggest" for TensionMedium and PlayerAffinityGrace “Grace的回覆建議”,中緊張度,玩家偏向Grace
<set uninterruptible> <設置為不可打斷>
<if AgreeTrip> <如果同意Trip>
T: Ah, [Player], you have deliciously wicked taste. T: 啊,[玩家],你真有美味的壞品味。
T: Ah, [Player], you are an adventurous drinker, like me. T: 啊,[玩家],你是個像我一樣冒險的飲酒者。
<if DisagreeTrip> <如果不同意Trip>
T: (dismayed, anxious) No? T: (失望,焦慮)不?
<if SpecificFancyRequest, SpecificBoringRequest, or NonAnswer> <如果特定的花哨請求、特定的無聊請求或無回答>
T: (dismayed, anxious) You - you don't want my invention? T: (失望,焦慮)你——你不想要我的發明?
<if current drink suggestion is fancy> <如果當前飲品建議是花哨的>
G: (sweet) [Player], Trip's getting a little carried away...maybe you just want some juice, or a mineral water? G: (甜美)[玩家],Trip有點過於興奮了...也許你只想要一些果汁,或者礦泉水?
G: (sweet) [Player], I think Trip is pressuring you too much...how about just a simple glass of white wine? G: (甜美)[玩家],我覺得Trip對你施加了太多壓力...要不就來一杯簡單的白葡萄酒?
G: (sweet) [Player], I think you'd prefer something simple and light, like a nice glass of chardonnay, yes? G: (甜美)[玩家],我覺得你會更喜歡簡單清淡的東西,比如一杯不錯的霞多麗,是嗎?
<if current drink suggestion is not fancy, e.g., a beer> <如果當前飲品建議不是花哨的,例如啤酒>
G: (admonish) Trip, darling, that's not what [he|she] wants. G: (告誡)Trip,親愛的,這不是[他|她]想要的。
G: (admonish) Trip, dear, don't force your fancy drinks on [him|her]. G: (告誡)Trip,親愛的,不要把你的奢侈飲品強加給[他|她]。
G: (admonish) Trip, Trip, you're pressuring our friend. G: (告誡)Trip,Trip,你在給我們的朋友施加壓力。
G: (admonish) Trip, Trip, try to realize we don't all share your infatuation with mixed drinks. G: (告誡)Trip,Trip,試著意識到我們並不都和你一樣迷戀混合飲品。
G: (admonish) Trip, Trip, our friend isn't as excited by your suggestion as you are. G: (告誡)Trip,Trip,我們的朋友對你的建議並沒有像你那樣興奮。
G: (sweet) [Player], you'd like water, right? G: (甜美)[玩家],你想要水,對吧?
G: (sweet) [Player], you'd like juice, right? G: (甜美)[玩家],你想要果汁,對吧?
G: (sweet) [Player], you'd like soda, right? G: (甜美)[玩家],你想要汽水,對吧?
G: (sweet) [Player], you'd like a beer, right? G: (甜美)[玩家],你想要一杯啤酒,對吧?
G: (sweet) [Player], you'd like a glass of white wine, right? G: (甜美)[玩家],你想要一杯白葡萄酒,對吧?
G: (sweet) [Player], you simply want what you asked for, right? G: (甜美)[玩家],你只是想要你所要求的,對吧?
<set interruptible> <設置為可打斷>
<Trip final comment> <Trip最後評論>
T: (very tense exhale) T: (非常緊張地呼氣)

5. Evaluating Façade

\5. 評估《Facade》
In this section, we attempt to characterize the resulting degree of agency achieved in Façade, as well as failures and successes in terms of design, interface and system architecture. 在本節中,我們試圖描述《Facade》中實現的能動性程度,以及在設計、界面和系統架構方面的失敗與成功。

5.1 Characterizing Agency

5.1 刻畫能動性
Creating player agency was a primary design goal for Façade, afforded by our approach of authoring highly procedural content. 創造玩家代理是《Facade》的主要設計目標,這得益於我們創作高度程序化內容的方法。

5.1.1 Local Agency

5.1.1 局部能動性
When the player's actions cause immediate, context-specific, meaningful reactions from the system, we call this local agency. Furthermore, the greater the range of actions the player can take - that is, the more expressive the interface - then the richer the local agency (again, if the responses are meaningful). 當玩家的行為導致系統產生即時、特定上下文的有意義反應時,我們稱之為局部能動性。此外,玩家可以採取的行動範圍越大——也就是說,界面越具表現力——那麼局部能動性就越豐富(再次強調,如果反應是有意義的)。
Façade offers players a continuous, open-ended natural language interface, as well as physical actions and gestures such as navigation, picking up objects, hugging, and kissing. The millions of potential player inputs are mapped, using hundreds of the aforementioned NL rules, into one or more of approximately 30 parameterized discourse acts (DAs) such as praise, exclamation, topic references, and explanations; a second set of rules called reaction proposers interpret these DAs in context-specific ways, such as agreement, disagreement, alliance, or provocation. 《Facade》為玩家提供了一個連續的、開放式的自然語言界面,以及諸如導航、拾取物體、擁抱和親吻等身體動作和手勢。數百萬種潛在的玩家輸入通過數百條上述的自然語言規則映射到大約30種參數化的對話行為(DAs),例如讚美、感嘆、話題引用和解釋;此外還有稱為反應提議者的第二組規則,以特定上下文的方式解釋這些DAs,例如同意、不同意、結盟或挑釁。
Ideally, there would be immediate, meaningful, context-specific responses available at all times for all DAs. In the actual implementation of Façade, in our estimation, this ideal is reached about 25% of the time, where the player has a satisfying degree of real-time control over Grace and Trip's emotional state, affinity to the player, which topic is being debated, what information is being revealed, and the current tension level. But more often, about 40% of the time, only a partial ideal is reached: the mapping/interpretation from DA to reaction is coarser, the responses are more generic and/or not as immediate. Furthermore, roughly 25% of the time even shallower reactivity occurs, and about 10% of the time there is little or no reactivity. These varying levels of local agency are sometimes grouped together in temporal clusters, but also have the potential to shift on a moment-by-moment basis. 理想情況下,所有DAs(對話行為)在任何時候都應有即時、有意義、特定上下文的反應可用。在《Facade》的實際實現中,我們估計這一理想狀態大約在25%的時間內得以實現,玩家對Grace和Trip的情感狀態、對玩家的親近程度、正在辯論的話題、正在揭示的信息以及當前的緊張程度有令人滿意的實時控制。但更常見的是,大約40%的時間僅達到部分理想:從DA到反應的映射/解釋較為粗糙,反應更為通用和/或不夠即時。此外,大約25%的時間甚至會出現更淺的反應性,而大約10%的時間幾乎沒有反應。這些不同級別的局部能動性有時會在時間上聚集在一起,但也有可能在瞬間發生變化。
There are two main reasons for these varying levels of local agency. First, from a design perspective, at certain points in the overall experience, it becomes necessary to funnel the potential directions of the narrative in authorially preferred directions, to ensure dramatic pacing and progress. Second, and more often the case, a lack of local agency is due to limitations in how much narrative content was authored (see the Failures section, later). 這些不同級別的局部能動性的存在主要有兩個原因。首先,從設計的角度來看,在整體體驗的某些時刻,有必要將敘事的潛在方向引導到作者所偏好的方向,以確保戲劇的節奏和進展。其次,更常見的情況是,局部能動性的缺乏是由於創作的敘事內容的限制(見後面的失敗部分)。

5.1.2 Global Agency

5.1.2 全局能動性
The player has global agency when the global shape of the experience is determined by player action. In Façade this would mean that the final ending of the story, and the particulars of the narrative arc that lead to that ending, are determined in a smooth and continuous fashion by what the player does, and that at the end of the experience, the player can understand how her actions led to this storyline. 當玩家的行動決定了體驗的整體形狀時,玩家就擁有全局能動性。在《Facade》中,這意味著故事的最終結局以及導致該結局的敘事弧的細節是通過玩家的行為以平滑和連續的方式決定的,並且在體驗結束時,玩家能夠理解她的行為如何導致了這個故事情節。
Façade attempts to achieve global agency in a few ways. First, beat sequencing (i.e., high-level plot) can be influenced by what topics the player refers to; the sequencing can vary within the number of allowed permutations of the beats' preconditions and tension-arc-matching requirements. Even with only twenty-seven beats in the system, technically there are thousands of different beat sequences possible; however, since most beats are causally independent, the number of meaningfully different beat sequences are few. 《Facade》試圖通過幾種方式實現全局能動性。首先,情節節奏(即高層次的情節)可以受到玩家所提及話題的影響;節奏的排列可以在允許的節奏前提和緊張弧匹配要求的排列組合中變化。即使系統中只有二十七個節奏,從技術上講,也有成千上萬種不同的節奏序列可能;然而,由於大多數節奏在因果上是獨立的,真正有意義的不同節奏序列數量並不多。
More significant than variations of beat sequences ("what" happened) are variations within beats and global mix-in progressions ("how" it happened). A variety of patterns and dynamics are possible within the affinity, hot-button, and therapy games over the course of the experience; in fact, these patterns are monitored by the system and remarked upon in dramatic recapitulations in the BlowupCrisis beat halfway through the drama, and in the RevelationsBuildup beat at the climax of the drama. A calculus of the final "scores" of the various social games is used to determine which of five ending beats gets sequenced, ranging from either Grace or Trip revealing one or more big hidden secrets and then deciding to break up and leave, or both of them too afraid to do anything, or both of them realizing so much about themselves and each other that they decide to stay together. 比節奏序列的變化(“發生了什麼”)更重要的是節奏內部的變化和全局混合進展(“如何發生”)。在整個體驗過程中,親密度、敏感話題和治療遊戲中可能出現多種模式和動態;事實上,這些模式由系統監控,並在戲劇的高潮部分的BlowupCrisis節奏和RevelationsBuildup節奏中進行戲劇性的回顧。通過對各種社交遊戲的最終“得分”進行計算,以確定五個結局節奏中的哪一個被排入序列,這些結局可能包括Grace或Trip揭示一個或多個重大的隱藏秘密,然後決定分手離開,或者兩人都太害怕而不敢採取行動,或者兩人都意識到彼此和自己太多,以至於決定在一起。

5.2 Failures and Successes of Façade

5.2 《Facade》的失敗與成功
In this section we attempt to evaluate our results in creating the interactive drama Façade, whose design goals were strongly shaped by our procedural content-centric approach to implementation. 在本節中,我們試圖評估創建互動戲劇《Facade》所獲得的成果,其設計目標受到我們以程序化內容為中心的實現方法的強烈影響。

5.2.1 Agency

During the production of Façade, within our "limited" authoring effort (beyond the building of the architecture, Façade required about 3 person-years of just authoring, which is more than a typical art/research project but far less than a typical game industry project). We made the tradeoff to support a significant degree of local agency, which came at the expense of not supporting as much global agency. Combined with the reality that the time required to design and author JDBs is substantial, only twenty-seven beats were created in the end, resulting in far lower global agency than we initially hoped for. As a result, we feel we did not take full advantage of the power of the drama manager's capabilities. 在《Facade》的製作過程中,在我們的“有限”創作努力下(除了構建架構外,《Facade》僅在創作上就需要大約三個人年的時間,這比典型的藝術/研究項目要多,但遠少於典型的遊戲行業項目),我們做出了妥協,以支持相當程度的局部能動性,這犧牲了全局能動性的支持。加上設計和創作聯合對話行為(JDB)所需的時間相當可觀,最終只創建了二十七個節拍,導致全局能動性遠低於我們最初的期望。因此,我們覺得沒有充分利用戲劇管理器的能力。
Furthermore, because the specification of each joint dialogue behavior - spoken dialogue, staging directions, emotion, and gesture performance - requires a great deal of authoring and is not automatically generated by higher-level behaviors or authoring tools, we are limited to the permutations of hand-authored, intermixable content. Façade is not generating sentences themselves - although it is generating sequences. 此外,由於每個聯合對話行為的規範——口語對話、舞臺指示、情感和手勢表現——需要大量的創作,並且不是由更高層次的行為或創作工具自動生成的,我們只能依賴手動創作的可混合內容的排列組合。《Facade》並沒有生成句子本身——儘管它生成了對話序列。

5.2.2 Feedback

A major challenge we encountered, at which we believe Façade falls short, is in always clearly communicating the state of the social games to the player. With traditional games, it is straightforward to tell players the game state: display a numeric score, or show the character physically at a higher platform, or display the current arrangement of game pieces. But when the "game" is ostensibly happening inside the characters' heads, and if we intend to maintain a theatrical, performative aesthetic (and not display internal feelings via stats and slider bars, à la The Sims), it becomes a significant challenge. In our estimation, Façade succeeds better at communicating the state of the simpler affinity and hot-button games than the more complex therapy game. 我們遇到的一個主要挑戰,也是我們認為《Facade》不足之處,是始終清晰地向玩家傳達社交遊戲的狀態。對於傳統遊戲來說,告訴玩家遊戲狀態是相對簡單的:顯示一個數字分數,或者讓角色在更高的平臺上,或者展示遊戲棋子的當前排列。但是,當“遊戲”顯然發生在角色的內心世界中,並且如果我們打算保持一種戲劇性的、表演的美學(而不是像《模擬人生》那樣通過統計數據和滑動條展示內心感受),這就成為一個重大挑戰。在我們看來,《Facade》在傳達較簡單的親和力和熱點遊戲的狀態方面表現得更好,而在更復雜的治療遊戲中則顯得不足。

5.2.3 Interface

5.2.3 接口
Another major challenge was managing the player's expectations, raised by the existence of an open-ended natural language interface. We anticipated natural language understanding failures, which in informal evaluations of Façade to date, occur about 30% of the time on average. This tradeoff was intentional, since we wanted to better understand the new pleasures that natural language can offer when it succeeds, which in Façade we found occurs about 70% of the time, either partially or fully. 另一個主要挑戰是管理玩家的期望,這些期望是由於開放式自然語言接口的存在而產生的。我們預見到自然語言理解的失敗,在迄今為止對《Facade》的非正式評估中,平均發生的頻率約為30%。這個權衡是有意為之,因為我們希望更好地理解自然語言在成功時所能帶來的新樂趣,而在《Facade》中,我們發現這種成功的發生率約為70%,無論是部分成功還是完全成功。

5.2.4 System Architecture

5.2.4 系統架構
In our estimation, a success of Façade is the integration of the beat goal/mix-in, global mix-in, and drama manager narrative sequencers, with an expressive natural language interface, context-specific natural language processing, and expressive real-time rendered character animation. We feel the overall effect makes some progress toward our original design goals of creating a sense of the immediacy, presence, and aliveness in the characters required for theatrical drama. 在我們看來,《Facade》的一個成功之處在於將節奏目標/節奏混入、全局混入和戲劇管理器敘事序列器與富有表現力的自然語言接口、上下文特定的自然語言處理以及富有表現力的實時渲染角色動畫相結合。我們認為,這種整體效果在實現我們最初設計目標方面取得了一定進展,即創造出角色的即時性、存在感和生動感,這些都是戲劇所必需的。
As is evident from our authoring example, there is still significant effort in authoring an interactive drama within our architecture. Our architecture now makes authoring interactive drama possible, but not necessarily easy (it was extremely cumbersome or impossible using traditional finite state machine, dialogue tree, and story graph approaches). 從我們的創作示例中可以明顯看出,在我們的架構中創作互動戲劇仍然需要大量的努力。我們的架構現在使得創作互動戲劇成為可能,但並不一定容易(使用傳統的有限狀態機、對話樹和故事圖方法時,創作過程極其繁瑣或不可能)。
It is unclear if there will ever be non-programming tools for authoring interactive drama; we believe it fundamentally requires procedural authorship. However, the idioms we have developed for structuring dialogue and using ABL within Façade can serve as a specification for a higher-level tool that facilitates authoring Façade-like experience. Even while authoring Façade, we were able to capture the general beat structure as an ABL code template that we could copy and modify for creating new beats. An obvious next step is to push these idioms as first-class language structures into ABL, or perhaps into a higher-level language that sits on top of ABL. 目前尚不清楚是否會有非編程工具用於創作互動戲劇;我們認為這在根本上需要程序化創作。然而,我們在《Façade》中開發的用於結構化對話和使用ABL的習語(譯註:可能是指用標籤標註語句塊的條件的方式)可以作為一個規範,用於開發一個更高級的工具,以便於創作類似《Facade》的體驗。即使在創作《Facade》時,我們也能夠將一般的節拍結構捕捉為一個ABL代碼模板,以便複製和修改以創建新的節拍。一個顯而易見的下一步是將這些習語作為一等(譯註:編程中指可以在運行時創造並作為參數傳遞)語言結構推入ABL,或者可能推入一個位於ABL之上的更高層次語言。
In general, our approach for architecting interactive drama systems is not to build a one-size-fits-all generic tool that tries to hide the fundamentally procedural nature of the medium, but rather to write languages for procedural authorship, build new experiences with those languages, and push the idioms and lessons learned from authoring prior experiences into first-class constructs in future languages. 總體而言,我們構建互動戲劇系統的方式並不是創建一個試圖掩蓋這一媒介根本程序化特性的通用工具,而是為程序化創作編寫語言,利用這些語言構建新的體驗,並將從創作先前體驗中獲得的習語和經驗教訓推入未來語言中的一流構造。

5.2.5 Design

5.2.5 設計
Certain aspects of our drama's design help make Façade a pleasurable interactive experience, while others hurt. It helps to have two tightly coordinated non-player characters who can believably keep dramatic action happening, in the event that the player stops interacting or acts uncooperatively. In fact, the fast pace of Grace and Trip's dialogue performance discourages lengthy natural language inputs from the player. By design, Grace and Trip are self-absorbed, allowing them to occasionally believably ignore unrecognized or unhandleable player actions. Creating a loose, sparsely plotted story afforded greater local agency, but provided fewer opportunities for global agency. However, the richness of content variation, and the (at least) moderate degree of global agency achieved, does encourage replay. 我們戲劇設計的某些方面有助於使《Facade》成為一種愉悅的互動體驗,而其他方面則可能造成負面影響。擁有兩個緊密協調的非玩家角色能夠可信地維持戲劇行動的進行,這在玩家停止互動或表現出不合作時尤為重要。實際上,Grace和Trip的對話表演節奏很快,抑制了玩家進行冗長自然語言輸入的可能性。根據設計,Grace和Trip是自我中心的,這使得他們偶爾能夠可信地忽視未被識別或無法處理的玩家行為。創建一個鬆散、情節稀疏的故事提供了更大的局部能動性,但卻減少了全局能動性的機會。然而,內容變化的豐富性以及所實現的(至少是)適度的全局能動性確實鼓勵了重玩。
The huge domain of the drama, a marriage falling apart, arguably hurt the success of the overall experience, in that it overly raised players' expectations of the characters' intelligence, psychological complexity, and language competence. As expected, the system cannot understand, nor has authored reactions for, many reasonable player utterances. The large domain often requires mapping millions of potential surface texts to just a few discourse acts, which can feel muddy or overly coarse to the player. Also, continuous real-time interaction, versus discrete (turn-taking) and/or non-real-time interaction, added a great deal of additional complexity and authoring burden. 戲劇的巨大主題——一段婚姻的破裂,可能對整體體驗的成功造成了傷害,因為這過高地提高了玩家對角色智能、心理複雜性和語言能力的期望。正如預期的那樣,系統無法理解許多合理的玩家發言,也沒有為這些發言編寫反應。廣泛的主題往往需要將數百萬種潛在的表面文本映射到僅僅幾個話語行為,這可能會讓玩家感到模糊或過於粗糙。此外,持續的實時互動與離散的(輪流)和/或非實時互動相比,增加了大量額外的複雜性和創作負擔。

6. Conclusion

\6. 結論
In this chapter, we have argued that procedural authorship is required to take full advantage of the representational power of the computer as an expressive medium. Procedurality is an underlying support for all modes of digital authorship; while procedural literacy is not required to create digital work, new media practitioners without procedural literacy are confined to producing those interactive works that happen to be possible to produce within existing authoring tools. We made a case for the importance of procedural authorship, describing the design goals of a case study, the interactive drama Façade, and how these goals could only be met through a highly procedural approach to interactive narrative. Based on our experience both architecting and authoring Façade, we have found that procedural authorship is essential for enabling yet-to-be-realized genres of interactive art and entertainment. 在本章中,我們論證了程序化創作是充分利用計算機作為一種表現媒介的表現力所必需的。程序性是所有數字創作模式的基礎支持;雖然創建數字作品不需要程序素養,但沒有程序素養的新媒體從業者只能侷限於在現有創作工具中能夠製作的互動作品。我們闡述了程序化創作的重要性,描述了案例研究《Facade》的設計目標,以及這些目標如何只能通過高度程序化的互動敘事方法來實現。基於我們在架構和創作《Facade》中的經驗,我們發現程序化創作對於實現尚未實現的互動藝術和娛樂類型至關重要。

References: Literature

引用文獻
Albee, Edward (1962). Who's Afraid of Virginia Woolf? New York: Signet.
Bates, Joseph (1992). "Virtual Reality, Art, and Entertainment." Presence: The Journal of Teleoperators and Virtual Environments 1 (1992): 133–;;138.
Berne, Eric (1964). Games People Play. New York: Grove Press.
Crawford, Chris (1987). "Process Intensity." The Journal of Computer Game Development 2 (1987).
Crawford, Chris (1989). "Indirection." The Journal of Computer Game Design 3 (1989).
Laurel, Brenda (1991). Computers as Theatre. Reading, MA: Addison-Wesley.
Loyall, Bryan (1997). Believable Agents. Ph.D. Thesis. Tech report CMU-CS-97-123. Carnegie Mellon University.
Mateas, Michael (2005). "Fever-Addled Impressions of GDC." Grand Text Auto.
Mateas, Michael, and Andrew Stern (2000). "Towards Integrating Plot and Character for Interactive Drama." Working Notes of the Social Intelligent Agents: The Human in the Loop Symposium. AAAI Fall Symposium Series. Menlo Park, CA: AAAI Press.
--- (2003a). "Façade: An Experiment in Building a Fully-Realized Interactive Drama." Game Developers Conference (GDC) 2003. San Jose, CA, USA.
--- (2003b). "Integrating Plot, Character and Natural Language Processing in the Interactive Drama Façade." Proceedings of the 1st International Conference on Technologies for Interactive Digital Storytelling and Entertainment (TIDSE) 2003. Darmstadt, Germany.
--- (2004a). "A Behavior Language: Joint Action and Behavioral Idioms." Life-like Characters: Tools, Affective Functions and Applications, edited by Helmut Predinger and Mitsuru Ishiuka. Berlin: Springer.
--- (2004b). "Natural Language Understanding in Façade: Surface Text Processing." Proceedings of Technologies for Interactive Digital Storytelling and Entertainment (TIDSE) 2004. Darmstadt, Germany.
McCorduck, Pamela (1991). Aaron's Code: Meta-art, Artificial Intelligence, and the Work of Harold Cohen. New York: W. H. Freeman and Co.
McKee, Robert (1997). Story: Substance, Structure, Style, and the Principles of Screenwriting. New York: HarperCollins.
Montfort, Nick (2005). "Finally, the Curtain Opens on Façade." Grand Text Auto.
Murray, Janet (1998). Hamlet on the Holodeck. Cambridge, MA: MIT Press.
Taylor, Alice (2005). "Burn the House Down." Wonderland.
Wikipedia (2005). "Demoscene."

References: Games

引用遊戲
Façade, a One-Act Interactive Drama. Michael Mateas and Andrew Stern; Procedural Arts. 2005.
Cite this Essay: Mateas, Michael and Andrew Stern. “Writing Façade: A Case Study in Procedural Authorship”, Electronic Book Review, February 22, 2008, https://electronicbookreview.com/essay/writing-facade-a-case-study-in-procedural-authorship/.
轉載本文時請保留: 由Mateas, Michael和Andrew Stern編寫,“撰寫《Facade》:程序化創作的案例研究”,刊登於《Electronic Book Review》,2008年2月22日, https://electronicbookreview.com/essay/writing-facade-a-case-study-in-procedural-authorship/.

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com