#武器 #堡垒 #团队 #Steam #TF2 #货币 #定价

tf2-price

用于 Team Fortress 2 物品定价的实用工具

21 个版本 (12 个破坏性更新)

0.13.2 2024 年 6 月 1 日
0.12.0 2024 年 1 月 26 日
0.11.0 2023 年 2 月 18 日
0.8.0 2022 年 12 月 31 日
0.5.3 2022 年 3 月 18 日

#930游戏

Download history 173/week @ 2024-06-01 6/week @ 2024-06-08 2/week @ 2024-06-15

每月下载量 1,274

MIT 许可证

89KB
2K SLoC

tf2-price

用于 Team Fortress 2 物品定价的实用工具。轻量级,仅有一个必需的依赖项。

由于浮点数固有的不精确性,分数货币在算术中会面临挑战。一种解决方案是以货币的最小单位(例如,美国货币的“分”)或 Team Fortress 2 中的武器作为存储整数。这允许精确计算,而无需进行繁琐的转换,确保结果可预测。

金属价值以武器存储。例如,1.33 纯化存储为 24 把武器。与废料相比,我们能够表达更精确的值(购买和销售 MvM 部件通常需要武器的精确值)。低于一把武器的值在实践中几乎从不使用,除非使用 FloatCurrencies

使用 Serde 进行安装

tf2-price = { version = "0.13.2", features = ["serde"] }

用法

基本用法

use tf2_price::{Currencies, metal, ONE_REF, ONE_REC};

let currencies = Currencies {
    keys: 5,
    weapons: metal!(1.33), // 24 weapons.
};

// 1.33 refined or 24 weapons.
assert_eq!(currencies.weapons, 24);
assert_eq!(currencies.weapons, ONE_REF + ONE_REC);
assert_eq!(currencies.weapons, metal!(1.33));
// String conversions.
assert_eq!(
    format!("Selling for {currencies}."),
    "Selling for 5 keys, 1.33 ref.",
);
assert_eq!(
    "5 keys, 1.33 ref".parse::<Currencies>().unwrap(),
    currencies,
);

// Key price stored as weapons.
let key_price_weapons = metal!(50);
// Conversion to a single total.
let total = currencies.to_weapons(key_price_weapons);

// 5 (keys) * 50 (key price) * 18 (one ref) = 4500
// 4500 + 24 (weapons) = 4524
assert_eq!(total, 4524);
assert_eq!(
    // Convert total back into keys + weapons.
    Currencies::from_weapons(total, key_price_weapons),
    currencies,
);

算术

use tf2_price::{Currencies, Currency};

let golden_pan = Currencies {
    keys: 3000,
    weapons: 0,
};

assert_eq!(
    // Multiply by an integer.
    golden_pan * 2,
    Currencies {
        keys: 6000,
        weapons: 0,
    },
);
assert_eq!(
    // Multiply by a floating point number.
    golden_pan * 2.5,
    Currencies {
        keys: 7500,
        weapons: 0,
    },
);
assert_eq!(
    // Add another currencies.
    golden_pan + Currencies {
        keys: 0,
        weapons: 2,
    },
    Currencies {
        keys: 3000,
        weapons: 2,
    },
);

在 Rust 的发布构建中,整数可能会出现溢出风险。虽然这种行为 不被认为是危险的,但它是有问题的。这个软件包使用 饱和算术 进行整数算术,并提供了检查溢出的方法(例如使用 checked_from_weapons)。任何可能失败的方法都将检查溢出。

由于 64 位整数的大小很大(最大值 9,223,372,036,854,775,807),因此担心达到其界限通常是多余的。

浮点数精度

要存储来自响应的浮点数,请使用 FloatCurrencies 作为容器。但是,建议不要用于计算或比较。这个软件包提供将浮点数转换为整数(基于使用情况)的实用工具(饱和检查)。

use tf2_price::{Currencies, FloatCurrencies, Currency};

// To preserve original values, use FloatCurrencies.
let float_currencies = FloatCurrencies {
    keys: 1.0,
    // Unlike Currencies, metal is not counted in weapons.
    // 1.33 means 1.33 refined.
    metal: 1.33,
};
// Converting to Currencies (checks for safe conversion).
let currencies = Currencies::try_from(float_currencies).unwrap();

assert_eq!(
    currencies,
    Currencies {
        keys: 1,
        metal: 24,
    },
);
// Fails if the key value holds a fractional number.
assert!(Currencies::try_from(FloatCurrencies {
    keys: 1.5,
    metal: 0.0,
}).is_err());
// Fails if a value is outside of integer bounds.
assert!(Currencies::try_from(FloatCurrencies {
    keys: Currency::MAX as f32 * 2.0,
    metal: 0.0,
}).is_err());

序列化

use tf2_price::{Currencies, metal};
    
let json = r#"{"keys":5,"metal":2.33}"#;
let currencies: Currencies = serde_json::from_str(json).unwrap();

assert_eq!(
    currencies,
    Currencies {
        keys: 5,
        weapons: metal!(2.33),
    },
);
assert_eq!(
    json,
    serde_json::to_string(&currencies).unwrap(),
);

许可证

MIT

依赖项

~195KB