Seems to me, what it all boils down to is accountability. These systems are great if they make you feel accountable for your actions and think about the possible consequences. They're not so great if they punish you for unforeseeable consequences, accuse you of doing things you never did, refuse to reward you for things you DID do, etc. Generally speaking, this is what people complain about the most in modern RPGs. When Three Dog can't keep good track of what Vault101Guy has done, it makes the player feel like the game isn't taking them seriously. Just like when you shoot a guy with a bow and arrow in Skyrim, and he wanders around for 30 seconds trying to find out who did it, and then goes back to bed like nothing ever happened. You weren't really held accountable/properly credited, and it makes you take the game less seriously.
One of the main reasons I think you see so much "Eat Baby/Save Baby" crap is because so many of the games that've chosen to implement this kind of system are quest based. When you decide you're not hungry enough to eat the baby and it's too dangerous to save him, you don't get any "normal person!" points because you've effectively ignored the quest, and the game doesn't ever make you accountable for that decision. The baby will sit there forever, and no one will save him or eat him unless you take the initiative to do it.
There's also usually a note in your Quest Log like... "Baby - Should do something about him." which encourages you to make a choice one way or the other and makes you feel like you can never leave any quest unanswered. Ignoring the baby (Or the quest) should be a choice, a perfectly fine and rational choice given that everyone else in the game world is doing it. And in a few days when the baby is gone, and you wonder what happened to it? That's your punishment for not doing the quest. You don't get to find out.
Instead, what Fallout 3 and a lot of games do, is they just make three textboxes. "I'll do it, because it's the right thing to do!" for maximum good, "I'll do it, but only because no one else is around to do it" for neutral, and "I'll do it, but first let's negotiate my paycheck" for evil. That saves them a lot of time (because they only need one quest and can get three outcomes), and there's cases where it can be appropriate, but mostly it just feels lazy to me. I do really love these kinds of systems because they make you more immersed into the role you're trying to play when they work, but they make you not want to bother when they don't.
And tie it into the gameplay more, for cryin' out loud. Think of all the westerns where the bad guys ride into town, and everyone locks their doors and boards up their windows, and the poor guys at the saloon have to pour them drinks and laugh at their jokes till John Wayne shows up. Good will is a commodity to be traded, unpoison the well and then lord it over the villagers for free food for the rest of their lives! Just don't do that stupid "You're so good/evil that The Devil/God has sent guys to kill you!" routine, I hate that shit.
(Weird too, the original Fallout games had a lot of traits that would change how people reacted to you, beyond just the Good/Evil spectrum. Even if you're the nicest guy in the world, you screw up and kill a kid and it's going to follow you wherever you go. That's something I've seen in this thread like 4 times, and it's something they got right damn near 20 years ago and they get wrong now. Progress my ass.)
Surprised nobody mentioned Chronoboy Adventures which I also open sourced after I sort of gave up on the project. In that game, I build a similar system, but it was called a Karma System. Rather than keeping to simple textbox choices the player could make, the game also included player actions, such as if a player actually sold a quest item, rather than delivering it like a good boy. Here is the source of KARMA.HSI from the game's source code. I'll place the actual plotscripts under the LGPL, so that you may freely use it without open sourcing the rest of your game's code:
Overall, the game heavily used globals over tags, and all textboxes were entirely driven from plotscript rather than the standard textbox system built-in. This enabled the code to control exactly which textboxes appeared next depending on some global variable or the player's Karma. Here's a basic example of a dialog tree with karma support:
The time component of the game was part of it's downfall, as it used a real-time clock, and lots of events were based on this clock, similar to say Animal Crossing. This made playing the game for some people very irritating as not everybody can play at specific times. Lesson learned on this one. If I ever pick up this game again and finish developing it, I'll change the clock system to use a clock similar to that of the old Ultima games, where every step the player takes is an in-game minute. Anyways, let me know if you wanted a copy of the source code, and I'll send a copy your way.
Edit: Okay, so I went on and played my old game here, and now playing it after so many years, I am seeing tons of dialog issues, a couple weird bugs, among other interesting things. It really puts your own game into perspective when you play it again after a couple years of not updating or playing it. Some of the weird bugs I swear I never noticed originally though, so I am confused about them. Anyways, I am starting to understand the community's backlash on this game now. If I did jump back into development, I think the first thing that needs to be fixed is the dialog, as I wrote some very questionable things...
Code:
script, lose karma,amount, begin
karma:=karma--amount
if (karma <<0>> 100) then (karma:=100)
end
plotscript, check alignment, begin
if (karma <<25>> 75) then ($2 = "Good")
if (karma >> 24,and,karma << 76) then ($2 = "Neutral")
if (karma <<1>> 99) then ($2 = "An Angel")
$1 = "Current Alignment: "
1 $+ 2
show textbox (1)
wait for textbox
end
plotscript, sold produce, begin
if (check tag(tag:EvilAtk)) then, begin
set tag(tag:EvilAtk,off)
lose karma (2)
$1="Lost karma for selling goods."
$2="They are suppose to be placed"
$3="in the shed!"
$4="Keep doing this, if you want an"
$5="evil alignment character."
show textbox (5)
wait for textbox
end
if (check tag(tag:SoldGood)) then, begin
set tag(tag:SoldGood,off)
lose karma (10)
$1="Lost karma for selling Quest"
$2="Item for a Good character."
$3="Keep doing this, if you want an"
$4="evil alignment character."
show textbox (4)
wait for textbox
end
if (check tag(tag:SoldEvil)) then, begin
set tag(tag:SoldEvil,off)
gain karma (5)
$1="Gained karma for selling Quest"
$2="Item for a Evil character."
$3="Keep doing this, if you want a"
$4="good alignment character."
show textbox (4)
wait for textbox
end
end
plotscript, karma battle,fnum,fset, begin
if (current map == map:Labina Pass 1) then, begin
if (karma >> 25) then (fight formation (fnum))
end
if (current map == map:Labina Pass 2) then, begin
if (karma >> 25) then (fight formation (fnum))
end
if (current map == map:Waku Cavern) then, begin
if (karma >> 25) then (fight formation (fnum))
end
end
script, lose karma,amount, begin
karma:=karma--amount
if (karma <<0>> 100) then (karma:=100)
end
plotscript, check alignment, begin
if (karma <<25>> 75) then ($2 = "Good")
if (karma >> 24,and,karma << 76) then ($2 = "Neutral")
if (karma <<1>> 99) then ($2 = "An Angel")
$1 = "Current Alignment: "
1 $+ 2
show textbox (1)
wait for textbox
end
plotscript, sold produce, begin
if (check tag(tag:EvilAtk)) then, begin
set tag(tag:EvilAtk,off)
lose karma (2)
$1="Lost karma for selling goods."
$2="They are suppose to be placed"
$3="in the shed!"
$4="Keep doing this, if you want an"
$5="evil alignment character."
show textbox (5)
wait for textbox
end
if (check tag(tag:SoldGood)) then, begin
set tag(tag:SoldGood,off)
lose karma (10)
$1="Lost karma for selling Quest"
$2="Item for a Good character."
$3="Keep doing this, if you want an"
$4="evil alignment character."
show textbox (4)
wait for textbox
end
if (check tag(tag:SoldEvil)) then, begin
set tag(tag:SoldEvil,off)
gain karma (5)
$1="Gained karma for selling Quest"
$2="Item for a Evil character."
$3="Keep doing this, if you want a"
$4="good alignment character."
show textbox (4)
wait for textbox
end
end
plotscript, karma battle,fnum,fset, begin
if (current map == map:Labina Pass 1) then, begin
if (karma >> 25) then (fight formation (fnum))
end
if (current map == map:Labina Pass 2) then, begin
if (karma >> 25) then (fight formation (fnum))
end
if (current map == map:Waku Cavern) then, begin
if (karma >> 25) then (fight formation (fnum))
end
end
Overall, the game heavily used globals over tags, and all textboxes were entirely driven from plotscript rather than the standard textbox system built-in. This enabled the code to control exactly which textboxes appeared next depending on some global variable or the player's Karma. Here's a basic example of a dialog tree with karma support:
Code:
script, waku farmer,npcref, begin
$1 = "Farmer:"
if (hour == 12) then, begin
$2 = "Can't a lowly farmer eat in peace?"
$3 = "Come talk to me after lunch!"
$4 = ""
$5 = ""
if (karma <<26>> 25) then, begin
$3 = "Labina pass up a head is full of"
$4 = "bandits as of late."
$5 = "Take care of yourself there."
end,else,begin
$3 = "I'm sure the bandits up head"
$4 = "won't attack you, they only attack"
$5 = "good lawful people."
end
end
show textbox (5)
wait for textbox
end
script, waku farmer,npcref, begin
$1 = "Farmer:"
if (hour == 12) then, begin
$2 = "Can't a lowly farmer eat in peace?"
$3 = "Come talk to me after lunch!"
$4 = ""
$5 = ""
if (karma <<26>> 25) then, begin
$3 = "Labina pass up a head is full of"
$4 = "bandits as of late."
$5 = "Take care of yourself there."
end,else,begin
$3 = "I'm sure the bandits up head"
$4 = "won't attack you, they only attack"
$5 = "good lawful people."
end
end
show textbox (5)
wait for textbox
end
The time component of the game was part of it's downfall, as it used a real-time clock, and lots of events were based on this clock, similar to say Animal Crossing. This made playing the game for some people very irritating as not everybody can play at specific times. Lesson learned on this one. If I ever pick up this game again and finish developing it, I'll change the clock system to use a clock similar to that of the old Ultima games, where every step the player takes is an in-game minute. Anyways, let me know if you wanted a copy of the source code, and I'll send a copy your way.
Edit: Okay, so I went on and played my old game here, and now playing it after so many years, I am seeing tons of dialog issues, a couple weird bugs, among other interesting things. It really puts your own game into perspective when you play it again after a couple years of not updating or playing it. Some of the weird bugs I swear I never noticed originally though, so I am confused about them. Anyways, I am starting to understand the community's backlash on this game now. If I did jump back into development, I think the first thing that needs to be fixed is the dialog, as I wrote some very questionable things...



