4.0 KiB
4.0 KiB
Rune System
Runes are permanent enchantments that can be engraved onto equipment to grant bonuses. Each piece of equipment can only have one rune.
How It Works
- Unlock: Defeat a boss to unlock a rune (e.g., unicorn boss unlocks Rune of Swiftness)
- Craft: Go to Crafting > Runes menu (only visible after unlocking at least one rune)
- Requirements: Knife (tool, not consumed), 1 Clay, 1 Favor, must be in base area
- Result: Equipment becomes "Runed {Item} of {Effect}" (e.g., "Runed Skin Pants of Quickness")
Current Runes
Rune of Swiftness
- Unlocked by: Defeating the unicorn boss
- Effect name: "of Quickness"
- Walk speed bonus: 20ms per runed item (moccasins give 40ms)
- Gathering bonus: 5% faster per runed item (capped at 50% total)
- Stacking: All bonuses stack (moccasins + all runed items + speed blessing)
Files Overview
| File | Purpose |
|---|---|
src/runes/rune_data.nvgt |
Core data structures, constants, unlock tracking, dictionary storage |
src/runes/rune_effects.nvgt |
Speed bonus calculations for walking and gathering |
src/crafting/craft_runes.nvgt |
Rune engraving crafting menu |
Adding a New Rune
Step 1: Add Constants (rune_data.nvgt)
const int RUNE_NEWRUNE = 1; // Next available ID
bool rune_newrune_unlocked = false;
Step 2: Update Helper Functions (rune_data.nvgt)
// In get_rune_name()
if (rune_type == RUNE_NEWRUNE) return "Rune of NewEffect";
// In get_rune_effect_name()
if (rune_type == RUNE_NEWRUNE) return "NewEffect";
// In any_rune_unlocked()
return rune_swiftness_unlocked || rune_newrune_unlocked;
// In is_rune_unlocked()
if (rune_type == RUNE_NEWRUNE) return rune_newrune_unlocked;
// In reset_rune_data()
rune_newrune_unlocked = false;
Step 3: Add Effect Calculations (rune_effects.nvgt)
For a combat rune example:
int get_total_rune_damage_bonus() {
int bonus = 0;
if (equipped_weapon_rune == RUNE_NEWRUNE) bonus += RUNE_NEWRUNE_DAMAGE_BONUS;
return bonus;
}
Step 4: Add Crafting Option (craft_runes.nvgt)
// In run_runes_menu(), add to the menu building:
if (rune_newrune_unlocked) {
rune_options.insert_last("Rune of NewEffect (1 Clay, 1 Favor) [Requires Knife]");
rune_types.insert_last(RUNE_NEWRUNE);
}
Step 5: Add Save/Load (save_system.nvgt)
// In save_game_state():
saveData.set("rune_newrune_unlocked", rune_newrune_unlocked);
// In load_game_state():
rune_newrune_unlocked = get_bool(saveData, "rune_newrune_unlocked", false);
Step 6: Set Unlock Condition
In the boss victory function or quest reward:
rune_newrune_unlocked = true;
Step 7: Update Equipment Menu (if needed)
If the new rune needs special display in equipment_menu.nvgt:
// In the runed items loop, add check for new rune type:
int count = get_runed_item_count(equip_type, RUNE_NEWRUNE);
if (count > 0) {
// Add to menu...
}
Data Storage
Rune Unlocks
Simple boolean variables per rune type, saved individually.
Runed Items
Uses a dictionary with key format "equip_type:rune_type" and count as value.
- Example:
"5:0"= Skin Pants (EQUIP_PANTS=5) with Swiftness (RUNE_SWIFTNESS=0) - Saved as comma-separated
key=countpairs
Equipped Runes
Tracked per equipment slot:
equipped_head_runeequipped_torso_runeequipped_arms_runeequipped_hands_runeequipped_legs_runeequipped_feet_runeequipped_weapon_rune
Equipment Types That Can Be Runed
All current equipment (defined in get_runeable_equipment_types()):
- Weapons: Spear, Axe, Sling, Bow
- Clothing: Skin Hat, Skin Gloves, Skin Pants, Skin Tunic, Moccasins, Skin Pouch, Backpack
Constants Reference
| Constant | Value | Description |
|---|---|---|
RUNE_NONE |
-1 | No rune applied |
RUNE_SWIFTNESS |
0 | Swiftness rune type |
RUNE_SWIFTNESS_SPEED_BONUS |
20 | Walk speed reduction in ms |
RUNE_SWIFTNESS_GATHER_BONUS |
5 | Gathering speed reduction % |