Item inflation is a problem that plagues RS3, OSRS, and Dodian.
The Dodian and RuneScape economies were built from a series of reactions and badly thought-out expansions that were designed to look temporarily shiny without significant consideration for how they would impact the long-term game economy.
My idea to kill item inflation is to have a system of 3 NPC types:
Unique drop NPCs:
- Drops either one unique item - like an Abyssal Whip, or a unique armour set.
- Targeted only when their unique item drops are in high demand.
- Players stop killing them when the unique item price is low, preventing further inflation.
- The items cannot be obtained from Smithing
- Not assignable by a slayer master, but could be locked behind a slayer requirements.
- Killing the NPC should could have either a GP or resource deflationary mechanism to decentivize camping of unprofitable NPCs.
Consumable Resource NPCs:
- Drops unique consumable resources tied to its NPC type (cow hide, green dhide, dragon bones, etc)
- The resources cannot be obtained from Dodian skills (food, logs, ores, runes, gems)
- Assignable by a slayer master to encourage market liquidity
Pure GP NPCs
- Drop only consistent GP that is tied linearly to the NPC's combat level
- Allow GP multipliers for special circumstances (slayer task 1.2x, key dungeon 1.6x)
- Does not contribute to item inflation
- Assignable by a slayer master
Generally desired effects:
- Unique items will only enter the game when they're in demand
- New content can be created to spread out the unique item drop table (abyssal demons, gargoyles, and such)
- Dead content is repurposed
- Mining / smithing will become useful again for pre-dragon gear
- New players will have better access to GP, stimulating early-game trading
Anticipated downsides:
- GP inflation that will need to be systematically deflated by another mechanism
- The game play won't be as linear for new players, forcing them to trade to progress combat efficiently, which might be frustrating
Development Pseudocode:
Code:
void onNpcDrop(Npc npc) {
final int UNIQUE_DROP = 1;
final int CONSUMABLE_RESOURCE_DROP = 2;
switch (npc.dropTableType) {
case UNIQUE_DROP:
ResultSet resultSet = SELECT chance, item_id, quantity FROM npc_unique_drop_table WHERE npcId=npc.id
foreach (Row row : resultSet.rows()) { // support for multiple unique drops in case of item sets
double chance = row.chance
int itemId = row.item_id
int quantity = row.quantity
if (chance <= Math.random()) {
drop(itemId, quantity);
}
}
break;
case CONSUMABLE_RESOURCE_DROP:
ResultSet resultSet = SELECT chance, item_id FROM npc_consumable_resource_drop_table WHERE npcId=npc.id
foreach (Row row : resultSet.rows()) { // support for multiple consumeable resource drops for cases like green dragons
double chance = row.chance
int itemId = row.item_id
if (chance <= Math.random()) {
drop(itemId, quantity);
}
}
break;
default: // Pure GP
final int ITEM_ID_COINS = 995;
final int GP_PER_COMBAT_LEVEL = ?;
int multiplier = 1;
if (npc.isSlayerTask) {
multiplier *= 1.2;
}
if (npc.isKeyDungeonMob) {
multiplier *= 1.6;
}
int quantity = npc.combatLevel * GP_PER_COMBAT_LEVEL * multiplier;
drop(ITEM_ID_COINS, quantity);
break;
}
}