Aller au contenu

Photo

ColorsFade's Development Journal


  • Veuillez vous connecter pour répondre
560 réponses à ce sujet

#476
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Journal Update

 

Well, this was interesting... I subscribe to the D&D feed on Facebook, and a thread came along leading to this link: 

 

Tyranny of Dragons

 

It's a new campaign for PnP D&D. Specifically about the Cult of the Dragon, which, of course, is the centerpiece of my campaign, The Darkening Sky. 

 

My first thought was, "Darn, wish my campaign was finished first." I felt a little bit like thunder stolen. But that is, obviously, a REALLY stupid thing to feel. It's cool that the CotD is getting some pub actually. Maybe it will help my campaign when it is released :-)

 

I just hope that when my campaign is finished, no one comes at me with comparisons... ugh. My story about the CotD is, thankfully, quite a bit different from the one they are telling. I just hope folks enjoy it when it's finished. 

 

Anyway, back to the campaign. 

 

A lot of area work lately. A module that started simply enough (pirate cove) has blossomed into about 8 areas. It takes a lot of time to place everything - lights, torches, placeables... I'm almost to the point where I can start scripting encounters now. This is more or less the first 'major' quest for the player after they reach Scornubel. It was intended to be something short and sweet, but now I think it might chew up a bit more of the player's time, which is always good. The more hours of content I can make, the better. 

 

I like putting together a good area that inspires me, but the time it takes can be so long. I try and poke at it a few minutes every day so I don't feel like I'm standing still. 

 

The good news is that the RWS tile sets are really fun to play with

 

14816032333_9358b606d2_c.jpg

 

The other big thing is continued work on the city of Scornubel itself. I've broken it up into five exterior Areas (each with, of course, multiple inner areas supporting, as necessary). I made a decision to make each exterior area "bleed" right into the next one. Which meant not constructing the area like a classic NWN2 external area. 

 

If you look at the external areas for the city of Neverwinter, you notice that they are isolated from each other by way of rivers and bridges, big gates, and distance, so the designers can use the building placards in the backgrounds etc. Each area is then very isolated from the others. 

 

Scornubel doesn't work that way. It's a big, wall-less city that sprawls, and it's way too big for one 32x32 map. So, I split it up into several maps.  

 

I place World Map Transitions in the middle of roads where you have to transition from one area to the other. This means that in order to construct the city proper, I had to start with one area, and build everything up - all the way to the map edge, before I could start the next area. Because the next area is created by taking the first area, copying it, and then 'moving' the map. So the northern 4 tiles of one map become the southern 4 tiles of the new map. The buildings, placeables, textures, terrain, everything are already there, and then I just build the rest of the map. 

 

To do that correctly.. one map really has to be done before you can move to the next. I didn't start out that way, however. I started by building the Scornubel Docks and Market Area (The Walk) at the same time. So lately I've been working on making the north edge of the docks and the south edge of The Walk match up. There's a lot of copy-paste of placeables to try and get things to look exactly the same. Once I copied too many placeables at once, and the toolset locked up... 

 

When I get bored or annoyed building the external city areas, I work on the internal buildings. City Watch, Scornubel Hall, merchants, etc. It's all coming along. My goal was to have all the areas built before I started scripting any conversations or encounters, but it's getting to the point where I really need to do something different with my time :) I'm getting tired of placing stuff. 

 

I think this week I'll do some conversations; some of the first ones you experience when you enter the city, and see how that goes. I miss scripting encounters. 



#477
kamal_

kamal_
  • Members
  • 5 240 messages
Terracoppa lets you build as you please, then copy between the areas. Good for when you decide you need to add a big tower or something.

#478
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Kamal, 

 

I have terracoppa, but I've only used it for one thing. Will it allow you to copy, say, a 1x8 block of tiles and copy them into an existing 32x32 set at a specific spot? 

 

I've honestly been wondering if Terracoppa would do this for me, but I've been too afraid to try it... Pathetic, I know. 


  • kamal_ aime ceci

#479
kamal_

kamal_
  • Members
  • 5 240 messages

Kamal, 

 

I have terracoppa, but I've only used it for one thing. Will it allow you to copy, say, a 1x8 block of tiles and copy them into an existing 32x32 set at a specific spot? 

 

I've honestly been wondering if Terracoppa would do this for me, but I've been too afraid to try it... Pathetic, I know. 

Yes, you have control over where the copied block appears in the target area.



#480
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Yes, you have control over where the copied block appears in the target area.

 

Well hot damn. That solves some problems. I guess I'll have to give that a try.. Thanks Kamal!



#481
Eguintir Eligard

Eguintir Eligard
  • Members
  • 1 832 messages
I'm an actual programmer and you script kiddies give me a headache trying to figure out why your do all this :o

#482
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

I'm an actual programmer and you script kiddies give me a headache trying to figure out why your do all this :o

 

Script kiddie? 

I'm a software developer too bub. Not sure what your saying here... 



#483
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Journal Update

 

Well, after a very, very long time of doing nothing but area building, I was finally able to take one of the first areas in Chapter 1 and add all the encounters. 

 

One thing I've worked really hard to do is make setting up encounters for an area as quick and easy as possible. This is my favorite part of the building process, doing encounter creation, and it's the reason I wrote so much of the custom scripting libraries that I have created. 

 

For this latest dungeon, I added two new things to my arsenal. 

 

Safe Rest Rooms

 

I created a script and trigger blueprint so I can quickly create a "safe room" for the party to rest in where they will not be interrupted by the wandering monster system. 

 

This turned out to be a little bit more work than I thought it would be, but in its finished state it is very quick and easy to setup. To do it, I need an enclosed, single-tile room with a single door (has to have only one doorway for entry). And, as I learned in testing, I need the room to be far enough away from any other enemies so that the party doesn't get interrupted by the "You cannot rest when enemies are nearby" message, which pops before the k_mod_player_rest script has a chance to fire. 

 

To set this up, all I do is paint my trigger down so it covers the entire room, and then set the value on a variable that I already have defined on the trigger. The trigger blueprint has two scripts attached to it - one for OnEnter and one for HeartBeat. The trigger also has a variable called "DOORTAG" that is empty. The door to the room has to have a unique tag, and then all I have to do once I've painted down the trigger is set the DOORTAG variable. 

 

Bingo - safe rest room. 

 

The conditions of the room are as such: the whole party has to be inside the room (more on that later) and the door has to be closed. At that point, the HB script on the trigger disables the Wandering Monster variable for the Area, and sets a new variable on the area that tells us the party is in a "Safe Room". The party can now rest (using MoTB rest system) and rest the full 8 hours without interruption from wandering monsters. 

 

The OnEnter script displays a message to the party using floating text that says something like, "You feel it may be safe to rest in this room."  So this gives the player a really easy way to know, "Hey, my party can rest here and the wandering monsters won't nail me". And with some proper area design, you can create situations where the player now has to make a choice: do we go back to the last safe room we encountered, and rest there, or do we push forward hoping to find another safe room around the corner?

 

The HB script does the actual checking to see if the party is in the room or not and to see if the associated door is closed. If those conditions are met, another floating text fires (one-time) and lets you know that you can rest here now.

 

At first, I thought of using GetIsInSubArea() to determine if the party was in the trigger or not, however, if you read the function header, it says that this function doesn't actually determine if the object is in the trigger, only if the creature triggered an OnEnter event on the trigger. Well, that is only useful until the player saves the game while standing inside the SafeRoom. If the player saves the game while in a SafeRoom, and reloads from the saved game, the call to GetIsInSubArea fails; you have to actually move the party out of the room and back into it to cause the trigger's OnEnter to fire again. Lame. 

 

So, the solution I went with was to simply use GetDistanceBetween() on the trigger and each member of the party. The center of the trigger is its location, and with some experimentation I found that the far corners of as single square room are about 10.0f away. So as long as everyone is inside 10.0f distance, they're more than likely inside the room. I limit my use of the SafeRoom feature to only single-tile rooms with one door, so I never have to worry about any other distances to check. In testing, this worked really well. 

 

And what I like most is, it's so simple to setup. Paint trigger, set DOORTAG variable, done. 

 

Respawning Monsters

 

Another thing I wanted to make easy to setup was respawning monsters, because I use respawning monsters as "roamers", who roam halls in dungeons. And I got that working this weekend. 

 

I already have a library I wrote that makes it really easy for me to spawn monsters into an area using the OnClientEnter scripts. I simply make a function call, SpawnEnemy("EnemyTag") and the function looks for any waypoints in the area that have the "EnemyTag" as their tag. They then find the correct blueprint and spawn the creature. An additional variable on the waypoint can be used to determine if the creature's tag should be changed once it is spawned, and I can use a second parameter on the function call (or variable on the waypoint) to determine if the creature should be spawned in as Hostile, or non-Hostile. There are certain situations where it is advantageous to spawn creatures in as non-hostile, for cut-scenes and stuff, and then turn them hostile at later points, with scripts. 

 

Anyway.. I added a couple new functions to allow me to create re-spawning creatures. These creatures have to be renamed after they spawn, so they match the waypoints I want them to follow, so they "roam", and then they have to have a deathscript. The deathscript does the respawning work - once the creature dies, a random die is rolled and somewhere inside of 60 seconds a new creature is going to respawn at the original spawn point, and start walking the waypoints again. 

 

This ends up making dungeon encounters a bit more interesting, to me. The party can't just hang out wherever they please, or they're going to continually be attacked by respawning roamers. So it pushes the party to find safe rooms to rest in, configure spells, gear, etc. It makes it a bit more like... dungeon crawling, because you really need to keep moving through the dungeon. So again, with the safe rooms, it creates some decisions: do we go back to the last safe room we encountered? Is there a roamer between us and that safe room? Do I push further into this dungeon and hope for another safe room? How low on spells is everyone? Should we go back or forward? 

 

The whole thing is to try and create as interesting of dungeon encounters as possible. Because really, that's a huge part of this campaign. This is a dungeon romp; custom AI, lots of encounters, and my attempt to make this as tactical as possible. 

 

So far... pretty happy with the most recent dungeon. It was supposed to be a simple underground tunnel, and instead turned into a very large dungeon crawl, with a quest attached. 

 

Mostly, I was happy to be doing encounters again. Area building gets old. I still have a boatload of areas to build, but this was a nice break from that. 



#484
Eguintir Eligard

Eguintir Eligard
  • Members
  • 1 832 messages
There are safe rest triggers and respawn options in the encounter triggers.

#485
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

There are safe rest triggers and respawn options in the encounter triggers.

 

I saw the default safe rest trigger before I implemented my own. I never tried it, but from reading the description it didn't seem to do what I wanted to do. It seemed like it was intended to allow the player to rest when the entire area was marked as "no resting". I don't have my area marked as "no rest"; I want the player to be able to rest - but to encounter wandering monsters if they don't do it in a safe room. So there was enough of a difference, at least to me, to merit writing my own trigger and scripts. 

 

Now, for the city of Scornubel, it looks like the default trigger is what I want. You can't rest inside the city (unless you go to an inn.) However, per some reading I've done on the city, you can rest in paddocks and other such areas. I might throw a couple places like that in just for flavor, and use the default trigger to allow resting in those areas.  

 

The respawn options - again, I didn't test, but didn't seem quite like what I was looking for. I didn't want to use triggers for the roamers - I wanted them spawned when the player enters the area, so I use OnClientEnter to spawn them, and then they are mobile while the player is wandering the dungeon. Reminiscent, at least for me, of my old Everquest days... 

 

I do use encounter triggers a lot (and certainly more than I used to). It's my #2 go-to for spawning encounters, but I prefer to use those as one-shot encounters. 



#486
andysks

andysks
  • Members
  • 1 645 messages

I think these stock rest triggers are left over from NWN1 and don't work for us.



#487
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Journal Update

 

Not dead. Just took a break. 

 

I had a busy summer with my band, and that soaked up a lot of time. Then the bassist had to quit, and the band broke up (every band's story eventually) and I was on to other things. 

 

I started playing Everquest 2 again. Resurrected my old character from 8 years ago. I just felt the bug to revisit that world. Glad I did. It's changed a lot. Still fun, still addicting, but very, very different from NWN2. 

 

What is obvious about games like EQ2, after only revisiting for a little while, is that the driving force behind playing is totally different. In a campaign or module like NWN2, the drive is to advance the story. Story is king, and controls all, and so dialog and NPC interaction are vitally important, and how the story is put together, the plot, etc., all helps with that. How a module is paced, how fast or slow it seems, how frequently or infrequently loot appears, it all helps build that sense of story and progression through the journey. It's a bit like reading a book. If the story is no good, there's no desire to flip the page and read any further. 

 

In a game like EQ2, however, story isn't the drive. The driving force is something else entirely - the carrot in front of the player: personal achievement. For some players personal achievement comes in the form of equipment, but it also comes in a lot of other forms, like putting together a big house with lots of decorations (there are some nicely done living spaces now, which can be visited and rated), or getting a new fancy mount to fly around with; it might be the ability to craft a new and more powerful item, or go raid some zone for phat lootz. But it's the carrot that drives the player, not the story. What is it that the player really wants to achieve next? That's what pushes the game. 

 

Within those two vastly different paradigms, there's some technical overlap. Playing the game has given me some new ideas for my mod, specifically in the area of quest design with regards to placeables that can be manipulated, and area design. For those reasons alone I'm glad I took a dive and restored my account. 

 

Anyway, a recent email asking for some help on some NWN2 scripting caused me to open my toolset again and get back to work. The Darkening Sky is slowly coming along. 



#488
Tchos

Tchos
  • Members
  • 5 042 messages

That's good news.  Environmental interaction (such as placeables that can be manipulated) are a favourite game mechanic of mine.

 

And to me, gameplay is king.



#489
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Journal Update

 

Did a quick experiment today to try something out with usable placeables.

 

Everquest 2 has a lot of cool quests where placeables out in the world exist, but aren't usable until you get a quest. So you can see them in the world, and they look just like normal decoration, until someone gives you a quest to collect them or some such. An example might be some grave stones scattered around a zone. They are just normal, non-usable decoration. Then you get a quest, and suddenly they all are usable and you can left-click them. I like this a lot and wanted to see how hard it is to do in NWN2.

 

Turns out, not that hard.

 

Using my test area, I placed a desk, and a book on top of it. The book was not marked as usable, and not static. Then I wrote a small conversation with a test quest giver, where the book placeable would become usable after you get the quest. I wrote a small script for the conversation called ga_make_usable. This works as long as the quest conversation and the placeable are in the same area. If they're not, of course you have to use the OnClientEnter, but it's not a big deal. Either way, you make a call to the system function SetUseableFlag(). This flips the object to usable. 

 

From there, I just needed a script on the object for OnLeftClick. The script destroys the placeable (so it disappears), then places a "book" item in the PC's inventory (from a book blueprint I created), and then updates the journal entry for the quest. 

 

So, before you get the quest, the book is just sitting on the desk, and you cannot interact with it. But as soon as you get the quest, it's usable. Click on it and it disappears, a book goes into your inventory, and you get a quest update. 

Very cool. 

 

For Everquest 2 style quests, where I need to collect or "touch" X number of placeables in Y areas, this can be done with a generic script and some variables on the placeables themselves. 

 

Overall, I was pretty pleased. It only took me 45 minutes to put it together from scratch and have it completely working, based on just an idea. 

 

What makes me even more happy is that now I have a way to do some quests I had been wanting to do with this campaign, but I wasn't sure how to pull them off. One of the quests I want to be somewhat like a quest from Dragon Age, where there are gravesites that you can "disturb", located throughout the game world in various areas. Each grave results in a epic style encounter with an undead, and you get a valuable piece of armor. I want to do something similar, and create something like a unique set of armor for a fighter player (the PC if you're a fighter type, or the Paladin if you're not; someone will make use of it I'm sure).

 

Some of these graves will be in the starting areas. You won't be able to interact with them at first, but when you get the quest, then you can. You will be told to hunt down the graves you might have encountered before. Well, that gives the player a chance to go back and visit some previous areas that have already been traveled, and for me to re-use some areas in the campaign. The idea that I can re-use some areas previously visited by the player for other quests really has me excited. Because some of these areas, the player can blow through pretty fast. And it takes a lot of time to build these areas, even if you're just using a prefab and altering it a bit. So now I can get some more use out of the areas. And I really, really dig that... 

 

Excited to start implementing some of this. Now, all the quest items don't have to drop off mobs or come in chests. They can be items laying around on desks or the ground or whatever, they may not be usable initially, but will after some quest initiates. That is cool to me. 

 

Might be old news to some of you builders, I'm sure. But it was a big event for me today. 



#490
Tchos

Tchos
  • Members
  • 5 042 messages

Well, you would have been welcome to use one of the script systems I designed for that same purpose in my module, which does everything with variables, and is designed to be very flexible for a wide variety of placeable interaction quests.  The mushroom quest is a good example of its use, and sounds just like your gravestone quest.  Andy's gotten some good use out of a few of them, and all of my scripts are available for people to extract from the module for their own use.  But of course, I'm sure using one you designed yourself may be more comfortable.

 

My own ga_set_usable works in different areas, and yours should, too.



#491
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Thanks Tchos. I'll take a look!

 

I need to play your mod anyway. Been meaning to do that. It's on the list. 



#492
andysks

andysks
  • Members
  • 1 645 messages

My ga_set_useable works on different areas too. I use the same method because I have many quests where you need to go back to places you already visit. Especially in the big city. Then the placeable is useable :). Since I found the method I use it a lot. It's my favorite, since it requires little effort to bring a good result.



#493
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

And.... 

 

 

 

not dead!


  • GCoyote et andysks aiment ceci

#494
PJ156

PJ156
  • Members
  • 2 982 messages

Good :)



#495
rjshae

rjshae
  • Members
  • 4 485 messages

dd9586faff272818581fc87b624d05ed.jpg


  • ColorsFade aime ceci

#496
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

And still not dead! Writing new material! Toolset open! OMG!

 

There will be blood...


  • GCoyote, PJ156, rjshae et 2 autres aiment ceci

#497
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Let's see who reads this... 

 

A while ago (a long while ago) Andy hit me up with an email saying some folks here were interested in my AI scripts. 

 

Anyone still want to see these as a separate package?


  • PJ156 et rjshae aiment ceci

#498
rjshae

rjshae
  • Members
  • 4 485 messages

Sure, I would be. Are they well documented?



#499
ColorsFade

ColorsFade
  • Members
  • 1 267 messages

Sure, I would be. Are they well documented?

 

Yes, I document really well. 

 

My thought here is to expose them with a small module - a single area with some encounters - and the creatures would make use of the scripts, so you could actually load up the mod and see how the enemies work. 

 

The AI scripts I have aren't really plug-and-play. They're more like a huge library of calls you can make so that your spell-casters act "smarter". They were designed for enemy wizards and priests, because, quite frankly, the default AI stinks. And in my campaign, wizards and priests (and magic as a whole) is a pretty big deal. So I wanted those soft and squishy types to present a real challenge.

 

With a small mod to put the scripts on display, you'll be able to see how I customize a creature's script with the library. Those customized creature scripts you can, of course, just cut-and-paste and use as-is with the library if you so choose. But the bigger deal is being able to see how the library calls work, and how you can create some very customized scripts for your spellcasters. Once you know how to use the library, you end up doing what I do, which is cut-and-paste a script from an enemy, and tweak it for the current enemy. 


  • rjshae aime ceci

#500
andysks

andysks
  • Members
  • 1 645 messages

I can say too that the scripts are very well documented. Even a dummy like me was able to use them effectively, even though I'm certain that I'm not even using 10% of the capabilities. We are talking about many lines of code here.

 

I wanted to ask something a while ago and I forgot, now it came back. With the powerbar, when we click to create a new script we have the option to start with a template. How does one create a new template? Because it would help the copy pasting you're talking about I think :).