You are here

New builder seeks a (very quick) test run

20 posts / 0 new
Last post
Foghopper
New builder seeks a (very quick) test run

I've been learning how to use the toolset in the last couple of weeks and put together the prelude for my first module. I'm wondering if anybody would be able to give it a quick test run for me (quick being the operative word - it's only about 10 minutes long) and give me some feedback if I put the mod file for it up somewhere.

  • up
    50%
  • down
    50%
kamal
Post a link please :)
  • up
    50%
  • down
    50%
BowShatter

Sure why not. Maybe upload a zip file containing your mod file in this thread or give a link.

  • up
    50%
  • down
    50%
Foghopper

Thanks, I appreciate it :)

Mod file zip can be downloaded from here: https://www.dropbox.com/s/0uomw0cm3ib10mn/FMB_pre.7z?dl=0

  • up
    50%
  • down
    50%
BowShatter

Hmm... it says corrupt for me when i try to load the module.

  • up
    50%
  • down
    50%
Foghopper

that's troubling, I'll have a look at it.

  • up
    50%
  • down
    50%
Foghopper

So i've just tested both the pre and post compression versions of the mod file and they both load fine for me in game and in the toolset, which is odd.

I re-did it as a .zip instead of 7z and posting on a different drive, see if this works :https://1drv.ms/u/s!ArZRChBs0QSggSAFrVwlnv6Qq4cx

 

  • up
    50%
  • down
    50%
kamal
I havnt tried it yet but loading the module can fail if it references things like haks which are not present.
  • up
    50%
  • down
    50%
Foghopper

afaik I have not referenced any haks so far. Is there an easy way to check that?

  • up
    50%
  • down
    50%
BowShatter

If you did not include any additional content apart from what is offered in vanilla (base + SoU + HotU), then you shouldn't be referencing any haks. Also check if you have any major files in your override folder while you made the module.

  • up
    50%
  • down
    50%
Foghopper

I have vanilla NWN2 (Base + MotB + SoZ) and nothing else. Just went through and checked, nothing in override folder.

 

 

  • up
    50%
  • down
    50%
BowShatter

I can't believe I thought it was NWN instead of NWN2. No wonder it didn't work. Alright gonna test it out on the correct game now.

  • up
    50%
  • down
    50%
BowShatter

Played the test module. I must say area design is pretty good, considering this is your first module. 

Used a level 1 wizard, died 2 times due to unlucky crits, but otherwise encounters are managable.

Anyway here's some issues I've found:

- First time I logged into the module somehow the cutscene failed to trigger, causing me to miss out on starting equipment and the introduction.

- In the hut, when the wizard teleports in, the PC will be attacked by him. I've checked your script and turns out theres an ActionAttack function called.

Looking forward to the completion of this module!

 

  • up
    50%
  • down
    50%
Foghopper

phew! Glad that was the issue in the end. I was kind of worried that I'd managed to screw it up somehow with my newbishness to all of this.

I'm using encounters rather than placed creatures because I want the module to be multiplayer friendly and I plan to add companions eventually once i get my head around that system. But I found I had to tweak the creatures a bit because 1st level characters are squishy :P Died quite a few times myself working out the balance so far.

I've not run into the cutscene not triggering issue myself, i've had it not start immediately a couple of times though. 

"- In the hut, when the wizard teleports in, the PC will be attacked by him. I've checked your script and turns out theres an ActionAttack function called."

I have not had this happen to me at all when testing. Will definitely have a look at the script - thanks for spotting that.

Glad to hear you enjoyed it and thanks again for taking the time to run it and give me some feedback. Much appreciated.

Cheers.

 

 

 

 

  • up
    50%
  • down
    50%
WC_Sumpton

 

Short and sweet... very good beginning.  Used a first level fighter.

Like BowShatter, the interduction did not play my first time through.  Maybe moving this to the 'On Client Enter' would help.

Other then that, everything seem to play alright.

Some other thoughts...

Change from module to directroy, I think you'll be happerier!

If you are not planning to add 'Voice Overs' for conversations, you might think about finding the blank wave files.  The unmoving lips can be distracting during conversations.

Coding observation... (Food for thought)

You use a lot of "Flavor Text", this is very good.  The script called 'flavtext_' uses sMessage and gets its value from the object's name.  Then there are four more 'copied' scripts that do allmost the same thing.  I would think about making the 'Text' for these messages a veriable on the object.

Learning to use variables in small scripts like this will help later on when the scripts become more complicated.  Debuging one script is easier then finding five and debuging them.

Your Module is very good for a short playthrough, and I do hope that you build upon it.  But I feel that your scripting will become a problem as you module grows, and I would hate to see such a fine begining being brought to a halt because of scripting issues!

I hope my thoughts are helpful, and I do very much hope that you continue!!

 

Cheers...

  • up
    50%
  • down
    50%
Foghopper

"Like BowShatter, the interduction did not play my first time through.  Maybe moving this to the 'On Client Enter' would help.

Seems to be a reocurring issue, I'll look at moving that. Currently the introduction script is in OnEnter of the starting area. When you suggest using the OnClientEnter do you mean the OnClientEnter of the Area or of the Module itself?

"If you are not planning to add 'Voice Overs' for conversations, you might think about finding the blank wave files.  The unmoving lips can be distracting during conversations."

The shortcut fix to this is if I turn all of the convewrsations to NWN1 style :P I have thought about organizing voiceover for the major conversations at least, but please tell me about these blank wave files. What are they, how do you use them, and what do they do? Note that I currently have no idea about how any of the voiceover systems for conversations work, haven't even gotten to looking into that yet.

UPDATE: I found Roguedao's lipflappers and they work wonderfully :)

"The script called 'flavtext_' uses sMessage and gets its value from the object's name.  Then there are four more 'copied' scripts that do allmost the same thing.  I would think about making the 'Text' for these messages a veriable on the object.

Learning to use variables in small scripts like this will help later on when the scripts become more complicated.  Debuging one script is easier then finding five and debuging them."

The four copied scripts that you see are actually the first ones I did - I was initially doing flavour text by putting the floatstring text inside the script, thus requiring a seperate script for every piece of flavour text. Which i very quickly realized would mean that I was going to end up with a heck of a lot of scripts. I found the flavtext_ script that gets the value from the objects name on a forum somewhere and have started using that because it meant I just have the one script to put in and I just change the name of each trigger as I put it down.

Now, you mention the variables on the subject, I've seen these and wondered how to use them. To me they looked like it is a similar system to the way you add condion/action scripts into conversations. Correct me if i am wrong please. I am completely lost on how to use them though. I have questions like which variables are what? How do I add them in properly? How I call them from a script? Can I add multiple variables to the same object? If so how? etc

I would really like to learn more about the scripting and how to use it as I can see that I will need it more and more to get the toolset to do what I want it to do. I have already run into situations where I fel that if i had a better knowledge of the scripting my mdule would be more streamlined.

Example: There are currently 3 different versions of the clearing with the shack in it because for the 'shelter from the storm quest' I wanted the woodpile outside the hut to not be useable until after you have gone into the hut and recieved the journal update. I tried working out scripts that changed the woodpiles settings and even tried doing one to destroy the woodpile and replace it with a usable one that was a quest item. Then I wanted it to be morning when the PC went outside after resting for the night in the bed and also not have the snowfall.

My solution was to clone the area and set it up differently for each situation. I feel that if I was better acquainted with scripting I would be able to have a single area and just change things around via scripting.

Quick question actually - can you make scripts affect an item that is not in the area that the PC is currently in?

As i've written this post, I have figured that the answer to this is probably, no. and that the way to do those sorts of things that I am talking about above would be to change some sort of local variable on the PC (LocalInt?) and have an IF/THEN script in the OnEnter of the area that checks the variable and sets it up according to what value the PC has on them at the time. Am I thinking correctly here?

"I hope my thoughts are helpful, and I do very much hope that you continue!!"

They were very much and I will definitely be continuing work on this module. Thanks again for taking the time to have a look at it.

 
 

 

 

 

 

  • up
    50%
  • down
    50%
Foghopper

amd yes. I have switched to using Directory mode instead of module mode :)

  • up
    50%
  • down
    50%
kevL's
  • Quick question actually - can you make scripts affect an item that is not in the area that the PC is currently in?

yes. but what can't be done (or at least it's not as easy) is affect anything that's not in the current Module.

functions like GetObjectByTag() will get the first instance of any object with a given tag in a/the module. (so special items/objects/etc that need to be dealt with via scripts should generally have a unique tag).

other functions like GetFirstObjectInArea(), GetFirstItemInInventory(), GetFirstFactionMember(), GetFirst*/GetNext* are used for looping through sets of things. Learning to write a decent loop is, id say, a requisite to intermediate level scripting. Plenty of examples can be found in stock scripts (especially #includes).

there are functions that can be looped but that don't use the GetFirst/GetNext pattern, like GetNearestCreature(), GetNearestObject(), etc. - an integer iterator is used instead.

  • My solution was to clone the area and set it up differently for each situation.

pardon, but that's ridiculous. kudos for getting it to work, though!

  • I feel that if I was better acquainted with scripting I would be able to have a single area and just change things around via scripting.

absolutely. Cloning an entire area is (extremely?) rare.

  • Now, you mention the variables on the subject, I've seen these and wondered how to use them.

everything has a field in the Scripts section under its Properties: Variables. If a variable is defined there, it's the same as SetLocal* and is accessed w/ GetLocal*

note that if a variable is tested in a script with eg. GetLocalInt(), it will return 0/FALSE if it has not been set yet. (So you don't have to go through everything and specify "bHasBeenUsed=FALSE" ...) - just test

if (GetLocalInt(oThing, "bHasBeenUsed") == FALSE)
{
    SetLocalInt(oThing, "bHasBeenUsed", TRUE);

    // use the thing ......
}


/hth

  • There are currently 3 different versions of the clearing with the shack in it because for the 'shelter from the storm quest' I wanted the woodpile outside the hut to not be useable until after you have gone into the hut and recieved the journal update. I tried working out scripts that changed the woodpiles settings and even tried doing one to destroy the woodpile and replace it with a usable one that was a quest item. Then I wanted it to be morning when the PC went outside after resting for the night in the bed and also not have the snowfall.

eg. in the OnUsed event of the woodpile, check for a variable "bCanBeUsed" (in its OnUsed script ofc). Since it hasn't been set this will return FALSE: use that to bypass whatever should happen (ie, changing the woodpile into its quest-item). do nothing.

where the player gets the journal-update, get the woodpile (as long as it's in the same module), and set "bCanBeUsed" to TRUE. Player can now click the woodpile and the good things will happen. don't forget to set "bCanBeUsed" to FALSE in the same code-block if the woodpile isn't outright destroyed ... or otherwise rendered unusable.

edit: before destroying the woodpile, get its location and use CreateObject() to spawn the quest-item there, or in the clicker's inventory.

also, call SetTime() and SetWeather() (passing in the module or area as oTarget) during the journal-update or the OnRest event (or the bed's OnUsed.. ad infinitum.). Except, SetWeather() is listed as a partly broken function.. so you might have to clone the area after all.


( Lance Botelle worked out an entire weather-system using visual effects, in his campaign The Scroll. cf, Althéa Weather System )

welcome to Nwn2, where every day is a hard day ;)

  • up
    50%
  • down
    50%
Foghopper

pardon, but that's ridiculous. kudos for getting it to work, though!

Incredulity accepted, it felt like a workaround at the time, but I was determined to get that first part done (sometimes I’m too stubborn for my own good) I’ll chalk it up to a learning experience and I worked out how to do quite a few things along the way while doing it. I think I have to credit the fact that the changes I made between each instance of the area being quite minor to me pulling it off that way.

I’ve since gotten my head around the use of local variables thanks to the help of people here and some reading of tutorial material. Plus a fair amount of writing random scripts in Lilac Soul’s compiler then looking up the individual parts in script assistant. I can now confidently say that I understand enough about the scripting to know that I know nothing.
 
When I feel up to it I'll revisit that first section and clean it up.
 
( Lance Botelle worked out an entire weather-system using visual effects, in his campaign The Scroll. cf, Althéa Weather System )
Thanks, I’ll go and see if I can find that and have a look, could be just what I’m after and I’m always happy to find that somebody has already scripted something I want to do and I just need to tweak it for my module.
 
welcome to Nwn2, where every day is a hard day ;)
I have so far found that every time I start to feel like I know what I’m doing I hit a new learning cliff – like a curve, but steeper – to get my head around. But it’s also kind of fun :)
  • up
    100%
  • down
    0%
Foghopper

Hi all. Thought I'd put this here.

I've been continuing work on The Frost Maiden's Birthday and have just put up an updated version on the project page.

Module is now about 30 mins playthrough and includes custom death respawn location, rest & wandering monsters and the first companion is introduced.

as always, if anybody takes the time to have a look at it i'd appreciate it.

Cheers

Foghopper

link to project page: https://neverwintervault.org/project/nwn2/module/frost-maidens-birthday-...

 

 

  • up
    50%
  • down
    50%