/* money.c */ #include "config.h" /* * This file is part of TeenyMUD II. * Copyright(C) 1994, 1995 by Jason Downs. All rights reserved. * * TeenyMUD II is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * TeenyMUD II is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file 'COPYING'); if not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * */ #include <sys/types.h> #include <stdio.h> #ifdef HAVE_STRING_H #include <string.h> #else #include <strings.h> #endif /* HAVE_STRING_H */ #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif /* HAVE_STDLIB_H */ #include "conf.h" #include "teeny.h" #include "commands.h" #include "externs.h" /* * money.c -- Routines and commands dealing with money. */ static INLINE int isvowel(c) char c; { if((c == 'a') || (c == 'e') || (c == 'i') || (c == 'o') || (c == 'u')) return(1); return(0); } /* * money_name(int amount) * * Return the best-fit name for the specified amount of currency. */ #define bufleft() (sizeof(money_buffer) - (money_ptr - money_buffer)) static char *money_name(amount) int amount; { static char money_buffer[BUFFSIZ]; register char *money_ptr; int doneone = 0; if (amount == 0) return("no money"); if (amount < 0) { strcpy(money_buffer, "negative "); money_ptr = (money_buffer + strlen(money_buffer)); amount = (-amount); } else money_ptr = money_buffer; if (amount >= 100) { register int num = amount / 100; amount -= (num * 100); if (num == 1) { snprintf(money_ptr, bufleft(), "%s %s, ", (isvowel(mudconf.money_dollar[0]) ? "an" : "a"), mudconf.money_dollar); } else { snprintf(money_ptr, bufleft(), "%d %s, ", num, mudconf.money_dollars); } money_ptr += strlen(money_ptr); doneone++; } if (amount >= 25) { register int num = amount / 25; amount -= (num * 25); if (num == 1) { snprintf(money_ptr, bufleft(), "%s%s %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), (isvowel(mudconf.money_quarter[0]) ? "an" : "a"), mudconf.money_quarter); } else { snprintf(money_ptr, bufleft(), "%s%d %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), num, mudconf.money_quarters); } money_ptr += strlen(money_ptr); doneone++; } if (amount >= 10) { register int num = amount / 10; amount -= (num * 10); if (num == 1) { snprintf(money_ptr, bufleft(), "%s%s %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), (isvowel(mudconf.money_dime[0]) ? "an" : "a"), mudconf.money_dime); } else { snprintf(money_ptr, bufleft(), "%s%d %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), num, mudconf.money_dimes); } money_ptr += strlen(money_ptr); doneone++; } if (amount >= 5) { register int num = amount / 5; amount -= (num * 5); if (num == 1) { snprintf(money_ptr, bufleft(), "%s%s %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), (isvowel(mudconf.money_nickle[0]) ? "an" : "a"), mudconf.money_nickle); } else { snprintf(money_ptr, bufleft(), "%s%d %s, ", (((doneone > 0) && (amount == 0)) ? "and " : ""), num, mudconf.money_nickles); } money_ptr += strlen(money_ptr); doneone++; } if (amount > 0) { if (amount == 1) { snprintf(money_ptr, bufleft(), "%s%s %s", ((doneone > 0) ? "and " : ""), (isvowel(mudconf.money_penny[0]) ? "an" : "a"), mudconf.money_penny); } else { snprintf(money_ptr, bufleft(), "%s%d %s", ((doneone > 0) ? "and " : ""), amount, mudconf.money_pennies); } } else { /* Fix termination. */ if(((money_ptr - money_buffer) > 2) && (money_ptr[-2] == ',')) money_ptr[-2] = '\0'; } return(money_buffer); } /* * reward_move(int player, int cause, int loc) * * Reward the player a random amount of money, if they don't own loc. */ void reward_move(player, cause, loc) int player, cause, loc; { if (mudconf.enable_money && !controls(player, cause, loc) && (random() % 10) == 0) { char buffer[BUFFSIZ]; int amount; switch ((int)(random() % 20)) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: amount = 1; break; case 8: case 9: case 10: case 11: case 12: case 13: amount = 5; break; case 14: case 15: case 16: amount = 10; break; case 17: case 18: amount = 25; break; default: amount = 100; } snprintf(buffer, sizeof(buffer), "You found %s!", money_name(amount)); notify_player(player, cause, player, buffer, 0); reward_money(player, amount); } } /* Score user command. */ VOID do_score(player, cause, switches) int player, cause, switches; { int owner, pennies; char buf[BUFFSIZ]; if (mudconf.enable_money) { if ((get_int_elt(player, OWNER, &owner) != -1) && (get_int_elt(owner, PENNIES, &pennies) != -1)) { snprintf(buf, sizeof(buf), "You have %s.", money_name(pennies)); notify_player(player, cause, player, buf, 0); } else { notify_bad(player); } } else { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Money is not enabled.", NOT_QUIET); } } /* Give user command. */ VOID do_give(player, cause, switches, argone, argtwo) int player, cause, switches; char *argone, *argtwo; { int victim, cost, expt; int owner, pennies, nval; char *ptr, buf[MEDBUFFSIZ], *pname, *vname; if(!mudconf.enable_money) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Money is not enabled.", NOT_QUIET); return; } if ((argone == (char *)NULL) || (argone[0] == '\0') || (argtwo == (char *)NULL) || (argtwo[0] == '\0')) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Give what to who?", NOT_QUIET); return; } victim = resolve_player(player, cause, argone, (!(switches & CMD_QUIET) ? RSLV_NOISY : 0)); if(victim == -1) return; cost = (int)strtol(argtwo, &ptr, 10); if((ptr == argtwo) || ((cost < 1) && !isWIZARD(player))){ if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "You must specify a postive amount of money.", NOT_QUIET); return; } if(get_int_elt(victim, COST, &expt) == -1) { notify_bad(player); return; } if((expt > cost) && (cost > 0)) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Being a cheapskate, eh?", NOT_QUIET); return; } if (!can_afford(player, cause, (((cost > expt) && (expt > 0)) ? expt : cost), (switches & CMD_QUIET))) return; if ((get_int_elt(victim, OWNER, &owner) == -1) || (get_int_elt(owner, PENNIES, &pennies) == -1) || (get_str_elt(player, NAME, &pname) == -1) || (get_str_elt(victim, NAME, &vname) == -1)) { notify_bad(player); return; } nval = pennies + (((cost > expt) && (expt > 0)) ? expt : cost); if (!isWIZARD(player) && (nval > mudconf.max_pennies)) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "They don't need that much money!", NOT_QUIET); return; } if (set_int_elt(owner, PENNIES, nval) == -1) { notify_bad(player); return; } if(!(switches & CMD_QUIET)) { if((cost > expt) && (expt > 0)) { snprintf(buf, sizeof(buf), "You give %s to %s and get %s in change.", money_name(cost), vname, money_name(cost - expt)); } else { snprintf(buf, sizeof(buf), "You give %s to %s.", money_name(cost), vname); } notify_player(player, cause, player, buf, NOT_QUIET); } snprintf(buf, sizeof(buf), "%s gives you %s.", pname, money_name(cost)); notify_player(victim, cause, player, buf, NOT_QUIET); act_object(player, cause, victim, PAY, OPAY, APAY, -1, (char *)NULL, (char *)NULL); } /* Cost user command. */ VOID do_cost(player, cause, switches, argone, argtwo) int player, cause, switches; char *argone, *argtwo; { int dest, cost; char *ptr; if((argone == (char *)NULL) || (argone[0] == '\0')) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Set the cost of what?", NOT_QUIET); return; } if((argtwo == (char *)NULL) || (argtwo[0] == '\0')) cost = 0; else { cost = (int)strtol(argtwo, &ptr, 10); if((ptr == argtwo) || (cost < 0)) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "Cost must be a positive number.", NOT_QUIET); return; } } dest = resolve_object(player, cause, argone, (!(switches & CMD_QUIET) ? RSLV_NOISY : 0)); if(dest == -1) return; if(!controls(player, cause, dest)) { if(!(switches & CMD_QUIET)) notify_player(player, cause, player, "You can't set the cost of that!", NOT_QUIET); return; } if(set_int_elt(dest, COST, cost) == -1) { notify_bad(player); return; } if(!(switches & CMD_QUIET)) notify_player(player, cause, player, ((cost == 0) ? "Cost unset." : "Cost set."), NOT_QUIET); }