プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

3号プログラミング 覚え書き(6) スマイルボタン編

・スマイルボタンに設定したプログラムはSLOT 4で実行される。
 SLOT 4には他のスロットにはない特有の制限、機能がある。

・スマイルボタンに設定したプログラムからスロット指定なしでEXECされたプログラムもSLOT 4で実行される。
 この時、読み込まれたファイルはSLOT 4で実行されるので、SLOT 4の制限が課される。
 ただし、SLOT 0〜3にLOADして、EXEC スロット番号とする場合はこの限りではない。SLOT 0〜3に読み込まれたライブラリも同様。EXEC "PRGスロット番号:ファイル名"もスロットにロードしてからEXECするので同様。

 スマイルボタンに設定されたプログラム、および、そのプログラムからスロット指定なしでEXECされたプログラムは、いずれも動作が同じになるので、以下では「SLOT 4で実行されるプログラム 」ということにする。

・COMMON DEFが使えない
 SLOT 4で実行されるプログラム中にCOMMON DEFがあると、「Can't use in tool program」というエラーになる。

・SLOT 4でのみ、他のプロジェクトのファイルをEXECで直接実行できる
 SLOT 4で実行されるプログラムについてのみ、EXEC "プロジェクト名/ファイル名" とすると、他のプロジェクトのファイルを直接実行できる。

 なお、SLOT 0〜3でEXEC "プロジェクト名/ファイル名"を実行するとIllegal function callになる。

CHKFILEで指定するファイル名に必ずファイル種別を付ける必要がある
 以前はSLOT 4で実行する場合はファイル種別を付ける必要があったが、現在(Ver.3.2.1で確認)ではSLOT 0〜3と同様につける必要がなくなった。

SMILE BASIC 小技(6)

INC,SHIFT,UNSHIFT,PUSH,POPは文字列にも使うことができる。

VAR A$="ABC",C$

INC A$,"DEF"   '文字列の最後に追加
PRINT A$       'ABCDEF
C$=SHIFT(A$)   '文字列の先頭の一文字を取る
PRINT C$,A$    'A   BCDEF
UNSHIFT A$,"Z" '文字列の先頭に文字を付け加える
PRINT A$       'ZBCDEF
PUSH A$,"G"    '文字列の最後に文字を加える
PRINT A$       'ZBCDEFG
C$=POP(A$)     '文字列の最後の一文字を取る
PRINT C$,A$    'G   ZBCDEF

DECは文字列には使えない模様。(使い方を知ってたら教えてください。)

なお、これらの命令・関数は、文字列を参照型として扱う。
参照型とは何かをここで詳しく書くことはできないが、
概ね以下のように思っていただければよい。

通常、
VAR A$="ABC"
A$=A$+"D"
のようにすると、"ABC"とあったメモリの場所とは別の場所に”ABCD"という文字列が作成され、A$はそこを指すようになる。
これが普通の文字列の動作。

しかし、上記の参照型の命令(例えばINC)の場合、"ABC"とあったメモリの位置に"D"が追加されて、結果として"ABCD"になる。

これはPRINT命令でA$を表示した結果は同じなので、まったく同じことのようだが、別の変数に参照を代入した場合に違いが出てくる。

VAR A$="ABC"
VAR B$=A$
A$=A$+"D"
PRINT A$  'ABCD
PRINT B$  'ABC
VAR A$="ABC"
VAR B$=A$
INC A$,"D"
PRINT A$  'ABCD
PRINT B$  'ABCD

ここで詳しく説明できないので、詳細は別項を立てる。

SMILE BASIC 小技(5)

コンソールへのPRINT時に文字列をセンタリング(中央によせて表示すること)したいことは多い。
LOCATEのX位置を決めるには、画面幅(50文字)の半分(25文字)から、表示したい文字列の長さの半分を引けばよい。
毎回計算するのはめんどうなので、次のような記述を使う。

A$="文字列"
LOCATE FLOOR(25-LEN(A$)/2),CSRY
PRINT A$

問題になるのは文字列の長さが奇数になる場合で、2で割り切れないので左半分と右半分のどちらが長くなる。
これは個人の好みでどちらかに寄せるしかない。
私は左半分の方を少しだけ長くなるようにした。
右半分の方を少しだけ長くしたい場合は、上記の2行目を

LOCATE FLOOR(25.5-LEN(A$)/2),CSRY

に変えればよい。(FLOORの中に0.5を足す。)


少し応用して、上下画面、WIDTHのサイズに対応するようにしたのが以下。

A$="文字列"
D%=DISPLAY()
W%=WIDTH()
LOCATE FLOOR((50-D%*10)/S%/2-LEN(A$)/2),CSRY
PRINT A$

なお、XSCREEN 4の時は、上画面が幅50文字から40文字になるが、現状(Ver.3.2.1)ではXSCREENの設定をとる方法がないので、上記はXSCREEN 4に対応していない。
XSCREEN 4の時は、

LOCATE FLOOR(20/S%-LEN(A$)/2),CSRY

とする。

ドルアーガの塔 アドベンチャーシート for プチコン3号 (β2版)

ゲームブックドルアーガの塔」アドベンチャーシート for プチコン3号 (β2版)

β(ベータ)版ですが、よければどうぞ。
マッピングはそのうち入れたいです。

プロジェクト名: EDDRU

公開キー: 4D2PEE7D
DKENNJ3Y K5N353KV XRKE73AV RS3XY3NJ RE3YN3Q4

公開日: 2016/10/02
2016/04/04 2016/03/20 2016/03/16 2016/03/13

バージョン: 0.12
0.10 0.09 0.08 0.06 0.07

幻想迷宮書店さんが、ゲームブックドルアーガの塔を、Kindle版にしたものを発売していらっしゃいます。
(元は1986年に東京創元社から刊行され、後に2000年代になってから創土社から復刊されました。創土社版はゲームバランスほかに若干の修正がなされています。Kindle版は創土社版を元に電子書籍化したものになっています。)
Kindleなので、アドベンチャーシートは自前で用意することになりますが、そのアドベンチャーシートをプチコン3号で作りました。(マッピングとかまだ...)
Kindleでまだ買ってない人は買いませう。(アフィやってないです...)

悪魔に魅せられし者 ドルアーガの塔 (幻想迷宮ゲームブック) Kindle版
魔宮の勇者たち ドルアーガの塔 (幻想迷宮ゲームブック) Kindle版
魔界の滅亡 ドルアーガの塔 (幻想迷宮ゲームブック) Kindle版

400〜500円と超お買い得になってます。

■履歴
(10/02)漢字ライブラリによる漢字表示と、なかくんさんの日本語入力FEP「UTIL」への対応
(04/04)ダイスタブにクリアボタン追加、誰の攻撃ターンかを示すことができるラジオボタンを追加、一部項目名をアイコンに差し替え
(03/20)起動時にファイル名入力をキャンセルするとエラーになるバグ修正、セーブデータにセーブ日時を追加、ダイスタブにクリアボタンを追加
(03/16)漢字入力IMEとしてEDKANJIPNL ver0.09を組み込み。EDKANJIPNLの操作ガイドが表示されます。
(03/13)EDKANJIPNLを取り込んで、入力フォームで日本語入力できるようにしました。
辞書にゲームブックドルアーガの塔で使いそうな単語を登録しておきました(何が入っているかは秘密)。
ダイスロールを付けました。
ダイスタブに戦闘用の敵項目記入欄を追加しました。
終了用アイコンを追加しました。
数値入力パネルに簡易計算機能を追加しました。
<今後の予定>
・アイコンのグラフィック
・(はるか未来) マッピング

★重要:スロット3へのオートセーブ
間違えて終了してプログラムの変数が消えてしまうと悲しいので、項目をどこか更新すると、数秒後にスロット3にオートセーブします。

EDDRUを起動時にスロット3にセーブデータがあればそれを読み込みます。したがって、プログラムを中断しても、再度STARTすると中断前の状態からはじまります。

起動時にスロット3にセーブデータがなければLOAD画面に移りファイルを指定します。キャンセルすると1巻の初期値が表示されます。

手動でファイルにセーブしたい時は、画面左下のファイルアイコンをタップしてセーブしてください。

★セーブ形式
テキストファイル(JSON形式)になっていますので、プログラム本体がバージョンアップしてもセーブ形式に互換性がなくなることはないようにしています

★UTILの導入方法
「UTIL」はなかくんさんが開発された、日本語入力プログラムです。
文字が大きく、とても使いやすいので今回は外部IMEとして対応するようにしました。
UTILは同梱していないので、自分でダウンロードして、EDDRUのフォルダにコピーする必要があります。

なお、UTILをコピーしない場合でも、内蔵のIMEであるEDKANJIPNLで日本語入力が可能です。

UTILの導入の仕方は、UTILのバージョンによって異なります。現在はVer.2.20とVer.3.00に対応しています。
・UTIL Ver.2.20をお持ちの場合
 EDDRUのフォルダに、UTILフォルダから「UTIL」というファイル1個をコピーしてください。
・UTIL Ver.3.00をお持ちの場合
 EDDRUのフォルダに、UTILフォルダから「UTIL」「KDAT_P」「KDAT_SG12」「KDAT_SG16」「UF_DIC」というファイル計5個をコピーしてください。

上記ファイルをコピーしておくと、起動時に自動的に読み込まれ、プログラム内で日本語入力に使えるようになります。


■その他蛇足


ダイスにはちょっとだけこだわりがあり、サイコロの三次元的な回転を考慮しています。
といっても三次元で計算しているわけではなく、有向グラフでの状態遷移で表現しています。(例えば、2→1と回転してきた時は、次に遷移するのは3,4,5のいずれか)
なお、一様分布の試行の組み合わせ(掛け算)なので、結果も一様分布になるはずですが、実際に1000回くらい試行しても結構な片寄りがあります。(もとにしているRNDの性質によるものだと思いますが、改善が難しいので了承の上でお使いください。)

あと、画面上でのサイコロ同士の衝突はいい加減です。
本当ならば運動量保存則を使って計算すべきなのでしょうが、とりあえずそれっぽく見えるのでそのままにしています。

サイコロ同士の衝突は、弾性衝突だと仮定すれば、単にお互いの速度を入れ替えればいいだけだと気付いたので、その方針で修正しました。
と思ったら、近い速度で衝突するとサイコロ同士が重なりあって無限ループになるバグが発生するようになってしまった。
とりあえず前の版の公開キーを生かしてあるので、そちらを使ってください。

判定を見直してバグが解消したので衝突を修正した版の方を公開しました。

■その他蛇足2

実はプチコン3号版の以前にmkIIで同じものを作っていた。
ゲームブック ドルアーガの塔のアドベンチャーシートをプチコンで

しかし、文字入力にカタカナしか使えないチープさと、マッピングの箇所で難儀して挫折。。。
今回はその反省を生かし、文字入力にはすでに作ったIMEを組み込み、マッピングはとりあえずほったらかし、とした。
だけどマッピングはそのうちどうにかしたい。。。

ドルアーガの塔 アドベンチャーシート for プチコン3号 (β版)

ドルアーガの塔 アドベンチャーシート for プチコン3号 (β版)

β(ベータ)版ですが、よければどうぞ。
マッピングはそのうち入れたいです。

プロジェクト名: EDDRU

公開キー: 5323VXKY → 最新版はhttp://d.hatena.ne.jp/eidaht/20201231/1338118772からどうぞ

公開日: 2016/03/12

バージョン: 0.05


EDKANJIPNLを取り込んで、入力フォームで日本語入力できるようにしました。
辞書にゲームブックドルアーガの塔で使いそうな単語を登録しておきました(何が入っているかは秘密)。
ダイスロールを付けました。
<今後の予定>
・アイコンのグラフィック
・(はるか未来) マッピング


★重要:スロット3へのオートセーブ
間違えて終了してプログラムの変数が消えてしまうと悲しいので、項目をどこか更新すると、数秒後にスロット3にオートセーブします。

EDDRUを起動時にスロット3にセーブデータがあればそれを読み込みます。したがって、プログラムを中断しても、再度STARTすると中断前の状態からはじまります。

起動時にスロット3にセーブデータがなければLOAD画面に移りファイルを指定します。キャンセルすると1巻の初期値が表示されます。

手動でファイルにセーブしたい時は、画面左下のファイルアイコンをタップしてセーブしてください。


★セーブ形式
テキストファイル(JSON形式)になっていますので、プログラム本体が

ドルアーガの塔 アドベンチャーシート for プチコン3号 (続続α版)

ドルアーガの塔 アドベンチャーシート for プチコン3号 (続続α版)

ほとんどが工事中のα(アルファ)版ですが、よければどうぞ。
ある程度のところまでは速攻でアップする予定です。

プロジェクト名: EDDRU

公開キー: C3ENQXDF → 最新版はhttp://d.hatena.ne.jp/eidaht/20201231/1338118772からどうぞ

公開日: 2016/03/11

バージョン: 0.04


EDKANJIPNLを取り込んで、入力フォームで日本語入力できるようにしました。
辞書にゲームブックドルアーガの塔で使いそうな単語を登録しておきました(何が入っているかは秘密)。
<今後の予定>
・サイコロ 1個または2個のサイコロ振り 履歴が残る
・アイコンのグラフィック
・(はるか未来) マッピング


★重要:スロット3へのオートセーブ
間違えて終了してプログラムの変数が消えてしまうと悲しいので、項目をどこか更新すると、数秒後にスロット3にオートセーブします。

EDDRUを起動時にスロット3にセーブデータがあればそれを読み込みます。したがって、プログラムを中断しても、再度STARTすると中断前の状態からはじまります。

起動時にスロット3にセーブデータがなければLOAD画面に移りファイルを指定します。キャンセルすると1巻の初期値が表示されます。

手動でファイルにセーブしたい時は、画面左下のファイルアイコンをタップしてセーブしてください。


★セーブ形式
テキストファイル(JSON形式)になっていますので、プログラム本体が

ドルアーガの塔 アドベンチャーシート for プチコン3号 (続α版)

ドルアーガの塔 アドベンチャーシート for プチコン3号 (α版)

ほとんどが工事中のα(アルファ)版ですが、よければどうぞ。
ある程度のところまでは速攻でアップする予定です。

プロジェクト名: EDDRU

公開キー: 233XD3QE → 最新版はhttp://d.hatena.ne.jp/eidaht/20201231/1338118772からどうぞ

公開日: 2016/03/10

バージョン: 0.03


入力フォームはできました。でもまだ日本語入力できないです。
<今後の予定>
・EDKANJIPNLで漢字入力できるようにする 辞書もカスタマイズ
・サイコロ 1個または2個のサイコロ振り 履歴が残る
・アイコンのグラフィック
・(はるか未来) マッピング


★重要:スロット3へのオートセーブ
間違えて終了してプログラムの変数が消えてしまうと悲しいので、項目をどこか更新すると、数秒後にスロット3にオートセーブします。

EDDRUを起動時にスロット3にセーブデータがあればそれを読み込みます。したがって、プログラムを中断しても、再度STARTすると中断前の状態からはじまります。

起動時にスロット3にセーブデータがなければLOAD画面に移りファイルを指定します。キャンセルすると1巻の初期値が表示されます。

手動でファイルにセーブしたい時は、画面左下のファイルアイコンをタップしてセーブしてください。


★セーブ形式
テキストファイル(JSON形式)になっていますので、プログラム本体が

SMILE BASIC 小技(4)

1フレーム単位で動くプログラムを作っているとほぼ縁がないが、キー入力が必要なプログラムでは、キーボードバッファを空にさせたい場合がある。
この時は次のようにする。

WHILE INKEY$()!="":WEND  'キーバッファを空にする


少しだけ応用して、キーボードバッファに入っている内容のうち、最後に押されたキーを調べる例:

?"キー入力待ち..."
WAIT 200
VAR K0$,K$
REPEAT
 K0$=K$
 K$=INKEY$()
UNTIL K$==""
?K0$

K0$には直前のK$の値が入っているので、K$が""になった時、最後にK0$に入っていたのが最後に押されたキーとなる。

SMILE BASIC 小技(3)

今回は、小技というよりも、よく使うコード。

様々な場面でボタンが押されるまで処理を止める、ということがある。
その時に使うのが次のコード。

'何かの処理...
BWAIT  'ボタンが押されるまで待つ
'次の処理
END

DEF BWAIT
'ボタンが押されていない→押される→離される、まで待つ
 WHILE BUTTON(0)!=0:WEND
 WHILE BUTTON(1)==0:VSYNC 1:WEND
 WHILE BUTTON(0)!=0:WEND
END

「何かの処理」の中でボタンを押している時に、そのままボタン押し待ちの処理に入ると、なぜかいきなり押されたことになることがある。
それを防ぐために、ボタンが押されていない→押される→離される、まで待つという処理をよく使う。
このBWAITの箇所は多くのプログラムで使うことになる。