doc: update use of relative/absolute imports
it matters for apworlds to function
This commit is contained in:
parent
4fcde135e5
commit
1c0a93acad
|
@ -23,3 +23,10 @@ No metadata is specified yet.
|
||||||
## Extra Data
|
## Extra Data
|
||||||
|
|
||||||
The zip can contain arbitrary files in addition what was specified above.
|
The zip can contain arbitrary files in addition what was specified above.
|
||||||
|
|
||||||
|
|
||||||
|
## Caveats
|
||||||
|
|
||||||
|
Imports from other files inside the apworld have to use relative imports.
|
||||||
|
|
||||||
|
Imports from AP base have to use absolute imports, e.g. Options.py and worlds/AutoWorld.py.
|
||||||
|
|
|
@ -188,7 +188,7 @@ the `/worlds` directory. The starting point for the package is `__init.py__`.
|
||||||
Conventionally, your world class is placed in that file.
|
Conventionally, your world class is placed in that file.
|
||||||
|
|
||||||
World classes must inherit from the `World` class in `/worlds/AutoWorld.py`,
|
World classes must inherit from the `World` class in `/worlds/AutoWorld.py`,
|
||||||
which can be imported as `..AutoWorld.World` from your package.
|
which can be imported as `worlds.AutoWorld.World` from your package.
|
||||||
|
|
||||||
AP will pick up your world automatically due to the `AutoWorld` implementation.
|
AP will pick up your world automatically due to the `AutoWorld` implementation.
|
||||||
|
|
||||||
|
@ -209,6 +209,10 @@ e.g. `from .Options import mygame_options` from your `__init__.py` will load
|
||||||
When imported names pile up it may be easier to use `from . import Options`
|
When imported names pile up it may be easier to use `from . import Options`
|
||||||
and access the variable as `Options.mygame_options`.
|
and access the variable as `Options.mygame_options`.
|
||||||
|
|
||||||
|
Imports from directories outside your world should use absolute imports.
|
||||||
|
Correct use of relative / absolute imports is required for zipped worlds to
|
||||||
|
function, see [apworld specification.md](apworld%20specification.md).
|
||||||
|
|
||||||
### Your Item Type
|
### Your Item Type
|
||||||
|
|
||||||
Each world uses its own subclass of `BaseClasses.Item`. The constuctor can be
|
Each world uses its own subclass of `BaseClasses.Item`. The constuctor can be
|
||||||
|
@ -321,7 +325,7 @@ mygame_options: typing.Dict[str, type(Option)] = {
|
||||||
```python
|
```python
|
||||||
# __init__.py
|
# __init__.py
|
||||||
|
|
||||||
from ..AutoWorld import World
|
from worlds.AutoWorld import World
|
||||||
from .Options import mygame_options # import the options dict
|
from .Options import mygame_options # import the options dict
|
||||||
|
|
||||||
class MyGameWorld(World):
|
class MyGameWorld(World):
|
||||||
|
@ -350,7 +354,7 @@ more natural. These games typically have been edited to 'bake in' the items.
|
||||||
from .Options import mygame_options # the options we defined earlier
|
from .Options import mygame_options # the options we defined earlier
|
||||||
from .Items import mygame_items # data used below to add items to the World
|
from .Items import mygame_items # data used below to add items to the World
|
||||||
from .Locations import mygame_locations # same as above
|
from .Locations import mygame_locations # same as above
|
||||||
from ..AutoWorld import World
|
from worlds.AutoWorld import World
|
||||||
from BaseClasses import Region, Location, Entrance, Item, RegionType, ItemClassification
|
from BaseClasses import Region, Location, Entrance, Item, RegionType, ItemClassification
|
||||||
from Utils import get_options, output_path
|
from Utils import get_options, output_path
|
||||||
|
|
||||||
|
@ -551,7 +555,7 @@ def generate_basic(self) -> None:
|
||||||
### Setting Rules
|
### Setting Rules
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from ..generic.Rules import add_rule, set_rule, forbid_item
|
from worlds.generic.Rules import add_rule, set_rule, forbid_item
|
||||||
from Items import get_item_type
|
from Items import get_item_type
|
||||||
|
|
||||||
def set_rules(self) -> None:
|
def set_rules(self) -> None:
|
||||||
|
@ -601,7 +605,7 @@ implement more complex logic in logic mixins, even if there is no need to add
|
||||||
properties to the `BaseClasses.CollectionState` state object.
|
properties to the `BaseClasses.CollectionState` state object.
|
||||||
|
|
||||||
When importing a file that defines a class that inherits from
|
When importing a file that defines a class that inherits from
|
||||||
`..AutoWorld.LogicMixin` the state object's class is automatically extended by
|
`worlds.AutoWorld.LogicMixin` the state object's class is automatically extended by
|
||||||
the mixin's members. These members should be prefixed with underscore following
|
the mixin's members. These members should be prefixed with underscore following
|
||||||
the name of the implementing world. This is due to sharing a namespace with all
|
the name of the implementing world. This is due to sharing a namespace with all
|
||||||
other logic mixins.
|
other logic mixins.
|
||||||
|
@ -620,7 +624,7 @@ Please do this with caution and only when neccessary.
|
||||||
```python
|
```python
|
||||||
# Logic.py
|
# Logic.py
|
||||||
|
|
||||||
from ..AutoWorld import LogicMixin
|
from worlds.AutoWorld import LogicMixin
|
||||||
|
|
||||||
class MyGameLogic(LogicMixin):
|
class MyGameLogic(LogicMixin):
|
||||||
def _mygame_has_key(self, world: MultiWorld, player: int):
|
def _mygame_has_key(self, world: MultiWorld, player: int):
|
||||||
|
@ -631,7 +635,7 @@ class MyGameLogic(LogicMixin):
|
||||||
```python
|
```python
|
||||||
# __init__.py
|
# __init__.py
|
||||||
|
|
||||||
from ..generic.Rules import set_rule
|
from worlds.generic.Rules import set_rule
|
||||||
import .Logic # apply the mixin by importing its file
|
import .Logic # apply the mixin by importing its file
|
||||||
|
|
||||||
class MyGameWorld(World):
|
class MyGameWorld(World):
|
||||||
|
|
Loading…
Reference in New Issue