================================================================================ 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