User Tools

Site Tools


rpd:modding_quick_reference

Non-Java Modding Quick Reference

This quick reference guide covers the most common modding tasks you can accomplish without Java coding in Remixed Dungeon.

Common File Locations

For Mods

  • /Android/data/com.nyrds.pixeldungeon.ml/files/YourModName/ (Android)
  • C:\Users\YourName\.remixed-dungeon\mods\YourModName\ (Desktop)

Important Files

  • version.json - Mod metadata and dependencies
  • res/values/strings.json - Text translations
  • levelsDesc/ - Level definitions
  • actors/mobs/ - Creature definitions
  • items/ - Item definitions (weapon, armor, etc.)
  • buffs/ - Status effect definitions

Resource Overrides

Replace a Sprite

1. Find original sprite in game assets 2. Create your new sprite in the same format/dimensions 3. Place in matching directory in your mod:

YourMod/
└── sprites/
    └── items/
        └── weapon.png (replaces original weapon sprites)

Replace Sound

YourMod/
└── sounds/
    └── your_sound.wav (use same filename as original)

Replace Music

YourMod/
└── music/
    └── your_track.ogg (use same filename as original)

JSON Configuration Changes

Change Item Stats

Create items/weapon/short_sword.json in your mod:

{
  "class": "com.watabou.pixeldungeon.items.weapon.melee.ShortSword",
  "damageMin": 6,  // Increased from default
  "damageMax": 12, // Increased from default
  "name:en": "Enhanced Short Sword"
}

Change Mob Stats

Create actors/mobs/rat.json in your mod:

{
  "class": "com.watabou.pixeldungeon.actors.mobs.Rat",
  "HP": 20,        // Increased from default
  "damageMin": 8,  // Increased from default
  "exp": 4         // Increased from default
}

Add New Text

Create res/values/strings.json in your mod:

{
  "CustomMessage": "This is my custom message!",
  "NewItemName": "Legendary Sword of Awesomeness",
  "NewItemDesc": "This sword is incredibly awesome."
}

Common Lua Functions

Damage Functions

  • target:damage(amount, source) - Deal damage to target (e.g., target:damage(10, source))
  • target:heal(amount, source) - Heal target (e.g., target:heal(5, source))
  • RPD.affectBuff(target, RPD.Buffs.Poison, duration) - Apply poison to target
  • RPD.affectBuff(target, RPD.Buffs.Burning, duration) - Apply burn to target
  • RPD.affectBuff(target, RPD.Buffs.Paralysis, duration) - Apply paralysis to target

Summoning Functions

  • RPD.spawnMob(mobClass, cell, mobDesc) - Spawn a new mob at a specific cell
  • local item = RPD.item(itemClass, quantity) - Create an item
  • Dungeon.level():drop(item, cell) - Drop an item at a specific cell

Effect Functions

  • RPD.topEffect(pos, effectName) - Show effect at a position (top layer)
  • RPD.bottomEffect(pos, effectName) - Show effect at a position (bottom layer)
  • RPD.objectEffect(pos, effectName) - Show effect at a position (object layer)
  • RPD.playSound(soundName) - Play a sound effect

Information Functions

  • RPD.Dungeon.hero - Get the player character
  • RPD.Dungeon.level():mobs() - Get all mobs on the current level
  • RPD.Dungeon.level():cell(x, y) - Get terrain type at position
  • RPD.Dungeon.level():distance(pos1, pos2) - Get distance between two positions
  • math.random() - Generate random number

Simple Custom Item (Complete Example)

1. Create the item JSON

items/weapon/ice_wand.json:

{
  "class": "com.watabou.pixeldungeon.items.weapon.missiles.MissileWeapon",
  "name:en": "Ice Wand",
  "desc:en": "A wand that shoots ice bolts. Freezes enemies temporarily.",
  "imageIndex": 25,
  "damageMin": 3,
  "damageMax": 7,
  "AC": "ZAP",
  "script": "items/ice_wand.lua",
  "onZap": "freezeBolt"
}

2. Create the Lua script

items/ice_wand.lua:

local RPD = require "scripts/lib/commonClasses"
local item = require "scripts/lib/item"
 
return item.init{
    desc = function()
        return {
            image         = 25,
            imageFile     = "items.png",
            name          = "Ice Wand",
            info          = "A wand that shoots ice bolts. Freezes enemies temporarily.",
            stackable     = false,
            upgradable    = true,
            isFlies       = false,
            defaultAction = "ZAP"
        }
    end,
 
    actions = function()
        return {RPD.Actions.ZAP}
    end,
 
    execute = function(self, item, hero, action)
        if action == RPD.Actions.ZAP then
            -- Find mob at target location
            local level = RPD.Dungeon.level()
            local allMobs = level:mobs()
            local target = nil
 
            for i = 0, allMobs:size()-1 do
                local mob = allMobs:get(i)
                if mob:getPos() == hero:getPos() then -- Simplified example - would need actual targeting
                    target = mob
                    break
                end
            end
 
            if target then
                -- Deal damage
                target:damage(5, hero)  -- Damage target, source is hero
                -- Freeze for 3 turns - using paralysis as an example
                RPD.affectBuff(target, RPD.Buffs.Paralysis, 3)
                RPD.glog("The ice bolt freezes " .. target:name() .. "!")
                -- Visual effect
                RPD.topEffect(target:getPos(), "ice")
            end
        end
    end
}

3. Add to your mod's version.json

{
  "version": 1,
  "name": "My Ice Mod",
  "author": "Your Name"
}

Common Modding Patterns

Equipment with On-Equip Effects

{
  "class": "com.watabou.pixeldungeon.items.armor.Armor",
  "onEquip": "equipEffect",
  "onUnequip": "unequipEffect"
}

function M.equipEffect(item, hero)
    -- In practice, you would use different mechanics as properties may not work this way
    RPD.glog("You feel protected from flames!")
end
 
function M.unequipEffect(item, hero)
    RPD.glog("Your fire protection fades.")
end

Mobs that Summon Others

function M.onTurn(mob)
    if math.random() < 0.1 then  -- 10% chance per turn
        local mobPos = mob:getPos()
        local summonPos = nil
        -- Find an empty adjacent cell
        local level = RPD.Dungeon.level()
        for direction = 0, 7 do
            local adjCell = mobPos + RPD.PathFinder.CIRCLE8[direction + 1]
            if level:cellValid(adjCell) and
               level:passable:adjCell(adjCell) and
               level:freeCell(adjCell) then
                summonPos = adjCell
                break
            end
        end
 
        if summonPos then
            local rat = RPD.spawnMob("Rat", summonPos, {})
            RPD.glog(mob:name() .. " summons help!")
        end
    end
end

Items that Change Terrain

function M.useItem(item, cell)
    -- Change terrain at target location
    local level = RPD.Dungeon.level()
    level:set(cell.x, cell.y, RPD.Terrain.CHASM)
    RPD.glog("The ground opens up!")
end

Testing Checklist

Before releasing your mod:

  • [ ] Does version.json exist and have correct format?
  • [ ] Do all JSON files have valid syntax? (Use JSON validator)
  • [ ] Are all file paths correct and matching original structure?
  • [ ] Do all referenced sprites exist?
  • [ ] Do Lua scripts have proper syntax? (Use Lua validator)
  • [ ] Are new items/mobs appearing in-game?
  • [ ] Do custom behaviors work as expected?
  • [ ] Is balance appropriate compared to existing content?

Troubleshooting Common Issues

Mod Not Loading

  • Check that version.json is in the root of your mod directory
  • Verify file permissions allow reading
  • Make sure all JSON syntax is valid

Lua Scripts Not Working

  • Check game log for Lua error messages
  • Verify script path in JSON matches actual file location
  • Validate Lua syntax with an online checker

Items/Mobs Not Appearing

  • Make sure item/mob class in JSON matches an actual class
  • Check that the item/mob is being placed somewhere (in bestiary, level, shop, etc.)
  • Verify file paths and JSON syntax

This quick reference should help you tackle most non-Java modding tasks in Remixed Dungeon!

rpd/modding_quick_reference.txt · Last modified: by 127.0.0.1