/****************************************************************************
* [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | *
* -----------------------------------------------------------| \\._.// *
* SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version) | (0...0) *
* -----------------------------------------------------------| ).:.( *
* SMAUG (C) 1994, 1995, 1996 by Derek Snider | {o o} *
* -----------------------------------------------------------| / ' ' \ *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, |~'~.VxvxV.~'~*
* Scryn, Swordbearer, Rennard, Tricops, and Gorog. | *
* ------------------------------------------------------------------------ *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe. *
* ------------------------------------------------------------------------ *
* Auction bid parsing routines *
****************************************************************************/
#include <ctype.h>
// The following code was written by Erwin Andreasen for the automated
// auction command.
// Completely cleaned up by Thoric
/************************************************************************
* util function, converts an 'advanced' ASCII-number-string into a *
* number. *
* Used by parsebet() but could also be used by do_give or do_wimpy. *
* *
* Advanced strings can contain 'k' (or 'K') and 'm' ('M') in them, not *
* just numbers. The letters multiply whatever is left of them by 1,000 *
* and 1,000,000 respectively. Example: *
* *
* 14k = 14 * 1,000 = 14,000 *
* 23m = 23 * 1,000,0000 = 23,000,000 *
* *
* If any digits follow the 'k' or 'm', they are also added, but the *
* number which they are multiplied is divided by ten, each time we get *
* one left. This is best illustrated in an example :) *
* *
* 14k42 = 14 * 1000 + 14 * 100 + 2 * 10 = 14420 *
* *
* Of course, it only pays off to use that notation when you can skip *
* many 0's. There is not much point in writing 66k666 instead of 66666, *
* except maybe when you want to make sure that you get 66,666. *
* *
* More than 3 (in case of 'k') or 6 ('m') digits after 'k'/'m' are *
* automatically disregarded. Example: *
* *
* 14k1234 = 14,123 *
* *
* If the number contains any other characters than digits, 'k' or 'm', *
* the function returns 0. It also returns 0 if 'k' or 'm' appear more *
* than once. *
************************************************************************/
int advatoi (char *s)
{
int number = 0; // number to be returned
int multiplier = 0; // multiplier used to get the extra digits right
// as long as the current character is a digit add to current number
while (isdigit (s [0]))
number = (number * 10) + (*s++ - '0');
switch (UPPER (s [0])) {
case 'K' : number *= (multiplier = 1000); ++s; break;
case 'M' : number *= (multiplier = 1000000); ++s; break;
case '\0' : break;
default : return 0; // not k nor m nor NULL - return 0!
}
// if any digits follow k/m, add those too
while (isdigit (s [0]) && (multiplier > 1)) {
// the further we get to right, the less the digit 'worth'
multiplier /= 10;
number = number + ((*s++ - '0') * multiplier);
}
// return 0 if non-digit character was found, other than NULL
if (s [0] != '\0' && !isdigit (s [0]))
return 0;
// anything left is likely extra digits (ie: 14k4443 -> 3 is extra)
return number;
}
/************************************************************************
* This function allows the following kinds of bets to be made: *
* *
* Absolute bet *
* ============ *
* *
* bet 14k, bet 50m66, bet 100k *
* *
* Relative bet *
* ============ *
* *
* These bets are calculated relative to the current bet. The '+' symbol *
* adds a certain number of percent to the current bet. The default is *
* 25, so with a current bet of 1000, bet + gives 1250, bet +50 gives *
* 1500 etc. *
* Please note that the number must follow exactly after the +, without *
* any spaces! *
* *
* The '*' or 'x' bet multiplies the current bet by the number *
* specified, defaulting to 2. If the current bet is 1000, bet x gives *
* 2000, bet x10 gives 10,000 etc. *
************************************************************************/
int parsebet (const int currentbet, char *s)
{
// check to make sure it's not blank
if (s [0] != '\0') {
// if first char is a digit, use advatoi
if (isdigit (s [0]))
return (advatoi(s));
if (s [0] == '+') { // add percent (default 25%)
if (s [1] == '\0')
return (currentbet * 125) / 100;
return (currentbet * (100 + atoi(s+1))) / 100;
}
if (s [0] == '*' || s [0] == 'x') { // multiply (default is by 2)
if (s [1] == '\0')
return (currentbet * 2);
return (currentbet * atoi(s+1));
}
}
return 0;
}