Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Castlevania 64: Implement New Game #2472

Merged
merged 303 commits into from
Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
303 commits
Select commit Hold shift + click to select a range
1d43030
Add files via upload
PinkSwitch Oct 24, 2022
46bc69d
Add files via upload
PinkSwitch Oct 24, 2022
fd78182
Merge remote-tracking branch 'cv64_fork/main'
LiquidCat64 Oct 27, 2022
635afb5
Merge remote-tracking branch 'cv64_fork/main'
LiquidCat64 Oct 29, 2022
f3a5a37
Stage and Warp Shuffle is now playable in-game.
LiquidCat64 Oct 29, 2022
33d8bba
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 5, 2022
893f329
Add a save point to Duel Tower, end-level spawn points, and updated f…
LiquidCat64 Nov 5, 2022
7b7fd8c
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 8, 2022
dc79a4d
Stages entered through the back now overwrite the Restart This Stage …
LiquidCat64 Nov 8, 2022
0128e23
Stages entered through the back now overwrite the Restart This Stage …
LiquidCat64 Nov 8, 2022
1af42c9
Undo some accidental changes.
LiquidCat64 Nov 8, 2022
f2063cf
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 12, 2022
e5f59be
Add Special2 boss rewarding.
LiquidCat64 Nov 12, 2022
c8a932e
Add "bosses required" option.
LiquidCat64 Nov 15, 2022
fb2fed4
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 15, 2022
da180d0
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 22, 2022
7959988
Finalize the ASM for bosses giving Special2s.
LiquidCat64 Nov 22, 2022
4e4f3dc
The Game Over screen's "Continue" menu now defaults the cursor on whi…
LiquidCat64 Nov 26, 2022
9e3f56f
Refactor to the warp menu opener code to make opening said menu more …
LiquidCat64 Nov 29, 2022
7a6a309
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 1, 2022
a742a45
Some adjustments to the DeathLink-receiving code.
LiquidCat64 Dec 2, 2022
9f81d7f
A whoooooooole bunch of improvements, really!
LiquidCat64 Dec 9, 2022
35d6306
Merge remote-tracking branch 'cv64_fork/main'
LiquidCat64 Dec 9, 2022
e6ebc59
Yet another dumb merge conflict resolution.
LiquidCat64 Dec 9, 2022
dee1f89
Press B to exit the warp menu
LiquidCat64 Dec 12, 2022
6228cea
Zillion: fix invalid slot data from race condition
beauxq Dec 10, 2022
cd24dc0
Subnautica: give Early Seaglide a display name (#1313)
Berserker66 Dec 10, 2022
9acbae5
Rogue Legacy: Fix early vendors and architect not being added to pool…
ThePhar Dec 10, 2022
5749aac
Network: implement 0.4 marked compatibility removals (#757)
Berserker66 Dec 11, 2022
7ade906
Ocarina of Time 7.0 (#1277)
espeon65536 Dec 11, 2022
730bc03
SMW: Fix some stages walking Mario onto invalid tile on recomplete (#…
PoryGone Dec 11, 2022
0fe75ba
Tests: now autoload tests from /worlds/*/test (#1318)
Berserker66 Dec 11, 2022
e78f2b1
Docs: add remote_start_inventory info in generate_output (#1316)
Berserker66 Dec 11, 2022
75c5db0
Docs: change connecting to archipelago in RoR2 setup guide (#1320)
kindasneaki Dec 11, 2022
02e3ed2
WebHost: Add SC2WoL game specific tracker (#1270)
0rganics Dec 11, 2022
55a191d
SC2: Various bugfixes (#1267)
Magnemania Dec 11, 2022
4193a25
Core: move create_playthrough under Spoiler as method (#1310)
Berserker66 Dec 11, 2022
0e881b7
Pokemon R/B: Bug fixes and add trap weights (#1319)
Alchav Dec 11, 2022
a7d6f3a
WebHost: reduce tracker refresh delay (#1290)
Berserker66 Dec 11, 2022
08878ba
Lufia II Ancient Cave: implement new game (#1218)
el-u Dec 12, 2022
c4be5c1
Merge remote-tracking branch 'cv64_fork/main'
LiquidCat64 Dec 12, 2022
7508cd2
You know the drill, resolve that merge conflict!
LiquidCat64 Dec 12, 2022
b9625fe
A bunch of Renon and Castle Keep-related stuff.
LiquidCat64 Dec 16, 2022
5e60a2b
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 16, 2022
b35d21f
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 20, 2022
f65495f
Add sub-weapon shuffle
LiquidCat64 Dec 20, 2022
2ec3870
Big revamp to the logic code and whatnot
LiquidCat64 Dec 22, 2022
ed494b6
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 22, 2022
ce4c12b
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 24, 2022
7cb40a8
Miscelaneous fixes/adjustments
LiquidCat64 Dec 24, 2022
6107f65
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 30, 2022
1591eb3
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 7, 2023
6b0323b
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 10, 2023
0549511
Add Extra Keys mode.
LiquidCat64 Jan 10, 2023
3f7254e
Merge branch 'ArchipelagoMW:main' into main
PinkSwitch Jan 11, 2023
5744eb9
Add files via upload
PinkSwitch Jan 11, 2023
8488bb0
Add files via upload
PinkSwitch Jan 11, 2023
b6b0d76
Delete smw2yi directory
PinkSwitch Jan 11, 2023
a5762c7
Add files via upload
PinkSwitch Jan 11, 2023
48bbadc
Merge remote-tracking branch 'yi_fork/main'
LiquidCat64 Jan 11, 2023
db1cee0
Fix generation failures, turn some locations into events, and general…
LiquidCat64 Jan 17, 2023
1126f71
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 17, 2023
6f2ebd6
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 18, 2023
f4b4b3a
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Feb 3, 2023
c23f2ca
Merge remote-tracking branch 'cv64_fork/main'
LiquidCat64 Feb 3, 2023
a7ff9f9
Clean up a lot in preparation for CVLoD
LiquidCat64 Feb 5, 2023
38e10bc
Add the Arcane world folder with working seed generation.
LiquidCat64 Jan 18, 2023
63884cb
More refactoring
LiquidCat64 Feb 9, 2023
c2f4f9d
FUUUUUUUU- Delete the Arcane folder
LiquidCat64 Feb 9, 2023
098f49f
Fix vanilla flag mishap on a Forest item + more refactoring
LiquidCat64 Feb 12, 2023
18f822d
Even MORE refactoring!
LiquidCat64 Feb 16, 2023
a4655df
So much more refactoring that the old narrator got tired of refactori…
LiquidCat64 Feb 19, 2023
8250684
Regions successfully rewritten. Now let's do...ITEMS!
LiquidCat64 Feb 22, 2023
0f987c7
Merge branch 'main' into CV64
LiquidCat64 Mar 7, 2023
752a5ef
Merge remote-tracking branch 'cv64_fork/main' into CV64
LiquidCat64 Mar 7, 2023
ffe887c
Will this rewrite ever end?
LiquidCat64 Mar 15, 2023
c80bd35
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Mar 16, 2023
3bbb779
Finish the stage shuffle rewrite (mostly), at last!
LiquidCat64 Mar 19, 2023
2004c20
For all intents and purposes, the giant revamp is more-or-less done! …
LiquidCat64 Mar 23, 2023
2623dd2
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Mar 23, 2023
66c5cfc
New feature: Music rando
LiquidCat64 Mar 24, 2023
b43f6d6
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Mar 24, 2023
0e4d21b
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Mar 24, 2023
442b297
Add map lighting rando + music rando 'song restarting' fix
LiquidCat64 Apr 1, 2023
94b2992
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 1, 2023
2c21b96
Survival horror options + misc improvements
LiquidCat64 Apr 4, 2023
563d316
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 4, 2023
1eb600d
Fix Special1 logic bug + add unittest for warp entrances
LiquidCat64 Apr 5, 2023
777bc35
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Apr 5, 2023
90218a2
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 5, 2023
5731282
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Apr 5, 2023
0cb4d5d
Many, many assorted bugfixes.
LiquidCat64 Apr 8, 2023
3540a16
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 8, 2023
a467031
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 11, 2023
437790c
Add locations for the 3-hit breakables and sub weapons
LiquidCat64 Apr 16, 2023
f88ac1f
Add setting flags anywhere and changing the item model and visibility…
LiquidCat64 Apr 19, 2023
51e668b
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Apr 19, 2023
fa7d9bd
Bitflags on every location progress
LiquidCat64 Apr 23, 2023
cf6ab5e
More flag work + enable writing 32-bit ints instead of lists of 4 bytes.
LiquidCat64 Apr 27, 2023
123647f
Finish sub-weapons anywhere + empty breakable inclusion + 2 checks on…
LiquidCat64 May 3, 2023
979fb40
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 May 4, 2023
e392aa7
Three-hit breakable randomization
LiquidCat64 May 11, 2023
6182add
Working option to drop your previous sub-weapon
LiquidCat64 May 12, 2023
0e56ace
More refinements to the previous subweapon dropping hack
LiquidCat64 May 25, 2023
b70c751
Add Countdown Mode
LiquidCat64 Jun 6, 2023
27e4762
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jun 6, 2023
ee5f0a1
Refinements to Countdown
LiquidCat64 Jun 15, 2023
12fa254
Countdown actually works now!
LiquidCat64 Jun 16, 2023
3921403
Shopsanity groundwork
LiquidCat64 Jun 24, 2023
8dc098c
Mostly working shopsanity.
LiquidCat64 Jul 6, 2023
7e985ef
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jul 7, 2023
ba8e9ab
BizHawkClient: Add client and connector
Zunawe Jul 8, 2023
fd0bec4
BizHawkClient: Add launcher component and inno_setup lines
Zunawe Jul 8, 2023
0e4d73e
BizHawkClient: Misc stability updates and small improvements
Zunawe Jul 10, 2023
ebb58a7
BizHawkClient: Add docstrings
Zunawe Jul 10, 2023
9c5459b
Make Shopsanity ACTUALLY work
LiquidCat64 Jul 10, 2023
497aa0a
Much refinement to shopsanity, like in-game item names.
LiquidCat64 Jul 13, 2023
a121e99
Working invisible items option + changing item model in multiworld se…
LiquidCat64 Jul 14, 2023
de4955e
BizHawkClient: Pull in changes from other branch
Zunawe Jul 15, 2023
8dd4b2e
BizHawkClient: Fix no handler message not displaying after changed ROMs
Zunawe Jul 15, 2023
b3a731b
BizHawkClient: Remove extra print statement from lua
Zunawe Jul 15, 2023
5e61db0
BizHawkClient: Change version command to use raw strings
Zunawe Jul 15, 2023
6c029d2
BizHawkClient: Change script version to single integer
Zunawe Jul 15, 2023
74cf4b8
Costsanity, character boss options, text skips/redirects, cutscene re…
LiquidCat64 Jul 21, 2023
eef84bb
Panther mode, character switching, gondola skip, restore cutscenes, a…
LiquidCat64 Jul 30, 2023
d0594b7
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jul 30, 2023
9450848
Skip the "Found a hidden path" cutscene + shimmy speed option
LiquidCat64 Aug 3, 2023
2ba62b9
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Aug 3, 2023
9603f16
BizHawkClient: Add newline to version for lua script
Zunawe Aug 3, 2023
311502b
BizHawkClient: Call send_connect from BizHawkClient's watcher loop
Zunawe Aug 3, 2023
7b30378
BizHawkClient: Add handling for failed request getting script version
Zunawe Aug 3, 2023
eda1308
BizHawkClient: Have base64.lua check lua version explicitly for bit o…
Zunawe Aug 3, 2023
b59429f
BizHawkClient: Update connector script for slightly better errors and…
Zunawe Aug 3, 2023
f05e7e5
BizHawkClient: Remove accidentally added print statements
Zunawe Aug 3, 2023
9448908
Actually handle the intentionally-raised exceptions so full random YA…
LiquidCat64 Aug 4, 2023
254a9aa
BizHawkClient: Fix connector server not closing correctly
Zunawe Aug 4, 2023
5190ac3
BizHawkClient: Move some connector code around, some linting
Zunawe Aug 4, 2023
d56404c
BizHawkClient: Small cleanup in lua
Zunawe Aug 4, 2023
9e4e890
Fix shop access rule.
LiquidCat64 Aug 6, 2023
b4eec3c
Placeholder tutorial file + remove option checks from create_item.
LiquidCat64 Aug 6, 2023
03a8b49
I said...remove option checks from create_item!
LiquidCat64 Aug 6, 2023
b890090
More unittest compliance
LiquidCat64 Aug 6, 2023
22db64f
F it, remove the RoC shop entrance and the dumb rule specifically for…
LiquidCat64 Aug 6, 2023
973a07a
Delete Renon's shop from the active regions if shopsanity is off.
LiquidCat64 Aug 6, 2023
45a20a5
Attach stage positions to the location hint data.
LiquidCat64 Aug 7, 2023
4e1fa8b
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Aug 7, 2023
d57ed99
BizHawkClient: Lua linting
Zunawe Aug 10, 2023
0929b6c
BizHawkClient: Remove outdated sentences in docstrings
Zunawe Aug 10, 2023
cfcbf24
Cinematic and Fall Guard modes + (probably) final polishing for the v…
LiquidCat64 Aug 10, 2023
b0251e0
Ditch free shop option for now; it can make Renon fight required seed…
LiquidCat64 Aug 11, 2023
92bd09a
Merge remote-tracking branch 'upstream/main' into bh-client
Zunawe Aug 16, 2023
361c0b5
BizHawkClient: Correctly null check patch file arg
Zunawe Aug 16, 2023
55df7b0
BizHawkClient: Initialize logging
Zunawe Aug 16, 2023
faef0f5
Special2 hunt logic fix...& Multiworld!!!
LiquidCat64 Aug 17, 2023
460949f
GitHub, why'd you think I changed the capitalization in Client.py?
LiquidCat64 Aug 17, 2023
bd3afdc
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Aug 17, 2023
8732a05
Merge remote-tracking branch 'bh_fork/bh-client' into CV64
LiquidCat64 Aug 17, 2023
2277a20
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Aug 17, 2023
7f02017
Fix countdown decreasing with unrandomized pickups + S1 progression b…
LiquidCat64 Aug 22, 2023
76ba09f
In-game item/player names when sending and receiving items.
LiquidCat64 Sep 6, 2023
11da60a
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Sep 6, 2023
d6b5f5e
DeathLink
LiquidCat64 Sep 7, 2023
9bd0771
Permanent PowerUps option
LiquidCat64 Sep 8, 2023
36b3a02
Archipelago item icons for non-CV64 items.
LiquidCat64 Sep 14, 2023
d5877be
Ooops! Remove a bad import...for now.
LiquidCat64 Sep 14, 2023
ab81edb
Change client to use the _bizhawk apworld.
LiquidCat64 Sep 19, 2023
1ff892c
Make permanent PowerUps their own item + classify it and Healing Kits…
LiquidCat64 Sep 23, 2023
db22857
Working decompression/recompression with @Fluvian's LZKN64 utility!
LiquidCat64 Sep 23, 2023
6598f49
Compression
LiquidCat64 Sep 23, 2023
affc7e3
Increase the line limit on Renon's shop names juuuuuust a tad for the…
LiquidCat64 Sep 24, 2023
55b6b2d
Add Renon dialogue for the PermaUp.
LiquidCat64 Sep 24, 2023
b2d994b
Revamp how item model changing works to be more Countdown friendly.
LiquidCat64 Oct 3, 2023
a61d9bf
Merge branch 'main' of https://github.com/LiquidCat64/LiquidCatipelag…
LiquidCat64 Oct 3, 2023
8ca39e4
Add Ice Traps
LiquidCat64 Oct 13, 2023
e12bb61
Make start_inventory write directly into the ROM.
LiquidCat64 Oct 18, 2023
ffe76d1
Execution Gate check fix + Ice Trap fixes + make SFX music play with …
LiquidCat64 Oct 19, 2023
d0e2e03
Fix some Villa flag problems
LiquidCat64 Oct 25, 2023
e2ab625
Merge branch 'main' of https://github.com/LiquidCat64/LiquidCatipelag…
LiquidCat64 Nov 1, 2023
39378a6
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 16, 2023
3179e86
The big refactor of the century! Also, textbox colors, start stage ch…
LiquidCat64 Nov 17, 2023
eb50333
Yes, ap icons, you too!
LiquidCat64 Nov 17, 2023
ba24ed1
Rename Text.py to text.py
LiquidCat64 Nov 17, 2023
8f17b00
Rename the folder "Test" to "test"
LiquidCat64 Nov 17, 2023
197116c
Update and rename test_access.py to test_access.py
LiquidCat64 Nov 17, 2023
ea58813
Stop the events from getting into the location name groups.
LiquidCat64 Nov 17, 2023
24d7c97
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Nov 17, 2023
e532b79
Stop the REST of the events from getting into the location name groups.
LiquidCat64 Nov 17, 2023
ea356db
Import test.bases properly
LiquidCat64 Nov 17, 2023
79ae499
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 17, 2023
988e05e
Add the setting for the Hard Mode pool.
LiquidCat64 Nov 17, 2023
11b8891
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Nov 17, 2023
3ea69ee
Delete worlds/smw2yi directory
LiquidCat64 Nov 17, 2023
eaa186b
Some final touches.
LiquidCat64 Aug 17, 2022
6274b62
Merge remote-tracking branch 'cv64_fork/CV64' into CV64
LiquidCat64 Nov 17, 2023
b38ca90
Delete worlds/AutoBizHawkClient.py
LiquidCat64 Nov 17, 2023
cea2ace
Use the new settings api for ROM selection.
LiquidCat64 Nov 20, 2023
cd001bc
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Nov 24, 2023
368ebdd
Some suggested refinements
LiquidCat64 Nov 25, 2023
7138f24
Merge branch 'main' into CV64
LiquidCat64 Nov 25, 2023
25d457d
Merge branch 'main' into CV64
LiquidCat64 Nov 26, 2023
85fe10e
Merge branch 'main' into CV64
LiquidCat64 Nov 27, 2023
a83e4b7
A couple of very minor adjustments.
LiquidCat64 Nov 29, 2023
3e62a16
Renon easter egg for DLCQuest 1 coin-ers.
LiquidCat64 Nov 29, 2023
55da239
Merge branch 'main' into CV64
LiquidCat64 Nov 29, 2023
6261e22
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Dec 13, 2023
7d4c4e5
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 5, 2024
a9bfa49
Fix dropping the last sub-weapon which I somehow borked at some point.
LiquidCat64 Jan 6, 2024
f96ee6d
Merge remote-tracking branch 'catipelago/CV64' into CV64
LiquidCat64 Jan 6, 2024
9125faa
Fix harder not being able to pick up PowerUps while having 2.
LiquidCat64 Jan 6, 2024
af7d511
Fix spawning at CK main entrance not working + add more ice trap safe…
LiquidCat64 Jan 9, 2024
a01a648
Add LICENSE for the AP logo.
LiquidCat64 Jan 11, 2024
a5d7660
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 11, 2024
ed14c05
Merge branch 'main' into CV64
LiquidCat64 Jan 14, 2024
b0d238b
Fix the servant entrance candle counting towards the maze's countdown.
LiquidCat64 Jan 19, 2024
9c76ab3
Merge remote-tracking branch 'catipelago/CV64' into CV64
LiquidCat64 Jan 19, 2024
35d4b6d
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Jan 19, 2024
99a09b6
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Feb 1, 2024
d8feeea
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Feb 7, 2024
ef9d4bc
Fix bug when warping while receiving an item + hide the Countdown num…
LiquidCat64 Feb 11, 2024
fc03016
Merge remote-tracking branch 'catipelago/CV64' into CV64
LiquidCat64 Feb 11, 2024
683a0f2
Enable start_inventory_from_pool and fix starting money.
LiquidCat64 Feb 12, 2024
d94e622
Fix writing Item Linked items when that player is part of the group.
LiquidCat64 Feb 12, 2024
6693584
Make Renon's shop auto-hint un-bought progress items when leaving it …
LiquidCat64 Feb 13, 2024
c4d26f7
Countdown fixes, Reinhardt Actrise fix, receiving items fix, non-loca…
LiquidCat64 Feb 18, 2024
31e0654
Fix type hints for Python 3.8 and 3.9 unittests.
LiquidCat64 Feb 18, 2024
e994544
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Feb 18, 2024
86ca2d6
Clean up redundant arguments, turn some tuples back into lists, and o…
LiquidCat64 Feb 22, 2024
ebb3cba
Merge remote-tracking branch 'catipelago/CV64' into CV64
LiquidCat64 Feb 22, 2024
2510549
Better ROM verification
LiquidCat64 Feb 22, 2024
11b9b6c
Ooops, Python 3.8 doesn't like randbytes. Let's try this getrandbits …
LiquidCat64 Feb 22, 2024
a404af3
Fix pre_fill conditions not passing, make the client not request slot…
LiquidCat64 Feb 25, 2024
7282769
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Feb 28, 2024
58db236
Fix items spinning at the wrong speed/dropping at the incorrect heigh…
LiquidCat64 Feb 29, 2024
12dfe4b
Better outgoing DeathLink messages + incoming messages shown in-game.
LiquidCat64 Mar 1, 2024
d15d7d8
Add Big Toss, fix Renon prices, touch up the docs, address some nitpi…
LiquidCat64 Mar 7, 2024
6eb1fb8
Merge branch 'main' into CV64
LiquidCat64 Mar 7, 2024
a952bc1
Add to CODEOWNERS
LiquidCat64 Mar 7, 2024
003e3bd
Add obscure_checks.md and link to it in the Game Page.
LiquidCat64 Mar 8, 2024
0465d1a
Ooop, remove some :'s that I accidentally left.
LiquidCat64 Mar 8, 2024
ea88621
Logging warnings for invalid settings.
LiquidCat64 Mar 11, 2024
3255f31
Make the minimum Total Special1s 7 instead of 1.
LiquidCat64 Mar 11, 2024
c38c85a
Put the missing space in this link.
LiquidCat64 Mar 11, 2024
83ece32
Merge branch 'ArchipelagoMW:main' into CV64
LiquidCat64 Mar 11, 2024
09d9d34
Make the default percent Special2s required 80 instead of 100.
LiquidCat64 Mar 13, 2024
9ace1a4
Merge remote-tracking branch 'catipelago/CV64' into CV64
LiquidCat64 Mar 13, 2024
aecd145
Fix the unit test that was made around the old S2 percent.
LiquidCat64 Mar 13, 2024
15b18e2
Change the wording on the Countdown option because it's not "below" t…
LiquidCat64 Mar 13, 2024
cabc18b
Add comment clarifying the usage of class variables.
LiquidCat64 Mar 15, 2024
5c5f03c
Merge branch 'main' into CV64
LiquidCat64 Mar 15, 2024
7d0130c
Merge branch 'main' into CV64
LiquidCat64 Mar 16, 2024
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ Currently, the following games are supported:
* Landstalker: The Treasures of King Nole
* Final Fantasy Mystic Quest
* TUNIC
* Castlevania 64

For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
Expand Down
5 changes: 5 additions & 0 deletions inno_setup.iss
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,11 @@ Root: HKCR; Subkey: "{#MyAppName}pkmnepatch"; ValueData: "Ar
Root: HKCR; Subkey: "{#MyAppName}pkmnepatch\DefaultIcon"; ValueData: "{app}\ArchipelagoBizHawkClient.exe,0"; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}pkmnepatch\shell\open\command"; ValueData: """{app}\ArchipelagoBizHawkClient.exe"" ""%1"""; ValueType: string; ValueName: "";

Root: HKCR; Subkey: ".apcv64"; ValueData: "{#MyAppName}cv64patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}cv64patch"; ValueData: "Archipelago Castlevania 64 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}cv64patch\DefaultIcon"; ValueData: "{app}\ArchipelagoBizHawkClient.exe,0"; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}cv64patch\shell\open\command"; ValueData: """{app}\ArchipelagoBizHawkClient.exe"" ""%1"""; ValueType: string; ValueName: "";

Root: HKCR; Subkey: ".apladx"; ValueData: "{#MyAppName}ladxpatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}ladxpatch"; ValueData: "Archipelago Links Awakening DX Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}ladxpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoLinksAwakeningClient.exe,0"; ValueType: string; ValueName: "";
Expand Down
313 changes: 313 additions & 0 deletions worlds/cv64/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
import os
import typing
import settings
import base64

from BaseClasses import Item, Region, MultiWorld, Tutorial, ItemClassification
from .items import CV64Item, filler_item_names, get_item_info, get_item_names_to_ids, get_item_counts
from .locations import CV64Location, get_location_info, verify_locations, get_location_names_to_ids, base_id
from .entrances import verify_entrances, get_warp_entrances
from .options import CV64Options, CharacterStages, DraculasCondition, SubWeaponShuffle
from .stages import get_locations_from_stage, get_normal_stage_exits, vanilla_stage_order, \
shuffle_stages, generate_warps, get_region_names
from .regions import get_region_info
from .rules import CV64Rules
from .data import iname, rname, ename
from ..AutoWorld import WebWorld, World
from .aesthetics import randomize_lighting, shuffle_sub_weapons, rom_empty_breakables_flags, rom_sub_weapon_flags, \
randomize_music, get_start_inventory_data, get_location_data, randomize_shop_prices, get_loading_zone_bytes, \
get_countdown_numbers
from .rom import LocalRom, patch_rom, get_base_rom_path, CV64DeltaPatch
from .client import Castlevania64Client


class CV64Settings(settings.Group):
class RomFile(settings.UserFilePath):
"""File name of the CV64 US 1.0 rom"""
copy_to = "Castlevania (USA).z64"
description = "CV64 (US 1.0) ROM File"
md5s = [CV64DeltaPatch.hash]

rom_file: RomFile = RomFile(RomFile.copy_to)


class CV64Web(WebWorld):
theme = "stone"

tutorials = [Tutorial(
"Multiworld Setup Guide",
"A guide to setting up the Castlevania 64 randomizer connected to an Archipelago Multiworld.",
"English",
"setup_en.md",
"setup/en",
["Liquid Cat"]
)]


class CV64World(World):
"""
Castlevania for the Nintendo 64 is the first 3D game in the franchise. As either whip-wielding Belmont descendant
Reinhardt Schneider or powerful sorceress Carrie Fernandez, brave many terrifying traps and foes as you make your
way to Dracula's chamber and stop his rule of terror.
"""
game = "Castlevania 64"
item_name_groups = {
"Bomb": {iname.magical_nitro, iname.mandragora},
"Ingredient": {iname.magical_nitro, iname.mandragora},
}
location_name_groups = {stage: set(get_locations_from_stage(stage)) for stage in vanilla_stage_order}
options_dataclass = CV64Options
options: CV64Options
settings: typing.ClassVar[CV64Settings]
topology_present = True
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved
data_version = 1

item_name_to_id = get_item_names_to_ids()
location_name_to_id = get_location_names_to_ids()

active_stage_exits: typing.Dict[str, typing.Dict]
active_stage_list: typing.List[str]
active_warp_list: typing.List[str]
reinhardt_stages: bool
carrie_stages: bool
branching_stages: bool
starting_stage: str

total_s1s: int
s1s_per_warp: int
total_s2s: int
required_s2s: int
drac_condition: int

auth: bytearray

web = CV64Web()

@classmethod
def stage_assert_generate(cls, multiworld: MultiWorld) -> None:
rom_file = get_base_rom_path()
if not os.path.exists(rom_file):
raise FileNotFoundError(rom_file)

def generate_early(self) -> None:
# Generate the player's unique authentication
self.auth = bytearray(self.multiworld.random.getrandbits(8) for _ in range(16))

self.total_s1s = self.options.total_special1s.value
self.s1s_per_warp = self.options.special1s_per_warp.value
self.drac_condition = self.options.draculas_condition.value

# If there are more S1s needed to unlock the whole warp menu than there are S1s in total, drop S1s per warp to
# something manageable.
while self.s1s_per_warp * 7 > self.total_s1s:
self.s1s_per_warp -= 1
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved

# Set the total and required Special2s to 1 if the drac condition is the Crystal, to the specified YAML numbers
# if it's Specials, or to 0 if it's None or Bosses. The boss totals will be figured out later.
if self.drac_condition == DraculasCondition.option_crystal:
self.total_s2s = 1
self.required_s2s = 1
elif self.drac_condition == DraculasCondition.option_specials:
self.total_s2s = self.options.total_special2s.value
self.required_s2s = int(self.options.percent_special2s_required.value / 100 * self.total_s2s)
else:
self.total_s2s = 0
self.required_s2s = 0

# Enable/disable character stages and branching paths accordingly
self.reinhardt_stages = True
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved
self.carrie_stages = True
self.branching_stages = False

if self.options.character_stages == CharacterStages.option_reinhardt_only:
self.carrie_stages = False
elif self.options.character_stages == CharacterStages.option_carrie_only:
self.reinhardt_stages = False
elif self.options.character_stages == CharacterStages.option_both:
self.branching_stages = True

self.active_stage_exits = get_normal_stage_exits(self)

stage_1_blacklist = []

# Prevent Clock Tower from being Stage 1 if more than 4 S1s are needed to warp out of it.
if self.s1s_per_warp > 4 and not self.options.multi_hit_breakables:
stage_1_blacklist.append(rname.clock_tower)

# Shuffle the stages if the option is on.
if self.options.stage_shuffle:
self.active_stage_exits, self.starting_stage, self.active_stage_list = \
shuffle_stages(self, stage_1_blacklist)
else:
self.starting_stage = rname.forest_of_silence
self.active_stage_list = [stage for stage in vanilla_stage_order if stage in self.active_stage_exits]

# Create a list of warps from the active stage list. They are in a random order by default and will never
# include the starting stage.
self.active_warp_list = generate_warps(self)

def create_regions(self) -> None:
# Add the Menu Region.
reg_names = ["Menu"]
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved

# Add every stage Region by checking to see if that stage is active.
reg_names.extend([name for name in get_region_names(self.active_stage_exits)])

# Add the Renon's shop Region if shopsanity is on.
if self.options.shopsanity:
reg_names.append(rname.renon)

# Add the Dracula's chamber (the end) Region.
reg_names.append(rname.ck_drac_chamber)

# Set up the Regions correctly
self.multiworld.regions.extend([Region(name, self.player, self.multiworld) for name in reg_names])

# Add the warp Entrances to the Menu Region.
self.get_region("Menu").add_exits(get_warp_entrances(self.active_warp_list))

for reg_name in reg_names:

# Add the Locations to all the Regions.
loc_names = get_region_info(reg_name, "locations")
if loc_names is not None:
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved
verified_locs, events = verify_locations(self.options, loc_names)
self.get_region(reg_name).add_locations(verified_locs, CV64Location)

# Place event Items on all of their associated Locations.
for event_loc in events:
self.get_location(event_loc).place_locked_item(self.create_item(events[event_loc], "progression"))
# If we're looking at a boss kill trophy, increment the total S2s and, if we're not already at the
# set number of required bosses, the total required number. This way, we can prevent gen failures
# should the player set more bosses required than there are total.
if events[event_loc] == iname.trophy:
self.total_s2s += 1
if self.required_s2s < self.options.bosses_required.value:
self.required_s2s += 1
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved

# Add the Entrances to all the Regions
ent_names = get_region_info(reg_name, "entrances")
if ent_names is not None:
self.get_region(reg_name).add_exits(verify_entrances(self.options, ent_names, self.active_stage_exits))

def create_item(self, name: str, force_classification: typing.Optional[str] = None) -> Item:
if force_classification is not None:
classification = getattr(ItemClassification, force_classification)
else:
classification = getattr(ItemClassification, get_item_info(name, "default classification"))

code = get_item_info(name, "code")
if code is not None:
code += base_id

created_item = CV64Item(name, classification, code, self.player)

return created_item

def create_items(self) -> None:
item_counts = get_item_counts(self)

# Set up the items correctly
self.multiworld.itempool += [self.create_item(item, classification) for classification in item_counts for item
in item_counts[classification] for _ in range(item_counts[classification][item])]

def set_rules(self) -> None:
# Set all the Entrance rules properly.
CV64Rules(self).set_cv64_rules()

def pre_fill(self) -> None:
# If we need more Special1s to warp out of Sphere 1 than there are locations available, then AP's fill
# algorithm may try placing the Special1s anyway despite placing the stage's single key always being an option.
# To get around this problem in the fill algorithm, the keys will be forced early in these situations to ensure
# the algorithm will pick them over the Special1s.
if self.starting_stage == rname.tower_of_science:
if self.s1s_per_warp > 3:
self.multiworld.local_early_items[self.player][iname.science_key2] = 1
elif self.starting_stage == rname.clock_tower:
if (self.s1s_per_warp > 2 and not self.options.multi_hit_breakables) or \
(self.s1s_per_warp > 8 and self.options.multi_hit_breakables):
self.multiworld.local_early_items[self.player][iname.clocktower_key1] = 1
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved
elif self.starting_stage == rname.castle_wall:
LiquidCat64 marked this conversation as resolved.
Show resolved Hide resolved
if self.s1s_per_warp > 5 and not self.options.hard_logic and \
not self.options.multi_hit_breakables:
self.multiworld.local_early_items[self.player][iname.left_tower_key] = 1

def generate_output(self, output_directory: str) -> None:
active_locations = self.multiworld.get_locations(self.player)

# Location data and shop names, descriptions, and colors
offset_data, shop_name_list, shop_colors_list, shop_desc_list = \
get_location_data(self, active_locations)
# Shop prices
if self.options.shop_prices:
offset_data.update(randomize_shop_prices(self))
# Map lighting
if self.options.map_lighting:
offset_data.update(randomize_lighting(self))
# Sub-weapons
if self.options.sub_weapon_shuffle == SubWeaponShuffle.option_own_pool:
offset_data.update(shuffle_sub_weapons(self))
elif self.options.sub_weapon_shuffle == SubWeaponShuffle.option_anywhere:
offset_data.update(rom_sub_weapon_flags)
# Empty breakables
if self.options.empty_breakables:
offset_data.update(rom_empty_breakables_flags)
# Music
if self.options.background_music:
offset_data.update(randomize_music(self))
# Loading zones
offset_data.update(get_loading_zone_bytes(self.options, self.starting_stage, self.active_stage_exits))
# Countdown
if self.options.countdown:
offset_data.update(get_countdown_numbers(self.options, active_locations))
# Start Inventory
offset_data.update(get_start_inventory_data(self.player, self.options,
self.multiworld.precollected_items[self.player]))

cv64_rom = LocalRom(get_base_rom_path())

rompath = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.z64")

patch_rom(self, cv64_rom, offset_data, shop_name_list, shop_desc_list, shop_colors_list, active_locations)

cv64_rom.write_to_file(rompath)

patch = CV64DeltaPatch(os.path.splitext(rompath)[0] + CV64DeltaPatch.patch_file_ending, player=self.player,
player_name=self.multiworld.player_name[self.player], patched_path=rompath)
patch.write()
os.unlink(rompath)

def get_filler_item_name(self) -> str:
return self.random.choice(filler_item_names)

def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]):
# Attach each location's stage's position to its hint information if Stage Shuffle is on.
if self.options.stage_shuffle:
stage_pos_data = {}
for loc in list(self.multiworld.get_locations(self.player)):
stage = get_region_info(loc.parent_region.name, "stage")
if stage is not None and loc.address is not None:
num = str(self.active_stage_exits[stage]["position"]).zfill(2)
path = self.active_stage_exits[stage]["path"]
stage_pos_data[loc.address] = f"Stage {num}"
if path != " ":
stage_pos_data[loc.address] += path
hint_data[self.player] = stage_pos_data

def modify_multidata(self, multidata: typing.Dict[str, typing.Any]):
# Put the player's unique authentication in connect_names.
multidata["connect_names"][base64.b64encode(self.auth).decode("ascii")] = \
multidata["connect_names"][self.multiworld.player_name[self.player]]

def write_spoiler(self, spoiler_handle: typing.TextIO) -> None:
# Write the stage order to the spoiler log
spoiler_handle.write(f"\nCastlevania 64 stage & warp orders for {self.multiworld.player_name[self.player]}:\n")
for stage in self.active_stage_list:
num = str(self.active_stage_exits[stage]["position"]).zfill(2)
path = self.active_stage_exits[stage]["path"]
spoiler_handle.writelines(f"Stage {num}{path}:\t{stage}\n")

# Write the warp order to the spoiler log
spoiler_handle.writelines(f"\nStart :\t{self.active_stage_list[0]}\n")
for i in range(1, len(self.active_warp_list)):
spoiler_handle.writelines(f"Warp {i}:\t{self.active_warp_list[i]}\n")
Loading