The Journal Editor is used to generate journal entries. This generally is used to orchestrate a quest, with different stages and a potential reward.
This page will cover the journal in general, since there isn't a lot to it.
To access the Journal Editor you need to go to the top menu and select Tools → Journal Editor or press Ctrl + Alt + J.
The journal is stored as a GFF file called module.jrl in the module.
Journal Editor
The Journal Editor consists of a list of quests, which have under them a section of journal quest entries, similar to a conversation.
The main benefit of the Journal Editor is the ability to in one place have your quests named, and the stages of the quest identified, along with a reward and the order of quests in the journal.
Journal Quest
Once you hit the Add button, or right click Root and hit Add, you get a new Journal Quest. This consists of the main information and a comment field:
| Item | Description |
|---|---|
| Name | This is the name of the quest. It can be a string reference or basic text, and appears in the players journal as the title of the entry. It cannot change later (unless SetTlkOverride is used) so use separate quests for longer or multi-faceted quests, and use RemoveJournalQuestEntry as noted below to remove one before adding the subsequent. |
| Tag | This is a case sensitive tag to use in the script commands and for the variables set for the journal (see further down) |
| Priority | The priority of the quest purely affects the ordering in the journal when the client orders by Priority. |
| XP | 0 or higher, this is the XP awarded for the quest. If the conversation option is used it's awarded automatically, else if scripted use GetJournalQuestExperience to award it. |
| Comments | This is a hand written comment which isn't visible to player but useful for builders to make notes about the quest. |
Journal Quest Entry
Hit Add on a quest itself to add a entry. These can be cut and pasted, but not dragged since the order is reflected by the ID.
| Item | Description |
|---|---|
| ID | ID of the quest entry. You need to keep track of these yourself (you can't retrieve them from the journal in any way) commonly Bioware used increments of 10 or 5 meaning additional entries or smaller updates are easier to "slot in". |
| Finish Category | If checked the journal entry will appear in Completed Quests tab instead of Quests tab, and essentially be marked as done. Completed Quests tab example: |
| Text | The text to show in the journal. There are limits to this, but it's reasonably large. It can be a string reference. The editor doesn't allow this directly it seems (in which case you can edit it in the GFF fields). |
Using Journal Quests
There are two ways to interact with journal quests; conversations (under Other Actions) and scripts.
Updates will flag "Your journal has been updated. XXXXXX" with XXXXXX being the quest title, but only if the players journal isn't open at the time.
Conversation Actions
The conversation option can only set it for the current player and is very much a "set and forget". It does award XP but since it only interacts with the sole player conversing it can lead to odd situations in multiplayer games.
It is really recommended to use script functions, which is also a useful way to check for quest statuses (and using Conversation Variables can really cut down the number of scripts!).
Journal Script Variables
The game automatically sets variables for quests as well (it uses these internally to track the quest states too!); setting these variables is technically doable but much easier to just let the game functions below do it.
The example is shown in the screenshots underneath.
| Variable Prefix | Example with quest M1Q5_Ergus | Type | Example | Decoded Example | Notes |
|---|---|---|---|---|---|
| NW_JOURNAL_ENTRY | NW_JOURNAL_ENTRYM1Q5_Ergus | Local Integer | 10 | 10 | This is the state of the journal, by ID. This is the most useful variable to check a quests current progress. |
| NW_JOURNAL_DATE | NW_JOURNAL_DATEM1Q5_Ergus | Local Integer | 461136 | Day 5, Month 6, 1372 Calculation: Base Day: 1 Year: 1372 * 12 * 28 = 460993 Month: 6 * 28 = 168 (= 461161) Day: +5 = 461166 | This is the calendar day the quest was set. This is calculated by the amount of days since year 0. There are always 28 days and 12 months in a NWN year. Calculation: 1 + (Year * 12 * 28) + (Month * 28) + Day of the month. Pseudocode to convert back: nCalendarDay = 461136; nDay = (nCalendarDay % 28); nDay += 1; nMonth = (nCalendarDay % 12); nMonth += 1; nYear = nCalendarDay; |
| NW_JOURNAL_TIME | NW_JOURNAL_TIMEM1Q5_Ergus | Local Integer | 1670576 | 13:01 Calculation (based on 2 hours per minute): Hours: 13 * 2 * 60 * 1000 = 1560000 Minutes: 1 * 60 * 1000 = 60000 (1620000) Seconds/Milliseconds: Total of 50576 left so must be 50 seconds, 576 milliseconds. | This is the time of the quest on that day. This is calculated by milliseconds in the day, so depends on the HoursToSeconds value the module has. NB: Hours are 0 through 23, minutes 0 through 59 and seconds 0 through 59, and milliseconds 0 through 999. Calculation: (Hour * Hours per minute * 60 * 1000) + (Minutes * 60 * 1000) + (Second * 1000) + Millisecond Pseudocode: nTimeOfDay = 1670576; nMillisecond = (nTimeOfDay % 1000); nTimeOfDay /= 1000; nSecond = (nTimeOfDay % 60); nTimeOfDay /= 60; nMinute = (nTimeOfDay % HoursToMinutes(1)) nTimeOfDay /= HoursToMinutes(1); nHour = nTimeOfDay; |
Script Functions
The main script functions are:
- AddJournalQuestEntry - This actually means set the relevant quest to the given state - if the node is a completed quest state the journal moves to the Completed Quests part of the journal. The tag is used as szPlotID and the state is the ID number. Quests do not have to go up in value and can be set to anything allowing branching or nonlinear quests by using the bAllowOVerrideHigher setting to be TRUE
- You can also set the quest to be present for all players, or all party members, the former great for simple MP single party modules, and latter of which is very useful in other situations
- RemoveJournalQuestEntry - This simply removes the given quest. The quest is even removed if completed. It can be used to use quests that directly get replaced by another quest entirely - for instance if you want a quest to be titled "Murder Investigation" but later "Capture Roger for Murder!" so you don't reveal it too early.
- GetJournalQuestExperience - This is used to retrieve the "XP" field and can be used to find what was set on a journal for quest completion. You could also multiply or add XP to this if needed to boost it (eg; optional objectives) or divide or add or subtract XP if a quest was partially completed.
- Note that AddJournalQuestEntry even on the final state doesn't award XP automatically.
When a quest is added feedback is given to the player and a notification sound occurs and the journal flashes. New quest updates are outlined in orange. By default the journal is ordered by Date - the last entries to get updates are put at the top.
The date in the journal is automatic based on the in game clock, a nice touch.
Did you know?
- There is a "Picture" identifier for each quest suggesting Bioware at one point was going to allow a picture to be used against each quest. The picture is not fully coded however and is missing some relevant files, so doesn't work even if the number is changed.
- It doesn't appear the GUI or MDL files that remain have space for the picture so who knows what it'd have looked like!
- The quest_default.tga (included in the toolset beta) which would have been the default image is a 256x128 image so presumably a kind of banner image? Possibly the journal had a very different design at the time.
- Bioware was going to code a way for DMs to add and edit journal entries. This was called "World Entries" and in fact the network functionality still remains as does the GUI information in jnl_wld_dm_new.gui but there is no available way to invoke it.







