/* An object which will give a small amount of XP to a player the first time
* that player visits that location.
* A level 1 player will get 30 experience points.
* A level 19 player will get 3374 experience points.
* Defaults are given, so if you only need one of such object, no
* configuration is needed.
*/
#define XP_FOR_LEVEL_ONE 30
#define DELIMITER "^!"
#define DEFAULT_NAME "playerlogger"
#define DEFAULT_FILE_NAME DEFAULT_NAME+"file"
string SaveString;
string SaveName;
string FailMessage;
string OKMessage;
set_fail_message( str)
{
FailMessage = str;
}
set_ok_message( str)
{
OKMessage = str;
}
set_name(str)
{
string TmpString;
if (extract(file_name(previous_object()), 0, 4) != "/obj" &&
!creator(this_object())&&!creator(previous_file())) {
write("Illegal usage, Savefile-path is illegal.\n");
destruct(this_object());
}
if ( TmpString = creator( this_object()) || ( TmpString = creator( previous_object())))
SaveName = "players/"+TmpString+"/";
else
SaveName = "obj/";
if ( str)
SaveName=SaveName+str;
else
SaveName=SaveName+DEFAULT_FILE_NAME;
if( !restore_object( SaveName)) {
SaveString = DELIMITER;
save_object( SaveName);
log_file( "PlayerLogger",TmpString + " <" + SaveName +"> "+ctime(time())+"\n");
}
}
query_name()
{
return SaveName;
}
id(str)
{
return (str==DEFAULT_NAME)||(SaveName&&(str==SaveName));
}
short()
{
if ( this_player() && this_player()->query_level() >= 20)
return "A player logger, name: <"+SaveName+">";
else
return 0;
}
init()
{
if ( this_player() && query_ip_number( this_player())) {
if (! PlayerHasVisited( this_player()->query_name())) {
if ( OKMessage)
tell_object( this_player(), OKMessage);
else
tell_object( this_player(), "You feel more experienced.\n");
this_player()->add_exp( AmountOfPlayerXP());
AddPlayerToList( this_player()->query_name());
}
else
if ( FailMessage)
tell_object( this_player(), FailMessage);
}
}
PlayerHasVisited( str)
{
if ( str)
return sscanf( SaveString, "%s"+DELIMITER+str+DELIMITER, str);
else
return 0;
}
AddPlayerToList( str)
{
if ( str) {
SaveString = SaveString+str+DELIMITER;
save_object( SaveName);
}
}
AmountOfPlayerXP()
{
int Amount, Level;
if ( this_player()) {
Amount = XP_FOR_LEVEL_ONE;
Level = this_player()->query_level();
while( Level > 0) {
Amount = ( Amount * 13) / 10;
Level -= 1;
}
return Amount;
}
return 0;
}
reset(arg)
{
if(arg)
return;
if(!SaveName)
SaveName = DEFAULT_FILE_NAME;
set_name( SaveName);
}