the initial conversation gives 3 options for player response: Snarky, neutral, positive.
Given a sufficiently detailed description of the desired behavior, we can make the database do anything. It's good to talk about mechanics, and especially examples, in this thread to better the design.
I am for having PC responses be listed as a summary of the sentiment as opposed to the whole statement for brevity. Mass Effect has this and I found it enjoyable. I also think this plays into the "decisions NOT management" mechanics goal. I would like to still annotate things with an indication of what skill they are based upon. An example might be:
NPC Johnson "So I told you all the specifics, do we have a deal?"
1) I'll do it
2) No deal
3) Let's talk again about the cred (negotiations)
4) Give me more cred! (intimidation)
The other aspect you touch upon, and something that is well done in ME, is that the "information" conversation options are presented separate from the "decision" options. This makes it so some player can decide immediately while others choose to delve deeper into info, coming back to the decision after learning more.
what is the general idea between what is stored in the database and what is stored only on the engine side
Great jumping off point. I have been working under these expectations (which I have been analyzing throughout the process, so they are not set in stone). The part we'll call "database" is any stored procedures, functions, views, tables, etc that we build to hold and represent data. For "engine" we can include Kismet, UnrealScript, C++, or even further scripting languages like Python that we may integrated into the C++ part of the engine to support customizability. For me, the responsibilities divide as follows:
Database- Per entity data (entities being: players, NPCs, missions, etc) - Data that must be stored on a per-entity basis where we have several entities should go in the database. Character information is obvious (since we will have thousands of players one day), but things like factions. Also, data that must be related to one of these entities.
- Data that must be shared between player sessions - Data that a user creates or consume on Monday night that must also be there when they log back in Tuesday morning. Things like current character stats, storyline progress, contacts & enemies, etc, are all things that must be tracked over time.
- Data that must be shared between zones - Data that follows a user when traversing zones must be kept. This includes inventory, perhaps sustained spells.
- Data we wish to control over time - Keeping everyone's copy of the engine in sync is more challenging that just changing database data. That is why it is attractive to store things like mission and conversation definitions in the database, where we can add, remove, or change them at will without forcing people to patch the engine.
- Statistics - Any metric we want to apply to the player or character population (average strength attribute, character with highest karma, player with most friends, etc) we need to store in the database so we can make pretty SQL queries instead of ugly coding loops. The place where this gets questionable is things that have potentially myriad effect, like cyberware on PC attributes, we should want a flexible definition that fits in a single column; however, such a definition is unlikely to be possible to unravel during queries. This is quintessential for improving the game over time, as well as monitoring the community in general.
Engine (UnrealScript, C++, or TBD scripting languages)- Universal Constants - Things like the coefficients of game rule equations (EG how many physical or stun boxes does a character have, how many automatic hits a skill rating will give a character) are likely to be used often and pervasively in the engine. Especially constants used in operations that would not otherwise force a database call.
- Values Changed by Script - Characters represent a whole stack of effects (cyberware, spells, gear, adept powers, qualities, etc) laid atop a set of core stats. Since the definition for the various abilities are likely to be held in script, and script can only be executed in the engine, a lot of character stats can only be determined by the engine.
Again, these represent the areas I've identified so far, not all possible areas or even the big gray stretches between. The big grey area, IMO, concerns the capability for each side to cache values from the other. For instance:
- Some universal constants in the engine could be queried from the database when a UE3 server is started, enabling the database to act as the total configuration for a server. The client would be updated either via its connection to the world server or via the server.
- Some values calculated by scripting could be cached in the database when characters leave zones (or other conditions), enabling the zone transitions to be more expedient and leaving re-calculation only to events that provoke one (such as when cyberware is installed, adept powers are activated, etc).
Both of these could be useful and both subvert solid lines between areas. I think both could be included given enough popular support and definite improvement from them.
where do transient NPCs within missions fit into the DB schema
Well, if you think about it, all of the Character definitions are really templates which the game engine uses to instantiate character models with supporting stats in the game world. One could just as easily create 100 copies of a character as they could 1 using the same database data as create one. My intentions is to have NPCs be largely represented by a relatively small number of character definitions that are instantiated as needed. For instance, you could make a character modeled after the Fixer in the SR4 manual and it would appear once in the Characters table, completed with associated skills, gear, etc. Then, you could have many entries in the contacts table that reference the single Fixer definition, but are in fact one instance per player character that has a fixer. The contacts table in this design would store the per-contact information like the NPC's name, faction associations, and other info.
It grows a bit more complex when it comes to NPCs that may traverse zones (such as an NPC that could chase a party throughout Seattle) or related to missions. I think they will need to be tracked much in the way of contacts (a table that holds onto per-instance information, ultimately relying on a shared character definition underneath). I am up in the air as of this writing, so feel free to interject.
Can you expand more about the total damage tracks being manipulated in config files?
This is related to the "universal constants" thing mentioned in the database vs. engine discussion. There will be some formula somewhere in the engine that looks at a character's cumulative stats and spits out the number of physical boxes. The constant numbers that might appear in such a formula could appear in either a config file or config section of the database, allowing for us to adjust difficulty settings or otherwise tweak gameplay by modifying the constant instead of revisiting the code. Currently, most of these constants appear in the old OGRE code in the SrConstants.h and SraConstants.h files.
Keep asking questions and baking your noodles. I know mine is still frying since it feels like this really sets out to be the sum of all mechanics knowledge in the game. I will likely still start playing with C++ code for it a bit to get a bit more practical in my designing, as opposed to just twiddling on theoretical tables. Obviously, the database can be designed and revised into the future while we build up core data features. So, things like defining characters is a very NOW problem as opposed to perhaps defining conversations, which is a LATER problem.