Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
216 commits
Select commit Hold shift + click to select a range
38e563a
Added debug text to all instances of `setWinner()` function call
BramTeurlings Jan 14, 2026
ef33301
Added text that tells us if the player has won
BramTeurlings Jan 14, 2026
1613616
Added prefix for consistency
BramTeurlings Jan 14, 2026
4a806cd
Game now prints every card reward you get after combat
BramTeurlings Jan 20, 2026
6256d6b
Added todo for future reward types
BramTeurlings Jan 20, 2026
fc01f28
Added log for when a (mini-)boss is defeated.
BramTeurlings Jan 21, 2026
92a82be
Renamed "main" boss to "castle" boss for consistency
BramTeurlings Jan 21, 2026
22d2cbd
Moved reward logic to central location in `AdventurePlayer.java`
BramTeurlings Jan 21, 2026
46b68da
Logging rewards in world map notification
BramTeurlings Jan 21, 2026
3416213
Added customization for each duration in notification animation
BramTeurlings Jan 21, 2026
763e52f
Tracking tavern events in Map now
BramTeurlings Jan 22, 2026
e13f234
Completed events are now tracked, stored and loaded in/from save data
BramTeurlings Jan 22, 2026
8c264b4
Merge remote-tracking branch 'origin/feature/2/print_battle_rewards' …
BramTeurlings Jan 23, 2026
cfe83cf
Merge remote-tracking branch 'origin/feature/3-4/print-when-defeating…
BramTeurlings Jan 23, 2026
6d60fde
Merge remote-tracking branch 'origin/feature/5/track-tavern-events' i…
BramTeurlings Jan 23, 2026
6aac4b5
Merge remote-tracking branch 'origin/feature/8/print-messages-on-scre…
BramTeurlings Jan 23, 2026
818d401
Combining all other branches into one.
BramTeurlings Jan 23, 2026
6fd5e1a
(Mini-)bosses are now being tracked properly
BramTeurlings Jan 23, 2026
5b98ed7
Quest completion is now tracked
BramTeurlings Jan 24, 2026
678aeb9
Improved logging location
BramTeurlings Jan 24, 2026
60344cc
Removed todo statements
BramTeurlings Jan 25, 2026
4d3a11a
Merge pull request #1 from BramTeurlings/dev_archipelago
Melanie-RK Jan 25, 2026
b071c88
Implemented logic to restrict decks that contain card that are locked
BramTeurlings Jan 25, 2026
8b76e29
A bunch of comments and research where to find the card rendering code
BramTeurlings Jan 26, 2026
3311a05
Most overlay rendering works now
BramTeurlings Jan 26, 2026
1a209e2
Cleanup of todos and addition of new Utils class
BramTeurlings Jan 27, 2026
4c61557
Removed unused imports
BramTeurlings Jan 27, 2026
2e78916
First implementation of randomly unlocking a set
BramTeurlings Jan 29, 2026
dc03366
Fixed flipping cards having upside down locks that are misaligned ver…
BramTeurlings Jan 30, 2026
5e831c6
Fixed a bug where the game would crash if showing cards in combat
BramTeurlings Jan 30, 2026
b287a7b
Handled a potential crash when calling this function with a null card
BramTeurlings Jan 30, 2026
3e9b574
Fixed issue where lock would be drawn over listview cards in combat
BramTeurlings Feb 2, 2026
a9bcd3d
Setting up future features
BramTeurlings Feb 3, 2026
ec5afb6
First implementation region locking
BramTeurlings Feb 4, 2026
105cf3d
Regions are now unlocked if the player has the correponding rune
BramTeurlings Feb 4, 2026
56953f0
Cleanup of player rewards + add region unlock
BramTeurlings Feb 4, 2026
612e3fe
Merge pull request #2 from BramTeurlings/feature/12/restricted-card-v…
Melanie-RK Feb 5, 2026
41d5a7c
Added visual indicator when attempting to enter locked area
BramTeurlings Feb 6, 2026
4a1969c
Added real ways for players to unlock things in the game
BramTeurlings Feb 7, 2026
ae19335
First implementation of randomly unlocking a set
BramTeurlings Jan 29, 2026
01dc47f
Setting up future features
BramTeurlings Feb 3, 2026
e7cea9e
Merge remote-tracking branch 'origin/feature/12/restricted-card-visua…
BramTeurlings Feb 8, 2026
9f24414
Merge remote-tracking branch 'origin/feature/13/refactor-checks' into…
BramTeurlings Feb 8, 2026
f0a39fb
Rename biome to region for Archipelago purposes
BramTeurlings Feb 8, 2026
906a607
Cleanup of comments and names
BramTeurlings Feb 8, 2026
7fe2b55
Fixed locking starting deck accidentally
BramTeurlings Feb 8, 2026
f62b1a9
Multiple quests done in the same town now count towards progression
BramTeurlings Feb 8, 2026
9bb74a9
Change amount of new cards required for check to 80 from 130
BramTeurlings Feb 8, 2026
fe69c96
Fixed having nots sets available when starting a new game.
BramTeurlings Feb 8, 2026
0f6b5c7
Exploring how/where to make changes
BramTeurlings Feb 9, 2026
61682ea
More exploratory stuff
BramTeurlings Feb 9, 2026
5fb1a46
First working locked card filter
BramTeurlings Feb 10, 2026
c6e28bf
Removed AI slop, cleaned up
BramTeurlings Feb 10, 2026
635ad67
Removed some commented text
BramTeurlings Feb 10, 2026
24bf914
Removed some commented text
BramTeurlings Feb 10, 2026
9b0fba8
Merge pull request #5 from BramTeurlings/feature/15/locked-card-filte…
Melanie-RK Feb 11, 2026
9823222
feat: check whether a set is unlocked without returning true for inva…
Melanie-RK Feb 11, 2026
275be80
Set up a framework for opting into archipelago
BramTeurlings Feb 11, 2026
040d18c
feat: draw locks over booster packs if set is locked
Melanie-RK Feb 11, 2026
09ee294
fix: properly align locks
Melanie-RK Feb 11, 2026
7dc63d2
refactor: extract repeated code to method
Melanie-RK Feb 11, 2026
fb6fa6e
First addition of GUI button
BramTeurlings Feb 11, 2026
6f34e86
GUI added for ArchipelagoMode
BramTeurlings Feb 12, 2026
d50dbe8
Added translation, fixed cards being locked when archipelago is disabled
BramTeurlings Feb 13, 2026
97ac980
Cleanup + ArchipelagoMode enum + mode persistence
BramTeurlings Feb 16, 2026
e0f7495
Fixed portrait mode UI for new game
BramTeurlings Feb 16, 2026
8117652
chore: resolve PR comments
Melanie-RK Feb 18, 2026
386d75b
refactor: add null checks
Melanie-RK Feb 21, 2026
9a6caf3
Merge pull request #6 from BramTeurlings/feature/16/locked-booster-pa…
BramTeurlings Feb 21, 2026
2c57a15
Removed unnecessary todo
BramTeurlings Feb 22, 2026
acec0fb
Added an info button to the "Randomizer" option.
BramTeurlings Mar 4, 2026
013827e
Removed unused difficulty mode initializer.
BramTeurlings Mar 4, 2026
f23932e
Fixed typo
BramTeurlings Mar 8, 2026
4402402
Fixed some more typos and a little bit of balance
BramTeurlings Mar 8, 2026
ef5ffa1
Fixed typo
BramTeurlings Mar 11, 2026
3fd75ab
Merge pull request #7 from BramTeurlings/feature/opt-into-archipelago…
Melanie-RK Mar 11, 2026
507ff51
#27 Added a settings and tracker page for networked archipelago
Mar 17, 2026
4dad9e7
fix: only draw locks on booster packs when the randomizer is enabled
Melanie-RK Mar 19, 2026
e05f937
Merge pull request #8 from BramTeurlings/feature/28/no-locks-on-boost…
BramTeurlings Mar 29, 2026
29771eb
Resolved change requests
Apr 3, 2026
616a322
Edited ArchipelagoSettingsScene.java description
Apr 4, 2026
659a3ae
Added new lines to the new scene files
Apr 4, 2026
7037485
Added a check for win condition
BramTeurlings Apr 4, 2026
cfbf0ea
Made declaration of new UI more consistent with the resto the file.
BramTeurlings Apr 4, 2026
0566818
Fixed alignment of AP logo
BramTeurlings Apr 4, 2026
526231d
Merge pull request #9 from BramTeurlings/feature/27/ap-client-ui
BramTeurlings Apr 4, 2026
7b8ea37
Fixed formatting of mainBosses
BramTeurlings Apr 4, 2026
3c8d766
Merge pull request #10 from BramTeurlings/feature/23/add-win-condition
Melanie-RK Apr 5, 2026
876e9cc
feat: randomizer option does not appear when the plane is not Shandalar.
Melanie-RK Apr 8, 2026
ee7ded5
fix: removed todo
Melanie-RK Apr 8, 2026
6112a45
fix: made requested changes
Melanie-RK Apr 12, 2026
785c5b2
Added gold/shards/coins
BramTeurlings Apr 12, 2026
b994e9e
Reverted the 720p flip
BramTeurlings Apr 12, 2026
0a5e25d
Removed unused code
BramTeurlings Apr 12, 2026
313d0fb
Added some todo spots for locations
BramTeurlings Apr 12, 2026
f769ff4
Cleaned up ArchipelagoData.java and added comments
BramTeurlings Apr 12, 2026
33afc58
Formatting fix
BramTeurlings Apr 12, 2026
70e5906
Removed unnecessary todo
BramTeurlings Apr 12, 2026
918fd13
Added some todos
BramTeurlings Apr 12, 2026
6b04be9
Added some todos
BramTeurlings Apr 12, 2026
3260dc3
Merge pull request #11 from BramTeurlings/feature/21/always-use-Shand…
BramTeurlings Apr 15, 2026
aee4426
Added comments to state plan of attack
BramTeurlings Apr 29, 2026
f494f8e
Added comments to state plan of attack
BramTeurlings Apr 29, 2026
fc9bd48
Added randomizing of all equipment inside ArchipelagoData.java
BramTeurlings Apr 29, 2026
ff045f6
Expanded the item pool to all equipment available inside items.json
BramTeurlings Apr 30, 2026
2f11a37
Added a comment
BramTeurlings Apr 30, 2026
c61a042
Added shop randomization
BramTeurlings May 1, 2026
1d35d9c
Added randomized item rewards from combats
BramTeurlings May 2, 2026
f852b97
Only equipment items now get randomized off rewards.
BramTeurlings May 2, 2026
17db7d0
Some fixes.
BramTeurlings May 2, 2026
e6c763c
Tweaked the amount of shards rewarded.
BramTeurlings May 2, 2026
7714ea9
Merge branch 'dev_archipelago' into feature/31/add-unlocks-and-fix-ui
BramTeurlings May 2, 2026
33b3165
Fixed a crash on innistradt UI
BramTeurlings May 2, 2026
dfb8fc3
Removed debugging code
BramTeurlings May 2, 2026
4115954
Fixed logic for shop item randomization.
BramTeurlings May 2, 2026
e3aee60
Removed some old comments and code
BramTeurlings May 2, 2026
d8dce04
Merge pull request #12 from BramTeurlings/feature/31/add-unlocks-and-…
AlexaStrasza May 2, 2026
d751e4e
Added item costs for each equipment piece
BramTeurlings May 9, 2026
6427d80
Merge branch 'dev_archipelago' into feature/31/add-equipment-unlocks
BramTeurlings May 17, 2026
1893cf2
Removed some unused code
BramTeurlings May 17, 2026
0986a1c
Added lastArchipelagoRewardIndex getter
BramTeurlings May 17, 2026
aa07e89
Merge pull request #13 from BramTeurlings/feature/31/add-equipment-un…
Melanie-RK May 17, 2026
eae3e27
Added gold/shards/coins
BramTeurlings Apr 12, 2026
8c2b831
Progress on AP Client.
AlexaStrasza May 9, 2026
8f64583
Allowed receiving APItems, Built beginning structure of processing AP…
AlexaStrasza May 17, 2026
94a7349
Progress on receiving of items.
AlexaStrasza May 17, 2026
84a7316
Added setter for totalAmountOfSetUnlockChecks
BramTeurlings May 17, 2026
ab03619
Updated comment
BramTeurlings May 17, 2026
3ee1fb8
Split up ArchipelagoData.java into LocalRandomizer.java & Archipelago…
BramTeurlings May 22, 2026
e480ba7
Working changes
AlexaStrasza May 22, 2026
b56209b
Expanded item registry
AlexaStrasza May 22, 2026
efc5cfc
Split up town events and quests
BramTeurlings May 23, 2026
a1dbd31
Added Events/Quests/Fights per region
BramTeurlings May 23, 2026
7c14fe1
Reverted a bad decision
BramTeurlings May 23, 2026
5db41e5
Minibosses added
BramTeurlings May 24, 2026
7038f5e
Attempting to fix input
BramTeurlings May 24, 2026
59baa2a
Fixed controller jitter.
BramTeurlings May 25, 2026
5ace891
Cleanup of GameStage.java
BramTeurlings May 25, 2026
22777bd
Fixed wrong biome name "wastes" to "waste"
BramTeurlings May 25, 2026
30cf779
Edited world gen to ensure completable seeds
AlexaStrasza May 26, 2026
8079b6e
Fixed enemies.json inconsistencies and moved certain decks to miniboss
AlexaStrasza May 26, 2026
119b337
Added support for sending shop location checks and combat checks
AlexaStrasza Jun 8, 2026
1744dbc
Edited world gen to ensure completable seeds
AlexaStrasza May 26, 2026
3b553fe
Fixed enemies.json inconsistencies and moved certain decks to miniboss
AlexaStrasza May 26, 2026
7484121
Added support for sending shop location checks and combat checks
AlexaStrasza Jun 8, 2026
4f4cb3f
Fixed region detection when teleporting
BramTeurlings Jun 12, 2026
9a06d41
Reformatted ARCHIPELAGO_CHECK_TYPES
BramTeurlings Jun 14, 2026
31c958c
Merge remote-tracking branch 'origin/feature/24/ap-client-implementat…
AlexaStrasza Jun 14, 2026
11abdfe
Added support for minibosses and town events/quests
AlexaStrasza Jun 16, 2026
ce7baae
Small fix to disconnect the client when creating a new save
AlexaStrasza Jun 16, 2026
509fae1
PR review
AlexaStrasza Jun 18, 2026
02e223c
PR review pt2
AlexaStrasza Jun 18, 2026
9f13b22
Fixed or removed todos
BramTeurlings Jun 18, 2026
8cb64b0
Split up more between LocalRandomizer.java & ArchipelagoRandomizer.java
BramTeurlings Jun 18, 2026
b6e8747
Removed yet to be implemented listener
AlexaStrasza Jun 18, 2026
2a96009
Merge remote-tracking branch 'origin/feature/24/ap-client-implementat…
AlexaStrasza Jun 18, 2026
1ae06aa
Fixed unlocking sets only unlocking one
BramTeurlings Jun 18, 2026
e706be9
Oops, I have autocomplete sometimes
BramTeurlings Jun 18, 2026
49afbab
Merge pull request #14 from BramTeurlings/feature/24/ap-client-implem…
BramTeurlings Jun 18, 2026
1f39dae
Made all checks for local randomizer generate a fully random reward
BramTeurlings Jun 19, 2026
0003138
Region rewards are no longer generated once the pool is empty.
BramTeurlings Jun 19, 2026
becbdd1
Unlocking equipment out of the remaining pool is now also possible.
BramTeurlings Jun 19, 2026
0bfcc0e
Fixed wrong implementation of max life addition
BramTeurlings Jun 19, 2026
27b95a3
Updating the printlines and notifications
BramTeurlings Jun 19, 2026
5e7d527
Updated notification system
BramTeurlings Jun 20, 2026
63a7439
Fix crash on console
BramTeurlings Jun 21, 2026
9301454
Fixed POI transitions sometimes immediately kicking the player out up…
BramTeurlings Jun 21, 2026
920d749
Removed unused comment
BramTeurlings Jun 21, 2026
ccc9052
Implemented PrintJsonListener
AlexaStrasza Jun 25, 2026
8b662c3
Clarified the use of a function.
BramTeurlings Jun 28, 2026
6639863
Split up pack rewards into separate randomizer classes for optional l…
BramTeurlings Jun 28, 2026
446b861
Cleanup + Road detection improvement
BramTeurlings Jun 28, 2026
473edf8
Hid the AP button on overworld HUD
BramTeurlings Jun 30, 2026
58747a4
Merge pull request #15 from BramTeurlings/feature/local-randomizer-sw…
BramTeurlings Jun 30, 2026
f4921dc
Added support for castles required option
AlexaStrasza Jun 30, 2026
fd2cb64
Merge pull request #16 from BramTeurlings/feature/52/printjsonevent-l…
BramTeurlings Jun 30, 2026
b137698
Merge pull request #17 from BramTeurlings/feature/58/customizable-goal
BramTeurlings Jun 30, 2026
aa61379
Player now cannot leave the cave unless they have slotdata. Also, the…
BramTeurlings Jun 30, 2026
06bda7d
Implemented support for card rarity rewards
AlexaStrasza Jun 30, 2026
72ddfda
Fixed play movement when dialog is shown
BramTeurlings Jul 1, 2026
9ad2efe
Removing unused imports
BramTeurlings Jul 1, 2026
ec072ee
Trying to write a readme, not finished.
BramTeurlings Jul 1, 2026
d9a6ce4
Added comprehensive instructions in ARCHIPELAGO.md
BramTeurlings Jul 1, 2026
92edfc0
Merge pull request #18 from BramTeurlings/feature/57/stop-player-from…
BramTeurlings Jul 1, 2026
640cb1c
Fixed the game skipping reward loading if they aren't equipment.
BramTeurlings Jul 1, 2026
16b5f44
Merge pull request #19 from BramTeurlings/feature/60/fix-no-cards-in-…
BramTeurlings Jul 1, 2026
2f3003b
Fixed the game skipping reward loading if they aren't equipment.
BramTeurlings Jul 1, 2026
d8b8454
Merge pull request #20 from BramTeurlings/fixed-illegal-filename-in-w…
BramTeurlings Jul 1, 2026
5a86ce7
Merge pull request #21 from BramTeurlings/feature/59/card-rarity-loca…
BramTeurlings Jul 2, 2026
2592c77
Merge tag 'forge-2.0.13' into feature/rebase-on-base-main
BramTeurlings Jul 2, 2026
20e0d11
Moved non-castle bosses back to their minibosses folder so we can tel…
BramTeurlings Jul 2, 2026
8220cc6
Cleanup after merge
BramTeurlings Jul 2, 2026
4e661ef
Removed unused import
BramTeurlings Jul 2, 2026
0427175
Clarified win-condition
BramTeurlings Jul 2, 2026
095926c
Re-aligned the player's sprite position to the bottom (y) for road de…
BramTeurlings Jul 2, 2026
ba30d42
Made ci output more verbose
BramTeurlings Jul 2, 2026
1ae46f7
Added websocket dependency to pom
BramTeurlings Jul 2, 2026
b900731
Moved dependencies to the right spot
BramTeurlings Jul 2, 2026
0cf872c
Fixed colorless equipment shops not having a synchronized inventory
BramTeurlings Jul 2, 2026
fbcb0b8
Merge pull request #23 from BramTeurlings/dev_archipelago_rebased
BramTeurlings Jul 2, 2026
2d5f480
Preserved location states for shop items
AlexaStrasza Jul 3, 2026
a825af9
Fixed code that gives players more max life
BramTeurlings Jul 3, 2026
81511db
Merge pull request #24 from BramTeurlings/feature/69/preserve-already…
BramTeurlings Jul 3, 2026
eda1f71
Locationqueue is now persisted when saving/loading
BramTeurlings Jul 3, 2026
8a7e6d4
Removed todo
BramTeurlings Jul 3, 2026
2ce6014
Merge pull request #25 from BramTeurlings/feature/68/persist-location…
BramTeurlings Jul 3, 2026
bb478c7
Fixed oversight in enqueue logic with reconnects
BramTeurlings Jul 3, 2026
63d7a68
Disconnect the player and prevent receiving items when connecting to …
AlexaStrasza Jul 4, 2026
f5fdd81
Merge pull request #26 from BramTeurlings/feature/70/same-seed-check
BramTeurlings Jul 4, 2026
09facdd
Respects the gift pack setting now
AlexaStrasza Jul 4, 2026
1c9ee48
Merge pull request #27 from BramTeurlings/feature/71/gift-pack-setting
BramTeurlings Jul 4, 2026
ac7c238
Implemented gold multiplier
AlexaStrasza Jul 4, 2026
790a92c
Updated item registry with new equipment
AlexaStrasza Jul 5, 2026
3089a84
Merge pull request #28 from BramTeurlings/feature/72/gold-loot-multip…
BramTeurlings Jul 5, 2026
f962af4
Fixed small typo
BramTeurlings Jul 5, 2026
b905add
Cleanup for PR
BramTeurlings Jul 6, 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
85 changes: 85 additions & 0 deletions ARCHIPELAGO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
## Offline Randomizer

### 🎲 Randomized Adventure Mode
Play the Adventure mode on the Shandalar world but with randomized items & biomes. Unlock each region of the map as you progress.
- All cards outside your starting deck will be locked by default.
- Biomes, cards and equipment unlocks are randomized and can be unlocked by completing various objectives in the game such as:
- Collecting cards
- Completing quests
- Winning battles
- Competing at Inn events
- Defeating bosses and mini-bosses
- Equipment shop contents are fully randomized and (almost) any piece of equipment in game can show up.
- The Leather Boots in your starting equipment are removed regardless of difficulty, all entities' base speeds are increased to compensate.

## Archipelago Multiworld Randomizer
Archipelago is a cross-game modification system which randomizes different games, then uses the result to build a single
unified multi-player game. Items from one game may be present in another, and you will need your fellow players to find
items you need in their games to help you complete your own.

### 🏝️ Archipelago Adventure Mode
Play the Randomized Adventure Mode using Archipelago to shuffle all items and locations amongst a pool of other Archipelago compatible games.
<br/>Archipelago adds the following locations to the pool:
- Buying items from equipment & item shops
- Defeating a mini-boss
- Defeating a castle boss
- Winning a certain number of battles per region
- Completing a certain number of quests per region
- Finishing a certain number of inn events per region
- Collecting a certain number of cards per rarity

This Archipelago implementation adds the following rewards and filler rewards to the pool:
- Region unlocks in the form of "region runes", one per color of region
- Gold in various amounts
- Mana Shards in various amounts
- Bronze/Silver/Gold Challenge Coins
- Sets of cards including a free matching booster pack
- Max life in various amounts
- Pieces of equipment for the player to wear

This Archipelago implementation has the following win-conditions:
- Defeating X amount of Castle bosses, this defaults to 3 but when set to all 6, Emrakul must also be defeated in order to win.

#### Generating the Archipelago Multiworld
1. Download the [latest release](https://github.com/BramTeurlings/forge-archipelago/releases) of this repository
2. Download the [latest release](https://github.com/BramTeurlings/forge-APWorld/releases) of the Forge APWorld repository
3. Download the [latest release](https://github.com/ArchipelagoMW/Archipelago/releases) of the Archipelago Launcher
4. Install Card-Forge using the `forge-installer-<VERSION>.jar` file bundled in this repository's release files
5. Install the Archipelago Launcher by opening the `Setup.Archipelago.<VERSION>.exe` bundled in Archipelago Launcher release files
6. Open the Archipelago Launcher and click "Open" on the "Install APWorld" option.![img.png](docs/Adventure/Archipelago/archipelago_launcher_1.png)
7. When prompted, select the `forge.apworld` file downloaded from the Forge APWorld repository release files.
8. Once complete, restart the launcher.
9. Click "Open" on the "Options Creator" option.
10. Scroll down the list on the left side until you see "Forge" or "ForgeAP" and click on it.![img.png](docs/Adventure/Archipelago/archipelago_launcher_2.png)
11. Configure the options in the section marked in blue as you choose, if you're not sure what to change it is recommended you leave things on their default values.
12. Fill your name into the "Player Name" field.
13. Click on the "Export Options" to export your player profile as a `.yaml` file.
14. Gather the other player's `.yaml` files and place them into the same "Players" folder. In our example, the Archipelago Launcher put them in `C:\ProgramData\Archipelago\Players`.
15. Click on the "Generate" option.![img.png](docs/Adventure/Archipelago/archipelago_launcher_3.png)
16. If everything went well, the Archipelago Launcher will now have generated a `.zip` file for your Archipelago game. This file can be hosted via [Archipelago's Official Website](https://archipelago.gg/uploads) to start a lobby. Our `.zip` file was generated in `C:\ProgramData\Archipelago\output`.

#### Connecting the game client
17. Assuming you installed Card-Forge in step 4, open `forge-adventure.exe` from the location you installed Card-Forge in.
18. Select "Adventure Mode" on the main menu.![img.png](docs/Adventure/Archipelago/forge_adventure_1.png)
19. Select "New Game" on the Adventure Mode screen.![img.png](docs/Adventure/Archipelago/forge_adventure_2.png)
20. On the New Game screen, choose any settings you want but make sure to scroll down and select "Archipelago" as the "Randomizer" option.![img.png](docs/Adventure/Archipelago/forge_adventure_3.png)
21. Click on the "Start" button.
22. You will be brought to the game's opening scene, click through the tutorial quest with the Adept Black Wizard and walk through the port. The game will alert you that you need to connect to the Archipelago Server. Click the "Take me there" button.![img.png](docs/Adventure/Archipelago/forge_adventure_4.png)
23. Fill in the server host address, the server port and the slot name for your character and click on "Connect".![img.png](docs/Adventure/Archipelago/forge_adventure_5.png)
24. **Note: You must reconnect to Archipelago each time you load your save file or restart the software. You can find the connection page by opening the Adventure Mode menu on the overworld via the hamburger-menu icon or by pressing the `esc` key. Click on the Archipelago icon to open the connection menu. This button is only available in Archipelago Randomizer mode.**![img.png](docs/Adventure/Archipelago/forge_adventure_6.png)
25. You're all set to go! Enjoy playing the Archipelago!

**Extra: If you want the game to automatically download relevant card-artwork, open the Adventure Mode menu and click on "Settings", then scroll down until you see "Automatically Download Missing Card Art" and enable the option.**

## Cheating
In rare cases due to the nature of the game, it's possible to get stuck, either literally (like, in a wall or something) or other times due to difficulty.
I should note that the generation of the multiworld **should** ensure that you can't be progression locked by Archipelago but nevertheless, sometimes you might have a lot more fun if you just had that little bit of extra gold or that one card you need.

While cheating is obviously not in the spirit of the game, it can genuinely improve certain player's enjoyment so we leave the final call to you.
Here are some handy cheats that will help you progress and speed up your game. Note that each of these commands must be filled into the in-game console, you can open the console by pressing `F9`:
1. `give gold [amount]` > gives the specified amount of gold to the player.
2. `give shards [amount]` > gives the specified amount of shards to the player.
3. `give item cheat` > gives the player a completely busted piece of equipment that will auto-win almost any combat on the first turn, don't forget to equip it, you can un-equip it at any time.
4. `give boosters [set-code] [amount]` > gives the player the specified amount of packs of the specified set code. Set codes can be found online.
5. `heal full` > fully heals your character
6. `teleport to poi Spawn` > teleports you to the starting cave, handy if you ever get literally stuck. It's case sensitive so don't forget the capital "S".
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ Embark on a thrilling single-player journey where you can:
- Explore an overworld map.
- Challenge diverse AI opponents.
- Collect cards and items to boost your abilities.
- Archipelago Multiworld compatibility

<img width="1282" height="752" alt="Shandalar World" src="https://github.com/user-attachments/assets/9af31471-d688-442f-9418-9807d8635b72" />

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/Adventure/Archipelago/forge_adventure_6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/_sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@
- [Fantasy Blocks](fantasy-blocks.md)

- [Missing Cards in Forge](Missing-Cards-in-Forge.md)
- [Un‐cards, Playtest Cards, and Other Funny Cards](Uncards,-Playtest-Cards,-and-Other-Funny-Cards.md)
- [Un‐cards, Playtest Cards, and Other Funny Cards](Un-cards,-Playtest-Cards,-and-Other-Funny-Cards.md)

- [Credit & Thanks](Credit-and-Thanks.md)
9 changes: 9 additions & 0 deletions forge-core/src/main/java/forge/item/PaperCard.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
private transient String displayName;
private transient String sortableName;
private transient boolean hasFlavorName;
private transient boolean isLocked;

@Override
public String getName() {
Expand Down Expand Up @@ -534,6 +535,14 @@ public List<ICardFace> getAllFaces() {
return this.rules.getAllFaces().stream().map(this::getVariantForFace).collect(Collectors.toList());
}

public boolean isLocked() {
return isLocked;
}

public void setLocked(boolean locked) {
isLocked = locked;
}

private ICardFace getVariantForFace(ICardFace face) {
if(!face.hasFunctionalVariants() || this.functionalVariant.equals(NO_FUNCTIONAL_VARIANT))
return face;
Expand Down
10 changes: 10 additions & 0 deletions forge-gui-android/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,16 @@
<finalName>forge-android-${snapshot-version}</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>org.robolectric</groupId>
<artifactId>android-all</artifactId>
Expand Down
5 changes: 5 additions & 0 deletions forge-gui-mobile/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.archipelagomw</groupId>
<artifactId>Java-Client</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>

</project>
74 changes: 74 additions & 0 deletions forge-gui-mobile/src/forge/adventure/archipelago/Archipelago.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package forge.adventure.archipelago;

import com.github.tommyettinger.textra.TypingLabel;
import io.github.archipelagomw.ClientStatus;

import java.net.URISyntaxException;
import java.util.*;

public class Archipelago {
private final Random random = new Random();

public static Archipelago instance = null;

static private ArchipelagoClient APClient;

public Archipelago() {
instance = this;
}

public static Archipelago getInstance() {
return instance == null ? instance = new Archipelago() : instance;
}

public void connect(String ip, String port, String slotName, String password, TypingLabel connectStatusLabel) {
if (APClient != null && APClient.isConnected()) APClient.disconnect();

APClient = new ArchipelagoClient(connectStatusLabel);
APClient.setName(slotName);
APClient.setPassword(password);

String address = ip;
if (port != null && !port.isEmpty() && !address.contains(":")) address += ":" + port;

try {
APClient.connect(address);
} catch (URISyntaxException e) {
connectStatusLabel.setText("");
connectStatusLabel.setText("{FADE=RED;RED;0.1}Invalid IP");
}
}

public void disconnect() {
if (APClient != null && APClient.isConnected()) APClient.disconnect();
}

public boolean isConnected() {
return APClient != null && APClient.isConnected();
}

public void checkLocation(Long id) {
if (APClient == null || !APClient.isConnected() || !APClient.checkLocation(id)) {
ArchipelagoRandomizer.getInstance().locationQueue.add(id);
}
}

public boolean checkLocations(List<Long> ids) {
return APClient.checkLocations(ids);
}

public void goal() {
APClient.setGameState(ClientStatus.CLIENT_GOAL);
}

public int getRandomItemPrice() {
int min = 500;
int max = 1000;
SlotData slotData = APClient.getSlotData();
if (slotData != null) {
min = slotData.MinShopPrice;
max = slotData.MaxShopPrice;
}
return random.nextInt(min, max + 1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package forge.adventure.archipelago;

public enum ArchipelagoCheckTypes {
COLORLESS_BATTLE_WON, WHITE_BATTLE_WON, BLUE_BATTLE_WON, BLACK_BATTLE_WON, RED_BATTLE_WON, GREEN_BATTLE_WON,
COLORLESS_TOWN_QUESTS, WHITE_TOWN_QUESTS, BLUE_TOWN_QUESTS, BLACK_TOWN_QUESTS, RED_TOWN_QUESTS, GREEN_TOWN_QUESTS,
COLORLESS_TOWN_EVENTS, WHITE_TOWN_EVENTS, BLUE_TOWN_EVENTS, BLACK_TOWN_EVENTS, RED_TOWN_EVENTS, GREEN_TOWN_EVENTS,
TOTAL_CARDS_EARNED,
SLIME_MOTHER_DEFEATED, SLOBAD_DEFEATED, XIRA_DEFEATED, NAHIRI_DEFEATED, VALYX_DEFEATED, JACE_DEFEATED, KIORA_DEFEATED, MYR_SUPERION_DEFEATED, SLIVER_QUEEN_DEFEATED, TEFERI_DEFEATED, GROLNOK_DEFEATED, GUARDIAN_ANGEL_DEFEATED,
LILIANA_DEFEATED, SLIMEFOOT_DEFEATED, SORIN_DEFEATED, CHANDRA_DEFEATED, TIBALTS_TORTURER_DEFEATED, TIBALT_DEFEATED, ZEDRUUS_COOK_DEFEATED, CONJURER_DEFEATED, ZEDRUU_DEFEATED, GARRUK_DEFEATED, HYDRA_OF_SHANDALAAR_DEFEATED, SCARECROW_CAPTAIN_DEFEATED,
BOSS_WHITE_DEFEATED, BOSS_BLUE_DEFEATED, BOSS_BLACK_DEFEATED, BOSS_RED_DEFEATED, BOSS_GREEN_DEFEATED, BOSS_COLORLESS_DEFEATED,
WIN_CONDITION_CLEARED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package forge.adventure.archipelago;

import com.github.tommyettinger.textra.TypingLabel;
import forge.adventure.archipelago.events.*;
import io.github.archipelagomw.Client;
import io.github.archipelagomw.flags.ItemsHandling;

import javax.annotation.Nullable;

public class ArchipelagoClient extends Client {

@Nullable
public SlotData slotData;

public ArchipelagoClient(TypingLabel connectStatusLabel) {
super();

this.setGame("ForgeAP");
this.setItemsHandlingFlags(ItemsHandling.SEND_ITEMS | ItemsHandling.SEND_OWN_ITEMS | ItemsHandling.SEND_STARTING_INVENTORY);
this.getEventManager().registerListener(new ConnectResult(this, connectStatusLabel));
this.getEventManager().registerListener(new ReceiveItem());
this.getEventManager().registerListener(new LocationInfo(this));
this.getEventManager().registerListener(new OnDeathLink(this));
this.getEventManager().registerListener(new PrintJsonListener(this));
}

public void setSlotData(SlotData slotData) {
this.slotData = slotData;
}

@Nullable
public SlotData getSlotData() {
return slotData;
}

@Override
public void onError(Exception ex) {
ex.getLocalizedMessage();
}

@Override
public void onClose(String s, int i) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package forge.adventure.archipelago;

public class ArchipelagoColors {
public static final String Cyan = "{COLOR=#00CCCC}";
public static final String Plum = "{COLOR=#AF99EF}";
public static final String SlateBlue = "{COLOR=#6D8BE8}";
public static final String Salmon = "{COLOR=#FA8072}";
public static final String Green = "{COLOR=#00b359}";
public static final String Magenta = "{COLOR=#EE00EE}";
}
Loading