Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
2299 lines (1613 sloc) 95.9 KB
================================================================================
PICO-8 v0.1.11d
https://www.pico-8.com
(c) Copyright 2014-2017 Lexaloffle Games LLP
Author: Joseph White // hey@lexaloffle.com
PICO-8 is built with:
SDL2 http://www.libsdl.org
Lua 5.2 http://www.lua.org // see license.txt
GIFLIB http://giflib.sourceforge.net/
WiringPi http://wiringpi.com/
日本語版マニュアルリポジトリ: https://github.com/kitao/pico8-jp
PICO-8 API 早見表: https://kitao.github.io/pico8-api-jp/
================================================================================
PICO-8へようこそ!
PICO-8は小さなゲームやプログラムを作って、共有して、プレイするための架空のゲー
ム機です。PICO-8を起動させると、Luaプログラムを入力できるコンソールが立ち上が
り、スプライト、マップ、サウンドを作成できるシンプルなツールが提供されます。
PICO-8の厳しい制約は、楽しく作れて、小さいけれど表現力に富んだデザインになり、
願わくばそれぞれのPICO-8カートリッジが個性的な見た目や操作になるように注意深く
選択されています。
:: キー操作
フルスクリーン切り替え : ALT+ENTER
終了 : ALT+F4 または CMD+Q
カートリッジの再読み込み/実行/再スタート: CTRL+R
クイックセーブ : CTRL+S
消音/消音取り消し : CTRL+M
プレイヤー1 デフォルト操作 : カーソルキー + ZX / NM / CV
プレイヤー2 デフォルト操作 : SDFE + TAB,Q / SHIFT A
ポーズメニュー(実行中) : ENTER または P
// デフォルト操作を変更するにはKEYCONFIGを編集してください。
:: 仕様
表示 : 128x128、16色固定パレット
入力 : 6ボタンコントローラー
カートリッジサイズ: 32k
サウンド : 4チャンネル、定義可能な64チップチューンサウンド
コード : Lua (最大8192トークン)
スプライト : シングルバンク 128 8x8スプライト
(+マップと共有の128スプライト)
マップ : 128x32 8ビットセル (+スプライトと共有の128x32セル)
:: Hello World
PICO-8を起動したら、以下の各コマンドを入力してENTERキーを押してみましょう:
PRINT("HELLO WORLD")
RECTFILL(80,80,120,100,12)
CIRCFILL(70,90,20,14)
FOR I=1,4 DO PRINT(I) END
(注意: PICO-8は常に大文字を表示します。
-- CAPSキーを押さずに入力してください!)
このようなコマンドを、コードエディターで_updateや_drawなどの特別なコールバック
関数に記述することで、操作可能なプログラムを作成することができます。例えば、次
のプログラムはカーソルキーで円を動かすことができます。ESCキーでコードエディ
ターに切り替えて、以下のコードを入力またはコピー&ペーストしてみてください:
X = 64 Y = 64
FUNCTION _UPDATE()
IF (BTN(0)) THEN X=X-1 END
IF (BTN(1)) THEN X=X+1 END
IF (BTN(2)) THEN Y=Y-1 END
IF (BTN(3)) THEN Y=Y+1 END
END
FUNCTION _DRAW()
RECTFILL(0,0,127,127,5)
CIRCFILL(X,Y,7,8)
END
ESCキーを押してコンソールに戻り、RUNと入力して(またはCTRL+Rを押して)実際に動く
ところを確認してみてください。より複雑なプログラムについては、サンプルカート
リッジを参照してください。
プログラムを保存したい場合は、SAVEコマンドを使用します:
SAVE REDCIRC
:: サンプルカートリッジ
PICO-8にはあらかじめ下記のカートリッジが含まれており、以下のコマンドでインス
トールできます:
INSTALL_DEMOS
CD DEMOS
HELLO PICO-8からの挨拶
API PICO-8の主要機能のデモ
JELPI 2プレイヤー対応のプラットフォーム型ゲームデモ
CAST 2.5Dレイキャスト描画デモ
MANDEL マンデルブロー描画
COLLIDE 壁とキャラクターの衝突判定サンプル
BUTTERFLY シェルピンスキーのフラクタル三角形描画
DRIPPY 液体のように滴る曲線の描画
STOMPY 音楽カートリッジ
カートリッジを実行するには、PICO-8を起動して以下のように入力します:
LOAD JELPI
RUN
ESCキーでプログラムが停止し、もう一度押すとエディターモードに切り替わります。
:: ファイルシステム
ファイルやディレクトリ(フォルダ)の管理には以下のコマンドを使用します:
DIR 現在のディレクトリの内容一覧を表示します。
CD BLAH 現在のディレクトリをBLAHに変更します。
CD .. 一つ上の階層のディレクトリに移動します。
CD / (PICO-8の仮想ドライブの)一番上のディレクトリに移動します。
MKDIR BLAH ディレクトリを作成します。
FOLDER ホストOSのファイルブラウザで現在のディレクトリを開きます。
LOAD BLAH 現在のディレクトリから指定したカートリッジを読み込みます。
SAVE BLAH 現在のディレクトリに指定したカートリッジを保存します。
ファイルの移動、複製、削除をしたい場合は、FOLDERコマンドを使ってホストOS上で操
作してください。
PICO-8の仮想ドライブの初期位置は以下になります:
Windows: C:/Users/Yourname/AppData/Roaming/pico-8/carts
OSX : /Users/Yourname/Library/Application Support/pico-8/carts
Linux : ~/.lexaloffle/pico-8/carts
pico-8/config.txtを編集することでドライブ位置やその他の設定を変更することがで
きます。
ヒント:
仮想ドライブ位置を(Dropbox、Google Drive等が提供する)クラウドドライブに割り
当てることで、複数マシンのPICO-8間で仮想ドライブを共有することできます。
:: 読み込みと保存
LOAD、SAVEコマンドを使用する際に、拡張子.p8を省略すると自動で追加されます。
拡張子.p8.pngで保存すると、カートリッジ画像のように見える特殊な画像フォーマッ
トで保存されます。
クリップボードから読み込み、または保存するには"@CLIP"というファイル名を使用し
ます。
一度カートリッジを読み込み、または保存すると、CTRL+Sでクイックセーブできるよう
になります。
:: .p8.pngカートリッジをテキストラベルとプレビュー画像つきで保存する
カートリッジで使用するラベル画像を作成するには、プログラム実行中にF7キーでス
クリーンを撮影してください。また、プログラム先頭の'--'で始まる2行はカート
リッジのテキストラベルとして描画されます。
例:
-- OCEAN DIVER LEGENDS
-- BY LOOPY
:: .pngフォーマットのコードサイズ制限
.pngフォーマットで保存するには、圧縮後のコードサイズが15360バイト以下である
必要があります。現在のコードサイズを知るにはINFOコマンドを使用してください。
圧縮後のサイズ制限は.p8フォーマットでの保存時には関係ありません。
:: バックアップ
変更を保存せずに終了したり、既存のファイルを上書きした場合、カートリッジのバッ
クアップが{appdata}/pico-8/backupに作成されます。
:: 設定
:: config.txt
config.txtに設定が記述されています。PICO-8を実行していない時に編集してくださ
い。
Windows: C:/Users/Yourname/AppData/Roaming/pico-8/config.txt
OSX : /Users/Yourname/Library/Application Support/pico-8/config.txt
Linux : ~/.lexaloffle/pico-8/config.txt
後述する-homeオプションでconfig.txtやその他のデータの参照位置を変更すること
ができます。
:: コマンドライン引数
// 注意: これらのオプションはconfig.txtの設定を上書きします。
pico-8 [オプション] [ファイル名.p8]
-width n ウィンドウの幅
-height n ウィンドウの高さ
-windowed n 0で全画面モード、1でウィンドウモードで起動
-sound n 音量(0-256)
-music n 音量(0-256)
-joystick n ジョイスティックの割り当てをプレイヤー番号n(0-7)から
開始する
-pixel_perfect n 1(デフォルト)でフィルターなしの整数倍の拡大
-draw_rect x,y,w,h PICO-8の画面のウィンドウ座標とサイズを指定する
-run filename カートリッジを読み込んで実行する
-x filename タイトルバーなしでPICO-8カートリッジを実行した後に、
終了する
-p param_str 指定したカートリッジにパラメータ文字列を渡す
-splore SPLOREモードで起動
-home path config.txtとユーザーデータの参照場所を指定する
-desktop path スクリーンショットとアニメGIFの保存場所を指定する
-screenshot_scale n スクリーンショットの拡大率
(デフォルトは3の368x368ピクセル)
-gif_scale n 録画するアニメGIFの拡大率
(デフォルトは2の256x256ピクセル)
-gif_len n アニメGIFの最大録画時間の秒数(1-120)
-gui_theme n 1で高コントラストのエディターカラー設定を使用する
-timeout n ダウンロード開始を待つ最大時間の秒数(デフォルトは30)
-software_blit n 0でソフトウェア描画モードをoff、1でon
-foreground_sleep_ms n フレーム間に何ミリ秒スリープするか
-background_sleep_ms n バックグラウンド動作時にフレーム間に何ミリ秒スリープ
するか
:: コントローラー設定
PICO-8はSDL2のコントローラーの設定方法を使用しています。この方法は、起動時に一
般的なコントローラーを認識し、config.txtと同じディレクトリの
sdl_controllers.txtにあるボタン割り当てを探します。sdl_controllers.txtには1行
につき1つのボタン割り当てを記述します。
独自のボタン割り当てを作成するには、SDL2に付属するcontrollermapプログラムか、
http://www.generalarcade.com/gamepadtool/を使用してください。
キーボードのキーをコントローラーのどのボタンに割り当てるかを設定するには、
KEYCONFIGを使用します。
:: スクリーンショット、動画、カートリッジラベル
カートリッジ動作中に以下のコマンドが使用できます:
F6 デスクトップにスクリーンショットを保存する。
F7 カートリッジラベル画像をキャプチャする。
F8 アニメGIFの録画を開始する。
F9 デスクトップにアニメGIFを保存する(デフォルトでは最大8秒)
// F6-F9が使えない環境では、F1-F4またはCTRL+6-9を使用してください。
動画はいつでも保存することが可能です。(常に録画されています) -- 8秒以下の動画
を撮影したい場合はF8キーで録画の開始時間をリセットしてください。
アニメGIFの最大長さを変更するには、config.txtのgif_lenで録画時間の秒数を指定し
ます。GIFフォーマットは30fpsちょうどに対応していないため、PICO-8は代わりに最も
近い33.3fpsを使用しています。
:: カートリッジの共有
PICO-8には3種類のカートリッジ共有方法があります:
1. .p8または.p8.pngファイルを他のPICO-8ユーザーと直接共有する
現在のフォルダをホストOS上で開くにはFOLDERと入力してください。
2. カートリッジをLexaloffe BBSに投稿してWebブラウザ版を取得する
http://www.lexaloffle.com/pico-8.php?page=submit
3. カートリッジを単体html5またはバイナリ版プレイヤーとして出力する
(詳細はエクスポーターのセクションを参照してください)
:: エクスポーター / インポーター
EXPORTコマンドでpng、wavファイル、HTML版プレイヤー、バイナリ版プレイヤーを作成
できます。出力フォーマットはファイル名の拡張子で決まります。(例: .png)
作者と提供者からの許可があれば、出力されたカートリッジやデータを自由に配布や使
用することができます。
:: スプライトシート(.png)
IMPORT BLAH.PNG -- 128x128のpngファイルを読み込み、色をPICO-8のパレット
に合わせます。
EXPORT BLAH.PNG -- pngファイルの出力位置の指定にはfolder関数が使用されま
す。
:: SFXと音楽(.wav)
EXPORT BLAH.WAV -- 音楽エディターで選択中のパターンを出力します。
EXPORT BLAH.WAV -- SFXエディターで選択中のSFX(効果音)を出力します。
EXPORT BLAH%D.WAV -- すべてのSFXをblah0.wav、blah1.wav .. blah63.wavとして
出力します。
:: HTML版プレイヤー(.html)
単体動作するHTML版プレイヤーを作成します(foo.html and foo.js):
EXPORT FOO.HTML
.jsファイルだけを出力します:
EXPORT FOO.JS
-pオプションで独自のhtmlテンプレートを指定することもできます:
EXPORT FOO.HTML -P ONE_BUTTON
このオプションは{application data}/pico-8/plates/one_button.htmlファイルの文
字列##js_file##を.jsファイル名で置き換え、htmlシェルとして使用します。
:: バイナリ版プレイヤー(.bin)
単体実行可能なファイルをWindows、Linux (64-bit)、Mac OSX向けに作成します:
EXPORT FOO.BIN
デフォルトでは、カートリッジラベル画像は透過部分のないアイコンとして使用され
ます。スプライトシートの画像をアイコンに指定するには-iオプションを使用し、必
要に応じて-s、-cオプションをサイズと透過色の指定に使用してください。
-I N 色番号0(黒)を透過色にしたN番のスプライトのアイコン
-S N NxNのサイズのスプライト。サイズ3は24x24のアイコンになる
-C N 色番号Nを透過色として扱う。透過色なし場合は16を指定する
例えば、色番号12を透過色として、スプライトシートの32番から始まる2x2のスプラ
イトを使用し、追加カートリッジとしてC8.P8を指定する場合は以下のコマンドにな
ります:
EXPORT FOO.BIN C0.P8 -I 32 -S 2 -C 12
:: 複数カートリッジのエクスポート
単体版のHTML版プレイヤーまたはバイナリ版プレイヤー作成時には、EXPORTコマンドに
指定することで最大16までのカートリッジを追加することができます:
EXPORT FOO.HTML DAT1.P8 DAT2.P8 GAME2.P8
実行中に、追加カートリッジはローカルファイルのようにアクセスできます:
RELOAD(0,0,0x2000, "DAT1.P8") -- DAT1.P8からスプライトシートを読み込みます。
LOAD("GAME2.P8") -- 別のカートリッジを読み込んで実行します。
現在のところ、.p8ファイルだけがサポートされており、ファイル名は拡張子.p8を含ん
だ名前で指定する必要があります。
:: SPLORE
SPLOREはローカルとBBS(オンライン)のカートリッジを閲覧、管理するためのユーティ
リティです。SPLORE[ENTER]と入力するか、-sploreオプションをつけてPICO-8を起動す
ることで使用できます。
SPLOREのすべての操作をジョイスティックで行えます:
左ボタンと右ボタンでカートリッジのリストを切り替えます。
上ボタンと下ボタンでリスト中のアイテムを選択します。
Xボタン、Oボタン、MENUボタンでカートリッジを起動します。
カートリッジ実行中にMENUボタンを押すと、カートリッジのお気に入り登録やSPLOREへ
の復帰ができます。キーボードの場合は、カートリッジリストでアイテムが選択されて
いる時にFキーでお気に入りへ登録ができます。
BBSのカートリッジリスト閲覧中は、リストアイテムの先頭の[UPDATE]を選択すると
カートリッジリストの再ダウンロードが行われます。オフライン時は、最後にダウン
ロードされたリストが表示され、ダウンロード済みのカートリッジを引き続きプレイす
ることができます。
インターネット環境のないマシンにPICO-8をインストールした場合も、INSTALL_GAMES
コマンドで、あらかじめインストールされているいくつかのBBSカートリッジをお気に
入りリストに追加することができます。
:: PICO-8の特殊な点
以下の特殊な点に注意してください:
- スプライトシートの後半とマップの後半は同じメモリに割り当てられています。
// どのように動作するかよくわからない場合は、どちらか片方だけを使用するのが
// よいでしょう。
- PICO-8の数値は32767.99までしか扱えません。
// 毎フレームカウンターに1を足すと、18分後にはオーバーフローを起こします!
- Luaの配列はデフォルトでは0ではなく1から開始されます。FOREACHはT[0]ではなく
T[1]から始まります。
- cosとsinは0からPI*2の代わりに0から1の値を取り、sinの正負は反転しています。
- sgn(0)は1を返します。
- Macでフルスクリーンを切り替えるにはALT+ENTERを使用します
(CMD-Fはテキストの検索に使用されます)
- .pngカートリッジを出力したい場合はEXPORTではなくSAVEを使用します。EXPORTはス
プライトシートだけを保存します!
================================================================================
エディターモード
================================================================================
コンソールとエディターを切り替えるにはESCキーを押します。
エディターモードを切り替えるには、右上のエディターモードタブをクリックするか、
ALT+左キー/右キーを押してください。
注意:
スプライトシートの後半(バンク2と3)とマップの後半はカートリッジの同じデータ領
域を共有しています。そのデータ領域をどう使うかはあなた次第ですが、スプライト
シートの後半に書き込むとマップデータが破壊され、その逆も起きるので注意してく
ださい。
:: コードエディター
SHIFTキーを押し続けると(またはマウスでドラッグすると)領域を選択します。
CTRL+X、C、Vで選択領域をカット、コピー、ペーストします。
CTRL+Z、Yで編集の取り消しとやり直しをします。
CTRL+Fで現在のタブのテキストを検索します。
CTRL+Gで最後の検索を繰り返します。
CTRL+Lで指定した行番号に移動します。
CTRL+上キー、下キーでプログラムの先頭と終端に移動します。
ALT+上キー、下キーで直前と直後の関数に移動します。
CTRL+左キー、右キーで直前と直後の単語に移動します。
CTRL+Dで現在の行を複製します。
TABで選択範囲をインデントします。
(SHIFTキーを押しているとインデントを取り消します)
ボタン用の特殊文字はSHIFT+L、R、U、D、O、Xを押すか、CTRL+Kでグリフモードに切り
替えることで入力できます。
:: タブ
上部の[+]ボタンをクリックすると新しいタブを追加します。
左クリックまたはCTRL+TAB、SHIFT+CTRL+TABでタブを切り替えます。
最後のタブを削除するには、内容を削除してから移動します。
(CTRL+A、DEL、CTRL+TAB)
カートリッジ実行時に、すべてのタブが順番に結合されて単体のプログラムが作成さ
れます。
:: コード制限
コードエディターの右下に現在のトークン数が表示されます。1つのプログラムで最
大8192トークンを使用できます。各トークンは単語(例: 変数名)または演算子です。
左右括弧のペアや文字列は1トークンとしてカウントされます。カンマ、ピリオド、
LOCALキーワード、セミコロン、ENDキーワード、コメントはカウントされません。
右クリックで他の情報表示(文字数、圧縮後サイズ)に切り替えます。
限界に到達すると警告ライトが点滅します。これは右クリックで無効にすることがで
きます。
:: スプライトエディター
スプライトエディターではスプライト単位の編集とピクセル単位の編集の両方が行なえ
ます。画面下部のスプライトナビゲーターでスプライトシートの8x8ピクセル単位での
参照位置の指定が可能です。より大きなサイズや奇数のサイズを扱いたい場合は、自由
形状ツール(パン、選択)を使うこともできます。
描画ツール:
スプライト上でクリックまたはドラッグでピクセルを描画します。
表示されている範囲に適用されます。
CTRLキーを押していると描画先と同じ色を探してすべて置き換えます。
現在位置の色を選択するには右マウスボタンを使用します。
スタンプツール:
クリックするとコピーした領域をスタンプします。
左CTRLキーを押していると色番号0(黒)を透明色としてスタンプします。
選択ツール: // ショートカット: 左SHIFTまたはSキー
選択領域を作成します。
ENTERキーまたはクリックで非選択状態になります。
ピクセル単位の選択でない場合は、ほとんどの操作がスプライト単位の選択領域に適
用されます。複数スプライトを選択するにはスプライトナビゲーターでSHIFT+ドラッ
グします。
パンツール: // ショートカット: SPACEキー
スプライトシートの参照範囲を移動させます。
塗りつぶしツール:
現在の色で塗りつぶします。
現在の選択領域に適用します。
どこも選択されていなければ表示されている範囲に適用されます。
その他操作:
CTRL+Zで操作の取り消しをします。 // 0.2.0では1度だけ有効です。
CTRL+Cで選択領域または選択したスプライトをコピーします。
CTRL+Vで現在のスプライト位置にペーストします。
QキーとWキーで前後のスプライトに切り替えます。
1キーと2キーで前後の色に切り替えます。
TABキーでフルスクリーン表示を切り替えます。
マウスホイールまたは<、>キーでズームします。
(フルクリーン表示では中央中心でズームします)
選択領域または選択したスプライトの操作:
Fキーで左右反転します。
Vキーで上下反転します。
Rキーで回転します。(選択領域が正方形である必要があります)
カーソルキーで移動します。(スプライト選択時は循環します)
スプライトフラグ:
8色の丸は現在のスプライトのスプライトフラグです。
各フラグはtrue(オン)かfalse(オフ)にでき、fset関数とfget関数でアクセスできま
す。スプライトフラグは0から番号が振られており、左から(0,1,2..7)となります。
詳細はfset関数の説明を参照してください。
:: マップエディター
PICO-8のマップは8ビットの値を持つ128x32(または共有領域を使った128x64)のブロッ
クです。各値はマップエディター上ではスプライト(0-255)として表示されますが、任
意の何かを表すデータとしても使用できます。
ツールはスプライトエディターと同じです。スプライトを選択してクリックまたはド
ラッグでマップに描画してください。
複数のスプライトを描画するには、スプライトナビゲーターでSHIFT+ドラッグで選択し
ます。
値のブロックをコピーするには選択ツールでコピーした後にスタンプツールでペースト
します。
マップを移動するにはパンツールを使うかSPACEキーを押し続けます。
QキーとWキーで前後のスプライトに切り替えます。
マウスホイールまたは<、>キーでズームします。
(フルクリーン表示では中央中心でズームします)
:: SFXエディター
1つのカートリッジでサウンドと音楽で共用する64のSFX(効果音)を使用できます。
SFXは32のノートを持ち、各ノートには以下の要素があります:
音階 (C0-C5)
音色 (0-7)
音量 (0-7)
エフェクト (0-7)
SFXは以下の属性も持っています:
再生速度(SPD): ノートを再生するティック数(フレーム数)
// 1が最も短く3は3倍長くなります。
ループ開始位置と終了位置: ループの先頭と終端のノート番号
// 先頭位置が終端位置以上だとループはオフになります。
SFXの閲覧や確認をするために2つのモードがあります:
ピッチモード(効果音向け)とトラッカーモード(音楽向け)です。
モードは左上のボタンかTABキーで切り替えることができます。
1. ピッチモード
ピッチエリアをクリックまたはドラッグすることで、現在選択している音色(色で示
されます)を使って各ノートの音階を設定します。
SHIFTキーを押していると選択された音色のみに適用します。
CTRLキーを押しているとノートをCマイナーペンタトニックスケールに合わせます。
2. トラッカーモード
各ノートは次の要素を表示しています: 音階 オクターブ 音色 音量 エフェクトノー
トを入力するには、q2w3er5t6y7ui zsxdcvgbhnjm (ピアノ風キー配置)を使います。
SHIFTキーを押しながらノートを入力すると-1オクターブから+1オクターブの範囲ま
で転調します。
新しいノートには選択されている音色とエフェクトが使用されます。
ノートを削除するには、BACKSPACEキーを押すかボリュームを0に設定してください。
クリックとSHIFT+クリックで範囲選択によるコピー(CTRL+C)とペースト(CTRL+V)がで
きます。
移動:
PAGEUP/DOWNまたはCTRL+上下キーで4ノート分上下に移動します。
HOME/ENDで最初または最後のノートに移動します。
CTRL+左右キーで隣の列に移動します。
3. 両モードの操作方法
-/+キーで現在のSFXを切り替えます。
</>キーで再生速度を変更します。
SPACEキーで再生/停止します。
SHIFT+SPACEキーで現在の8ノート単位のグループから再生します。(訳注: 要確認)
Aキーでサンプルのループ再生を解除します。
左クリックと右クリックでSPDまたはLOOPの値を増加/減少させます。
// クリック時にSHIFTを押していると4ずつ増加/減少させます。
// 別の方法として、左右または上下にドラッグする方法もあります。
音色、エフェクト、音量をSHIFT+クリックすることですべてのノートに適用できま
す。
:: エフェクト
0 なし
1 スライド // 次のノートまで滑らかにつなげます。
2 ビブラート // 高速に音程を1/4音の範囲で変化させます。
3 ドロップ // 高速に音程を低い値まで減少させます。
4 フェードイン // 音量を0から徐々に上げます。
5 フェードアウト // 音量を0へ徐々に下げます。
6 高速アルペジオ // スピード4で4ノートのグループを繰り返します。
7 低速アルペジオ // スピード8で4ノートのグループを繰り返します。
もしSFXのスピードが8以下なら、アルペジオのスピードは2や4に半減されます。
:: 音楽エディター
PICO-8では音楽をパターンの連続として扱います。パターンはどのSFXを各チャンネル
で再生するかを示す4つの数字のリストになります。
:: 再生順序のコントロール
再生順序は右上の3つのボタンで制御します。
パターンの再生が終わった時、以下に該当しなければ次のパターンを再生します:
- 再生する残りデータがない(音楽は止まります)
- そのパターンにSTOPコマンド(3つ目のボタン)がセットされている
- LOOP BACKコマンド(2つ目のボタン)がセットされている
この場合、以前のパターンにLOOP START(1番目のボタン)がセットされているなら
そのパターンに、セットされていなければパターン0に戻ります。
パターンが異なる再生速度のSFXを使用している場合、パターンはループではない最
も左のチャンネルが再生を終えた時に終了します。これは32で割り切れない変則的な
拍子や倍速のドラムビートなどを作成するのに使用できます。
:: カートリッジ内やカートリッジ間の音楽のコピー
パターンの範囲選択:
パターンナビゲーターの最初のパターンを一度クリックし、最後のパターンを
SHIFT+クリックするとパターンを範囲選択できます。選択されたパターンはCTRL+C
とCTRL+Vでコピーとペーストできます。他のカートリッジにペーストすると、もし
そのパターンが参照しているSFXが存在しなければ、そのSFXもペーストされます。
(その際、異なるSFX番号になる場合があります)
:: SFX音色
PICO-8では、元の8種類の音色に加え、先頭の8つのSFXを使って独自の音色を定義す
ることができます。音色の右側のトグルボタンでSFX音色に切り替え、使用する音色
番号を指定します。SFX音色の番号はピンクの代わりに緑で表示されます。
SFX音色のノート再生時には、該当するSFXを再生しますが、ノートの以下の属性が変
更されます:
音程はC2からの相対値分上がります。
音量はSFXとノートのものが掛け合わされます。
エフェクトはカスタム音色のエフェクトの上にかかります。
例えば、シンプルなトレモロのエフェクトは、0番のSFXで音量を5から2の間で急速に
揺らすことで実現できます。このSFX音色をノートで使用する際、音量は元の値から
(ノートの音量またはフェードイン/アウトエフェクトで)さらに変更されます。この
ように、SFX音色は音量、音程、波形の変化の組み合わせで制御されます。
SFX音色は音程が変更された時か、前のノートの音量が0だった時のみ、再トリガーさ
れます。これにより、例えば徐々にフェードアウトするベルのような、長い時間をか
けてゆっくり変化する音色が実現できます。この動作を逆にするには、エフェクト3
(ドロップ)を再トリガーさせたいノートに使用します。他のエフェクトはSFX音色が
再生されたときに、通常と同じ動作をします。
================================================================================
Lua入門
================================================================================
PICO-8のプログラムはLua言語で記述しますが、Luaの標準ライブラリを使用することは
できません。以下はLuaで必須となる文法の簡単な説明です。
詳細や正規のLuaについて知りたい場合は、www.lua.orgを参照してください。
:: コメント
-- 行末までを無視させるには2つのハイフン(-)を使います。
--[[ 複数行の
コメント ]]
:: 型と代入
Luaの型には数値、文字列、ブーリアン(真偽値)、テーブルがあります:
NUM = 12/100
S = "THIS IS A STRING"
B = FALSE
T = {1,2,3}
PICO-8の数値はすべて16:16の固定小数です。値の範囲は-32768.0から32767.99になり
ます。
また、小数部を持った16進数表記も使えます:
0x11 -- 17
0x11.4000 -- 17.25
ゼロ除算は最大の数値(0x7fff.ffff)として評価されます。
:: 条件分岐
IF NOT B THEN
PRINT("B IS FALSE") -- Bはfalse(偽)
ELSE
PRINT("B IS NOT FALSE") -- Bはfalseではない
END
-- ELSEIFありの場合
IF X == 0 THEN
PRINT("X IS 0") -- Xは0
ELSEIF X < 0 THEN
PRINT("X IS NEGATIVE") -- Xは負の数
ELSEIF X > 0 THEN
PRINT("X IS POSITIVE") -- Xは正の数
ELSE
PRINT("THIS IS LINE IS NEVER REACHED") -- この行は実行されない
END
IF (4 == 4) THEN PRINT("EQUAL") END -- 等しい
IF (4 ~= 3) THEN PRINT("NOT EQUAL") END -- 等しくない
IF (4 <= 4) THEN PRINT("LESS THAN OR EQUAL") END -- 以下
IF (4 > 3) THEN PRINT("MORE THAN") END -- より大きい
:: 繰り返し
FOR X=1,5 DO
PRINT(X)
END
-- 1,2,3,4,5を出力する
X = 1
WHILE(X <= 5) DO
PRINT(X)
X = X + 1
END
FOR X=1,10,3 DO PRINT(X) END -- 1,4,7,10
FOR X=5,1,-2 DO PRINT(X) END -- 5,3,1
:: 関数とローカル変数
Y=0
FUNCTION PLUSONE(X)
LOCAL Y = X+1
RETURN Y
END
PRINT(PLUSONE(2)) -- 3
PRINT(Y) -- 0
:: テーブル
Luaのテーブルは複数の型を混在可能な、キーと値のペアのコレクションです。整数を
キーにすることで配列としても使用できます。
A={} -- 空のテーブルを作成する
A[1] = "BLAH"
A[2] = 42
A["FOO"] = {1,2,3}
-- デフォルトでは常にキーが1から始まる配列になる
A = {11,12,13,14}
PRINT(A[2]) -- 12
-- 1から始まる連続した整数をキーにしたテーブルのサイズ
PRINT(#A) -- 4
-- 文字列のキーであればドット(.)記法を使用可能
PLAYER = {}
PLAYER.X = 2 -- PLAYER["X"]と同じ
PLAYER.Y = 3
-- APIリファレンスのテーブルのセクションも参照してください
:: PICO-8の略記法
PICO-8には、頻出パターンのための標準にはないいくつかの略記法があります。
1. 1行のIF THEN END構文はTHENとENDを省略可能です。
IF (NOT B) I=1 J=2
-- 次のコードと同じです: IF (NOT B) THEN I=1 J=2 END
-- すべて同じ行に書かれていて、条件部は括弧で括られている必要があります。
2. 単項演算子
a += 2 -- a = a + 2と同じ
a -= 2 -- a = a - 2と同じ
a *= 2 -- a = a * 2と同じ
a /= 2 -- a = a / 2と同じ
a %= 2 -- a = a % 2と同じ
3. !=演算子
略記法ではありませんが、PICO-8では「等しくない」を表すために~=の代わりに!=を使
用できます。
================================================================================
APIリファレンス
================================================================================
PICO-8はLua言語で構築されていますが、Lua標準ライブラリは提供しません。代わりに
PICO-8の最小限の仕様と限定された画面サイズに適した少数のAPIを提供しています。
主要なAPIを使用する参考のプログラムとしては、/DEMOS/API.P8を参照してください。
ここで説明される関数は次の形式で書かれています:
関数名 引数 [オプション引数]
コンソールから使用するシステム関数は括弧と文字列の引用符を省略できます:
load blah.p8 --> load("blah.p8")
--------------------------------------------------------------------------------
システム
--------------------------------------------------------------------------------
load filename [breadcrumb [param_str]]
save filename
カートリッジを読み込み、または保存します。
成功するとtrueを返します。
実行中のカートリッジから読み込みを行うと、読み込まれたカートリッジはパラメー
ター文字列param_strを渡された上で即実行されます。またメニューアイテムには呼
び出し元のカートリッジに戻るためのカートリッジ名が追加されます。
'#'ではじまるファイル名は続くIDのBBSカートリッジから取得されます:
load("#1234") -- カートリッジ番号1234をダウンロード(+実行)する
もしIDがカートリッジの親ポストなら、最新のバージョンがダウンロードされます。
BBSカートリッジは他のBBSカートリッジまたはローカルのカートリッジから読み込め
ますが、エクスポートされたカートリッジからは読み込めません。
folder
ホストOS上でカートリッジフォルダを開きます。
dir (別名ls)
現在のディレクトリのすべてのファイルを表示します。実行中のプログラムから呼ば
れた時は、同じディレクトリにあるすべての.p8、.p8.pngファイルを返します。
run
プログラムを先頭から実行します。
プログラムをリセットするためにプログラム内部から呼ぶことが可能です。
stop [message]
カートリッジを停止して、必要に応じてmessageを表示します。
resume
現在のカートリッジ状態を維持したまま再実行します。(危険な方法です)
reboot
マシンを再起動します。
新しいプロジェクト開始する時に便利です。
info
以下のカートリッジ情報を表示します:
コードサイズ、トークン数、圧縮時のサイズ
flip
バックバッファを画面に表示して(30fpsとして)次のフレームを待ちます。
通常は使用しないでください -- _draw関数が代わりに呼びます。
プログラムがフレーム処理時間の終了前にflip関数を呼べず、_drawコールバック関
数が処理中でない場合、バックバッファの現在の内容が画面にコピーされます。
printh str [filename] [overwrite]
デバッグ用にホストOSのコンソールに文字列を出力します。
filenameが指定されていると、文字列をホストOS上のファイルに追記します。
// (現在のディレクトリのファイルです -- FOLDERコマンドで確認できます)
overwriteをtrueにするとファイルに追記ではなく上書きします。
ホストOSのクリップボードに書き込む場合は、ファイル名に"@clip"を指定します。
// クリップボードの内容はstat(4)で読み込めますが、(セキュリティ上の問題に
// より)実行中にユーザーがCTRL+Vを押した後にしか取得できません。
stat x
xの値に応じたシステムの状態を取得します:
0 メモリ使用量(0-1024)
1 最後の画面更新時のCPU専有率(1.0なら30fps換算でCPUを100%使用)
4 クリップボードの内容(ユーザーがCTRL+Vを押した後に有効)
6 パラメータ文字列
7 現在のフレームレート
16-19 チャンネル0-3で再生中のSFX番号
20-23 チャンネル0-3で再生中のノート番号(0-31)
24 現在再生中のパターン番号
25 演奏済みのパターン数
26 現在のパターンで演奏されたティック数(フレーム数)
80-85 UTC時間: 年、月、日、時、分、秒
90-95 ローカル時間
extcmd x
特別なシステム命令で、ローカルカートリッジ実行中のみ機能します。
xは文字列で、以下を指定できます:
"label" カートリッジラベルを設定します。
"screen" スクリーンショットを保存します。
"rec" アニメGIFの録画開始ポイントを設定します。
"video" アニメGIFをデスクトップに保存します。
"audio_rec" オーディオの録音を開始します。
"audio_end" 録音したオーディオをデスクトップに保存します。
--------------------------------------------------------------------------------
プログラム構造
--------------------------------------------------------------------------------
ユーザーが定義するとプログラム実行中に呼ばれる、3つの特殊な関数があります:
_update()
30fpsの更新タイミング毎に呼ばれます。
_draw()
画面の表示タイミング毎に呼ばれます。
_init()
プログラム開始時に一度だけ呼ばれます。
_draw関数は通常30fpsで呼ばれますが、間に合わない場合、PICO-8は15fpsで画面更新
を行い、代わりに1回の表示ごとに_update関数を2回呼びます。
:: PICO-8を60fpsで動作させる
_update関数の代わりに_update60関数が定義されると、PICO-8は60fpsモードで動作
します:
- _update60関数と_draw関数は60fpsで呼ばれます。
- 60fpsを維持すると、フレームごとに使用可能なPICO-8のCPU時間は半分になりま
す。
すべてのマシンが60fpsで動作可能ではないことに注意してください。古いマシンや
Web版プレイヤーでは、CPUが必要性能を満たしていても、PICO-8は30fps(または15
fps)で実行することを要求する場合があります。この場合、複数回の_update60が毎
回の_drawごとに呼ばれます。
--------------------------------------------------------------------------------
グラフィックス
--------------------------------------------------------------------------------
PICO-8では128の8x8サイズのスプライトと、マップの後半(共有データ)と重複する128
のスプライトを使用できます。この256のスプライトの集合はスプライトシートと呼ば
れ、128x128ピクセルの画像として扱うことができます。
すべてのPICO-8の描画命令は現在の描画ステートの適用対象となります。描画ステート
はカメラ位置(すべての座標にオフセットを加えます)、パレット割り当て(スプライト
の色を変更します)、描画範囲、描画色、塗りつぶしパターンを管理します。
描画ステートはプログラムが実行される度にリセットされます。これは以下のコードと
同じです:
clip() camera() pal() color() fillp()
色番号:
0 黒色 1 暗い青色 2 暗い紫色 3 暗い緑色
4 茶色 5 暗い灰色 6 明るい灰色 7 白色
8 赤色 9 オレンジ 10 黄色 11 緑色
12 水色 13 藍色 14 ピンク 15 桃色
clip [x y w h]
ピクセル単位で画面の描画範囲を設定します。
clip()でリセットします。
pget x y
pset x y [c]
画面の(x, y)のピクセルの色を取得、またはcに設定します。
sget x y
sset x y [c]
スプライトシートのピクセルの色を取得、またはcに設定します。
fget n [f]
fset n [f] v
スプライトのフラグの値を取得、またはvに設定します。
f: 0-7のフラグ番号です。
v: ブール値でtrueまたはfalseを指定します。
フラグ0-7の初期状態は、スプライトエディターの小さな色のついたボタンの列で設
定できます。
スプライトフラグの用途はユーザー次第です。どのスプライトのグループ(レイヤー)
をmap関数で描画するか指定するのに使うこともできます。
フラグ番号が省略されると、すべてのフラグはビット列として取得または設定されま
す:
fset(2, 1+2+8) -- ビット0、1、3を設定する
fset(2, 4, true) -- ビット4を設定する
print(fget(2)) -- 27 (1+2+8+16)
print str [x y [col]]
文字列を出力します。
strだけが指定された時、カーソルが画面の終端に到達すると、改行と縦方向のスク
ロールが自動的に行われます。
cursor x y
カーソル位置を設定します。
color col
描画関数で使用するデフォルトの描画色を設定します。
cls [col]
画面と描画範囲をクリアします。
camera [x y]
すべての描画命令について、画面のオフセットを(-x, -y)に設定します。
camera()でリセットします。
circ x y r [col]
circfill x y r [col]
半径rの円の輪郭線、または塗りつぶされた円を(x,y)に描画します。
rが負の値だと円は描画されません。
line x0 y0 x1 y1 [col]
直線を描画します。
rect x0 y0 x1 y1 [col]
rectfill x0 y0 x1 y1 [col]
矩形の輪郭線、または塗りつぶされた矩形を描画します。
pal c0 c1 [p]
後続する描画命令ですべての色c0をc1として描画します。
pal()でデフォルト色にリセットします。
(透明色と塗りつぶしパターンの設定も同時にリセットされます)
2種類のパレットがあります。(pはデフォルトでは0)
0 描画パレット: 描画時に色を変更します。
// 例: スプライトの色を変更する
1 画面パレット: 画面に表示されている色を変更します。
// 例: 画面のフェード
c0: 0-15の色番号
c1: 置き換える先の色番号
palt c t
指定した色の透過処理をt(ブール値)に設定します。
透過処理はspr、sspr、map関数で反映されます。
例: palt(8, true) -- 赤いピクセルは描画されない
palt()でデフォルトにリセットします: 色番号0以外の色は不透明になります。
spr n x y [w h] [flip_x] [flip_y]
(x, y)にn番のスプライト(0-255)を描画します。
デフォルトの幅wと高さhは1で、スプライト何個分の幅で描画するか指定します。
デフォルトでは色番号0は透明色として扱われます。(palt関数を参照してください)
flip_x: trueなら横方向に反転します。
flip_y: trueなら縦方向に反転します。
sspr sx sy sw sh dx dy [dw dh] [flip_x] [flip_y]
スプライトシート(sx, sy, sw, sh)から矩形を引き伸ばして(dx, dy, dw, dh)の矩形
として描画します。 // ピクセル単位で指定
デフォルトでは色番号0は透明色として扱われます。(palt関数を参照してください)
dwとdhはデフォルトではsw、shと同じ値になります。
flip_x: trueなら横方向に反転します。
flip_y: trueなら縦方向に反転します。
fillp p
PICO-8の塗りつぶしパターンは4x2の2色のタイルパターンで、以下の命令で参照され
ます:
circ() circfill() rect() rectfill() pset() line()
pは最上位ビットから始まる読み込み順のビット列です。希望するパターンのpの値を
計算するには各ビットの値を合計します:
.-----------------------.
|32768|16384| 8192| 4096|
|-----|-----|-----|-----|
| 2048| 1024| 512 | 256 |
|-----|-----|-----|-----|
| 128 | 64 | 32 | 16 |
|-----|-----|-----|-----|
| 8 | 4 | 2 | 1 |
'-----------------------'
例えば、FILLP(4+8+64+128+ 256+512+4096+8192)は市松模様になります。
これは二進数表記でもっとわかりやすくできます: FILLP(0b0011001111001100)
デフォルトの塗りつぶしパターンは0で、単色で描画されます。
2色目をパターンに設定するには、カラーパラメータの上位ビットを使用します:
FILLP(0b0011010101101000)
CIRCFILL(64,64,20, 0x4E) -- 茶色とピンク
追加ビット0b0.1で2色目を描画しないよう指定できます:
FILLP(0b0011010101101000.1) -- 透明な矩形による市松模様
--------------------------------------------------------------------------------
テーブル
--------------------------------------------------------------------------------
add t v
値vをテーブルtの最後に追加します。
t[#t+1] = vと同じです。
FOO={} -- 空のテーブルを作成する
ADD(FOO, 11)
ADD(FOO, 22)
PRINT(FOO[2]) -- 22
del t v
テーブルtの値がvの最初の要素を削除します。
キー番号が非連続にならないよう、残りの要素のキー番号は1つ分小さくなります。
vは削除される値であり、テーブルのキーではないことに注意してください!
del関数はテーブルの繰り返し処理中に、テーブルの要素に安全に使用することがで
きます。
A={1,10,2,11,3,12}
FOR ITEM IN ALL(A) DO
IF (ITEM < 10) THEN DEL(A, ITEM) END
END
FOREACH(A, PRINT) -- 10,11,12
PRINT(A[3]) -- 12
all t
(1から始まるキー番号を持つ)テーブルのすべての要素について、追加された順にFOR
ループで繰り返すために使用します。
T = {11,12,13};
ADD(T,14)
ADD(T,"HI")
FOR V IN ALL(T) DO PRINT(V) END -- 11 12 13 14 HI
PRINT(#T) -- 5
foreach t f
テーブルtの各要素に対して、要素を引数として関数fを呼びます。
FOREACH(T, PRINT)
pairs t
テーブルtについて、FORループで各要素のキーと値のペアを提供しながら繰り返すの
に使用します。all関数と違い、pairs関数はキーが連続する整数かどうかに関係なく
すべての要素を繰り返します。順序は保証されません。
T = {["HELLO"]=3, [10]="BLAH"}
T.BLUE = 5;
FOR K,V IN PAIRS(T) DO
PRINT("K: "..K.." V:"..V)
END
出力:
K: 10 v:BLAH
K: HELLO v:3
K: BLUE v:5
--------------------------------------------------------------------------------
入力
--------------------------------------------------------------------------------
btn [i [p]]
プレイヤーp(デフォルトは0)のボタンiの状態を取得します。
i: 0-5(左ボタン 右ボタン 上ボタン 下ボタン ○ボタン ×ボタン)
p: 0-7のプレイヤー番号
引数が指定されないと、プレイヤー0と1の計12ボタンすべての状態をビット列として
返します。// P0: ビット0-5 P1: ビット8-13
プレイヤーボタンのデフォルトのキーボード割り当ては以下になります:
プレイヤー0: カーソルキー + ZX / NM / CV
プレイヤー1: SDFE + TAB,Q / SHIFT A
btnp [i [p]]
btnpは"Button Pressed"の略です。ボタンが押されているとtrueを返す代わりに、
btnpはボタンが押されていて、前フレームには押されていなかったときにtrueを返し
ます。また、そのまま15フレーム経過すると、4フレームごとにtrueを返します。
(30fpsの場合 -- 60fpsだと倍になります) この機能はメニューの操作やグリッド単
位のプレイヤーの移動などに使えます。
--------------------------------------------------------------------------------
オーディオ
--------------------------------------------------------------------------------
sfx n [channel [offset [length]]]
n番のSFXをchannel(0-3)でoffset(0-31)の位置のノートからlength数分再生します。
nが-1でそのチャンネルのサウンドを停止します。
nが-2でそのチャンネルのループ再生を取り消します。
そのチャンネルで再生中のすべての音楽は停止します。
offsetはノート単位(0-31)です。
channelが-1で使われていないチャンネルを自動で選択します。(デフォルト)
channelが-2ですべての再生中のチャンネルのサウンドを停止します。
music [n [fade_len [channel_mask]]]
n番のパターン(0-63)から音楽を再生します。
nが-1で音楽を停止します。
fade_lenはミリセカンド単位です。(デフォルトは0)
channel_maskで音楽専用にどのチャンネルを予約するかを指定します
例: チャンネル0-2で音楽を再生する: 1+2+4 = 7
sfx関数でチャンネル番号が明示的に指定された時のみ、予約したチャンネルで効果
音を再生することができます。
--------------------------------------------------------------------------------
マップ
--------------------------------------------------------------------------------
mget x y
mset x y v
マップの(x,y)の値を取得、または値をvに設定します。
map cel_x cel_y sx sy cel_w cel_h [layer]
画面(ピクセル単位)の座標(sx, sy)にmapの指定領域(セル単位)を描画します。
layerが指定されると、同じフラグ番号がオンのセルのみが描画されます。
// 0x05なら、ビット番号の0と2がオンのスプライトを描画します。
// デフォルトではすべてのスプライトを描画します
例外: スプライト0は常に空として扱われます。
例: map(0,0, 20,20, 4,2)
画面の(20,20)にマップの(0,0)から始まる4x2のブロックを描画します。
--------------------------------------------------------------------------------
メモリ
--------------------------------------------------------------------------------
PICO-8には3種類のメモリがあります:
1. ベースRAM:
peek、poke、memcpy、memset関数でアクセスします。
下記のレイアウトを参照してください。
2. カートリッジROM:
ベースRAMの0x4300までと同じレイアウトです。
reload関数でカートリッジからベースRAMにコピーされます
3. Lua RAM (1MB):
コンパイル済みプログラムと変数です。
内部開発者以外は気にする必要はありません。
技術メモ: // 以下のことはおそらく知る必要はありません。
エディター使用中、変更されたデータはカートリッジROMの中に存在しますが、spr
やsfxのような関数はベースRAMに対して動作します。PICO-8は以下の3つのケース
で、カートリッジROMをベースRAMに自動的にコピーします。
1. カートリッジが読み込まれた時
2. カートリッジが実行された時
3. 各エディターから抜けた時
:: ベースRAMメモリレイアウト
0x0 グラフィックス
0x1000 グラフィックス2/マップ2(共有)
0x2000 マップ
0x3000 グラフィックス属性
0x3100 音楽
0x3200 SFX
0x4300 ユーザーデータ
0x5e00 カートリッジデータ(256バイト)
0x5f00 描画ステート
0x5f40 ハード状態
0x5f80 GPIOピン(128バイト)
0x6000 画面(8k)
ユーザーデータは決まった用途はなく、memcpy、peek、poke関数経由で何にでも使え
ます。カートリッジデータは0x5e00-0x5effに割り当てられ、cartdata関数が呼ばれ
た時だけ保存されます。グラフィックス/画面のカラーフォーマットは1バイト2ピク
セルで、下位ビットが各ペアの左のピクセルになります。マップフォーマットは1セ
ル1バイトで、各バイトは通常はスプライト番号を意味します。
peek addr
poke addr val
ベースRAMのアドレスの読み込み、または書き込みを行います。
正規のアドレス範囲は0x0-0x7fffです。
アドレス範囲外への読み込みまたは書き込みはエラーになります。
memcpy dest_addr source_addr len
ベースRAMのsource_addrからdest_addrへlenバイトコピーします。
コピー範囲は重複させることができます。
reload dest_addr source_addr len [filename]
memcpyと同じですが、カートリッジROMからコピーを行います。
コードセクション(0x4300以降)は保護されており読み込むことはできません。
ファイル名(.p8)が指定されると、異なるカートリッジからデータを読み込みます。
cstore dest_addr source_addr len [filename]
memcpy関数と同じように、カートリッジROMからコピーを行います。
cstore()はcstore(0, 0, 0x4300)と同じです。
カートリッジの作成ツールや、マップエディターやスプライトエディターが使用して
いるマップやスプライトシートの書き出しツールとして使用できます。
コードセクション(0x4300以降)は保護されており書き込めません。
ファイル名が指定されると、データは直接ディスク上の該当カートリッジに書き込ま
れます。64カートリッジまで1つのセッションで書き込むことができます。現在は.p8
フォーマットのみサポートされています。
cstore関数を使用
する際の追加の説明は'カートリッジデータ'セクションをご覧ください。
memset dest_addr val len
lenバイトをvalに設定します
(とても高速です -- クリップなしの水平方向スキャンライン等に使用できます)
--------------------------------------------------------------------------------
数学
--------------------------------------------------------------------------------
max x y
min x y
mid x y z
引数の中から、最大、最小、中間の値を返します。
例えばmid(7,5,10)は7を返します。
flr x
x以下の最も近い整数を返します。 // x-(x%1)
flr(4.1) --> 4
flr(-2.3) --> -3.0
cos x
sin x
xの余弦(cos)と正弦(sin)を返します。1.0が一周期になります。
画面に合わせるためsinは正負が逆転しています。
例: sin(0.25)は-1を返します。
yの反転をしないラジアンベースの三角関数が好みの場合は、プログラムの先頭に以
下のコードを挿入してください:
cos1 = cos function cos(angle) return cos1(angle/(3.1415*2)) end
sin1 = sin function sin(angle) return sin1(-angle/(3.1415*2)) end
atan2 dx dy
(dx, dy)を0-1の角度に変換します。
cos/sinと同様に、angleは画面上で反時計回りの方向になります。
例: atan(1, -1)は0.125を返します。
sqrt x
xの平方根を返します。
abs x
xの(正の)絶対値を返します。
rnd x
0以上x未満の乱数nを返します。
整数が必要な場合は、flr(rnd(x))を使用してください。
srand x
乱数のシードを設定します。
シードはカートリッジ起動時に自動的にランダム化されます。
ビット操作
band x y
bor x y
bxor x y
bnot x
shl x y
shr x y
// シフトは論理シフトです(符号ビットはシフトしません)
--------------------------------------------------------------------------------
カスタムメニューアイテム
--------------------------------------------------------------------------------
menuitem index [label callback]
ポーズメニューにメニューアイテムを追加します。
indexは1-5の範囲で、メニューアイテムの表示順序を決定します。
labelは16文字までの文字列です。
callbackはメニューアイテムが選択された時に呼ばれる関数です。
ラベルや関数が指定されなかった場合、メニューアイテムは削除されます。
例:
menuitem(1, "restart puzzle", function() reset_puzzle() sfx(10) end)
--------------------------------------------------------------------------------
文字列
--------------------------------------------------------------------------------
s = "the quick brown fox"
-- 長さ
print(#s) --> 19
-- 文字列の結合
print("three "..4) --> "three 4"
-- sub()で部分文字列を取得する
print(sub(s,5,9)) --> "quick"
print(sub(s,5)) --> "quick brown fox"
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
type val
変数xの型名を文字列として返します。
tostr val [hex]
valを文字列として返します。
hexがtrueでvalが数値の場合、符号なし16進数表記の値が"0x0000.0000"の書式で返
ります。PICO-8の数値の内部表現を確認するのに使うことができます。
valがブール値の場合、"true"または"false"と表記されます。
それ以外の型は"[型名]"と表記されます。
tonum val
valを数値に変換します。
valが文字列の場合、"0x"で始まらなければ十進数として解釈されます。
変換に失敗するとnilを返します。
--------------------------------------------------------------------------------
カートリッジデータ
--------------------------------------------------------------------------------
各カートリッジは(カートリッジそのものにではなく)ユーザーのPICO-8に64の数値(計
256バイト)をカートリッジデータとして保存することができます。これはハイスコアや
ゲームの進行状況のようなデータを保存する手軽な方法として使えます。
256バイトよりも大きいサイズが必要な場合、cstore関数を使って直接カートリッジに
書き込むことができます。この方法の欠点は特定バージョンのカートリッジにデータが
紐づけられてしまうことです。例えば、もしゲームが更新されるとプレイヤーはセーブ
データを失ってしまいます。
それ以外の方法は、cstore関数の4つ目の引数を指定して、2番目のカートリッジに直接
書き込むことです。この方法はカートリッジの交換を必要とし(その分少し遅くなりま
す)、ローカルフォルダで実行している場合はdata-cartのゴミが残ります。
またファイルは.p8フォーマットである必要があります:
cstore(0,0,0x2000,"spritesheet.p8")
cartdata id
カートリッジデータを有効にします。カートリッジの読み込みごとに実行します。
idは64文字までの文字列で、他のカートリッジが偶然同じidを使うことがないよう十
分にユニークである必要があります。
例: cartdata("zep_jelpi")
使用可能な文字はa-z、0-9、アンダースコア(_)です。
データが読み込まれるとtrueを返します。
cartdataはカートリッジ実行ごとに1度だけしか呼べません。
cartdata関数が呼ばれると、メモリの0x5e00-0x5effがカートリッジデータに割り当
てられ、直接またはdget/dset関数経由でアクセスできるようになります。
dget index
カートリッジデータの指定した領域(0-63)の値を取得します。
cartdata関数を呼んだ後に使用してください。
dset index value
カートリッジデータの指定した領域(0-63)に値を設定します。
cartdata関数を呼んだ後に使用してください。
書き込まれたデータの保存操作は必要ありません。
-- 直接poke関数で変更しても自動でストレージに保存されます。
--------------------------------------------------------------------------------
GPIO
--------------------------------------------------------------------------------
GPIOは汎用入出力(General Purpose Input Output)を表し、マシン間の通信を可能にし
ます。PICO-8は0x5f80-5fffの範囲をGPIOピンに割り当てており、poke関数(値の書き出
し -- 例: LEDを点灯させる)やpeek関数(値の読み込み -- 例: スイッチの状態を取得
する)による操作が可能です。
GPIOはホストプラットフォームによって異なる動作をします。
CHIP : 0x5f80-0x5f87がxio-p0 - xio-p7に割り当てられます。
Pocket CHIP : 0x5f82-0x5f87がGPIO1-GPIO6に割り当てられます。
// xio-p0とp1はケース内のプロトタイピング領域にあります。
Raspberry Pi: 0x5f80-0x5f8fはwiringPiピンの0-7に割り当てられます。
// 他のモデル向けの割り当ては http://wiringpi.com/pins/ を参照してください。
CHIPとRespbery Piの値はすべてデジタルで、0(L0W)または255(HIGH)になります。
GPIOピンにアクセスする際は、以下のようにPICO-8をルート権限で実行する必要がある
ことに注意してください:
sudo pico8
接続されたLEDを点滅させるシンプルなプログラムの例:
t = 0
function _draw()
cls(5)
for i=0,7 do
val = 0
if (t % 2 < 1) val = 255
poke(0x5f80 + i, val)
circfill(20+i*12,64,4,val/11)
end
t += 0.1
end
:: HTML
HTML/.jsとして出力されたカートリッジは整数のグローバル配列(pico8_gpio)をGPIO
ピンとして使用します。呼び出し元のHTMLは以下のように配列を宣言する必要があり
ます:
var pico8_gpio = Array(128);
--------------------------------------------------------------------------------
追加のLua機能
--------------------------------------------------------------------------------
PICO-8はLuaの上級者向けに、メタテーブルとコルーチンの機能を公開しています。
より詳しい情報は、Lua 5.2のマニュアルを参照してください。
:: メタテーブル
メタテーブルは特定の操作におけるオブジェクトの動作を定義するために用います。
例えば、加算できる2Dベクトルを実現するために、メタテーブル用に"__add"関数を
定義すると、'+'演算子を再定義することができます。
vec2d={
__add=function(a,b)
return {x=(a.x+b.x), y=(a.y+b.y)}
end
}
v1={x=2,y=9} setmetatable(v1, vec2d)
v2={x=1,y=5} setmetatable(v2, vec2d)
v3 = v1+v2
print(v3.x..","..v3.y) -- 3,14
setmetatable t, m
テーブルtのメタテーブルにmを設定します。
getmetatable t
テーブルtの現在のメタテーブルを返します。存在しない場合はnilを返します。
:: コルーチン
コルーチンはスレッドと同様に、プログラムを並行に実行する方法を提供します。
関数をコルーチンとして実行すると、yield()で処理を一旦停止し、同じ場所から処
理を再開できます。
function hey()
print("doing something")
yield()
print("doing the next thing")
yield()
print("finished")
end
c = cocreate(hey)
for i=1,3 do coresume(c) end
cocreate f
関数fのコルーチンを作成します。
coresume c [p0 p1 ..]
コルーチンcの実行または継続をします。パラメータp0、p1..はコルーチンの関数
に渡されます。
エラーなくコルーチンが完了するとtrueを返します。
エラーがあった場合はfalseとerror_messageを返します。
** コルーチン内の実行時エラーはプログラムの実行を止めません。assert関数の
中の処理をcoresume関数でラップするのは面白いアイデアです。assertに失敗する
と、coresumeによって生成されたエラーメッセージが表示されます。
assert(coresume(c))
costatus c
コルーチンcの状態を次の文字列で返します:
"running"
"suspended"
"dead"
yield
コルーチンの実行を一旦停止して、呼び出し元に戻ります。
--------------------------------------------------------------------------------
バージョン履歴
--------------------------------------------------------------------------------
v0.1.11d
Fixed: time() always returns 0 when there is no _update function
Fixed: (raspi) Keyboard stops responding after pressing CTRL-F, CTRL-Z
Fixed: (raspi) Double keypresses in sound editor when entering notes
Fixed: stat(6) pads parameter string with spaces
v0.1.11c
Added: Local and UT time queries using stat()
Added: host_framerate_control (config.txt) to improve performance on slower machines and web
Added: Control over cpu useage when running in background (-background_sleep_ms / config.txt)
Added: Windows icon in exported exe
Added: F11 to toggle fullscreen
Added: export -c switch to indicate transparent icon colour
Added: show_backup_messages (config.txt) to turn off backup notifications
Added: SFX instruments documentation in pico8.txt
Added: Error message when trying to export carts with code size over the compressed limit
Changed: If config.txt is not found, the same directory as the executable is searched
Changed: If sdl_controllers.txt exists in the same directory as the executeable, it is processed first
Changed: Shorthand if () statements must be written on a single line
Fixed: reload() from bundled, non-primary cart in exported html multicart reads only original data
Fixed: Exported binaries wrongly observe F7 (capture label)
Fixed: Loading carts from earlier versions alters SFX data not intended for audio
Fixed: Old version of fill patterns documentation near end of pico8.txt
Fixed: 'backed up unsaved changes' message displayed during runtime for cstored() carts
Fixed: PICO-8 runs too slowly when in background (new default background_sleep_ms: 20)
Fixed: Saving screenshots and videos from exported binaries are named 0_*
Fixed: Compressed size limit warning on save doesn't mention exported carts
Fixed: btn(), btnp() don't work in infinite loops
Fixed: btnp() timing inconsistent between 30fps / 60fps / during frame-skipping / with no _update
Fixed: Can't move between channels while music is playing in song mode
v0.1.11b
Fixed: Preprocessor bug regressions: "if (..) or", "a.b -= c - d"
Fixed: Crash when pressing menu button on an empty favourites list
v0.1.11
Added: Binary exporters (Windows, Linux, Mac OSX)
Added: Code tabs
Added: Splore cart menu
Added: Fill patterns
Added: Custom sfx instruments
Added: load("#1234") to load [and run] a BBS cart
Added: -x switch // execute a cart headless, for making command-line tools
Added: Compressed size display and limit warning lights in code editor
Added: CTRL-L to jump to a line number in code editor
Added: numbers can be written in binary: 0b10100010
Added: tostr(), tonum()
Added: extcmd(): audio_rec, audio_end to record all audio output.
Added: ls() returns a list of local files if called while running
Added: getmetatable()
Added: coroutine error reporting // wrap coresume() in assert()
Added: sfx() can take a 4th parameter: number of notes to play
Added: Live sfx and music editing + better navigation controls
Added: Transpose selected sfx notes relative to C by entering a note w/ SHIFT held
Added: Insert and delete sfx rows with enter and backspace
Added: Hidden note data is shown in sfx editor when relevant (slide, arps)
Added: Warning displayed when unsaved changes backed up
Added: Separate animation for downloading vs. loading a cart
Added: export -p switch to supply a customized html template
Added: Mousewheel when devkit mouse enabled: stat(36) // not supported in web
Added: < > to change zoom level in gfx and map editors
Changed: Rebalanced / fixed api cpu costs
Changed: Screenshot and gif filenames based on current cart if available
Changed: add() returns the added object
Changed: removed global hpf on audio
Changed: (sfx) can slide to volume 0
Changed: removed master low pass filter
Changed: assert() can take an optional error_message parameter
Changed: ? (shorthand for print()) can be prefixed by whitespace
Changed: shl(), shr() return 0 if second parameter >= 32
Changed: Automatically drop down to software blitting mode if opengl fails
Changed: Lua memory limit set to 2MB (was 1MB)
Changed: Some options (-width, -show_fps) apply only to the session; not saved to config.txt
Updated: Internal game controller mappings from SDL_GameControllerDB
Fixed: Pops & clicks in audio when switching between playing SFX
Fixed: Crash in audio mixer because of bad locking
Fixed: Crash when loading .p8 files with more than 64k of code
Fixed: Indexing of sparse tables fails after removing n/2 elements
Fixed: Calling stat() inside an infinite loop crashes
Fixed: Resetting cartridge corrupts cartridge data in range 0x5e00..0x5eff
Fixed: Can not recover from a cart error caused by glitchy data on resetting
Fixed: String->negative number conversion off by 0x0.0001 (-1 --> 0xffff0001)
Fixed: Crash when running cart closed to 64k char limit
Fixed: Cursor can't move to the right of last character in code editor
Fixed: Missing highlighted keywords: in, add, del, menuitem
Fixed: Preprocessor bugs: "a+=1+2\n*3", "a+=(1)ba=42", "a[(1)]+=1"
Fixed: Preprocessor performs replacements inside a string printed with ?
Fixed: Display freezes when terminating a program running at >100% cpu
Fixed: Quick-running (CTRL-R) clobbers some editor state (e.g. current sprite page)
Fixed: Loading a .p8 file with a future version reports a generic failure
Fixed: alt-enter to toggle fullscreen also triggers pause menu
Fixed: Splore scrolling jumps around when list gets too long
v0.1.10c
Fixed: atan flips sign for very negative values of x close to zero
v0.1.10b
Fixed: HTML exporter carts don't run
Fixed: HTML export 60fps support broken
Fixed: HTML export when path has a space in it (common for OSX)
Fixed: atan2 ignores sign of y
Fixed: (Raspberry Pi) Crash when access gpio not as root
v0.1.10
Added: Multi-cart export in html
Added: Cart reset glitch
Added: Demo carts: bounce, sort
Added: .p8 format can now store cart labels
Added: Splore navigation keys: pageup/down, home, end
Added: Splore useage hint shown on empty favourites list
Added: Warning on boot when data folder is read-only or can't be created
Added: Pressing tab with code selected indents those lines (shift-tab to un-indent)
Added: Double click word to select it
Added: Trigger screenshot/video/label capture from inside program: extcmd()
Changed: CTRL+left/right in code editor skips to end of word or span of non-whitespace
Changed: When a cart terminates from splore, button press is required to continue
Changed: load("@clip") can only be called from commandline (security)
Fixed: Can over-allocate host memory if exceed it within one frame
Fixed: atan2(-1, -32768) crash, and error for small values of dy
Fixed: (Web) using cstore() on self causes unloadable cart (bug introduced in 0.1.8?)
Fixed: (web) Pressing ctrl-v crashes the player (should do nothing)
Fixed: (Raspberry Pi) WiringPi library required in static build
Fixed: (Raspberry Pi) Crash on exit when launching via desktop icon
Fixed: (Raspberry Pi) keyboard input broken (observed on raspi2s)
v0.1.9b
Added: Alternative function key mapping: ctrl-6..9 for F6..F9
Added: Alternative glyph entry method: (ctrl-k) to toggle glyph mode
Changed: Enter glyphs with shift a..z, but can be disabled in config.txt
Changed: Increased emscripten ram to 128MB (some carts at risk of running out)
Fixed: Crash when window size is tiny or minified
Fixed: Crash on toggling fullscreen mode
Fixed: printh can write files outside filetree (security issue)
Fixed: show_fps (can also now be toggled with ctrl-1)
Fixed: Shorthand if/then syntax error when using the form: (functionname)(param)
Fixed: log.txt not saved in path specified by -home switch
Fixed: Default application data folder created even when -home specified
Fixed: Missing dynamic builds (pico8_dyn) from linux archives
Fixed: Removed unneeded RPATH from linux binaries
Fixed: export foo%d.wav fails to write multiple files
v0.1.9
Added: Copy and paste sprites and whole cartridges directly to BBS posts
Added: JAM category in splore
Added: GPIO support for Raspberry Pi
Added: Read clipboard using stat(4) after user presses CTRL-V
Added: printh() can optionally write to a file or the host clipboard
Added: Editor tool information and tips shown on mouseover
Added: Set desktop path with -desktop (screenshots and gifs are saved here)
Added: Warning on saving .p8 when compressed code size exceeds .p8.png limit
Added: Alternative editor colours // config.txt: gui_theme 1
Added: Dotted line every 8 rows in song view
Added: -screenshot_scale (default: 3) and -gif_scale (default: 2)
Added: Can use ctrl-up, ctrl-down to jump to start and end of code
Added: CTRL-M to mute/unmute sound
Added: HTML5-exported carts support 60fps
Added: Timeout switch for splore downloads: -timeout
Changed: Glyph characters typed with alt + a..z
Changed: stat(0) does not include allocations waiting to be garbage collected
Changed: Unfiltered screen stretching at integer scales by default
Changed: Removed -aspect and -scale settings (use draw_rect instead)
Fixed: -home has no effect under Windows
Fixed: Sometimes frame skipping starts before CPU useage has reached 100%
Fixed: Double-speed BTNP() timing in 60fps mode
Fixed: Exported HTML fails when _update60 is used instead of _update
Fixed: Can't copy and paste button glyphs
Fixed: Lines containing glyphs do not scroll far enough horizontally
Fixed: Loading .p8 renamed as .p8.png from splore freezes
Fixed: Bucketfill in map doesn't sync to shared memory
Fixed: fset fails when de-setting flags
Fixed: Syntax error when beginning with the form: IF (..) [OR|AND]\n
Fixed: cls() costs twice as much cpu as it should
Fixed: wav file exporter missing some data / writing truncated buffers
Fixed: Entering new notes in song view doesn't observe current volume, instrument
Fixed: alt-tab sometimes generates alt character text entry event
Fixed: Resuming a cancelled download in splore causes crash
Fixed: Controller attributes in log.txt always shown as -1
v0.1.8
Added: 60fps support
Added: Music exporter
Added: Custom GIF length (maximum 120 seconds)
Added: -,+ to navigate sprite tabs, sfx, music patterns
Added: sfx editor: navigate with home, end, pageup/down, mousewheel
Added: <, > to modify sfx speed, or click and drag
Added: Middle mouse button to pan around spritesheet / map
Added: Shortcut command for splore: S
Added: Pre-installed selection of BBS cart (use INSTALL_GAMES)
Added: Warning when saving .p8.png with no label
Added: (OSX) logging to ~/Library/Logs (viewable with Console.app)
Added: -pixel_perfect switch (on by default)
Added: -draw_rect switch
Changed: Can not CTRL-S save over a loaded bbs cart
Changed: Only .p8 files listed by dir() and by splore
Changed: Command history increased to 256
Changed: exit() / shutdown() have no effect while running cart
Fixed: Memory useage (stat(0)) inconsistent across host platforms
Fixed: Spinny disks shows when reloading current cart with load()
Fixed: GIF saver does not respect 64x64 / mirrored modes
Fixed: Miscellaneous multi-line comments / strings issues
Fixed: Empty map cels cost cpu in mapdraw()
Fixed: mapdraw() slowdown when drawing bottom half of map
Fixed: preprocess changes semantics when += and : operators on same line
Fixed: Identifiers starting with underscore counted as extra token
Fixed: Saving .png exceeding compressed code limit fails silently
Fixed: Right-clicking a sprite does not set the currently edited sprite
Fixed: (Windows) extra space added to pasted lines
Fixed: spr() expensive when drawn with low negative coordinates
Fixed: pipe character identical to colon character
Fixed: (Raspberry Pi) shift key appends a character when entering text
Fixed: Editor mode buttons are still clickable during cart runtime
Fixed: When loading a .p8.png file, label is reset and needs to be re-captured
Fixed: export() does not report failure
Fixed: mset()'d changes in shared memory not readable via peek() / sget()
Fixed: cstore() saving edited code
Fixed: audio pop between patterns during music playback
v0.1.7
Added: menuitem()
Added: button glyphs in code (shift-L, R, U, D, X, O)
Added: Customisable data directory (e.g. pico8 -home mydata)
Added: Web gpio pins: read and write pico8_gpio[] in javscript
Fixed: SPLORE search doesn't reset
Fixed: Splore skipping 33rd cart listing after loading more items
Fixed: Crash when selecting a local binary file in splore
Fixed: Semicolon can't be used as a list or statement separator
Fixed: Exported html can not cstore self
v0.1.6
Added: SPLORE local & bbs cartridge explorer
Added: setmetatable(), cocreate(), coresume(), costatus(), yield()
Added: Spinning cart icon to show when a cart is swapped / written to
Added: Permanent storage when carts played in a browser
Added: Adjustable aspect ratio (-aspect 420 for 1:1)
Changed: Lua memory limit: 1024k (was 512k)
Changed: Music channel now resumes after being clobbered by an sfx
Changed: Arpeggios double speed when SFX speed <= 8
Changed: Exceeding compressed code limit does not block saving in .p8 format
Changed: spr() half as expensive, to be consistent with map()
Changed: Fractional hex number notation: 0x0.3 == 0x0.3000, (was 0x0.0003)
Changed: : operator doesn't count as an extra token (same as .)
Changed: cstore() writes directly to disk
Changed: cstore(), reload() return number of bytes read / written
Changed: save() while running does nothing. (use cstore() instead)
Changed: load() while running loads and runs the specified cartridge
Fixed: Small pops in audio mixer caused by sound wave discontinuities
Fixed: HTML5-exported sound clicks badly under Chrome
Fixed: Display palette is not oberserved when exporting GIFs
Fixed: Rapid keypresses causes duplicate readings in tracker & text editor
Fixed: += inside comments breaks preprocessor
Fixed: sspr() cpu cost the same when clipped
Fixed: cartdata() with bad parameters crashes
Fixed: EXPORT from commandline can not be used without brackets and quotes
v0.1.5
Added: Raspberry Pi Build
Added: Keyboard configuration for player buttons (KEYCONFIG)
Added: Music tracker select / copy / paste
Added: Single-level undo in audio tools
Added: Live preview of frequencies in sound editor
Fixed: Command history extends past last reboot
Fixed: Sfx exporter broken
Fixed: Slashes at end of path resolve to double slashes
Fixed: Load cart from commandline under Windows
v0.1.4d
v0.1.4c
Fixed: International character entry inserting extra characters
Fixed: Lines with tabs have broken cursor placement and display boundary
v0.1.4b
Fixed: OSX command-key combinations broken
v0.1.4
Added: spritesheet importing and exporting with import("blah.png"), export("blah.png")
Added: sfx exporting with export("blah%d.wav")
Added: External cartridge parameter for reload() and cstore()
Added: Persistent cartridge data mapped to 0x5e00
Added: Click token limit to toggle token & char limit display
Added: assert(), type()
Added: P to pause
Changed: code char limit: 64k (was 32k)
Changed: local declarations and semicolons not counted as tokens
Changed: Pairs of brackets and block delimitations count as one token
Changed: Only _update() or _draw() need to exist to enter main loop
Changed: Allow forward-slash in code editor
Changed: info() reports current (last loaded or saved) filename
Changed: html5 version compiled with NO_DYNAMIC_EXECUTION
Changed: can only cstore up to 64 different files in one session
Changed: load() automatically copies data section of cart to base ram
Fixed: Shift-drag-copy sprites -> paste only pastes 1x1
Fixed: ".." should count as one token
Fixed: Tracker displaying D instead of .
Fixed: Multi-line comments
Fixed: Crash on run when code close to char limit
Fixed: When over token limit, can not run any command
Fixed: Unused high bits in SFX section not saved in .p8 format
Fixed: Camera position memory mapping out of sync
Fixed: pico8.txt link broken in windows installer
Fixed: print() crashes when parameter is not a string or numbers
Fixed: Multi-line strings & escape chars mess up tokenizer and print()
Fixed: Joystick not responding when left stick is up to the left
Fixed: Alt-F4 saves screenshot before quitting
Fixed: Sprite editor mode button doesn't show fullscreen mode
Fixed: -sound parameter not working in html5 version
v0.1.3
Added: paste into commandline
Fixed: lua standard libraries accessible
Fixed: command-line loading doesn't work
Fixed: music pattern finished too early when all tracks set to looping
Fixed: peek()ing odd bytes in sfx address space masks bit 7
Fixed: cstore and reload from code space should have no effect
v0.1.2
Added: html5 cartridge exporter
Added: Cartridge save data (64 fixed point numbers)
Added: 8-player input
Added: Demo carts: COLLIDE and BUTTERFLY
Added: Command-line parameters // load cart, -run, settings
Added: Alternative function keys (F6..F9 aliased as F1..F4)
Added: pairs()
Added: printh() for debugging
Added: Tab completion for filenames in console
Added: stack trace on runtime error
Changed: music pattern length taken to be first non-looping channel's length
Changed: noise instrument (6) has low frequency white noise scaled by volume
Changed: screenshot captures whole window contents at display resolution
Changed: del() moves remaining items up one index to maintain a packed table
Changed: add(),del(),count(),all() no longer store extra fields
Changed: removed count() from docs -- now just a legacy function. Use # operator instead.
Changed: cursor only blinks while window is active
Changed: peek(), poke() and binary operations (band()..) have no function call overhead
Changed: yellow slightly warmer
Changed: No camera snapping after pan in map mode
Fixed: sqrt() crashing for 0 or >= 32761
Fixed: Semi-colon characters in text editor
Fixed: Long lines split when saving in .p8 format
Fixed: pget() does not respect camera position
Fixed: Error message when peeking or poking outside of legal address space
Fixed: Search replace colour fills one pixel outside of selected region
Fixed: Playing an empty music pattern breaks subsequent music playback
Fixed: Invalid sfx editing state on startup
Fixed: Painting instruments values in frequency view also sets volumes
Fixed: Inconsistent gif recording speeds
Fixed: Unmapped joystick support
Fixed: Compressed code size sometimes larger than uncompressed
Fixed: mid() fails when first argument is not smallest
Fixed: Scroll wheel changes sprite/map zoom while in code editor
Fixed: CTRL-R (quick-run) drawing over current line in command mode
Fixed: Label capture (F7) does not respect screen palette state
Fixed: Syntax highlighting of api functions and hex numbers
Fixed: Looping to 0 with negative step finishes at 1
Fixed: nil values printed as false instead of nil
Fixed: Hexedecimal fractional parts
Fixed: btnp() unresponsive when skipping frames
Fixed: Editing mode is lost when using ctrl-r to run
Fixed: Tracker note entry keys mapped, messing up piano-like layout
Fixed: Shared gfx/map memory out of sync after some editor operations
Fixed: Alt-gr character entry
Fixed: Can map display palette to entries >= 16 using poke()
Fixed: Using shift to select in code editor has wrong selection range
Fixed: Dragging above top of text causes selection to flip to end
Fixed: Duplicate at end of file listing
v0.1.1
Added: Token-based code limiting (8192 tokens, 32k ascii text)
Added: Freeform move, pan and selection in sprite and map editors
Added: Flood-fill tool (sprite and map)
Added: .GIF saver
Added: CTRL-Stamp to stamp with transparency
Added: Single-step undo for map and sprites
Added: 2x2 brush
Added: sqrt(), atan2()
Added: CTRL-S to quick-save
Added: CTRL-R reloads .p8 file and runs (useful for external text editing)
Added: Automatic backups on overwriting or quitting without saving
Added: Scroll wheel zooms in sprite editor
Added: Customisable resolution // e.g. pico8 -width 580
Added: Strings highlighted as green
Added: ALT-click can optionally simulate right click (see config.txt)
Added: palt() to control transparency for spr(), sspr()
Added: info()
Changed: load() tries adding .p8.png, .png if file doesn't exist
Changed: Draw operations apply only to selection when active
Changed: Move operations (cursors) apply to selection if present
Changed: Removed time()
Changed: Random seed is random on cart startup
Changed: api functions never read directly from cart rom
Changed: sspr() can take negative values for dw, dh
Fixed: Sparse table indexing with integers fails
Fixed: Assignment operators and shortform if-then-else failing
Fixed: sspr() failed when w0 == 128
Fixed: Circle drawing broken when camera not (0,0)
Fixed: CPU hogging
Fixed: Noise instrument clobbers rnd() sequence
Fixed: Audio system not resetting on program reset
Fixed: % operator sometimes wrong for negative values
Fixed: Length operator (#)
Fixed: Power operator (^)
Fixed: Line clipping bug on right and bottom edges
Fixed: print() precision for whole numbers
Fixed: print() broken for negative y values
Fixed: tokenization and keyword highlighting
Fixed: sprite properties not copied/pasted
Fixed: Only sfx 0..32 could be used as music patterns
Fixed: Saving and loading a .p8 file adds newline to end of code
Fixed: Drag selection to left margin in code editor -> selects all
v0.1.0
Added: demo cart: hello.p8 (use install_demos)
Added: CTRL-R from anywhere to run cart or restart cart
Added: use a,s to select colour in gfx editor
Added: consistent operation cpu costs
Added: btn(), btnp() with no arguments returns bitfield
Added: fget(id) returns bitfield of that sprite's flags
Changed: renamed mapdraw() to map() for consistency
Changed: default sleep time is 5ms (better cpu consumption for laptops)
Fixed: memory limiter
Fixed: wonky line and circle drawing
Fixed: shift-click volume in sfx editor to set all
Fixed: number formatting is now never in scientific notation
Fixed: clipped error messages in console
Fixed: text undo stores rollback points when chaning line number
Fixed: print(str) carriage returns to previous x
v0.0.5
Added: help()
Added: Ctrl+F / Ctrl+G to search for text, repeat search
Added: del key in code editor
Added: Short-hand single-line IF statements
Added: Unary operators += -= /= *= %=
Added: srand(), time(), added rnd() to docs
Added: Ctrl+D to duplicate line
Added: interactive ls() for multi-page file listings
Added: band() bor() bxor() bnot() shl() shr()
Added: runtime error line number
Added: dir() (aliased to ls())
Changed: print() only autoscrolls when called with no parameters
Changed: alt+up/down to skip between function definitions (was ctrl)
Changed: sspr() dw, dh defaults to sw, sh
Fixed: Load crashes on files that are not .p8 format or directories
Fixed: Misc editor cursor position glitches
Fixed: Crash when syntax error occurs before viewing code
Fixed: Broken newlines after rebooting
Fixed: mkdir() called with no parameters creating "(null)" directory
Fixed: scrolling past top of code with scrollwheel
Fixed: alt-f4 to fastquit
v0.0.4
Added: Jelpi demo cart
Added: Internal carts // use install_demos()
Added: Joystick support
Added: Undo/redo in code editor
Added: Scroll wheel in code editor
Added: LCTRL + UP/DOWN to navigate functions in code editor
Added: LALT + LEFT/RIGHT to switch editing modes
Added: btnp()
Added: Release looping sample (a in editor , sfx(-2, channel) in code)
Changed: Music stops when pausing program execution
Changed: Allow 8 settable sprite flags
Changed: Made noise instrument more bassy
Fixed: Home, end keys
Fixed: Sprite flags 4,5 not saved
Fixed: mset() discarding 4 high bits
Fixed: Crash when highlighting long strings
v0.0.3
Added: Palette mapping type 1 (on display)
Added: Collections can be initialized with c={1,2,..}
Added: holdframe() // used automatically by _draw(), update()
Added: Sprite selections and operations across selections
Added: Map selection and stamp tool
Added: Immediate mode screen buffer preserved while switching views
Added: Channel mask for music playback
Added: Memory mapping for live sound data
Added: .png cart format
Added: Sprite navigation by keyboard (-, +)
Fixed: Strict 4-channel sound
Fixed: Automatic sfx channel selection (channel index: -1)
v0.0.2
Added: Command history
Added: P2 keys
Added: Boot sequence
Added: Windows, 64-bit linux builds
Added: CPU cost of internal api functions
Added: Separate song channel index and mute status
Added: Memory mapping
Added: Search/replace colour in sprite editor
Added: Copy/paste sprites and map regions
Improved: Immediate mode command editing
Improved: Editor cursor behaviour
Fixed: Automatic audio channel selection
v0.0.1
First Alpha
You can’t perform that action at this time.