Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
8dbf9a0
Easy copy/paste settings sync for racers
eaglevis Aug 10, 2018
f9946ff
Add Eager Smiths mode
caerulius Jan 23, 2019
78aaa4e
one wrong item snuck in there, dropped fake
caerulius Jan 24, 2019
a20418c
fixed line endings in gui
caerulius Jan 24, 2019
a149b77
despite the fact that demons's spear has data for normal reinforcemen…
caerulius Jan 26, 2019
19a64b9
same thing as demon's spear, giant's halberd.
caerulius Jan 27, 2019
08b37e7
Added ability to save settings
Stochast1c Feb 10, 2019
428616c
Default Option change, soul_diff = transpose
Stochast1c Feb 10, 2019
65486a0
Finally Adding a gitignore
Stochast1c Feb 11, 2019
38ac9e7
Rebuilt with pyinstaller
Stochast1c Feb 11, 2019
c0aa125
Merge pull request #1 from Stochast1c/master
caerulius Feb 15, 2019
4565b37
Add revert to vanilla feature
Jun 8, 2021
71dfe55
Merge branch 'add_normalize_game_feature' into 'add_revert_to_vanilla…
Jun 8, 2021
ad66402
WIP
forstycup Feb 24, 2024
70cfbc4
Finalize test of opening / editing FMG files
forstycup Feb 25, 2024
726dee0
WIP hint stuff
forstycup Feb 27, 2024
2f82aa9
Continued hint work
forstycup Mar 3, 2024
0e91c8e
hints now work with seek guidance
forstycup Mar 4, 2024
4026cae
Merge branch 'pr/5' into fmg-item/msg-text
forstycup Mar 5, 2024
0db5ab4
fix success / error height in exe
forstycup Mar 5, 2024
6708612
Update DarkSoulsItemRandomizer.exe
forstycup Mar 20, 2024
0d16f0b
Merge pull request #1 from forstycup/fmg-item/msg-text
forstycup Mar 20, 2024
c3f00fc
Fix hints using the seeded RNG correctly
forstycup Mar 20, 2024
1c699f3
Merge pull request #2 from forstycup/fmg-item/msg-text
forstycup Mar 20, 2024
aecafee
Disable hints in PTDE
forstycup Jul 27, 2024
0e1f939
This is pull request made by AbscondWithAPie that was ignored. Absco…
da66en Feb 1, 2025
bf2b1fb
- removed 'cast light' from key items, made 'sunlight maggot helm' a …
da66en Feb 2, 2025
7f18282
Merge branch 'AbscondWithAPie_hint-debug-file' into dev_since_fork
da66en Feb 2, 2025
259cef8
Merge branch 'master' into dev_since_fork
da66en Feb 2, 2025
eec5e8d
- Disable and clear 'Seek Guidance' if PTDE version is being used.
da66en Feb 2, 2025
c5d8468
Merge branch 'dev_since_fork'
da66en Feb 2, 2025
795f19b
- added a directory in .gitignore developer can stash things. spelli…
da66en Feb 2, 2025
d7a7120
Merge branch 'dev_since_fork'
da66en Feb 2, 2025
f573352
Merge AzetinnitezA:add_revert_to_vanilla_feature to da66en:add_revert…
da66en Feb 2, 2025
6da7fa1
Merge branch 'add_revert_to_vanilla_feature' into dev_since_fork
da66en Feb 2, 2025
962603b
- version notes and author bump
da66en Feb 2, 2025
0160a41
- bump, build exe with AzetinnitezA's 'Revert to Vanilla'
da66en Feb 3, 2025
7ba77a9
Merge branch 'dev_since_fork'
da66en Feb 3, 2025
033e172
Merge pull request #3 from eaglevis/settings-sync
da66en Feb 3, 2025
50ef1bd
Merge branch 'eaglevis-settings-sync' of https://github.com/da66en/Da…
da66en Feb 3, 2025
61a77a8
Merge branch 'dev_since_fork' into eaglevis-settings-sync
da66en Feb 3, 2025
81a8eaf
- added new features/variables to the serialization read/write
da66en Feb 3, 2025
bbe930f
Merge branch 'eaglevis-settings-sync' into dev_since_fork
da66en Feb 3, 2025
7994d1d
- update docs and build exe for read/write settings from clipboard
da66en Feb 3, 2025
fc666f3
Merge branch 'dev_since_fork'
da66en Feb 3, 2025
3c1ceeb
Seek Guidance hints fixed.
da66en Feb 8, 2025
fa6e7d3
Merge branch 'dev_since_fork'
da66en Feb 8, 2025
d9f2be3
- clean-up of GUI to make space for new features (mostly changing rad…
da66en Mar 3, 2025
0cec245
Added more info to seed_info.txt so it's easier to recreate the seed.…
da66en Mar 9, 2025
cb31a54
Replaced online use items with random consumable. Don't let Sunlight…
da66en Mar 10, 2025
565bf1b
Replaced online use items (Covenant Rings, Eye Orbs, Soapstones, Drie…
da66en Mar 13, 2025
ac9eb1b
0.7.1 bugfix release
da66en Mar 14, 2025
b0e1304
Fix for 'Write Seed Cheatsheet' crashing.
da66en Mar 14, 2025
eea237d
Better start spells
da66en Mar 30, 2025
bdc1bd5
No Black Knight weapons option
da66en Apr 29, 2025
97e48f7
Cell at the end of Duke's Prison (where Big Hat Logan is imprisoned) …
da66en May 5, 2025
75e49eb
Fix for better_start_spells handler not giving spell casters starting…
da66en May 6, 2025
f40323e
Add breaks to file checks
Primogenitor33 Jun 16, 2026
9ee78a4
Merge pull request #8 from Primogenitor33/Stop-searching-for-files-on…
da66en Jul 9, 2026
4bb5994
v0.8.1 build
da66en Jul 9, 2026
25b6786
Merge pull request #9 from da66en/Stop-searching-for-files-on-first-h…
da66en Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
*.pyc
*.swp
build/
dist/*
.vscode/
dev_tools/
__pycache__
.idea
random-seed-*
75 changes: 72 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Dark Souls Item Randomizer

Instructions:
**Instructions:**

* (PTDE Only) Unpack your Dark Souls archive files using UnpackDarkSoulsForModding, which can be found [here](https://github.com/HotPocketRemix/UnpackDarkSoulsForModding).
* Download `DarkSoulsItemRandomizer.exe`, and place it in your Dark Souls directory, where DARKSOULS.exe (PTDE) or DarkSoulsRemastered.exe (DS1R) are.
Expand All @@ -9,8 +9,15 @@ configuration to `GameParam.parambnd` or `GameParam.parambnd.dcx`, depending on
A directory with the current date/time stamp will be created containing information about the item distribution, including a cheatsheet.
* If you want to inspect a certain item distribution, but not modify the actual game files, you can instead input a seed and click the "Write Seed Info" button
to generate the same type of folder as above, without modifying the current item distribution. Note that you *must* input a seed for this to work.
* Having 'Save Settings To Default' will write settings to INI file when Export button is pressed.
* To share settings and seeds with others, right click and choose 'Copy settings to Sync'. A seed/settings string will be generated and placed in your clipboard, use paste (CTRL-V) to paste that string in chat, Discord, e-mails, etc.
* To load settings shared with others, copy to the clipboard (CTRL+C) the seed/settings strings shared with you and then right click in the and coose 'Paste settings sync'.

To restore the default item distribution:
*To restore the default item distribution automatically:*

* Press the 'Revert to vanilla' button

*To restore the default item distribution manually:*

* Check that `GameParam.parambnd[.dcx].bak` exists in `\param\GameParam`.
* Delete `GameParam.parambnd[.dcx]` from `\param\GameParam`.
Expand Down Expand Up @@ -56,10 +63,17 @@ Fashion Souls: If active, the many armor sets in game are split up, and each pie
Laundromat Mixup: If active, most human NPCs will wear random armor instead of their usual sets. If Fashion Souls is not active, NPCs will wear randomly chosen full sets of armor.
If Fashion Souls is active, NPCs will wear independently chosen random pieces of armor.

Senile Gwynevere: If active, the Lordvessel will be shuffled like other key items, and Gwynevere will give the player a different item in place of the Lordvessel. Not compatible with not shuffling keys.
Lordvessel Randomized: If active, the Lordvessel will be shuffled like other key items, and Gwynevere will give the player a different item in place of the Lordvessel. Not compatible with not shuffling keys.

Lordvessel @ Firelink: If active, the Lordvessel will always be in Firelink Shrine. This can drastically cut down game time length. Not compatible with not shuffling keys.

Senile Primordial Serpents: If active, the four Lord Souls will be shuffled like other key items. Not compatible with not shuffling keys.

Eager Smiths: If active, weapons capable of upgrading along the various ember paths (Chaos, Magic, Divine, etc.) have a 25% chance of dropping as a +0 version of one of these paths. A bit of an easier setting, but will allow for more diversity of viable weapons across playthroughs.

No DLC: If active, key items will NOT be in Painted World or Artorias of the Abyss DLC locations. Also keys needed for those areas will not be placed outside of these areas, to prevent you from getting keys in sections that aren't needed.

Seek Guidance Help: If active, useful hints replace the dev messages that appear when using the Seek Guidance miracle. Petrus at the Firelink Shrine has the Seek Guidance miracle and a talisman for sale.

**Race Mode Possible Key Locations**:

Expand Down Expand Up @@ -264,6 +278,8 @@ Senile Primordial Serpents: If active, the four Lord Souls will be shuffled like
1700050: The Duke's Archives Chest #2
(In the room with broken machinery; a fog gate nearby leads to the
outside grounds and Crystal Cave. Normally holds Prism Stone x20.)
1700200: The Duke's Archives - Big Hat Logan's cell
(Requires Archive Tower Giant Cell Key to open.)
1700210: The Duke's Archives - Archive Prison Extra Key Original Location
(In a side cell in the Prison. The cell's door can be opened using the
Archive Tower Cell Key, which is always dropped by the sleeping Serpent
Expand Down Expand Up @@ -349,3 +365,56 @@ Senile Primordial Serpents: If active, the four Lord Souls will be shuffled like
- Force Quit Wrong Warp is *not* generally required, but may be
useful to escape from certain softlocks and avoid the need for
some keys.

**Seek Guidance help:**

Don't forget that Petrus at the Firelink Shrine has the Seek Guidance miracle and a talisman for sale.

*The hint rules are as follows:*

take 2 of the big key hints and put them in twice (4 slots)
take 6 of the key hints, and put them in twice (12 slots, 16 total)
take 4 of the useful items, put them in (4 slots, 20 total)
take 6 of the useful locations, put them in (6 slots, 26 total)
take 3 trash hints, shuffle them in twice (6 slots, 32 total)

*Hint Locations:*

Area|Original Text|Location|
---|---|---|
Undead Asylum|"Exchange"|Near Snuggly, in the large bird nest to the right as you exit the Asylum.|
Firelink Shrine|"Path ahead"|Drop off point from the elevator, before the path to the egg-nest above the old shrine.|
Firelink Shrine|"Here!"|At the base of the flying buttress, reached by jumping/rolling, on the path to the egg-nest.|
Undead Burg|"Imminent Merchant"|Under the aqueduct, in front of Domhall of Zena once he relocates there from the Depths.|
Undead Burg|"Imminent drake..."|At the start of the Hellkite bridge, beside basement door.|
Undead Burg|"Jumping off ahead"|Before barrels where two Hollows hanging from railing climb up to ambush.|
Undead Burg|"Prisoner ahead"|In front of the house where Griggs of Vinheim is trapped in Lower Undead Burg.|
Undead Parish|"Prisoner ahead"|Inside Undead Church, in the upper doorway towards Lautrec's cell.|
Undead Parish|"Blacksmith ahead"|On the start of the bridge towards the old church, where Andre of Astora is located.|
Darkroot Garden|"Follow the shining flowers"|Right outside the exit from the old church, before entering the garden.|
Darkroot Garden|"Are the trees moving?"|Past the first living/killable tree on the right side of the Moonlight Butterfly area.|
Depths|"I can't take this"|Inside the bonfire chamber.|
Depths|"Try sliding down"|In Giant Rat chamber, on far left side next to top of waterfall.|
Depths|"Imminent shortcut"|Before the shortcut.|
Depths|"Weakness: Head"|In Gaping Dragon boss area, near pillars on left side.|
Blighttown|"Path Ahead"|Near first bonfire, on approach to nearby fire hounds.|
Quelaag's Domain|"Illusory Wall"|Just before illusory wall leading to Chaos Servant covenant, below Second Bell of Awakening.|
The Catacombs|"Try divine"|Right below the first ladder in the Catacombs.|
The Catacombs|"Treasure"|Near weak looking and breakable brick wall.|
The Catacombs|"Blacksmith ahead"|In the wheel skeleton pit, right outside the entrance to Vamos.|
The Catacombs|"Liar"|Near Patches at his bridge turning switch location.|
The Catacombs|"Up"|At the base of the ladder, along the path from the tomb where the Darkmoon Seance Ring is found.|
The Catacombs|"Shortcut ahead"|Right after Pinwheel, on the route to the drop leading back to the Catacombs|
New Londo Ruins|"Need Curses"|Right before the rickety bridge that leads to the old city.|
New Londo Ruins|"Imminent jumping off ..."|At bottom of broken stairs, outside building holding Sealer.|
New Londo Ruins|"Need Covenant"|Outcrop at bottom of staircase leading to Abyss/Four Kings.|
Sen's Fortress|"Prisoner ahead"|In front of breakable wall where Big Hat Logan is kept.|
Anor Londo|"Path ahead"|At the base of the flying buttress leading to the upper floor of the church with the painting.|
Anor Londo|"Try Projectile"|Right inside the door in the Chamber of the Princess.|
Valley of Drakes|"Ring Ahead"|Before the bridge with the wyverns, approaching from the Darkroot elevator.|
Demon Ruins|"Safe Zone Ahead"|In Centipede Demon room, to the right on approach to patch of ground out of the lava.|
Crystal Cave|"Path Ahead"|On the first invisible bridge.|

**For Developers:**

Generating executable: `pyinstaller randomizer_gui.py --onefile -i favicon.ico --add-data "favicon.gif;." --noconsole --name "DarkSoulsItemRandomizer"`
22 changes: 22 additions & 0 deletions chr_init_param.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import struct
import sys

import chr_setup as chr_s
import item_lot_formatter as item_lf

def extract_shift_jisz(content, offset):
extracted = b''
while content[offset:offset+1] != b'\x00':
Expand Down Expand Up @@ -212,6 +215,25 @@ def find_chr_by_id(self, chr_id):
if chr_init.chr_init_id == chr_id:
return chr_init
return None

def return_cheatsheet(self):
ret = ""
attrs_to_print = ['spell_1', 'spell_2', 'spell_3', 'spell_4', 'spell_5', 'spell_6', 'spell_7',
'arrow_1', 'arrow_2', 'bolt_1', 'bolt_2',
'item_1', 'item_2', 'item_3', 'item_4', 'item_5', 'item_6', 'item_7', 'item_8', 'item_9', 'item_10',
'ring_1', 'ring_2', 'ring_3', 'ring_4', 'ring_5']
for class_name in chr_s.CLASS_TO_CHR_INIT:
(_, start_class_init_id) = chr_s.CLASS_TO_CHR_INIT[class_name]
ret += class_name.title() + " starting items:\n\t"
chr = self.find_chr_by_id(start_class_init_id)
for attr_to_print in attrs_to_print:
attr_id = getattr(chr, attr_to_print)
attr_value = "None"
if attr_id > 0:
attr_value = item_lf.ITEMS[attr_id]
ret += attr_to_print + ":'" + attr_value +"' "
ret += "\n"
return ret

def export_as_binary(self):
num_of_records = len(self.chr_inits)
Expand Down
Loading