Release v0.1.0
Implements the Silver Standard conversion on a given list of currency values, defaulting to gold coins. The list of coins are each converted to a base copper coin value, then added together, and finally converted to the given Silver Standard value.
This commit is contained in:
commit
cc1e49c794
8 changed files with 261 additions and 0 deletions
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
# Created by https://www.gitignore.io/api/rust
|
||||
|
||||
### Rust ###
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
|
||||
Cargo.lock
|
||||
|
||||
# These are backup files generated by rustfmt
|
||||
**/*.rs.bk
|
||||
|
||||
|
||||
# End of https://www.gitignore.io/api/rust
|
0
.gitlab-ci.yml
Normal file
0
.gitlab-ci.yml
Normal file
13
Cargo.toml
Normal file
13
Cargo.toml
Normal file
|
@ -0,0 +1,13 @@
|
|||
[package]
|
||||
name = "sterling"
|
||||
version = "0.1.0"
|
||||
description = "Converts a given D&D 5e currency value to the Silver Standard."
|
||||
authors = ["Zachary Dziura <zcdziura@gmail.com>"]
|
||||
|
||||
[dependencies]
|
||||
clap = "2.31.1"
|
||||
lazy_static = "1.0.0"
|
||||
regex = "0.2"
|
||||
|
||||
[profile.release]
|
||||
lto = true
|
26
MIT.md
Normal file
26
MIT.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
The MIT License (MIT)
|
||||
=====================
|
||||
|
||||
Copyright © `<year>` `<copyright holders>`
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the “Software”), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
35
README.md
Normal file
35
README.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
# Sterling
|
||||
|
||||
Converts a given D&D 5e currency value to the Silver Standard. Inspired by the Reddit posts titled
|
||||
[The Silver Hack: Making Money Matter](https://www.reddit.com/r/DnDBehindTheScreen/comments/80f6kt/the_silver_hack_making_money_matter/),
|
||||
and [I make Silver Standard for 5th Edition (Spreadsheets.)](https://www.reddit.com/r/dndnext/comments/5tt5g8/i_make_silver_standard_for_5_edition_spreadsheets/).
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
sterling [VALUE]...
|
||||
|
||||
FLAGS:
|
||||
-h, --help Prints help information
|
||||
-V, --version Prints version information
|
||||
|
||||
ARGS:
|
||||
<VALUE>... The value to be converted; should be suffixed with the coin's short-hand abbreviation, i.e. p, g,
|
||||
e, s, or c. Defaults coin type to 'g'.
|
||||
```
|
||||
|
||||
## Abstract
|
||||
|
||||
Items and expenses are, by default, assigned arbitrary currency values within the official D&D 5th
|
||||
edition source books. Many of the officially priced items use the "Gold Standard"; that is, items
|
||||
are priced in gold coins by default. While there is nothing wrong with using official currency
|
||||
values within your campaign, it leads to the perceived value of gold to be less in the eyes of your
|
||||
players. Gold has been sought after as both a commodity and a currency for centuries, and your
|
||||
campaign aught to treat gold similarly!
|
||||
|
||||
## Explanation
|
||||
|
||||
The basis of the Silver Standard treats 1 gold coin from the official D&D 5e source books as 1
|
||||
silver coin, and that there are one hundred of a given coin to every one of the next highest valued
|
||||
coin. That's all. Thus, one-hundred fifty copper coins equals one silver and fifty copper coins,
|
||||
while a suit of heavy plate armor equals fifteen gold coins, rather than fifteen hundred.
|
27
UNLICENSE.md
Normal file
27
UNLICENSE.md
Normal file
|
@ -0,0 +1,27 @@
|
|||
Unlicense (Public Domain)
|
||||
============================
|
||||
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <<http://unlicense.org/>>
|
24
WAIVER.sigs
Normal file
24
WAIVER.sigs
Normal file
|
@ -0,0 +1,24 @@
|
|||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
I dedicate any and all copyright interest in this software to the
|
||||
public domain. I make this dedication for the benefit of the public at
|
||||
large and to the detriment of my heirs and successors. I intend this
|
||||
dedication to be an overt act of relinquishment in perpetuity of all
|
||||
present and future rights to this software under copyright law.
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQIzBAEBCAAdFiEEMqo2ba6LuiYDXB5kdkVeHsxAMfYFAlqjHbsACgkQdkVeHsxA
|
||||
MfZy5hAAoSrAqT7Mm3d/r0rRuVTTotvZye6PgKdIx+XSdAYVeRjFrtOumldEDq84
|
||||
peE9JjunmfUxqvYPmk8CC6gzdVkkHNh0MM4WHop/qoQGwSQD36G5TvnTEc2SjIYd
|
||||
NVHbTCz8MpIJ8wzn2EH5x8S3BWIy7XB3NJhIuPBsJzSUSniP5d4J3tJw/2hiO34E
|
||||
PaKGSfLk9fAErgXUk+PEn98dXuPHeyrFYsSRQZP5yiTlH7eVloe8VTFIjUF+P0qA
|
||||
XrHWKaEVQYWPXMBTpF8pfPg4rFVnu7F7Pl145AAmQJJo45VLmfDBNWAGQHYMXoyZ
|
||||
bsCd9hQ9zhZMSXi7CBwMQc6itTKVetv1vH0DB77RLfOs+flvqASV1v1mhgBuxWIy
|
||||
E0XzMcR1LtSPu9bdNxc/ClDGbFe5NfZU+dbUqTmpPZBgvfF0I/N/hw5RuDusS+hF
|
||||
m0uvyRL0xIKIgTcNKgfU6pMe4gzVyPCqJ13kJVHfh7RFQ0MV7eQ3eowf8JDnrYZY
|
||||
8DHJpnLxXKLfPeLY73iQFifFSFPjvpD5ObbDcXMZYToaC39d1n6MtUkh0o5aF8L4
|
||||
sA9OGScTevQN9U4bO6AcaUXkqrHuQ9mIk+oP2w1e44O/Fwo9UoBNK0Quc7yA86KJ
|
||||
tnDsTCZNW9HnwuZvXOuLaUEtWP0DYWDmsQmuIhT5VPAhGp7nv0s=
|
||||
=2YGI
|
||||
-----END PGP SIGNATURE-----
|
120
src/main.rs
Normal file
120
src/main.rs
Normal file
|
@ -0,0 +1,120 @@
|
|||
#[macro_use]
|
||||
extern crate clap;
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
extern crate regex;
|
||||
|
||||
use std::fmt;
|
||||
use std::ops::Add;
|
||||
use std::process;
|
||||
|
||||
use regex::Regex;
|
||||
|
||||
fn main() {
|
||||
lazy_static! {
|
||||
static ref RE: Regex = Regex::new(r"(\d+)([cegps])?").unwrap();
|
||||
}
|
||||
|
||||
let app = clap_app!(sterling =>
|
||||
(version: "0.1.0")
|
||||
(about: "Converts a given D&D 5e currency value to the Silver Standard.")
|
||||
(@arg VALUE: ... "The value to be converted; should be suffixed with the coin's short-hand abbreviation, i.e. p, g, e, s, or c. Defaults coin type to 'g'.")
|
||||
);
|
||||
|
||||
if let Some(values) = app.get_matches().values_of("VALUE") {
|
||||
let coins: Vec<&str> = values.collect();
|
||||
|
||||
let total_copper_value: usize = coins
|
||||
.iter()
|
||||
.map(|coin| {
|
||||
if let Some(captures) = RE.captures(coin) {
|
||||
let amount: usize = captures.get(1).unwrap().as_str().parse().unwrap();
|
||||
let denomination = captures.get(2).map_or("g", |d| d.as_str());
|
||||
|
||||
convert_to_copper(amount, denomination)
|
||||
} else {
|
||||
panic!("Error: Invalid coin value \"{}\"", coin);
|
||||
}
|
||||
})
|
||||
.fold(0 as usize, |total, value| total + value);
|
||||
|
||||
println!("{}", exchange_copper(total_copper_value));
|
||||
} else {
|
||||
println!("Please enter at least one value; should be suffixed with the coin's short-hand abbreviation, i.e. p, g, e, s, or c. Defaults coin type to 'g'.");
|
||||
process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_to_copper(amount: usize, coin_denomination: &str) -> usize {
|
||||
match coin_denomination {
|
||||
"p" => amount * 1000,
|
||||
"g" => amount * 100,
|
||||
"e" => amount * 50,
|
||||
"s" => amount * 10,
|
||||
"c" => amount,
|
||||
_ => unreachable!("Invalid coin type; must be a valid coin found in the PHB."),
|
||||
}
|
||||
}
|
||||
|
||||
fn exchange_copper(copper: usize) -> CurrencyValue {
|
||||
CurrencyValue {
|
||||
platinum: copper / 1000000,
|
||||
gold: (copper % 1000000) / 10000,
|
||||
silver: ((copper % 1000000) % 10000) / 100,
|
||||
copper: ((copper % 1000000) % 10000) % 100,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct CurrencyValue {
|
||||
platinum: usize,
|
||||
gold: usize,
|
||||
silver: usize,
|
||||
copper: usize,
|
||||
}
|
||||
|
||||
impl fmt::Display for CurrencyValue {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
let &CurrencyValue {
|
||||
platinum,
|
||||
gold,
|
||||
silver,
|
||||
copper,
|
||||
} = self;
|
||||
|
||||
let mut output = String::new();
|
||||
|
||||
if platinum > 0 {
|
||||
output = output + &format!("{}p ", platinum);
|
||||
}
|
||||
|
||||
if gold > 0 {
|
||||
output = output + &format!("{}g ", gold);
|
||||
}
|
||||
|
||||
if silver > 0 {
|
||||
output = output + &format!("{}s ", silver);
|
||||
}
|
||||
|
||||
if copper > 0 {
|
||||
output = output + &format!("{}c", copper);
|
||||
} else if output.is_empty() {
|
||||
output.push_str("0cp");
|
||||
}
|
||||
|
||||
write!(f, "{}", output)
|
||||
}
|
||||
}
|
||||
|
||||
impl Add for CurrencyValue {
|
||||
type Output = CurrencyValue;
|
||||
|
||||
fn add(self, other: CurrencyValue) -> CurrencyValue {
|
||||
CurrencyValue {
|
||||
platinum: self.platinum + other.platinum,
|
||||
gold: self.gold + other.gold,
|
||||
silver: self.silver + other.silver,
|
||||
copper: self.copper + other.copper,
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue