Files
dockipelago/worlds/k64/items.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

157 lines
5.1 KiB
Python

from BaseClasses import Item
import typing
from .names import ItemName
class ItemData(typing.NamedTuple):
code: typing.Optional[int]
progression: bool
skip_balancing: bool = False
trap: bool = False
class K64Item(Item):
game = "Kirby 64 - The Crystal Shards"
copy_ability_table = {
ItemName.burn: ItemData(0x0001, True),
ItemName.stone: ItemData(0x0002, True),
ItemName.ice: ItemData(0x0003, True),
ItemName.needle: ItemData(0x0004, True),
ItemName.bomb: ItemData(0x0005, True),
ItemName.spark: ItemData(0x0006, True),
ItemName.cutter: ItemData(0x0007, True)
}
friend_table = {
ItemName.waddle_dee: ItemData(0x0100, True),
ItemName.adeleine: ItemData(0x0101, True),
ItemName.king_dedede: ItemData(0x0102, True),
}
power_combo_table = {
ItemName.burn_burn: ItemData(0x0200, True),
ItemName.burn_stone: ItemData(0x0201, True),
ItemName.burn_ice: ItemData(0x0202, True),
ItemName.burn_needle: ItemData(0x0203, True),
ItemName.burn_bomb: ItemData(0x0204, True),
ItemName.burn_spark: ItemData(0x0205, True),
ItemName.burn_cutter: ItemData(0x0206, True),
ItemName.stone_stone: ItemData(0x0207, True),
ItemName.stone_ice: ItemData(0x0208, True),
ItemName.stone_needle: ItemData(0x0209, True),
ItemName.stone_bomb: ItemData(0x020A, True),
ItemName.stone_spark: ItemData(0x020B, True),
ItemName.stone_cutter: ItemData(0x020C, True),
ItemName.ice_ice: ItemData(0x020D, True),
ItemName.ice_needle: ItemData(0x020E, True),
ItemName.ice_bomb: ItemData(0x020F, True),
ItemName.ice_spark: ItemData(0x0210, True),
ItemName.ice_cutter: ItemData(0x0211, True),
ItemName.needle_needle: ItemData(0x0212, True),
ItemName.needle_bomb: ItemData(0x0213, True),
ItemName.needle_spark: ItemData(0x0214, True),
ItemName.needle_cutter: ItemData(0x0215, True),
ItemName.bomb_bomb: ItemData(0x0216, True),
ItemName.bomb_spark: ItemData(0x0217, True),
ItemName.bomb_cutter: ItemData(0x0218, True),
ItemName.spark_spark: ItemData(0x0219, True),
ItemName.spark_cutter: ItemData(0x021A, True),
ItemName.cutter_cutter: ItemData(0x021B, True),
}
power_combo_map = {
(1, 1): ItemName.burn_burn,
(1, 2): ItemName.burn_stone,
(1, 3): ItemName.burn_ice,
(1, 4): ItemName.burn_needle,
(1, 5): ItemName.burn_bomb,
(1, 6): ItemName.burn_spark,
(1, 7): ItemName.burn_cutter,
(2, 2): ItemName.stone_stone,
(2, 3): ItemName.stone_ice,
(2, 4): ItemName.stone_needle,
(2, 5): ItemName.stone_bomb,
(2, 6): ItemName.stone_spark,
(2, 7): ItemName.stone_cutter,
(3, 3): ItemName.ice_ice,
(3, 4): ItemName.ice_needle,
(3, 5): ItemName.ice_bomb,
(3, 6): ItemName.ice_spark,
(3, 7): ItemName.ice_cutter,
(4, 4): ItemName.needle_needle,
(4, 5): ItemName.needle_bomb,
(4, 6): ItemName.needle_spark,
(4, 7): ItemName.needle_cutter,
(5, 5): ItemName.bomb_bomb,
(5, 6): ItemName.bomb_spark,
(5, 7): ItemName.bomb_cutter,
(6, 6): ItemName.spark_spark,
(6, 7): ItemName.spark_cutter,
(7, 7): ItemName.cutter_cutter,
}
copy_ability_access_table = {
"No Ability": ItemData(None, False),
"Burning Ability": ItemData(None, True),
"Stone Ability": ItemData(None, True),
"Ice Ability": ItemData(None, True),
"Needle Ability": ItemData(None, True),
"Bomb Ability": ItemData(None, True),
"Spark Ability": ItemData(None, True),
"Cutter Ability": ItemData(None, True),
}
misc_item_table = {
ItemName.crystal_shard: ItemData(0x0020, True, True),
ItemName.one_up: ItemData(0x0021, False),
ItemName.maxim_tomato: ItemData(0x0022, False),
ItemName.invincibility_candy: ItemData(0x0023, False),
ItemName.small_star: ItemData(0x0024, False),
ItemName.ice_cream: ItemData(0x0025, False),
ItemName.cake: ItemData(0x0026, False),
ItemName.sandwich: ItemData(0x0027, False),
ItemName.meat: ItemData(0x0028, False),
}
filler_item_weights = {
ItemName.one_up: 2,
ItemName.maxim_tomato: 1,
ItemName.ice_cream: 1,
ItemName.sandwich: 1,
ItemName.meat: 1,
ItemName.cake: 1,
ItemName.invincibility_candy: 1,
}
star_filler_item_weights = {
ItemName.small_star: 16,
**filler_item_weights
}
item_table = {
**copy_ability_table,
**power_combo_table,
**copy_ability_access_table,
**friend_table,
**misc_item_table,
}
power_combo_aliases = {}
for i, ability in enumerate(copy_ability_table, 1):
for j, other in enumerate(copy_ability_table, 1):
group_name = f"{ability}/{other}"
if group_name not in power_combo_aliases:
power_combo_aliases[group_name] = {power_combo_map[min((i,j), (j, i))]}
item_names = {
"Copy Ability": {name for name in copy_ability_table.keys()},
"Power Combo": {name for name in power_combo_table.keys()},
"Friend": {name for name in friend_table.keys()},
**power_combo_aliases
}
lookup_name_to_id: typing.Dict[str, int] = {item_name: data.code for item_name, data in item_table.items() if data.code}