Violet's Showcase

17 posts / 0 new
Last post
The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

Hello, I'm new (long time lurker, first time contributer).

This is my quest showcase, with the greatest .esp title to ever exist! Anyways, this was mostly just me teaching myself how2dialogue so it's nothing fancy or impressive, just a poor little sick Bosmer that needs you to "borrow" something for him. It takes place in the St. Seryn's Infirmary (I picked it in case you guys want to use it, as I know you're trying to finish up that area).

The Journal ID is "TR_m3_St_Elimiran", I hope this is the correct naming scheme (I guessed based on other ID's).

Hope you enjoy it! And please tell me if there's anything that'd improve the quest if you're so inclined, I wanted it to be simple so I can learn, but I'm by no means a great writer.

AttachmentSizeDate
Binary Data A quest showcase.16.04 KB2017-10-30 13:20
Asylum's picture
Asylum
Developer
Joined:
2016-02-05 22:51
Last seen:
6 days 20 hours ago

Hi,

Welcome to the team!
I have no experience is quests so i cant review this for you. But someone will check it out.

Also Check out the discord channel

The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

Thanks!

Rawr.

Mortimer's picture
Mortimer
DeveloperQuest Developer
Joined:
2016-06-10 21:48
Last seen:
1 day 2 hours ago

uh whoops, that entire area (st. seryn's) was renamed and shifted around, I'll take a look at it now, though

e: what files did you make this with? mainland.esm, and preview?

the most up to date files are under development->release files. this area is indoril-thirr, and you'll need mainland.esp (not esm) whenever you make TR quests in the future. the second part isn't a big issue now, but dialogue gets wacky if everything isn't perfectly lined up. don't use preview otherwise it breaks

Kevaar's picture
Kevaar
Lead DeveloperQuest DeveloperReviewer
Joined:
2016-01-19 19:35
Last seen:
14 hours 6 min ago

Hello, Violet! What Mortimer says is true; when you do any quest claims here, you'll want to keep the appropriate section file loaded, as well as TR_Mainland.ESP whenever working in areas usually covered by TR_Mainland. But for a showcase, I'm not going to worry about this; just an FYI for future work!

Now for the review; some of things I'm talking about here are TR specific things you wouldn't do in other mods; some are across the board.
 

 

 

Rot's picture
Rot
Lead DeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
16 min 48 sec ago

Welcome! A couple additional comments just from looking at the file:

You have full data for what looks like the original book id T_Bk_GospelOfSaintSerynTR, which means the book itself has been edited. This probably happened by clicking "Save" after double-clicking the book in the object list or in a cell. To avoid that you always want to click on "Cancel" for objects that aren't new. Otherwise you need to clean those objects out of your plugin, like with the cells and dialogue Kevaar mentioned - cleaning tutorial with TESAME
That's assuming you use the original object (if you wanted to make a duplicate, you'd just edit its ID, click save, and say yes when prompted - creates a new object without dirtying the original).
Not necessary for your showcase but scripting practice if you want it: it's better not to give the player unnecessary duplicate IDs of regular objects, so technically the best solution in this case is to replace the book in the cell with a scripted one (one that, if it ends up in your inventory, gives the player the normal book, starts another script to remove itself* and updates a global variable to let you know that this particular book was stolen).

Writing looks fine though you often have run-on/comma splices,
Examples from your file:

 

not hard to fix and something of a loose rule depending on how conversational the line is, but when in doubt it's better to respect it (for the mod or general writing).

The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

@Mortimer Okay, will do that when I bugfix/clean

@Kevaar The part about it being any book was intentional, though I might want to add some dialogue somewhere as to why he needs it (I haven't come up with a reason, but if I had to guess he might've been trying to impress some Temple girl or something.)

I actually didn't know Llevari was another patient (my fault for not scouting the area in game first), will add dialogue him too! 

Hurray, my guess at the ID scheme was close! :)

@Rot I tried cleaning it with TESTool, though I guess it wasn't at all thorough. XD Will download TESAME and clean it (thoroughly).

I'll address issues hopefully by the end of this week, and thanks to all of you for your time!

Rawr.

The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

NOTE: FILE NOT CLEAN YET

Uploading for posterity's sake, most of the bugs should be fixed now, more lines of dialogue and even a new way to complete the quest (now you can refuse to give the book to him, you ARE the one that stole it after all, not that he'll be thrilled or anything). Will probably playtest everything one more time tomorrow to make sure, before cleaning.

Side note: It'd make sense if he disappeared after a few days (maybe 2 or so) if you ratted him out, how would I go about scripting that? I don't really want to have it update the journal, though if it's mandatory for it to work then I can always rewrite. Is it just a 'Disable "NPC ID" for 'x' hours" command or is it more complicated than that? Thank you ahead of time.

EDIT: Almost forgot, I assume you want me to put the latest rumors/greetings inbetween the "BEGIN/END TR MAP 3 QUEST" placeholders?
While I found the placeholder for latest rumors, the closest one that I saw (probably missed it) in Greetings 5 was "BEGIN/END TR MAP 3 M3A3 QUEST GREETINGS", so I put the 2 unique greetings in that. Is there a filter option that'll allow me to filter for just placeholders?

AttachmentSizeDate
Binary Data A (not yet clean) quest showcase, part 2.19.69 KB2017-10-31 09:19

Rawr.

Rot's picture
Rot
Lead DeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
16 min 48 sec ago

It'd make sense if he disappeared after a few days (maybe 2 or so) if you ratted him out, how would I go about scripting that?

You can do this by adding a custom script on the NPC. A copy of the regular m3 or m4 NPC script to which you add for instance:
short DayTarget
at the top, and under that in the script,
If ( DayTarget > 0 )
   If ( DaysPassed > DayTarget )
     Disable
   Endif

Endif
In the dialogue results when the quest ends and you want to start the countdown, you put Set DayTarget to ( DaysPassed + 2 ) so that the script will be looking to disable him 2 days later.
edit: This guide has more scripting tips

Is there a filter option that'll allow me to filter for just placeholders?

Sort of, you can filter for speaker "dialog placeholder" only but then you won't see anything other than placeholders or be able to add new lines,
you can search for BEGIN in Edit->Find Text to find what the placeholder you want is called and then when in Greetings 5, press all the keys in order (B, E, G, I, N, space if needed, etc) to navigate up to it.

The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

Okay, I believe I cleaned everything that needed it (probably forgot something as it's almost always the case), as well as removed the dependency to TR_Preview. If you would do me the honor of another round of review.

AttachmentSizeDate
Binary Data Clean The Showcasiest Showcase to ever Showcase Showcasefully.ESP17.44 KB2017-11-02 06:08

Rawr.

Kevaar's picture
Kevaar
Lead DeveloperQuest DeveloperReviewer
Joined:
2016-01-19 19:35
Last seen:
14 hours 6 min ago

I apoligze for the amount of time it's taken to get back to this. I'm going to try to give it a look tomorrow.

The Violet Euphemism's picture
The Violet Euphemism
Joined:
2017-10-30 13:01
Last seen:
10 hours 33 min ago

No problem.

Rawr.

Kevaar's picture
Kevaar
Lead DeveloperQuest DeveloperReviewer
Joined:
2016-01-19 19:35
Last seen:
14 hours 6 min ago

Review Deux Two!
Overall, it looks like you might've been overzealous in your cleaning and so broke the quest in removing some references you needed....oops.

I also took the time to go through and list some grammar issues, and took a look at your script. You seem to have a recurring issue with run-on sentences, so I would read up the rules for that. As for the script, did you make a new local variable for it, DayTarget? If so you might have some problems getting this one to run as is, but I wanted to ask that before poking much further at it.

File cleaning:
Still have a ref to "T_Bk_GospelOfSaintSerynTR", and two TR NPCs that should be removed.

The placeholder response in "latest rumors" should also be cleaned.

It looks like you may have cleaned the Interior ref for St. Seryn's Infirmary? As your Elmiran NPC currently isn't placed anywhere in the world now. Edits under Exterior or Interior cells have to do with item and creature/NPC placement (among some other things), while edits showing up under NPCs is merely for stats and scripts for those NPCs.

You also seem to have cleaned all the Greetings, so Elimiran no longer has his own unique greeting. This is a further problem as now the topic "Elmiran" never appears to the player. (Either you have to have an NPC with a Response for the topic say it, or add it with an "AddTopic Elmiran" to a script somewhere.)

I want to say these errors are from not having a full understanding of the data structure of Morrowind, so here's a quick crash course:

 

In general, cleaning is to remove dirty references. In it's code, the game is organized as a long list of objects that then has a bunch of information tagged to each one, something like this:

1. Potatoes - COLOR brown, TASTE meally
2. Carrots - COLOR orange, TASTE crisp
3. Celery - COLOR green, TASTE crisp

Whenever you come in an add a new item, or change an existing item, the engine gets confused, as it wasn't designed very well for this (surprisingly enough). So if you added an item Meat to this data structure without cleaning it, it might do this:

1. Potatoes - COLOR brown, TASTE mealy
2. Carrots - COLOR orange, TASTE crisp
3. Meat - COLOR red, TASTE green
4. Celery - COLOR crisp, TASTE ???

Now whenever you have a script in the game that tries to call reference #3, it gets meat instead of celery and gets very confused. Sometimes too it will then try to call the taste of celery, and either get nothing or whatever meat's taste was supposed to be. When you clean a mod, you are basically saying, no, create a new entry for meat at the bottom of the list, don't move Celery out of its slot, and don't go rearranging the descriptors for these foods on me!--Obviously it's a little more complicated than that, but I find that's a good image to keep in your head to understand what's going on behind the scenes.

The second thing to know is how the cleaner works. In general, it separates all objects in the game into buckets like Items, Dialogue Responses, Interiors, etc, and then checks each of these buckets to see if anything new got put into it. Our job as the dev is to look at each thing it identified as being new to the bucket and saying whether or not it should be in there.

As some of the things we work with seem like they could belong in several buckets, it's also important to understand what gets placed where. Some of the most common that show up for quest claims:

NPC Bucket: changes to an individual NPC's stats, inventory, AI settings, what script is attached. You should remove refs to NPCs if you touched none of these things.
Interior Bucket NPC and item placement (including walls, furniture, lighting effects, etc) within this interior. Do not remove an Interior ref if you placed an item in that Interior.
Exterior Bucket NPC and item placement within that cell (cell = square on the outdoor gridmap), and a few other things like renaming cells or changing the land shape (heightmap) you probably don't need to worry about. Remove an Exterior ref if you did none of these things.
Item Bucket: new items, or changes to an existing item's stats, but NOT their placement or use in a script. Remove refs to Items if you didn't touch their stats. As a TR dev where most of your assets are given to you in Tamriel_Data and used in multiple locations, you should never see anything in this category unless it's a brand new item you made for your quest.
Script Bucket edits in the script window itself. Items, NPCs, other scripts, etc, called in or attached to your script do not affect cleaning (well, beyond the script failing to work if you delete an object in another bucket that the script was supposed to use, of course).
Dialogue Responses Bucket the filters that determines who says what is stored in the dialogue Response (its own set of stats, if you will), not the NPC(s) who might have the dialogue. So when you clean dialogue refs, you want to get rid of any Response that was not written or editted directly by you, as otherwise you could be affecting what a whole slew of NPCs are saying. The engine has a particular tendency of dirtying the Responses above and below the ones you added: these have to be cleaned.

 

Topics Bucket (might not be in TESAME?) This is the topic itself, like latest rumors, Elimiran, little secret etc--not the dialogue associated with it, like "Hi, I'm Elimiran"," I heard this juicy rumor about..." and so on. You only need to remove topics that you never used at all; leave generic topics (little advice, Greetings, etc) that you had entries for alone, or you risk deleting any Responses you put into that topic in the process.

 

Scriptwork:
You want to lump your declaration ("short DayTarget") up with the the other declarations at the top. While this shouldn't lead to a failure to compile and run, it's just good practice.

 I noticed Elmiran doesn't have "short noLore" defined. This would mean he now displays many dialogue topics that are not related to his quest. Up to your judgement if this is acceptable or not.

Is DayTarget your own variable or a predefined game variable? If the former, you don't appear to have assigned it a value, or given it any equation to base its value around in the NPC script. I see in the dialogue you also use DayTarget as a variable. As this is not a global variable, I'm not sure if the engine would be able to find it from here and work. Usually a local variable can only be accessed by its calling script.

Grammar Fixes:
Dialogue--
Thank you for your help, %PCname. We will deal with him on our own. (was run-on sentence before)
You're a real life saver. Here you go. (was run-on sentence before)
To tell you the truth, this was my first attempted heist... (prepositional phrase "to tell you the truth" should be separated from the rest of the sentence with commas)
Hurry up and bring it back. I don't know how long I can keep this up. Oh, and don't get caught! (was run-on sentence before)
Well, you're no hope. (interjection "well" should be separated by a comma from the rest of the sentence)
Well, fantastic! (same as above, though I could let this one slide as the whole sentence could be considered an interjection)
[Elmiran leans towards you.] (missing a period)
Hello, friend, I was wondering... (commas around "friend")
You see, I've been... (interjection "you see" should be separated by a comma)
I had a feeling that was the case. (you had an extra "it" in there)
He's been sick for days. Taris has tried... (run-on sentence before)

Quest Journal--
The Ill-Advised Heist (hyphen for Ill-Advised)
I've been informed that a patient at St. Seyn's Infirmary, named Elimiran, has been there for days despite showing no signs of any illness. (changed commas around)
He said he would do it himself, but is under constant watch by Taris. (added to this, as otherwise, what WOULD he do?)
I was the one who stole it, after all. (prepositional phrase "after all" needs to be separated by commas)
I've informed Taris Temeris that Elimiran's sickness was faked. (added Elimiran's name to make this make sense. Pronouns reference the last noun named, which in this case would be Taris, and Taris may be rather confused being told that he supposedly had an illness and that he was even faking it too!)
There's a Bosmer that's currently being treated here. He claims he is deathly ill, but nobody has been able to find out what's wrong with him. I think his name was Elimiran. (run-on sentence, conjunction "but" needs a comma up front of it. I removed the question mark from the last sentence as it's not really a question, but it could be left in as a style thing)

Rot's picture
Rot
Lead DeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
16 min 48 sec ago

I see in the dialogue you also use DayTarget as a variable. As this is not a global variable, I'm not sure if the engine would be able to find it from here and work. Usually a local variable can only be accessed by its calling script.

Local variables do work in dialogue results and can be set (but IIRC not read) by other scripts too, as long as they're targetting the object that carries the script. Dialogue results implicitly target the speaker. The CS error check function warns about local variables in some cases but they're false alarms.

6plus's picture
6plus
DeveloperInterior DeveloperQuest Developer
Joined:
2016-01-24 22:04
Last seen:
1 hour 39 min ago

Rot

Local variables do work in dialogue results and can be set (but IIRC not read) by other scripts too, [...].

Technically it should be possible to read local variables of other objects:

 if ( OtherObject.LocalVariable == 1 )

Nonetheless a global variable would probably be better.

Kevaar's picture
Kevaar
Lead DeveloperQuest DeveloperReviewer
Joined:
2016-01-19 19:35
Last seen:
14 hours 6 min ago

Learn something new every day!

Rot's picture
Rot
Lead DeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
16 min 48 sec ago

6plus

Technically it should be possible to read local variables of other objects:

  if ( OtherObject.LocalVariable == 1 )

Nonetheless a global variable would probably be better.

Right, reading in conditions works but you can't "write" them into something else like

set variable to OtherObject.LocalVariable

but you can do that with a global variable (not needed here though)