[DGD] Immortal Cheating

Steve Wooster s.f.m.wooster+dgd at gmail.com
Sun Oct 1 04:02:23 CEST 2006


Hi... I figured I'd test my new e-mail address and filters by posting an 
idea I had for preventing immortals from cheating.

I used to volunteer at a mud where non-intervention was an important 
aspect of immortal conduct - it was strictly against the rules for 
immorts to help/hinder players in any sort of potentially 
gameplay-related sense (with the exception of helping lost newbies with 
information) and areas had to undergo a rigorous QC process before being 
added to the game. Unfortunately, sometimes people would disregard those 
rules, creating items to level up their friends, or giving them 
uber-weapons, or modifying previously QCed code to unbalance it. As far 
as I could tell, there wasn't an easy way to detect or prevent untrusted 
code from interacting with the game.

So my idea is to have the concept of "in-game" (as opposed to immortal 
toys or code that's in production) be an inherent part of objects. An 
object would be considered in-game (IG) only after being QCed, and 
out-of-game (OOG) objects could only have restricted interaction with 
in-game objects. So a wiz-tool might be able to ask a player object what 
their stats are, but it wouldn't be able to modify them. Coders could 
change IG code in case of emergencies or to fix reported bugs, but all 
such changes would be logged for admins to review. OOG code would not be 
kept track of at all.

So what I've been trying to think about is a good way of preventing OOG 
functions from calling restricted functions of IG code. One possibility 
would be to provide an afun like validateCall() which would runtime if 
the function was IG but its caller was OOG. But that could be clunky and 
inconvenient, so I'd like to make something a little more seamless. So I 
thought about something along these lines:

private int __outOfGame;
static mixed call_other( mixed obj, string function, mixed args... ) {
    if ( __outOfGame ) {
        if ( !::call_other( obj, "__queryOutOfGame" ) && 
isCapitalized(function) ) /* capitalized functions are considered 
restricted */
            runtime("OOG objects cannot call restricted funcions in IG 
objects");
    }
    return ::call_other( obj, function, args... );
}

Do other people thing overriding call_other() like this would take too 
much overhead for IG objects?

Another possibility I was thinking of, was to switch out versions of 
auto-objects... when the object-daemon would load an OOG object, it 
would recompile the auto object to include an overridden call_other(), 
but when loading IG objects, it would recompile the auto-object to omit 
that code. Although it would lead to longer load-times and more 
object-daemon complexity, I was thinking that maybe that could allow IG 
code to be unhindered by security checks.

One thing I haven't really put much thought into, is if you discover 
that somebody has used IG code to cheat, how do you detect who they helped?

-Steve Wooster





More information about the DGD mailing list