[米凱魯翻譯,
Athena校對, 僅獻給星世界的各位玩家]
絕冬城之夜二(NWN2)工具組是一個可以讓你製作屬於你自己的NWN2模組的強大工具. 它也是Obsidian 的遊戲設計者用來製作官方NWN2戰役的同一套工具.
這個手冊將會藉由展示一些基本的用法來幫助你上手. 然而, 實際去體驗和在NWN2模組社群討論將會讓你會學的更快, 模組社群的連結如www.atari.com/nwn2.
我們感謝您花時間來閱讀並非常期待能玩到您的創作.
NWN2 團隊敬上
翻譯簡介
米凱魯翻譯這份操作手冊的目的是為了促進華人創作模組的風氣, 讓更多想要創造屬於自己的DnD奇幻世界的玩家能夠跨越過學習工具組的障礙.
當然另外一個原因是因為Athena叫我做的…
所以本中文手冊不能夠被用來當作商業用途, 但是個人讀者可以對其中內容任意進行刪改.
PS: 文字旁跟隨著英文的話,
那該辭就是那個英文的翻譯,
方便英文版玩家對照.
另外, 本手冊是源自於英文版的絕冬城之夜二,
中文版的工具組名詞翻譯可能跟
本翻譯手冊中的名詞不同, 請自行去意會. 例如 “Tile” 在本文中翻做“磚框”或是室外地形中有時候我稱之為“地域.”
“lerp”本是“線性插值”
在本文翻做線性變換.
!!禁止使用編碼轉換器直接將正體文字轉換成簡體文字!!
米凱魯, Athena敬獻
Intro
簡介
What’s
New?
二代工具組有哪些新東西?
Quick
Reference
總覽工具組
Creating a Module
創造模組
這章節包含了創製模組還有這個模組該有的基本內容: 區域(Areas), 對話(Conversations), 和腳本(Scripts). 看完這章後你將可以了解一個模組的架構, 並且懂得如何去創造一個新區域, 載入一個開始點, 和實際進遊戲去體驗.
What
is a Module?
什麼是模組?
Loading
a Module
讀取一個模組
Areas,
Conversations, and Scripts
區域, 對話,
和腳本
Making
Your First Area
製作您的第一個區域
Placing
a Start Location
放置起始點
Exploring
Your Module
體驗您的模組
Conclusion
結論
Placing Objects
放置物件
這章節教您基本的擺放生物(creatures), 物件(placeables), 道具(items)進到您模組的區域裡. 除此之外, 您也將可以體驗到一些基本的演員的設定和您的世界的主架構而不需要去煩惱較深奧的腳本設定. 看完這章後您會曉得如何讓您的區域中有各式各樣的人, 佈景 和寶藏.
What
Are Objects?
什麼是物件?
Blueprints
and Instances
藍圖和實物
Creatures
生物
Placing
Creatures
放置生物
Modifying
Creatures
設定生物
Placeables
擺放物件
Placing
Placeables
擺放物件
Modifying
Placeables
設定及修改物件
Items
道具
Placing
Items on Creatures and Placeables
擺放道具到生物和物件上
Conclusion
結論
這一章節包含了基本的創造一個樹狀對話來讓玩家依不同狀況體驗不同的回答. 你將會學到一點關於狀況和動作腳本(condition and action scripts) 來讓你的對話更為有趣且強大. 你也會學到如何將一個完成了的對話指定給一個生物.
Anatomy
of a Conversation
對話的架構
Conversation
Scripting Basics
對話腳本基礎
Conditions
狀況
Actions
動作
Writing
a Conversation
編寫一份對話
Some
Basic Conversation Tricks
一些基本的對話小技巧
Attaching
a Conversation to a Creature
將對話指定給一個生物
Conclusion
結論
Triggers
觸發器
這章節教您關於觸發器的部分, 您將會學到如何製放這些觸發器到您的模組裡面. 看完本章節您也會詳細了解兩種觸發器: 對話觸發器和變換區域觸發器.
Placing
a Speak Trigger
放置一個對話觸發器
Area
Transition Triggers
變換區域觸發器
Conclusion
結論
Creating Items
創造道具
本章節討論道具的基本知識以及如何製作一個道具. 看完這章節你會了解大部分的道具屬性內容和如何製作您自己的道具, 同時也會教您如何自訂道具的外觀, 像是武器和鎧甲.
Creating
An Item Blueprint
創造一個道具藍圖
Creating
An Unequippable Item
創造一個不能被裝備的道具
Creating
An Equippable Item - Weapons
創造一個能被裝備的道具
- 武器篇
Creating
An Equippable Item - Armor
創造一個能被裝備的道具
- 鎧甲篇
Conclusion
結論
Map Making
製作地圖
這章節含括了製作室外區域和室內區域的基本操作和擺放各種物件進這些區域.
What
are Exterior and Interior Maps?
什麼是室外和室內地圖
Exterior
Environment Basics
室外環境的基礎設定
Toolbar
工具欄
Using
Environmental Tools
適用環境製作工具
Texturing
舖設地質
Placing
Objects
擺放物件
Level
Baking
層次的烘培
Interior
Environment Basics
室內環境的基礎設定
Tiles
磚格
Level
Baking
層次烘培
General
Lighting and Additional Considerations
基本的燈光效果和其他
Conclusion
結論
NWN2 Scripting
Reference
NWN2腳本參考資料
這章節是一個簡單的導覽來解釋腳本函數的命名規則, 也解說一些使用在對話上的動作和狀況腳本和跟NWN1比起來做了哪些改變. 這章節並不是腳本的教學.
Script
Naming Conventions
腳本的命名規則
Item
Scripts
道具腳本
Conversation
Scripts
對話腳本
Event
Scripts
事件腳本
Other
Scripts
其他腳本
Common
Scripting Commands
一般的腳本命令
Action
Scripts
動作腳本
Conditional
Scripts
狀況腳本
Changes
to NWN1 Scripts
NWN1腳本的更改
Other
Scripting Notes
其他腳本注意事項
Color
Parameters
顏色參數
Basics
基礎知識
Scripting
編寫腳本
Terrain User
Interface Questions
地形工具使用者介面的問題
Visual Effects
Editor 視覺特效編輯器
如果您有曙光引擎和NWN1工具組的經驗, 那你將會發現NWN2工具組有許多的相同處. 您正在使用的這套工具組是重新設計為了能夠支援NWN2的技術和特色. 一些新的東西包括了:
世界的創造
· 地形塗裝. 您可以雕塑地形並畫上各種地質, 水面, 和生動的草坪. 多變的筆刷大小用來起始塗裝和精緻作業.
· 樹木. 您可以很外的生產獨特生動的樹木.
· 天氣控制. 您可以自己設定天空的顏色, 雲層的密度和雲層移動的速度. 動態的日夜輪轉. 您可以設定多變的氣候和光亮狀態然後遊戲將會讓整個時辰輪轉. 舉例來說, 你可以設定在黃昏時起一陣大霧然後太陽一出來就散掉.
· 特效編輯器. 這個編輯器包含在工具組裡, 用來編輯NWN2的法術.
· 鎧甲編輯系統. 有超過100種的護套, 腕甲, 甚至你可以自行訂做布甲來創造屬於你自己獨一無二的魔法道具或制服. 所有鎧甲的部位皆可個別的上色.
· 任意的改變物件大小. 你可以很簡單的改變大部分的物件和生物的大小來創造像是看起來相當強悍的bugbear 酋長 或是小貓大小般的蜘蛛.
· 強化了視角控制. 新的鏡頭系統讓你可以使畫面呈現你想要的角度.
· 通用腳本. NWN2工具組有非常多健全的通用腳本來讓您用在自己的模組裡而不需要花腦筋自己去編寫了.
實用性
· 能夠依自己喜好改變的工作區. 您對於各種工具欄和視窗的位置和大小有更多的控制權.
· 優化的對話編輯器. 您可以傳參數到各個腳本函數和指派多種狀況和動作腳本. “主問題節點”特色使您更加容易建立特定的對話模式.
· 層次烘培. 這個半自動的烘培程序會依據您地圖裡的層次來造出路徑, 這系統會根據物件的位置自動的幫您擋住不讓玩家移動過去而不用親自去畫路徑(walkmesh).
· 多重工作模式. 你可以同時開啟數個區域, 對話 和腳本一起工作以便利快速製作.
· 戰役系統. 多重模組可以共享同一個資源和日誌資料.
· 靈活的分類系統. NWN2 沒有道具色盤, 這讓你可以在任意分類裡整理你的藍圖和實物.
· 外掛. 你可以為工具組製作外掛就像你可以幫Photoshop 和 3DS Max做的一樣.
要使用工具組, 只要啟動NWN2ToolsetLauncher.exe這個執行檔. 過了一會你就會看到:

所有NWN2 Toolset裡的視窗都可以接合, 改變大小, 或是移動到您偏好的位置. 工具組主要的內容有:
1. Menu bar功能選擇單.
2. Toolbars工具欄.
3. Area List/Conversation List/Script List區域列表/ 對話列表/ 腳本列表. 選擇視窗底部的標籤來選擇你要看的列表. 雙點任何一個列表裡的區域, 對話, 或是腳本名稱就會開啟它.
4. Area Contents區域內容. 會列出所有當下被選取的區域的內容物. 內容物包括道具, 生物, 觸發器, 物件等等.
5. Area Viewer區域編輯器. 秀出整個區域地圖. 你可通過這個編輯器編輯地形, 地質, 擺放物件等等.
6. Property Panel屬性控制視窗. 秀出被選取的物件的屬性. 屬性控制視窗包含了許多的標籤(基本資料Basics tab, 技能Skills tab等等). 如果你在區域編輯(5), 區域內容(4), 或是藍圖收集區(8)裡選擇了一個物件, 該物件的屬性就會出現在這裡.
7. Blueprint categories藍圖分類區. 藍圖是所有可以擺放到區域裡的物件的模板. 你會注意到區域內容列表(4)裡也有同樣的選項. 藍圖包含了通用目錄和本地模板.
注意: 如果您點擊了一個藍圖, 它的屬性會自動的顯示在屬性控制視窗裡. 你也可以右點一個藍圖並開啟新的屬性視窗來觀看, 但是這個程序可能會很慢而且全部不能有超過3個屬性視窗存在.
8. Specific Blueprints藍圖收集區. 這個列表跟區域內容列表有點相似, 只是列出來的是所有物件的來源模板. 舉例來說, 你如果在這區裡面選擇了一個哥不林, 你會發現在區域編輯器的滑鼠就會拉著這個哥不林模板跟著走直到你決定要把放在哪裡, 而區域內容列表裡你則是選擇這個你所擺放的哥不林.
9. 點選標籤名稱讓你切換到地形編輯器(室外區域用)和磚框編輯區(室內區域用).
這本手冊還提供了這些設定的額外細節. 請打開樣本模組來反轉操作我們的內容並藉此學會更多工具組的功能.
要試試看樣本模組的話, 開啟 NWN2 遊戲, 點選新遊戲“New Game,” 然後開啟新模組 “New Module,” 然後選擇 0100_UninvitedGuests. 要在工具組中開啟樣本模組, 啟動工具組後點選檔案à開啟(File à Open), 然後選擇 0100_UninvitedGuests.mod.
一些簡單的技巧:
· 如果您遭遇到困難, 請到 www.atari.com/nwn2 討論區並張貼您的問題.
· 在區域編輯器中, 使用Ctrl+滑鼠右鍵來旋轉視角並利用滑鼠滾輪來使鏡頭拉進拉遠Ctrl-middle-click.
· 要快速創造物件(生物, 道具, 擺放物件 – 任何在藍圖分類區中的東西), 你可以複製跟您想要的很相似而已經存在的藍圖, 再作修改就好.
· 您可以在區域編輯器中使用複製熱鍵 (Ctrl-C) 和貼上熱鍵 (Ctrl-V) 來快速複製物件.
· 您可以到檢視à選項和外掛列表來改變基本設定和利用外掛工具.
這節教學包含了模組創建還有這個模組該有的基本元素: 區域(Areas), 對話(Conversations), 和腳本(Scripts). 看完這章後你將可以了解一個模組的架構, 並且懂得如何去創造一個新區域, 載入一個開始點, 和實際進遊戲去體驗.
模組Modules (.mod 檔) 包含了所有需要用來完成絕冬城之夜二冒險的所有元素. 最基本的冒險區域包含了一個模組其中並有起碼一個的區域. 一個真正經典的冒險區域(像是NWN2官方戰役)則是將所多的模組連結在一起.
創建一個新模組, 打開工具組後, 最初始的工作區域因該如下圖, 一個新的, 空白的模組等待被製作.

如果您是要繼續之前未完成的模組, 您可以打開儲存起來的模組: 檔案à開啟(File à Open).

這個開啟功能會開啟一個新視窗來讓您劉臉覽您的電腦去尋找你儲存的模組. 初始路徑是你的Neverwinter Nights 2遊戲資料夾中的模組資料夾Modules. 舉凡有.mod 副檔名的檔案都是相容的模組檔案.
區域, 對話, 和腳本是一個模組的主要構成元素.
區域Areas 是模組中可遊玩的地圖.
一個可遊玩的模組需要起碼一個區域. 區域包含了一個可行走的區域放置了各種生物creatures, 擺放物件placeables (NWN2中稱呼靜態物件的專有名詞),
並提供其他遊玩物件可以擺放的主要空間.
一個區域可以是一個酒館, 一個洞穴, 有一整團哥布林的森林, 一個農場, 或是任何您所想像的到的場景.
不過要注意到的是整個區域是一次被載入, 在區域間移動也需要讀取的動作.
如果一個區域做的太大的話, 將會要花相當長的時間來做讀取的動作且可能會造成畫面緩慢或延遲的情況.
但是相對的, 製作太多小的區域來分散大地圖也反而會造成太頻繁的讀取.
不過這如果是您製作的第一個地圖的話, 還是小一點的好.
區域可以試室外exterior或是室內interior – 一個區域不能兼具兩者的特性, 不過你的室外區域(一個城鎮)可能有許多門通往許多個室內區域(其中的商店或是旅館等等).
對話Conversations 是用對話編輯器製作出來的互動元件. 它們包含著一場對話的文字和狀況, 辯論,或是其他在冒險中會需要說話的事件. 對話的使用通常是在你想要給玩家一個交代或是讓玩家對其他人說話. 而對話系統的核心則是使用樹壯列表, 所以一個對話不一定是要兩個人在交談著– 如果你想要一個玩家遭遇有三個選項的選單, 那有著三個回應的對話則是一個有效的方法來完成這種情況.
對話是非常強大的工具並在接下來的教學中會解說. 現在, 只要記住對話是以模組為根目錄來儲存, 所以一個完成的對話可以使用於該模組中的所有區域.
腳本Scripts 是用一行一行的文字檔案的程式 (遊戲中的程式語言是以C語言為主體, 以此來編寫的) 來跨越遊戲中原有的程式設定來編導特別的動作和事件. 一個在洞穴中的troll 會攻擊所有的冒險者而不需要你的指揮或引導. 如果你要這個troll 總是會在看到矮人的時候逃跑, 或是你想要在它死掉的時候出現增援, 編寫腳本可以幫你完成這些事.
藉由專門的程式設計師編寫腳本可以達成幾乎所有您想要的事件, 行為或是過場情節. 然而, 腳本的編寫本來就是很進階的話題, 所以現在你只需要知道由您自己編寫的腳本也是以模組為根目錄來儲存, 所以它們也可以適用該模組中的所有區域.
一個模組如我要能夠遊玩的話最少需要一個區域. 要創造你的第一個區域, 在下拉選單中選擇檔案File à 新增New à 區域Area.

一但你已選擇要創造一個新區域, 新區域製作精靈就會出現. 輸入一個名字來當做你的區域的標籤名稱tag (在上面的例子中, 這個區域就是在 Pitney Lannon’s house外面的室外區域所以設其名稱為 “Lannon House Exterior” ). 標籤名稱是工具組和遊戲用來認明各種不同形式東西的方法, 從區域到生物和道具都會用上. 標籤名稱不需要一定要能夠區別.

接下來, 選擇你想要的區域種類 (接續上個例子, 這個區域將是 Pitney的地, 而不是他房子的內部, 所以我們選擇室外區域exterior). 當你輸入完區域標籤和區域種類後按下“下一頁Next”. 區域種類在區域已經做出來後是無法改變的.

現在, 新區域製作精靈會詢問你想要的區域大小.
你可以經由設好的大小模式Tiny
(大約是一個家或是花園的大小)
到Giant (大概是一個繁忙的城市或是廣闊的森林的大小)
或是你可以藉由滑條自己改變長和寬製作一個矩形區域.
當你決定好大小後, 按下“Finish結束” 按鈕. 在這個示範裡我們先把事情都簡單化並使用一個小區域.
當你決定好區域的大小後, 你就完成了一個新區域了! 你會在區域編輯器中看到一個空白的區域!

要使這個區域可以遊玩, 你所需要的是一個起始點 (albeit slightly lacking in epic content). 當玩家進入區域的時候, 起始點讓遊戲知道在區域的哪裡讓玩家角色出現. 一個模組可以有許多的區域, 而起始點可以設在這些區域中的任一個(不需要一定是要在第一個區域). 一個模組只能有一個起始點, 所以如果已經有一個起始點存在於任何一個區域中, 放置新的將會刪除掉舊的那一個.
要放置起始點, 在工具組最上方的動作工具欄點選“設置起始點Set Start Location”有著紅色圓圈和箭頭的鈕. 所以這個按鈕因該很好認. 一旦你點選他, 你就可以在地圖的任何地方放置它. 放置好後他因該看起來像是紅色的羅盤.
雖然聽起來滿空洞的, 但是你一個區域只要有一個起始點, 那它就可以被遊玩了. 如果你想要體驗自己創造的模組, 你必須要先儲存你的模組, 開啟NWN2遊戲並開啟新模組來遊玩.
儲存你的模組, 使用下拉選單: 檔案File à 另存新檔Save As. 另外, 用 Ctrl+S 熱鍵組也可以. 給你的模組檔案一個名稱然後點儲存 “Save”就完成了!
開啟Neverwinter Nights 2 遊戲. 選擇新遊戲“New
Game” 然後選新模組“New
Module.” 你就會看到模組的表單(其中因該有您自己的模組).
點它之後按下開始模組
“Start Module.” 選擇一個角色
(或新創一個)
就可以開始遊玩你自己的模組了!



嘿….那個空白的室外區域看起來很眼熟啊…
當你想要測試模組中的特定地點, 你可以將起始點設在那裡, 儲存後開啟模組, 就可以該地點為起始點, 然後看看有沒有什麼想改變.
一件要注意的事情, “儲存遊戲”的功能會連模組資訊一起儲存, 所以如果您事後改變了模組, 卻仍然開啟用舊版模組遊玩的紀錄, 你會發現在跑的模組是舊的沒被改變過的, 所以要持續測試不斷在改進中的模組, 請一直用開啟新模組來遊玩而不要讀取遊戲紀錄.
到這裡就總詰了基本要起始你的模組的基本知識了. 你因該在創造你自己的單人遊戲模組冒險上有了總括的了解. 在這章節的結尾, 你因該知道了:
1. 如何創建一個新模組 (其實就跟打開工具組一樣簡單).
2. 使用區域, 對話和腳本的目的.
3. 如何創造一個新區域.
4. 如何擺置起始點.
5. 如何儲存你的模組和對您的模組進行測試.
這章節教您基本的擺放生物(creatures), 物件(placeables), 道具(items)進到您模組的區域裡. 除此之外, 您也將可以體驗到一些基本的演員的設定和您的世界的主架構而不需要去煩惱較深奧的腳本設定. 看完這章後您會曉得如何讓您的區域中有各式各樣的人, 佈景 和寶藏.
一個物件就是能夠擺進到你模組裡的東西. 您最常會用到的物件就creatures生物, placeables擺放物件, 和 items道具, 這些也正是一個幻想冒險的基本元素. 這些可以自由擺放的物件讓您依照您的喜好和您想要的難度來製作演員和情節. 而腳本和對話則和這些要素產生互動來編織成一個一個經典任務和各色謎團… 不過那是進階話題了 – 你還是可以藉由簡單的放置物件來製作一個簡單的冒險區域.
生物Creatures 就是怪物, 村民, 野獸, 鬼怪, 冒險者們, 和遊戲中任何非玩家操控的腳色 (NPCs) (不過他們可以被設為夥伴, 而玩家可以操控他們, 那些又是較進階的話題了, 現在就先當做NPC 玩家都不能操控來說明). 生物可以參與戰鬥和對話, 可以在遊戲世界裡移動, 可以開門關門或使用其他道具, 可以施法和使用技能並經過腳本的控制後可以有更加複雜的行為.
擺放物件Placeables 是Neverwinter Nights 2 中稱呼靜態物件, 環境物件的名詞. 擺放物件跟生物很像, 可以有腳本, 道具欄, 和對話, 只是他們有許多的行為沒法向生物一樣.
道具Items 就是武器, 鎧甲, 藥水, 鑰匙, 劇情道具等等. 通常道具不會像生物和物件那樣直接擺進到遊戲中而是附加於他們身上.
生物, 擺放物件, 和道具是由 藍圖為底創造出來的 – 就像是用模板複製出一個一個的模型一樣 (所有的物件都有藍圖). 而由藍圖創造出來被擺放到地圖裡的物件就叫做實物instance.
進階話題:
實物
改變實物的設定不會對藍圖有任何影響或是由同樣藍圖創出來的其他實物. 而且一個已經被擺放了的實物, 不會因為其母藍圖被修改而有所改變.
如果你擺放了五個由同樣藍圖創出來的哥布林並設定其中一個為巫師, 那其他四個哥步林不會因此而也變成巫師. 如果這五個哥步林已經先被擺放了您才給它們的藍圖裝備鎧甲, 那這五個哥步林不會也跟著裝備上鎧甲的.
所有這個教學裡所用到的生物, 擺放物件和道具都在工具組裡可以找的到. 接下來的教學討論如何製作屬於你自己的道具並以同理來製作新的生物或擺放物件藍圖.

雖然“生物” 這個名詞會讓人聯想到怪物和昆蟲, 不過這個含意廣泛的名詞適用於所有會動的演員, 慈祥的老奶奶或是被狼群圍困的小孩. 生物扮演了各式各樣的腳色: 怪物, 對話, 衝突(encounters), 商人和背景交通.
藉由工具組生物可以被擺放到地圖中. 實際來操作的話, 先找到工具組中的藍圖收集區視窗. 如果你沒有更動過視窗位置的話, 你因該會在畫面最右下角看到這個視窗. 點選生物 “Creatures” 的那個鈕 (有龍的標誌在上面那一個) 來瀏覽所有生物的藍圖. 你會看到很多前面有 “+” 記號的項目, 點擊 “+” 號來展開列表.
看到 人型Humanoid à蜥蜴人 Lizardfolk à蜥蜴人戰士 Lizardfolk Warrior
點選蜥蜴人戰士的項目然後你就可以擺放它了. 移動你的鼠標到區域編輯器裡然後在地圖上你想要的位置左點, 就會將蜥蜴人戰士的實物擺放上去.

進階話題: 重生和衝突Spawning and Encounters
生物也可以由重生spawned 的方式擺進地圖. 在這個情況下, 你不是直接“擺放”生物到地圖中, 相反的, 我們使用腳本來控制這些生物的出現(實際數字標準下, Y個藍圖的 X 個實物). 用這種方法, 你可以設計出一套策略讓敵人在特定的狀況下經由門上的陷阱發動來破門而入 (比方像是踩到警鈴). 這些敵人實際上沒有擺放在地圖中直到腳本呼叫他們, 所以就算一個狡猾的玩家也無法偵測出他們或和它們有互動直到遭遇到特定的狀況. 另一個自動產生生物的方法就是經由encounters衝突觸發器.
將怪物重生出現是一個進階的技巧, 我們不會在這份手冊中提到, 重要的是讓您了解到將生物直接擺放到地圖中不是讓生物出現的唯一方法. 當你更熟悉工具組後, 你因該會體驗到衝突的藍圖.
一旦將一個生物擺進地圖, 你就可以修改這個生物實物的屬性. 按下工具組上方的工具列的 “選擇物件Select Objects” 按鈕來確定你的鼠標示處在選取模式下. 左點區域編輯器中的生物來選取它然後看到屬性控制視窗Property Panel (初始是位在工具組右上方).

你可以用很多種方法來改變生物的外表. 在生物的屬性標籤 “Properties” 裡有許多項目關於外表種類, 髮型, 頭型, 屍袋, 還有選項讓你選擇是否要讓此生物的鎧甲或頭盔隱形等等. 我們來試試體驗一下改變生物的規格和顏色.
找到項目規格 “Scale” 然後在有“1, 1, 1”的文字編輯框中點一下. 你會看到在閃著的游標等待您輸入新的值. “1, 1, 1”代表這個生物的規格目前是1 x 寬度, 1 x 長度, and 1 x 高度. 試著將它們取代為 “1.5, 1.5, 1.5” 按下輸入鍵Enter 你就會立刻看到你得蜥蜴人戰士變大了50%.
要改扁顏色的話, 在規格項目下方會看到 色調(皮膚)項目“Tint (skin).” 項目右邊的文字編輯框有著 “255, 255, 255”. 點選後會冒出一個調色盤視窗. 試著點選一些其他顏色, 你會看到生物某部分的外表顏色會跟著改變. 當你選到一你想要的顏色後, 點選 “OK” 來將蜥蜴人戰士改變成這個顏色.
派系Faction 對一個生物來說是相當重要的屬性, 因為派系將決定這個生物對哪種派系友好或是對哪種不好. 一個生物對於其他跟自己相同派系的生物是友好的關係, 對於敵對hostile 和其他派系的生物則是中立關係. 要設定派系, 點選到 “Faction ID” 項目(在 “行為Behavior” 項目分類下) 然後用下拉選單來選擇你要給這個生物的派系.

你要如何知道哪個派系和哪個派系是友好或是敵對? 在工具組選項選擇檢視View à 派系Factions 然後你就會看到你的模組的統合派系表格. 這些格子的內容秀出派系互相之間的關聯, 顯示0的代表敵對關係, 50 代表中立關係, 然後100 代表友好關係.

你可以加入或是移除派系並點選格子中它們的項目來改變名稱和關係數字.
PC 派系就是玩家的派系.
注意到蜥蜴人戰士是屬於敵對Hostile派系,
並和PC有著“0” 的數字– 也就是說蜥蜴人戰士痛恨PC, 且會沒來由的一看到PC就進行攻擊. 藉由改變這個關係矩陣中的數字, 你可以影響這個生物整體的行為而不用利用腳本.
當你看完這個派系視窗後, 點選由上角的 “X” 來關閉這個視窗.

Dungeons & Dragons statistics龍與地下城統計資料讓你很簡單的設定你的生物, 雖然工具組假想您是知道職業, 技能, 專長, 和咒語是做什麼用的. 再回來看這個蜥蜴人戰士的屬性視窗並點選基本資料“Basics”標籤.
在這裡你可以修改蜥蜴人戰士的基本屬性像是名字, 種族, 和職業. 試試著加入一個等級的戰士fighter給它. 點選加入 “Add” 按鈕然後你就會注意到一個新職業已經加入到職業訊息欄裡. 利用下拉選單來將預設的野蠻人改成戰士. 如果你想要的話, 你可以利用增加 / 減少up/down 按鈕來增加或減少等級.
使用屬性視窗您可以藉由資料Statistics, 技能Feats, 專長Skills等標籤來切換到它們的視窗來對這生物的各項能力作設定.

對話Conversations 放置在物件上並會跟玩家 “交談”. 編寫新的對話會在另外一個章節說明, 不過要知道如何將它們擺放給生物相當簡單. 選擇了一個生物後, 看向他的屬性視窗, 找到對話“Conversation”項目. 在右邊拉下選單後會看到在這個模組中可以用的對話列表, 選擇你要的來成為這個生物的對話. 現在, 一旦玩家跟這個生物對話時, 對話事件就會發生了.
腳本Scripts 可以擺到一個生物上來控制其行為. 在一個實物生物的屬性視窗裡有列出可以附加的腳本種類. 放置在 “在死亡時On Death” 項目下的腳本就是當這個生物死亡的時候會呼叫的腳本, 還有 “當道具欄有動靜時On Inventory Disturbed” 的腳本則是例如有人偷這個生物東西的時候就會呼叫這個腳本, 諸如此類. 由內建藍圖所創造出來的生物都會有初始附加的腳本設定好了, 所以你不需要知道一些基本動作的腳本寫法, 像是移動到目標, 攻擊, 使用能力等等. 當你更加熟悉工具組後, 你就會想要回到這些課題並嘗試一些新的腳本.
擺放物件是Neverwinter Nights 2裡不可攜帶式的道具. 它們就像生物一樣有許多設定和變數並可以使用腳本和對話. 一般來說擺放物件是當成多用途道具讓玩家可以操作或是毀壞, 它也可以僅是遊戲世界裡的小小裝飾品.
跟生物很相似的, 擺放物件可以被擺放或是以重生的方式置放進地圖, 不過使用重生的方式來置放擺放物件是很少見的. 要置放一個擺放物件, 先找到藍圖收集區視窗. 點選擺放物件的按鈕(有桌子標誌的那個)來瀏覽所有的擺放物件. 你會看到很多前面有 “+” 記號的項目, 點擊 “+” 號來展開列表.
試試置放一個炒菜鍋, 位置在02
–人造道具 MANMADE PROPS à
POTS {03}

點下Pots {03} 的項目, 你就可以將當拉到地圖中擺放了. 移動游標到地圖編輯器中, 然後滑鼠左點來決定擺放的地點.
進階話題: 大括號中的文字
出現在大括號{} 中的文字在工具組中看的到, 但是你不會在遊戲中看到它們. 所以當命名物件的時候, 你可以使用大括號並將備註寫在裡面而不會在遊戲中被玩家看到. 譬如Goblin{strong} 和 Goblin{weak} 都會在遊戲裡顯示只有“Goblin”的字樣. 相似的, 一個容器名稱為{Trapped}Chest會在遊戲中只顯示 “Chest”.
跟生物的設定一樣, 對話和腳本可以應用在擺放物件上. 然而對於擺放物件來有一些不同的方式來觸發腳本, 不過設定過程是相同的. 在生物的那一節就說明了, 您現在先不需要煩惱腳本的事情. 而桌子, 燈和其他靜態物件正常下不像是會有對話的東西. 但是要記住, 對話只是一些樹狀排列的文字, 而一個有著三個按鈕的箱子物件可以用有四個選項的對話表示(三個選向代表每一個按鈕, 另一個則是不去動它的選項). 你現在不需要先擔心你的物箭上的對話和腳本的事情.
進階話題: 環境物件Environmental Objects
Environmental objects環境物件是不管如何都不會跟任何生物有互動的裝飾道具. 當這些物件不會有互動的功能而且他們甚至不是實心的, 比起其他擺放物件, 環境化後的物件會使用較少的CPU資源. 如果你希望製作一個充滿很多單純只是裝飾物件的地圖, 你可以將這些物件環境化來提高遊玩的流暢度..
要將一個擺放物件環境化, 你只要在地圖上點選了這個物件之後, 右點滑鼠來叫出編輯選項. 然後選擇轉換Convert à 擺放物件轉環境物件Placeables to Environmental Objects

你也可以用下面那個指令將環境物件轉回成擺放物件.
容器Containers 是擁有道具欄的擺放物件來讓玩家拿取或是儲存東西. 要將一個擺放物件設成容器, 先點選這個物件後, 看到它的屬性視窗.
在屬性視窗裡, 進行下列項目的設定:
Has Inventory? = True
Inventory Size > 1, 雖然136是一個寶箱的平均大小
Static = False
Usable? = True
要改變這些項目的值, 只要點擊項目名稱旁邊的文字編輯區就可以了. 這些項目的設定讓擺放物件可以持有物品並可以被生物使用. 現在玩家就可以在遊戲中使用這個物件並拿取放在其中的道具(或是儲存). 而如果這個物件被毀壞了, 它會掉落它所持有的道具.
道具Items 是可攜式的物品, 包括武器, 鎧甲, 魔法首飾, 鑰匙和所有會跟著移動的物品.
武器, 鎧甲, 魔法工具和其他裝備類的道具都有許多項目和變數 – 創造和修改道具在別章中會解說. 然而, 在擺放你的生物和物品進地圖時, 你通常會讓它們持有一些裝備.
生物還有物件都有放置道具用的道具欄. 擺放道具到兩者原則上都是同樣的步驟. 首先先點選該生物或物件(舉個例子, 在Pitney Lannon’s house中的蜥蜴人), 然後切換到屬性視窗上的 “Inventory” 標籤. 在這個視窗的右下角因該有一個編輯 “Edit”的按鈕點選它來進入該生物的道具欄.

我們來加幾個武器給這個蜥蜴人吧. 看視窗右下的武器分類表, 點擊 “+” 號來展開武器細項列表. 然後展開利刃Bladed和短劍Shortswords. 利用捲軸棒來上下捲動到你想要的武器.
找到項目名稱是冰刃 “The Icy Blade” 和 幸運之人“The Lucky One”. 要將它們裝備給生物, 點擊他們並拖曳到到右手邊的部位列表. 冰刃是武器, 所以因該要將它拖曳到右手或是左手部位(left hand 或是 right hand) – 試著將它拖曳到左手部位欄. 如果成功的話, 道具名稱因該會出現在部位欄中.
如果要將道具放在生物的背包中而不裝備, 點擊道具後, 拖曳到左上的區域裡. 道具名稱因該就會出現在那個視窗中.
進階話題: 道具實物
當你將一個道具給予生物, 你實際上是用該道具藍圖創造了一個實物. 當你在地圖中擺放了一個生物的實物, 在這個生物身上的道具並不連結到它的母藍圖. 所以如果你修改了這個道具的藍圖, 則這個生物身上的道具並不會因此而改變. 換句話說, 你就算修改這個道具的實物, 也不會影響到用這個藍圖製造出來的其他實物. 基本上建議, 不同道具的製作還是製作不同的藍圖而不要用同一個藍圖然後對每個實物作修改, 這也會方便日後檢索這些道具.
在背包 / 裝備區裡的道具後面都有兩個框框來選擇這個道具是否 允許掉落droppable 或是 允許被偷竊pickpocketable. 在預設的設定下, 當一個生物死亡時, 所有裝備和背包裡的道具也都會跟著一起消失. 任何被設定允許掉落 “droppable” 的道具在宿主死亡時會留在地面上. 而任何被設定為允許被偷竊“pickpocketable”的道具可以被有Sleight of Hand專長的人取出. 是著將幸運之人“The Lucky One”設成允許掉落.

擺放道具到容器裡跟擺放到生物身上是一樣的, 只是擺放物件僅有背包而已, 沒有裝備欄. 而允許掉落和允許被偷竊的設定也不會有效果 – 如果一個容器毀壞的話, 所有的道具都會遺留在地上而且容器也沒有口袋給你偷 (雖然它們可以被翹開或是上鎖).
生物, 擺放物件, 和道具扮演著冒險中的演員和演具的腳色. 它們各自擁有著許多變數和設定, 簡易的置放, 以及重要的設定也都不會太難. 現在你已經完成這章節的教學了, 你因該已經了解:
1. 生物, 擺放物件, 道具的特性和它們的使用目的.
2. 如何置放生物和擺放物件.
3. 如何基本的修改生物的外表, 行為和資料.
4. 如何將擺放物件設成一個容器.
5. 如何將道具放置到生物或是容器的道具欄中.
這一章節包含了基本的創造一個樹狀對話來讓玩家依不同狀況體驗不同的回答. 你將會學到一點關於狀況和動作腳本(condition 和 action scripts) 來讓你的對話更為有趣且強大. 你也會學到如何將一個完成了的對話指定給一個生物.
Anatomy of a Conversation對話的基本架構
對話在NWN2 遊戲中佔有很重要的地位. 它們被用來跟夥伴交談, 跟商人交易, 或是從NPC 那邊獲得任務的訊息. 對話系統的核心基本上只是樹壯的文字列表, 所以一個對話不一定是要兩個人在交談著– 如果你想要一個玩家遭遇有三個選項的選單, 那有著三個回應的對話則是一個有效的方法來完成這種情況.
對話可能一開始看起來很複雜, 但是你很快就可以迅速的學會編寫它們.

這張截圖顯示了樣本模組0100_UninvitedGuests中Pitney的對話. 對話以樹狀資料的方式來排列, 跟Windows 的資料夾排列是不一樣的. 對話的每一行或是列都稱為一個節點node. 左邊的區域顯示的是玩家會看到的對話內容text.
紅色的節點是一行由NPC說出的話語. 藍色的節點則是玩家的回應. 一個藍色的 “[繼續CONTINUE]” 字眼代表玩家在這個節點上是沒有選項可以選的. 在這個情況下, 這段對話會直接前往下一個紅色節點, 讓NPC在玩家做出回應前能優先有許多的聲明.

1. 被選取的節點的對話內容. 所有在節點屬性視窗中的內容是歸納在這個節點之下.
2. 一連串玩家可以選擇的的選項. 在紅色節點發動後, 玩家可以看到這些選項並點選(或是按下相應的數字)他想要的. 注意到這些節點左邊的 + 號可以用來展開細項的內容.
3. 其他該節點的資訊. 在這個區域上右點 (選擇“欄Columns”)你可以決定資訊的哪一欄會被顯示. 在這個截圖中, 你可以看到每個節點的動作Actions, 狀況Conditions, 和 任務Quest 資訊.
4. 節點屬性視窗. 這個視窗顯示這個節點內容的細節.
5. 對話內容. 所選的節點的對話內容出現在這. 只需要點擊這個內容編輯器的區域來編輯對話內容.
灰色的節點表示在這對話中有連結到其他節點. 使用節點連結讓可以讓你在遇到同樣的狀況時不需要再重打一樣的對話內容.

要在對話樹中新增一個節點, 只要在一個節點上右點並選擇新增. 一個 “新增一列New Line” 視窗就會出現. 打進你想要玩家看到的內容. (在語言選項的下拉視窗中的編輯字串庫功能按鈕 “Edit String Ref” 將不會應用進你的模組裡而是使用於官方戰役.)
腳本編寫在NWN2 裡是一個強大的功能, 同時也代表它也可以很複雜. 在製作官方戰役的過程中, 我們有很多設計和程式專長的腳本製作者花了很多時間來精通腳本製作工具並製作許了多通用腳本. 其中的細節已經超越了這個說明書中教學的範疇, 不過我們還是會還探討一些如何在對話中利用腳本的基本知識. 學習更多腳本編寫技巧的最好方法就是親自用樣本模組來體驗. 然後在你自己的模組中嘗試自己的對話和腳本.
狀況Conditions 是附在一個對話節點上的邏輯測試腳本, 其結果是真TRUE 或假 FALSE. 當一個狀況判定為真TRUE, 那該對話節點會發動 (被執行). 舉個例子, 你或許會有一個NPC有兩種不同的問候語: 一種是溫暖友善而另一種是冷酷standoffish. 如果你在第一個節點擺上狀況腳本來檢查玩家是否精靈種族elf, 是的話則看到友善的問候, 其他種族則得到冷酷的問候. 在這個例子, 狀況腳本被用來幫助建立NPC的人格特性.
在樣本模組中, 狀況是依照玩家的任務進度來決定哪個Pitney的對話節點該被顯示. 如果玩家不想要幫助Pitney, 那這個可憐的傢伙就會再次懇求玩家. 如果玩家殺了蜥蜴人, 那Pitney就會表示他的感激.

如果這個狀況沒有被遭遇到, 那玩家將永不會看到這個對話節點.
在一連串的玩家回應中
(藍色節點),
這意味著玩家最多只能看到3
到4 個可能的選項.
在NPC 的會話中(紅色節點),
第一個節點的狀況符合所以會出現.
如果你用樣本模組來練習的話,
你因該會注意到Pitney有五個初始的對話節點.
玩家會看到哪一個取決於之前發生過了些什麼事情.
1. 節點屬性分類標籤Node Properties Tabs. 這些標籤讓你看到一個對話節點的不同屬性內容 (在這個截圖中看到的是狀況標籤).
2. 狀況操作元Condition Operators. 如果一個節點有數個狀況, 你可以使用 “And” 或是 “Or” 來檢查是否需要狀況全部都達到或是只需要部份達到來發動該對話節點.
3. 腳本名稱Script Name. 這個文字框包含了狀況腳本的名稱. 在本例子裡, 通用腳本gc_journal_entry 用來檢查日誌的項目 (任務).
4. 腳本參數Script Parameters. 這一行的餘項表示出哪個參數被傳入到狀況腳本裡. 在這個例子中, 參數sQuestTag 被給予 “01_lizardfolk” 的值且參數sCheck的值被設定為 “10.” 腳本參數的應用是非常有用的並可以讓一個腳本被上百個對話使用. 舉個例子, gc_journal_entry 可以被用來檢定整個模組裡任何一個任務的任何進度! 參數使用於腳本中是NWN2工具組新增的功能. [注意: 如果你新增了 一個通用腳本到狀況, 動作, 或是用一個腳本替換了另一個, 點擊 “更新Refresh” 按鈕來為新的腳本設定適當的參數.]
5. 腳本程式碼Script Code. 狀況腳本的程式碼和檔案在這個視窗展現.
一個動作action是用來完成一些許多不同目的的腳本.
動作腳本執行於對話節點發動的時候.
例如, 動作像是讓NPC突然變成和玩家敵對,
移動玩家到另一張地圖, 或是置放金幣到寶箱裡.
在樣本模組中, 有一個動作腳本是當玩家完成Pitney的任務後會用經驗點數來獎賞玩家.
設定動作腳本基本上和設定狀況腳本是相似的.
我們試試來寫一段和在Pitney
Lannon 房子裡蜥蜴人的受害者的對話.
玩家可以在殺掉蜥蜴人後跟這傢伙說話.
要創造一段新的對話, 使用工具組最上面的選項欄下拉選單檔案File à 新增New à 對話Conversion.

你新增的對話一開始是全空白的, 空間保留給根節點. 就之前概略介紹對話時提到的, 你可以在根節點上右點新增來加入你的第一列對話. 這時會跳出新增對話列視窗來讓你打入對話內容. 注意到在根節點之下的第一列永遠是NPC對話列.

一但你點擊 “OK”, 新的對話列就對被加入了, 而你就可以用來編寫被害著的述說.

如果你在這個紅色的NPC對話列上新增一列對話, 你加入的是玩家回應的對話節點. 如果你想要NPC在玩家做出回應前說兩個以上的對話節點, 那你就要再兩個紅節點之間做一個空白的玩家回應節點. 試著新增一個空白的對話列到被害著述說的節點下.


結束對話End Dialog?如果玩家回應的部分沒有任何新增的行列, 這就會是對話結束的地方. 我們來看看如果我們在空白的玩家回應列上新增另一個NPC對話列的話.

結果藍色的玩家回應節點轉變成 [繼續Continue]並有一個紅色的NPC對話列跟在下面. 現在NPC已經說過了兩行對話, 我們來試著新增一些玩家的回應節點. 如果要一次讓玩家有許多選項回應, 就在同一個節點上新增多次對話列. 現在你想要有三個回應像是 “我無法移動的我腳…” 之類的對話列, 就在節點上右點新增三次.

現在對那行NPC對話列下你有三個可以回應的對話列了. 點擊對話列並將對話內容填入到對話內容中 (在右下方有著插入“Insert”按鈕的對話編輯器).

因為這些對話列之後沒有另外的對話支葉了, 它們就都是結束對話的點. 如果你喜歡的話, 你可以繼續新增NPC的對話節點和其所屬的玩家回應節點. 新增對話列的基礎都是像這樣差不多簡單.
進階話題: 商店
商店必須要經由附加於對話上的節點來達成–
他們不是玩家可以實際看的到的物件.
雖然商店就像其他物件一樣有著藍圖模本.
在你創造了你的商店藍圖後, 適當的將他擺進地圖中.
原則上最好將你的商店擺放靠近經營商店的NPC.
看看模組樣本中的商店例子來熟悉一下.

1. 商店對話節點Store Dialogue Node. 這是用來啟動商店的對話節點.
2. 腳本ga_open_store. 這個動作腳本讓商店開啟. 將商店的標籤名稱當作參數輸入到這個函數中.
3. 商店屬性視窗Store Properties Panel. 要編輯你商店的內容 (和給予你的商店標籤名稱), 打開它的屬性視窗. 點擊商店 “Store” 標籤, 然後點選編輯“Edit”鈕來改變它的內容. 然後你就可以將你要賣的道具擺進到你的商店中.
4. 區域內容Area Contents. 所有在一個區域中的商店都可以在區域內容列表的商店
“Store”標籤下可以找到.
連結Links 是一個當你在編寫很大的對話樹網時幫你省下一堆時間的時好工具. 如果你希望對話回到之前已經說過的某個點, 利用連結可以讓你省掉整個再打一遍的時間.
繼續先前的對話部分, 假設生存下來的人都還是渴望活著, 然後如果玩家問了幾個問題, 那被害人就因疲勞過度而崩潰了.
結果, 這段對話因該看起來像這樣:

注意到 “Why should I help you?” 和 “Who are you?” 對話節點都致使對話進展到同一個內容. 要將這整段編寫出來有很多工作其實是不必要的, 而且會讓你的對話樹雜亂不堪. 使用連結的話將可有效簡化這個對話.
首先將所有在 “Who are you?”之後的對話列都移除掉– 它們不會再被用到了. 右鍵點擊在 “Please… help me…” 對話列上並選擇移除 “Remove,” 就可以將該NPC紅色節點和旗下所有玩家回應的藍色解點就會一起被移除掉.
再來是設定連結. 我們希望 “Who are you?” 這段後連結到 “Why should I help you?”之後的對話. 在那個對話節點上右點並選擇“設定連結目標Set Link Destination.”

這個動作會將該NPC對話節點設成其他玩家回應節點的連結目標. 要將這個目標加入給 “Who are you node?”對話, 一樣, 在節點上右點並選擇“插入連結Insert Link.”

完成後, 你會看到一個灰色的節點附在 “Who are you?”上, 這表示如果玩家選擇了這個選項, 接下來的對話就會直接跳到“Why should I help you?”這段下面的對話.
如果你忘掉了某個灰色節點的連結是連到哪裡, 雙點這個節點, 編輯器就會自動帶你到它連結的目的地節點上\.
如果善用連結, 那本來可能需要數小時來製作的對話樹只需要數分鐘就可以完成了.
桶狀符號和大括號Pipes and Braces 是用來編寫遊戲中看不到但在工具組中可以看到的文字內容. 所以, 如果你在寫一個很長的對話並需要留下一些注意事項來提醒自己的話, 你可以把這些話寫在桶狀符號中 |像這樣| 或是大括號中 {這樣}.
![]()
上面這列對話內容看起來很雜亂, 但是玩家只會看到 “Thank you stranger, I won’t forget your kindness!” 這些字. 對話的作者可以用這個方法來將各種回應分類標籤起來並留下筆記告訴自己日後要記得回頭再來這部分為玩家增加善良陣營點數 – 在遊戲進行中這些是永遠不會被看到的.
樹幹字串Barkstrings 是只有NPC節點而沒有任何玩家回應節點的對話. 當你利用只有樹幹字串的對話跟任何東西交談可以讓遊戲進行不會因為要等整個對話樹而暫停. 相反的, 那單一的紅色節點會跟著玩家頭上浮動而不會打擾遊戲的進行.
在樣本模組中, 01_ginni是一個樹幹對話的樣本. Pitney的太太總是說著單一對話列的對話而不讓玩家有機會做回應.
進階話題: 略進
略進Fall-through 是一個對話製作技巧. 這個技巧的操作是假設有數個附加狀況腳本的NPC對話節點, 而如果第一個節點不能被顯示的話, 整個流程就略過這個節點而從下一個紅色節點開始. 我們之前有提過關於狀況conditions和動作 actions, 一個節點可以設定一個狀況檢定, 而如果狀況檢定成否false, 那該行對話不會被顯示. 我們來觀察Pitney Lannon的對話:

注意到那5個紅色NPC節點是如何從根節點發展的
(從根節點Root垂直往下看).
第一個紅色NPC節點沒有狀況腳本所以一定會被顯示,
但其他之後的對話節點都會先被忽略掉了.
在這裡, 作者利用了寫在管狀符號中的評語來指出何時和為何這個紅色節點可以顯示.
當和Pitney的對話發生時,
第一個紅色節點發動.
而當下一次在對話的時候, 遊戲會檢查根據玩家是否願意或是拒絕幫忙來決定是否發動第二個紅色節點.
當你有更多使用狀況的經驗後, 你可以使用略進fall-through來製作強大且具互動性的對話. 實際遊戲中玩家可能會感覺到這是五個完全不同的對話並針對不同事件來個別編寫的, 但是事實上這全部是一個使用了略進技巧的智慧對話.
進階話題: 單回節點
您偶爾會想要某個NPC只說一次對話並永不再重複. 舉個例子, 在樣本模組中, Pitney的初始對話(內容是他告訴玩家他的問題並懇求玩家的幫助)只會發生一次. 那次之後, Pitney只會根據玩家的任務進度來做回應. 這樣做的目的是製造一個Pitney知道並記住了玩家的幻象.
要將一個對話設成只會發生一次, 在對話編輯器中點選該對話節點, 然後在節點屬性視窗(畫面最下方)裡選擇節點“Node”標籤. 點選 “是否只出現一次Show Once” 的地方, 然後你就可以由下拉選單來選擇希望的發生頻率. 這裡的初始值是“總是Always,” 意思代表這個節點一直會重複出現, 直到設定的狀況發生為止.

將“是否只出現一次Show Once”的值設成“在遊戲中只會顯示一次Once per game”來確定這個節點只會被呼叫一次, 並永不在出現. 要注意一個略進節點若同時也是一個單回節點的話, 那對話視窗只會出現一下然後就關閉了.
對於多人遊戲世界Persistent Worlds, 最好是將這裡的值設成 “任一生物只能使用一次這對話Once per creature that uses this conversation.” 否則如果使用上一個的設定, 那這段對話就只有第一個啟動這個對話的玩家看的到, 然後就永不再出現了!
對話Conversations 是擺放在會跟玩家交談的生物或是物件身上. 選擇目標生物或是物件並看到他們的屬性視窗, 找到對話“Conversation”的欄位. 點選對話標籤旁邊的欄位的下拉視窗就會顯示這個模組可使用的對話檔案列表. 點選你要指定給這個生物或物件的對話檔. 自此, 一旦玩家試圖跟這個生物或是物件說話, 對話事件就會發動.

Neverwinter Nights 2 提供了一個極為強大的對話系統. 一開始使用時可能看起來人卻步但實際上是很簡單的. 將你的寫作技巧應用在編寫對話上來試試自己能夠讓玩家看到什麼樣的趣談! 現在完成了這個部分的教學, 您因該已經懂得:
這章節教您關於觸發器Trigger的部分, 您將會學到如何製放這些觸發器到您的模組裡面. 看完本章節您也會詳細了解兩種觸發器: 對話觸發器和變換區域觸發器.
不像大部分被擺放進遊戲世界的物件, 觸發器triggers 通常是不會讓玩家看到的. 它們的功能就如其名– 當玩家越過邊界並進入了觸發器的範圍時, 某些事情就會發生. 一個觸發器可能是用來啟動一個對話, 觸發一個陷阱, 或是冒出一整團的怪物.
如果你已經有完過樣本模組的話, 那你就已經遇到過一些簡單的觸發器了. 當你初次接近Pitney Lannon時, 你的腳色有進入了一個隱形的會話觸發器speak trigger. 這個觸發器讓Pitney跑向你並開啟他的對話視窗.

工具組實際上有提供了一些已經製作好的官方觸發器而且很簡單可以使用. 許多進階的模組製作人可能會廣泛的使用 “通用generic” 觸發器, 是用來接受自製腳本的高靈活度觸發器. 但是本手冊的目的僅在教學, 所以我們會專注於一些官方觸發器的使用.
會話觸發器是用來開啟一個對話視窗並發動一個對話的檔案. 要在地圖中放置一個會話觸發器, 首先打開你模組中要放置的區域. 然後到藍圖收集區找到觸發器 “Triggers”的標籤.
點選 “會話觸發器SpeakTrigger,” 並將你的滑鼠游標移到區域編輯器中. 你會發現滑鼠游標這時看起來像一個十字準心而不是平常的箭頭. 現在你將利用這個準心畫出會話觸發器的邊緣. 在區域編輯器中你想要的一點左點滑鼠來設置範圍的第一個角落. 然後在附近另一處再左點一次– 會看到畫出了一條連接兩點線. 再在別處點兩點來讓範圍形狀變成方形或矩形. 按下F2 (或是滑鼠右點一下), 滑鼠準心就會恢復成原來的模式. 觸發器可以是任何形狀, 你想要有多少邊腳都可以, 然後工具組會明確的將這個形狀範圍運算成觸發器的有效範圍.

一但你創好了一個觸發器, 你仍然可以像其他擺放物件一樣任意在地圖中移動它. 在觸發器上點擊一下, 然後你就可以拖曳它了.
進階話題: 重新設置觸發器的形狀
如果你不喜歡剛剛做好的形狀, 你可以在它身上右點並在下拉選單中選擇 “重劃觸發器Repaint Trigger”. 這步驟會將你的滑鼠游標變回十字準心. 而一但你用這個新準心在區域編輯器中點了一下, 你的舊觸發器形狀就會整個消失, 你就可以劃一個新的區域. 不過利用重劃觸發器的時候, 你這個觸發器屬性的設定會保留著不會跑掉.
現在你的觸發器已經擺好到遊戲世界裡了, 你需要做的就是設定它的屬性內容. 首先點選你的觸發器. 然後看到屬性控制視窗.
不過要先確定有事先選擇了“屬性Properties”標籤. 向下捲動到“腳本Scripts”欄位. 注意到在一進入On Enter的腳本欄位已經設置了gtr_speak_node. 不要改變或是刪除這個腳本 – 它提供了一個會話腳本該有的基本功能.
在腳本欄位最下方式一行標著“變數Variables”的欄位. 在這個欄位上點擊(你因該會看到一些粗體字的內容), 然後一個瀏覽按鈕 (有著橢圓標籤)會出現. 點擊瀏覽按鈕來開啟變數編輯視窗.

你因該會看到九個變數列在這個視窗中, 標號0到8. 點選每一個並看看出現在右邊視窗中它們的設定. 我們會陸續來探討最重要的幾個變數.
1. NPC標籤[NPC_Tag]. 決定由哪個NPC跟玩家開始這段對話. 在“ValueString”欄位輸入這個腳色的標籤名稱. 樣本模組中, ValueString是設為01_pitney, 也就是Pitney Lannon的標籤名稱.
2. 對話[Conversation]. 最重要的欄位 – 如果這個欄位空白的話你的觸發器將不會有任何效果. 這個欄位說明了你的觸發器要發動哪一個對話. 在ValueString欄位中輸入對話檔的標籤名稱. 樣本模組中, ValueString 是設為01_pitney, 也就是我們幫Pitney做的對話的標籤名稱.
3. 移動[Run]. 決定在觸發器觸動時這個NPC是否會移動向玩家. 如果你在ValueInt欄位中設為1, NPC就會在觸發器觸動時跑向玩家. 如果設為0, NPC是用走的走向玩家. 如果設為-1, NPC就會留在原地而不移動. 樣本模組中, 這個值是設為1, 所以Pitney會在觸發器觸動時跑向玩家.
4. 立即對話[TalkNow]. 決定對話的發動是在NPC移動向玩家之前還是後. 在ValueInt欄位中設成1的話, 對話是立刻發生在移動之前. 設成0的話對話會直到NPC移動到玩家身前才會發動. 樣本模組中這個值是設成0, 所以Pitney會跑到玩家身前才會開始說話.
5. 重複使用[MultiUse]. 決定這個觸發器是否每個玩家踏進時都會發動還是在整個遊戲中就只會發動一次. 將ValueInt欄位設成1的話則每個玩家踏入一次他就發動一次. 如果你將值保留在0, 觸發器就只會發動一次. 樣本模組中, 這個值是設為0的, 所以Pitney只會在玩家第一次踏進這個會話觸發器時跑向玩家和發動這段對話.
進階話題: 會話觸發器和戰鬥
CombatCutsceneSetup. 當會話觸發器設置在一個危機四伏的地圖中時, 這個特別的變數相當有用. 當玩家踏入會話觸發器而週遭又會有敵對的敵人衝過來的話將這個欄位的值設為1. 這會讓所有敵對的敵人在會話的期間中暫時消失 (防止因為對話而讓玩家卡著白白被打死)而當對話結束時, 畫面會恢復到原來的樣子, 怪物未揮下的一劍會繼續砍下. 在樣本模組中, 因為在Pitney的農場範圍內不會有任何敵人襲擊所以在這個欄位我們設為0.
現在你已經在對話欄位中設定了一個對話檔, 並且也在NPC_Tag 欄位中指給了一個NPC(也確定了該NPC有放置在地圖中了), 那你就完成了所有的工作了!
目前為止你經學會了如何擺放觸發器的基本知識了, 我們現在來討論另一種觸發器: 區域變換觸發器area transition.

一個 區域變換觸發器area transition 讓玩家要穿越一個地圖到另一個地圖時提供轉換點. 在一個不適合由門來當做區域轉換媒介的場合下他很有用 (像是你希望玩家是沿著一條路來離開這個地圖). 這一節解釋了區域變換觸發器的基本功能, 和定義需要做設定的參數, 以及分別這個觸發器和會話觸發器不同的地方.
首先就像放置對話觸發器一樣的放置區域變換觸發器進地圖. 要適當的設定區域變換器讓它正常的在地圖間轉換玩家, 看到它的屬性控制視窗.
找到“行為Behavior”欄位, 在下列項目中做設定:
6. 連結物件種類[Link object type]. 決定你的區域變換是將玩家送到一個門前還是一個路點上. 在下拉選單中選擇“傳送到一個門前Transition to a door” 如果你是想讓玩家直接被傳送到一個門的物件前. 選擇 “傳送到一個路點前Transition to a waypoint”如果你想要將玩家傳送到一個擺放好的特定路點上. (如果你選的是 “不傳送No Transition,”那這個區域變換觸發器將不會做任何事情.)
7. 連結到[Linked to]. 設置目的地的門或路點的標籤名稱. [注意: 你必須要確定標籤名稱每個字的正確性以及這個門或是路點是否真的有被擺放到地圖中.]
8. 團體傳送[Party Transition]. 決定在做區域變換的傳送時, 是否整個團隊的人一起被傳送. 如果這個欄位是設成真true, 那只要隊伍中任何一位玩家使用該觸發器進行區域變換的話, 那整個團隊就會一起被傳送到新的地圖. 如果是設成否false, 那就只有進入區域變換觸發器的該名隊員變換區域. 在單人模組中, 盡量都設為True比較好.
9. 自訂名稱[Localized Name]. 你可以使用這個欄位來提醒自己這個區域變換的目的或是其目的地. 它不會被玩家看到.
如果上述的屬性都設定好了, 也都確認了目的地門或是路點也都確實擺進地圖了, 那這個區域變換就完成待測了!
進階話題: 世界全域地圖
要設定讓玩家區域變換到世界全域地圖是可行的. 世界地圖是您自己創造的一個平面概略的抽象地圖圖片來顯示你設計的整個遊戲世界. 你可以將全域地圖點map points 和一個小型標誌圖片(例如一個城市或是地城的標誌)放進區域裡. 當玩家來到世界地圖的畫面, 他們只需要點選它們想要的目的地, 遊戲就會忽略中間辛苦的旅程而讓玩家們瞬間傳送到那張地圖裡. 你甚至可以設計腳本來讓玩家在旅程中或是前往特定地圖時有特別的事件發生.

要體驗世界地圖編輯器World Map Editor, 前往外掛Plugins à 世界地圖編輯器World Map Editor.
在官方戰役中gtr_world_map_en腳本是使區域變換觸發器傳往世界全域地圖畫面的通用腳本, 放置在[在進入時OnEnter]腳本欄位.
觸發器是利用玩家位置來觸發事件的實用工具. 您讀完這篇教學之後因該曉得了:
1. 如何擺放觸發器到遊戲世界中和如何重新割劃觸發器範圍.
2. 如何利用觸發器啟動對話.
3. 如何利用觸發器來做地圖之間的傳送.
本章節討論道具的基本知識以及如何製作一個道具. 看完這章節你會了解大部分的道具屬性內容和如何製作您自己的道具, 同時也會教您如何自訂道具的外觀, 像是武器和鎧甲.
Creating An Item Blueprint創造一個道具藍圖

遊戲中在一些場合下可以被撿拾或是使用的任何東西就是所謂的道具item. 所有的鎧甲, 武器, 藥水, 任務道具 – 任何充實遊戲世界的有用物品, 從邪惡巨人密穴中的魔法長劍到你賣給商人的黃金錢幣等比比皆是.
道具大體分為兩類: 可裝備的equippable 和 不可裝備的unequippable. 可裝備的道具包含了珠寶, 武器, 鎧甲 – 任何一個腳色身體, 腰間或是兩手, 任何合理部位可以佩帶的東西. 不可裝備的道具是那些不能夠佩帶在身上的東西 – 它們可能單純只是佔據腳色身上的道具欄位 – 而且可有也可以沒有任何功用. 不可裝備道具可以是背包中提供被動效果的東西, 或是用完就消失的 (像是藥水或卷軸), 或是用來打造東西 (像是金屬原料), 或是單純只是佔空間的東西 (像是任務道具). 因為可裝備和不可裝備的道具他們效果的差異性很大, 本節教學將會帶您兩種物品的製作過程都走過一遍, 並在Pitney的農場樣本模組中各親手做一種.
要創造一個新道具, 在藍圖收集區中點選 “道具Items” 標籤來瀏覽遊戲中的所有道具藍圖. 在任何欄位右點滑鼠來跳出一個視窗選單: 在選單中選擇 “創造藍圖Create Blueprint,” 再選擇 “模組Module” (如果你想要創造一個任何模組都可以用的道具藍圖, 就選擇“通用Global”). 這個步驟會為該特定模組創造一個新道具模板. [注意: 另一個創造道具的方法是複製現有的藍圖, 在特定藍圖上右點滑鼠, 選擇 “複製藍圖Copy Blueprint.” 這會創造該藍圖的複製品來讓您修改 – 當您只是要做同樣道具的輕微修改版時會很省時間.]
在道具的模板內有許多的屬性欄位: [注意: 有一些標籤在這張截圖中是關閉的, 因為他們跟創造一個道具沒有直接的關係. 鎧甲的標籤是關閉的因為它只跟鎧甲製作有關, 稍後的章節會解說. 雜物和腳本Misc & Scripts 欄位不會在基本道具製作中用到, 而且有點超出本手冊的教學範圍, 所以暫時不會介紹.]

1. 外觀Appearance. 這一區欄位決定了你的道具的基本外表, 特別是對於武器來說.
a. 外觀(特效)Appearance (special effect) – 列出可以附加於此道具上的特效. 原則上這欄的設定不是必要的, 像是武器的特效實際上是內建好的: 任何元素附魔加值在3以上的都會自動擁有該元素的外觀特效, 這個特效也可以在“行為Behavior”區欄位裡自己設定.
b. 容器的使用者畫面Container UI Screen – 設定當容器被打開時的背景圖片. 因為只是製作道具所以因該讓它保留原始設定.
c. 圖像Icon – 該道具使用的圖像 (圖像列表來自nwn2_icons.2da檔案).
d. 模型部位Model Part – 該道具使用的模型外觀(只對特定可裝備道具來說是重要的, 例如武器和詩人用的樂器. 然而可以穿戴的道具則是使用鎧甲設定工具來製作的, 之後會解說).
e. 色調Tint – 該道具模型所漆上的顏色 (以RGB值顯示).
2. 行為Behavior. 這道具在遊戲中如何運作.
a. 附加價值Additional Cost – 除了預設好的價值外, 這個道具值多少錢 (在這欄位下面會看到一行不能改變設定的 “基本價值Base Cost” 欄位). 每一個道具在baseitems.2da檔案中都有一個預設的價值: 任何因為強化這個道具的附加價值都會經由電腦計算後加在基本價值上, 而這個附加價值就在這裡由玩家給予 (也可以設定為負數來降低價錢).
b. 鎧甲種類(依據遊戲規則)Armor Type (for game rules) – 設定鎧甲的種類 (根據2da檔案中預設好的鎧甲規則). 只對設定鎧甲原形有用.
c. 鎧甲規則資訊Armor Rules Info – 不能進行修改. 給予所有所選種類的鎧甲的規則列表.
d. 基本價值Base Cost – 不能進行修改. 所選道具的基本價值列表.
e. 道具原型Base Item – 決定道具的種類. 在整個藍圖中這因該是最重要的欄位 (次要的是來源出處resref, 在下面有討論) 因為這個欄位決定了該道具主要構成要素像是模型的使用, 道具重量, 武器數據, 和基本價值 (這些細項的設定是由baseitems.2da 檔案所控制, 在工具組內無法被修改).
f. 充填量Charges – 一個魔法道具的總充填量 (只對會施放法術的道具有用, 並且只想要使用者能夠使用特定的次數而已 – 不同的法術可以有不同的充填量耗費, 想要的話甚至可以重新充填).
g. 容器偏好Container Preference – 當該道具被拾起來時所預設的裝它的容器: 初始是設為玩家的基本道具欄. 假設我們製作了一個藥水箱的容器道具, 藉由這項設定, 我們可以讓玩家拾到的藥水預設為收藏進藥水箱中.
h. 詛咒的Cursed – 將道具設為受到詛咒的 (也就是不能被丟掉也不能被擊落直到施放了解除詛咒的法術於其上).
i. 可掉落Droppable – 決定NPC是否會掉落這個道具 (預設是否false – 通常是根據情況來設定 – 例如, 你可能會想要讓歐吉掉落它所使用的木棒, 但是你不會想要讓邪惡巨人掉落它的爪子).
j. 強制裝入偏好容器Force Into Preferred Container – 決定拾起這個道具時是否會強制的被裝入偏好的容器中 (比如強制讓箭枝被裝入箭袋中, 寶石裝入寶石袋中)
k. 鑑定過Identified – 決定拾起這個道具時, 它是已經鑑定過的狀態還是尚待鑑定, 還未鑑定過的話是不能裝備的 (在NWN2中的魔法道具, 這欄位通常是設成否False).
l. 道具能力Item Properties – 該道具所可以擁有的特別能力 (像是[可以施法]Cast Spell, [強化加值 [+2]] Enhancement Bonus [+2], [弱點: 酸性] Damage Vulnerability: Acid) – 在點選這個欄位跳出的視窗中進行設定.
m. 道具功能發動設定Item Property Activation Preference – 控制該道具在什麼情況下其屬性能力才會有效果. 道具像是武器只要在裝備時, 武器的性能才會有效, 而當道具像是護符則可以不需要裝備僅擺在道具欄裡也會將其能力發動. 也就是說不管是可裝備的還是不可裝備的道具都可以給予特別的影響力).
n. 可以被偷竊Pickpocketable – 截定這個道具是否可以被偷竊 (預設是否false – 通常也是根據情況來設定).
o. 劇情道具Plot – 決定這個道具是否劇情必要道具 (像是任務道具). 防止跟過關有關係的道具不小心被摧毀或是從背包裡被移除.
p. 數量Stack Size – 有多少同樣的道具會同時被擺放到地圖上 (數量1 表示一此只會出現一個, 如果數量設為50 表示該道具一次會出現50個)
q. 贓物Stolen – 該道具是否贓物而不能賣給非黑市的商人 (預設設為否false – 通常也是視情況來設定)
3. 藍圖Blueprint. 工具組如何來追蹤檢索該道具.
a. 評語Comment – 填寫評語的欄位. 這裡的資訊永遠不會在遊戲中看到.
b. 模板來源出處Template Resref – 這個實物的藍圖來源 (模組內放置實物的關鍵). 每個道具都必須要有一個獨一的來源出處.
4. 總欄General. 該道具是如何被分類和描述的.
a. 級別Classification – 該道具在工具組中的排列順位
b. 自訂描述Localized Description – 自由設定的道具來歷功用描述: 這會顯示在一般正常物品, 或是未鑑定物品的描述區.
c. 自訂描述(鑑定後)Localized Description (when identified) – 當物品鑑定後出現在物品描述區的內容.
d. 自訂名稱Localized Name – 自己設定的道具名稱.
e. 來源名稱Resource Name – 該道具的實際的檔案名稱 (也就是該道具的所謂官方檔名)
f. 標籤名稱Tag – 在腳本中用來認明該道具的名字 [注意: 通常把標籤名稱tag, 來源名稱Resource Name, 和模板來源出處Template Resref使用同一個名字來簡化作業]. 不過基本上標籤名稱要不同於其他名稱, 不過跟來源出處resrefs有點不一樣的是, 兩個不同道具可以有相同的標籤名稱.
5. 其他Misc. 用來處裡[縱橫捲動UV scroll], 它是使用於讓模型的外觀質地以平行U 和垂直 V 方向捲動 (通常是用在會需要看起來在流動的靜態物品上, 像是水面物件或是岩漿地板).
6. 腳本Scripts. 附加於該道具上的額外腳本 (額外於預設的腳本). 舉個例子, 拿取一個寶石袋會觸發一個腳本來讓原持有著攻擊你.
7. 數據Statistics. 設定道具的材質特性.
a. 傷害削減Damage Reductions – 設定該道具本身的傷害抵銷程度 (不是由攻擊方所決定的傷害程度而是道具本身可以抵銷傷害的能力).
b. 材質Material – 構成該道具的主要材料, 通常是為武器和鎧甲設定來決定對特定怪物是否有特別效果. 例如, 類狼人(萊肯lycanthropes)對於不是由煉銀打造的武器具有很強的抗性.
這些細項都設定好了之後, 你的道具就完整了.
在樣本模組中, 我們現在要創造的第一個道具是一個不可裝備道具 – Pitney Lannon收藏的一瓶1363 年份採收釀製的蜂蜜酒(Harvest Mead). 利用上面教學的步驟創造一個新的道具模型然後現在就來進行設定.
要對一個新道具進行設定時, 首要工作就是將該道具的自訂名稱Localized Name和 來源名稱Resource Name/ 標籤名稱Tag / 模板來源出處Template Resref 先設定好. 就在你設好這些名稱時, 這個道具就會清楚的出現在道具路徑下.

一但名字和來源出處設好了, 在來就是設定道具原型Base Item了 (在行為欄區). 在樣本模組中, 因為蜂蜜酒是一個很小, 不能裝備也沒有特別功效的道具, 道具原型因該設成“小型其他物件Miscellaneous Small Object” (這個步驟將該道具原型的資料從baseitems.2da檔案中抽取出來並設定好) – 使用下拉選單來選擇這個道具原型, 並在選好後按下 “輸入Enter”來確認你的選擇.
進階話題: 2da 檔案
2da這個辭表示
“2維陣列 2
dimensional array.” 2da 檔案是用來儲存NWN2遊戲所需要的各方面資料,
包含法術spells,
職業classes, 和專長feats. 2da檔案放置在Data資料夾中.
baseitems.2da 中保存不同道具種類的基本參數.
2da檔案中的每一個橫列是一個項目, 每一個縱列是一個欄位.
舉例來說,
所有的巨劍greatsword使用baseitems.2da檔案中的同一橫列.
它們都有同樣的基本傷害力, 都是雙手武器,
同樣的的模型部位等等.
藥水Potions, 戒指rings, 曲刀scimitars等各種物品都在baseitems.2da檔案中有他們自己的一個橫列.

這些主要的部分設定好之後, 就只剩下設定該道具的圖像icon了 (點選圖像icon欄位會出來一個有著一個一個小圖像的捲動選單: 將圖像由temp0 改成 it_spirits), 然後設定劇情需求Plot欄位 (我們不需要擔心蜂蜜酒會不會掉落或毀壞的問題, 所以保留原來的設定值否False), 並且在自訂描述欄位中寫一些適當的描述.

要讓這個到舉有特殊功用的話 (而且用來證實一個不能裝備的物品在背包中也會產生被動的特別效果), 開啟 “道具能力Item Properties”標籤來新增一個特殊的功用.

一直捲動到看到[能力加值Skill Bonus]這個地方, 開啟它並找到專注技能Concentration skill. 在新增能力 “Add Property”按鈕上點擊來新增該能力, 然後右方出現新增出來的能力欄位上選擇[加值bonus]然後往下看到 “已選擇的能力Selected Property”欄區. 設定加值Cost Value (在這裡, 是要給專注技能的加值) 為 +2, 並點選OK來確認你的選擇.
最後, 為了要讓玩家感受的到專注技能有加值過了 (因為這個道具無法裝備), 更改[道具功能發動設定Item Property Activation Preference]成ITEMPROP_ACTIVE_REPOSITORY_ONLY, 這會讓該道具只有存在於玩家道具欄中時才會有效果.

這個道具就完成待測了.
我們剛剛已經為模組製作了一個不可裝備的道具, 所以我們現在該來試試製作一套可裝備的道具: 一個武器和一個鎧甲. 說到武器, 剛剛好我們的設定中Pitney Lannon擁有一把不錯的棍棒是用來打擊討厭的蜥蜴人的: 他自己可能缺乏用它的勇氣, 但是這不代表他不會把它給予一個願意替他打擊敵人的年輕人…
要打造一把霧氣 (在這裡的例子中是Pitney的 爬蟲剋星之棒Reptile Bane Cudgel), 照著之前說過的說明先再模組中製造一個道具藍圖 (在“道具Items”上右點滑鼠然後創造藍圖Create Blueprint -> 模組Module). 然後跟製作不可裝備的道具 一樣, 首要工作先把道具名稱和來源出處先設定好.
當名稱和來源出處都設定好後, 來到道具原型Base Item的欄位並選擇一個可以裝備的道具的模型 (在這裡則是“棍棒Club”). 因為棍棒道具原型是一個武器, 所以現在可以選擇外觀模型了 [注意: 基本上大部分可裝備的道具都有外觀模型可以設定, 但不是全部– 護腕bracers, 權杖rods, 法杖wands, 和首飾沒有外觀模型可以選擇]. 捲動到外觀Appearance的欄區並在模型部位選定想要的號碼: 不同的道具原型有不同的模型部位型號可以選擇, 數量也不一, 而某些道具原型則有多個部位可以進行選擇 (以長劍來說, 它可以變換不同的劍柄, 劍身, 和護手). 要找出理想的部位來彼此配對, 最好一次進行一個部位的變換, 並在屬性視窗“Properties”和預覽視窗“Preview”間來回切換來觀察變化 [注意: 如果一個黑色的問號方塊出現在預覽視窗中的話是因為該模型編號實際上沒有模型的原因].
在爬蟲剋星之棒Reptile Bane Cudgel的例子中, 在第一個模組部位的欄位中選擇 “2” – 這會幫這把武器選擇編號2的棍棒模型 (金屬材質的模型). 你可以點選預覽視窗“Preview”標籤來觀察模型外觀, 並可利用滑鼠的滾輪來拉進拉遠, Ctrl+滑鼠右鍵來讓模型繞轉, 還有Ctrl+滑鼠左鍵來讓視點上下傾斜 [注意: 要觀看模型前一定要先點選預覽視窗“Preview”否則你不會看到任何模型外觀]

當這個棍棒正確的出現後, 打開外觀Appearance欄區的色調Tint欄位. 會出現三組色調欄位 – 在其中一個上面點擊就會出現調色盤小視窗.

每一個調色盤小視窗個別的為每一個模型部位進行上色, 你可以在左手邊的色盤上手動選擇一個顏色, 也可以在右邊顏色樣品中藉由顏色名稱來選擇 (當你滑鼠游標移動到每一個顏色樣品的小方塊上時, 該顏色的名稱會就會浮現出來). 通常一開始時都會將色調選擇亮眼的顏色 (像是純紅色, 綠色, 或是藍色), 同時利用切換於屬性視窗和預覽視窗來找出哪一個色調是屬於哪一個模型部位. 在這個例子的二號棍棒模型, 模型色調1號控制棍棒主體的顏色, 色調2號控制把柄的顏色, 然後色調3號則決定纏布的顏色. 我們使用顏色樣品表來設定爬蟲剋星之棒Reptile Bane Cudgel的各部色調: [色調一號Tint 1]設為暗冷棕色Darker Cool Brown, [色調二號Tint 2]設為冷棕色Medium Cool Brown, 然後[色調三號Tint 3]設為暗豆綠色Darker Pea Green. 都設好後, 切換到預覽視窗來看看長什麼樣子.

外觀決定好後, 照著跟製作不可裝備道具一樣的步驟來完成整個製作作業 – 設定圖像icon (it_wu_clubpoison), 寫一段道具描述, 並選定適當的道具能力Item Properties.

對於我們的爬蟲剋星之棒Reptile Bane Cudgel來說, 如果沒有加上對爬蟲類的攻擊加值的話就會名不符實了. 在道具能力欄位上點選並選擇 “對特定種族攻擊加值Attack Bonus vs. Racial Group” 能力欄, 往下捲動並選擇 “爬蟲類Reptilian”, 並改變該能力的加值Cost Value到+3. 如果要使這個武器再強一點的話, 往下看到 “強化加值Enhancement Bonus”並新增這個能力, 將加值Cost Value設到+1. [注意: 同理你可以讓一個道具擁有許多的道具能力].

當道具能力Item Properties設定好之後, 往下來到數據Statistics 的欄區並將道具材質Material欄位設為 “金屬(鐵) Metal (Iron)”: 雖然並不是一項很有影響力的設定, 但是養成好習慣將每個道具都設定一個合理的材質和價值. 某些材質是有內建特別效果的, 像是冷鐵Cold Iron (對惡魔加值) 或是黑鐵Darksteel (有額外+1抗電系傷害), 並根據道具的種類而有其他不同的價值.

都設好後, 這個武器就可以使用了.
在我們製作了一個可以裝備的武器之後, 只差再多學一些其他的步驟就可以製作鎧甲了. 製作皮特尼的軍甲Pitney’s Militia Armor將會提供一個很好的教學讓您了解如何裝配鎧甲原型和一些組件另外加上額外附加其上的技能和法術加值.
要製作一套鎧甲, 照著上面教過的步驟先製作一個標準的可裝備道具: 創造新藍圖, 設定名稱和來源出處, 將道具原型Base Item設成 “鎧甲Armor.” 設好後再設定鎧甲種類Armor Type的欄位 (本例中, Pitney是一個單純的小鎮守衛隊員, 所以墊布甲Padded armor因該就夠好了). 選好鎧甲種類之後, 你會看到下方的鎧甲規則資訊ArmorRulesInfo欄位 (灰色內容) 更新成該鎧甲種類的相應規則.


再來在藍圖選項單上選擇 “鎧甲設定Armor Set” 標籤 – 這是用來細部設定鎧甲外觀的工具 [注意: 鎧甲設定工具的預設模特兒是人類男(無法改變): 在一些跨種族和性別的鎧甲原型中, 根據種族 / 性別的不同, 鎧甲原型的模型外觀也不同, 這在只能使用人類男的模特兒的鎧甲設定工具中是看不出來的]

跟預覽視窗類似的是, 鎧甲設定工具也使用Ctrl 和滑鼠左鍵的組合: 滑鼠滾輪控制拉進拉遠, Ctrl+滑鼠左鍵旋轉整個模特兒, 還有滑鼠左鍵拖曳來移動模特兒. 有一點很重要的是, 使用鎧甲設定工具的時候, 最好要關閉預覽視窗: 雖然開著預覽視窗鎧甲設定工具還是可以運作, 只是關掉的話可以防止因為預覽視窗試圖更新鎧甲模型而造成鎧甲設定工具中鎧甲閃爍的情形.

用鎧甲設定工具製作鎧甲的首要工作是設定模型的基本外觀, 這會列在[鎧甲種類Main Type ](控制不同種類鎧甲的不同外觀) 和 模型種類Main Variation (在一個鎧甲種類下可以選擇不同的模型種類)的選單中. 下圖的兩個鎧甲都是屬於鱗甲scale mail, 但是不同模型種類.

進階話題: 不按常理出牌的鎧甲
鎧甲的外觀在製作時可以不同於屬性視窗中鎧甲種類Armor Type的設定, 也就是說可以有一件鎧甲看起來是一件布衣卻有全身鎧甲的屬性和規則, 同理也可以反過來. 這不是什麼重要的技巧, 但在製作鎧甲的過程中是值得留意的事情.
依照先前本例中的設定, 在鎧甲種類Main Type 選單中選擇“墊布甲Padded armor”然後模型種類Main Variation 選擇0.
第二個步驟是設定鎧甲附件. 在鎧甲設定工具的右下方是一個列表陳列著各部位附件的欄位, 讓您決定哪個部位因該佩哪一種附件 [注意: 如上面的進階話題所述, 鎧甲的外觀跟鎧甲種類不一定要相關連的, 所以不管是哪一種鎧甲都可以任意配置所有的附件而不影響鎧甲的數據.] 要改變或新增附件, 捲動到想要的附件部位 (例如 “左腿Left leg”), 點出下拉選單並選擇你想要的附件模型.

對於Pitney的鎧甲, 因為他的跟其他的隊員相比要比較好看一點, 所以我們給他強化皮革護肩 (左肩Left shoulder: 7, 右肩Right shoulder: 3), 為了怕干擾行動, 我們某些部位刻意不裝附件 (右護腕Right bracer: 21, 左臂Left arm: 18, 左膝Left Knee: 3, 右膝Right Knee: 4), 並有成對的腿甲來保護股間 (左Left & 右腿Right Leg: 17).

設定完該有的鎧甲附件之後, 你也可以設定套裝附件gear attachments. 套裝附件Gear attachments是不直接附加在鎧甲上的裝備: 頭盔helms, 皮帶belts, 手套gloves, 披風cloaks, 和鞋子boots. 你可以在鎧甲種類Main type的下方看到套裝附件的設定欄位, 他們設定後都會是已鑑定過的狀態. 在本例中, 要裝備這鎧甲並同時佩有一個皮手套的話, 往下捲到手套種類Gloves Type的選單, 先將選單右方的小方框打勾來啟用該套裝附件, 選擇 “皮革Leather,” 並設定想要的模型種類 (模型編號3). 用同樣的方法可以設定其他的附件.

附件設定好後, 就可以開始為鎧甲上色了. 在每個鎧甲部位的右邊會有三個用來控制顏色的長方塊, 由左往右是根據顏色所佔的面積多寡來排列 (第一個顏色是該部為最大塊面積的部分, 第二和第三以此類推就是次大的). 當要選擇顏色的時候, 在這些方塊上點擊並在調色盤視窗中選取一個顏色.
雖然鎧甲原型只會用到後兩個顏色方塊, 不過因為之後可以用“塗裝全部Apply To All”的功能來讓所有附件一次都設定為該組顏色, 所以也可以先在這邊將三個顏色方塊的顏色都選好, “塗裝全部Apply To All”功能的按鈕就在鎧甲原型的三個顏色方塊正下方.
如果Pitney的鎧甲原型的三個主要顏色設為淡暖棕色Pale Warm Brown, 暗橘黃Darker Yellow Orange, 暗橘黃Dark Yellow Orange, 那只有後兩者會改變顏色, 不過如果按下 “塗裝全部Apply to All” 按鈕就會將所有附件的顏色方塊都換上這三個顏色. [注意: 塗裝全部的功能不會影響套裝附件的顏色方塊, 你必須為它們個別的上色.] 下面的截圖展示了使用“塗裝全部Apply to All”功能的效果: 你可以看到鎧甲原型的三個顏色都正確的移植到所有附件的顏色方塊中, 並可以由模特兒身上直接看到顏色的改變.

所有部位都上完色後, 回到屬性 “Properties”視窗去完成其他設定: 選取圖像 (本例選用it_al_padded04), 材質種類 (因為本例中的鎧甲是墊布, 所以保留在“沒有任何特別Non-Specific”比較好), 和其他項目以及道具能力. 為了示範: 我們假設Pitney有一次跟Tarmas打賭贏了, 所以當地的巫師很不情願地將鎧甲附了魔以為賭金 – 道具能力的欄位中因該因應這項設定新增一相關的能力. 打開道具能力選單, 展開 “附加技能Bonus Feat” 群組並選擇“強壯Toughness” 技能 – 這只是其中一個讓玩家提升能力的技能之一. 除此之外, 往下捲到 “施展法術Cast Spell”的群組, 選擇“照亮Light”法術, 並將加值Cost Value設為1 Use/Day. 如果玩家要藉由這個鎧甲使用這個法術, 他就必須先裝備上這個鎧甲, 然後再道具欄中右點這個鎧甲並由跳出的選單中點選這個法術來施放 – 否則就要設定道具能力發動設定Item Property Activation Preference來讓該道具的魔法能力即使不裝備著也可以使用.


完成後儲存一下模組, 辛苦的工作就可以上這件鎧甲被裝備了.
雖然乍看之下一個道具藍圖有好多的欄位要設定, 不過現在看起來因該簡單許多了. 完成這段教學, 你因該曉得了:
地圖製作是一個會很有成就感的工作. 製作出來的地圖是玩家在創好腳色後第一個看到的遊戲元素. 絕冬城之夜二的地圖製作工具比起以往已經變的更加靈活和擁有更強大的控制能力來製作更為細膩的景色. 雖然因為功能的強大讓地圖製作功能變的複雜許多. 這章教學涵蓋了基本的室內和室外地圖之製作和如何敗放不同的物件到裡面.
在遊戲中的區域分為室內地圖和室外地圖兩種. 室外地圖是一個有著高度軸的地圖, 並允許玩家靈活的雕塑你想要的地形. 室內地圖是用許許多多的磚框組所搭佩組成, 其製作方法跟NWN1的地圖製作很相似, 不過擺放物件的靈活度卻大多了. 在一個模組中, 你可以同時有室內區域和室內區域. 在樣本模組中我們是從製作Pitney家外面的室外區域開始然後到他家內部的室內區域.
第一件事情就是創造一個新區域. 選擇檔案File à 新增New à 區域Area. 新區域製作精靈就會出現.

區域標籤名稱Area Tag就是這個地圖的名字, 打上想要的名稱. 區域種類Area Type保留在[室外區域Exterior]. 接下來就是選擇區域大小, 一樣, 我們從一張小地圖製做起.
在區域編輯視窗中因該會看到一個平坦空曠的綠色區域. 如果你點選工具欄上的 “方格尺規Grid”就會顯示出黑色, 紅色, 還有白色的方格尺規.

黑線圍成的格子表示一個磚框, 每個磚框都可以有自己的地質textures, 水面water, 和 草grass的設定. 磚框將會在後面詳細的解說.
白線則表示地圖的邊界. 每個室外區域都有從地圖邊界向外兩個磚框的區域玩家不能行走. 這些區域是用來裝飾而讓玩家看不到盡頭用的! 這裡可以設置山丘, 蜿蜒小道, 或是樹等等單純只是讓你的模組看起來更精美.
在工具欄裡有很多對於製作地圖很有用的功能. 我們可能沒辦法解說每一個, 但是請不要感到挫折, 隨意的來使用感受一下每個功能的效果!
![]()
1. 方格尺規Grid. 這個按鈕會打開地圖上的方格尺規來讓你看到區域和邊界的大小.
2. 封閉尺規Occlusion Grid. 這個按鈕會用一個大紅框框顯示地圖的最大可行走區域. 如果不想開啟方格尺規的話可以打開這個來提醒自己可行走的邊界在哪.
3. 表面行走路徑Surface Mesh. 顯示可以由地形工具修改的地圖表面. 每一條線的交接點都可以調整高度. 這會在地形工具的章節做解說.
4. 影子Shadows, 水面Water, 畫面粉飾Bloom, 霧Fog, 天空Sky. 這些按鈕提供不同的功能來幫助地圖的製作. 像是水面water按鈕打開後可以實際上在地圖編輯器中看到你剛剛畫出的水面! 這些功能僅是顯示或是隱藏由遊戲引擎提供的效果, 他們不會影響這些效果出現在遊戲中的設定.
5. 啟用遠域遮罩Use Area Far Plane. 這個功能要結合區域燈光設定中的霧化Fog 設定一起使用 (遮罩Farclip, 霧化終點FogEnd, 霧化起始點FogStart). 它決定在遊戲中物件由何處開始不顯示 (遮罩Farclip). 開啟這個來感受玩家在遊戲中可以看到哪裡.
6. 真實地質Normal Mapped Terrain. 這個按鈕的取消和開啟決定製作者看到原始地面地質或是真實地面地質. 真實地質系統和所謂起伏地質系統bump mapping是很相似的. 當光線打上這些地質時就會立體地精細地顯現地質紋路. 在效能較低的電腦上玩家可能決定關掉真實地質的功能, 所以關閉這個按鈕可以讓製作者看到在這些電腦上自己的地圖看起來是什麼樣子.
7. 白天 / 黑夜 Day/Night. 讓你切換內建的7種日夜時辰來顯示於你的地圖編輯器中. 自訂時辰Default 是使用於沒有日夜輪轉day/night cycle的地圖. 關於光源的部分會在後面詳細解說.
![]()
8. 分類過濾器Filters:[顯示Show/ 隱藏Hide]. 顯示 / 隱藏Show/Hide 的下拉選單可以讓你決定要顯示還是隱藏地圖中的某類物件. 這功能當你要編輯某些物件卻不想影響鄰近的其他類物件時很好用. 比如說你想要重新塗畫某棵樹下的地質時, 你可以將樹類都隱藏後, 就可以很輕鬆的漆了, 而實際上那些樹並沒有被刪除掉, 如果你選擇顯示, 那那些樹又會在原位出現.
9. 分類過濾器Filters: [指定Selection]. 是一個滿重要的過濾器, 在下拉選單中你可以選擇你在地圖編輯器裡的所有編輯動作只會對這個你選的類型的物件有用. 當你的地圖中有成千上萬個物件而你只是想要調整你放置的點光源你可以在這裡關掉其他所有種物件的指定. 這樣你就不會因為要去修改點光源而不小心移動到其他的物件.
10. 關門Snap. 用來讓門的物件正確貼近門框的功能.
11. 選擇物件Select Objects. 用來選擇某個物件的主要模式.
12. 設置物件Paint Objects. 當你在設置物件的時候這個按鈕會自動開啟. 當你設置好這個物件後按下ESC你就可以回到選擇物件的模式下.
13. 選擇地域Select Terrain. 利用這個模式可以選擇一個磚框. 在這定地質和水面的時候常常會用到這個功能.
14. 塗裝地形Paint Terrain. 這個模式是用來塗裝地形, 地質textures, 水面water, 和草 grass的. 當你使用地形塗裝工具的時候, 這個按鈕會自動被開啟. 如果你想要回到選擇物件的模式, 點選 “Select Objects”
15. 磚框Tiles. 使用於製作室內地圖, 稍後會有專門的章節.
16. 框選Drag Selection. 啟用框選功能. 如果你想要用類似Windows用拖曳游標來框選多數物件的話, 可以開啟這個功能. 不過建議平常時關掉以防意外的多選了目標以外的物件.
顯示地圖所有的日夜輪轉迴圈和下方的使用功能. 某些種族像是黑暗精靈Drow在白天的時候會受到能力懲罰. 而你可以強制讓地圖的天候永遠停留在白天或是永遠黑夜. 藉由腳本你甚至可以決定玩家進入地圖時是從哪一個時辰開始.

日夜輪轉共設有7個時辰.
如果你進入到一個地圖的區域選項
“Area Properties”中你會看到日夜輪轉舞台
“Day/Night Cycle Stages”的群組, 在其中你可以完全的控制各時辰的光源.
詳細的設定不會在本手冊中介紹, 所以建議玩家還不熟習時使用預設的設定就好. 進階的文章可以參考Athena在星世界網頁中張貼的天空設定一文.
製作新區域的時候, 工具組中區域編輯器裡的天候是以自訂時辰Default為初始的天候, 自訂時辰Default是用來製作沒有日夜輪轉的區域的特別設定. 大部分是使用於室內區域地圖或是有特別需求的室外地圖. 不過最常是用來製作過場劇情的專用地圖.
1. 執行Run. 可以讓你在地圖編輯器中體驗日夜的輪轉.
2. 速度Normal Speed/Fast. 當你選擇執行後可以用這個來調整日夜輪轉的速度. 當你想要快速體驗一下你的地圖在各個時辰下看起來如何.
要打開區域選項, 首先在區域標籤名稱列表中點選你要修改的區域, 然後看到工具組最右邊的屬性視窗中看到區域選項. 在這裡你可以看到日夜輪轉舞台群組和其他你可以為該區域做的校調.

3. 顯示Appearance.
3.1. 日夜輪轉舞台Day/Night Cycle Stages – 打開這個群組就可以控制每個時辰或是自訂時辰舞台的照明, 顏色等等. 每一個都有許多選項來讓您設定每一個層次的照明. 最好是試著一個選項一個選項的改變並隨時切換時辰舞台來觀看每個選項所控制的部分.

3.2. 天邊佈景Sky Ring – 為每個方位的天邊設定一個佈景. 像是丘陵, 高山, 樹木群 和城市背景等. 這些佈景的顏色將會跟你設定的霧色一樣.
4.
環境Environment.
4.1. 是否啟用日夜輪轉迴圈Day/Night Cycle True/False – 如果設成真那該模組在遊戲中的天候就會依據7個時辰舞台依序輪替. 如果設成否, 那遊戲種只會使用自訂時辰舞台的照明設定.
4.2. 是否有照明Has Directional Light? True/False – 開啟或關閉在每個時辰舞台中的 “日月光SunMoon” 設定. 室外區域一般都是開啟的. 對於室內區域可以因為想要讓景象更加明顯而打開, 不過這不是必要的. 這也算是光源的一種, 當遊戲引擎因為光源太多而產生問題的時候, 這個光源也會參一腳進去. 細節在點光源的章節有說明.
4.3. 是否啟動光影Directional Light Casts Shadows True/False – 藉由日月光源照明是否產生光影. 正常情況下室外區域都是開啟的. 對於有使用照明的室內區域卻通常是關閉. 如果照明是關閉的, 那這個選項開不開將不會有任何影響.
4.4. 是否永夜Is Always Night? True/False – 通常是用在一個使用自訂時辰舞台“Default”的室外區域. 這項設定主要是影響像是黑暗精靈Drow或是灰矮人Duergar等種族的將會有因不能接觸光的懲罰.
進階話題: 永夜
要製作一個永遠都是夜晚的區域, 要做的工作不只是將 “IsAlwaysNight” 欄位設成True而已. 還必須要確定日夜輪轉Day/Night Cycle有關閉和將自訂時辰舞台的選項都設為跟夜晚的設定一樣.
5. 霧Fog. 現在並沒有這功能(翻到這裡時, 米凱魯傻眼了一下)保持False就好.
6.
其他General.
6.1. 是否為室內Interior True/False – 對於室內區域因該要設為真true. 而室外區域則因該要設為否false.
6.2. 是否野外Natural – 野外環境像是洞穴或是森林因該要設為真true. 城鎮或是村莊則因該要設為否.
6.3. 是否在地底Underground – 洞穴或是地城的地圖因該要設為真True.
6.4. 規格Size – 地圖可以藉由這個欄位的設定重新決定大小. 點選後會跳出一個視窗讓你可以選擇往哪個方向增加或是減少多少的面積. 不過這功能有幾個問題要注意. 已經鎖定位置的物件當地圖大小改變時, 他們是不會跟著移動的. 因為當地圖改變大小的時候, 有時候需要移動物件來增加地域, 而那些位置被鎖定的物件就會被留在後面. 如果只是高度鎖定的物件不會有這個問題. 如果你不確定哪邊是北邊的話, 在區域編輯器的上方有一個顯示北方Show North的按鈕會在地圖中心放置一個指北的箭頭. 最好在重新改變大小之前先最好備分.
在區域選項Area Properties視窗的上方有兩個按鈕寫著 “匯出設定Import Properties” 和 “匯入設定Export Properties”. 這兩個選項讓你可以個別的或是整個群組的匯出和匯入時辰舞台的設定. 當你在某個模組看到有你喜歡的舞台設定, 你就可以匯入到你自己的模組中使用.
那麼現在就親手來試試看塗裝一個室外區域的地圖吧. 總共有四個主要的工具可以讓你使用.

塗裝地形Terrain 是用來調整地圖的高度, 行走區域, 和對地質上色等等功能. 筆刷將會配合所選擇工具的顏色.
塗畫地質Texturing 是用來對地形表面漆上各種地質像是草坪, 碎石, 石磚地板等等. 並可以調整透明度來做混合地質的效果.
植草Grass 讓你可以栽植各種動態立體的草在地圖表面上, 並且允許你混合多種類的草同時栽種, 還可以設定草葉的大小blade size, 大小差異度size variation, 和濃密度 density.
舖設水面Water 可以在各種高度舖上水面而且你可以設定水面的顏色, 波浪, 流速 和 反光.
這四種工具都使用筆刷Brush工具來控制塗畫面積, 筆刷強度, 高度, 和密度.

1. 筆刷大小Size. 這是塗畫時的筆刷大小. 專指筆刷的內圈.
2. 筆刷外圍Outer. 筆刷的粉飾部分. 專指筆刷的外圈. 如果外圍調的很大的話, 地質交接處的羽化情形會越明顯.
3. 筆刷強度Pressure. 在建構地形的時候, 這個設定將會決定雕塑的力道. 如果只想做些微改變的話, 將這個設定到20%以下. 對於塗畫地質, 這個選項決定地質的透明度. 例如你將強度調成50%, 那就是一半的透明度, 你會看到下方原來的地質50%.
4. 密度Density. 在植草的工具中, 這個選項影響筆刷刷上地圖時草叢的濃密度.
5. 高度Height. 在舖設水面的工具中這個選項決定水面的高度. 可以配合視高Eyedropper的功能一起使用.
6. 小, 中, 大, 巨大S, M, L, G. 這些是事先設定好的筆刷大小.
使用地形塗裝工具讓你可以雕塑地形. 你可以做出山丘, 峽谷, 高山, 小徑等等地形. 這是讓你的地圖高低起伏的基本工具.

1. 升高 / 降低Raise/Lower. 就如其名, 筆刷會在其範圍內使地形升高或降低. 你可以調整筆刷強度來控制起伏的速度. 越低的強度越容易拿來作微調.
2. 干擾Noise. 使用干擾功能來使平面的地形變的破碎. 不過要注意到這個功能不能跨越地域磚框並且會破壞區塊連結處. 如果不小心發生了上述情形, 你可以使用平整工具Smooth 來修正.
3. 平整Smooth. 平整一個區塊. 可以用來整平菱角或是創造梯形山丘.
4. 使行走 / 不可行走Walk/No Walk. 和烘培配合使用來控制角色可以行走的區域. 烘培的章節將詳細說明.
5. 夷平Flatten. 在這個工具裡沒有筆刷強度“Pressure”設計, 取而代之的是高度“Height”選項. 跟視高Eyedropper工具一起使用可以適當的將一個區塊夷平到你要的高度.
6. 上色Color. 用來將地表淒上顏色. 當你有理想的地質卻不是你想要的顏色的時候, 這個工具非常有用. 比如利用深褐色來使地面地質變暗, 將河岸四周變暗或是使連續不斷的地質產生一些視覺上的變化. 好好利用這個工具的話, 你做出來的地形將會很有真實感.
1. 底部地面夷平Flatten Under. 如果你選擇了一個擺放物件並按下了這個按鈕, 物件底下的區塊將會被疑平. 方便你放置建築物等.
2. 視高Eyedropper. 和平整工具一起使用來決定特定想要的高度來平整. 製作類似梯形山丘時非常實用.
這個工具是用來為地表鋪上質地. 藉著地質透明度(pressure)的功能你實際上可以混合地質來使多樣化.
鋪設地質存在著某些限制, 所以在實際下去鋪設之前最好先詳細計畫好.
通常, 在計畫你要使用的地質前,
都會先選好幾個草坪和土壤的地質.
因為一個地域磚框至多只能有六種地質, 所以我們通常會留下一個空間方便以後想要加地質的時候沒空間了.
雖然你每個磚框可以有六種地質, 但是最好還是不要用太兇,
越多不同的地質所帶給顯示卡的負荷越重.

1. 選擇地質Texture Selection. 這裡將會列出一個表格顯示NWN2裡可以使用的地質. 選定一個地質, 你就可以用筆刷工具依照設定好的筆刷大小和透明度鋪上地表.
2. 地質交換工具Texture Swapper. 這個功能讓你可以將你選定的的地質和彈跳視窗中選取的一個地質互換. 但是效果是整張地圖的該地質都會被換掉, 請小心使用!
3. 填滿地圖Fill Map. 使用這個工具會將整張地圖填滿選定的地質, 會覆蓋在任何已存在的地質之上. 當你使用這個危險的工具的時候會有一個確認訊息視窗詢問您是否確定要這麼做!
進階話題: 地質列表Selection
這個欄位的列表顯示該磚框內目前所使用的每種地質. 每一個磚框( 當尺規方格“Grid”打開的時候看到黑色線條所圍成的區域)都可以有自己的六種地質. 在列表中的排列順序不會影響你的塗裝. 所以假設你有Dirt05的地質在兩個磚框的地質列表中的排列位置不一樣, 編輯器還是會正確的幫您畫過交接處. 你並且可以個別的改變一個磚框中的一個地質, 只需要選取該地質後再點選一個新的即可. 如果你想要換掉整張地圖的某種地質, 使用地質交換工具就可以了. 不過如果你在一個磚框內已經設定好了六種地質的話, 編輯器不會讓你再鋪設新的地質在該磚框內.
動態的草葉為地圖增添生動活躍的氣息. 它可以像地質一樣用筆刷鋪陳到地圖中, 並且你還可以控制草葉的葉片大小和栽植的濃密度.

1. 植草選單Grass Options.
1.1. 葉片大小Blade Size – 調整草葉的大小Adjusts the size of the grass.
1.2. 草葉大小差異度Blade Size Variation – 調大差異度來讓草葉鋪陳在一塊區域中的大小變化多.
2. 植草功能列表Grass.
2.1. 選擇種類Grass Selection – 從列表中選取一個種類的草. 你可以多重選擇不同種的草同時栽植.
2.2. 栽植Paint – 用筆刷將草栽植進地圖Paint grass with the brush.
2.3. 清除Erase – 用筆刷工具來清除地表上的草.
水面的畫法跟地質和草坪是一樣, 只是是一個高度的同平面. 每個磚框地域都可以有其自己的水面高度, 所以事先的計畫可以讓你的水面都落在想要的高度.

1. 畫水工具Water.
1.1. 塗畫水面Paint – 用筆刷工具將水面圖畫出. 水面將會根據筆刷的外圍來畫出一個區塊, 因為水面沒有淡出的功能. 如果對一個磚框做出任何跟水面有關的設定會一次影響該磚框內所有的水面. 如果你想用相同的設定改變另一個磚框的水面, 只要用筆刷工具刷過去就好.
1.2. 清除Erase – 用筆刷工具清除已畫的水面.
1.3. 視高水面Eyedropper – 使用這個功能來設定想要的水平面高度. 製作湖面的時候很有用, 你只需要找出想要的水線高度, 按下這個按鈕即可.
1.4. 匯入Import – 匯入先前儲存的水面設定.
1.5. 匯出Export – 如果你在一個地圖中看到你喜歡的水面設定, 可以使用這個功能來匯出該設定.
2. 水面設定Water Settings.
2.1. 顏色Color – 設定水面的顏色!
2.2. 波浪Ripple- 調整波浪的層次. X & Y 方向可以個別的控制.
2.3. 平滑度Smoothness – 調整水面的平靜度. 從波濤大海到寧靜小湖, 任君調整.
2.4. 折射設定Refraction settings – 調整水面的折射程度.
3. 水層Water Layers. 水面實際上有三個水層可以分別的作調整. 提供了多樣化的效果. 控制流動方向, 速率和角度. 外加兩種水質可以選.
你現在已經對於地形製作, 鋪設地質, 植草, 灌水都已經熟習了, 現在就來試試看看把物件擺放進地圖的一些細節吧.
藍圖收集視窗是你選擇物件藍圖的地方. 每一種藍圖都有其標籤按鈕可選擇. 對於製作地圖而言我比比較關心的是擺放物件, 環境物件, 樹, 點光源, 特效, 物件組.

擺放物件是預先已經製作好的物件像是建築, 岩石, 大木箱等等. 你只要選擇其中一個然後印到地圖中就可以了. 它會依據地形的高度決定擺放的位置. 如果你選擇拉移它的話, 你可以將它拖曳到你想要的地方. Shift+滑鼠右鍵押著可以旋轉物件. Page Up/Down 鍵(或押著Alt 鍵然後滑鼠前後移動)可以用來改變高度. 空白鍵可以使之回到地面.
跟擺放物件有關的選項有很多. 當選擇了一個物件後, 關於它的選項會出現在屬性視窗. 下面是一些重要選項的介紹.
1. 顏色Tint. 每一種物件都會有一些部分是可以上色的. 根據物件的不同最多會有三個部位可以改變顏色. 在物件的名字上會告知這物件能不能上色.
2. 規格Scale. 改變物件的X/Y/Z尺規. 可以放大和縮小物件, 但是不要放太大因為物件的質地是會被拉大的!
3. 是否靜態Static True/False (靜態Static/動態Dynamic). 靜態物件 (Static True) 是擺放物件的預設值. 它表示這個物件雖然佔空間但是不會有互動. 動態物件 (Static False)像是寶箱, 書架, 等等會有互動需求的東西.
4. 鎖定高度 / 位置Height/Position Lock. 這些是控制鎖定物件的設定. 如果你有一個物件擺放到了理想的高度, 那你記可以鎖住高度來讓你可以在固定高度來移動它的位置. 鎖定位置方便你事後調整時不會不小心移動到它. 鎖定高度的熱鍵是Z. 鎖定位置的熱鍵是L.
5. 是否可以堆疊Stackable. 把小物件擺在桌上可以是一項很痛苦的工作! 不過這個功能將會幫助你輕易的完成. 選擇一個物件然後將是否可以堆疊Stackable的選項設成真True. 拖曳該物件到桌子物件時他會自己跳到桌面上! 熱鍵是S.
6. 是否投射影子 / 是否 接受影子投射Cast/Receive shadows. 影子投射是處理器額外特別處裡的. 對於那些擺放在別人影子中的小物件你可以將它設定成不投射影子. 而藉由關掉接受影子投設receive shadows的功能可以讓一個物件看起來發亮. 對於魔法圈或是火把很有用.

環境物件是將擺放物件轉換成不需要處理器特別處理的物品. 所有的擺放物件都可以被轉換. 選擇一個擺放物件後在區域編輯器上方選擇 “轉換Convert” 的按鈕. 相反的, 你也可以將任何環境物件轉換回擺放物件.
可以使用於邊界區域中的物件或是像石頭或是玩家永遠不會靠近的建築. 遊戲引擎不會計算這些物件的抵觸collision也不會為他們圍出路徑. 可以用來減輕你地圖的負荷. 裝飾在桌面上的小物件將會是很好的環境化物件的例子.
樹是用SpeedTree技術製作出來的物件. 他們是特別為高速處理器開發出來看起來極為真實自然的樹而且可以大量使用而不會給處理器太大的負荷.
樹木可以像擺放物件一樣調整規格也可以設定擺放的高度和位置.
每一棵樹都有一個亂數種子random seed 值用來改變其外觀. 所以如果有兩顆有著不同種子值的橡樹擺放進地圖那他們將會有著不同的樹幹, 枝幹或是樹葉位置. 嘗試不同的數字來看看你可以造出什麼樣的樹來!
雖然我們說過大量的樹可以擺放進地圖, 不過樹的種類最好要受到控制. 每增加一種樹木, 引擎就要花相應的時間來處理新的樹種. 所以適當的樹量和適當的樹種可以讓你的地圖跑起來較為順暢. 基本上是建議不要有超過5種不同的樹同時出現在一張地圖中. 而且注意到, 同一種有著不同種子值的樹是被判為不同種的樹. 所以如果要有變化的感覺的話還是改變樹的規格比較好.
點光源是擺放進地圖增加氣氛的照明燈光. 你可以調整其範圍, 顏色, 濃度, 影子層次, 閃爍值等.

1. 放置Placing. 點光源的擺放方法就跟其他擺放物件一樣. 你會注意到在藍圖收集區裡的點光源藍圖只有一個(白光). 通常是新增藍圖並改變它的各項選項來製作你自己的光源. 為方便你以後檢索你自己的光源, 盡量在 “Localized Name”的欄位打上方便追蹤的名字. 如果你有數個點光源, 那你可以將他們命名一樣的名稱方便分類. 例如在你的地圖裡的火把光源都稱為 “小火把光源Small Torch Light.”
2. 光源顏色Color. 光源顏色的設定控制光線的顏色, 反光的顏色, 和亮度.
2.1. 擴散光顏色Diffuse Color. 這是光源顏色的主要設定並會在範圍內將所有東西以該顏色照明.
2.2. 反光顏色Specular Color. 這是從會反光的物件像是鎧甲, 金屬, 發光物件等身上反射出來的光的顏色.
2.3. 亮度Intensity. 光線的強度. 小心強度不要設的太高, 太強的光源會造成四周質地紋路看不見的情況.
2.4. 線性變換光顏色. 使用於線性變換光的顏色. 從基本光顏色經過線性變換之後的光的顏色.
3. 範圍Range. 光罩的範圍. 紅點圓球顯示出光源照亮的最大範圍. 當在處理光源問題的時候這個範圍是主要的因素.
4. 影子Shadow/ 強度Intensity. 光源可以對範圍內的物件, 生物動態的造成影子. 這裡的強度intensity是指影子有多黑. 最好是讓這個設定跟你的區域光影設定同步. 通常是設定在0.5 或是 0.6之間. 將影子設定關掉有助於流暢度, 有時候也可以理用關掉影子來刻意營造物件發光的感覺.
5. 閃爍光設定Flicker settings. 你可以設定讓光線閃爍來讓特效像是火焰看起來更真實. 閃爍方式Flicker Type控制用什麼模式來讓光閃爍. 例如跳躍式Jumpy會讓光影跳動, 非常適合類似營火的效果.
5.1. 閃動速率Flicker Rate. 光閃耀的速率.
5.2. 閃耀強度變化Flicker Variance. 閃耀效果的強度範圍. 大數字會讓閃耀光看起來很戲劇化, 越小則越趨向平和的燭光.
6. 直線變換光設定Lerp settings. 直線變換光可以讓你設定另一組脈動光. 這將是兩個顏色變換期間的光顏色. 變換週期Lerp Period控制光變換的速率.

7. 性能考量Performance Considerations. 點光源對於處理器的負荷是滿重的, 特別是影子功能打開的時候. 使用紅色原球來判斷有多少光源同時照射在同一個東西上. 基本原則是不要超過三個光源同時照射到一個物體. 如果你使用日月光照射的話, 日月光的光源也算做一個.
特效Placed effects是用特效編輯器預先設計好的特效藍圖. 它包含了像是火焰, 火炬, 燭火, 煙等等. 他們跟其他擺放物件一樣的方法控制設定跟擺放進地圖. 黃色菱形的助視體讓你比較簡單的可以確定特效的物置. 你也可以將這個助視體功能在分類過濾器中關掉.
物件組Prefabs是聚集起來的物件群組簡化一個物件一個物件擺的工作. 一個很好的例子是, 蠟燭弔燈和燭火特效. 當你把物件巨集group起來後, 全部會當成一個物件來移動, 轉動. 如果你想要的話你還可以解除巨集ungroup. 如果你想要選擇巨集中的其中一個物件使用Ctrl+滑鼠左鍵來點選. 你可以個別調整該物鍵而不會破壞巨集.

要製作你自己的物件組的話, 將你要的物件都選擇起來後, 在其中一個物件上點右鍵. 會有選單視窗掉出來讓你選擇[巨集group]來將物件群組起來. 給予巨集一個名字後就完成了! 物件組做好後如果你點選下面的“匯出物件組Export Group”到你的Override資料夾的話, 該物件組就會出現在你的藍圖收集區中的物件組藍圖裡了.
層次烘培是定義哪些地方可以或是不可以被玩家行走的程序. 這個程序有兩個基本步驟. 第一個步驟是決定你要的可行走區域而第二個步驟是執行“烘培Bake”程序來置入行走資料. 你隨時都可以重新決定行走區域但是事後一定要重新烘培. 如果你企圖進入沒有烘培過的區域遊玩, 那你的腳色就會卡在一進地圖的原地!
在將你的地圖準備好烘培之前的首要工作就是決定玩家可以行走的區域. 基本上要完成這個程序有三個要點. 此外請注意到, 邊境區域永遠都是沒法變成可行走的.
第一個工作就是使用地形工具中的 “畫可行走Walk/不可行走No Walk”按鈕. 這是規劃路徑的最基本工具. 跟塗裝地形時一樣使用筆刷工具. 黑色細線交織的區域為不可行走區域, 綠色細線交織的為可行走區域, 而黃色線條則是兩者之間的界線. 在下面截圖中的腳色所站的是合法的可行走區域, 而它左手邊的小丘則不能跨越.

我們的建議是不合理的區塊就要畫成不可行走區域, 因為越少的可行走區域會加快烘培的速度而且檔案容量會較小.
在藍圖收集區的觸發器 “Triggers”標籤下的空白Empty群組中有一個特殊的觸發器叫做路徑切割Walkmesh Cutter. 這個特殊的觸發器是以藍線表示用來細項的控制不可行走區域. 它的放置方法跟一般的觸發器相同並且烘培之後他所圍成的區域將不可以行走. 放置的時候最好讓視點垂直從上方向下觀看以便精確規劃. 在下面的截圖中, 在人物的右手邊是藍色的路徑切割觸發器. 所以他既不能跨越左手邊的黑色線小丘也不能走過右手邊的藍色區域.

擺放物件會在烘培的過程中自動依照其外型切割行走路徑. 通常像是建築和柵欄擺放好後可以用來擋住某些區域. 許多物件像是橋樑會切掉下方的路徑而讓自己的表面可以行走.
前置工作都作好後接下來就是烘培時間了. 在工具欄中選擇 “檔案File”往下找到 “烘培Bake”選項. 執行這個步驟如果你的地圖很大將會花一段時間所以會有警訊視窗要您做確認.
在你執行了烘培程序後你可以查看是不是都符合你的意思. 在工具欄中打開 “表面路徑Surface Mesh” 和 “烘培Baked”兩個按鈕. 在下面的圖片中顯示之前我們使用的路徑切割器Walkmesh cutter已經把路徑給切掉了. 而那塊岩石則是自動的切除了路徑! 所以我們的人物現在有越來越少路可以走了. 注意到岩石和藍色不可行走區域中間的一小塊區域由於人物的寬度限制, 在遊戲中那邊是走不過去的.
如果你想要修改路徑, 你必須要關掉檢視 “烘培Baked”的按鈕然後你才可以進行修改. 你可以改變擺放物件的位置, 你可以重劃路徑切割器, 只是要記住一切修改好後, 一定要再做一次烘培的動作! 檢視烘培的按鈕顯示出全區域烘培過後的情況, 你可以開開關關它來看前後的差別.

進階話題: 太多物件產生的問題
有時候一個磚框內存在太多的物件的時候會使編輯器超載而烘培失敗. 如果一個磚框地域上的物件多到不能行走, 那就是界限了. 有兩個方法可以解決這個問題. 刪除或是移走一些物件然後再次烘培看看. 或是是著將一些物件轉換成 “環境物件Environmental Objects” 然後用路徑切割器手動圍起來. 對於處裡器來說計算路徑切割器Walkmesh Cutters比起物件自己運算要來的輕鬆多了. 下圖中顯示兩張板凳和一個營火同時轉換成環境物件後, 用路徑切割器圍起來, 對處裡器, 計算一個總比計算三個來的有效率.

室內區域是使用磚框組來構成地圖主體的區域, 跟原來的NWN1地圖製作方式很像. 在這裡不用規劃表面路徑或是鋪設地質因為所有的這些事項在磚框組中都已經完成了. 要完成一個很棒的室內區域比起要完成一個很好的事外區域要簡單多了.
一個新的室內區域製作跟室外區域一樣. 首先由選擇檔案File à 新增New à 區域Area 來帶出新區域製作精靈.
區域標籤Area Tag就是該地圖的名稱, 打上適當的名字. 將區域種類Area Type變換成Interior (tile). 區域的大小雖然可以是後再調整, 不過我們還是從一個小區域開始.


磚框編輯視窗中顯示了7個種類可提供使用的磚框組. 打該各群組可以看到各組磚框組中各別不同的磚框組合. 大部分的磚框組也有其 “大型磚框組Meta Tiles”, 是大型且特別製作的組件提供更多樣化的選擇. 例如在 “洞窟Caves”的磚框組中就有不少奇型怪狀的大型磚框組幫助洞穴更加符合真實的情況.

設置磚框非常簡單, 選定想要的磚框後你只需要一點一放就可以了. 要方便設置的話你可以打開工具欄上的 “封閉尺規Occlusion Grid”按鈕. 它會顯示出磚框的邊界.
1. 旋轉磚框Rotating tiles. 要旋轉磚框你可以使用左右方向鍵或是右點滑鼠.
2. 種類Types. 在這裡我們有很多種的磚框可供選擇, 而磚框組視窗中的代表小圖片告訴你這個磚框是怎麼組合的. 藍線代表牆壁. 紅色圓點代表門的位置. 青綠色的小點表示邊角. 箭頭則是指出階梯向上或是向下.
3. 磚框變化Tile Variations. 有些磚框有不同的模樣可供你選擇. 通常一面直牆可以伴隨樑柱, 窗戶, 裂縫等等. 要來回觀看這個磚框有哪些變化, 使用上下方向鍵切換.
4. 混用磚框組Mixing tilesets. 有一些磚框組可以混合使用, 像是洞窟和礦坑的磚框. 門的接何處有時候會沒法密合你可以嘗試大型磚框組中的特殊磚框來連結, 多多嘗試你就會知道那些跟哪些可以很好的結合在一起!
5. 邊界考量Border considerations. 在設置磚框的時候請確認留下一格的磚框作為邊界區域不然的話在遊戲中玩家可以看透牆壁背面.
6. 選擇磚框Selecting Tiles. 在放置磚框的時候你會注意到工具欄上的選取模式 “磚框Tiles”是自動開啟的. 你可以押住Shift來多重選擇磚框. 這在上色的時候可以省掉很多時間. 當你要擺放物件的時候請確定將模式改回 “選取物件Select Objects.”
7. 刪除磚框Deleting Tiles. 只需要選擇一個磚框後按下Delete鍵即可. 當然你也可以押住Shift來選取多個磚框一起刪除. 如果刪除的磚框內本來有擺放著物件的話, 那些物件會停留在原地但是你看不到他們直到你換上一個新的磚框為止. 一個被刪除的磚框區域其實是被一個 “頂部Roof”全黑磚框取代掉.
8. 磚框上色Tile Tinting. 大部分的磚框都可以上色. 然而對於牆壁和地板的顏色是分開來控制的. 選取一個磚框或是一個群組的磚框並看到屬性視窗. 在外觀Appearance的群組下你可以你想換的顏色. 某些磚框甚至可以為天花板上色不過顏色是包含在牆壁的選項一起上色的.
就像是外區域一樣, 完成地圖前一定要先烘培. 磚框組的可行走範圍已經是事先定義好的. 包含牆壁, 旋關等都已經適當的切掉路徑. 而您主要的工作將至是考量擺放物件的路徑. 不過你還記得如果一個磚框物件多到不能行走會讓烘培失敗嗎? 如果發生的話, 盡量使用轉換環境物件再加上路經切割器的方法來修正.
室內區域不同於室外區域像是沒有天空月亮太陽等環境要素. 所以基本上一個室內區域日夜輪轉的功能是預設關掉的. 他們只會使用自定時辰“Default”的光源設定.
1. 照明的考量. 基本上室內區域的設定會將 “Directional Light Casts Shadows設為 False” 和 “Is Always Night? 設成 False”. 然而是否有日月光源則會True 或是 False都可以. 日月光源打開可以幫助顯示牆壁地板的細緻紋路. 但是當計算光源效能的時候它也會算成一個光源.
2. 點光源的考量. 點光源對於室內區域來說特別的重要因為它是室內區域主要的照明來源. 他們因該放置在有火炬, 蠟燭, 壁爐等處. 藉由製造各種顏色的光影來增加氣氛. 但是它們確實會帶給處裡器較高的負荷, 基本是以一個磚框內不要有超過3個光源為原則. 不要忘了日月光也算做一個光源.
3. 地形塗裝Terrain/ 鋪設地質Texturing/ 植草Grass. 這些地形工具都沒法在室內區域中使用.
4. 水面Water. 意外地水面工具可以在室內區域中使用. 例如, 在洞穴的磚框組中有一個地板有水池的設計, 是用來規劃水面的絕佳地方!
5. 擺放物件Placeables. 擺放物件和環境物件都跟在室外區域中的操作完全一樣.
6. 樹Trees. 甚至樹木都可以被擺放進室內區域. 你可以嘗試縮小一棵樹來當成家用盆栽!
7. 特效Placed Effects. 加入火炬, 燭焰等和你的點光源配合.
8. 物件組Prefabs. 許多物件組在室內區域中特別有用, 像是蠟燭弔燈組, 上面甚至燭火都已經擺設好了呢!
這份文件是NWN2中所使用的函式簡單的命名規則參考手冊. 它也有簡介一些動作和狀況腳本. 這份文件不是一個教學.
許多NWN2中使用的函式都跟NWN1中的一樣, 而且一些NWN1的腳本仍然可以在這裡使用你可以在 http://nwn.bioware.com/builders/sctutorial.html
找到一些腳本的教學(在 “Making Skill Checks”區和 “How Do I Start
My Store?”有著一些通用腳本的教學).
本節將不做翻譯, 有興趣的讀者可以自行瀏覽.
所有NWN2腳本名稱都以下列其中之一為開頭:
Use the following for item scripts:
|
i_<Item Tag>_ac |
script to execute when item activated |
|
i_<Item Tag>_aq |
script to execute when item acquired |
|
i_<Item Tag>_ua |
script to execute when item unacquired |
|
i_<Item Tag>_eq |
script to execute when item equipped |
|
i_<Item Tag>_ue |
script to execute when item unequipped |
The module events will be written to automatically execute the proper script.
Conversations have 2 script types.
|
a_<Speaker>… |
actions taken |
|
c_ <Speaker>… |
conditional (Text appears when...) |
Scripts for events on objects should have a prefix to indicate the Object Type. If an object has multiple events, a suffix should be added each script to indicate the Event Type.
|
Object
Type |
Abbreviation |
|
Area |
use area num |
|
Creature (Being) |
b |
|
Door |
d |
|
Encounter |
e |
|
Merchant |
m |
|
Placeable |
p |
|
Trigger |
tr |
|
Event |
Abbreviation |
Area** |
Creature |
Door |
Encounter |
Merchant |
Placeable |
Trigger |
|
|
X |
|
|
|
|
|
||
|
click* |
ck |
|
|
X |
|
|
|
X |
|
close* |
cs |
|
|
X |
|
X |
X |
|
|
combat round end* |
ce |
|
X |
|
|
|
|
|
|
conversation |
co |
|
X |
|
|
|
|
|
|
damaged |
da |
|
X |
X |
|
|
X |
|
|
death |
de |
|
X |
X |
|
|
X |
|
|
disturbed |
di |
|
X |
|
|
|
X |
|
|
enter |
en |
X |
|
|
X |
|
|
X |
|
exhausted* |
ed |
|
|
|
X |
|
|
|
|
exit |
ex |
X |
|
|
X |
|
|
X |
|
fail to open |
fa |
|
|
X |
|
|
|
|
|
heartbeat* |
hb |
X |
X |
X |
X |
|
X |
X |
|
lock |
lo |
|
|
X |
|
|
X |
|
|
open |
op |
|
|
X |
|
X |
X |
|
|
perception |
pe |
|
X |
|
|
|
|
|
|
physical attacked |
at |
|
X |
X |
|
|
X |
|
|
rested |
re |
|
X |
|
|
|
|
|
|
spawn |
sp |
|
X |
|
|
|
|
|
|
spell cast at |
ca |
|
X |
X |
|
|
X |
|
|
unlock* |
ul |
|
|
X |
|
|
X |
|
|
used |
us |
|
|
|
|
|
X |
|
|
user defined* |
ud |
X |
X |
X |
X |
|
X |
X |
* These abbreviations don’t use the first 2 letters of the event name.
** Areas don’t need abbreviations.
Boldfaced events are defaults and are assumed if no event is given.
Scripts not covered above should use these prefixes
|
inc_ |
include file |
|
ai_ |
artificial intelligence (combat ai) |
|
n_ |
extra miscellaneous script |
Below are descriptions and code for a subset of the many scripting commands available in Neverwinter Nights 2. Within the toolset, you can see the documentation for any available script by selecting it in the Script Assist window – this is the easiest way to see what a script does.

Action scripts are typically used in conversations to change a variable or cause some event to take place, such as an NPC becoming hostile. Any number of action scripts can be attached to a conversation dialogue node.
This script adds the target as a henchman to
the party.
Parameters:
string sTarget = Tag of the henchman to add. If blank, add
dialog OWNER.
This changes the player's alignment
nChange = From a scale from +3 (Saintly) to -3
(Fiendish), how much act affects alignment
nLawGood = 0 means adjust Good/Evil axis, 1 means
adjust Law/Chaos axis
This script makes the sAttacker attack the
PC. It should be placed on an [END DIALOG] node.
Parameters:
string sAttacker = Tag of attacker whom
will attack the PC. Default is OWNER.
ga_attack_target(string
sAttacker, string sTarget)
This script makes the sAttacker attack the sTarget.
It should be placed on an [END DIALOG] node.
Parameters:
string sAttacker = Tag of attacker. Default is OWNER.
string sTarget = Tag of Target. Default is PC.
Create an object
sObjectType = The object type. Only the following are allowed:
"C" =
CREATURE
"P" =
PLACEABLE
"I" = ITEM
"W" =
WAYPOINT
"S" = STORE
Note that you must
specify the correct object type for the
object you wish to
create, or it will not work.
sTemplate = The name of the template of the
object.
sLocationTag = The tag of the waypoint at which to
create the object.
bUseAppearAnimation = Use the appear
animation. Default is false.
sNewTag = The tag to use for the object. If
blank, use default template tag.
fDelay = The delay, in seconds, before
creating the object.
This script makes objects appear dead
sTag = The tag(s) of the object(s) to make
dead. You can pass multiple
tags, seperated by commas
(NO SPACES) to destroy multiple objects
(ie.
"Object1,Object2,Object3")
NOTE: There may
eventually be a function to eat white space
(See Mantis 3296), but
for now do not put spaces in the string.
iInstance = The instance of the object(s) to make
dead. Pass -1 to make
all instances dead.
This script destroys objects
sTag = The tag(s) of the object(s) to
destroy. You can pass multiple
tags, seperated by commas
(NO SPACES) to destroy multiple objects
(ie.
"Object1,Object2,Object3")
NOTE: There may
eventually be a function to eat white space
(See Mantis 3296), but
for now do not put spaces in the string.
iInstance = The instance of the object to destroy.
Pass -1 to destroy
all instances.
fDelay = The delay before destroying the
object(s)
This closes a door
sTag
= The tag of the door to close
nLock
= Set to 1 if you want to lock the door after it closes
This opens a door
sTag
= The tag of the door to open
Does an effect on the specified target. This function takes 5 params:
string sEffect - one of the below effects
string sParams - comma delimited list of needed params
string sDuration - I - Instant, P - Permanent, or
T,<duration> - Temporary w/ duration
ex: temporary 30 seconds would be
"T,30.0f"
int iVisualEffect - -1=no visual, 0 = standard visual,
or supply your own from
visualeffects.2da
string sTarget - Tag of who to effect or
"OWNER"= dialog owner, "PC" = indicates
PCSpeaker, "LAST" =
Last Speaker
Effects and Paramaters
Blindness - no
params
Damage -
nDamageAmount, nDamageType, nDamagePower
Death - no
params
Disease -
see DISEASE_* constants in nwscript.nss
Heal -
damage to heal
Paralyze - no
params
Raise - no
params
Visual -
see visualeffects.2da for param options
This script makes sTarget join a new
faction.
sTarget - The target who's faction will change (see Target's
note).
sTargetFaction - Either one of the 4 standard factions
$COMMONER, $DEFENDER, $HOSTILE,
$MERCHANT or a
target who's faction is to be joined (must be a creature)
This script makes sTarget be viewed
differently by a faction.
sTarget - The target who will be viewed differently (see
Target's note).
sTargetFaction - Either one of the 4 standard factions
$COMMONER, $DEFENDER, $HOSTILE,
$MERCHANT or a
target who belongs to the faction (may or may not need to be a creature)
sChange - the amount to change the faction reputation by. (May later be ammended to allow
setting).
ga_force_exit(string sCreature, string sWP, int bRun)
Moves creature with tag
sCreature to the waypoint with tag sWP.
This gives the player some gold
nGP
= The amount of gold coins given to the PC
nAllPCs = If set to 1 it gives gold to
all the PCs (MP only)
This gives the player an item
sItemRR = This is the string name of the item's
ResRef
nQuantity = The number of items (default is 1)
nAllPCs = If set to 1 it gives the item to all PCs
(MP only)
This
gives the player some experience
nXP
= The amount of experience given to the PC
nAllPCs = If set to 1 it gives XP to
all the PCs (MP only)
This script changes a global float variable's
value
Parameters:
string sVariable = Name of variable to change
string sChange = VALUE (EFFECT)
"5.1" (Set to 5.1)
"=-2.3" (Set to -2.3)
"+3.0" (Add 3.0)
"+" (Add 1.0)
"++" (Add 1.0)
"-4.9" (Subtract 4.9)
"-" (Subtract 1.0)
"--" (Subtract 1.0)
This script changes a global int variable's
value
Parameters:
string sVariable = Name of variable to change
string sChange = VALUE (EFFECT)
"5" (Set to 5)
"=-2" (Set to -2)
"+3" (Add 3)
"+" (Add 1)
"++" (Add 1)
"-4" (Subtract 4)
"-" (Subtract 1)
"--" (Subtract 1)
This script changes a local string
variable's value
sScript = This is the name of the variable being
changed
sChange = This is what the global string is set
to.
This command heals the PC (and potentially
their party)
nHealPercent = This is the % damage the PC will be
healed, 0 = 100% by default
nFullParty = This is a boolean, by default it is
FALSE and only the PC will be healed, 1
is full party
Jump an object to a waypoint or another
object.
Parameters:
string sTo = Tag of waypoint or object
string sWho = Tag of object to jump. Default is
conversation owner (OBJECT_SELF)
float fDelay = Delay before
JumpToObject(). Default is 0.0f
Jumps the players to a waypoint or another
object.
This must be used in a conversation.
sDestTag = The tag of the waypoint or object.
bWholePary = Jump whole pary? default = 0
bOnlyThisArea = Jump only party members
in the same area? default = 1
Jumps an entire faction to the specified waypoint and arranges
them in a pattern
string sTagOfMember -
tag of any member of faction
string sTagOfWayPoint -
tag of a waypoint
int iFormation -
formation number to use
1 - Ben Ma's
pattern
more to come
int iSpacingPercentage -
% change to the spacing of the formation. Not implemented.
Notes: Might be a quick way to toss the party around, but
there's no error checking on the generated position
so you can easily jump creatures into bad places.
// BMA
// float f = 1.0; (f == 1.0) MAY or MAY NOT
evaluate to true. Be warned!
This script changes a local float variable's
value
Parameters:
string sVariable = Name of variable to change
string sChange = VALUE (EFFECT)
"5.1" (Set to 5.1)
"=-2.3" (Set to -2.3)
"+3.0" (Add 3.0)
"+" (Add 1.0)
"++" (Add 1.0)
"-4.9" (Subtract 4.9)
"-" (Subtract 1.0)
"--" (Subtract 1.0)
string sTarget = Target tag or identifier. If blank then use OBJECT_SELF
This script changes a local int variable's
value
Parameters:
string sVariable = Name of variable to change
string sChange = VALUE (EFFECT)
"5" (Set to 5)
"=-2" (Set to -2)
"+3" (Add 3)
"+" (Add 1)
"++" (Add 1)
"-4" (Subtract 4)
"-" (Subtract 1)
"--" (Subtract 1)
string sTarget = Target tag or identifier. If blank then use OBJECT_SELF
This script changes a Target's local string
variable's value.
Parameters:
string sVariable = The name of the variable.
string sValue = The new value for the variable.
string sTarget = The target's tag or identifier, if blank
use OWNER
This moves someone to a waypoint.
sWP = Lists the waypoint the object is
moving to. "wp_" is added automatically.
nRun = Defaults to walk, set to 1 for
running
sTagOverride = If this is null, then OWNER runs the
script. Otherwise the string is the
tag name of who will
run it
This makes the object go to the exit
(default nwc_exit) and then vanish
nExitNumber = nwc_exit#N
nRun = TRUE if you want the character to
run there
sWaypoint = go to waypoint nwc_#S then
disappear
sObject = if you don't want the OWNER to
move, use the tag string here
This script removes a henchman from the
party.
Parameters:
string sTarget = Tag of the henchman to
remove. If blank, remove dialog OWNER.
If NPC is not a henchman
of the PC, do nothing.
ga_replace_comp(string sCompToRemove, string sCompToAdd)
replace companion with tag
sCompToRemove with companion with tag sCompToAdd
This adjusts the reputation of the calling
player
nActLevel = How noble or ignoble was the act from +4
(Idolized) to -4 (Vilified)
nRepOver = This overides the reputation to the given
value (DANGER!)
This opens a store
sTag = The tag of the store to open
nStore = This adjusts the price of things in the
store (-nStore = Good for PC)
nPCInv = This adjusts the price merchants will
pay for PC items (+nPCInv = Good for PC)
This takes gold from a player
nGold
= The amount of gold to take
nAllPCs = If set to 1 it takes gold from all PCs
(MP only)
This takes an item from a player
sItemTag = This is the string name of the item's tag
nQuantity = The number of items (default is 1). -1 is
all of the Player's items of that tag.
nAllPCs
= If set to 1 it gives the item to all PCs (MP only)
Set "TalkedTo" flag that you have
talked to the target.
Parameters:
string sTarget = Tag of the NPC. If blank,
use OBJECT_SELF.
Conditional scripts are used to cause a specific dialogue node (and its corresponding actions) from taking place only under specific situations. For example, you might want to let the player ask Pitney about his wife, but only after he has met her. Multiple conditional scripts can be applied to a dialogue node using “and” or “or” statements.
Check if player's alignment is Chaotic
Check if player's alignment is Evil
Check if player's alignment is Good
Check if player's alignment is Lawful
// BMA
This checks if player's alignment is greater
than or equal to nCheck.
Parameters:
int nCheck = Checks if alignment of player is greater
than defines.
On a scale of 3 (Saintly)
to -3 (Fiendish)
int nLawGood = 0 means check Good/Evil
axis, 1 means check Law/Chaos axis
This script checks to see if the player
(PC_Speaker) has any levels of a certain class
nClass
= The integer of which class to check for (list boxes will be done
later)
This script checks to see if the player
(PC_Speaker) has any levels of a certain prestige class
nClass
= The integer of which class to check for (list boxes will be done
later)
This script checks to see if the PC has
more than a certain amount of gold
nGold
= The amount of gold you want to make sure the player has
nMP
= If in MP - set this to 1 if you want to make sure all players have
enough gold
This script checks to see if the PC has an
item in their inventory
sItem
= The tag name you want to check to see if the PC has
nMP
= If in MP - set this to 1 if you want to make sure all players have the
item
This script checks to see if the player
(PC_Speaker) has stats above a certain number
nStat
= The integer of which stat to check for (list boxes will be done later)
nVal
= The value the stat needs to equal or exceed
gc_comp_remove(string sCompanion)
returns TRUE if the companion with tag
sCompanion is in the party and can be removed at this point.
Returns true if the creature with tag sCreatureTag is dead.
nInstance = the nth instance of a creature with tag
sCreatureTag
Check to see if a given item is equipped by
a given creature
Parameters:
string sItem = The tag, or partial tag of the item.
string sTarget = The tag of the creature. If blank, use
PCSpeaker.
"$PARTY" is a
non-standard target constant that will check the entire party.
int bExactMatch = If 0, allow sItem to be
a tag substring.
Always returns false.
This script checks a global float
variable's value
sVariable = This is the name of the variable being
changed
sCheck = This is what you want to see what the
global float is set to.
Default is an = check, but you can also specify <,>,or !
So
an sCheck of "<50" returns TRUE if sVariable is less than 50,
an
sCheck of "9" or "=9" returns TRUE if sVariable is equal to
9
and an sCheck of "!0" returns TRUE if sVariable is not equal
to 0.
This script checks a global int variable's
value
sVariable = This is the name of the variable being
changed
sCheck = This is what you want to see what the
global int is set to.
Default is an = check, but you can also specify <,>,or !
So
an sCheck of "<50" returns TRUE if sVariable is less than 50,
an
sCheck of "9" or "=9" returns TRUE if sVariable is equal to
9
and an sCheck of "!0" returns TRUE if sVariable is not equal
to 0.
This script checks a global string
variable's value
sVariable = This is the name of the variable being
changed
sCheck = This is what you want to see what the
global string is set to
This script checks if an enemy creature is
within a given radius around
the object that called this script.
fRadius = The radius of the sphere to check within.
Default: 20.0
iSight
= Flag to check line of sight. Default: 0.
This checks to see if the PC Speaker is
female, returns TRUE if it's a girl
Check if target henchman is in the party.
Parameters:
string sTarget = Tag of the henchman to check. If empty, use dialog
OWNER.
This checks to see if the PC Speaker is
male, returns TRUE if it's a boy
This script checks if any of a certain
object is near a given radius around
the object that called this script.
sTag
= The tag (or part of a tag) of the object you are checking for.
(for example, if you specify
"guard" it will find
objects with "guard"
in the tag, including "guard1", "guard2"
and "blackguard".
sObjTypes = Filter which types of
objects to look for. any combination of
these can be mixed and matched. Default is "CPI".
It's best to limit this to the
specific types of objects to be checked.
C = creature
I = item
T = trigger
D = door
A = area of effect
W = waypoint
P = placeable
S = store
E = encounter
ALL = everything
fRadius = The radius of the sphere to
check within. Default: 20.0
bLineOfSight = Flag to check line of
sight. Default: 0.
This script checks if the owner of the
dialogue is the given tag
sTag = This is the tag of the object you are
checking for
Compares the number of items with tag
"sItemTag" the speaker possesses to condition "sCheck".
Parameters:
string sItemTag = Tag of the item to sum
string sCheck = Condition and value to check, for
example:
"<5" Less than
5
">1"
Greater than 1
"=9" Equal to 9
"!0" Not equal to
0
int bPCOnly = If equal to 0 then check party's
inventory, else check PC inventory only
Supercedes gc_check_quest (string sItem,
int nMP)
This script compares the state of specified
journal quest to a check value.
sQuestTag - tag of the quest to examine on the PC
sCheck -
conditional to check against. This param
works the same as it does in gc_local_int.
// BMA
// float f = 1.0; (f == 1.0) MAY or MAY NOT
evaluate to true. Be warned!
This script checks a local float variable's
value.
Parameters:
string sVariable = This is the name of the
variable.
string sCheck = This is the operation to compare local
float to.
e.g. If sCheck =
"<10.0" then return TRUE if sVariable < 10.0
If sCheck = "9.0" or
"=9.0" then return TRUE OR FALSE if sVariable equals 9.0.
We cannot guarentee
float accuracy, so == comparisons will generally fail.
string sTarget = Identifier or tag of the Target. If blank
then use OWNER.
This script checks a local int variable's
value.
Parameters:
string sVariable = The name of the variable
string sCheck = The operation to check on the value of
the variable.
Default is ==, but you
can also specify <, >, or !
e.g. sCheck of
"<50" returns TRUE if sVariable's value is <50
a sCheck of
"9" or "=9" returns TRUE if sVariable's value is equal to 9
and a sCheck of
"!0" returns TRUE if sVariable's value is not equal to 0.
string sTarget = Tag or identifier of Target. If blank
then use dialog OWNER.
This script checks a local string variable's
value.
Parameters:
string sVariable = This is the name of the variable checked.
string sCheck = This is the string to compare equality
against.
string sTarget = This is the tag or identifier of the
Target. If blank then use OWNER
gc_max_companion()
Returns TRUE if the party has
the maximum possible number of companions.
Used on nodes of a dialog to specify its index.
iNodeIndex -
This Node's index (for use w/ gtr_speak_node)
Determines if object is valid (e.g. exists,
!= OBJECT_INVALID)
Parameters:
string sTag = The tag of the object to search for.
int bAreaOnly = Set to "0" to
only search area; any other value to search entire module.
Used to randomly pick a dialog response.
Use parameters 2 through X for each entry
after the first, decrementing by 1 for each branch down.
Example:
3 entries would have the following conditionals:
gc_rand_1of(3)
gc_rand_1of(2)
The final entry doesn't need a check since
it is a certainty.
This checks the reputation of the speaking
player
nRepLevel = Checks how noble the player's rep is from
+4 (Idolized) to -4 (Vilified)
nRepNumber = See if it is over a specific number value
(overrides previous int)
Determine if PC Speaker's skill roll is successful.
Parameters:
int nSkill =
skill int to check
int nDC =
difficulty class to beat
Determine if PC Speaker has sufficient rank in a particular
skill.
Parameters:
int nSkill =
skill int to check
int nRank = minimum
rank to return TRUE
This checks to see if you have not talked to
this person before. See ga_talkto.nss.
Parameters:
string sTarget = Target of the NPC. If
blank, use dialog OWNER.
gc_true()
Returns TRUE
The changes and new scripts described below are not exhaustive, but are some of the updates made to the NWN1 scripting library.
There is a new parameter to ActionRest() called bIgnoreNoRest. It’s false by default, which will make the function work like it always had before. If you change it to TRUE, then the ActionRest() script command will ignore the Area-Specific No Rest flag. It will not ignore other conditions, like trying to rest in combat, etc. But the No Resting flag in the area will be ignored.
It will post a string at the indicated x and y pixel
location and keep it there for the duration given as a parameter.
The debug text will get sent from the server to the client
and the client then needs to display it. As a result, the string will
technically not show up until after the script has finished executing. So if
you are using the Script Debugger, you may hit a DebugPostString() function but
not see the string appear on your screen until the script has finished.
DebugPostString() can be enabled/disabled with nwn.ini setting:
[Game Options]
Debug Text=0/1
FadeToBlack now has an optional 3rd parameter that indicates how long the fadeout should remain in effect before fading back in no matter what.
void ActionStartConversation(
object oObjectToConverseWith,
string sDialogResRef="",
int bPrivateConversation=FALSE,
int bPlayHello=TRUE,
int bIgnoreStartDistance=FALSE,
int bDisableCutsceneBars=FALSE
);
new parameters:
bIgnoreStartDistance – Ignore maximum distance check for starting a conversation
bDisableCutsceneBars – Cinematic conversation presentation without letterbox black bars (assuming conversation file is initially flagged as a “cutscene”)
void
TriggerEncounter(object oEncounter, object oPlayer, int iCRFlag, float fCR)
This script commands allows the triggering of an encounter instance on a player (or other creature).
//These
are allowed values for the iCRFlag parameter of the TriggerEncounter() function
//These are enumerated types in CNWSEncounter
int ENCOUNTER_CALC_FROM_CR = 0; // Use the CR value
passed in determining the spawn pool
Returns TRUE if this is a single player only game, otherwise returns FALSE.
DisplyGuiScreen(
oPlayer, sScreenName, bModal)
sScreenName has to match the ‘field name’ in ingamegui.ini located in ui\default\ingamegui.ini
Only GUI screens listed under [ScriptGUIs] will be accessible to script.
Currently, the party selection script is in the ingamegui.ini, so you can do:
DisplayGuiScreen(
GetPCSpeaker(), "SCRIPT_SCREEN_PARTYSELECT", TRUE );
to force the PartySelectionScreen to pop up. Making it Modal will mean that the user needs to respond to the screen and close it before doing anything else.
New bonus hit points effect and item property.
"Bonus Hitpoints" effect added to the game, which can be used as either a spell effect, or as an item property. These add hitpoints to the creature's normal hitpoint pool, and are "permanent", for as long as the effect is active on the creature. This means that they can be healed by resting, spells, etc., unlike temporary hitpoints. You can stack multiple versions of this effect on a single creature. They do not change your current hitpoints when added or removed, so if you equip an item that gives you bonus hitpoints, you will need to rest to "top off".
itemproperty
ItemPropertyBonusHitpoints(int nBonusType);
effect
EffectBonusHitpoints( int nHitpoints );
void
SpawnSpellProjectile( object oSource, object oTaget, location lSource, location
lTarget, int nSpellID, int nProjectilePathType );
void
SpawnItemProjectile( object oSource, object oTaget, location lSource, location
lTarget, int nBaseItemID, int nProjectilePathType, int nAttackType, int
nDamageTypeFlag );
These commands allow you to spawn a projectile, which will travel from the source to the target. They use the same logic that standard spell or item projectiles use, which is primarily 2DA driven. Some notes:
· For spell projectiles, the trail and impact effects are defined in the Spells.2DA. You can specify a custom projectile path, or use the one that that is defined in the 2DA
· For item projectiles, you need to supply the Base Item Type of the "projectile launcher", such as longbow, crossbow, etc. This will then determine the ammo type. These are all defined in BaseItems.2DA and AmmunitionTypes.2DA. The attack type determines if the attack will hit the target(HIT), the ground near the target (MISS), or the target's shield (PARRIED). The damage type flag will determine if the projectile is on fire or whatever. We haven't hooked up the VFX for these yet, however.
· These are mostly in so that Brian Heins can get jiggy with some of the trickier spells, but I thought they might be generally useful. Not all of the NWN1 projectile path types may work correctly, and I'll fix up which ever ones we need for NWN2, and then remove the others. They are defined at the top of nwscript.nss, at PROJECTILE_PATH_TYPE_WHATEVER.
void
SetFirstName(object oTarget, string sFirstName);
void
SetLastName(object oTarget, string sLastName);
void
SetDescription(object oTarget, string sDescription);
string
GetFirstName(object oTarget);
string
GetLastName(object oTarget);
string
GetDescription(object oTarget);
These names are pretty self-explanatory. Basically, you can
now set the name of any valid object. *HOWEVER* only objects that
previously had visible names (ie. Creatures, Items and non-static placeables)
will have names that are visible in the game. Similarly, objects that only have
one name (like items and placeables) will only display the “first name.” You
can certainly use the last name (or description or whatever) in a script if you
like.
What can this do?
· Play any animation that exists for a model without worrying about the lists.
· Automatically fills in skeleton information, so the script doesn’t have to change when appearance does.
· Optionally fills in stance information (use the ‘*’ prefix) in case you ever want to force certain stances.
· This has no effect on the actual stance / state of the creature – it’s just a visual appearance.
· Weapons are automatically visually hidden with the ‘dialog’ priority. ( You don’t have to hide them per animation now. )
· Using another script command you can force the visual appearance of weapons until you call script to toggle them back off.
· These custom animations automatically take preference over talk_normal ( dialog default ), but obey walk/action precedence.
· Play emotions in game ( using the '#' prefix ): #off, #annoyed, #angry, #surprized, #amused, #frown, #smile, #scared, etc
· Disable custom playback control ( using the '%' prefix )
· Speed setting allows you to control speed of playback: 1.0 is normal, < 1 is slower, > 1 is faster; negative values are backwards.
PlayCustomAnimation(object ObjectId, string AnimName, int Looping, float fSpeed);
Some examples:
object
obj = GetIdByTag(“n_kana”);
//
Play sitidle animation on n_kana in a loop – in this case it will play the file
P_HHF_siteat.gr2
PlayCustomAnimation(obj,
“sitidle”, 1);
//
Play sitdrink animation on n_kana just once, then you’ll resume the sitidle
loop
PlayCustomAnimation(obj,
“sitdrink”, 0);
//
Play idlem on n_kana in a loop, and force her to idle with C2h stance
PlayCustomAnimation(obj,
“C2h_idlem”, 1);
//
Play combat idle on n_kana in a loop, this adjusts for whatever weapons she has
equipped
PlayCustomAnimation(obj,
“*idlem”, 1);
//
Play 1attack01 on n_kana once, this adjusts for whatever weapons she has
equipped
PlayCustomAnimation(obj,
“*1attack01”, 0);
//
You may need to add timing here for duration of this attack
//
Play unequip on n_kana once, this adjusts for whatever weapons she has equipped
PlayCustomAnimation(obj,
“*unequipw”, 0);
NOTE: Custom animation takes priority over TALK_NORMAL and IDLE animations by design. The '%' command just lets you preempt custom animations with IDLE. This is really just to allow 'built in' ambient life animations to restart on scripted characters once a scripter is done doing their custom animations.
int
SetWeaponVisibility( object oObject, int nVisibile, int nType=0 );
// Returns TRUE if it found an object to set weapon visibility on
// oObject is the object to set weapon visibility on
// nVisibile 0 for invisible, 1 for visible, and 4 to 'set to default engine
action'
// nType is the 'mode' for hiding: 0 - weapon, 1 - helm, 2 – both
SetWeaponVisibility allows scripting to force (un)equipping of weapons at
anytime ( visually ). This means it makes the weapon(s) [not]
appear, but it's still equipped for gameplay purposes. This works both
inside and outside of dialogs/cutscenes.
Calls up a string input box, with text description field and script callback for the results
Usage:
//This
script function displays a text input box popup on the client of the
//player
passed in as the first parameter.
//////
//
oPC - The player
object of the player to show this message box to
//
nMessageStrRef- The STRREF for the Message Box message.
//
sMessage - The text to display in the message
box. Overrides anything
//
- indicated by the nMessageStrRef
//
sOkCB - The callback script to
call if the user clicks OK, defaults
//
- to none. The script name MUST start with 'gui'
//
sCancelCB - The callback script to call if the user
clicks Cancel, defaults
//
- to none. The script name MUST start with 'gui'
//
bShowCancel - If TRUE, Cancel Button will appear on the message
box.
//
sScreenName - The GUI SCREEN NAME to use in place of the default
message box.
//
- The default is SCREEN_STRINGINPUT_MESSAGEBOX
//
nOkStrRef - The STRREF to display in the OK button,
defaults to OK
//
sOkString - The string to show in the OK button.
Overrides anything that
//
- nOkStrRef indicates if it is not an empty string
//
nCancelStrRef - The STRREF to dispaly in the Cancel button, defaults to Cancel.
//
sCancelString - The string to display in the Cancel button. Overrides anything
//
- that nCancelStrRef indicates if it is anything besides empty string
//
sDefaultString- The text that gets copied into the input area,
//
- used as a default answer
//
sVariableString- Doesn’t do anything right now
void
DisplayInputBox( object oPC, int nMessageStrRef,
string sMessage, string sOkCB="",
string sCancelCB="", int bShowCancel=FALSE,
string sScreenName="",
int nOkStrRef=0, string sOkString="",
int nCancelStrRef=0, string sCancelString="",
string sDefaultString="", string sVariableString="" );
Example
script and callback, where “gui_input_ok” is the callback script activated when
the user presses “OKAY”:
<script
input_test>
void
main()
{
DisplayInputBox( OBJECT_SELF, 0, "Test Message",
"gui_input_ok", "", 1,
"SCREEN_STRINGINPUT_MESSAGEBOX", 0, "OKAY", 0,
"CANCEL", "DefaultSTR", "VariableSTring" );
}
<script
gui_input_ok>
void
main( string sInput )
{
ActionSpeakString( sInput );
}
“Associates” (henchmen, familiars, & etc.) don’t get XP. If you award XP to a PC, all roster members get XP, too. In multiplayer, this only happens to the first PC in the party list; roster members don’t all get XP if you award XP to other PCs. This keeps rosters members from getting multiple XP awards if you’re walking through the PC list granting XP awards. XP is then modified by multiclass penalties and any percentage XP modifier set by the designers. Finally, XP is capped at the campaign XP amount.
The color param for DebugPostString() is: first byte is
alpha (level of transparency) (untested); the 3 right bytes control RGB values
Most other color params will likely be similar.
const int COLOR_RED = 4294901760; //
FFFF0000
const int COLOR_GREEN = 4278255360; // FF00FF00
const int COLOR_BLUE = 4278190335; // FF0000FF
· Make sure you have the .NET Framework version 1.1 installed. It's available at http://msdn.microsoft.com/netframework/downloads/framework1_1/
· Make sure you have DirectX 9.0c installed. (http://www.microsoft.com/downloads/details.aspx?FamilyId=2DA43D38-DB71-4C1B-BC6A-9B6652CD92A3&displaylang=en)
Control-middle-click rotates the camera. The mousewheel moves the camera forward and backwards.
Make sure that you're in "select objects" mode. Pick the objects you want to move, and then left-drag selected objects to move them around. To rotate them, you can press shift-right-click. Alt-right-click moves the selection up or down.
Yes and no. Unfortunately, because of the many technological improvements made to the NWN2, we were unable to support NWN1 areas themselves.
However, it was a priority of ours to support the NWN1 mod efforts as much as possible and we thus made the toolset backwards compatible in many ways. You can open up a NWN1 module with the NWN2 toolset. All of your conversations and scripts will be available. You can then use the NWN2 toolset to export this work and then import it into your new NWN2 creation.
Note that more recent NWN1 scripts that have been released will not be in the NWN2 toolset. You will need to import these scripts if your module makes use of them. On the other hand, the NWN2 toolset comes with many new scripts that you’ll be able to use.
Preferences for the toolset are stored in C:\Documents and Settings\<username>\Local Settings\Application Data\NWN2 Toolset
If you renamed or delete that folder, your settings will return to their defaults.
Under View à Options, you will find autosave settings.
The 2da files can be found in source safe in NWN2\Data\Resources\Override\2DA\
The 2da files in the located in \Data\2da.zip
You can place a 2da in the override directory
Builds\Game\Override\
(You may have to create the "Override" directory in certain builds)
This will override the corresponding 2da in the zip file when playing the
game.
2da stands for "2 dimensional array". 2da files can be edited
in any text editor. They are "whitespace" delimited, not comma
delimited, so care should be taken when attempting to edit w/ Excel.
For specific technical information on the file format of 2da files, see the official documentation located here: http://nwn.bioware.com/developers/Bioware_Aurora_2DA_Format.doc
(Information on all NWN file formats available here: http://nwn.bioware.com/developers/ )
· Holding down ALT while moving them will raise/lower them.
· Shift-right-drag will spin/yaw them (same as all other objects).
· Holding down ALT+SHIFT and right-dragging will pitch the camera up and down.
· Holding down CTRL+SHIFT and right-dragging will roll the camera.
Set a local string variable called “DeathScript” on the creature whose death you want to cause a script to fire. (The standard on death script has been modified to help accommodate this.) When the creature dies, this script will be called from that creature’s normal OnDeath script. So say you want a trigger to spawn in 2 baddies that will run to the player, and will have a script “12_b_gith_inn_de” that executes when they die. You could do the following in the trigger’s OnEnter script:
#include
"ginc_actions"
void main()
{
object oPC =
GetEnteringObject();
object oCrit1 =
SpawnCreatureAtWP(RR_CRITTER1, "wp_critter1");
object oCrit2 =
SpawnCreatureAtWP(RR_ CRITTER2, "wp_critter2");
// Set a script
to run on oCrit1’s death
AssignCommand(oCrit1,
SetLocalString(OBJECT_SELF, "DeathScript",
"12_b_gith_inn_de"));
//Set a script
tp run on oCrit2’s death
AssignCommand(oCrit2,
SetLocalString(OBJECT_SELF, "DeathScript",
"12_b_gith_inn_de"))
AssignCommand(oCrit1,
ActionMoveToObject(oPC, TRUE, 7.0));
AssignCommand(oCrit2,
ActionMoveToObject(oPC, TRUE, 7.0));
}
You do not need to modify these creatures’ standard OnDeath scripts in order to get this script to work.
Typically, you will want the death script to run when a group of creatures is killed. The way to do this is keep track of the number of creatures killed. If that number equals the number of creatures in the group, then you execute your special “group is dead” code.
const int
NUM_TO_KILL = 5; //the group has 5
critters
void main()
{
//this is a
death script! So nCrittersKilled should
be increased by 1 since //someone was
just killed.
int nNumKilled =
GetGlobalInt(“nCrittersKilled”) + 1;
SetGlobalInt(“nCrittersKilled,
nNumKilled);
//If all the creatures have been
killed
if (nNumKilled
== NUM_TO_KILL)
{
// Stuff to do
once the whole group is dead
}
}
So in the above example, you would have set each critter in the group’s DeathScript variable to each run the above script on death. The 5th time that script is triggered, whatever code you have within that ‘if’ statement will be executed – all 5 critters are dead.
Note: If you need to get the PC in the death script, the best way in this situation is:
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
There are functions in ginc_misc that make this a little easier. What you want to do is put your conditions at the top that will exit out of the trigger. At the bottom, be sure to mark your trigger as having completed. The following code can be used as a template:
#include
"ginc_misc"
void main()
{
object objPC =
GetEnteringObject();
// check
conditions
//If we’ve done this before, exit the
script early.
if
(IsMarkedAsDone())
return;
//if the entering object isn’t a PC, exit
the script early.
if (!GetIsPC(objPC))
return;
//
// put trigger
code here
//
MarkAsDone();
}
Alternately, you can use this:
#include
"ginc_misc"
void main()
{
If (PCTriggeredOnce())
Return;
//
// put trigger
code here
//
}
At this point in time we don’t have a GUI for this, and so it has to be done within a conversation. You’ll need to use three main global scripts:
gc_max_companion() is a conditional that you would apply to a node to see whether the party has already reached the maximum number of companions, and hence would require forcing a companion out of the party in order to force in a different companion.
ga_replace_comp(string sCompToRemove, string sCompToAdd) is an action that will replace the companion with tag sCompToRemove with the companion with that sCompToAdd. Don’t forget that CNPC tags are all lowercase now.
gc_comp_remove(string sCompanion) checks whether it’s okay to remove the companion with tag sCompanion from the party. If they’re not in the party, or if they have an integer variable on them “bForced” set to TRUE, then this function will return FALSE – the player shouldn’t have the option to remove them.
As long as you want the character to be forced into the party, they should have a local int on them “bForced” set to TRUE. Once they’re no longer required, reset it to FALSE.
So, as an example, say that the maximal number of companions was 2, and that the PC already has Neeshka and Grobnar in his party, but Khelgar needs to be forced in because the PC has just entered an area that’s important for Khelgar’s development. You’d just make sure that a conversation initiates upon entering that area with Khelgar, and you need the end of that conversation to work like this:
(khelgar) “Blah blah I’m joining your party and you have to deal with it because I’m a racially stereotypical stubborn dwarf.”
->if AND gc_max_companion()
AND gc_comp_remove(neeshka) “[Remove Neeshka from the party]”
->ga_replace_comp(neeshka, khelgar)
->if AND gc_max_companion()
AND gc_comp_remove(grobnar) “[Remove Grobnar from the party]”
->ga_replace_comp(grobnar,
khelgar)
->else “[END DIALOGUE]” ga_add_companion(khelgar)
(The ‘if’ and ‘else’ above are just there to denote how the conditional should flow.)
As a shortcut, you may want to have a blue node with no text that checks gc_max_companion, and then blue nodes beneath that that node check gc_comp_remove for each companion – since you’ve guaranteed that each of those nodes has passed the gc_max_companion check, you don’t have to make that check again at every node.
You may also need another action to get rid of the removed CNPC and send them to the Sunken Flagon or wherever. ga_force_exit() comes to mind. That was left out of ga_replace_comp() to allow for special cases where you wouldn’t want removed players to exit.
Make sure your spawn script has the following:
if (GetIsEncounterCreature())
SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS,
TRUE);
The group on death scripts utilizes nw_c2_default7's alternate death script execution. (e.g. if an alternate "DeathScript" is specified, execute it.)
Set up the death script execution for the group, like so:
GroupSetLocalString (sGroupName, "DeathScript", "<your script name here>");
The script naming convention is:
"<mod_num>_g_death_<something>" to indicate it is a group
death script
For example:
35_g_death_trig_enc
Now, as each member of your group dies, it will call the specified script.
Next, create the group death script. Use the template "gg_death_XXX" in the scripttemplates directory in source safe. It will look something like this:
#include "ginc_group"
void main()
{
// Get group this creature belongs to
string sGroupName = GetLocalString(OBJECT_SELF,
OBJ_GROUP_MY_GROUP);
// Add code here to run when any creature in the group is
killed
// If no one in the group is alive nor valid
if (GetIsGroupValid(sGroupName, TRUE) == FALSE)
{
// Add code here to run when entire group
has been killed
}
}
Simply add your code in the if statement above.
It should be read the same as in the faction editor from the original toolset. Each row represents a faction's feelings about the other faction. In other words, faction ROW's rating of faction COLUMN is located in [ROW, COLUMN]. In the example below, CellarDwellers are hostile to Police (rating 10), but Police rate CellarDwellers as neutral (40).
|
# |
CellarDwellers |
Police |
|
CellarDwellers |
50 |
10 |
|
Police |
40 |
50 |
The two circles represent the visual mouse brush interface
for terrain modification. The two circles will follow the contours of the
terrain when you are in Paint Terrain
Mode. The
Value controls the strength of the brush. The meaning of the value control might change depending on what elevation control you are using. For example, valid values for raising and lowering terrain are in between 0 and 1.0, but values for terrain flattening can of any range.
· R - Raise - raises the terrain by the value amount.
· L - Lower - lowers the terrain by the value amount.
· F - Flatten - flattens out the terrain to the value amount.
· S - Smooth - smooths out the terrain (works best with values in the .1-.4 range).
· N - Noise - makes the terrain bumpy/rock like. (works best with values in the .8-1.0 range).
· FU - Flatten Under Selected - flattens out the terrain below the selected object. Good for making ground under buildings flat.
It should be located under the Plugins menu in the toolset, titled VFX Editor.
Visual effects are composed of effect files, which are individual components of an effect (a particle system, a trail, a billboard, etc.), and SEF files, which point to the effect files and organize them into a more complex visual effect.
First, create the individual effects. Under File->New, you will see the different effect types. Select one and then, in the editor that opens, modify its properties until you achieve the results you desire. Then, create a new SEF file, and press the Add Event button on the toolbar to select a type of event to add. The event will appear in the tree list in the upper-left corner of the window. By selecting the event, you can then change the DefinitionFile property, which determines the individual effect file that the event references. Select the effect you created earlier, and then press Play on the toolbar to see your visual effect in action.
Make sure to save your work when you are done.