Quest Showcase
Moderator: Lead Developers
-
- Developer
- Posts: 4
- Joined: Thu Sep 04, 2014 1:25 pm
Quest Showcase
This is my first quest showcase. It goes as follows:
-Go to St. Delyn's Plaza in Vivec and talk to the Khajiit called Dro'Vakrin.
-Follow through his dialogue until he gives you the amulet and scroll.
-Go to St. Delyn North-Waist One (the cell has a ghost in it in the base game). Here you will find Heedal, although he won't be in the mood to chat.
-Equip the amulet, it will take you to a cell where you will find Heedal's soul attacking you. Here the quest splits.
Good Path:
-Cast the scroll on Heedal's soul. You will be returned to Vivec.
-Go talk to Dro'Vakrin. He will give you a ring. When you leave the Plaza he will move to being in Waist one with Heedal.
Evil Path:
-Kill Heedal's soul. You will be returned to Vivec and Heedal will die.
-Go talk to Dro'Vakrin. When he realises you killed Heedal he will attack you (he will do the same if you killed Heedal without entering his mind).
-Go to St. Delyn's Plaza in Vivec and talk to the Khajiit called Dro'Vakrin.
-Follow through his dialogue until he gives you the amulet and scroll.
-Go to St. Delyn North-Waist One (the cell has a ghost in it in the base game). Here you will find Heedal, although he won't be in the mood to chat.
-Equip the amulet, it will take you to a cell where you will find Heedal's soul attacking you. Here the quest splits.
Good Path:
-Cast the scroll on Heedal's soul. You will be returned to Vivec.
-Go talk to Dro'Vakrin. He will give you a ring. When you leave the Plaza he will move to being in Waist one with Heedal.
Evil Path:
-Kill Heedal's soul. You will be returned to Vivec and Heedal will die.
-Go talk to Dro'Vakrin. When he realises you killed Heedal he will attack you (he will do the same if you killed Heedal without entering his mind).
- Attachments
-
- heedal1.ESP
- Cleaned with ESP Cleaner
- (19.88 KiB) Downloaded 125 times
Hi,
I don't suppose you've been summoned by our Resident [url=http://tamriel-rebuilt.org/old_forum/profile.php?mode=viewprofile&u=13226]Rats[/url]?
Here are some mostly technical comments on your mod:
dialogue entries:
"Greetings. I wonder if you could help Jo'Vakrin's friend Heedal."
- introduction hooks for TR quests would usually cut a bit less straightforward unless you were sent to the character,
"I have decided not to help Jo'Vakrin for the time being."
- I'd usually advocate either making refusal journal entries Finished (and checking Restart on the journal entries where you accept), or providing a more definitive refusal option than "maybe later" (to remove it from the quest index if the player plans never to do it)
"I have killed Heedal's soul and with it, Heedal. I should tell Jo'Vakrin of this."
"I have killed Heedal. I should tell Jo'Vakrin what has become of his friend."
- journal entries in general should assume as little as possible about the PC and avoid telling the player what to do when it's not necessary, especially when they might want to decide otherwise. Quest failure journal entries also benefit from being Finished for the same reason
- you'd really expect the Heedal to say something other than the default greetings after he's cured
(or if he's unaware of the PC's role, to at least have answers to the relevant topics)
Entries and cleaning :
- Vanilla entries that are edited when you create new entries (Greeting 0 "You say you've been attacked by assassins? ", Greeting 5 "Pardon me. But there's a very strange man in my house, and he won't leave. Will you go get him out of there, please?") need to be cleaned (eg with TESAME)
- New entries mustn't be at the very bottom (and preferrably not at the very top either) of the entries list on a topic or Greeting, because of issues when several mods editing dialogue are used together. New entries can be placed inbetween any two existing entries, and those two entries then cleaned
scripts:
general:
- it's good practice to stay consistent with whitespaces or lack thereof within the same lines, eg in NM_Heedal :
"if ( GetDeadCount NM_Heedal_Angry > 0 )" has two whitespaces
"if (OneDeath != 1 )" has no whitespace after the opening parenthesis but one before the closing one
these inconsistencies are known to very rarely cause issues, so even if most of the time they're fine they should be avoided,
- standard is to keep the opening "If" and their corresponding "Endif" at the same indentation level for readability;
extra ifs/endifs are easy to overlook and aren't necessarily picked up by the script engine when saving.
NM_Heedal_Jovakrin :
- "if ( GetDeadCount NM_Jovakrin > 0)" should use "OnDeath" instead, since "GetDeadCount" is known to be a very slow function in large savegames and shouldn't be called every frame.
NM_Heedal :
- here also "GetDeadCount" shouldn't be called every frame, and would need a one-time condition (or in other cases a "every X frames" condition). This NPC could more easily be killed when the _Angry version dies from a script on _Angry
- "if ( GetDeadCount NM_Heedal_Angry == 0 )" could have been an "Else" condition instead for performance
- "if ( GetDeadCount NM_Heedal_NPC > 0 )" : this one can use "OnDeath" since it's the NPC the script is attached to
NM_JovakrinTwo :
- Shouldn't the duplicate NPC have "nolore" too?
NM_NewJovakrin :
- Not sure I understand the reason why one NPC is replaced with a duplicate; is it only to change his position? If so there's a function for that (PositionCell - it can cause issues if used on a NPC that's never been encountered ingame, but that can't be the case here)
- If there was a real need for the duplication, both operations (enabling one NPC, disabling the other) could be done at the same time in this script when the player is detected as having left the cell
- these global scripts can and should terminate themselves whenever possible - this one is done when the swap happens, and shouldn't wait for the new NPC to be encountered to be Stopped. (note you have to save the script first, for the name to be recognised, to be able to use the StopScript line within the script itself)
nm_mindamulet_script :
- the two "if ( GetPCCell "Heedal's Mind" == 1 )" blocks can be grouped together
- same issue as above with GetDeadCount
Overall this works but I'd advise dealing with the GetDeadCounts, detecting the death of the _Angry version of the NPC from a script on itself, and using PositionCell to displace the questgiver instead of duplicating him.
As for the quest design I find some parts come out of the blue, having to go into the guy's mind and his friend having just made an amulet for that all seem somewhat arbitrary. That's probably acceptable for a showcase but the dialogue could still be developed a bit
and welcome!
I don't suppose you've been summoned by our Resident [url=http://tamriel-rebuilt.org/old_forum/profile.php?mode=viewprofile&u=13226]Rats[/url]?
Here are some mostly technical comments on your mod:
dialogue entries:
"Greetings. I wonder if you could help Jo'Vakrin's friend Heedal."
- introduction hooks for TR quests would usually cut a bit less straightforward unless you were sent to the character,
"I have decided not to help Jo'Vakrin for the time being."
- I'd usually advocate either making refusal journal entries Finished (and checking Restart on the journal entries where you accept), or providing a more definitive refusal option than "maybe later" (to remove it from the quest index if the player plans never to do it)
"I have killed Heedal's soul and with it, Heedal. I should tell Jo'Vakrin of this."
"I have killed Heedal. I should tell Jo'Vakrin what has become of his friend."
- journal entries in general should assume as little as possible about the PC and avoid telling the player what to do when it's not necessary, especially when they might want to decide otherwise. Quest failure journal entries also benefit from being Finished for the same reason
- you'd really expect the Heedal to say something other than the default greetings after he's cured
(or if he's unaware of the PC's role, to at least have answers to the relevant topics)
Entries and cleaning :
- Vanilla entries that are edited when you create new entries (Greeting 0 "You say you've been attacked by assassins? ", Greeting 5 "Pardon me. But there's a very strange man in my house, and he won't leave. Will you go get him out of there, please?") need to be cleaned (eg with TESAME)
- New entries mustn't be at the very bottom (and preferrably not at the very top either) of the entries list on a topic or Greeting, because of issues when several mods editing dialogue are used together. New entries can be placed inbetween any two existing entries, and those two entries then cleaned
scripts:
general:
- it's good practice to stay consistent with whitespaces or lack thereof within the same lines, eg in NM_Heedal :
"if ( GetDeadCount NM_Heedal_Angry > 0 )" has two whitespaces
"if (OneDeath != 1 )" has no whitespace after the opening parenthesis but one before the closing one
these inconsistencies are known to very rarely cause issues, so even if most of the time they're fine they should be avoided,
- standard is to keep the opening "If" and their corresponding "Endif" at the same indentation level for readability;
extra ifs/endifs are easy to overlook and aren't necessarily picked up by the script engine when saving.
NM_Heedal_Jovakrin :
- "if ( GetDeadCount NM_Jovakrin > 0)" should use "OnDeath" instead, since "GetDeadCount" is known to be a very slow function in large savegames and shouldn't be called every frame.
NM_Heedal :
- here also "GetDeadCount" shouldn't be called every frame, and would need a one-time condition (or in other cases a "every X frames" condition). This NPC could more easily be killed when the _Angry version dies from a script on _Angry
- "if ( GetDeadCount NM_Heedal_Angry == 0 )" could have been an "Else" condition instead for performance
- "if ( GetDeadCount NM_Heedal_NPC > 0 )" : this one can use "OnDeath" since it's the NPC the script is attached to
NM_JovakrinTwo :
- Shouldn't the duplicate NPC have "nolore" too?
NM_NewJovakrin :
- Not sure I understand the reason why one NPC is replaced with a duplicate; is it only to change his position? If so there's a function for that (PositionCell - it can cause issues if used on a NPC that's never been encountered ingame, but that can't be the case here)
- If there was a real need for the duplication, both operations (enabling one NPC, disabling the other) could be done at the same time in this script when the player is detected as having left the cell
- these global scripts can and should terminate themselves whenever possible - this one is done when the swap happens, and shouldn't wait for the new NPC to be encountered to be Stopped. (note you have to save the script first, for the name to be recognised, to be able to use the StopScript line within the script itself)
nm_mindamulet_script :
- the two "if ( GetPCCell "Heedal's Mind" == 1 )" blocks can be grouped together
- same issue as above with GetDeadCount
Overall this works but I'd advise dealing with the GetDeadCounts, detecting the death of the _Angry version of the NPC from a script on itself, and using PositionCell to displace the questgiver instead of duplicating him.
As for the quest design I find some parts come out of the blue, having to go into the guy's mind and his friend having just made an amulet for that all seem somewhat arbitrary. That's probably acceptable for a showcase but the dialogue could still be developed a bit
and welcome!
-
- Developer
- Posts: 4
- Joined: Thu Sep 04, 2014 1:25 pm
Okay, so I did what you said. There is one death count left, but it is in-cased in an on death, so it will only be called once. By less straightforward I guessed you meant that he should introduce himself first. I also added a bit of an explanation to the whole mind-amulet thing, but I don't know how you feel about people referencing some of the more obscure lore.
As for the user-name, I have no relation to Rats. The name comes from when I am playing Morrowind or Oblivion I can't bring myself to kill rats. In one game I somehow ended up with no calm spells, but a very long duration command spell, that ended up with me having about five rats following me at one point.
As for the user-name, I have no relation to Rats. The name comes from when I am playing Morrowind or Oblivion I can't bring myself to kill rats. In one game I somehow ended up with no calm spells, but a very long duration command spell, that ended up with me having about five rats following me at one point.
- Attachments
-
- Copy of NM_Heedal_Clean.esp
- (18.76 KiB) Downloaded 146 times
Good job cleaning things up, and the dialogue frames the quest better; now to pick nits:
- script NM_Heedal:
(you don't need the "OneDeath" variable and condition, because OnDeath (the function) only ever returns 1 for one frame)
However, since this NPC exists at all times and can be met first, you do need to condition this script so you don't get a quest journal entry upon his death if the PC didn't start the quest;
correspondingly, if Heedal was already killed before meeting the questgiver, you can either disable the start of the quest from dialogue entries (greeting & topics), or adapt the dialogue options.
- script NM_Heedal_Jovakrin:
same case: you shouldn't get a journal entry from this guy's death if you've never talked to him,
- script nm_mindamulet_script:
(you could boost Heedal's disposition from here to match his grateful dialogue)
if you accept the quest from Jovakrin, then kill Jovakrin (...), go to Heedal and try to use the amulet, it won't work - just want to point out that this is fine, since we don't as a rule account for the PC randomly killing non-hostile NPCs. (plus it makes sense that the amulet's divine element would refuse to work)
- script NM_NewJovakrin:
DoOnce is not needed since you terminate the script and thus can only perform the action once anyway.
(you could also check that the player didn't directly teleport back to "Vivec, St. Delyn Waist North-One" before moving the NPC there, but it's not too important - perfectly accounting for player teleportation sometimes isn't worth the trouble anyway)
- you might still want to disable teleportation ie Recall, Almsivi/Divine Intervention, from the cell "Heedal's mind". I think the DisableTeleporting/Enable... functions do work
- on syntax consistency in scripts: it also applies to commas - eg lines such as
since they use commas between arguments, should have a comma before the cell name too. Again, might not cause issues 99,9% of the time but good practice etc.
- bit of sentence missing/minor typos:
Greeting 5,
into his mind,
- script NM_Heedal:
(you don't need the "OneDeath" variable and condition, because OnDeath (the function) only ever returns 1 for one frame)
However, since this NPC exists at all times and can be met first, you do need to condition this script so you don't get a quest journal entry upon his death if the PC didn't start the quest;
correspondingly, if Heedal was already killed before meeting the questgiver, you can either disable the start of the quest from dialogue entries (greeting & topics), or adapt the dialogue options.
- script NM_Heedal_Jovakrin:
same case: you shouldn't get a journal entry from this guy's death if you've never talked to him,
- script nm_mindamulet_script:
(you could boost Heedal's disposition from here to match his grateful dialogue)
if you accept the quest from Jovakrin, then kill Jovakrin (...), go to Heedal and try to use the amulet, it won't work - just want to point out that this is fine, since we don't as a rule account for the PC randomly killing non-hostile NPCs. (plus it makes sense that the amulet's divine element would refuse to work)
- script NM_NewJovakrin:
DoOnce is not needed since you terminate the script and thus can only perform the action once anyway.
(you could also check that the player didn't directly teleport back to "Vivec, St. Delyn Waist North-One" before moving the NPC there, but it's not too important - perfectly accounting for player teleportation sometimes isn't worth the trouble anyway)
- you might still want to disable teleportation ie Recall, Almsivi/Divine Intervention, from the cell "Heedal's mind". I think the DisableTeleporting/Enable... functions do work
- on syntax consistency in scripts: it also applies to commas - eg lines such as
Code: Select all
Player->PositionCell 245, -186, -114, 0 "Vivec, St. Delyn Waist North-One"
Code: Select all
Player->PositionCell 3139, 3292, 15943, 0 "Heedal's Mind"
- bit of sentence missing/minor typos:
Greeting 5,
Code: Select all
Greetings, %PCName and welcome to Vivec. I am Jo'Vakrin, Witchhunter and that you are a seeker of adventure.
Code: Select all
Hopefully if will be
Code: Select all
I am forever it your debt, %PCName.
-
- Developer
- Posts: 4
- Joined: Thu Sep 04, 2014 1:25 pm
All in order-
Last remark: the questgiver's initial greeting has a [Talked to PC == 0] condition - you can't really rely on this function, generally because it resets after 72 hours, but in this case because the greeting is in Greeting 5. Meaning if the PC is diseased, ... or any other reason for this greeting to be skipped, and talks to the questgiver, they might never get access to the quest (because the Talked condition would get burned without getting the topic). Usually a quest state condition is used instead, or the greeting is put in Greeting 1.
(also aside: Heedal's cell is excessively bright, I assume due to added lamps. Oh and, I'd get flogged if I didn't mention that the olde "you are an adventurer" opening line is so overused as to now be no-no'd at TR, with the preferred explanation for the PC dipping their nose in everyone's business being none)
------------
That said you show good mastery of scripting/dialogue questing tools etc. so you have my recommendation for promotion!
Sadly no claims open this moment, but if you want to stroll through old (released) or new (WiP sections) areas you're welcome to post quest ideas.
Last remark: the questgiver's initial greeting has a [Talked to PC == 0] condition - you can't really rely on this function, generally because it resets after 72 hours, but in this case because the greeting is in Greeting 5. Meaning if the PC is diseased, ... or any other reason for this greeting to be skipped, and talks to the questgiver, they might never get access to the quest (because the Talked condition would get burned without getting the topic). Usually a quest state condition is used instead, or the greeting is put in Greeting 1.
(also aside: Heedal's cell is excessively bright, I assume due to added lamps. Oh and, I'd get flogged if I didn't mention that the olde "you are an adventurer" opening line is so overused as to now be no-no'd at TR, with the preferred explanation for the PC dipping their nose in everyone's business being none)
------------
That said you show good mastery of scripting/dialogue questing tools etc. so you have my recommendation for promotion!
Sadly no claims open this moment, but if you want to stroll through old (released) or new (WiP sections) areas you're welcome to post quest ideas.
Member Promoted for quests and scripting. Congratulations, and welcome to the team! Feel free to continue using this thread for questions or showcasing work of your own for critiques or constructive criticism.
Forum Administrator & Data Files Manager
[06/19/2012 04:15AM] +Cat table stabbing is apparently a really popular sport in morrowind
[August 29, 2014 04:05PM] <+Katze> I am writing an IRC bot! :O
[August 29, 2014 04:25PM] *** Katze has quit IRC: Z-Lined
[06/19/2012 04:15AM] +Cat table stabbing is apparently a really popular sport in morrowind
[August 29, 2014 04:05PM] <+Katze> I am writing an IRC bot! :O
[August 29, 2014 04:25PM] *** Katze has quit IRC: Z-Lined
- Dormichigan64
- Developer
- Posts: 173
- Joined: Thu Dec 26, 2013 10:27 pm
- Location: Stop trying to see where I live, you creepy bastard! (Kingston, Ontario)
-
- Developer
- Posts: 325
- Joined: Tue Jul 15, 2014 1:56 pm
- Dormichigan64
- Developer
- Posts: 173
- Joined: Thu Dec 26, 2013 10:27 pm
- Location: Stop trying to see where I live, you creepy bastard! (Kingston, Ontario)