I'm a total lightweight. I don't really mod. I just love games with level editors. I don't script. I just take other peoples scripts and chop them up to suit my own needs. I often post as "Script Moocher Games". My favorite game editors are MC2/MC2X and the Neverwinter Nights Aurora Engine (Electron is fun and I know how to use it pretty good, but it's too time consuming so I choose to stick with the older easier engine).

RSS My Blogs

RPGs Are NOT Less Relevant... But Bioware Is

urknighterrant Blog

BioWare co-founder Greg Zeschuk says RPGs are becoming "less relevant" as a genre to the current state of videogaming.

RPGs are not becoming less relevant to the game industry. Bioware, however, has become less relevant to RPGs.

That's not fair. Bioware isn't really bioware any more. Bioware is EA games now, and EA games has NEVER been relevant to RPGs.

EA is simply not capable of producing good RPGs. Their corporate culture forbids it. EA is one of those companies that thinks of customers as the enemy. All of EAs games are based on the premise that gamers are mouth breathing morons. That's their audience. It's a huge audience and they serve it well. They make shooters, racing games, and sports games. They don't develop games, they just repackage the same games over and over again and the drooling masses buy them. Most people are, after all, idiots. If you want to sell the maximum number of units of anything you need to cater to idiots.

Here's the simple truth that EA just doesn't get...

Idiots don't play RPGs.

RPG players aren't looking for a casual experience. RPG players are looking for a smart, immersive experience. RPGs are ingrained as part of geek culture, so RPG players tend to understand much more about computers and the technical side of game development than most mainstream game consumers. To make things worse RPG players tend to be genuinely creative and imaginative. This means that the cheap tricks that EA uses to cut corners on development costs are just not going go unappreciated by the RPG crowd. It also means that RPGs will never translate to the mass market the way EA wants it to. They make a ton of money selling games to "the lowest common denominator".

It's not complicated. EA sees this thriving niche market and they see dollar signs. They want a piece of that pie. They buy the best RPG developer in the industry, and then EA groupthink takes over...

"I know," says some EA exec that knows next to nothing about gaming and refers to games using buzz words like "titles" and "product".

"We can broaden the appeal of the genre," he continues, "by making it more accessible (ie dumbing it down), and we can apply the same techniques to RPGs that we've learned producing shooters (racing games, sports games, whatever) to cut production costs. Sure, we may loose a few RPG snobs, but the mass market will gobble it up!

After all, it worked with shooters. It worked with racing games. It worked with our sports titles. It'll work with RPGs too, right? After all, a game is a game.

Then when DA2 falls flat on it's face the simple reason STILL evades them. They announce that the sales are flat because RPGs are "less relevant".

That's a steaming pile of bovine dookie. Us gamers haven't changed. You developers did, and we don't want dumbed down copy/paste games so we stopped buying them.

The reason EA's RPGs are falling flat is because they're trying to broaden their market at the expense of the existing fan base. They are trying to move RPGs out of it's established niche and into the mass market.

And what happened? Where did all these new customers go? Why didn't the mass market embrace the exciting new genre they've been given?

Well, the mass market is composed primarily of idiots, and idiots don't play RPGs!

Feeling Betrayed by Bioware

urknighterrant Blog


Bioware still hasn't come out with a demo for Dragon Age Origins. Well this gamer, for one, is done waiting.

My concern about Bioware not offering a demo has nothing to do with the game quality. I have no doubt about that. Bioware makes the best cRPG's on the market, bar none. This is the company that brought us Baldur's Gate and Neverwinter Nights. My concern is more practical. How can I know for sure it will run on my machine without testing it first with a Demo? My video card exceeds the recommended requirements in every category, but it's simply not on the list of supported cards, so it's a crap shoot. The only way to know for sure is to try it out by using a demo or a pirated copy.

Oh well. I guess it's off to the high seas. Arghh ye maties. At least you got a few organic links.

:-/

Neverwinter Nights Rises from the Dead

urknighterrant Blog
A team of 4 players, from different parts of the world ranging from Florida to Sri Lanka, explores an ancient underground fortress in Faerun, the world of Neverwinter Nights.

Atari's Neverwinter Nights has just been made available as a DRM free download for $10 at Good Old Games.

More than 8 years after it's original release NWN remains the most revolutionary cRPG ever made.

The solo adventure isn't that special. If you're a casual cRPG fan it's worth a play, but it won't rock your world. Baldurs's Gate 1 and 2 are both better cRPG experiences for the RP lightweight (and both are available on GoG). The official campaign is weak at best. The first expansion, Shadows of Undrentide, is MUCH better. In fact, just skip straight to "Shadows" (known in the NWN community as SoU). It's no Baldur's Gate, but at least it gives BG a run for it's money. The original campaign doesn't even try. The last full length module, Hoards of the Underdark (or HotU) is a sequel of SoU and is without doubt the best of the three modules, but it's also epic level. I wouldn't recommend making HotU your first NWN experience.

No. As far as the single player game goes it falls into the "meh" catagory. The graphics are dated, and in the OC the plot is lame, linear, and riddled with painfully 2 dimensional NPC's.

But it's still the best cRPG ever made.

What makes NWN stand apart from any game that came before it is the Aurora Toolset and it's multi-player features.

The toolset is easier to use and more powerful than anything ever released before or since. Dungeon Siege, Morrowind, even Oblivion have toolsets that pale in comparison to NWN. While the sequel, NWN 2, has a toolset that offers a building experience with much better graphics, it offers nothing in terms of improved game play and is much more complicated and time consuming. NWN is also highly modable. It's relatively easy to create and animate 3d models, so fans have fleshed out the game with custom clothing, models, buildings, monsters... you name it. The system is so flexible that it has been used to create d20 modern and even sci-fi modules. NWN is the perfect platform for the amateur game designer. As a result there are literally thousands of fan made modules, and literally hundreds that are actually superior to the official campaign.

Still not convinced? Let's talk multi-player. NWN can be played cooperatively or PvP. The official campaigns can be played co-op, but there are scores of fan made modules designed for MP co-op as well. Now there's nothing new about MP support. Baldur's Gate was an amazing MP experience for the few people who tried it, but compared to NWN it's downright primitive and without the toolset the MP experience in these games was intrinsically limited.

And this brings us to the one thing that sets NWN apart from every other cRPG ever made...
NWN has a Dungeon Master client.

NWN's DM client, in combination with the powerful toolset, relegates every other MP computer game on the market to the status of "Poser". This feature makes real tabletop Pen 'n Paper style role playing available in a thoroughly rendered 3-D environment for the very first time.

NWN still has a very active community. IGN's "Neverwinter Vault" is the place to go to find fan created content and modules, NeverwinterConnections is a great resource for finding Neverwinter Nights multiplayer games and campaigns to join, and the Bioware social NWN boards are still very active. There are scores of NWN "persistant worlds", or "PWs". These servers are custom worlds built with the NWN toolset; basically free mini MMO's; and are open 24/7. There's also a fairly active X-Fire community.

BUY NEVERWINTER NIGHTS RIGHT NOW! It's the best game value you will ever find.

The Broken Heart: A Preview of my Upcoming NWN Module

urknighterrant Blog

Omagogg was a warrior of the Bear Claw tribe. Long before the city of Neverwinter sprang up Omagogg served Mhoghazz, Overlord of vast stretches of the sword coast with a reign that was still growing as civilization was only just reaching the north.

The young warrior was ambitious, and he sought help from Grizellha, a night hag. She agreed to help him overthrow Mhoghazz. When he asked her the price she told him "Omagogg, your rise to power will make you many enemies but one will stand above all and that enemy will take from you more than you can now conceive. You may make no attempt at vengeance. Fear not, warrior, for vengeance shall be had, but it will be mine, and not yours. I will come to him in his sleep and destroy him."

Omagogg agreed and within the year Mhoghazz, who had no surviving sons but for a single infant who had vanished months before, died of sickness, unable to rest for the nightmares that plagued him. Omagogg met all challengers in battle and became Chief of the Bear Claw.

Inwau was a barbarian princess, daughter of Hurugarr of Elk's Leap, one of the Bear Claw's smaller rivals. Omagogg was prepared to sack the Elk's Leap when Hurugarr sent Inwau, offering his thirteen year old daughter up to wed the overlord as a peace offering.

Omagogg was immediately smitten with the young girl's beauty and accepted her as his wife. The people of Elk's Leap were spared slaughter, and Hurugarr was bound to Omagogg's house by blood and became a great chieftain of his clan.

Inwau had a talent for wild magic, and as she grew she became a mighty sorceress. Omagogg and Inwau lived together in the Arms of the Bear, a great and ancient tunnel complex on high ground, in the hills overlooking the Vale of Summer.

Omagogg was blissfully happy with his bride. As he grew older with her he became a gentler ruler, and fair. As settlers trickled in from the south he allowed them to settle in his marginal lands in relative peace in exchange for trade goods. His people prospered, as did the "pinkskins" (so named for their lack of tatoos) from the south.

As Inwau blushed into womanhood she happened upon a pinkskin Captain named Herold Whillson. While she was trading for scrolls in his village they were attacked by a band of Ogres, and side by side they fought them off. They parted, but Inwau was clearly smitten by the chain clad knight. Each time she returned to the village to trade the spark between them grew. Soon she began sneaking out of the barbarian fortress from a secret tunnel she had built.

This went on for many years. The Pinkskin village prospered and grew, and eventually Omagogg traveled there himself to collect the governors tribute.

It is said that as soon as he saw Captain Whillson his queens treachery was laid bare, as he saw his two youngest sons in the armored man's eyes. Omagogg knew this was the enemy that the night hag had warned him of all those years ago. He knew that he should stay his hand and allow Grizellha to exact her vengeance, but his rage was too great. He drew his greatsword and struck the knight down. He then ordered his retinue to raze the town and they killed every man, woman and child in it.

He returned to the Arms of the Bear, but word of his deeds had arrived before him. Inwau lay dead in her chamber at her own hand and her bastard sons had fled to Elk's Leap.

Omagogg mustered his Army and marched on his wife's home tribe. Omagogg met Inwau's bastard sons on the battlefield, but they still loved him as a father and would not raise a weapon to him. Instead they bowed before him and offered their heads, which Omagogg took. Then his army slaughtered the people of the Elk's Leap just as thoroughly as they had destroyed the pinkskin town.

He returned to the Arms of the Bear, and that night Grizellha apeared to him. She said "Omagogg, you have served the life I made for you well, and now I have come to accept your payment. Now I shall destroy the enemy I warned you about all those years ago."

She returned to the shadows from whence she came and Omagogg railed at the darkness, "Devil Bitch, No enemy stands before Omagogg! I have slain them all with my own hands! Stand before me again and I shall destroy you as well!"

That night as he slept he stood again on the field of battle and took the heads of his sons. Night after night he suffered the same dream as Grizellha kept her promise and feasted on the despair of his greatest enemy.

ERROR: NO RIGHT BRACKET ON EXPRESSION

urknighterrant Blog

from Lilac Soul's NWN Script Generator When Using CheckPartyForItem Function

If you're getting an ERROR: NO RIGHT BRACKET ON EXPRESSION error on compile when using Lilac Soul's Script Generator I'll pretty much bet the farm that you're trying to write a script that uses the CheckPartyForItem function. The solution is VERY simple. If you get this error just add an include for nw_i0_tool and voila! The script will compile perfectly.

If you don't know what an include is... well, it doesn't matter. Just generate the script normally and copy/paste it into the script editor. Save and Compile. If it gives you a No Right Bracket on Expression error just add a line above the entire script (immediately above or below the green comments are fine as long as the line is above the int Starting Conditional(); line).

The line you need to add is:
#include "nw_i0_tool"

Don't put a semicolon after the line.

That's all there is too it. The script will compile normally now.

If it hadn't been for Lilac Soul's Neverwinter Nights Script Generator I never would have started modding. Sure there are some intrinsic limitations, but nothing you can't learn through. The script generator is a perfect starter tool for noob modders.

Last night while modding I used it to do a simple script and behold... I got an error! It's not the first time I ever had this particular error, and It's one that can be worked around using multiple scripts and integer variables, but that's a royal PITA. This time I decided to try and fix it.

It took ten minutes.

I gotta tell ya, I feel pretty stupid for not Googling the solution right off. I shudder to think of the time I've lost in my life writing and testing scripts to get around this function. After ten minutes of looking at scripts that worked it became clear that all I was missing was a simple include!!!

Aurora Engine: The Easy Way to Add Secret and Placeable Doors to Your NWN Mod

urknighterrant Blog

It is shocking to me that the Bioware builder's page on this subject is so absurdly out of date and incomplete. After extensive trial and error I've managed to document at least enough of the procedure so that Noobs like myself can quickly and easily set up secret and placable doors.

Placeable Doors:
Placeable doors are easy. You cannot use a "Hidden Wall Door" or "Hidden Trapdoor" from the miscelaneous interior standard pallet. Instead go to "Secret Object" and select a door from there. Now give the door a unique tag (For example "DoorPlaceableTag"). Under most circumstances you may want to remove the word "Secret" from the name so only the word "Door" will come up in-game if the player mouses over it.

Finally you need to place the waypoint. This waypoint will be the door's destination. Place the waypoint at the point where you want the door users to teleport to when thy go through the door and give it the same tag as your placeable door with the prefix "DST_" (for example "DST_DoorPlaceableTag").

Optionally you can use any door placeable and a waypoint using the naming conventions above and simply change the OnUsed script to x0_o2_use_wdoor.

If you open the OnUsed script you will see that the comments tell you to use a "LOC_" prefix. This is wrong. It is nothing shy of sadistic that this has never been corrected in any of the patches.

Secret Doors
How it works:
A secret door is simulated by putting an "OnHeartbeat" script on an invisible "trigger placeable" object. Every heartbeat (about once every six seconds) this script checks the skills of nearby players and rolls to see if the most skilled searcher has spotted the secret door.

When one of the players spots the door the trigger placeable destroys itself, spawns in a door at it's location, and sets it's Tag name as a string variable on it.

The door has an OnUsed script that uses the string variable to teleport anyone who uses it (along with henchmen and pets) to a waypoint with the same name.

How to set it up:
Place a "Hidden Trapdoor Trigger" or a "Hidden Wall Door Trigger" where you want the door to appear and give it a unique tag (for example "SecretDoorTag"). You will find the "Hidden Wall Door Trigger" and "Hidden Trapdoor Trigger" in the standard pallet under "Miscellaneous Interior". Place the trigger object in the center of the desired detection radius.

Next you need to place the waypoint that will act as the door's destination. Place the waypoint at the point where you want the door users to teleport when they go through the door to and give it the same tag as the Hidden Door Trigger object with the prefix "DST_" (for example "DST_SecretDoorTag").

I am referring to the "Hidden Trapdoor Trigger" and the "Hidden Wall Door Trigger" as "trigger objects" to avoid confusion, as they are not technically "triggers". In other words... they are not painted from the "trigger" pallet. They are placed from the "placeable" pallet. They're just called "triggers" in the placeable menu.

Hidden door trigger objects use the "invisible object" appearance. When the door appears it will be facing the same direction as the placeable.

To set the secret door's properties change the following fields:

  • Reflex Save: Determines the distance at which a PC can search for this door in meters.
  • Will Save: Determines the DC of finding this door.

Wall Door Placement Guidelines:
When placing wall doors be careful to place the trigger so when the door spawns it will be flush against the wall. Place the "hidden wall door trigger" so the arrow faces away from the wall and the back edge of the invisible object placeable is flush with the wall.

Wall Doors must be placed where they can be accessed by the players in-game. This can be problematic sometimes. For example, when using the city interior tileset the walkmesh often does not extend all the way to the wall, especially in the alcoves. If you spawn your doors so they appear flush against these walls they will be too far off the walkmesh for the players to fire the "OnUsed" event. A few placeable walls can go a long way towards solving this problem. There's a great selection of placeable walls in the Community Expansion Pack. Also... Door Placables set as "static" objects and placed backwards, with the doors facing the wall, can make a reasonable looking wall placable. As a rule if you cannot click-select the door in the toolset's graphic window it's too far off the walkmesh to be usable by the players.

Changing the Door Spawned by Hidden Door Triggers:
You will need to create a new door blueprint and modify the OnHeartbeat script if you want a door other than the default door to spawn.

Before you ask... No... You cannot use the secret doors under "secret object" in the standard pallet. The OnUsed script is wrong. The door placeables in the "secret object" pallet are for use with the Secret Object Triggers in the standard "Triggers" pallet. Use of these triggers is beyond the scope of this post.

  1. First... create a new blueprint for the door appearance that you want to spawn. For example... the default wall door has a wooden appearance. To create a stone door select the Hidden Wall Door and "Edit Copy". Change the appearance, for example, to "Wall Door Stone". I also like to change the name to "Secret Door" (it just looks cooler than the default name). Make a note of the new placeable resref for the next step, modifying the hidden trigger's OnHeartbeat script.
  2. Now place a Hidden Wall Door Trigger or Hidden Trapdoor Trigger placeable object where you want your custom secret door to spawn.
  3. Copy and Paste the below script into the script editor. Change the area highlighted in red (around line 116) to the resref (not tag) of the placable object that you created in step one. Give your new script a unique name. Now go into the properties of your hidden door trigger and replace the OnHeartbeat script with your new script.
  4. Set the destination waypoint the same way you would if you were using a default door. Just place a waypoint at the point where you want the door users to teleport to and give it the same tag with the prefix "DST_" (for example "DST_SecretDoorTag").

The OnHeartbeat script for your Hidden Door Trigger object:
Copy and paste everything in black. The red font you will replace with the resref of your custom door placeable.

//::///////////////////////////////////////////////
//:: nw_o2_dtwalldoor.nss
//:: Copyright (c) 2001-2 Bioware Corp.
//:://////////////////////////////////////////////
//
// This script runs on either the Hidden Trap Door
// or Hidden Wall Door Trigger invisible objects.
// This script will do a check and see
// if any PC comes within a radius of this Trigger.

// If the PC has the search skill or is an Elf then
// a search check will be made.

// It will create a Trap or Wall door that will have
// its Destination set to a waypoint that has
// a tag of DST_

// The radius is determined by the Reflex saving
// throw of the invisible object

// The DC of the search stored by the Willpower
// saving throw.

//
//:://////////////////////////////////////////////
//:: Created By : Robert Babiak
//:: Created On : June 25, 2002
//::---------------------------------------------
//:: Modifyed By : Robert, Andrew, Derek
//:: Modifyed On : July - September
//:://////////////////////////////////////////////

void main()
{
// get the radius and DC of the secret door.
float fSearchDist = IntToFloat(GetReflexSavingThrow(OBJECT_SELF));
int nDiffaculty = GetWillSavingThrow(OBJECT_SELF);

// what is the tag of this object used in setting the destination
string sTag = GetTag(OBJECT_SELF);

// has it been found?
int nDone = GetLocalInt(OBJECT_SELF,"D_"+sTag);
int nReset = GetLocalInt(OBJECT_SELF,"Reset");

// ok reset the door is destroyed, and the done and reset flas are made 0 again
if (nReset == 1)
{
nDone = 0;
nReset = 0;

SetLocalInt(OBJECT_SELF,"D_"+sTag,nDone);
SetLocalInt(OBJECT_SELF,"Reset",nReset);

object oidDoor= GetLocalObject(OBJECT_SELF,"Door");
if (oidDoor != OBJECT_INVALID)
{
SetPlotFlag(oidDoor,0);
DestroyObject(oidDoor,GetLocalFloat(OBJECT_SELF,"ResetDelay"));
}

}

int nBestSkill = -50;
object oidBestSearcher = OBJECT_INVALID;
int nCount = 1;

// Find the best searcher within the search radius.
object oidNearestCreature = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nDoneSearch = 0;
int nFoundPCs = 0;

while ((nDone == 0) &&
(nDoneSearch == 0) &&
(oidNearestCreature != OBJECT_INVALID)
)
{
// what is the distance of the PC to the door location
float fDist = GetDistanceBetween(OBJECT_SELF,oidNearestCreature);

if (fDist <= fSearchDist) { int nSkill = GetSkillRank(SKILL_SEARCH,oidNearestCreature); if (nSkill > nBestSkill)
{
nBestSkill = nSkill;
oidBestSearcher = oidNearestCreature;
}
nFoundPCs = nFoundPCs +1;
}
else
{
// If there is no one in the search radius, don't continue to search
// for the best skill.
nDoneSearch = 1;
}
nCount = nCount +1;
oidNearestCreature = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF ,nCount);
}

if ((nDone == 0) &&
(nFoundPCs != 0) &&
(GetIsObjectValid(oidBestSearcher))
)
{
int nMod = d20();

// did we find it.
if ((nBestSkill +nMod > nDiffaculty))
{
location locLoc = GetLocation (OBJECT_SELF);
object oidDoor;
// yes we found it, now create the appropriate door, EDIT THE LINE BELOW TO CHANGE RESREF OF SPAWNED DOOR
oidDoor = CreateObject(OBJECT_TYPE_PLACEABLE,"NW_PL_HIDDENDR01",locLoc,TRUE);

SetLocalString( oidDoor, "Destination" , "DST_"+sTag );
// make this door as found.
SetLocalInt(OBJECT_SELF,"D_"+sTag,1);
SetPlotFlag(oidDoor,1);
SetLocalObject(OBJECT_SELF,"Door",oidDoor);

} // if skill search found
} // if Object is valid
}