Files
dockipelago/worlds/papermario/modules/random_actor_stats.py
Jonathan Tinney 7971961166
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
add schedule I, sonic 1/frontiers/heroes, spirit island
2026-04-02 23:46:36 -07:00

87 lines
3.3 KiB
Python

# from https://github.com/icebound777/PMR-SeedGenerator/blob/main/rando_modules/random_actor_stats.py
from ..data.actor_data import actor_attr_table, actor_param_table, get_actor_attr_key
from ..options import EnemyDifficulty
def get_shuffled_chapter_difficulty(
enemy_difficulty: int,
starting_chapter: int,
random
):
# Load and reorganize actor param data into different format
# format example:
# "00_Goomba": {
# "Level": [5,8,10,13,15,18,20,23],
# "HP": [2,3,4,5,6,7,8],
# "DamageA": [1,2,2,3,3,4,4,5]
# "NativeChapter": 1
# }
all_enemy_stats = {}
shuffle_chapter_difficulty = (enemy_difficulty == EnemyDifficulty.option_Shuffle_Chapter_Difficulty)
progressive_scaling = (enemy_difficulty == EnemyDifficulty.option_Progressive_Scaling)
for param_key, param_value in actor_param_table.items():
actor_name = param_value[0]
actor_native_chapter = param_value[3]
actor_stat_name = param_value[1]
actor_stat_values = [
param_value[4],
param_value[5],
param_value[6],
param_value[7],
param_value[8],
param_value[9],
param_value[10],
param_value[11],
]
if actor_name not in all_enemy_stats:
all_enemy_stats[actor_name] = {}
all_enemy_stats[actor_name]["NativeChapter"] = actor_native_chapter
all_enemy_stats[actor_name][actor_stat_name] = actor_stat_values
# Randomize chapter order
chapters_to_shuffle = [1, 2, 3, 4, 5, 6, 7]
if shuffle_chapter_difficulty:
random.shuffle(chapters_to_shuffle)
chapter_dict = {}
for old_chapter_number, new_chapter_number in enumerate(chapters_to_shuffle):
chapter_dict[old_chapter_number + 1] = new_chapter_number
# Chapter 8 is never shuffled
chapter_dict[8] = 8
if starting_chapter != 0 and chapter_dict[starting_chapter] > 3:
# Chapter we are starting in is too high of a level: adjust it
original_chapters = list(chapter_dict.keys())
random.shuffle(original_chapters)
for original_chapter in original_chapters:
if chapter_dict[original_chapter] <= 3:
swap_chapter = chapter_dict[starting_chapter]
chapter_dict[starting_chapter] = chapter_dict[original_chapter]
chapter_dict[original_chapter] = swap_chapter
break
new_enemy_stats = []
for attr_id, attr_value in actor_attr_table.items():
dbkey = get_actor_attr_key(attr_id)
actor_name = attr_value[3]
actor_stat_name = attr_value[4]
if (actor_name not in all_enemy_stats
or actor_stat_name not in all_enemy_stats[actor_name]
or (not progressive_scaling and not shuffle_chapter_difficulty)):
# not supposed to be random, so write defaults
value = attr_value[5]
else:
native_chapter = all_enemy_stats[actor_name]["NativeChapter"]
if native_chapter == -1:
# Special case for Dojo / Kent
native_chapter = 1
value = int(all_enemy_stats[actor_name][actor_stat_name][chapter_dict.get(native_chapter) - 1])
new_enemy_stats.append((dbkey, value))
return new_enemy_stats, chapter_dict