damdara

Crates.iodamdara
lib.rsdamdara
version0.8.4
created_at2025-04-22 01:07:28.774976+00
updated_at2025-06-26 13:51:30.923786+00
descriptionDragon Quest Core Module, created in Rust.
homepagehttps://github.com/retrodig/damdara
repositoryhttps://github.com/retrodig/damdara
max_upload_size
id1643472
size3,103,973
daisuke.takayama (panicdragon)

documentation

README

๐Ÿฐ Damdara ๐Ÿฆ€

Rust crate docs Forks Stars License

Damdara is a core logic crate for retro-fantasy that can be built in Rust,

fully recreating the โ€œFukkatsu no Jumonโ€ system from the NES version of Dragon Quest,

while also having the ability to generate status by player name, equip items, and handle combat.

Table of Contents

Features

  • Generate resurrection "Fukkatsu no Jumon" from parameters ๏ผˆParameters to Password๏ผ‰
  • Parameters generated from resurrection "Fukkatsu no Jumon" (Password to Parameters)
  • Calculate parameters enhanced by name
  • See list of monsters
  • Refer to any monster information
  • See parameter list
  • Refer to any parameter
  • See list of Item
  • Refer to any Item information
  • See list of Weapon
  • Refer to any Weapon information
  • See list of Armor
  • Refer to any Armor information
  • See list of Shield
  • Refer to any Shield information
  • Reproduction of battle scenes
  • See list of Town
  • Refer to any Town information
  • Refer to any World information
  • See list of Message
  • Explore the field
  • Explore the Town

This diagram shows the 120-bit structure of the โ€œFufutsu no Jumonโ€.

The name, experience value, gold, items, equipment, key items, flag information, etc. are packed and stored strictly in bits.

From this structure, the structure rearranged to generate the โ€œFufutsu no Jumonโ€ is as follows.

Bit configuration mapping table for password generation.

Byte Index Field Description Bits (from MSB to LSB)
0 Checksum (CRC-8) [7:0]
1 Experience (lower 8 bits) [7:0]
2 Pattern[2] (1) + Necklace (1) + Name[2] (6) [7], [6], [5:0]
3 Item[3] + Item[2] [7:4], [3:0]
4 Gold (lower 8 bits) [7:0]
5 Name[0] (6) + Golem (1) + Pattern[1] (1) [7:2], [1], [0]
6 Item[7] + Item[6] [7:4], [3:0]
7 Pattern[0] + Dragon (1) + Name[3] (6) [7], [6], [5:0]
8 Weapon (3) + Armor (3) + Shield (2) [7:5], [4:2], [1:0]
9 Gold (upper 8 bits) [7:0]
10 Keys + Herbs [7:4], [3:0]
11 Item[5] + Item[4] [7:4], [3:0]
12 Experience (upper 8 bits) [7:0]
13 DragonScale (1) + Name[1] (6) + WarriorRing (1) [7], [6:1], [0]
14 Item[1] + Item[0] [7:4], [3:0]

Installation

Cargo

cargo install damdara

Add to project

cargo add damdara

Brew

brew tap webcyou-org/tap
brew install damdara

Usage

cargo run <input>

or

damdara <input>

If input is not present, the default brave value is returned.

cargo run

player name: ใ‚†ใ†ใฆใ„
summary: PlayerSummary { name: "ใ‚†ใ†ใฆใ„", level: 1, hp: 15, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 3, max_hp: 15, max_mp: 0, attack_power: 4, defense_power: 1, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }
item: ["ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—"]

The name can be specified by giving -n

cargo run -- -n ใ ใ„

player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }

By granting options, you can change parameters, possess items, change equipment, and do many other things.

If you want to give 200 experience. The level is automatically reflected.

cargo run -- -n ใ ใ„ -e 200

player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 5, hp: 32, mp: 20, gold: 0, experience: 200 }
strength_status: StrengthStatus { level: 5, strength: 11, agility: 10, max_hp: 32, max_mp: 20, attack_power: 11, defense_power: 5, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }

Furthermore, if you wish to grant 300 Gold.

cargo run -- -n ใ ใ„ -e 200 -g 300

player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 5, hp: 32, mp: 20, gold: 300, experience: 200 }
strength_status: StrengthStatus { level: 5, strength: 11, agility: 10, max_hp: 32, max_mp: 20, attack_power: 11, defense_power: 5, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }

If you want to change the item possession, pass the corresponding item IDs separated by commas.

cargo run -- -n ใ ใ„ -i 2,3,4

player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }
item: ["ใ›ใ„ใ™ใ„", "ใ‚ญใƒกใƒฉใฎใคใฐใ•", "ใ‚Šใ‚…ใ†ใฎใ†ใ‚ใ“", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—"]

It is also possible to put on any equipment by specifying ID.

cargo run -- -n ใ ใ„ -w 3 -a 5 -s 3

summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 14, defense_power: 46, weapon: "ใฉใ†ใฎใคใ‚‹ใŽ", armor: "ใฏใŒใญใฎใ‚ˆใ‚ใ„", shield: "ใฟใ‹ใŒใฟใฎใŸใฆ" }
item: ["ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—"]

flags are a group of flags that indicate whether a player has equipped a particular item or defeated a boss monster.

They can be specified collectively as a 5-digit bit string with the command line argument --flags.

cargo run -- -n ใ ใ„ --flags 01010

List of CLI options

option type default value Description
-n, --name String "ใ‚†ใ†ใฆใ„" Main character's name
-e, --exp u16 0 XP
-g, --gold u16 0 Gold in possession
-w, --weapon u8 0 The number of the weapon you are equipped with
-a, --armor u8 0 The number of the armor you are equipped with
-s, --shield u8 0 The number of the shield you are equipped with
-i, --item Vec(comma delimited) not in possession List of item numbers
-y, --herbs u8 0 Number of herbs held
-k, --keys u8 0 Number of keys held
--flags Flags structure All false status flag
-p, --password String Maximum Strengthened Password Fukkatsu no Jumon

Flags option details๏ผˆ--flags๏ผ‰

digit position bit Field Name Description
1st digit 0/1 has_dragon_scale Equipped with the scales of a dragon?
2st digit 0/1 has_warrior_ring Are you equipped with a warrior's ring?
3st digit 0/1 has_cursed_necklace Did you get the beak necklace?
4st digit 0/1 defeated_dragon You slayed the dragon.
5st digit 0/1 defeated_golem You beat the golem.
  • Specify with 5 digits 0/1 like --flags 01000.
  • If not specified, default โ€œ00000โ€ (all false)

Mode

You can specify the mode by giving --mode or the shortcut -m.

cargo run -- --mode <input>
cargo run -- -m <input>
Mode Name Description
start Calculate enhanced parameters from name only
save Generate "Fukkatsu no Jumon" from arbitrary parameters (e.g. exp, gold, etc.)
load Restore name/parameters from the "Fukkatsu no Jumon"
display Supports list and individual display of master data
battle Can battle any monster.

โ–  Start Mode

Generate parameters from the names of brave men

example

player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }

The default setting of the mode is here, so if you omit it, the default brave will be generated

example

cargo run

player name: ใ‚†ใ†ใฆใ„
summary: PlayerSummary { name: "ใ‚†ใ†ใฆใ„", level: 1, hp: 15, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 3, max_hp: 15, max_mp: 0, attack_power: 4, defense_power: 1, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }
item: ["ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—", "ใชใ—"]

โ–  Save Mode

Generates the "Fukkatsu no Jumon" from the parameters of the hero.

example

cargo run -- -n ใ ใ„ -m save

ใขใฐใ’ใžใงใถใ„ใพใ‚‚ใ‚‚ใ‚ŒใŽใ–ใžใงใถใ„ใ‚ˆใ”ใœ

After giving the options explained above and changing the parameters, the Fufutsu no Jumon can be generated.

cargo run -- -n ใ ใ„ -e 7000 -m save

ใใŒใ‚ˆใ‚ใ’ใšใขใชใฎใฎใฟใ‚„ใ‚Šใ‚ใ’ใšใฆใ ใ„ใ‹

โ–  Load Mode

Generates a brave man from the "Fukkatsu no Jumon" of fortune.

example

cargo run -- -m load -p ใขใฐใ’ใžใงใถใ„ใพใ‚‚ใ‚‚ใ‚ŒใŽใ–ใžใงใถใ„ใ‚ˆใ”ใœ

new_player from Password
player name: ใŸใ‚›ใ„
summary: PlayerSummary { name: "ใŸใ‚›ใ„\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 }
strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "ใชใ—", armor: "ใชใ—", shield: "ใชใ—" }

โ–  Display Mode

cargo run -- -m display --view item
[Equipment { name: "ใชใ—", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใŸใ„ใพใค", price: 8, sell: 4, attack: 0, defense: 0 }, Equipment { name: "ใ›ใ„ใ™ใ„", price: 12, sell: 6, attack: 0, defense: 0 }, Equipment { name: "ใ‚ญใƒกใƒฉใฎใคใฐใ•", price: 24, sell: 12, attack: 0, defense: 0 }, Equipment { name: "ใ‚Šใ‚…ใ†ใฎใ†ใ‚ใ“", price: 20, sell: 10, attack: 0, defense: 2 }, Equipment { name: "ใ‚ˆใ†ใ›ใ„ใฎใตใˆ", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใ›ใ‚“ใ—ใฎใ‚†ใณใ‚", price: 0, sell: 0, attack: 2, defense: 0 }, Equipment { name: "ใƒญใƒˆใฎใ—ใ‚‹ใ—", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใŠใ†ใ˜ใ‚‡ใฎใ‚ใ„", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใฎใ‚ใ„ใฎใƒ™ใƒซใƒˆ", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใŽใ‚“ใฎใŸใฆใ”ใจ", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใ—ใฎใใณใ‹ใ–ใ‚Š", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใŸใ„ใ‚ˆใ†ใฎใ„ใ—", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใ‚ใพใใ‚‚ใฎใคใˆ", price: 0, sell: 0, attack: 0, defense: 0 }, Equipment { name: "ใซใ˜ใฎใ—ใšใ", price: 0, sell: 0, attack: 0, defense: 0 }]
cargo run -- -m display --view item 5
item: Equipment { name: "ใ‚ˆใ†ใ›ใ„ใฎใตใˆ", price: 0, sell: 0, attack: 0, defense: 0 }

Display Patterns

  • item
  • weapon
  • armor
  • shield
  • status
  • monster
  • town
  • message

โ–  Battle Mode

Now, if you have given birth to a brave man, let's head into battle.

Enter commands and defeat the slime!

cargo run -- -m battle

ใ‚นใƒฉใ‚คใƒ ใŒใ‚ใ‚‰ใ‚ใ‚ŒใŸ๏ผ

ใ‚†ใ†ใฆใ„ HP: 15
ใ‚นใƒฉใ‚คใƒ  HP: 3

--- ใ‚†ใ†ใฆใ„ใฎใ‚ฟใƒผใƒณ ---
ใ‚ณใƒžใƒณใƒ‰๏ผŸ
1: ใŸใŸใ‹ใ†
2: ใ˜ใ‚…ใ‚‚ใ‚“
3: ใฉใ†ใ
4: ใซใ’ใ‚‹

If you've been hit, then take on the challenge with the best equipment!

cargo run -- -n ใ ใ„ -o max -m battle

ใ‚นใƒฉใ‚คใƒ ใŒใ‚ใ‚‰ใ‚ใ‚ŒใŸ๏ผ

ใŸใ‚›ใ„ใ€€ HP: 190
ใ‚นใƒฉใ‚คใƒ  HP: 3

--- ใŸใ‚›ใ„ใ€€ใฎใ‚ฟใƒผใƒณ ---
ใ‚ณใƒžใƒณใƒ‰๏ผŸ
1: ใŸใŸใ‹ใ†
2: ใ˜ใ‚…ใ‚‚ใ‚“
3: ใฉใ†ใ
4: ใซใ’ใ‚‹

You can fight any monster by specifying the id of the enemy in the --view option.

You can fight the last boss right away.

cargo run -- -n ใ ใ„ -o max -m battle --view 39

ใ‚Šใ‚…ใ†ใŠใ†ใŒใ‚ใ‚‰ใ‚ใ‚ŒใŸ๏ผ

ใŸใ‚›ใ„ใ€€ HP: 190
ใ‚Šใ‚…ใ†ใŠใ† HP: 129

--- ใŸใ‚›ใ„ใ€€ใฎใ‚ฟใƒผใƒณ ---
ใ‚ณใƒžใƒณใƒ‰๏ผŸ
1: ใŸใŸใ‹ใ†
2: ใ˜ใ‚…ใ‚‚ใ‚“
3: ใฉใ†ใ
4: ใซใ’ใ‚‹

Beware of strong flames.

 ใ‚Šใ‚…ใ†ใŠใ†ใฏ  ใปใฎใŠใ‚’ใฏใ„ใŸ!
 ใŸใ‚›ใ„ใ€€ใฏ 44ใƒใ‚คใƒณใƒˆใฎ
 ใƒ€ใƒกใƒผใ‚ธใ‚’ ใ†ใ‘ใŸ

ใŸใ‚›ใ„ใ€€ HP: 146
ใ‚Šใ‚…ใ†ใŠใ† HP: 129

Status Option

--option or the shortcut -o can be used to specify status options

cargo run -- -o <input>

If max is specified, the parameter and story state will be the strongest

example

cargo run -- -o max
player name: ใ‚†ใ†ใฆใ„
summary: PlayerSummary { name: "ใ‚†ใ†ใฆใ„", level: 30, hp: 210, mp: 180, gold: 65535, experience: 65535 }
strength_status: StrengthStatus { level: 30, strength: 140, agility: 117, max_hp: 210, max_mp: 180, attack_power: 182, defense_power: 108, weapon: "ใƒญใƒˆใฎใคใ‚‹ใŽ", armor: "ใƒญใƒˆใฎใ‚ˆใ‚ใ„", shield: "ใฟใ‹ใŒใฟใฎใŸใฆ" }
item: ["ใ‚Šใ‚…ใ†ใฎใ†ใ‚ใ“", "ใ›ใ‚“ใ—ใฎใ‚†ใณใ‚", "ใƒญใƒˆใฎใ—ใ‚‹ใ—", "ใŠใ†ใ˜ใ‚‡ใฎใ‚ใ„", "ใŽใ‚“ใฎใŸใฆใ”ใจ", "ใŸใ„ใ‚ˆใ†ใฎใ„ใ—", "ใ‚ใพใใ‚‚ใฎใคใˆ", "ใซใ˜ใฎใ—ใšใ"]

Format Option

The output format can be changed by giving the --format.

cargo run -- --format <input>
Format Name Description
print It will be a print statement output. This is the default setting.
json Output in JSON format

Example

Additional Resources

Contributing to Damdara

To contribute to Damdara, follow these steps:

  1. Fork this repository.
  2. Create a branch: git checkout -b <branch_name>.
  3. Make your changes and commit them: git commit -m '<commit_message>'.
  4. Push your changes to your branch: git push origin <branch_name>.
  5. Create a pull request.

Alternatively, consult the GitHub documentation on how to create a pull request.

Other Languages

References

License

This project is licensed under the MIT License. See the LICENSE file for details.

All monsters, images and other copyrights belong to Square Enix.

Author

Daisuke Takayama

Commit count: 167

cargo fmt