コードのルール
大原則 ── スタンドアロン Pyxel として動くこと
Code & Magic で動かすコードは、Code & Magic を離れても Pyxel ゲームとして成立する ことを基本的な大原則としています。
そのため、Python 標準ライブラリであっても他のプログラムを実行するようなものや、ウェブブラウザの機能に依存したコードは動かせません。
これは、Pyxel ゲームを作りに来た冒険者が、Pyxel ゲームとして書き、Pyxel ゲームとして遊ぶ ── そのためのルールです。
使えるライブラリ(許可リスト)
Code & Magic で利用できる Python ライブラリを以下に挙げます。
コードを動かすたびに、含まれている import が自動チェックされます。
Pyxel
pyxelおよび子モジュール
Python 言語機能
__future__
数学・データ
math,random,statisticsdataclasses,typing,collections,enum,abcitertools,functools,operator,copyfractions,decimal,numbers
色
colorsys── HSV / RGB / YIQ などの色変換。パレットアニメや色生成に。
文字列・データ形式
io,re,string,structbase64,binascii,hashlib,zlibtextwrap,unicodedata
設定・データファイル
json,csvtomllib(読み込みのみ。書き込みは Pyodide ビルトインのtomli-wを使う)
ファイル I/O
pathlib,tempfile
ゲームの進行状況やスコアを保存したいときは、Pyxel 標準の pyxel.user_data_dir() が返すフォルダにファイルを書き込みます。中身はあなた(プレイヤー)のアカウントに保存され、次に遊ぶときに読み戻せます。使い方はセーブデータのガイドを参照してください。
一時的な作業ファイル(保存しなくてよいもの)が必要なら、tempfile モジュールか /tmp パス配下を使えます。こちらはゲーム実行中の作業領域として読み書きできますが、リロードや別セッションでは内容が引き継がれません(永続化はされません)。
ファイル操作で os を使いたくなった場合は、代わりに pathlib を使ってください。
時刻・日付
time,datetime,calendar
データ構造
array,heapq,bisect
識別子・乱数
uuid── セーブデータ ID や一意キーを作るときに。
その他
contextlib
Pyodide ビルトインパッケージ
ブラウザの Pyxel は内部で Pyodide 上で動いており、特に有用なパッケージはコードに import を書くだけで自動でロードされます。設定や UI は不要です。
| パッケージ | サイズ目安 | 主な用途 | コードでの import |
|---|---|---|---|
numpy | 約 2.7 MB | 行列・procedural 生成・AI/アルゴリズム題材 | import numpy |
pillow | 約 1.0 MB | 外部 PNG → Pyxel 画像、procedural スプライト | from PIL import Image |
pyyaml | 約 0.1 MB | レベルデータや設定ファイル(手で書きやすい) | import yaml |
tomli-w | 約 6 KB | TOML 書き込み(読み込みは標準の tomllib で OK) | import tomli_w |
jinja2 | 約 0.14 MB | ノベルゲーム風のテキストテンプレート | from jinja2 import Template |
初回プレイ時にこれらのパッケージは jsdelivr CDN から fetch されるため、起動が数秒遅くなることがあります。2 回目以降はブラウザキャッシュにより素早く起動します。
使われていないパッケージはロードされません(import numpy を書かなければ numpy は fetch されません)。
自分のプロジェクト内の他ファイル
魔導書のページ(プロジェクト内の他の .py ファイル)への from xxx import yyy も通常どおり使えます。
使えないもの(よくある例)
許可リストに無いものは自動的にブロックされます。代表的な例:
| カテゴリ | 例 | なぜ |
|---|---|---|
| JS interop | from js import ..., import pyodide | スタンドアロン Pyxel では存在しない |
| OS 操作 | import os, import sys, import subprocess | os.system() / os.popen() / os.exec*() などシェル・外部コマンドを実行する経路を含むため禁止。ファイル操作は pathlib で代替 |
| ネットワーク | import socket, import urllib, import requests | Code & Magic で動くコードからの外部通信は禁止 |
| 低レベル・並行 | import ctypes, import threading, import multiprocessing | ゲームには不要、escape vector |
| 動的 import | import importlib, __import__() | ランタイムのサンドボックス境界をすり抜ける手段になる |
加えて、コードの中で別のコードを動かす仕組み ── eval() / exec() / compile() / getattr(__builtins__, ...) も使えません。書かれているソースを読めば、その作品の全挙動が予測できる状態を保つためです。
どこでチェックが走る?
許可リスト・動的実行のチェックは コードを実行するたび に行われます。具体的には:
- エンコーディアのワンダー攻略中の実行 ── 穴を埋めたコードや書き換えたコードを動かす瞬間
- 羽根筆のゆりかごの「動かしてみる」 ── あなたが書いた魔導書を試走する瞬間
- クリスタル化の前のプレビュー(スクショ撮影前) ── 公開申請の最初の段階
- GitHub の黒い魔導書を試走するとき ── 取り込んだ外部コードに対して
違反があると行番号付きのエラーが表示され、コードは動きません。
すでに公開されている作品をプレイするとき(魔法研究会の作品再生、共有 URL 経由のプレイ等)は、これらのチェックは走りません。
困ったとき
- 使いたいライブラリが許可リストに無い → Code & Magic の運営にお知らせください。スタンドアロン Pyxel と互換で、安全に使えるものは追加を検討します。
- 既に公開している作品が新しいチェックに引っかかる → 既存の公開作品はそのまま遊べます。再びクリスタル化(編集して再公開)するときに新しい基準が適用されます。
