void NumberFormat::getEffectiveCurrency(UChar* result, UErrorCode& ec) const { const UChar* c = getCurrency(); if (*c != 0) { u_strncpy(result, c, 3); result[3] = 0; } else { const char* loc = getLocaleID(ULOC_VALID_LOCALE, ec); if (loc == NULL) { loc = uloc_getDefault(); } ucurr_forLocale(loc, result, 4, &ec); } }
UnicodeString& NumberFormat::format(const Formattable& obj, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { if (U_FAILURE(status)) return appendTo; ArgExtractor arg(*this, obj, status); const Formattable *n = arg.number(); const UChar *iso = arg.iso(); if(arg.wasCurrency() && u_strcmp(iso, getCurrency())) { // trying to format a different currency. // Right now, we clone. LocalPointer<NumberFormat> cloneFmt((NumberFormat*)this->clone()); cloneFmt->setCurrency(iso, status); // next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount. return cloneFmt->format(*n, appendTo, pos, status); } if (n->isNumeric() && n->getDigitList() != NULL) { // Decimal Number. We will have a DigitList available if the value was // set to a decimal number, or if the value originated with a parse. // // The default implementation for formatting a DigitList converts it // to a double, and formats that, allowing formatting classes that don't // know about DigitList to continue to operate as they had. // // DecimalFormat overrides the DigitList formatting functions. format(*n->getDigitList(), appendTo, pos, status); } else { switch (n->getType()) { case Formattable::kDouble: format(n->getDouble(), appendTo, pos); break; case Formattable::kLong: format(n->getLong(), appendTo, pos); break; case Formattable::kInt64: format(n->getInt64(), appendTo, pos); break; default: status = U_INVALID_FORMAT_ERROR; break; } } return appendTo; }
/** * Check if there is enough currency to buy the given stack, and if so remove it from the current total and add the stack. * (Handle the drop into the equipment area, but add() don't handle it well in all circonstances. MenuManager::logic() allow only into the carried area.) */ bool MenuInventory::buy(ItemStack stack, int tab) { int value_each; if (tab == VENDOR_BUY) value_each = items->items[stack.item].price; else value_each = items->items[stack.item].getSellPrice(); int count = value_each * stack.quantity; if( getCurrency() >= count) { removeCurrency(count); items->playSound(CURRENCY_ID); return true; } else { return false; } }
UnicodeString& NumberFormat::format(const Formattable& obj, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { if (U_FAILURE(status)) return appendTo; ArgExtractor arg(*this, obj, status); const Formattable *n = arg.number(); const UChar *iso = arg.iso(); if(arg.wasCurrency() && u_strcmp(iso, getCurrency())) { // trying to format a different currency. // Right now, we clone. LocalPointer<NumberFormat> cloneFmt((NumberFormat*)this->clone()); cloneFmt->setCurrency(iso, status); // next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount. return cloneFmt->format(*n, appendTo, posIter, status); } if (n->isNumeric() && n->getDigitList() != NULL) { // Decimal Number format(*n->getDigitList(), appendTo, posIter, status); } else { switch (n->getType()) { case Formattable::kDouble: format(n->getDouble(), appendTo, posIter, status); break; case Formattable::kLong: format(n->getLong(), appendTo, posIter, status); break; case Formattable::kInt64: format(n->getInt64(), appendTo, posIter, status); break; default: status = U_INVALID_FORMAT_ERROR; break; } } return appendTo; }
TER SetTrust::preclaim(PreclaimContext const& ctx) { auto const id = ctx.tx[sfAccount]; auto const sle = ctx.view.read( keylet::account(id)); std::uint32_t const uTxFlags = ctx.tx.getFlags(); bool const bSetAuth = (uTxFlags & tfSetfAuth); if (bSetAuth && !(sle->getFieldU32(sfFlags) & lsfRequireAuth)) { JLOG(ctx.j.trace) << "Retry: Auth not required."; return tefNO_AUTH_REQUIRED; } auto const saLimitAmount = ctx.tx[sfLimitAmount]; auto const currency = saLimitAmount.getCurrency(); auto const uDstAccountID = saLimitAmount.getIssuer(); if (id == uDstAccountID) { // Prevent trustline to self from being created, // unless one has somehow already been created // (in which case doApply will clean it up). auto const sleDelete = ctx.view.read( keylet::line(id, uDstAccountID, currency)); if (!sleDelete) { JLOG(ctx.j.trace) << "Malformed transaction: Can not extend credit to self."; return temDST_IS_SRC; } } return tesSUCCESS; }
void MenuInventory::logic() { // if the player has just died, the penalty is half his current currency. if (stats->death_penalty && DEATH_PENALTY) { std::string death_message = ""; // remove a % of currency if (DEATH_PENALTY_CURRENCY > 0) { if (currency > 0) removeCurrency((currency * DEATH_PENALTY_CURRENCY) / 100); death_message += msg->get("Lost %d%% of %s. ", DEATH_PENALTY_CURRENCY, CURRENCY); } // remove a % of either total xp or xp since the last level if (DEATH_PENALTY_XP > 0) { if (stats->xp > 0) stats->xp -= (stats->xp * DEATH_PENALTY_XP) / 100; death_message += msg->get("Lost %d%% of total XP. ", DEATH_PENALTY_XP); } else if (DEATH_PENALTY_XP_CURRENT > 0) { if (stats->xp - stats->xp_table[stats->level-1] > 0) stats->xp -= ((stats->xp - stats->xp_table[stats->level-1]) * DEATH_PENALTY_XP_CURRENT) / 100; death_message += msg->get("Lost %d%% of current level XP. ", DEATH_PENALTY_XP_CURRENT); } // prevent down-leveling from removing too much xp if (stats->xp < stats->xp_table[stats->level-1]) stats->xp = stats->xp_table[stats->level-1]; // remove a random carried item if (DEATH_PENALTY_ITEM) { std::vector<int> removable_items; removable_items.clear(); for (int i=0; i < MAX_EQUIPPED; i++) { if (!inventory[EQUIPMENT][i].empty()) { if (items->items[inventory[EQUIPMENT][i].item].type != "quest") removable_items.push_back(inventory[EQUIPMENT][i].item); } } for (int i=0; i < MAX_CARRIED; i++) { if (!inventory[CARRIED][i].empty()) { if (items->items[inventory[CARRIED][i].item].type != "quest") removable_items.push_back(inventory[CARRIED][i].item); } } if (!removable_items.empty()) { int random_item = rand() % removable_items.size(); remove(removable_items[random_item]); death_message += msg->get("Lost %s.",items->items[removable_items[random_item]].name); } } log_msg = death_message; stats->death_penalty = false; } // a copy of currency is kept in stats, to help with various situations stats->currency = currency = getCurrency(); // check close button if (visible) { tablist.logic(); if (closeButton->checkClick()) { visible = false; snd->play(sfx_close); } if (drag_prev_src == -1) { clearHighlight(); } } }