[crossfire] Quest management system proposal
Mark Wedel
mwedel at sonic.net
Fri Aug 4 01:48:09 CDT 2006
Nicolas Weeger (Laposte) wrote:
> Hello.
>
> I'm resurrecting that topic :)
> (long mail warning)
>
> After much thinking, I've changed my mind. IMO a quest management system could
> very well be written in Python, with a few improvements to the plugin system.
>
> What I'd add:
>
> First, extend the NPC dialog system.
> To enable more interesting dialogs, add some "parameters" after the @match
> line, to build a graph-like system.
> Two things:
> * @name <name> which would give the step's name "activated" when player says
> the matching
> * @follow <name> which would be the required step to actually have a match
>
> <name> would be any arbitrary name, with an optional * in front.
> No star => step is NPC specific, and thus step info is stored in NPC's
> inventory
> Star => step is player specific, and thus stored in player's inventory
Looking at that, and looking at your example, it seems hardly really clear to
follow.
It also seems like under such a system, it could be difficult for
conversations/quests to skip steps. I'm not sure of where that would be used,
but perhaps cases where the quest is looking for prerequsites (must have some
skill, if not, tell player to get skill, if player has skill, skip to stage
about telling playg about next thing to do).
As such, I wonder if having a variable, or even better, multiple variables,
that hold actual values instead of follows would be better.
eg,:
@match hello
@set state=1
Hello, what bad weather, isn't it?
@match weather
@compare state=1
@set state=2
Yes, lately the weather's been really bad, people are starting to talk about
curses and such
@match curse
@compare state>1
@set *weather_curse=1
A witch living nearby said there was something about seeing curses.
....
@match *
@compare *weather_curse>2 # this is set when player completes quest
Than you for taking care of that witch
I think this isn't that much complicated (limit the @set to simple syntax,
limit @compare to basic set of operations)
And to me, that is easier to follow/debug. I would think that internally, the
name/follow would have to store some value in the variables, but if we expose
that to the map maker, it gives more flexibility. Also, if we presume all of
these player (*variables) are global, it means different NPC's could update
quest information.
I think that for the NPC state data, that should probably be stored in a force
object that expires after some amount of time (like 1 minute real-time after
last update). After all, other players may interact with that NPC, and state
should reset for them.
Also, from what I can see, these changes are actually unrelated to the quest
management piece - this is just improved NPC interaction, which is needed for
quests.
>
> For the quests, I'd do a plugin (or a Python script) to manage quest steps and
> rewards on a player-basis.
My personal inclination would be the quest not to be a script - ideally a core
part of the server, lesser would be a plugin.
I'd put using a python script near the bottom. Not that python is inherently
bad, but I think for developer reasons. In theory, the entire crossfire server
could be in python - that obviously won't happen. But given that the server is
currently in C, it is quite reasonable to expect all developers to know C. But
if there are bugs/improvements that need to be done to the script, but the
developer doesn't know python, not sure where that really leaves things.
> There are some caveats, though:
> * quest information will be dispatched between many maps, even if quest file
> could contain all information (duplication, in this case)
> * also, what should happen when players having done different steps of a quest
> party together and do a quests's step? All players move to new step (unless
> they are at a next step already), players not having done previous steps
> don't gain anything?
That's a trickier one - especially if completing the quest requires some item.
If the party has the item, but doesn't complete the quest before the party
breaks up (or more importantly, one of the members log out), a player quest
state could be at a point where they really can't be at.
OTOH, you don't want a case where player is about to complete quest and get
reward, and then have everyone join them to get that bonus exp (one question if
the reward is exp, does it get divided by number of people in party? Does each
player just get full reward?). I'd almost say quests can't be shared across
parties.
> * doing quest would request Python scripting (unless we add a quest-specific
> basic language, like: "give hiding 5000" for rewards)
As a note, the ability to give such rewards just in general could be nice not
really related to quests. Drop an item, get some exp reward, etc.
>
>
> Here's a small quest file example that could be done:
>
> quest kill_boss
> description
> You must kill the evil boss that sends minions to the town
> enddescription
> transition boss_killed end
> step end
> message
> Congratulations, you killed the evil boss!
> People in town rejoice!
> endmessage
> reward
> give exp 5000 hiding
> endreward
> endstep
That isn't really readable at a first glance, but perhaps if indentation is
used like treasurelists, that would be better.
I also wonder if the transition and step are both needed - it seems somewhat
redundant - something like:
transition boss_killed
message
...
endmessage
reward
...
endreward
endtransition
More information about the crossfire
mailing list