I have to admit that, having beaten the game and finally being familiar with how things fit together, the extra challenge mode seemed like a cool idea. Wow, a player could really make this game as hard or easy as they want to; I could see a fun optimization puzzle emerging. I have to admit that I never actually played much with this extra mode, but it was cool to see and finally understand.
I've pondered nice ways to provide a similar experience for players, and the easiest answer I came up with was to give the player a magic word when the game is completed that turns on debugging mode. They'd be able to look at the object tree, move objects or the player around, or even control how daemons run. I thought this would be a fun way to share the innards of the game with the player; for some reason, having game source available doesn't provide the same thrill unless it's, say, in Hugo and I'm applying new Roodylib functionality to it or something for my own curiosity.
Today's code sample supplies this magic word debugging system.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
! set the following flags (a Roodylib shell file is required) | |
#set HUGOFIX | |
#set UNLOCKABLE_DEBUG | |
! Define your magic word in your grammar | |
xverb "magicword" | |
* DoDebugMagicWord | |
! add the following before routine to your player character object | |
player_character you "you" | |
{ | |
before | |
{ | |
#ifset HUGOFIX | |
actor DoHugoFix | |
{ | |
#if UNLOCKABLE_DEBUG | |
if not debug_on | |
{ | |
! this fakes a "that wasn't understood" response for debugging | |
! commands if they haven't been unlocked with the magic word | |
print "You don't know the word \""; word[1] ; "\"." | |
return true | |
} | |
#endif | |
return false | |
} | |
#endif | |
} | |
} | |
#ifset HUGOFIX | |
#ifset UNLOCKABLE_DEBUG | |
global debug_on | |
#endif | |
! Roody's note: Only load debugging values for game state changes if the magic | |
! word has been turned on | |
replace hugofixlib "hugofixlib" | |
{ | |
in init_instructions | |
type settings | |
did_print true | |
#ifclear NO_FANCY_STUFF | |
save_info | |
{ | |
local b | |
#ifclear UNLOCKABLE_DEBUG | |
local debug_on = true | |
#endif | |
#ifset UNLOCKABLE_DEBUG | |
if debug_on | |
b = true | |
else | |
return | |
#endif | |
if not (debug_flags or debug_on) ! if absolutely no debug flags are | |
return ! turned on, just return right away | |
if debug_flags & D_FUSES | |
b = SaveWordSetting("fuses",b) | |
if debug_flags & D_OBJNUM | |
b = SaveWordSetting("objnum",b) | |
if debug_flags & D_PARSE | |
b = SaveWordSetting("parse",b) | |
if debug_flags & D_SCRIPTS | |
b = SaveWordSetting("scripts",b) | |
if debug_flags & D_FINDOBJECT | |
b = SaveWordSetting("findobject",b) | |
if debug_flags & D_PARSE_RANK | |
b = SaveWordSetting("parserank",b) | |
if debug_flags & D_PLAYBACK_HELPER | |
b = SaveWordSetting("playbackhelper",b) | |
if debug_flags & D_OPCODE_MONITOR | |
b = SaveWordSetting("opcodemonitor",b) | |
return true | |
} | |
#endif | |
execute | |
{ | |
if word[LAST_TURN] ~= "undo","restore" | |
{ | |
#ifclear NO_FANCY_STUFF | |
local a,b | |
a = CheckWordSetting(self.name) | |
while a | |
{ | |
#ifset UNLOCKABLE_DEBUG | |
debug_on = true | |
#endif | |
select word[(a+1)] | |
case "fuses" : b = D_FUSES | |
case "objnum" : b = D_OBJNUM | |
case "parse" : b = D_PARSE | |
case "scripts" : b = D_SCRIPTS | |
case "findobject" : b = D_FINDOBJECT | |
case "parserank" : b = D_PARSE_RANK | |
case "playbackhelper" : b = D_PLAYBACK_HELPER | |
case "opcodemonitor" : b = D_OPCODE_MONITOR | |
case else : break | |
debug_flags = debug_flags | b | |
a++ | |
} | |
#endif | |
OrganizeTree | |
#ifset UNLOCKABLE_DEBUG | |
if debug_on | |
#endif | |
HugoFixInit | |
} | |
} | |
} | |
#endif | |
! We replace GameTitle so the game banner doesn't show debugging mode unless | |
! the magic word has turned it on | |
replace GameTitle | |
{ | |
color TITLECOLOR | |
Font(BOLD_ON | ITALIC_OFF) | |
print GAME_TITLE; | |
Font(BOLD_OFF | ITALIC_OFF) | |
color TEXTCOLOR | |
#ifset DEMO_VERSION | |
print "\B (demo version)\b"; | |
#endif | |
#ifset HUGOFIX | |
#ifset UNLOCKABLE_DEBUG | |
if debug_on | |
#endif | |
print "\I (HugoFix Debugging Suite Enabled)\i"; | |
#endif | |
} | |
! turns on debugging mode | |
routine DoDebugMagicWord | |
{ | |
if not debug_on | |
{ | |
"Debugging verbs turned on. Type \"$?\" for full list." | |
debug_on = true | |
} | |
else | |
{ | |
"Debugging verbs turned off." | |
debug_on = false | |
} | |
} |
Now I just need to write a game that players would want to dig into!
No comments:
Post a Comment