/* * Programmer: Cameron Taylor, a.k.a. Shanyr * * Creation Date: 3 May 2005 * Last Modified Date: 15 July 2006 * * Notes: Put do_dice in where you think it fits; don't forget the DO_FUN * entry; you may need to add an #include or two for is_number() and * atoi(). * * 'dice' will roll two six-sided dice. 'dice' followed by a number * will restrict the number to 1-10 and roll that number of six-sided * dice. 'dice' followed by two numbers will restrict the first number * to 1-10 and the second number to 2-20 and roll (first number) dice * of (second number) sides. The values of all dice rolled are listed, * and the total. * * The length of the strings stored in buf1 and buf2 will not exceed * 102 bytes (or 103, counting the '\0'), unless MAX_DICE or MAX_SIDES * is changed. * * If you have a 'snippets' help file, I would appreciate (but I do * not require) an entry similar to "Dice code by Cameron Taylor" or * "Dice code by Shanyr". Again, this is requested, not required. * * Legal: Copyright 2005 Cameron Taylor * * Freely licensed for use by anyone, provided that the following * disclaimer is accepted and this legal stuff remains in the source * code. I do not require compiled code to mention me to the end user. * * THIS CODE IS PROVIDED "AS IS" WITH NO WARRANTIES OF ANY KIND. UNDER * NO CIRCUMSTANCES SHALL THE COPYRIGHT HOLDER BE HELD LIABLE FOR ANY * DAMAGES, WHETHER DIRECT, INDIRECT, OR OTHERWISE. USE AT YOUR OWN * RISK. */ /* * I use this macro to check for data content in a string */ #define STR_HASDATA(str) (str != NULL && str[0] != '\0') /* * This function allows a character to roll 1 or more dice. * Programmer: Cameron Taylor (Shanyr) */ void do_dice( CHAR_DATA *ch, char *argument ) { const int MAX_DICE = 10; const int MAX_SIDES = 20; int number=2, sides=6; int total = 0; int dice[10]; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; int i; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if(STR_HASDATA(arg1)) /* Check for the number of dice */ { if(is_number(arg1)) number = atoi(arg1); /* Limit number to the range [1, MAX_DICE] */ number = number > MAX_DICE ? MAX_DICE : (number < 1 ? 1 : number); if(STR_HASDATA(arg2)) /* Check for the number of sides */ { if(is_number(arg2)) sides = atoi(arg2); /* Limit sides to the range [2, MAX_SIDES] */ sides = sides > MAX_SIDES ? MAX_SIDES : (sides < 2 ? 2 : sides); } } /* Roll the dice and find the total */ for(i=0; i