/** * The inherit to use for franchises for the bank. * @author Pinkfish * @started Fri Jun 15 18:52:48 PDT 2001 */ inherit "/std/shops/inherit/bank_base"; #include <money.h> #include <shops/bank.h> class credit_note { int num; int amt; int made; string maker; } private int _credit_num; private class credit_note* _notes; void create() { _notes = ({ }); ::create(); } /* create() */ /** @ignore yes */ int is_allowed(string name) { return 0; } /** * Are they allowed for credit transactions, listing outstanding credit, * making credit notes, etc. This should allow the standard owner and the * owner of the main branch. * @param name the player name */ int is_allowed_credit(string name) { return is_allowed(name) || name == query_main_branch_owner(); } /* is_allowed_credit() */ /** * This allows the current credit number for credit notes to be set. * @param num the new credit number */ protected void set_credit_num(int num) { _credit_num = num; } /* set_credit_num() */ /** * This method returns the current credit number. * @return the current credit number */ int query_credit_num() { return _credit_num; } /* query_credit_num() */ /** * This allowed the set of outstanding credit notes to be set. * @prarm notes the set of outstanding notes */ protected void set_credit_notes(class credit_note* notes) { _notes = notes; } /* set_credit_notes() */ /** * This method returns the array of outstanding credit notes. * @return the array of outstanding credit notes */ class credit_note* query_credit_notes() { return copy(_notes); } /* query_credit_notes() */ /** * This method returns the amount of money currently in outstanding credit * notes. * @return the amount in outstanding credit notes */ int query_outstanding_credit_value() { int diff; class credit_note note; foreach (note in _notes) { diff += note->amt; } return diff; } /* query_outstanding_credit_value() */ /** * This method creates a credit note for the store based on wild and * exciting stuff. * @return 1 on success, 0 on failure */ int do_create() { object ob; int diff; if (!is_allowed_credit(this_player()->query_name())) { add_failed_mess("The bank is not open for creating credit notes.\n"); return 0; } diff = query_total_difference() - query_outstanding_credit_value(); if (diff == 0) { add_failed_mess("The bank is currently at a zero balance with the " "outstanding credit notes.\n"); return 0; } ob = clone_object(BANK_CREDIT_NOTE); ob->set_credit_num(++_credit_num); ob->set_franchise(query_franchise()); ob->set_bank_name(query_bank_name()); ob->set_amount(query_total_difference()); ob->add_property("place", query_money_place()); ob->setup_read_messages(); ob->move(this_player()); if (!_notes) { _notes = ({ }); } _notes += ({ new(class credit_note, num : ob->query_credit_num(), amt : ob->query_amount(), maker : this_player()->query_cap_name(), made : time()) }); event_save(this_object()); //adjust_total_difference(-query_total_difference()); add_succeeded_mess("$N $V " + ob->a_short() + ".\n"); return 1; } /* do_create() */ /** @ignore yes */ int do_list() { class credit_note note; string ret; string place; if (!is_allowed_credit(this_player()->query_name())) { add_failed_mess("The bank is not open for listing credit notes.\n"); return 0; } place = query_money_place(); if (!sizeof(_notes)) { add_failed_mess("No credit notes to list.\n"); return 0; } ret = "Credit notes\n\n"; foreach (note in _notes) { ret += "$I$6=" + sprintf("%3d) ", note->num) + ctime(note->made) + ": by " + note->maker + " for " + MONEY_HAND->money_value_string(note->amt, place) + "\n"; } write("$P$Credit Notes$P$" + ret); return 1; } /* do_list() */ /** @ignore yes */ int do_recind(int id) { class credit_note note; int i; string place; if (!is_allowed_credit(this_player()->query_name())) { add_failed_mess("The bank is not open for listing credit notes.\n"); return 0; } for (i = 0; i < sizeof(_notes); i++) { note = _notes[i]; if (note->num == id) { place = query_money_place(); _notes = _notes[0..i-1] + _notes[i+1..]; add_succeeded_mess(({ "You recind #" + note->num + " made at " + ctime(note->made) + " by " + note->maker + " for " + MONEY_HAND->money_value_string(note->amt, place) + "\n", "" })); return 1; } } add_failed_mess("Unable to find credit note #" + id + ".\n"); return 0; } /* do_recind() */ /** * This method checks to find if the note is valid or not. * @param id the not to check * @return 1 on success, 0 on failure */ int is_valid_note(int id) { int i; for (i = 0; i < sizeof(_notes); i++) { if (_notes[i]->num == id) { return 1; } } return 0; } /* is_valid_note() */ /** * THis is called when a specific credit note is processed * @param id the id of the note to process * @return 1 on a sucessful processing */ int process_note(int id) { int i; if (!is_valid_note(id)) { return 0; } for (i = 0; i < sizeof(_notes); i++) { if (_notes[i]->num == id) { adjust_total_difference(-_notes[i]->amt); _notes = _notes[0..i-1] + _notes[i+1..]; i--; } } event_save(this_object()); return 1; } /* process_note() */ void init() { ::init(); add_command("create", "credit note"); add_command("list", "credit notes"); add_command("recind", "credit note <number'id'>", (: do_recind($4[0]) :)); } /* init() */