[crossfire] 2.0 object-type refactoring
Mark Wedel
mwedel at sonic.net
Mon Oct 30 23:58:49 CST 2006
Alex Schultz wrote:
> Well, the way I was thinking of doing it, would be to replace specific
> calls to apply, drop, etc as they are sprinkled throughout the code, and
> keep common code such as you say, in a "common" subdirectory of the
> types directory, and then have the callback called by ob_apply(), call
> something like ob_apply_common() at the start of it's code.
> IMHO, with this method, the best way to handle legacy non-separated
> logic would be to move that legacy logic to the "types/common"
> subdirectory, and set it up so ob_apply() and such will call that if it
> can't find a callback registered for the type.
That works I suppose. You do get into various questions that have no clear
answer. Like 'should the main drop function be in the commands.c file (since it
is a command the player issues) or should it be in the types/common.c file'
I'd be somewhat inclined to have the command logic still in the command
(c_...) files, and from there, it does the callback. It seems (to me at least)
that is a little better - the basic command logic is still in the commands file,
and the actual object specific drop is in the types area. But I can also see
the other point - lets put all the common object operations together.
I also do think that if there are standards in place that all objects should
follow (like not letting unpaid objects be used), that should be enforced, and
not something that is affected by object type. If some objects really should
change the behaviour, I'd be more inclined to say they should have specific
flags for such variations - one reason there are some many object types right
now is that there is some of that 'if type==FOO, I behave 95% like BAR, except
for this one little case'. The problem this leads to is down the road, someone
says 'which do I use, FOO or BAR', where if there was just a flag which
controlled that basic actions, that is clearer.
The other reason I'd like there to be common functions is that I think it will
make debugging a little easier. With a single function that then makes the
callbacks if necessary, I can easily set a breakpoint in there to catch when any
object of any type does that action. Otherwise, there isn't any easy way to
catch 'if any object of any type is dropped' type of thing, unless there is a
common function that every object type uses 100% of the time.
But it probably is more stylistically - to me, this seems cleaner:
void action()
{
some common code
make object callback
}
vs
void action_for_type()
{
make_common_call_for_all_types()
do my specific code
}
It just seems that if everything is going to call
make_common_call_for_all_types(), why not just call that in the first place?
>> Other thought not related to the above:
>> Given this is a major restructure, would it make sense to collapse/redo some of
>> the types, particularly the equipable equipment?
> IMHO This should be done as well, though one question is: would it be
> worth completely redoing the type numbers and converting all of the
> maps/arches? Or should we try to keep the numbers the same where
> possible, and have the loader change type values that were collapsed to
> the new value?
If maps are changing the object types, they are broken. While it is sometimes
done, changing object types is pretty much never good behaviour, because other
aspects of the object are not updated.
However, for the archetypes, they should be updated with the new numbers - it
shouldn't be hard to do, and is definitely the right approach.
More information about the crossfire
mailing list