mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-23 11:03:20 -07:00
Merge branch 'main' of https://github.com/spinerak/ArchipelagoYachtDice
This commit is contained in:
@@ -111,4 +111,4 @@ item_groups = {
|
||||
"Category Five Distinct Dice",
|
||||
"Category 4&5 Full House"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,8 +42,8 @@ def ini_locations(goal_score, max_score, num_locs, dif):
|
||||
hiscore = 0
|
||||
for i in range(num_locs - 1):
|
||||
perc = (i/num_locs)
|
||||
curscore = int( 1 + (perc ** scaling) * (max_score-2) )
|
||||
if(curscore <= hiscore):
|
||||
curscore = int(1 + (perc ** scaling) * (max_score-2))
|
||||
if curscore <= hiscore:
|
||||
curscore = hiscore + 1
|
||||
hiscore = curscore
|
||||
scores += [curscore]
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from Options import Choice, Range, PerGameCommonOptions
|
||||
from dataclasses import dataclass
|
||||
|
||||
class gameDifficulty(Choice):
|
||||
class GameDifficulty(Choice):
|
||||
"""
|
||||
Difficulty. This setting determines how difficult the scores are to achieve.
|
||||
Difficulty. This option determines how difficult the scores are to achieve.
|
||||
Easy: for beginners. No luck required, just roll the dice and have fun. Lower final goal.
|
||||
Medium: intended difficulty. If you play smart, you will finish the game without any trouble.
|
||||
Hard: you will need to play smart and be lucky.
|
||||
@@ -29,7 +29,7 @@ class scoreForLastCheck(Range):
|
||||
|
||||
class scoreForGoal(Range):
|
||||
"""
|
||||
This setting determines what score you need to reach to finish the game.
|
||||
This option determines what score you need to reach to finish the game.
|
||||
It cannot be higher than the score for the last check (if it is, it is changed automatically).
|
||||
"""
|
||||
display_name = "Score for goal"
|
||||
@@ -56,7 +56,7 @@ class numberDiceFragmentsPerDice(Range):
|
||||
"""
|
||||
Dice can be split into fragments, gathering enough will give you an extra dice.
|
||||
You start with one dice, and there will always be one full dice in the pool.
|
||||
The other dice are split into fragments, according to this setting.
|
||||
The other dice are split into fragments, according to this option.
|
||||
Setting this to 1 fragment per dice just puts "Dice" objects in the pool.
|
||||
"""
|
||||
display_name = "Number of dice fragments per dice"
|
||||
@@ -68,7 +68,7 @@ class numberRollFragmentsPerRoll(Range):
|
||||
"""
|
||||
Rolls can be split into fragments, gathering enough will give you an extra roll.
|
||||
You start with one roll, and there will always be one full roll in the pool.
|
||||
The other three rolls are split into fragments, according to this setting.
|
||||
The other three rolls are split into fragments, according to this option.
|
||||
Setting this to 1 fragment per roll just puts "Roll" objects in the pool.
|
||||
"""
|
||||
display_name = "Number of roll fragments per roll"
|
||||
@@ -94,7 +94,7 @@ class alternativeCategories(Range):
|
||||
class chanceOfDice(Range):
|
||||
"""
|
||||
The item pool is always filled in such a way that you can reach a score of 1000.
|
||||
Extra progressive items are added that will help you on your quest.
|
||||
Extra progression items are added that will help you on your quest.
|
||||
You can set the weight for each extra progressive item in the following options.
|
||||
|
||||
Of course, more dice = more points!
|
||||
@@ -125,7 +125,7 @@ class chanceOfFixedScoreMultiplier(Range):
|
||||
class chanceOfStepScoreMultiplier(Range):
|
||||
"""
|
||||
The Step Score Multiplier boosts your multiplier after every roll by 1%, and resets on sheet reset.
|
||||
So, keep high scoring categories for later to get the most of them.
|
||||
So, keep high scoring categories for later to get the most out of them.
|
||||
By default, this item is not included. It is fun however, you just need to know the above strategy.
|
||||
"""
|
||||
display_name = "Weight of adding Step Score Multiplier"
|
||||
@@ -155,7 +155,7 @@ class chanceOfPoints(Range):
|
||||
class pointsSize(Choice):
|
||||
"""
|
||||
If you choose to add points to the item pool, do you prefer many small points,
|
||||
medium size, a few larger points, or a mix of them?
|
||||
medium-size points, a few larger points, or a mix of them?
|
||||
"""
|
||||
display_name = "Size of points"
|
||||
option_small = 1
|
||||
@@ -200,7 +200,7 @@ class addStoryChapters(Choice):
|
||||
|
||||
all_of_it: fill all locations with story chapters
|
||||
sure: if there is space left, put in 10 story chapters.
|
||||
never: do not put any story chapters, I do not like reading (but I am glad you are reading THIS!)
|
||||
never: do not put any story chapters in, I do not like reading (but I am glad you are reading THIS!)
|
||||
"""
|
||||
display_name = "Extra story chapters in the pool"
|
||||
option_all_of_it = 1
|
||||
@@ -229,8 +229,8 @@ class whichStory(Choice):
|
||||
class allowManual(Choice):
|
||||
"""
|
||||
Yacht Dice allows players to roll IRL dice.
|
||||
By sending "manual" in the chat, a input field appears where you can type your dice rolls.
|
||||
Of course we cannot check anymore if the player is playing fair.
|
||||
By sending "manual" in the chat, an input field appears where you can type your dice rolls.
|
||||
Of course, we cannot check anymore if the player is playing fair.
|
||||
Do you want to allow manual input of rolls?
|
||||
"""
|
||||
display_name = "Allow manual inputs"
|
||||
@@ -264,4 +264,5 @@ class YachtDiceOptions(PerGameCommonOptions):
|
||||
add_story_chapters: addStoryChapters
|
||||
which_story: whichStory
|
||||
|
||||
allow_manual_input: allowManual
|
||||
allow_manual_input: allowManual
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from ..generic.Rules import set_rule
|
||||
from worlds.generic.Rules import set_rule
|
||||
from BaseClasses import MultiWorld
|
||||
from .YachtWeights import yacht_weights
|
||||
import math
|
||||
@@ -129,7 +129,7 @@ def dice_simulation_strings(categories, num_dice, num_rolls, fixed_mult, step_mu
|
||||
categories.sort(key=lambda category: category.mean_score(num_dice, num_rolls))
|
||||
|
||||
#function to add two discrete distribution.
|
||||
#defaultdict is a dict where you don't need to check if a id is present, you can just use += (lot faster)
|
||||
#defaultdict is a dict where you don't need to check if an id is present, you can just use += (lot faster)
|
||||
def add_distributions(dist1, dist2):
|
||||
combined_dist = defaultdict(float)
|
||||
for val1, prob1 in dist1.items():
|
||||
@@ -232,4 +232,5 @@ def set_yacht_rules(world: MultiWorld, player: int, options):
|
||||
|
||||
# Sets rules on completion condition
|
||||
def set_yacht_completion_rules(world: MultiWorld, player: int):
|
||||
world.completion_condition[player] = lambda state: state.has("Victory", player)
|
||||
world.completion_condition[player] = lambda state: state.has("Victory", player)
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import math
|
||||
import logging
|
||||
|
||||
from BaseClasses import Region, Entrance, Item, Tutorial, CollectionState
|
||||
from .Items import YachtDiceItem, item_table, item_groups
|
||||
from .Locations import YachtDiceLocation, all_locations, ini_locations
|
||||
from .Options import YachtDiceOptions
|
||||
from .Rules import set_yacht_rules, set_yacht_completion_rules, dice_simulation
|
||||
from ..AutoWorld import World, WebWorld
|
||||
from world.AutoWorld import World, WebWorld
|
||||
|
||||
|
||||
class YachtDiceWeb(WebWorld):
|
||||
@@ -20,6 +19,7 @@ class YachtDiceWeb(WebWorld):
|
||||
["Spineraks"]
|
||||
)]
|
||||
|
||||
|
||||
class YachtDiceWorld(World):
|
||||
"""
|
||||
Yacht Dice is a straightforward game, custom-made for Archipelago,
|
||||
@@ -51,7 +51,7 @@ class YachtDiceWorld(World):
|
||||
"race": self.multiworld.is_race,
|
||||
}
|
||||
|
||||
#In generate early, we fill the item-pool, then determine the number of locations, and add filler items.
|
||||
# In generate early, we fill the item-pool, then determine the number of locations, and add filler items.
|
||||
def generate_early(self):
|
||||
self.itempool = []
|
||||
self.precollected = []
|
||||
@@ -120,7 +120,7 @@ class YachtDiceWorld(World):
|
||||
|
||||
#if one fragment per dice, just add "Dice" objects
|
||||
if frags_per_dice == 1:
|
||||
self.itempool += ["Dice"] * (num_of_dice-1) #minus one because one is in start inventory
|
||||
self.itempool += ["Dice"] * (num_of_dice-1) # minus one because one is in start inventory
|
||||
else:
|
||||
self.itempool += ["Dice"] #always add a full dice to make generation easier (will be early)
|
||||
self.itempool += ["Dice Fragment"] * (frags_per_dice * (num_of_dice-2))
|
||||
@@ -199,7 +199,7 @@ class YachtDiceWorld(World):
|
||||
weights[5] = 1
|
||||
|
||||
#Next, add the appropriate item. We'll slightly alter weights to avoid too many of the same item
|
||||
which_item_to_add = self.multiworld.random.choices([0,1,2,3,4,5], weights = weights)[0]
|
||||
which_item_to_add = self.multiworld.random.choices([0, 1, 2, 3, 4, 5], weights = weights)[0]
|
||||
if which_item_to_add == 0:
|
||||
if frags_per_dice == 1:
|
||||
self.itempool += ["Dice"]
|
||||
@@ -240,11 +240,11 @@ class YachtDiceWorld(World):
|
||||
self.itempool += ["1 Point"]
|
||||
extra_points_added += 1
|
||||
weights[5] /= 1.01
|
||||
elif c==1:
|
||||
elif c == 1:
|
||||
self.itempool += ["10 Points"]
|
||||
extra_points_added += 10
|
||||
weights[5] /= 1.1
|
||||
elif c==2:
|
||||
elif c == 2:
|
||||
self.itempool += ["100 Points"]
|
||||
extra_points_added += 100
|
||||
weights[5] /= 2
|
||||
@@ -256,11 +256,11 @@ class YachtDiceWorld(World):
|
||||
#count the number of locations in the game.
|
||||
already_items = len(self.itempool) + self.extra_plando_items + 1 #+1 because of Victory item
|
||||
|
||||
#We need to add more filler/useful items if there are many items in the pool to guarantee succesful generation
|
||||
#We need to add more filler/useful items if there are many items in the pool to guarantee successful generation
|
||||
extra_locations_needed += (already_items - 45) // 15
|
||||
self.number_of_locations = already_items + extra_locations_needed
|
||||
|
||||
# From here, we will count the number of items in the self.itempool, and add usuful/filler items to the pool,
|
||||
# From here, we will count the number of items in the self.itempool, and add useful/filler items to the pool,
|
||||
# making sure not to exceed the number of locations.
|
||||
|
||||
#first, we flood the entire pool with extra points (useful), if that setting is chosen.
|
||||
@@ -283,7 +283,7 @@ class YachtDiceWorld(World):
|
||||
#add some story chapters (filler)
|
||||
if self.options.add_story_chapters.value == 2: #add extra points if wanted
|
||||
already_items = len(self.itempool) + self.extra_plando_items + 1
|
||||
if(self.number_of_locations - already_items >= 10):
|
||||
if self.number_of_locations - already_items >= 10:
|
||||
self.itempool += ["Story Chapter"] * 10
|
||||
|
||||
#add some more extra points if there is still room
|
||||
@@ -315,7 +315,7 @@ class YachtDiceWorld(World):
|
||||
already_items = len(self.itempool) + self.extra_plando_items + 1
|
||||
if already_items != self.number_of_locations:
|
||||
raise Exception(f"[Yacht Dice] Number in self.itempool is not number of locations "
|
||||
f"{already_items} {self.number_of_locations}.")
|
||||
f"{already_items} {self.number_of_locations}.")
|
||||
|
||||
#add precollected items using push_precollected. Items in self.itempool get created in create_items
|
||||
for item in self.precollected:
|
||||
@@ -331,7 +331,7 @@ class YachtDiceWorld(World):
|
||||
def create_regions(self):
|
||||
#call the ini_locations function, that generates locations based on the inputs.
|
||||
location_table, goal_index = ini_locations(self.goal_score, self.max_score, self.number_of_locations,
|
||||
self.options.game_difficulty.value)
|
||||
self.options.game_difficulty.value)
|
||||
|
||||
#simple menu-board construction
|
||||
menu = Region("Menu", self.player, self.multiworld)
|
||||
@@ -339,7 +339,7 @@ class YachtDiceWorld(World):
|
||||
|
||||
#add locations to board, one for every location in the location_table
|
||||
board.locations = [YachtDiceLocation(self.player, loc_name, loc_data.score, loc_data.id, board)
|
||||
for loc_name, loc_data in location_table.items() if loc_data.region == board.name]
|
||||
for loc_name, loc_data in location_table.items() if loc_data.region == board.name]
|
||||
|
||||
#which index of all locations should have the Victory item.
|
||||
|
||||
|
||||
@@ -11,5 +11,5 @@ When you receive an item, it could be extra dice, extra rolls, score multipliers
|
||||
## Winning the Game
|
||||
Victory in Yacht Dice is all about reaching the target score. You can set your own target score, which is displayed on the website. Once you hit it, you've conquered the game!
|
||||
|
||||
## How to Access Settings
|
||||
Need to tweak your game? Head over to the [player settings page](../player-settings) for all your configuration options and to export your config file.
|
||||
## How to Access Options
|
||||
Need to tweak your game? Head over to the [player options page](../player-options) for all your configuration options and to export your config file.
|
||||
|
||||
@@ -14,8 +14,8 @@ Both options have an "offline" play option to try out the game without having to
|
||||
|
||||
## Play with Archipelago
|
||||
|
||||
- Create your yaml file via the [Yacht Dice Player Settings Page](/games/YachtDice/player-settings).
|
||||
- After generating, open the Yacht Dice website. After the tutoroll, fill in the room-information.
|
||||
- Create your yaml file via the [Yacht Dice Player Options Page](../player-options).
|
||||
- After generating, open the Yacht Dice website. After the tutoroll, fill in the room information.
|
||||
- After logging in, you are good to go. The website has a built-in client, where you can chat and send commands.
|
||||
|
||||
For more information on yaml files, generating Archipelago games and connecting to servers, please see the [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en).
|
||||
For more information on yaml files, generating Archipelago games, and connecting to servers, please see the [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en).
|
||||
|
||||
Reference in New Issue
Block a user