D File |
|
A D file is a text file that contains a number of D
Actions. D Files tell WeiDU how to create and modify Infinity
Engine DLG files. |
is |
D Action list |
A D File is a list of D Actions. Typically the first and
only one is BEGIN, which defines the content of a new dialogue.
Other D Actions can be used to modify existing dialogues. |
|
D Action |
|
A D Action tells WeiDU how to create or modify Infinity Engine
DLG files. |
is |
BEGIN filename [ nonPausing ] state list |
BEGIN tells WeiDU that you are creating a new DLG file from
scratch. Any existing DLG file with the same name will be overwriten.
The new DLG file contains exactly the states in the list.
If you set nonPausing to a non-zero integer, the game will not
``stop time'' while the conversation takes place. By default time stops
during conversations. |
or |
APPEND filename state list END |
This tells WeiDU to place the given states at the end of the
already-existing dialogue filename.DLG. |
or |
APPEND_EARLY filename state list END |
Works like APPEND, but the states are added early on in
the compilation timeline (just after BEGIN is processed). Thus
they can be the targets for INTERJECT_COPY_TRANS and friends. |
or |
CHAIN
[ IF [ WEIGHT #weight ] stateTriggerString THEN ] entryFilename entryLabel chainText list chainEpilogue |
This instructs WeiDU to make a long conversation in which the PC can say
nothing. This is useful when you want the NPCs to talk among themselves
for a long time. It and its friends, INTERJECT and
INTERJECT_COPY_TRANS can incredible time-savers when you're
writing non-trivial dialogue. See the examples for ideas. CHAIN
will only append to existing dialogues. You cannot use CHAIN to
create a new DLG. |
or |
INTERJECT entryFilename entryLabel globalVariable
chainText list chainEpilogue |
Behaves like CHAIN except that all of the chainText is
additionally guarded by the transition predicate Global("globalVariable","GLOBAL",0) and accompanied by the action SetGlobal("globalVariable","GLOBAL",1). If you pick globalVariable to be unique, this will ensure that the chainText is only ever seen once per game. This is useful for making interjections. |
or |
INTERJECT_COPY_TRANS entryFilename entryLabel globalVariable chainText list |
This behaves just like INTERJECT except that the exitFilename and
exitLabel are not present. Instead, whenever the dialogue would pass out
of the chainText it follows a copy of the transitions
that were at the state with stateLabel originally. This
is convenient for making quick interjections from NPCs that do not actually
change the true flow of the conversation. See the transition
COPY_TRANS for more information about this idea. |
or |
INTERJECT_COPY_TRANS2 entryFilename entryLabel globalVariable chainText list |
This works just like INTERJECT_COPY_TRANS, except that any
actions taken in the transitions of the state specified by entryFilename
and entryLabel are preserved and kept with the speaker associated with
entryFilename (rather than being mistakenly performed by your new
speaker). We are expecting more documentation on this feature in the
future. |
or |
EXTEND_TOP
filename stateLabel list [ #positionNumber ] transition list END |
This instructs WeiDU to add the transitions in list to the top of
the transition list for the specified states in filename.DLG
(which must already exist).
If a positionNumber is given, WeiDU to insert the transitions
just between already-existing transitions #positionNumber and
#positionNumber+1 in the given states for the given file. The first
transition is number 1. |
or |
EXTEND_BOTTOM filename stateNumber list [ #positionNumber ] transition list END |
Behaves just like EXTEND_TOP but adds the transitions to the
bottom of the list instead. |
or |
ADD_STATE_TRIGGER filename stateNumber
stateTriggerString [ stateNumber list ] |
This instructs WeiDU to add the stateTriggerString to all
of the states with the given stateNumbers in
the file filename.DLG (which must already exist). This is handy for
adding extra conditions to an existing dialogue state. |
or |
ADD_TRANS_TRIGGER filename stateNumber
transTriggerString [ moreStateNumbers list ] [ DO transNumber list ] |
This instructs WeiDU to add the transTriggerString to all
of the transitions in all of the states with the given
stateNumbers in the file filename.DLG (which must already
exist). This is often used in conjunction with EXTEND_BOTTOM to
make a new branch in an existing state. Use
ADD_TRANS_TRIGGER to add the negation of some predicate to all of
the existing transitions, then use EXTEND_BOTTOM to add a
transition with that predicate to that state.
If a list of transNumbers is specified, only those transitions
will have transTriggerString added to them. If such a list is not
specified, every transition in every specified state will be modified.
Note that the ``first'' transition is number 0. |
or |
ADD_TRANS_ACTION filename
BEGIN stateNumber list END
BEGIN transNumber list END
transActionString |
This instructs WeiDU to add the transActionString to all
of the transitions in all of the states specified by the
stateNumber list and the transNumber list. You may use
state labels in the stateNumber list. If the transNumber list
is empty, the text added to all transitions on all listed states.
Note that the BEGIN and END keywords must be present, even if you
specify an empty list of transNumbers.
The ``first'' transition is number 0. Any out-of-bounds transNumbers
are silently ignored. The transActionString is prepended to any
existing action text on a per-transition, per-state
basis. |
or |
REPLACE filename state list END |
This instructs WeiDU to load filename.DLG and replace some of its
states with the new ones described in the state list.
All of the states should have numeric stateLabels (e.g., "5" or
"67"). A new state with label X will replace the old
state number X. |
or |
SET_WEIGHT filename stateLabel #stateWeight |
This instructcs WeiDU to destructively change the WEIGHT of the
given state in filename.DLG (which must exist). This should only
be used to patch or workaround existing dialogues. Never use
SET_WEIGHT if you can help it. |
or |
REPLACE_SAY filename stateLabel sayString |
This instructs WeiDU to destructively change the sayString of the
given state in filename.DLG (which must exist). This should only
be used to patch or workaround existing dialogues. Never use
REPLACE_SAY if you can help it. |
or |
REPLACE_STATE_TRIGGER filename stateNumber
stateTriggerString [ stateNumber list ] |
This instructs WeiDU to destructively set the
stateTriggerString of all of the states with the given
stateNumbers in the file filename.DLG (which must already
exist). It should be used with caution. |
or |
REPLACE_TRIGGER_TEXT filename oldText newText |
This instructs WeiDU to destructively replace every occurrence of oldText
(which may be a regexp) in the stateTriggerStrings and
transTriggerStrings of filename.DLG (which must exist).
This should only be used to patch or workaround existing dialogues. Never
use this if you can help it. |
or |
REPLACE_TRIGGER_TEXT_REGEXP filenameRegexp oldText newText |
Just like REPLACE_TRIGGER_TEXT but the filename is a
regexp. The .DLG is implied. Do not use this. |
or |
REPLACE_ACTION_TEXT filename oldText newText
[ moreFilenames ] |
This instructs WeiDU to destructively replace every occurrence of oldText
(which may be a regexp) in the stateActionStrings
of filename.DLG (which must exist). This should only be used
to patch or workaround existing dialogues. Never use this if you can help
it. |
or |
REPLACE_ACTION_TEXT_REGEXP filenameRegexp oldText newText
[ moreFilenameRegexps ] |
Just like REPLACE_ACTION_TEXT but the filenames are
regexps. The .DLG is implied, do not include it in your
regexps. Do not use this. |
or |
REPLACE_ACTION_TEXT_PROCESS filename oldText newText
[ moreFilenames ] |
This instructs WeiDU to destruveily replace every occurrence of oldText
(which may be a regexp) in the stateActionStrings
of filename.DLG (which must exist) with newText. However,
newText is first compiled as a BAF action list. In particular,
this means that replacing with commands like:
~DisplayString(Myself,@123)~
... will do what you expect. This should only be used to patch or
workaround existing dialogues. Never use this if you can help it. |
or |
REPLACE_ACTION_TEXT_PROCESS_REGEXP
filenameRegexp oldText newText
[ moreFilenameRegexps ] |
Just like REPLACE_ACTION_TEXT_PROCESS, but the filenames are
regexps. The .DLG is implied. Do not use this. |
|
chainEpilogue |
|
Determines where the dialogue should flow at the
end of the CHAIN. |
is |
END filename stateNumber |
Transfer to the given state in the given dialogue file. |
or |
EXTERN filename stateNumber |
Transfer to the given state in the given dialogue file. |
or |
COPY_TRANS filename stateNumber |
At the end of the
CHAIN text, copy all transitions from the given state in the
given file. This is useful for interjections (see INTERJECT). |
or |
EXIT |
At the end of the CHAIN text, exit the dialogue. |
or |
END transition list |
Execute the given transitions
after the final state in the CHAIN. |
|
state |
|
In Infinity Engine games, this is the fundamental unit
of dialogue. |
is |
IF [ WEIGHT #weightNumber ] stateTriggerString [ THEN ] [ BEGIN ] stateLabel SAY sayText [ =
sayText ... ] transition list END |
When you start conversing with a creature that uses a DLG file, the
Infinity Engine searches through all of the states in that file
in order of increasing WEIGHT and selects the first one it finds
for which the stateTriggerString is both true and not empty.
The creature then says all of the associated sayText. Finally,
the transitions are evaluted in bottom-up (i.e., reverse) order.
If a transition is found with a transTriggerString that
evaluates to True and no replyText, that transition is
immediately executed. Otherwise, all of the transitions are
presented as options to the PC.
If a stateLabel is an integer it is called a
stateNumber. All of the states in the DLG files that
come with the original game use stateNumbers. Only D
files use symbolic strings for stateLabels.
Including more than one bit of sayText here is often called
Multisay.
Finally, once you are familiar with the syntax you may omit the THEN
and BEGIN keywords if you like. |
or |
APPENDI filename state list END |
This is legacy syntax that behaves just like the D Action
APPEND but is considered a state. Avoid it. |
or |
CHAIN2 entryFilename entryLabel
chain2Text list exitFilename exitLabel |
This is legacy syntax that behaves somewhat like the D Action
CHAIN but is considered a state. In addition,
chain2Text is slightly different from chainText. Avoid
this construction. |
|
sayText |
|
sayText and replyText are displayed to
the user as part of a dialogue. |
is |
text |
sayText and replyText are both text. |
|
transition |
|
Transitions determine how dialogue flows from one
state to another. |
is |
IF transTriggerString [ THEN ] transFeature list transNext |
If the transTriggerString evaluates to true or is empty, this
transition is viable. If it contains no replyText
within its transFeature list, it is immediately taken.
Otherwise, the replyText is presented as an option to the user.
If the transition is taken, any actions in the transFeature
list are performed and the dialogue flows to the point indicated by the
transNext.
transitions are evaluated in "reverse order". That is, the "bottom"
or "last" response for a state is checked first. If its
transTriggerString
evaluates to true and it has no REPLY text, that transition is
immediately taken. See SAREV25A state 1 for an example of a
state with all kinds of transitions. |
or |
+ [ transTriggerString ] + replyText
transFeature list transNext |
This abbreviated syntax for transitions that would contain REPLY
(which is by far the most common case) allows you to save yourself
some time and typing. It behaves like the full form above. |
or |
COPY_TRANS filename stateLabel |
This instructs WeiDU to copy all of the transitions from the
state with the given stateLabel in filename.DLG. This
copying takes place before all other D Actions. For example,
this is a valid transition list:
IF ~Before()~ THEN GOTO my_state
COPY_TRANS PLAYER1 33
IF ~After()~ THEN EXTERN SOLA 55 |
|
transFeature |
|
These are features or actions associated with
taking a transition. |
is |
REPLY replyText |
If this transition is taken, the PC says the replyText. |
or |
DO stateActionString |
If this transition is taken, the stateActionString is
executed. |
or |
JOURNAL text |
If this transition is taken, the text is added to the
PC's journal. |
or |
SOLVED_JOURNAL text |
If this transition is taken, the text is added to the
``solved'' section of the PC's journal. |
or |
UNSOLVED_JOURNAL text |
If this transition is taken, the text is added to the
``unsolved'' section of the PC's journal. |
or |
FLAGS integer |
This allows you to set the features associated with a transition directly
using the binary format of DLG files. Do not use this! |
|
transNext |
|
This determines where dialogue flows after a
transition has been taken. |
is |
GOTO stateLabel |
The dialogue continues at the state with label stateLabel in the
same DLG file as the current state. |
or |
EXTERN filename stateLabel |
The dialogue continues at the state with label stateLabel in the
file filename.DLG. |
or |
EXIT |
The conversation ends. |
or |
+ stateLabel |
This is a synonym for GOTO. |
|
chainText |
|
This is a rapid shorthand for chaining together many
little bits of dialogue when the PC is not saying anything. |
is |
[ IF transTriggerString THEN ] sayText
= sayText ... |
|
followed by |
[ == fileName
[ IF transTriggerString THEN ] sayText
= sayText ... ] |
The == (that's two consecutive equal signs) marks the beginning of a
new speaker (indicated by fileName). If the
transTriggerString is true or if it is not present, this new
speaker says all of its sayText in order. |
|
text |
|
This represents strings that are shown to the player,
rather than strings that the game uses internally for predicates and
actions. |
is |
String [ [WAVEFILE] ] |
The given string is used for both male and
female players. The optional [WAVEFILE] is the associated sound. |
or |
String [ [WAVEFILE] ] String [ [WAVEFILE] ] |
The first string and sound file are used if the PC is male, the second
string and sound file are used if the PC is female. This is useful mainly
for international versions of Infinity Engine games. |
or |
#integer |
The string with reference number #integer from
DIALOG.TLK should be used unchanged. |
or |
@integer |
The last definition of the translation string
@integer given in any TRA file should be used. |
or |
!integer text |
Forced String Reference. As with
text in general, but rather than being assigned a new,
previously-unused DIALOG.TLK string entry (or merging with an existing
one that has the same text), this text is written over
DIALOG.TLK string entry #integer. Do not use this feature. |
|
String |
|
This is how you tell WeiDU what text you want shown
to the player. For international mods or international translations, you
may use any encoding you like (that is, you are not restricted to 7-bit
characters or Latin-1 or anything like that). |
is |
"abcdef" |
A string can be any sequence of characters not
including a " that is enclosed in ""s. |
or |
~ abcdef~ |
A string can be any sequence of
characters not including a ~ that is enclosed in
~ ~ s. |
or |
%abcdef% |
A string can be any sequence of characters not
including a % that is enclosed in %%s. This is handy for Big5
translations, since " and ~ can be part of Big5-encoded characters. |
or |
~~~~~ abcdef~~~~~ |
That's five consequtive
tildes on each side. A string can be any
sequence of characters not including ~~~~~ that is enclosed in
~~~~~ s. For example,
string #8750 is
~!@#$\%^&*()_+-=[]{}\|;:'",<.>/?
and can be given to WeiDU as
~~~~~ ~!@#$\%^&*()_+-=[]{}\|;:'",<.>/? ~~~~~
(the content of the string is shown in red for clarity). |
or |
String ^ String |
String literal concatenation.
The second string is appended to the first string. No whitespace is added.
Thus "hello" ^ "World" is the same as "helloWorld". |
Compiling And Decompiling |
FILE.D |
Compile FILE to a DLG (dialogue file). |
FILE.DLG |
Decompile FILE to a D (dialogue text file). |
number |
When decompiling a DLG file to a D
file, emit only state number. You may specify this multiple times and
only the states you specify will be emitted. |
numberA-numberB |
When decompiling a DLG file to a
D file, emit only states between numberA and numberB
(inclusive). You may specify this multiple times and only the states you
specify will be emitted. |
FILE.BAF |
Compile FILE to a BCS (script file). |
FILE.BCS |
Decompile FILE to a BAF (script text file). |
--script-style X |
Use the given BAF/BCS
scripting style. X must be BG or BG2 or PST or IWD or
IWD2. |
--transin X |
Use FILE as a source of translation strings
when processing D and BAF files. |
FILE.TRA |
Equivalent to --transin FILE.TRA. |
|
Module Packaging Input And Control |
FILE.TP or
FILE.TP2 |
Read FILE and ask the user whether to install,
reinstall or uninstall its TP2 Components. |
--yes |
Answer all TP2 questions with 'Yes' and do not
prompt for a key to be pressed at the end of TP2 processing. |
--uninstall |
Answer all TP2 questions with 'Uninstall'
and do not prompt for a key to be pressed at the end of TP2
processing. |
--reinstall |
Re-install all TP2 components that are
already installed and do not promtp for a key to be pressed at the end of
TP2 processing. |
--ask-every |
Behave as if ASK_EVERY_COMPONENT were
present for all TP2 components. |
--continue |
Continue TP2 processing despite
TP2 Action errors. |
--debug-assign |
Print out all values assigned to TP2
variables (even implicit ones created by WeiDU). |
--debug-value |
Print out all values encountered in
TP2 processing and the results they evaluate to. Among other
things, this is useful for catching parenthesis errors in your
values. |
|
Automatic Updating Options |
--update-all |
Auto-update all WeiDU setup files (e.g.,
Setup-MyMod.exe) in the current directory. |
--noautoupdate |
If you are running WeiDU as
Setup-MyMod.exe, do not attempt to update yourself or any other mod. |
--noselfupdatemsg |
If you are running WeiDU as
Setup-MyMod.exe and it automatically updates itself, do not display a
message or ask the user to press return. |
|
Infinity Engine Game Location Options |
--game X |
Set main game directory to X. WeiDU looks for
CHITIN.KEY and DIALOG.TLK and the override
directory in the main game directory (but see --tlkin and
--search). WeiDU will look in the current directory and use the
registry to find your game. If this fails, you will need to run WeiDU using
the --game switch to define the full path to the BG2 directory.
WeiDU will also search for BG1, IWD and PST. |
--nogame |
Do not
load any default game files. Unless you also specified --tlkin, no
DIALOG.TLK will be loaded. Unless you also specified --search,
no override directory will be used. |
--search X |
Look in X for input files (cumulative).
X is treated as an override directory and is given priority over
the default override directory. |
|
Game Text (TLK) File Input |
--tlkin X |
Use X as DIALOG.TLK (instead
of looking for DIALOG.TLK in the game directory). |
--ftlkin X |
Use X as DIALOGF.TLK (instead
of looking for DIALOGF.TLK in the game directory). |
FILE.TLK |
Equivalent to --tlkin X. |
--tlkmerge X |
Merge strings from X over the strings from any other loaded DIALOG.TLK. |
|
General Output Options |
--out X |
Emit most output files generated by command-line
options (e.g., D, DLG, kits, --biff-get,
BAF, BCS, --automate, --traify-tlk,
--extract-kits, --list-biff, --cmp-from,
--dcmp-from, etc.) to file X. If X is a directory,
certain commands (e.g., D, DLG, --biff-get, etc.)
will place their output there. Does not affect TP2 processing. |
--append X |
Like --out, but if X is an existing
file then the result will be appended to it instead of overwriting it. |
--backup X |
Backup files to directory X before overwriting. Does not affect TP2 processing. |
--tlkout X |
If any strings were added to or changed in the loaded DIALOG.TLK, emit X as an updated version that reflects those changes. Many operations (e.g., compiling D files, --tlkmerge, STRING_SET) can add to or modify DIALOG.TLK. |
--ftlkout X |
If any strings were added to or changed in the
loaded DIALOGF.TLK, emit X as an updated version that reflects
those changes. |
|
Dialogue Text File (D) Options |
--noheader |
Do not emit D header comments. |
--nofrom |
Do not emit D // from: comments. |
--full-from |
Generate complete // from: comments with a
slower two-pass process. |
--nocom |
Do not emit ANY D or BAF comments. |
--text |
Emit string text with string references in comments. |
--transitive |
Follow EXTERN links when making D
files. See the tutorial on --transitive. |
--toplevel |
Emit only top-level dialogue states -- that is,
states with non-empty triggers. |
|
Translation Options |
--traify X |
Convert X (which should be a D or TP2 or BAF) so that it uses translation references instead of literal strings. Use --out Y to specify a name for the transformed version of X and its new TRA file. |
--traify# X |
Use with --traify and --traify-tlk. Start the newly-created TRA file at translation string @X instead of @0. |
--trans |
Emit coupled D and TRA files when
decompiling a DLG. |
--transref |
Emit string reference numbers in TRA files
when using --trans. |
--traify-tlk |
Emit a TRA file for the loaded TLK file (see --tlkin, --out, --min and --traify#). |
--make-tlk X |
Create a TLK file from TRA file X (cumulative, see --tlkout). |
--testtrans |
Test all specified TRA translation files to
see if any of them use text that is already in the loaded
DIALOG.TLK. If they do you can save translation effort by using
string references instead. |
--forceify X |
Convert the given D file to use forced
strrefs (see --out, SAY, Forced String Reference). |
|
Game Text Repository (TLK) Options |
--string X |
Display string reference #X (cumulative). If you also specify --min or --max, all string references between --min (or 0) and --max (or infinity) will be displayed. |
--strfind X |
Display strings that contain X (cumulative, regexp allowed). |
--strapp X |
Append string X to DIALOG.TLK (cumulative). |
|
Game Archive (BIFF) Options |
--list-biffs |
Enumerate all BIFF files in CHITIN.KEY. |
--list-files |
Enumerate all resource files in CHITIN.KEY |
--biff X |
Enumerate contents of BIFF file X (cumulative). |
--biff-get X |
Extract resource X from game BIFFs (cumulative, regexp allowed). |
--biff-get-rest X Y ... |
Every argument given on the
command line after --biff-get-rest is treated as if it were
preceeded by --biff-get. Use this command to extract multiple
different files (or regexps) at once. |
--biff-str X |
Search all game BIFFs for files
containing X (regexp allowed). |
--biff-value X |
Search all game BIFFs for files
containing value X at offset ADDR. Must be used with
--biff-value-at. |
--biff-value-at ADDR |
Gives the offset address for a
--biff-value search. |
--biff-type X |
Limit --biff-str or
--biff-value searches to
resources of type X (cumulative). |
--biff-name X |
When a --biff-str or
--biff-value search finds a
matching file, assume it has a strref name at offset X and print that
name out as well. |
--make-biff X |
Create data/X.bif from all files in
folder X and destructively update CHITIN.KEY. Do not use this
feature. Do not even think of using this feature without backing up
CHITIN.KEY. |
--remove-biff X |
Remove references to BIFF X and
all of its resources from CHITIN.KEY. Do not use this feature. |
|
Comparison Options (see --out) |
--cmp-from X |
Emit WRITE_BYTEs to turn this file ... |
--cmp-to X |
... into this one. |
--dcmp-fromX |
Emit REPLACEs to turn this DLG file ... |
--dcmp-to X |
... into this one. |
--tcmp-fromX |
Compare this TRA file (or directory of TRA files)... |
--tcmp-to X |
... with this one (or this directory). |
--tlkcmp-fromX |
Emit STRING_SETs to convert this TLK file ... |
--tlkcmp-toX |
... into this one. |
--tlkcmp-use-strings |
When using --tlkcmp-from, emit
commands of the form STRING_SET "Hello" @1 instead of STRING_SET #1
@1. |
--bcmp-from X |
Emit APPLY_BCS_PATCH to turn this
BCS file ... |
--bcmp-to X |
... into this one. |
--bcmp-orig X |
Original file X to apply ... |
--bcmp-patch X |
... this patch to. |
|
Range Options |
--min X |
Lower range for some commands. See
--traify-tlk, --tlkcmp-from and --string. |
--max X |
Upper range for some commands. |
|
Automatic Module Packaging Options |
--automate X |
Automatically create a TP2 file for resources in folder X. See --out. |
--automate-min X |
Only --automate string references above X. |
--extract-kits X |
Extract all kits starting with kit #X
and create TP2 actions to install those kits as part of a module. |
|
Resouce Exploration Options |
--list-eff X |
List effects in resource X. See
--out. |
F.ITM or
F.EFF or
F.SPL |
Equivalent to --list-eff F.EXT. |
|
Logging Options |
--log X |
Log output and details to X. |
--autolog |
Log output and details to WSETUP.DEBUG. |
--logapp |
Append to log file instead of overwriting it. |
- Decompiling a DLG to a D
C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg
[C:\Program Files\Black Isle\BGII - SoA\chitin.key] 182 BIFFs, 41793 resources
[C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
[C:\Program Files\Black Isle\BGII - SoA\data\Dialog.bif] 2729 file entries
[BODHI.DLG] loaded
[.\BODHI.D] created from [BODHI.DLG]
This loads BODHI.DLG from the standard search path (i.e., the
current directory, your override directory, then the game BIFFs) and
creates BODHI.D from it.
- Decompiling a DLG file with translations
C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg --trans
...
[.\BODHI.TRA] created as translation file
[.\BODHI.D] created from [BODHI.DLG]
This creates BODHI.D as above and also the translation file
BODHI.TRA (listing all of the strings in BODHI.D
in an easy-to-traslate or spell-check format). BODHI.D will
be created with special references to those strings.
This is particularly useful if you are converting existing modifications
you may have created with another tool, such as IDU, into WeiDU format.
It allows you to both create the WeiDU D code and the
translation-friendly string labels at the same time.
- Decompiling a DLG files with options
C:\Program Files\Black Isle\BGII - SoA\> weidu --nofrom bodhi.dlg --out foozle.d --text
...
[.\foozle.d] created from [BODHI.DLG]
This creates foozle.d (instead of BODHI.D) and does not put any
"// from:" comments in foozle.d. It will include states
with SAYs of the form
SAY ~Hello~ /* #1 */
instead of
SAY #1 /* ~Hello~ */
- Decompiling multiple DLG files
C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.dlg jaheira.dlg --out test
...
[test\JAHEIRA.D] created from [JAHEIRA.DLG]
[test\BODHI.D] created from [BODHI.DLG]
This loads BODHI.DLG and JAHEIRA.DLG and creates BODHI.D and
JAHEIRA.D. The optional
--out test argument instructs WeiDU to put the resulting D
files in the test directory.
- Compiling a D file
C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.d
...
[bodhi.d] parsed
[BODHI.DLG] saved 135 states, 259 trans, 16 strig, 66 ttrig, 54 actions
This loads and parses bodhi.d and then executed all instructions in it.
This bodhi.d file just defines BODHI.DLG, which is created. If
bodhi.d contains strings that do not occur in DIALOG.TLK,
BODHI.DLG will be created with invalid string references.
- Compiling a D file that includes new text
C:\Program Files\Black Isle\BGII - SoA\> weidu bodhi.d --tlkout new-DIALOG.TLK
...
[bodhi.d] parsed
[BODHI.DLG] saved 135 states, 259 trans, 16 strig, 66 ttrig, 54 actions
[new-DIALOG.TLK] created, 84459 string entries
This loads and parses bodhi.d and then executed all instructions in it.
This bodhi.d file just defines BODHI.DLG, which is created. If
there are any new strings a new version of DIALOG.TLK is written to
new-DIALOG.TLK.
- Compiling multiple D files
C:\Program Files\Black Isle\BGII - SoA\> weidu ppworker.d bodhi.d --out test
...
[bodhi.d] parsed
[ppworker.d] parsed
[BODHI.DLG] saved 135 states, 259 trans, 16 strig, 66 ttrig, 54 actions
[PPWORKER.DLG] saved 33 states, 81 trans, 4 strig, 12 ttrig, 10 actions
This creates test/BODHI.DLG and test/PPWORKER.DLG based on the
instructions in bodhi.d and ppworker.d.
If these D files include new text, use --tlkout to make a new
DIALOG.TLK.
- Compiling a D file that defines many DLG files
C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solae1.d
OR
C:\Program Files\Black Isle\BGII - SoA\> weidu examples\sola\solae1.d
...
[examples/sola/solae1.d] parsed
[SOLA.DLG] loaded
[SOLA.DLG] saved 336 states, 401 trans, 64 strig, 18 ttrig, 125 actions
[SOLAE1.DLG] saved 36 states, 49 trans, 1 strig, 11 ttrig, 1 actions
[SOLAE2.DLG] saved 3 states, 3 trans, 0 strig, 0 ttrig, 0 actions
[SOLAE3.DLG] saved 2 states, 2 trans, 0 strig, 0 ttrig, 0 actions
[SOLAE4.DLG] saved 3 states, 3 trans, 1 strig, 0 ttrig, 0 actions
[SOLAE5.DLG] saved 2 states, 2 trans, 0 strig, 0 ttrig, 0 actions
[SOLAE6.DLG] saved 4 states, 5 trans, 0 strig, 2 ttrig, 0 actions
It just so happens that solae1.d APPENDs text to
SOLA.DLG and
creates SOLAE1.DLG, SOLAE1.DLG,
SOLAE3.DLG, ..., SOLAE6.DLG. You could
have put them all in the override directory with --out override. You
may use the forward slash (/) or the backslash (\) for
directories. Use --tlkout to make a new DIALOG.TLK if these
contain new text.
- Compiling a D file that uses a TRA file
C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solafoe.d --transin examples/sola/solafoe.tra
OR
C:\Program Files\Black Isle\BGII - SoA\> weidu examples/sola/solafoe.d examples/sola/solafoe.tra
...
[examples/sola/solafoe.tra] parsed (15 translation strings)
[examples/sola/solafoe.d] parsed
[SOLA.DLG] loaded
[SOLA.DLG] saved 336 states, 401 trans, 65 strig, 18 ttrig, 124 actions
[SOLAFOE.DLG] saved 11 states, 14 trans, 1 strig, 2 ttrig, 1 actions
It happens that solafoe.d uses 15 strings from a translation file,
APPENDs to SOLA.DLG and creates
SOLAFOE.DLG. You may use --transin to
specify a translation file or (if it ends in TRA) just throw it
on the command line. If you include multiple TRA files, the last
one to define a particular string index wins for that string. They need
not all cover the same set. Use --tlkout if there is new text involved.
- Displaying String References
C:\Program Files\Black Isle\BGII - SoA\> weidu --string 123 --strfind understudy --strfind acid.*rows
...
[C:\Program Files\Black Isle\BGII - SoA\chitin.key] 182 BIFFs, 41793 resources
[C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
String #123 is ~Haer' Dalis, all of you, stop them!~
String #6763 is ~Acid Arrows~
String #11662 is ~Biff The Understudy~
...
This displays string #123 and all strings that contain the string
"understudy" and all strings that match the regular expression
(regexp) "acid.*rows". Note that case does not matter.
- Updating DIALOG.TLK Manually
C:\Program Files\Black Isle\BGII - SoA\> weidu --strapp ANewString --tlkout happy.tlk
[C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
[.\happy.tlk] created, 84459 string entries
Not much to say here. String reference #84459 in happy.tlk is now
``ANewString''.
- Listing BIFF Contents
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff data/dialog.bif
...
[data\Dialog.bif] contains ABELA.DLG at index 0
[data\Dialog.bif] contains ACHEN.DLG at index 1
...
This shows all of the resources (e.g., ACHEN.DLG is a resource) that
are contained in data/Dialog.bif.
- Extracting BIFF Contents
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get dragred.cre
[C:\Program Files\Black Isle\BGII - SoA\chitin.key] 182 BIFFs, 41793 resources
[C:\Program Files\Black Isle\BGII - SoA\DIALOG.TLK] 84458 string entries
[C:\Program Files\Black Isle\BGII - SoA\data\Creature.bif] 3194 file entries
[.\dragred.cre] 1776 bytes, created from [C:\Program Files\Black Isle\BGII - SoA\data\Creature.bif]
This grabs Firkraag's dragon-form CRE creature file from the game
BIFFs and saves it in the current directory.
- Extracting BIFF Contents with Regular Expressions
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get sper.*itm
[.\chitin.key] loaded, 590551 bytes
[.\chitin.key] 182 BIFFs, 41793 resources
[.\DIALOG.TLK] loaded, 10154904 bytes
[.\DIALOG.TLK] 77666 string entries
[.\data\Items.bif] loaded, 659688 bytes
[.\data\Items.bif] 1990 file entries
[.\SPER01.ITM] 266 bytes, created from [.\data\Items.bif]
[.\SPER02.ITM] 314 bytes, created from [.\data\Items.bif]
[.\SPER03.ITM] 362 bytes, created from [.\data\Items.bif]
[.\SPER04.ITM] 322 bytes, created from [.\data\Items.bif]
[.\SPER05.ITM] 266 bytes, created from [.\data\Items.bif]
[.\SPER06.ITM] 266 bytes, created from [.\data\Items.bif]
[.\SPER07.ITM] 554 bytes, created from [.\data\Items.bif]
[.\SPER08.ITM] 314 bytes, created from [.\data\Items.bif]
[.\SPER09.ITM] 314 bytes, created from [.\data\Items.bif]
[.\SPER10.ITM] 362 bytes, created from [.\data\Items.bif]
[.\data\25Items.bif] loaded, 222370 bytes
[.\data\25Items.bif] 479 file entries
[.\SPER11.ITM] 314 bytes, created from [.\data\25Items.bif]
[.\SPER12.ITM] 1610 bytes, created from [.\data\25Items.bif]
[.\SPERMEL.ITM] 890 bytes, created from [.\data\25Items.bif]
This one assumes that the game is in the current directory and asks for
every spear item in the game. Note that --biff-get uses regular
expressions (regexp), not DOS-style wildcards. Note also that
--biff-get does not look in the override directory. Finally, if
you are using a Mac (or otherwise running unix) you'll want to put the
regular expression in double quotes, like so:
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-get "sper.*itm"
- Searching BIFF Contents
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-type CRE --biff-str SPWI911
...
LICH01.CRE in [data\Creature.bif] matches
HLKANG.CRE in [data\Creature.bif] matches
...
This finds all CRE files that contain the string "SPWI911", which is
equivalent to finding all enemy mages that know the spell Meteor Swarm
(which has resource name "SPWI911"). You could also try something like:
C:\Program Files\Black Isle\BGII - SoA\> weidu --biff-type BCS --biff-str Terminsel
...
AR0300.BCS in [data\Scripts.bif] matches
AR0308.BCS in [data\Scripts.bif] matches
JAHEIRA.BCS in [data\Scripts.bif] matches
...
to find all of the game scripts that include a variable that includes the
substring "Terminsel". As you would expect, Jaheira shows up. Note that
these searches are moderately time-consuming (e.g., searching all scripts
takes about 20 seconds).
- Converting one TLK file to another
C:\Program Files\Black Isle\BGII - SoA\> weidu --tlkcmp-from DIALOG.TLK --tlkcmp-to dialog-asc.tlk
...
[DIALOG.TLK] loaded, 8692747 bytes
[DIALOG.TLK] 74107 string entries
[dialog-asc.tlk] loaded, 10211578 bytes
[dialog-asc.tlk] 82805 string entries
WARNING: DIALOG.TLK has 74107 entries, dialog-asc.tlk has 82805 entries
STRING_SET 70866 ~Babau~ []
STRING_SET 70867 ~Babau~ []
This compares all strings in common between two DIALOG.TLK files and
generates a list of STRING_SET TP2 entries to convert the
TLK file named in --tlkcomp-from into the TLK file named in
--tlkcomp-to. In this case, WeiDU indicates there are two differences in
the strings shared between a standard ToB TLK file and an Ascension
Classic TLK file: strings 70866 and 70867 were changed to "Babau".
Also note that the Ascension Classic TLK file has more entries (82805
compared to 74107).
If you have made a large number of manual changes to a TLK file
(such as grammar/spelling corrections, or other dialogue tweaks), this is a
handy way to generate install-ready scripting to apply those changes to an
end user's version of BG2.
Note that the use of --out will be helpful for a long list.
C:\Program Files\Black Isle\BGII - SoA\> weidu --tlkcmp-from DIALOG.TLK --tlkcmp-to dialog-asc.tlk --out mylist.txt
This will make a new file mylist.txt file that contains the
STRING_SET parts of the output, which can then be put into a
TP2 file.
- Automating File Descriptions
C:\Program Files\Black Isle\BGII - SoA\> weidu --automate MyMod/SomeFolder --append MyMod.tp2
WeiDU's --automate feature can save you oodles of time, so you probably
will want to learn how to use it. It's rather simple when you get the hang
of it (but everything is right?).
Suppose you have just created some items, some spells and some creatures
and some areas for you mod and you want to distribute them to others using
WeiDU. You could manually write out string patching code by hand for each
resource. Or you can get WeiDU to do it automatically.
WeiDU will scan every item, spell and creature inside the given folder (in
this example, the folder is MyMod/SomeFolder) and emit TP2
commands to COPY those resources from that folder into the
override folder. In addition, each resource's current strings (like
item descriptions and monster names) will be loaded from your TLK
file and used to patch that resource as it is copied.
For example, the output of --automate on a folder that contains a
potion of extra healing looks like this:
COPY ~MyMod/SomeFolder/potn52.itm~ ~override/potn52.itm~
SAY NAME ~Potion~
SAY NAME2 ~Potion of Extra Healing~
SAY UNIDENTIFIED_DESC ~Potions are typically found in ceramic, crystal, glass,
or metal flasks or vials. Flasks or other containers generally contain
enough fluid to provide one person with one complete dose to achieve the
effects of the potion.~
SAY DESC ~When wholly consumed, this potion restores 27 hit points to the
person. The effect is instantaneous and the potion is destroyed in the
process.~
SAY 0xde ~Gulp!~ [GULP]
And there you have it, apparently there is a substitute for hard work.
- Converting Between TLK and TRA Files
Some translators who are using WeiDU to translate non-WeiDU mods find it
handy to be able to convert between TLK and TRA files.
First, let's create a TRA file:
C:\Program Files\Black Isle\BGII - SoA\> weidu --traify-tlk --min 2000 --max 2002
...
@2000 = ~Indeed! It's been quite tasty so far. Listen, we're not here to
devour everything. In fact, we'd like to help a little girl named
Jaella.~
@2001 = ~No, we haven't. We will devour you if you don't tell us what we
need to know.~
@2002 = ~Let us stop this charade. I'm only here to ask you a few
questions.~
...
You may also extract only those strings matching a regexp:
C:\Program Files\Black Isle\BGII - SoA\> weidu --traify-tlk --strfind lawyer
...
@36568 = ~Honor-bound and honor-branded, then, is it? Very well, lawyer,
you have set me free and for that I thank you.~
...
Finally, you may redirect the output to a file using --out and
read from a different TLK file by adding it on the command line.
Once you have a TRA file with a few entries you can create a
TLK file from it:
C:\Program Files\Black Isle\BGII - SoA\> weidu --make-tlk my.tra --tlkout new.tlk
[c:\src\weidu\weidu.exe] WeiDU version 109
[C:\Program Files\Black Isle\BGII - SoA/chitin.key] 182 BIFFs, 41793
resources
[C:\Program Files\Black Isle\BGII - SoA/dialog.tlk] 82405 string entries
[my.tra] parsed
[my.tra] has 100 translation strings
New TLK will have 200 entries
[new.tlk] created, 200 string entries
String @1 in your TRA file will become string reference #1 in the TLK file. If your TRA file has ``holes'' the new
TLK file will have blank entries. You may specify --make-tlk
multiple times: the last TRA file to define a translation string
determine that string reference.
- Creating a BIFF File
This tutorial was thoughtfully provided by Japheth.
Using --make-biff is dead easy. Here's a quick and dirty example:
Assuming WeiDU is in your BGII directory, grab a bunch of files from your
override folder and stick them into a folder inside your BGII directory.
We'll call the folder mybiff for this example.
Once the files are inside the folder, this is all you would have to do to
make WeiDU create a biff of the files:
C:\Program Files\Black Isle\BGII - SoA\> weidu --make-biff mybiff
[c:\src\weidu\weidu.exe] WeiDU version 122
[./chitin.key] 182 BIFFs, 41793 resources
[./dialog.tlk] 82479 string entries
[data\mybiff.bif] will contain 20 resources totalling 211096 bytes
[data\mybiff.bif] incorporating [mybiff/udsola02.cre]
...
[data\mybiff.bif] incorporating [mybiff/sola10.cre]
KEY saved (183 biffs, 41813 resources)
WeiDU will add the files into the BIFF mybiff.bif and stick
that file in your data directory. It will also update the
CHITIN.KEY.
Before using this feature, make sure you backup your
CHITIN.KEY.
- Removing a BIFF File
You can use --remove-biff to remove a BIFF file from
CHITIN.KEY and destructively replace it with a new, smaller
CHITIN.KEY.
Before using this feature, make sure you backup your
CHITIN.KEY.
Do not use this feature.
C:\Program Files\Black Isle\BGII - SoA\> weidu --make-biff mybiff data\25ArMisc.bif
[c:\src\weidu\weidu.exe] WeiDU version 157
[./chitin.key] 182 BIFFs, 41793 resources
[./dialog.tlk] 83772 string entries
Removing references to 16 resources in [data\25ArMisc.bif]
KEY saved (181 biffs, 41777 resources)
Note that the specified BIFF is not deleted from your computer's
file system, it is merely removed from CHITIN.KEY. When
specifying the BIFF case does not matter but the folder separator,
usually ``\'' or ``:'', does. Use --list-biffs to get
the official list of possible BIFFs to remove. Do not use this
feature.
- Viewing Banter Offline with --transitive
C:\Program Files\Black Isle\BGII - SoA\> weidu --nocom --text --transitive banomen.dlg
The --transitive flag tells WeiDU to follow EXTERN
references when emitting D files. So the resulting BANOMEN.D
file has lines like this:
IF WEIGHT #31 ~InParty("Edwin")
See("Edwin")
Gender("Edwin",FEMALE)
!StateCheck("Edwin",STATE_SLEEPING)
Global("BAnomen1","LOCALS",0)~ THEN BEGIN 10
SAY ~Hey, Edwina! I shall be your champion at the next tournament that
we come to if only you give me a piece of your robe, uh, that is, dress
to adorn my shield.~ [ANOMEN49]
IF ~~ THEN DO ~SetGlobal("BAnomen1","LOCALS",1)~ EXTERN ~BEDWIN~ 104
END
IF ~~ THEN BEGIN BEDWIN 104
SAY ~(My condition draws fools like flies to honey). Silence, you idiot!
You've a death wish that is larger than your swollen head.~ [EDWINW39]
IF ~~ THEN GOTO 11
END
IF ~~ THEN BEGIN 11
SAY ~Fair Edwina, I am truly bereft by your non-acceptance. It is tragic
when a knight has no fair maiden to moon over. Heh he he...~
IF ~~ THEN EXIT
END
Note that both lines from both Edwin and Anomen are presented. The
resulting ``D'' file is not valid in that it cannot be fed back to WeiDU
directly, but it should make it easier for you to read all of the jokes
offline.
Note that WeiDU may well go into an infinite loop when you use
--transitive. Sorry about that.
TP2 File |
|
A TP2 File is a text file that contains a number of
mod Components. TP2 Files tell WeiDU how to install
various parts of your mod on an end-user's computer. |
is |
BACKUP directoryName
AUTHOR emailAddress
TP2 Flag list
Language list
Component list |
A TP2 File is basically a prologue and then a list of
Components. The BACKUP declaration tells WeiDU where
to put backed-up versions of files that would be overwritten so that
they can be uninstalled later. The AUTHOR directive gives an
email address for users to send bugs to if there are problems during
the installation. The TP2!AUTHOR variable is set to
the ``emailAddress'' value.
TP2 Flags set global options.
Languages are
the various languages in which your mod is available. The
Finally, the Components make up the actual meat of
your mod. Different Components can be installed or
uninstalled separately, but all of the parts within a
Component are treated as a unit. |
|
TP2 Flag |
|
A TP2 Flag declaration tells WeiDU to apply some
global option to your TP2 file. |
is |
AUTO_TRA path |
The AUTO_TRA flag is used
with the COMPILE TP2 Action. It automatically loads
TRA files that match your D files. |
or |
ALLOW_MISSING file list |
ALLOW_MISSING directive allows you to specify files that can
be missing (when you try to copy them or reference them from
D files). Empty versions of those files will be created on
demand. Try to use ACTION_IF instead of this. |
or |
ASK_EVERY_COMPONENT |
This flag instructs WeiDU to ask about installing every component in
this TP2 file individually, rather than asking questions
like "Would you like to install them all?" |
or |
ALWAYS TP2 Action list END |
This flag specified a TP2 Action that is executed just
before any normal TP2 Action in the file is installed. |
or |
SCRIPT_STYLE style |
This flag determines how WeiDU will read in BAF and
BCS files and
write out BAF and BCS files. Possible options for
``style'' include BG (the default), IWD2, and PST.
See the Scripting Styles tutorial. |
|
Language |
|
A Language declaration tells WeiDU where to find TRA
files. |
is |
LANGUAGE languageName
languageDirectory
defaultLanguageTRA list |
The languageName is the name of the language as it is presented to
the user. "American English" and "Traducción al Español" are
examples. The languageDirectory is the name of the subdirectory in
which you have stored the TRA files for that language.
Examples include "american" and "spanish". The variable
named LANGUAGE is set to languageDirectory if the user selects
this language.. Finally, all of the TRA files in the
defaultLanguageTRA list are loaded as soon as the user selects a
language. |
|
Component |
|
A Component is a contiguous group of files and actions that a
user can install, uninstall or upgrade. |
is |
BEGIN componentName
Component Flag list TP2 Action list |
Basically, if componentName is "Foo", the user will be asked: "Do you
want to install Foo?". If so, all of the associated TP2 Actions
are performed. If not, they are skipped. |
|
Component Flag |
|
A Component Flag determines how WeiDU treats a component. |
is |
DEPRECATED String |
Mark the given component as deprecated. If it is currently installed,
it will be uninstalled and the given String will be
displayed. The user will never be asked to install the given
component -- it will be silently skipped in all listings. However, it
will still take up a ``component number''. |
or |
REQUIRE_COMPONENT modToUninstall modComponent
String |
Make this component so that it can only be installed if another
component is installed. If that other component is not installed, the
String will be displayed and the user will not get a chance
to install this component. This is in some sense the opposite of the
UNINSTALL TP2 Action. For example,
REQUIRE_COMPONENT "setup-ease.tp2" "0" "You must have infinite
stacking installed!" prevents a component from being installed
unless the infinite stacking part of the Ease-of-Use mod is
installed. |
or |
FORBID_COMPONENT modToUninstall modComponent
String |
Make this component so that it can only be installed if another
component is not installed. This does the opposite of
REQUIRE_COMPONENT. |
or |
REQUIRE_PREDICATE value String |
This component can only be installed if the value
evaluates to true (non-zero). |
or |
SUBCOMPONENT String [ value ] |
At most one component of the given subcomponent group can be
installed at any time. All subcomponents of the same group are
listed together for the user. See the SUBCOMPONENT
tutorial. |
or |
INSTALL_BY_DEFAULT |
If WeiDU would ask the user whether to install this component or not,
and this component is not already installed, WeiDU will instead
install it by default (without asking the user). If there is an error
or the component is already installed, WeiDU will ask the user. The
--uninstall command-line argument overrides this. See also
REQUIRE_COMPONENT and ALWAYS. |
or |
DESIGNATED forcedNumber |
Normally module components are numbered based on their order in the
TP2 file (starting from 0). This flag sets the current
component number to forcedNumber. The next component (if it lacks a
DESIGNATED flag) will be forcedNumber+1. You can easily shoot
yourself in the foot by setting forcedNumber too low (e.g., so that
multiple components have the same number). Do not use this
flag. |
or |
NO_LOG_RECORD |
Normally all module components are recorded in WeiDU.log and can
be uninstalled later. This component flag prevents this component
from writing a log record when it is successfully installed. As a
result it is ``invisible'' to WeiDU, can be installed multiple times,
and cannot be uninstalled with WeiDU. Do not use this flag. |
|
TP2 Action |
|
A TP2 Action tells WeiDU how to install a component. This usually
involves copying files and writing in new string references. |
is |
COPY optNoBackup
optGlob fromFile toFile ...
patch list when list |
You may specify as many fromFile-toFile pairs as you like. Each
fromFile is copied to its associated toFile. If there are any WeiDU
variables inside explicit %s in toFile or fromFile, they are
replaced by their values. All of the
patches are applied. If there are any when
conditions and any of them are false, the copy does not happen.
A typical example is COPY "mymod/sword.itm"
"override/m#sword.itm".
COPY commands set the user-defined SOURCE_DIRECTORY,
SOURCE_FILESPEC, SOURCE_FILE,
SOURCE_RES,
DEST_DIRECTORY, DEST_FILESPEC,
DEST_FILE, and DEST_RES
variables based on fromFile and toFile as follows. If
fromFile is mymod/cre/bigboss.cre, then
SOURCE_DIRECTORY is mymod/cre,
SOURCE_FILESPEC is mymod/cre/bigboss.cre,
SOURCE_FILE is bigboss.cre and
SOURCE_RES is bigboss. The DEST_ variables
are similarly based on toFile. In addition, SOURCE_SIZE is
set to the size (in bytes) of the source file.
This is generally only useful if you have enabled globbing. Any
user-defined variables in toFile are replaced with their
values. You may also reference these variables in
patches.
See the Module Distribution section for information about
finding a good unique prefix for your mod-created resources. |
or |
COPY_EXISTING optNoBackup fromFile toFile ...
patch list when list |
Behaves like COPY except that the fromFiles are drawn from
the game BIFFs or override directory. This is useful for
making changes to files that other mods may have changed as well. |
or |
COPY_EXISTING_REGEXP optNoBackup optGlob fromFileRegexp toDir ...
patch list when list |
Behaves like COPY_EXISTING except that fromFileRegexp may
contain regexp regular exprsesions. All matching files in
the game BIFFs will be copied to the directory specified by
toDir.
If GLOB is specified, matching files in override will
also be patched and copied. If a file appears in both the
BIFFs and the override folder, it will only be copied
once. For example, if HARM.ITM is in the BIFFs and
HARM2.ITM is in override, this code will copy and patch them
both:
COPY_EXISTING_REGEXP GLOB ~HARM.*.ITM~ ~override~
SAY // ... whatever
|
or |
COPY_RANDOM ( file1 list )
[ ( fileN list ) list ] patch list when list |
This command works like COPY_EXISTING but the destination
for any given souce file in the file1-list is some other different
file in the file1-list. Similarly, the destination for any file in
the fileN-list is some other file in the fileN-list. This allows you
to randomly shuffle categories of game resources. |
or |
COMPILE sourceFile list [ USING traFile list ] |
This command compiles D and BAF source files. If
sourceFile is a directory, all D and BAF files within
that directory are processed individually.
First, this loads all of the traFiles presented. If any of their
paths contain %s, the %s is replaced with the
languageDirectory of from the Language the user selected.
If you specified AUTO_TRA mymod/%s above, WeiDU will
also attempt to load mymod/languageDirectory/sourceFile.tra for
every sourceFile in the list. Once all of the TRA files are
loaded, the D and BAF files are compiled. Any
DLGs or BCSs they create or modify are placed in the
override directory. |
or |
MKDIR dirName list |
Instructs WeiDU to create all of the directories in the list. |
or |
RANDOM_SEED someInteger |
Sets the random number generator seed to someInteger. This allows you
to get reproducible results when using random functions. If you
specify a string that is not a valid integer the system initializes
itself (e.g., by using the current time). |
or |
APPEND filename newText when list |
If there are no when conditions or they are all true, the
ASCII text newText is appended to the existing file filename (which
is read from the game BIFFs or the override folder).
Any variables in newText are replaced by their values. |
or |
APPEND_COL filename newText when list |
If there are no when conditions or they are all true, the
string newText is appended column-wise to the existing file filename.
If filename was:
A B C
D E F
X Y Z
P Q R
and newText was "0 1 2 3", the result would be:
A B C 0
D E F 1
X Y Z 2
P Q R 3
You must have the same number of whitespace-separated words in
newText as there are columns in filename. |
or |
EXTEND_TOP existingBCS newFile patch list |
Loads existingFile (which may be BAF or BCS), prepends
all of newBCS to the top of it, applies all of the patches, and
then copies it to the override folder. User variables in
the filenames existingFile and newFile are replaced by their values.
Use EVALUATE_BUFFER if you want to evaluate variables inside
the body of newFile before parsing it. |
or |
EXTEND_BOTTOM existingBCS newFile patch list |
As EXTEND_TOP, but the newFile file is put at the bottom of the
existingBCS file. User variables in the filenames existingFile and
newFile are replaced by their values. |
or |
EXTEND_TOP_REGEXP existingBCSregexp newFile patch list |
As EXTEND_TOP, but the newFile file is put at the bottom of the
every BCS file that matches the regexp
existingBCSregexp. |
or |
EXTEND_BOTTOM_REGEXP existingBCSregexp newFile patch list |
See EXTEND_TOP_REGEXP. |
or |
ACTION_IF value THEN BEGIN
TP2 Action list END
[ ELSE BEGIN TP2 Actoin list END ] |
If value evaluates to true (non-zero), the TP2 Actions
in the THEN-branch are executed. Otherwise, if an ELSE-branch
is present, its commands are executed. Otherwise nothing happens. |
or |
AT_EXIT commandToRun |
Whenever this component attemps to be installed, commandToRun
is executed. Variables (e.g., %LANGUAGE%) in the string
commandToRun are replaced by their values. Note that the command is
executed even if the component does not install correctly, so
AT_EXIT should probably be the last command in a component.
-
If commandToRun consists of a single TP2 filename, WeiDU will
enqueue that TP2 file and run it when the current one is done
(asking the user all the standard questions about languages and which
components to install).
- If commandToRun consists of the word VIEW followed by a file, a
system-specific viewer will be used to present the file to the user.
For example, on Windows systems notepad will be used to view
txt files and a web browser will be used to view html files.
- Otherwise, commandToRun is executed by the underlying operating system
(and is thus system dependant). If you want to do something that
WeiDU doesn't handle, like extracting WAVs from an MP3, make a batch
file and run it from here.
In any case, slashes and backslashes will be converted appropriately
for the underlying operating system. The most common use is:
AT_INTERACTIVE_EXIT ~VIEW mymod\README.txt~
This causes your README file to be displayed using a system appropriate
viewer. Here's a more complicated example that pulls up a
language-specific README if one is available:
ACTION_IF FILE_EXISTS ~mymod\README.%LANGUAGE%.txt~ THEN BEGIN
AT_INTERACTIVE_EXIT ~VIEW mymod\README.%LANGUAGE%.txt~
END ELSE BEGIN
AT_INTERACTIVE_EXIT ~VIEW mymod\README.txt~
END
|
or |
AT_INTERACTIVE_EXIT commandToRun |
As AT_EXIT, but the command is only executed if the user
specifically asked for the component to be installed or
upgraded. |
or |
AT_UNINSTALL commandToRun |
As AT_EXIT, but when this component is removed,
commandToRun is executed. |
or |
AT_INTERACTIVE_UNINSTALL commandToRun |
As AT_EXIT, but whenever the user specifically asks for this
component to be removed, commandToRun is executed.
Only the %LANGUAGE% variable is guaranteed to be
replaced, so do not count on any others. |
or |
UNINSTALL modToUninstall modComponent |
If the given component of the given mod is currently installed,
uninstall it before proceeding. Do not use this action. This
should only be used if you release a new version of a component under a
new name. For example, many Tactics Mod components replace old
Solaufein mod components. In order to prevent such a component from
being installed twice, the Tactics version uninstalls the Solaufein
version. |
or |
ADD_KIT internalKitName manyComplexArguments |
This command allows you to add new kits to the BGII.
See the example file mymod.tp2 or the tutorial at
http://forums.gibberlings3.net/index.php?showtopic=584
for information on how to do this. |
or |
ADD_MUSIC internalMusicName newMUSFile |
No documentation yet! |
or |
ADD_PROJECTILE modpath/PROName.PRO |
Appends an entry for PROName to PROJECTL.IDS and assigns it the next
available ProRef number. Then copies the file modpath/PROName.PRO
to the override folder. The new ProRef number can be accessed
through the variable %PROName% and used to updated the
Projectile type field of an ITM or SPL file's Item Ability or
Spell Ability sub-structures. (The hexadecimal offsets for these
fields can be found using NearInfinity.) In the following example, a
new PRO file and an ITM file that will use it are added to the game:
ADD_PROJECTILE ~MyMod/MYDXP.PRO~
COPY ~MyMod/MYDART.ITM~ ~override/MYDART.ITM~
WRITE_SHORT 0x09c ~%MYDXP%~
|
or |
STRING_SET indexOrString newValue list [ USING traFile ] |
This command replaces each given string in the user's TLK file
with the associated newValue. Do not use this command. If a
traFile is given, that file is is read once before all of the
replacements take place and its contents are forgotten after. Do
not use this command. |
or |
STRING_SET_RANGE #min #max USING traFile |
For every integer i between min and max (inclusive) we do
STRING_SET i @i USING traFile (except that this command should be
executed more rapidly). The command will fail if @i is not defined
(either by traFile or by some other tra file in scope) for some i
between min and max. Do not use this command. |
or |
REQUIRE_FILE filename warningString |
If filename does not exist, warningString is displayed and this
component cannot be installed. This is checked before any
actions are executed. |
or |
FORBID_FILE filename warningString |
If filename does exist, warningString is displayed and this
component cannot be installed. This is checked before any
actions are executed. |
or |
FAIL warningString |
If this TP2 Action is execution, warningString is displayed and
the component fails to install. |
or |
PRINT displayString |
The string DisplayString is echoed to the user. Useful for debugging or
status reports. If displayString contains %variable%
references, their values will be displayed. |
or |
ADD_GAM_NPC npcCRE npcARE xCoord yCoord |
See the ADD_GAM_NPC tutorial for more information about this
action, which is used when adding NPCs to Baldur's Gate 1. BG2 mods
should not use this command. |
or |
<<<<<<<< fileName fileBody >>>>>>>> |
(That's eight (8) angle brackets on each side.)
For the purposes of copying and compiling files, WeiDU will pretend
that fileName is a real file with contents fileBody. This allows you to
define inlined files inside your TP2 file. Such definitions
must be executed before the inlined file is used. Other operations
on fileName (such as FILE_EXISTS, FILE_MD5 or
FILE_SIZE) are undefined. Inlined files will be skipped by
COPY_EXISTING_REGEXP and other ``wildcard'' approaches: you
must name them directly. Unlike most other WeiDU things,
spacing matters here. After the initial <<<<<<<< there can be
any number of spaces. The first non-space character after the
<<<<<<<< is the first character of fileName. All other
characters up to and excluding the newline on that line are part of
fileName (and thus fileName cannot start with a space or contain a
newline). All user variables (e.g., %foo%) in fileName will be
replaced by their values.
The fileBody contains all characters after that newline up to
and excluding the <<<<<<<<. Note that a single inlined filename
namespace is shared by WeiDU for all TP2 files it reads (it
might read other TP2 files in the process of installing yours
in order to uninstall or reinstall another mod's components), so it is
criticially important that you use some sort of unique prefix.
I also suggest that you avoid using your mod's actual directory
structure (if any) in order to avoid confusion with real files.
Consider using .../yourmod-inlined/fileName. Here is a concrete
working example:
BEGIN ~MyMod Component 1~
<<<<<<<< .../mymod-inlined/myfile.baf
IF
True()
THEN
RESPONSE #100
Kill("Anomen")
END
>>>>>>>>
COMPILE ~.../mymod-inlined/myfile.baf~
This inclusion method is eight-bit clean, so if you are very careful you
can inline a binary file (e.g., a CRE or BAM) with
this method. Be careful to shave off the newline before the >>>>>>>>
in such cases. Finally, note that inlined files have the same
maximum size as other (non-BIFF) WeiDU files and strings (usually about
16 megs). |
|
optNoBackup |
|
A COPY command normally makes a backup copy of its target (if one
exists) so that the mod can be uninstalled later by restoring the backup. |
is |
|
If you don't say anything here, WeiDU will make a backup
copy of the file and the COPY will be undone if the mod
is uninstalled. |
or |
+ |
If you put a + here, WeiDU will not make a backup
copy of the file and the COPY will not be
undone if the mod is uninstalled. Do not use this feature. |
|
optGlob |
|
A COPY command may use globbing to expand filename
wildcards with respect to files on the host filesystem. Unlike
COPY_EXISTING_REGEXP, glob wildcards do not range over game
resources. Instead, they range over physical files actually on the disk. |
is |
|
Do not use local filesystem globbing. This is the default. |
or |
GLOB |
Use local filesystem globbing. Globbing is
generally architecture specific! Do not use globbing if you can
help it.
Here is a concrete example. Imagine that CHITIN.KEY contains
two files: C1.ITM and C2.ITM. The override contains C2.ITM and
C_MOD.ITM.
COPY_EXISTING_REGEXP "C.*.ITM" "override"
// catches C1.ITM, C2.ITM
COPY_EXISTING_REGEXP GLOB "C.*.ITM" "override"
// catches C1.ITM, C2.ITM, C_MOD.ITM
COPY "override" "override"
// catches C2.ITM, C_MOD.ITM
To put it another way: if you do not specify GLOB with
COPY_EXISTING, WeiDU pretends that the override directory
contains 0 files that are not in CHITIN.KEY. Finally, GLOB has no
effect on wildcards in the "destination" part of the COPY:
COPY GLOB "mymod/foo" "music/*"
// this is illegal: DO NOT DO THIS
|
|
patch |
|
A patch tells WeiDU how to modify a file. |
is |
SAY offset String |
The string-ref associated with String is written at
offset. This is commonly used to change the name or
description of a spell or item. |
or |
PATCH_PRINT displayString |
The string DisplayString is echoed to the user. Useful for debugging or
status reports. If displayString contains %variable%
references, their values will be displayed. See also PRINT.
Example:
COPY_EXISTING_REGEXP ~.*\.CRE~ ~override~
READ_BYTE 0x272 race
READ_BYTE 0x273 class
PATCH_IF class = 3 THEN BEGIN
PATCH_PRINT ~%SOURCE_FILE% is a cleric with race = %race%.~
END
|
or |
SAY_EVALUATED offset stringWithVars |
Any WeiDU variables (enclosed in %s) inside stringWithVars are
replaced by their values and the resulting string (constructed at
mod-installation time!) is added to DIALOG.TLK and its string
reference it written to the offset. Example:
COPY_EXISTING_REGEXP ~RING.*.ITM~ ~override~
READ_LONG 0x38 cost
SAY_EVALUATED IDENTIFIED_DESC ~I Am %SOURCE_RES%, I Cost %cost%~
Do not use this feature. |
or |
SPRINT variable stringWithVars |
Any WeiDU variables (enclosed in %s) inside stringWithVars are
replaced by their values and the resulting string (constructed at
mod-installation time!) is assigned to the variable variable.
This works somewhat like sprintf() but it not as cool. Currently this
is the only way to assign a string value to a variable. |
or |
SNPRINT value variable stringWithVars |
As SPRINT, but only the first N characters are stored in
the variable, where N is the result of evaluating the
value. This works somewhat like snprintf(). Thus:
SPRINT "author" "Jason"
SNPRINT 3 "myvar" "1:%author%"
... assigns 1:J to myvar. |
or |
REPLACE regexp text |
All occurences of regexp in the file are replaced with the ASCII
printing of the string reference for text. So if regexp
is "FRED" and the text ends up being strref #1234, "FRED" will
be replaced with "1234". This is usually used to replace string
references in BCS files (where they are stored textually). Put a
command like DisplayString(Myself,99999) in your BCS file
and use something like REPLACE 99999 "Hello, World". |
or |
REPLACE_TEXTUALLY regexp string |
All occurences of the given regexp in the file are replaced with
the given string.
variable
substitution (e.g., kit and music names) is performed on both the
string and the regexp. |
or |
EVALUATE_BUFFER |
Any WeiDU variables (like %myvar%) inside the current file (which
should probably be a plain text file in order for this to make much sense)
are replaced by their values. Example:
<<<<<<<< .../script.baf
IF
See(%myvar%)
THEN
RESPONSE #100
Kill(%myvar%)
END
>>>>>>>>
EXTEND_TOP ~sola.bcs~ ~.../script.baf~
SPRINT myvar = ~"Anomen"~
EVALUATE_BUFFER
Those two actions extend the top of sola.bcs with the script
block IF See("Anomen") THEN RESPONSE #100 Kill("Anomen") END.
You can also use EVALUATE_BUFFER in COMPILE actions
or before strings in values. |
or |
APPLY_BCS_PATCH patchFile |
Applies patchFile to the current file. See --bcmp-from and similar
command-line arguments for constructing these patches. |
or |
APPLY_BCS_PATCH_OR_COPY patchFile copyFile |
Applies patchFile to the current file, as APPLY_BCS_PATCH.
However, if the patching fails the current file is replaced with copyFile
instead. |
or |
WRITE_BYTE offset value |
The first argument is the offset at which the second argument (an 8-bit
byte value) is written. |
or |
WRITE_SHORT offset value |
The first argument is the offset at which the second argument (a 16-bit
short value) is written. |
or |
WRITE_LONG offset value |
The first argument is the offset at which the second argument (a 32-bit
long word value) is written. |
or |
WRITE_ASCII offset ascString
[ #requiredSize ] |
The ASCII ascString is written to the file starting at offset.
If you specify a requiredSize then exactly that many bytes are
written (if ascString is smaller, it is padded with NULs; if
ascString is larger, it is truncated).
If you do not specify a requiredSize, the terminating NUL is not
written. |
or |
WRITE_EVALUATED_ASCII offset ascString
[ #requiredSize ] |
The ASCII ascString is evaluated (so %variable% is replaced by its
value) and written to the file starting at offset (as in
WRITE_ASCII. |
or |
WRITE_FILE offset filename |
The entire contents of ``filename'' (which may contain variables) are
loaded and copied over the current file starting at offset
offset. ``filename'' must be a literal filename like
mymod/data/file.bam. If there is not enough room between
offset and the end of the file for the contents of ``filename''
the patch will fail with an error message. |
or |
INSERT_FILE offset filename |
Just like WRITE_FILE except that the entire contents of
``filename'' are inserted at offset, just as if you had done an
INSERT_BYTES with the size of ``filename'' to that offset
followed by a WRITE_FILE to that offset. |
or |
APPEND_FILE filename |
Just like INSERT_FILE except that the entire contents of
``filename'' are appended to the end of the current file. |
or |
REPLACE_BCS_BLOCK oldFile newFile |
If the current file is a BCS file, the segment of it
corresponding to oldFile is replaced with the contents of newFile.
oldFile and newFile may be BCS or BAF files. If they
are BAF files they will not get the benefit of AUTO_TRA. |
or |
INSERT_BYTES offset value |
The first argument is the offset, the second argument is the count.
The file will be expanded at the given offset with count bytes worth of
zeroes. |
or |
DELETE_BYTES offset value |
The first argument is the offset, the second argument is the count.
The file will shrink as count bytes are deleted starting at the given
offset. |
or |
READ_BYTE offset variable [ ELSE
value ] |
An 8-bit value is read from the file at the given offset and is stored
in the given variable. If offset is out-of-bounds and the
ELSE is present, the ELSE-value is assigned to
variable. If offset is out-of-bounds and the ELSE is
not present, the patch fails with a visible error. |
or |
READ_SBYTE offset variable [ ELSE
value ] |
As READ_BYTE, but the value is interpreted as signed. |
or |
READ_SHORT offset variable [ ELSE
value ] |
A 16-bit value is read from the file at the given offset and is
stored in the given variable. See READ_BYTE. |
or |
READ_SSHORT offset variable [ ELSE
value ] |
As READ_SHORT, but the value is interpreted as signed. |
or |
READ_LONG offset variable [ ELSE
value ] |
A signed 32-bit value is read from the file at the given offset
and is stored in the given variable. See READ_BYTE. |
or |
READ_ASCII offset variable [ ELSE
string ] [ ( sizeValue ) ] |
A nul-terminated string is read from the file at
the given offset and is stored in the given variable.
The terminating nul is not stored. The default read size is 8.
If an explicit sizeValue is specified than that many bytes are read
into the variable, even of some of them are nuls. See
READ_BYTE. If the offset is out-of-bounds and the
ELSE clause is present, the string is evaluated as in
WRITE_EVALUATED_ASCII and then assigned into variable. |
or |
READ_STRREF offset variable [ ELSE
string ] |
A 32-bit Infinity Engine DIALOG.TLK string reference is read from the
file at the give offset. The string reference is looked up in
DIALOG.TLK and the (male) string value for it (without any quotes) is
stored in the variable. In some sense this is the opposite of
SAY_EVALUATED. |
or |
SET variable = value |
Update variable so that it is equal to value. |
or |
variable = value |
Update variable so that it is equal to value. |
or |
[ SET ] variable += value |
Equivalent to SET variable = variable + value. |
or |
[ SET ] variable -= value |
Equivalent to SET variable = variable - value. |
or |
[ SET ] variable *= value |
Equivalent to SET variable = variable * value. |
or |
[ SET ] variable /= value |
Equivalent to SET variable = variable / value. |
or |
[ SET ] variable &= value |
Equivalent to SET variable = variable BAND value. |
or |
[ SET ] variable |= value |
Equivalent to SET variable = variable BOR value. |
or |
[ SET ] variable <<= value |
Equivalent to SET variable = variable BLSL value. |
or |
[ SET ] variable >>= value |
Equivalent to SET variable = variable BLSR value. |
or |
WHILE value BEGIN
patch list END |
If value is non-zero, execute the given patch list and
then repeat, re-evaluating the value.
Be very careful when using this command. You can easily describe
an infinite loop. See the WHILE loop tutorial for more
information. |
or |
FOR ( patch list ;
value ;
patch list )
BEGIN patch list END |
The patch FOR (init;pred;inc) BEGIN body END is equivalent to
init WHILE pred BEGIN body inc END. Note that the predicate
value cannot be empty. |
or |
PATCH_IF value [ THEN ] BEGIN
patch list END
[ ELSE BEGIN patch list END ] |
If value is non-zero, execute the first patch list once. Otherwise, execute the second patch list (if any). As a
convenient shorthand, you may omit the BEGIN-END in the ELSE
branch if the ELSE branch contains exactly one patch. |
or |
SET_2DA_ENTRY value value value
value |
The first value is the row, the second is the column and the
third is the required column count. The entry on the given column
of the given row is set to the fourth value, but only rows with
at least as many columns as the required column count are considered.
The fourth value, the new entry, is evaluated specially: if it
can be evaluated like a value (e.g., ``3+4'') it will be evaluated
and its integer result will be written as an ASCII string. Otherwise if
it is a single string (that is not a variable in scope) that string will
be written at the new value.
See
the SET_2DA_ENTRY tutorail for more information. |
or |
PATCH_RANDOM_SEED value |
See RANDOM_SEED. |
or |
ADD_STORE_ITEM [ + ] itemName numCharges ext2 ext3
itemFlag maxInStack [ unlimited ] |
See the ADD_STORE_ITEM tutorial for more information. |
or |
READ_2DA_ENTRY value value value
variable |
The first value is the row, the second is the column and the
third is the required column count. The variable specified is set
to the the entry on the given column of the given row, but only column
with at least as many columns as the required column count are
considered. This is the reverse of SET_2DA_ENTRY. |
or |
COUNT_2DA_ROWS value variable |
The first value is the required column count. This command
counts the number of rows in the current file (which should be a
2DA file) that have at least as many columns as the required
column count and stores the result in the variable. |
or |
LOOKUP_IDS_SYMBOL_OF_INT variable idsFile value |
The symbolic constant associated with value in idsFile (which may
contain user variables) is stored
in variable. If that doesn't work, value is stored in variable.
Example:
LOOKUP_IDS_SYMBOL_OF_INT foo ~spell~ 1101
SPRINT myfile "SPELL"
LOOKUP_IDS_SYMBOL_OF_INT bar ~%myfile%~ (0x44c + 1)
LOOKUP_IDS_SYMBOL_OF_INT baz ~spell~ 77777
Both foo and bar are CLERIC_BLESS while baz is
777777. |
or |
COMPILE_BAF_TO_BCS |
The current file, which must be a valid BAF script, is compiled
to a BCS. In general you should use the COMPILE
TP2 Action instead, unless you are using other patch commands
to modify the file under consideration. |
or |
DECOMPILE_BCS_TO_BAF |
The current file, which must be a valid BCS script, is decompiled
to a BAF. |
or |
DECOMPILE_DLG_TO_D |
The current file, which must be a valid DLG file, is decompile
to a textual D file (with string refs and no comments). Once you
have a D file you can use other patch commands to change the
actions and triggers around. You should use D actions (like
REPLACE_ACTION_TEXT instead whenever possible. |
or |
COMPILE_D_TO_DLG |
The current file, which must be a valid D file that defines
a single DLG file (via an obvious BEGIN action) is
compiled to a DLG. Typically this is only used after a
DECOMPILE_DLG_TO_D. |
or |
REPLACE_EVALUATE findRegexp BEGIN
patch list END replaceRegexp |
For every instance of the regexp findRegexp found, the
patch list is evaluated (with the variable MATCHi set to
the ith matched group in findRegexp), variable substitute is performed
on replaceRegexp, and then findRegexp is replaced by replaceRegexp. Any
writes dones by the patch list (e.g., SAY or
WRITE_ASCII) are ignored: SET should be the main
component of the patch list. For example:
COPY ~nice.baf~ ~mean.baf~
REPLACE_EVALUATE
~Give(\([0-9]+\),\([0-9]+\))~
BEGIN
SET "RESULT" = ("%MATCH1%" + "%MATCH2%") / 2
END
~Take(%RESULT%)~
This COPY TP2 Action would replace Give(10,20) with
Take(15). |
or |
ADD_MAP_NOTE xCoord yCoord color String |
If the file currently being patched is an ARE area file, this
patch command adds a map note to it. Valid colors include: gray,
violent, green, orange, red, blue, darkblue, lightgray.
Example:
COPY_EXISTING ~ar0202.are~ ~override/ar0202.are~
ADD_MAP_NOTE #123 #777 ~violet~
~This is my new map note! Yippee!~
Special thanks to Japh for coding this feature. |
or |
ADD_KNOWN_SPELL splName spellLevel spellType |
When applied to a CRE file, this patch causes the given spell to
be known. Note that spellLevel counts from 0 (e.g., you should say
#2 for a third-level Fireball). Possible values for spellType are
priest, innate and wizard. Example:
COPY_EXISTING ~some.cre~ ~override/some.cre~
ADD_KNOWN_SPELL ~SPPR314~ #2 ~priest~
// Unholy Blight is now known as a 3rd level priest spell
Special thanks to Japh for coding this feature. |
or |
REMOVE_KNOWN_SPELL splName list |
When applied to a CRE file, this patch causes all of the
listed spells to be removed. Example:
COPY_EXISTING ~aerie.cre~ ~override/aerie.cre~
REMOVE_KNOWN_SPELL_KNOWN ~sppr101~ ~sppr102~
Special thanks to Japh for coding this feature. |
or |
ADD_CRE_ITEM itmName #charge1 #charge2 #charge3 flags slot [ EQUIP ] [ TWOHANDED ] |
See the ADD_CRE_ITEM tutorial. |
or |
INNER_PATCH buffString BEGIN patch list END |
Any WeiDU variables inside %s within buffString are replaced by
their values. All of the patches given are evaluated as if the
contents of the current file were buffString. Any modifications to
buffString are thrown away (making this mostly useful for reads).
Example:
INNER_PATCH "ABC" BEGIN
READ_BYTE 0x2 "myvar"
END
PATCH_PRINT "myvar is %myvar%"
This sequence will always print myvar is 67 (since 67 is the ASCII
code for C). |
or |
INNER_PATCH_FILE resource BEGIN patch list END |
Any WeiDU variables inside %s within resource are replaced by
their values. If the resulting resource is present in the game or in the
override folder, the patches given are evaluated as if the
current file were that resource. If not, nothing happens. Any
modifications to that resource are thrown away (making this mostly useful
for reads).
Example:
INNER_PATCH_FILE "SW1H01.ITM" BEGIN
READ_BYTE 0x1 "myvar"
END
PATCH_PRINT "myvar is %myvar%"
This sequence will always print myvar is 84 (since 84 is the ASCII
code for T and SW1H01.ITM starts with ITM). |
or |
INNER_ACTION BEGIN TP2 Action list END |
See the INNER_ACTION tutorial, but loosely the current
COPY is paused, the given TP2 Actions are executed, and
then the current COPY is resumed. Note that an
INNER_ACTION should never modify a file that is being modified by
the current action. For example, never put APPEND foo.2da inside of
COPY_EXISTING foo.2da . More formally, if the inner action and the
outer action both modify the same file, the results are undefined. |
|
when |
|
A when clause gives you local control over when a
COPY, COPY_EXISTING or APPEND_COL happens. If the
COPY or COPY_EXISTING contains multiple files, each one
is checked against the when clauses separately. |
is |
IF_SIZE_IS fileSize |
True if the input file size is
fileSize. |
or |
IF regexp |
True if the input file contains
regexp. |
or |
UNLESS regexp |
False if the input file contains
regexp. |
or |
BUT_ONLY_IF_IT_CHANGES |
True only if the file is actually
changed by patching actions. Unlike all other when clauses, this
one is evaluated just before the result would be written out to the disk. |
|
value |
|
An expression that evaluates to an integer. See
--debug-value. |
is |
integer |
An absolute location or amount. You may format your numbers
in decimal, hex, octal or binary. Use 0x for hex, 0o for octal and 0b for
binary. |
or |
( value ) |
|
or |
value + value |
Addition. |
or |
value - value |
Subtraction. |
or |
value * value |
Multiplication. |
or |
value / value |
Division. Division by zero yields
the value zero. Briefly, fractions are dropped and the result is an integer
(so 11 / 6 = 1). More technically, ``this division rounds the real quotient
of its arguments towards zero'' -- see
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html
for more information. |
or |
value ** value |
Exponentiation. The first
value is raised to the power of the second. This is done by converting both
to floating point numbers, calculating the exponent, and converting the
answer back to a 32-bit integer. If anything goes wrong the value zero is
returned or the result is undefined. |
or |
value ** ( value value ) |
Fractional exponentation. a ** (b c) yields a raised to the
power of (b/c). All of the internal operations are done in floating
point. If anything goes wrong, zero is returned or the result is
undefined. Example:
SET x = 100 ** 2
SET y = 100 ** (1 2) // square root of 100 = 10
SET z = 100 ** (1 3) // cube root of 100 = 4.64
PATCH_PRINT "w = %w%, x = %x%, y = %y%, z = %z%"
yields x = 10000, y = 10, z = 4. |
or |
value = value |
Integer Equality. If the two
values evaluate to equal integers, the result is 1. Otherwise, the result
is 0. See STRING_COMPARE for comparing Strings. Synonym:
==. |
or |
NOT value |
Negation. If the value is 0, the result is 1.
Otherwise the result is 0. |
or |
value != value |
Integer Disequality. If
the two values evaluate to equal integers, the result is 0. Otherwise the
result is 1. See STRING_COMPARE for comparing Strings. |
or |
value OR value |
Disjunction. If either value is
non-zero, the result is 1. Otherwise, the result is 0. Synonym: ||. |
or |
value AND value |
Conjunction. If both values are
non-zero, the result is 1. Otherwise, the result is 0. Synonym: &&. |
or |
value BAND value |
Bitwise And.
0b101 BAND 0b110 = 0b100. Synonym: &. |
or |
value BOR value |
Bitwise Or.
0b101 BOR 0b110 = 0b111. Synonym: |. |
or |
value BXOR value |
Bitwise Exclusive Or.
0b101 BXOR 0b110 = 0b011. Synonym: ^^ . |
or |
BNOT value |
Bitwise Not.
BNOT 0b111 = 0b1111111111111111111111111111000. Synonym: ~ . |
or |
value BLSL value |
Bitwise Logical Shift Left.
0b101 BLSL 2 = 0b10100. Synonym: <<. |
or |
value BLSR value |
Bitwise Logical Shift Right.
0b101 BLSR 2 = 0b1. Synonym: >>. |
or |
value BASR value |
Bitwise Arithmetic Shift Right.
This is an arithmetic shift: the sign bit of the first value is replicated
and inserted in the vacated bits. 0b101 BASR 2 = 0b1. |
or |
value > value |
If the first value is
greater than the second, the result is 1. Otherwise, the result is 0. |
or |
value >= value |
If the first value is
greater than or equal to the second, the result is 1. Otherwise, the result
is 0. |
or |
value < value |
If the first value is
less than the second, the result is 1. Otherwise, the result
is 0. |
or |
value <= value |
If the first value is
less than or equal to the second, the result is 1. Otherwise, the result
is 0. |
or |
value ? value : value |
An expression-valued conditional. If the first value is not 0 then the
second value is evaluated and returned, otherwise the third value is
evaluated and returned. |
or |
String STRING_COMPARE String |
This expressione valuates to 0 if and only if its two string arguments are
equal (have the same length and the same contents). variables
within the strings (e.g., ``%mykit%'') are replaced by their values.
Note that variables that you want expanded must be put in %'s,
otherwise the raw text will be used.
You may use STR_CMP as a synonym for STRING_COMPARE. This
function works just like C's strcmp. |
or |
String STRING_COMPARE_CASE String |
As STRING_COMPARE, but the comparison ignores case. That is,
"ANOMEN" and "aNoMeN" are considered equal. |
or |
String STRING_MATCHES_REGEXP String |
As STRING_COMPARE_CASE, but the second string is treated as a
regexp. Thus "AR1005" STRING_MATCHES_REGEXP "AR[0-9]+"
evaluates to 0 (``no difference''). You may use
STRING_COMPARE_REGEXP as a synonym. |
or |
String STRING_CONTAINS_REGEXP String |
As STRING_MATCHES_REGEXP, but it evaluates to 0 if the first string
contains the second regexp. Thus "AR1005" STRING_CONTAINS_REGEXP
"[w-z]" evaluates to 1 (``mismatch''). |
or |
RANDOM ( value value ) |
A random-number generator. The first value is the lower bound, the
second value is the upper bound. A random integer between the lower bound
and the upper bound (inclusive) is returned. Thus RANDOM(3 5) can
return 3, 4 or 5. If the lower bound is greater than the upper bound, zero
is returned. See also RANDOM_SEED. |
or |
FILE_CONTAINS fileName regexp |
Evaluates to 1 if
the file fileName contains the regular expression regexp
and 0 otherwise. Case is ignored. |
or |
FILE_CONTAINS_EVALUATED ( fileName varsRegexp ) |
First, all WeiDU variables enclosed in %s in varsRegexp and
fileName are
substituted. The expression is 1 if the resulting regexp occurs
in fileName and 0 otherwise. If fileName does not exist or has
size 0, the result is 0. The comparison ignores case. See also
FILE_CONTAINS. Example:
COPY_EXISTING_REGEXP ~.*\.CRE~ ~override~
READ_BYTE 0x273 class
READ_ASCII 0x280 deathvar
PATCH_IF (class = 14) AND // class 14 = CLERIC_MAGE
(NOT FILE_CONTAINS_EVALUATED(~pdialog.2da~ ~%deathvar%~))
THEN BEGIN
ADD_CRE_ITEM ~POTN08~ #10 #10 #10 ~IDENTIFIED~ ~INV15~
END
BUT_ONLY_IF_IT_CHANGES
The example gives ten healing potions to all cleric-mages who cannot join
the party. Notably it excludes Aerie
since she has the death variable Aerie and pdialog.2da contains
AERIE. |
is |
FILE_EXISTS filename |
Evaluates to 1 if the file exists in the
filesystem and has non-zero size and evaluates to 0 otherwise. |
or |
FILE_EXISTS_IN_GAME filename |
Evaluates to 1 if the file
exists as a game resource and has non-zero size. Evaluates to 0 otherwise.
BIFFs and the override directory are searched in the standard
manner. Evaluates to 0 for a file that does not exist but has been
ALLOW_MISSING'd. |
or |
FILE_MD5 filename md5sum |
Evaluates to 1 if the file exists
and has the given MD5 checksum. Evaluates to 0 otherwise. Two different
files are exceptionally unlikely to have the same MD5 checksum. In any
event, the discovered checksum is printed to the log. If the file does not
exist, it evaluates to 0. |
or |
FILE_SIZE fileName fileSize |
Evaluates to 1 if the
size of the file fileName is exactly fileSize. Evaluates to 0
otherwise. |
or |
%variable% |
The value of the variable is used. |
or |
EVALUATE_BUFFER variable |
User variables inside the given string are evaluated one additional
time. You may prepend EVALUATE_BUFFER when a value is
called for and you would normally use a string. You may also use it for
SET and SPRINT statements. Example:
SPRINT x ~y~
SET y = 5
SPRINT z EVALUATE_BUFFER ~tricky %%x%%~
SET EVALUATE_BUFFER "%x%" += 77
PATCH_PRINT "y is %y% ; z is %z%"
This prints out y is 82 ; z is tricky 5. You may also do hackery like
FILE_SIZE "myfile" "%%indirection%%". Be very careful with this
feature. |
or |
%WEIDU_ARCH% |
The special variable WEIDU_ARCH
is set to either "x86" or "mac" at WeiDU startup and can be used to
determine the underlying system architecture. |
or |
%WEIDU_OS% |
The special variable WEIDU_OS is set to either
"win32" or "osx" or "unix" at WeiDU startup and can be used to
determine the underlying operating system. |
or |
variable |
The value of the variable is used.
In a patch value, you may use either %myvar% or
myvar to get the value of a variable, provided that your variable's
name is not the same as a WeiDU syntactic keyword or known
constant. Also note that while it is common to ``call out''
variables by putting quotation marks around them, this is not necessary
if the variable is unambiguous. Thus the following three patches
are all equivalent:
SET "x" = "%y%" + "%z%" // these all
SET "x" = "y" + "z" // do the
SET x = y + z // same thing
|
or |
NAME1 |
The offset within an infinity engine resource where the unidentified general name (e.g., "Battle Axe") is stored. |
or |
NAME2 |
The offset within an infinity engine resource where the identified general name (e.g., "K'logarath +4") is stored. |
or |
UNIDENTIFIED_DESC |
The offset within an infinity engine resource where the unidentified description (e.g., "The hand axe or throwing axe is also known as a hatchet ...") is stored. |
or |
IDENTIFIED_DESC |
As above ... ("Clans have gone to war to possess K'log...") |
or |
BIO |
As above ... NPC Biography |
or |
... |
Almost everything in SNDSLOT.IDS or SOUNDOFF.IDS
works as well. |
|
variable |
|
A variable is a textual name that holds a
value. Variables are usually set with READ_BYTE,
SET or SPRINT. |
is |
string |
You may name the variable whatever you like, but stay
away from the special characters used in regexps. When you want to
obtain the value of a variable, enclose it in %s.
Example: If a file contains the two binary integers 33 and 77, then after
executing:
READ_LONG 0 ~myvar~
WRITE_LONG 4 ( ~%myvar%~ + 11 )
The file will contain the two binary integers 33 and 44. |
-
**, 8, 8
- --append, 5
- --ask-every, 5
- --autolog, 5
- --automate, 5
- --automate-min, 5
- --backup, 5
- --bcmp-from, 5
- --bcmp-orig, 5
- --bcmp-patch, 5
- --bcmp-to, 5
- --biff, 5
- --biff-get, 5
- --biff-get-rest, 5
- --biff-name, 5
- --biff-str, 5
- --biff-type, 5
- --biff-value, 5
- --biff-value-at, 5
- --cmp-from, 5
- --cmp-to, 5
- --continue, 5
- --dcmp-from, 5
- --dcmp-to, 5
- --debug-assign, 5
- --debug-value, 5
- --extract-kits, 5
- --forceify, 5
- --ftlkin, 5
- --ftlkout, 5
- --full-from, 5
- --game, 5
- --list-biffs, 5
- --list-eff, 5
- --list-files, 5
- --log, 5
- --logapp, 5
- --make-biff, 5, 6
- --make-tlk, 5
- --max, 5
- --min, 5
- --noautoupdate, 5
- --nocom, 5
- --nofrom, 5
- --nogame, 5
- --noheader, 5
- --noselfupdatemsg, 5
- --out, 5
- --reinstall, 5
- --remove-biff, 5, 6
- --script-style, 5
- --search, 5
- --strapp, 5
- --strfind, 5
- --string, 5
- --tcmp-from, 5
- --tcmp-to, 5
- --testtrans, 5
- --text, 5
- --tlkcmp-from, 5
- --tlkcmp-to, 5
- --tlkcmp-use-strings, 5
- --tlkin, 5
- --tlkmerge, 5
- --tlkout, 5
- --toplevel, 5
- --traify, 5
- --traify-tlk, 5
- --trans, 5
- --transin, 5
- --transitive, 6, 6
- --transref, 5
- --uninstall, 5
- --update-all, 5
- --yes, 5
- 2DA, 13
- <<, 8
- >>, 8
- ?, 8
- ACTION_IF, 8
- ADD_CRE_ITEM, 9.12
- ADD_GAME_NPC, 9.6
- ADD_KIT, 8
- ADD_KNOWN_SPELL, 8
- ADD_MAP_NOTE, 8
- ADD_MUSIC, 8
- ADD_PROJECTILE, 8
- ADD_STATE_TRIGGER, 4
- ADD_STORE_ITEM, 9.5
- ADD_TRANS_ACTION, 4
- ADD_TRANS_TRIGGER, 4
- ALLOW_MISSING, 8
- ALWAYS, 8
- AND, 8
- APPEND, 4
- APPEND_COL, 8
- APPEND_EARLY, 4
- APPEND_FILE, 8
- APPENDI, 4
- APPLY_BCS_PATCH, 8
- APPLY_BCS_PATCH_OR_COPY, 8
- ASK_EVERY_COMPONENT, 8
- AT_EXIT, 8
- AT_INTERACTIVE_EXIT, 8
- AT_INTERACTIVE_UNINSTALL, 8
- AT_UNINSTALL, 8
- AUTHOR, 8
- AUTO_TRA, 8
- BACKUP, 8
- BAND, 8
- BASR, 8
- BCS, 13
- BEGIN, 4
- BIFF, 13
- BLSL, 8
- BLSR, 8
- BNOT, 8
- BOR, 8
- BUT_ONLY_IF_IT_CHANGES, 8
- BXOR, 8
- CHAIN, 4
- CHAIN2, 4
- COMPILE, 8
- COMPILE_BAF_TO_BCS, 8
- COMPILE_D_TO_DLG, 8
- COPY, 8
- COPY_EXISTING, 8
- COPY_EXISTING_REGEXP, 8
- COPY_RANDOM, 8
- COPY_TRANS, 4
- COUNT_2DA_ROWS, 8
- Component, 8
- Component Flag, 8
- chainEpilogue, 4
- chainText, 4
- constant, 12
- D Action, 4
- D File, 4
- DECOMPILE_BCS_TO_BAF, 8
- DECOMPILE_DLG_TO_D, 8
- DELETE_BYTES, 8
- DEPRECATED, 8
- DESIGNATED, 8
- DEST_DIRECTORY, 8
- DEST_FILE, 8
- DEST_FILESPEC, 8
- DEST_RES, 8
- DLG, 3
- DO, 4
|
- EFF, 13
- EVALUATE_BUFFER, 8
- EXIT, 4
- EXTEND_BOTTOM, 4
- EXTEND_BOTTOM_REGEXP, 8
- EXTEND_TOP, 4
- EXTEND_TOP_REGEXP, 8
- EXTERN, 4
- FAIL, 8
- FILE_CONTAINS, 8
- FILE_CONTAINS_EVALUATED, 8
- FILE_EXISTS, 8
- FILE_EXISTS_IN_GAME, 8
- FILE_MD5, 8
- FILE_SIZE, 8
- FLAGS, 4
- FOR, 8
- FORBID_COMPONENT, 8
- FORBID_FILE, 8
- Forced String Reference, 4
- GLOB, 8
- GOTO, 4
- IF_SIZE_IS, 8
- INNER_ACTION, 9.14
- INNER_PATCH, 8
- INNER_PATCH_FILE, 8
- INSERT_BYTES, 8
- INSERT_FILE, 8
- INSTALL_BY_DEFAULT, 8
- INTERJECT, 4
- INTERJECT_COPY_TRANS, 7.5
- INTERJECT_COPY_TRANS2, 7.6
- ITM, 13
- inlined, 8
- JOURNAL, 4
- KEY, 13
- LANGUAGE, 8
- Language, 8
- LOOKUP_IDS_SYMBOL_OF_INT, 8
- MKDIR, 8
- Module Distribution, 10
- NO_LOG_RECORD, 8
- nonPausing, 4
- OR, 8
- optGlob, 8
- optNoBackup, 8
- PATCH_IF, 8
- PATCH_RANDOM_SEED, 8
- PRINT, 8
- Prompt Customization, 9.13
- patch, 8
- prompts.tra, 9.13
- RANDOM, 8
- RANDOM_SEED, 8
- READ_2DA_ENTRY, 8
- READ_ASCII, 8
- READ_BYTE, 8
- READ_LONG, 8
- READ_SBYTE, 8
- READ_SHORT, 8
- READ_SSHORT, 8
- READ_STRREF, 8
- REMOVE_KNOWN_SPELL, 8
- REPLACE, 4
- REPLACE_ACTION_TEXT, 4
- REPLACE_ACTION_TEXT_PROCESS, 4
- REPLACE_ACTION_TEXT_PROCESS_REGEXP, 4
- REPLACE_ACTION_TEXT_REGEXP, 4
- REPLACE_BCS_BLOCK, 8
- REPLACE_EVALUATE, 8
- REPLACE_SAY, 4
- REPLACE_STATE_TRIGGER, 4
- REPLACE_TEXTUALLY, 8
- REPLACE_TRIGGER_TEXT, 4
- REPLACE_TRIGGER_TEXT_REGEXP, 4
- REPLY, 4
- REQUIRE_COMPONENT, 8
- REQUIRE_FILE, 8
- REQUIRE_PREDICATE, 8
- regexp, 11
- replyText, 4, 4
- SAY, 4
- SAY_EVALUATED, 8
- SCRIPT_STYLE, 8
- SET, 8
- SET_2DA_ENTRY, 9.7
- SET_WEIGHT, 4
- SNPRINT, 8
- SOLVED_JOURNAL, 4
- SOURCE_DIRECTORY, 8
- SOURCE_FILE, 8
- SOURCE_FILESPEC, 8
- SOURCE_RES, 8
- SOURCE_SIZE, 8
- SPL, 13
- SPRINT, 8
- STR_CMP, 8
- STRING_COMPARE, 8
- STRING_COMPARE_CASE, 8
- STRING_COMPARE_REGEXP, 8
- STRING_CONTAINS_REGEXP, 8
- STRING_MATCHES_REGEXP, 8
- STRING_SET, 8
- STRING_SET_RANGE, 8
- String, 4
- SUBCOMPONENT, 9.11
- sayText, 4
- state, 4
- stateActionString, 4
- stateLabel, 4
- stateNumber, 4
- stateTriggerString, 4
- TLK, 13
- TP2, 8
- TP2 Action, 8
- TP2 File, 8
- TP2 Flag, 8
- TRA, 7.8
- text, 4
- transFeature, 4
- transition, 4
- transNext, 4
- transTriggerString, 4
- UNINSTALL, 8
- UNLESS, 8
- UNSOLVED_JOURNAL, 4
- USING, 8
- value, 8
- variable, 8
- WEIDU_ARCH, 8
- WEIDU_OS, 8
- WEIGHT, 4
- WHILE, 8
- WRITE_ASCII, 8
- WRITE_BYTE, 8
- WRITE_EVALUATED_ASCII, 8
- WRITE_FILE, 8
- WRITE_LONG, 8
- WRITE_SHORT, 8
- when, 8
|