/* -*- LPC -*- */ /* * $Locker: $ * $Id: rearrange.c,v 1.5 2002/03/18 09:43:24 terano Exp $ * $Log: rearrange.c,v $ * Revision 1.5 2002/03/18 09:43:24 terano * Made the message even less open to interpreation, as players are STILL complaining they left points int he pool accidently. * * Revision 1.4 2000/03/25 06:34:32 taffyd * Fixed typo. * * Revision 1.3 2000/02/22 01:28:11 sin * added some logging. * * Revision 1.2 1998/08/19 10:20:59 pinkfish * Make it inherit the correct base. * * Revision 1.1 1998/01/06 05:27:04 ceres * Initial revision * */ #include <playerinfo.h> #define ME_CON points[ this_player() ][ "me_con" ] #define ME_DEX points[ this_player() ][ "me_dex" ] #define ME_INT points[ this_player() ][ "me_int" ] #define ME_STR points[ this_player() ][ "me_str" ] #define ME_WIS points[ this_player() ][ "me_wis" ] #define POOL points[ this_player() ][ "pool" ] inherit "/cmds/guild_base"; mapping points = ([ ]); int cmd(); void create() { ::create(); set_command_name("rearrange"); } /* create() */ void do_save() { int player, here; player = this_player()->query_real_con() + this_player()->query_real_dex() + this_player()->query_real_str() + this_player()->query_real_int() + this_player()->query_real_wis(); here = ME_CON + ME_DEX + ME_STR + ME_INT + ME_WIS; if (player != here) { log_file("BAD_REARRANGE", sprintf("%s: %s had %d now has %d\n", ctime(time()), this_player()->query_name(), player, here)); PLAYERINFO_HANDLER->add_entry( this_object(), this_player()->query_name(), "misc", sprintf("rearranged from %d points to %d points", player, here), 0); } this_player()->set_con( ME_CON ); this_player()->set_dex( ME_DEX ); this_player()->set_int( ME_INT ); this_player()->set_wis( ME_WIS ); this_player()->set_str( ME_STR ); this_player()->remove_known_command( "rearrange" ); map_delete(points, this_player()); } /* do_save() */ void display_stats() { printf( "Con: %d Dex: %d Int: %d Str: %d Wis: %d Pool: %d\n", ME_CON, ME_DEX, ME_INT, ME_STR, ME_WIS, POOL ); } /* display_stats() */ int get_stat_bit( string word ) { int num; string stat; word = lower_case( word ); if ( word == "save" ) { if ( POOL ) { write( "WARNING: You still have points left in your pool that " "could be used to make your character more powerful. If you " "leave these unspent now, you will not be able to get them again later. " "Are you sure you want to save? [y/n] " ); input_to( "get_check" ); return 1; } write( "Saving.\n" ); do_save(); return 1; } if ( word == "quit") { write( "Quitting.\n" ); map_delete(points, this_player()); return 1; } if ( word == "reset" ) { write( "Resetting to previous arrangement.\n" ); return cmd(); } if ( sscanf( word, "%s %d", stat, num ) != 2 ) stat = word; if ( !stat || ( stat == "" ) ) stat = "X"; if ( num > POOL ) if ( !POOL ) { write( "Cannot add to stat. Need to add to the pool first.\n" ); stat = "X"; } else { write( "Pool has only "+ POOL +" points in it. "+ "Adding these to stat.\n" ); num = POOL; } switch( stat[ 0 ] ) { case 'c' : if ( ( ME_CON + num ) < 8 ) { write( "Cannot set constitution to less than 8.\n" ); } else if ( ( ME_CON + num ) > 23 ) { write( "Cannot set constitution to more than 23.\n" ); } else { ME_CON += num; POOL -= num; } break; case 'd' : if ( ( ME_DEX + num ) < 8 ) { write( "Cannot set dexterity to less than 8.\n" ); } else if ( ( ME_DEX + num ) > 23 ) { write( "Cannot set dexterity to more than 23.\n" ); } else { ME_DEX += num; POOL -= num; } break; case 'i' : if ( ( ME_INT + num ) < 8 ) { write( "Cannot set intelligence to less than 8.\n" ); } else if ( ( ME_INT + num ) > 23 ) { write( "Cannot set intelligence to more than 23.\n" ); } else { ME_INT += num; POOL -= num; } break; case 's' : if ( ( ME_STR + num ) < 8 ) { write( "Cannot set strength to less than 8.\n" ); } else if ( ( ME_STR + num ) > 23 ) { write( "Cannot set strength to more than 23.\n" ); } else { ME_STR += num; POOL -= num; } break; case 'w' : if ( ( ME_WIS + num ) < 8 ) { write( "Cannot set wisdom to less than 8.\n" ); } else if ( ( ME_WIS + num ) > 23 ) { write( "Cannot set wisdom to more than 23.\n" ); } else { ME_WIS += num; POOL -= num; } break; default : break; } display_stats(); write( "Enter [d|c|i|w|s|save|reset|quit] <num> : " ); input_to( "get_stat_bit" ); return 1; } /* get_stat_bit() */ int get_check( string word ) { word = lower_case( word ); if ( word[ 0 ] != 'y' ) { write( "Going back to stat entering.\n" ); return get_stat_bit( "" ); } do_save(); write( "Saving.\n" ); return 1; } /* get_check() */ int cmd() { write( "Rearranging stats.\n\n" ); points[ this_player() ] = ([ ]); ME_CON = (int)this_player()->query_real_con(); ME_DEX = (int)this_player()->query_real_dex(); ME_INT = (int)this_player()->query_real_int(); ME_STR = (int)this_player()->query_real_str(); ME_WIS = (int)this_player()->query_real_wis(); POOL = 0; if ( ME_CON > 8) { POOL += ME_CON - 8; ME_CON = 8; } if ( ME_DEX > 8) { POOL += ME_DEX - 8; ME_DEX = 8; } if ( ME_INT > 8 ) { POOL += ME_INT - 8; ME_INT = 8; } if ( ME_STR > 8 ) { POOL += ME_STR - 8; ME_STR = 8; } if ( ME_WIS > 8 ) { POOL += ME_WIS - 8; ME_WIS = 8; } write( "Type \"c 3\" to add 3 points to your constitution from the pool, "+ "or \"c -4\" to remove 4 points from constitution and add them to "+ "the pool. Use \"save\" to save the current state and quit. Note "+ "that \"%^YELLOW%^reset%^RESET%^\" will return you to your "+ "starting position, while \"%^YELLOW%^quit%^RESET%^\" will quit "+ "without saving any changes.\n\n" ); return get_stat_bit( "" ); } /* cmd() */ int teach( object thing ) { return 0; } /* This is removed form here as documetation exists elswehere *( Which is a duplication of this. string help() { return "Syntax: rearrange\n\n" "Once during the life of your character you may modify your stats for " "free. Stats normally take values between 8 and 23 and you can " "distribute your stats as you choose by typing \"rearrange\" and " "following the instructions. The idea of this command is to give your " "character unique strengths. You should read the help on stats to " "find out what each one does and carefully consider your character's " "future career as a member of one of the " + mud_name() + " guilds before " "using this command.\n\n" "See also:\n" " score\n"; } p* help() */ int clean_up() { if (sizeof(points)) return 1; ::clean_up(); } void reset() { if (sizeof(points)) return; ::reset(); } string query_name() { return "Rearrange Command"; }