Praeda
A procedural loot generator library written in Rust with FFI bindings (and examples) for C++, C#, and the Godot Engine v4.2+.
Features
- Configurable quality tiers with weighted probabilities
- Multiple item types and subtypes
- Attribute scaling based on item level
- Named item generation with customizable prefixes and suffixes
- Affix system for dynamic item modifiers
- Foreign Function Interface (FFI) bindings for C++ and C#
Quick Start
Rust
use ;
let mut generator = new;
// Define quality tiers
generator.set_quality_data;
generator.set_quality_data;
// Define item types
generator.set_item_type;
generator.set_item_subtype;
generator.set_item;
// Define attributes
generator.set_attribute;
let options = GeneratorOptions ;
let items = generator.generate_loot?;
for item in items
Advanced Configuration (Rust)
use ;
let mut generator = new;
// Define quality tiers
generator.set_quality_data;
generator.set_quality_data;
generator.set_quality_data;
generator.set_quality_data;
// Define item types with weights
generator.set_item_type;
generator.set_item_type;
// Define item subtypes for weapons
generator.set_item_subtype;
generator.set_item_subtype;
generator.set_item_subtype;
// Define item subtypes for armor
generator.set_item_subtype;
generator.set_item_subtype;
// Set item names for weapons
generator.set_item;
generator.set_item;
generator.set_item;
// Set item names for armor
generator.set_item;
generator.set_item;
// Define attributes for weapons
generator.set_attribute;
generator.set_attribute;
// Define attributes for armor
generator.set_attribute;
generator.set_attribute;
// Add prefix attributes
generator.set_prefix_attribute;
// Add suffix attributes
generator.set_suffix_attribute;
// Generate items with affixes
let options = GeneratorOptions ;
let items = generator.generate_loot?;
for item in items
C++
int
C#
using System;
using Praeda;
class Program {
static void Main() {
using var gen = new PraedaGenerator();
// Define quality tiers
gen.SetQualityData("common", 100);
gen.SetQualityData("rare", 30);
// Define item types
gen.SetItemType("weapon", 1);
// Define item subtypes
gen.SetItemSubtype("weapon", "sword", 1);
// Define item names
gen.SetItemNames("weapon", "sword", new[] { "longsword", "shortsword" });
// Define attributes
gen.SetAttribute("weapon", "", "damage", 10.0, 5.0, 20.0, true);
// Generate loot
var options = new GenerationOptions {
NumberOfItems = 5,
BaseLevel = 15.0,
LevelVariance = 5.0,
AffixChance = 0.75,
Linear = true,
ScalingFactor = 1.0
};
var items = gen.GenerateLoot(options);
foreach (var item in items) {
Console.WriteLine($"{item.Quality}: {item.Name}");
}
}
}
Godot
See examples/godot for a full project example.
func _ready():
var generator = PraedaGodotGenerator.new()
# Define quality tiers
generator.set_quality_data("Common", 100)
generator.set_quality_data("Rare", 30)
# Define item types
generator.set_item_type("Weapon", 1)
generator.set_item_subtype("Weapon", "Sword", 1)
generator.set_item_names("Weapon", "Sword", ["Longsword", "Shortsword"])
# Define attributes
generator.set_attribute("Weapon", "", "Damage", 10.0, 5.0, 20.0, true)
# Generate loot
var options = {
"number_of_items": 5,
"base_level": 15.0,
"level_variance": 5.0,
"affix_chance": 0.75,
"linear": true,
"scaling_factor": 1.0
}
var items = generator.generate_loot(options, {}, "Loot")
for item in items:
print("%s: %s" % [item.quality, item.name])
Building
Rust Library
C++ Examples
&&
C# Examples
Godot Examples
The Godot binding crate is built when the primary rust library is built. See examples/godot/README.md.
License
This project is licensed under the LGPL-3.0-or-later license. See LICENSE file for details.
Contributing
Contributions are welcome! Please ensure all tests pass before submitting pull requests:
Test coverage must meet a minimum of 80%.