/****************************************************************************** * This file contains cabinet-related functions *****************************************************************************/ /** * @ignore yes * Assign an item to use a cabinet. * @param word the item to be assigned * @param number the cabinet number to assign to */ private void add_chart_cabinet(string word, int number) { if (!_list[word]) return; _list[word][CHART_CAB] += ({number}); _list[word][CHART_CAB] = sort_array(_list[word][CHART_CAB], 1); save_list(); } /* add_chart_cabinet() */ /** * @ignore yes * Confirm rental/removal of cabinet * @param confirm player input response ( y/n ) * @param rent whether we are adding(!=0) or removing(0) cabinet */ void confirm_cabinet(string confirm, int rent) { if (previous_object() && previous_object() != this_object()) { LOG_ERROR("office.c", "confirm_cabinet("+confirm+","+rent+")"); return; } confirm = lower_case(confirm); if ( strlen(confirm) < 1 || (confirm[0] != 'y' && confirm[0] != 'n')) { tell_object(this_player(), sprintf("Please enter 'yes' or 'no'.\n" "Are you sure you want to %s a cabinet? ", (rent)?"rent":"remove")); input_to("confirm_cabinet", 0, rent); return ; } if (confirm[0] == 'n') { tell_object(this_player(), "Ok.\n"); return; } if (rent) if (_storeroom->add_cabinet()) { _num_cabinets++; adjust_profit(this_player()->query_name(), -CABINET_COST); shop_log(ACCOUNTS, this_player()->query_name(), "rented cabinet for "+ MONEY_HAND->money_value_string(CABINET_COST, _place), PAID); save_me(); } else { string cab_name; if ((cab_name = _storeroom->remove_cabinet()) != "") { _num_cabinets--; shop_log(ACCOUNTS, this_player()->query_name(), "removed cabinet", PAID); if (file_size(_savedir+ _cab_name + ".o") > 0) { _cab_name = cab_name; call_out((: rm_cab() :), 5); } save_me(); } } tell_object(this_player(), "Cabinet "+ (rent)?"rent":"remov" + "ed.\n"); } /* confirm_cabinet() */ /** * @ignore yes * Check cabinet assignments */ private int do_check() { string result = "Current cabinet assignments are:\n"; for (int x = 0; x < _num_cabinets; x++) { string *items = ({}); result += sprintf("Cabinet %2d: ", x+1); foreach(string item in m_indices(_list)) if (member_array(x+1, _list[item][CHART_CAB]) != -1) items += ({sprintf("%s (%d)", item, _list[item][CHART_MAX])}); if (sizeof(items)) result += query_multiple_short( items ); result += "\n"; } result += "\n"; tell_object(this_player(), "$P$Cabinet assignments$P$"+ result); return 1; } /* do_check() */ /** * @ignore yes * Managers' office. * Removing storeroom cabinets. */ int do_remove() { int stock; if (!((stock = _num_cabinets) > MIN_CABINETS)) { tell_object(this_player(), "The shop already contains the " "minimum number of cabinets.\n"); return 1; } if (sizeof(_storeroom->query_stock(stock))) { tell_object(this_player(), "Cabinet "+ stock+ " still contains stock.\n"); return 1; } if (query_cabinet_used(stock)) { tell_object(this_player(), "Cabinet "+ stock+ " is still assigned to hold stock.\n"); return 1; } tell_object(this_player(), "Are you sure you wish to remove a cabinet? "); input_to("confirm_cabinet", 0, 0); return 1; } /* do_remove() */ /** * @ignore yes * Managers' office. * Renting store cabinets. */ int do_rent() { if (!(_num_cabinets < MAX_CABINETS)) { tell_object(this_player(), "The shop already contains the " "maximum number of cabinets.\n"); return 1; } if (CABINET_COST > _accounts["profit"]) { tell_object(this_player(), "Cabinets currently cost "+ MONEY_HAND->money_value_string(CABINET_COST, _place) + ". There is not enough money in the profit account.\n"); return 1; } tell_object(this_player(), "Are you sure you wish to rent a cabinet for "+ MONEY_HAND->money_value_string( CABINET_COST, _place ) + " per month? "); input_to("confirm_cabinet", 0, 1); return 1; } /* do_rent() */ /** * @ignore yes * Query which cabinets are assigned to this item. * @param item The item to query. * @return An array of cabinet numbers assigned to the item. */ int *query_cabinet(string item) { return (!_list[item])?({}):copy(_list[item][CHART_CAB]); } /* query_cabinet() */ /** * @ignore yes * Query whether this cabinet is currently assigned to any items. * @param cabinet The cabinet number ( between 1 and number of cabinets ) * @return TRUE or FALSE */ int query_cabinet_used(int cabinet) { foreach(string word in m_indices(_list)) if ( member_array(cabinet, _list[word][CHART_CAB]) != -1) return TRUE; return FALSE; } /* query_cabinet_used() */ /** * @ignore yes * Stop an item using a cabinet. * @param word the item to modify * @param number the cabinet to stop using */ private void remove_chart_cabinet(string word, int number) { if (!_list[word]) return; _list[word][CHART_CAB] -= ({number}); save_list(); } /* remove_chart_cabinet() */ /** * @ignore yes * Remove cabinet file. * Called via a call-out to ensure cabinet is dested before removing file. * @param cab_name the filename of the cabinet */ private void rm_cab() { #ifdef DEBUG tell_creator(CREATOR, "Removing cabinet file %s.\n", _savedir+ _cab_name+ ".o"); #endif unguarded((: rm, _savedir+ _cab_name+ ".o" :)); _cab_name = ""; } /* rm_cab() */