現役プログラマーに戻ることになった ― 2009/11/04 22:09
結局、新システムは自分が作った物をベースに会社のthukune君に
コンフィグ画面を作ってもらうことになった。
細かいツールも自分が作ることになり、
結局自分は現役プログラマーに戻ることになった。
年末はBLACKPACKAGE-TRYのくの一物の製品版と体験版、
そしてBLACKPACKAGEの6人の女教師のDL版を作るので時間が取れないが、
来年の2-3月にはベータテストが出来ると思う。
不評だったWindowsのコントロールを使った設定画面がグラフィカルになるのも進化(DOS時代に逆戻り?)することになる。
しかし、来年の年末のタイトルに使うかは不明だ。
DX9ベースで作ったので表現の幅は広がるが、XP以降とDX9対応GA(内蔵の場合i945以降)と
今までのシステムに比べると少々敷居が高くなるからだ。
(内蔵GAの場合i945としたのは、ネットブックにi945が多々採用されているからと865の内蔵GAが遅かったから)
陵辱ゲームを作るために、そこまでの表現力が必用とされるかも疑問だ。
話は変わるが、自分の作ったシステムで、キャラの表示をする際、
2通りの表現方法がある。
細かい演出はb)の方が出来るが、a)の方法の方が簡単に記述できる。
うちのソフトは8割方a)の方法で作っているが、
萌えゲーなどはb)の方法で細かく制御した方が良いだろう。
ここら辺はコンパイラのマクロが強力なので、問題ない。
式は代入式と比較式の区別はつけない。
極端に言うと、if 文で代入式をいれたり、何もないところで比較式を入れたり出来る。
(シナリオライターのバグの例 if r20==0 とするところを if r20=0 としてしまう )
シナリオライターがスクリプト上でバグを発生させる原因になるが、プログラマが慣れ親しんだC言語風の演算子を使うことが出来る。
それと、選択肢の結果等をを入れる変数を指定するため、アドレス式という物を使用する。(*rnum=*(&rnum)+1とか)
なので、計2種類の式があることに注意が必用。
それとC言語とは違い、全ての式を評価する。
マクロはMASMをも越える物で、C言語でMASMのマクロを使える物
だと思って良い。
この部分はコンパイル時にも実行時にもスピードを稼がなくてはならないので、コンパイラ自身にmakeを内蔵したり、
関数名やラベルなどの定義物は多数のトライ木を使ったり苦労している。
マクロは2種類有り、C言語と同等の機能の#define、
MASMライクな#macroの2種類があり、もちろん様々な条件コンパイルも出来、
最終的にプリプロセッサは、式(逆ポーランド)と
DD,DW,DB,stringにスクリプトを解析してコンパイラに渡す。
よって、プリプロセッサの大きさに比べてコンパイラの大きさは小さい。
そして強力な文字置換により、文字セットもプリプロセッサ時、コンパイル時、実行時の3段階で解決される。
自分のシステムはマクロで作られるマクロ命令群という形を取っているので、
a)やb)の書式が同じシナリオに書くことが出来る。
システムは足回り、コンパイラはスクリプターとぷろぐらまの中間、
と言うことになっている。
自分のシステムは、WAV圧縮、CG圧縮共にmakeを内蔵させ、
マスターアップの混乱時でもスピードアップが出来るような作りになっている。
a)1行でロードと表示をする
;Bキャラを左にCキャラを右に表示
ld_cg1 h00bw00,h00cw00
;BキャラとCキャラを左右に動かし、間にAキャラ出現
ld_cg1m h00bw00,h00aw00,h00cw00
;BキャラとCキャラはその位置のままでAキャラを消す
ld_cg1 h00bw00,cls0,h00cw00
b)ロードと表示をわける
;Bキャラを0番レイヤーにロードし、立ち位置を左(0-4のうち1)にし、表示優先順位を最低(0)にする。
ld_layer 0,h00bw00,1,0
;Cキャラを1番レイヤーにロードし、立ち位置を左(0-4のうち3)にし、表示優先順位を1にする。
ld_layer 1,h00Cw00,3,1
;ロードしたBキャラとCキャラをフェードインで表示する
putcg 1
;Bキャラをより左(0-4のうち0)に移動させる
move h00b,0
;Cキャラをより右(0-4のうち4)に移動させる
move h00c,4
;Aキャラを2番レイヤーにロードし、立ち位置を真ん中(0-4のうち2)にし、表示優先順位を2(一番手前)にする。
ld_layer 2,h00aw00,2,2
;BキャラとCキャラを左右に動かし、間にAキャラ出現
putcg 1
;Aキャラを2番レイヤーにロードし、立ち位置を真ん中(0-4のうち2)にし、表示優先順位を2(一番手前)にする。
ld_layer 2,cls0,2,2
;BキャラとCキャラはその位置のままでAキャラを消す
putcg 1
コンフィグ画面を作ってもらうことになった。
細かいツールも自分が作ることになり、
結局自分は現役プログラマーに戻ることになった。
年末はBLACKPACKAGE-TRYのくの一物の製品版と体験版、
そしてBLACKPACKAGEの6人の女教師のDL版を作るので時間が取れないが、
来年の2-3月にはベータテストが出来ると思う。
不評だったWindowsのコントロールを使った設定画面がグラフィカルになるのも進化(DOS時代に逆戻り?)することになる。
しかし、来年の年末のタイトルに使うかは不明だ。
DX9ベースで作ったので表現の幅は広がるが、XP以降とDX9対応GA(内蔵の場合i945以降)と
今までのシステムに比べると少々敷居が高くなるからだ。
(内蔵GAの場合i945としたのは、ネットブックにi945が多々採用されているからと865の内蔵GAが遅かったから)
陵辱ゲームを作るために、そこまでの表現力が必用とされるかも疑問だ。
話は変わるが、自分の作ったシステムで、キャラの表示をする際、
2通りの表現方法がある。
細かい演出はb)の方が出来るが、a)の方法の方が簡単に記述できる。
うちのソフトは8割方a)の方法で作っているが、
萌えゲーなどはb)の方法で細かく制御した方が良いだろう。
ここら辺はコンパイラのマクロが強力なので、問題ない。
式は代入式と比較式の区別はつけない。
極端に言うと、if 文で代入式をいれたり、何もないところで比較式を入れたり出来る。
(シナリオライターのバグの例 if r20==0 とするところを if r20=0 としてしまう )
シナリオライターがスクリプト上でバグを発生させる原因になるが、プログラマが慣れ親しんだC言語風の演算子を使うことが出来る。
それと、選択肢の結果等をを入れる変数を指定するため、アドレス式という物を使用する。(*rnum=*(&rnum)+1とか)
なので、計2種類の式があることに注意が必用。
それとC言語とは違い、全ての式を評価する。
マクロはMASMをも越える物で、C言語でMASMのマクロを使える物
だと思って良い。
この部分はコンパイル時にも実行時にもスピードを稼がなくてはならないので、コンパイラ自身にmakeを内蔵したり、
関数名やラベルなどの定義物は多数のトライ木を使ったり苦労している。
マクロは2種類有り、C言語と同等の機能の#define、
MASMライクな#macroの2種類があり、もちろん様々な条件コンパイルも出来、
最終的にプリプロセッサは、式(逆ポーランド)と
DD,DW,DB,stringにスクリプトを解析してコンパイラに渡す。
よって、プリプロセッサの大きさに比べてコンパイラの大きさは小さい。
そして強力な文字置換により、文字セットもプリプロセッサ時、コンパイル時、実行時の3段階で解決される。
自分のシステムはマクロで作られるマクロ命令群という形を取っているので、
a)やb)の書式が同じシナリオに書くことが出来る。
システムは足回り、コンパイラはスクリプターとぷろぐらまの中間、
と言うことになっている。
自分のシステムは、WAV圧縮、CG圧縮共にmakeを内蔵させ、
マスターアップの混乱時でもスピードアップが出来るような作りになっている。
a)1行でロードと表示をする
;Bキャラを左にCキャラを右に表示
ld_cg1 h00bw00,h00cw00
;BキャラとCキャラを左右に動かし、間にAキャラ出現
ld_cg1m h00bw00,h00aw00,h00cw00
;BキャラとCキャラはその位置のままでAキャラを消す
ld_cg1 h00bw00,cls0,h00cw00
b)ロードと表示をわける
;Bキャラを0番レイヤーにロードし、立ち位置を左(0-4のうち1)にし、表示優先順位を最低(0)にする。
ld_layer 0,h00bw00,1,0
;Cキャラを1番レイヤーにロードし、立ち位置を左(0-4のうち3)にし、表示優先順位を1にする。
ld_layer 1,h00Cw00,3,1
;ロードしたBキャラとCキャラをフェードインで表示する
putcg 1
;Bキャラをより左(0-4のうち0)に移動させる
move h00b,0
;Cキャラをより右(0-4のうち4)に移動させる
move h00c,4
;Aキャラを2番レイヤーにロードし、立ち位置を真ん中(0-4のうち2)にし、表示優先順位を2(一番手前)にする。
ld_layer 2,h00aw00,2,2
;BキャラとCキャラを左右に動かし、間にAキャラ出現
putcg 1
;Aキャラを2番レイヤーにロードし、立ち位置を真ん中(0-4のうち2)にし、表示優先順位を2(一番手前)にする。
ld_layer 2,cls0,2,2
;BキャラとCキャラはその位置のままでAキャラを消す
putcg 1
コメント
_ ADPC ― 2009/11/06 00:19
_ KENJI ― 2009/11/06 06:24
作りたい物があるか、仕事を取ってしまえば覚えますw。
というのは冗談で、K&Rに次はアルゴリズムかな?
ファイル名をソートするDOSのDIR命令を模した物を作っ足りしたりして、
しばらくコマンドラインで遊んだ後、
DirectX9あたりで3D迷路や2Dシューティングゲームを作ると、
C++の概念のさわりがわかると思います。
サンプルコードだけではなくそれを改造し、
その後には自分の作りたい物を作りモチベーションを高めることです。
自分は30才までは参考書も見ないで独学でやって(参考書は他の人のコード、本は辞書よして使う。今はインターネットが辞書です)、
30になって今までやってきたことを体系だって本で学びました。
体系だってやったおかげで強力なコンパイラを作り、
昔独力で考えて作ったのはバブルソートだったのか、ハッシュだったのかと後付の知識です。
今はいいほんがいっぱい良い本あるので(コンパイラならドラゴンブックと中田先生の本)、知識(参考書)先行でも良いと思いますが、
必ずサンプルコードだけではなく、自己流に改造することを心がけてください。
作りたい物、自分にとって便利な物を作ることを忘れずに勉強すれば、身となり血となります。
最初の話しに戻りますが仕事を取ってくれば否応なしに覚えますw
自分は感覚派プログラマと呼ばれ、ノったときには1日で1週間分の仕事をしたり、ノらなかったら一日中他のこと(難易度の低いプログラム)を組んでいます。
要は全てモチベーションだと思うので、参考書の字面に引っ張られずに
1)他人のプログラムを自分仕様に拡張する
2)自分の作りたい小さいプログラムを無理矢理作る
3)アカデミックなことを再確認する
4)DX9で小さいプログラムを無理矢理作る
5)アカデミックなことを再確認する
6)本当に作りたかったプログラムを作る
こんな感じで良いと思います。
というのは冗談で、K&Rに次はアルゴリズムかな?
ファイル名をソートするDOSのDIR命令を模した物を作っ足りしたりして、
しばらくコマンドラインで遊んだ後、
DirectX9あたりで3D迷路や2Dシューティングゲームを作ると、
C++の概念のさわりがわかると思います。
サンプルコードだけではなくそれを改造し、
その後には自分の作りたい物を作りモチベーションを高めることです。
自分は30才までは参考書も見ないで独学でやって(参考書は他の人のコード、本は辞書よして使う。今はインターネットが辞書です)、
30になって今までやってきたことを体系だって本で学びました。
体系だってやったおかげで強力なコンパイラを作り、
昔独力で考えて作ったのはバブルソートだったのか、ハッシュだったのかと後付の知識です。
今はいいほんがいっぱい良い本あるので(コンパイラならドラゴンブックと中田先生の本)、知識(参考書)先行でも良いと思いますが、
必ずサンプルコードだけではなく、自己流に改造することを心がけてください。
作りたい物、自分にとって便利な物を作ることを忘れずに勉強すれば、身となり血となります。
最初の話しに戻りますが仕事を取ってくれば否応なしに覚えますw
自分は感覚派プログラマと呼ばれ、ノったときには1日で1週間分の仕事をしたり、ノらなかったら一日中他のこと(難易度の低いプログラム)を組んでいます。
要は全てモチベーションだと思うので、参考書の字面に引っ張られずに
1)他人のプログラムを自分仕様に拡張する
2)自分の作りたい小さいプログラムを無理矢理作る
3)アカデミックなことを再確認する
4)DX9で小さいプログラムを無理矢理作る
5)アカデミックなことを再確認する
6)本当に作りたかったプログラムを作る
こんな感じで良いと思います。
_ 名無し ― 2009/11/06 17:38
変数名は(固定プリフィクス+数字)の形でしか表せないのですか?
_ (未記入) ― 2009/11/06 17:41
if や while なんかの入れ子や(1 + 2) * (3 + 4)等の複雑な式は使えますか?
_ KENJI ― 2009/11/06 19:14
変数名は英数文字で表現できます。マルチバイトでは表現できません。
メッセージ命令の中でもレジスタ間接などを使って計算結果やストリング配列の表示も出来ます
メッセージ中に直接式を入れることも出来ます。
if 式 elseif 式 else end / while 式 end / do while 式 / for 式;式;式 end などが記述出来ます
これらは全てプリプロセス時に、#amacroでifn_goto 式,label / if_goto 式,label と goto labelに分解されます。
式は代入式と評価式の区別は付けません。それとポインター式があります。
式はC言語と同等の物だと思ってください。演算子の優先順位も合わせてます。
記述性はVB並と思ってください。それに強力なマクロと強力な置換が追加されていて、
それらを使って、windows apiを呼び出すようになっています。
逆に言うと、強力なマクロと強力な置換を使い、システムをラッパーしなければ
最低限のゲームシステムの支援(文字表示やCG表示)しかなく
windows apiやcopyrect命令などの呼び出しが必用になり、
ゲームシステムとしては使い物になりません。
式関連は最適化もしています。
コンパイラ自体は以上の実装なので、
ウチで作った携帯電話用のゲームシステム等ともマクロを変えて併用しています。
以下がendマクロの実装例です
#amacro end( d0 )(local0,local1,localn,localt,localcase)
;
; end ( while,do,for,switch,if )
;
#getnum localt 2
#getnum localn 3
#subnumsp 3
#define local1 "f_{localn}"
#unstr local1
#if (localt==10) ; while
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==11) ; do
#define local0 "b_{localn}"
#unstr local0
if_goto local0,d0
local1:
#elseif (localt==12) ; for
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==13) ; switch
#popnum localcase
#substrsp 1
#define local0 "case_{localn}_{localcase}"
#unstr local0
local0:
local1:
#elseif (localt==14) ; if
#popnum localcase
#define local0 "if_{localn}_{localcase}"
#unstr local0
local0:
local1:
#else
#error end文の対応が異常です
#endif
#endm
メッセージ命令の中でもレジスタ間接などを使って計算結果やストリング配列の表示も出来ます
メッセージ中に直接式を入れることも出来ます。
if 式 elseif 式 else end / while 式 end / do while 式 / for 式;式;式 end などが記述出来ます
これらは全てプリプロセス時に、#amacroでifn_goto 式,label / if_goto 式,label と goto labelに分解されます。
式は代入式と評価式の区別は付けません。それとポインター式があります。
式はC言語と同等の物だと思ってください。演算子の優先順位も合わせてます。
記述性はVB並と思ってください。それに強力なマクロと強力な置換が追加されていて、
それらを使って、windows apiを呼び出すようになっています。
逆に言うと、強力なマクロと強力な置換を使い、システムをラッパーしなければ
最低限のゲームシステムの支援(文字表示やCG表示)しかなく
windows apiやcopyrect命令などの呼び出しが必用になり、
ゲームシステムとしては使い物になりません。
式関連は最適化もしています。
コンパイラ自体は以上の実装なので、
ウチで作った携帯電話用のゲームシステム等ともマクロを変えて併用しています。
以下がendマクロの実装例です
#amacro end( d0 )(local0,local1,localn,localt,localcase)
;
; end ( while,do,for,switch,if )
;
#getnum localt 2
#getnum localn 3
#subnumsp 3
#define local1 "f_{localn}"
#unstr local1
#if (localt==10) ; while
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==11) ; do
#define local0 "b_{localn}"
#unstr local0
if_goto local0,d0
local1:
#elseif (localt==12) ; for
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==13) ; switch
#popnum localcase
#substrsp 1
#define local0 "case_{localn}_{localcase}"
#unstr local0
local0:
local1:
#elseif (localt==14) ; if
#popnum localcase
#define local0 "if_{localn}_{localcase}"
#unstr local0
local0:
local1:
#else
#error end文の対応が異常です
#endif
#endm
_ 通りすがり ― 2009/11/06 23:11
面白そうな言語ですね。
出来ましたらマクロの全容とサンプルソースを見せていただけないでしょうか。
出来ましたらマクロの全容とサンプルソースを見せていただけないでしょうか。
_ ADPC ― 2009/11/07 01:49
色々とありがとうございました。
勉強と参考になりました。
ネット上などで上がっているコードを改造して勉強してみます。
確かに、仕事をやれば力は付きますねw
逝くか進むかしかないのでw
勉強と参考になりました。
ネット上などで上がっているコードを改造して勉強してみます。
確かに、仕事をやれば力は付きますねw
逝くか進むかしかないのでw
_ (未記入) ― 2009/11/07 06:35
なぜMAKEを内蔵させたのですか?
_ マジ ― 2009/11/07 06:44
弟子にしてください。
_ (未記入) ― 2009/11/07 09:13
システムの公開はなされないのでしょうか。
_ KENJI ― 2009/11/07 10:07
通りすがり様。
サンプルの公開は考えておりません。誠に申し訳ありません。
ADPC様。
やってみれば何とかなると思いますよ
未記入様。
makeを内蔵したのは、
別exeにするとどうしても読み込みのオーバーヘッドが無視できなくなるからです。
マスターアップの時にはデーターが完成するのが当日とか当たり前にあります。
自分のシナリオコンパイルは1fileで1秒前後、自分のwavファイルで0.1秒前後です。
特にwavファイルは最後に入ってくることが多いので、wav圧縮は0.1秒前後のため、
外部makeを呼び出していると1万fileだと相当なオーバーヘッダがつきます。
ですので内蔵しております。oggだとこうはいきませんよね。
1万fileで外部makeだと少なくとも5時間は掛かります
マジ様。
弟子はthukune君一人で精一杯です。
未記入様。
システムの公開は考えておりません。誠に申し訳ありません。
サンプルの公開は考えておりません。誠に申し訳ありません。
ADPC様。
やってみれば何とかなると思いますよ
未記入様。
makeを内蔵したのは、
別exeにするとどうしても読み込みのオーバーヘッドが無視できなくなるからです。
マスターアップの時にはデーターが完成するのが当日とか当たり前にあります。
自分のシナリオコンパイルは1fileで1秒前後、自分のwavファイルで0.1秒前後です。
特にwavファイルは最後に入ってくることが多いので、wav圧縮は0.1秒前後のため、
外部makeを呼び出していると1万fileだと相当なオーバーヘッダがつきます。
ですので内蔵しております。oggだとこうはいきませんよね。
1万fileで外部makeだと少なくとも5時間は掛かります
マジ様。
弟子はthukune君一人で精一杯です。
未記入様。
システムの公開は考えておりません。誠に申し訳ありません。
_ (未記入) ― 2009/11/08 06:33
if elseif else end,while end,do while,for next等の構造文だけで良いのでマクロを見せてもらえませんか。
正直エロゲのスクリプトと侮っていました。
エロゲ業界のプログラマの地位向上として見せていただきたい。
正直エロゲのスクリプトと侮っていました。
エロゲ業界のプログラマの地位向上として見せていただきたい。
_ KENJI ― 2009/11/08 11:53
まずはdo-whileではなく、正しくはdo-endと記述する事を訂正させてください。
それと吉里吉里などもっと凄い言語が公開されていますので、
ソースコードなどはそちらを参考にした方がよいと思います。
switch-caseはテーブルではなくif文の固まりです
文字列はゲーム用スクリプタなのでもちろん"(ダブルクオーテーション)では挟まずベタうちです。
ラベルやプリプロセス命令(#が付く命令)も行頭でなくとも記述できます
(sample)
while exit_flag==0
sel game_flag,ゲームをスタートさせる,ゲームを終了させる
if game_flag==0
ゲームをスタートさせます
game_start 1
else
sel ans,ゲームを終了させる,キャンセル
if ans
exit_game 1
end
end
end
;------------------------------------------------------------------------------
; マクロ内での構造文ののチェック用
;------------------------------------------------------------------------------
;
; マクロ内での構造文ののチェック用
;
#define ___cn0 0
#define ___cs0 0
#define ___cn1 0
#define ___cs1 0
;------------------------------------------------------------------------------
#amacro ___cs
;
; マクロ内での構造文ののチェック用 ( start )
;
#getnumsp ___cn0
#getstrsp ___cs0
#endm
;------------------------------------------------------------------------------
#amacro ___ce
;
; マクロ内での構造文ののチェック用 ( end )
;
#getnumsp ___cn1
#getstrsp ___cs1
#if ___cn0!=___cn1
#error macro 内の 構造文の対応が異常です
#endif
#if ___cs0!=___cs1
#error macro 内の switch文の対応が異常です
#endif
#endm
;----------------------------------------------------------------------------
; end soc
;----------------------------------------------------------------------------
#amacro end_soc
;
; 制御部 ( soc の最後に必ず必要な部分 )
;
#getnumsp __local0
#if __local0!=0
#error 構造文の対応が異常です
#endif
#getstrsp __local0
#if __local0!=0
#error switch文の対応が異常です
#endif
exit
exit_soc
#endm
;----------------------------------------------------------------
; num
;----------------------------------------------------------------
#define __cmd_num 100
;----------------------------------------------------------------
; end
;----------------------------------------------------------------
#amacro end( d0 )(local0,local1,localn,localt,localcase)
;
; end ( while,do,for,switch,if )
;
#getnum localt 2
#getnum localn 3
#subnumsp 3
#define local1 "f_{localn}"
#unstr local1
#if (localt==10) ; while
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==11) ; do
#define local0 "b_{localn}"
#unstr local0
if_goto local0,d0
local1:
#elseif (localt==12) ; for
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==13) ; switch
#popnum localcase
#substrsp 1
#define local0 "case_{localn}_{localcase}"
#unstr local0
local0:
local1:
#elseif (localt==14) ; if
#popnum localcase
#define local0 "if_{localn}_{localcase}"
#unstr local0
local0:
local1:
#else
#error end文の対応が異常です
#endif
#endm
;----------------------------------------------------------------
; break
;----------------------------------------------------------------
#amacro break()(local0,localn,localsp)
;
; break ( while,do,for,switch )
;
#searchnum localsp 0 ; 直前の if 以外をサーチする
#getnum localn localsp+2
#define local0 "f_{localn}"
#unstr local0
goto local0
#endm
;----------------------------------------------------------------
; while
;----------------------------------------------------------------
#amacro while( d0 )(local0,local1)(*)
;
; while
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 10 ; while という事を示す(10)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
#define local1 "f_{__cmd_num}"
#unstr local1
local0:
ifn_goto local1,d0
#endm
;----------------------------------------------------------------
; do
;----------------------------------------------------------------
#amacro do()(local0)(*)
;
; do
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 11 ; do という事を示す(11)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
local0:
#endm
;----------------------------------------------------------------
; for
;----------------------------------------------------------------
#amacro for( d0,d1,d2 )(local0,local1,local9)(*)
;
; for
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 12 ; for という事を示す(12)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
#define local1 "f_{__cmd_num}"
#unstr local1
(d0) ; 最初の式
goto local9
local0:
(d2) ; 2 回目以降の式
local9:
ifn_goto local1,(d1) ; ループ条件
#endm
;----------------------------------------------------------------
; switch
;----------------------------------------------------------------
#amacro switch( d0 )(local0,local1)(*)
;
; switch
;
#calc __cmd_num __cmd_num+1
#pushnum 1000 ; 最初の case/default は 1000 から始まる
#pushnum __cmd_num ; label number
#pushnum 13 ; switch という事を示す(13)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local1 "{d0}" ; 条件式を pushstr
#unstr local1
#pushstr local1
#define local0 "case_{__cmd_num}_1000"
#unstr local0
goto local0 ; 最初の case/default へ飛ぶ
#endm
;----------------------------------------------------------------
#amacro case( d0 )(local0,local1,locals,localn,localt,localcalc)(*)
;
; case
;
#getnum localt 2
#if (localt!=13)
#error switch文の対応が異常です
#endif
#getnum localn 3
#getnum localcase 4
#define local0 "case_{localn}_{localcase}"
#unstr local0
#calc localcase localcase+1
#subnumsp 4
#pushnum localcase
#addnumsp 3
#define local1 "case_{localn}_{localcase}"
#unstr local1
goto locals ; _case を skip する
local0:
#getstr localcalc 1
ifn_goto local1,((localcalc)==(d0))
locals:
#endm
;----------------------------------------------------------------
#amacro default()(local0,localn,localt,localcase)(*)
;
; default
;
#getnum localt 2
#if (localt!=13)
#error switch文の対応が異常です
#endif
#getnum localn 3
#getnum localcase 4
#define local0 "case_{localn}_{localcase}"
#unstr local0
#calc localcase localcase+1
#subnumsp 4
#pushnum localcase
#addnumsp 3
local0:
#endm
;----------------------------------------------------------------
; if
;----------------------------------------------------------------
#amacro if( d0 )(local0,local1)(*)
;
; if
;
#calc __cmd_num __cmd_num+1
#pushnum 1000 ; 最初の elseif/else は 1000 から始まる
#pushnum __cmd_num ; label number
#pushnum 14 ; if という事を示す(14)
#pushnum 1 ; if 以外と区別するためのマーカー
#define local0 "if_{__cmd_num}_1000"
#unstr local0
ifn_goto local0,(d0)
#endm
;----------------------------------------------------------------
#amacro elseif( d0 )(local0,local1,local2,localn,localif)(*)
;
; elseif
;
#getnum localn 3
#getnum localif 4
#define local0 "if_{localn}_{localif}"
#unstr local0
#calc localif localif+1
#subnumsp 4
#pushnum localif
#addnumsp 3
#define local1 "f_{localn}"
#unstr local1
goto local1
local0:
#define local2 "if_{localn}_{localif}"
#unstr local2
ifn_goto local2,(d0)
#endm
;----------------------------------------------------------------
#amacro else()(local0,local1,localn,localif)(*)
;
; else
;
#getnum localn 3
#getnum localif 4
#define local0 "if_{localn}_{localif}"
#unstr local0
#calc localif localif+1
#subnumsp 4
#pushnum localif
#addnumsp 3
#define local1 "f_{localn}"
#unstr local1
goto local1
local0:
それと吉里吉里などもっと凄い言語が公開されていますので、
ソースコードなどはそちらを参考にした方がよいと思います。
switch-caseはテーブルではなくif文の固まりです
文字列はゲーム用スクリプタなのでもちろん"(ダブルクオーテーション)では挟まずベタうちです。
ラベルやプリプロセス命令(#が付く命令)も行頭でなくとも記述できます
(sample)
while exit_flag==0
sel game_flag,ゲームをスタートさせる,ゲームを終了させる
if game_flag==0
ゲームをスタートさせます
game_start 1
else
sel ans,ゲームを終了させる,キャンセル
if ans
exit_game 1
end
end
end
;------------------------------------------------------------------------------
; マクロ内での構造文ののチェック用
;------------------------------------------------------------------------------
;
; マクロ内での構造文ののチェック用
;
#define ___cn0 0
#define ___cs0 0
#define ___cn1 0
#define ___cs1 0
;------------------------------------------------------------------------------
#amacro ___cs
;
; マクロ内での構造文ののチェック用 ( start )
;
#getnumsp ___cn0
#getstrsp ___cs0
#endm
;------------------------------------------------------------------------------
#amacro ___ce
;
; マクロ内での構造文ののチェック用 ( end )
;
#getnumsp ___cn1
#getstrsp ___cs1
#if ___cn0!=___cn1
#error macro 内の 構造文の対応が異常です
#endif
#if ___cs0!=___cs1
#error macro 内の switch文の対応が異常です
#endif
#endm
;----------------------------------------------------------------------------
; end soc
;----------------------------------------------------------------------------
#amacro end_soc
;
; 制御部 ( soc の最後に必ず必要な部分 )
;
#getnumsp __local0
#if __local0!=0
#error 構造文の対応が異常です
#endif
#getstrsp __local0
#if __local0!=0
#error switch文の対応が異常です
#endif
exit
exit_soc
#endm
;----------------------------------------------------------------
; num
;----------------------------------------------------------------
#define __cmd_num 100
;----------------------------------------------------------------
; end
;----------------------------------------------------------------
#amacro end( d0 )(local0,local1,localn,localt,localcase)
;
; end ( while,do,for,switch,if )
;
#getnum localt 2
#getnum localn 3
#subnumsp 3
#define local1 "f_{localn}"
#unstr local1
#if (localt==10) ; while
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==11) ; do
#define local0 "b_{localn}"
#unstr local0
if_goto local0,d0
local1:
#elseif (localt==12) ; for
#define local0 "b_{localn}"
#unstr local0
goto local0
local1:
#elseif (localt==13) ; switch
#popnum localcase
#substrsp 1
#define local0 "case_{localn}_{localcase}"
#unstr local0
local0:
local1:
#elseif (localt==14) ; if
#popnum localcase
#define local0 "if_{localn}_{localcase}"
#unstr local0
local0:
local1:
#else
#error end文の対応が異常です
#endif
#endm
;----------------------------------------------------------------
; break
;----------------------------------------------------------------
#amacro break()(local0,localn,localsp)
;
; break ( while,do,for,switch )
;
#searchnum localsp 0 ; 直前の if 以外をサーチする
#getnum localn localsp+2
#define local0 "f_{localn}"
#unstr local0
goto local0
#endm
;----------------------------------------------------------------
; while
;----------------------------------------------------------------
#amacro while( d0 )(local0,local1)(*)
;
; while
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 10 ; while という事を示す(10)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
#define local1 "f_{__cmd_num}"
#unstr local1
local0:
ifn_goto local1,d0
#endm
;----------------------------------------------------------------
; do
;----------------------------------------------------------------
#amacro do()(local0)(*)
;
; do
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 11 ; do という事を示す(11)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
local0:
#endm
;----------------------------------------------------------------
; for
;----------------------------------------------------------------
#amacro for( d0,d1,d2 )(local0,local1,local9)(*)
;
; for
;
#calc __cmd_num __cmd_num+1
#pushnum __cmd_num ; label number
#pushnum 12 ; for という事を示す(12)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local0 "b_{__cmd_num}"
#unstr local0
#define local1 "f_{__cmd_num}"
#unstr local1
(d0) ; 最初の式
goto local9
local0:
(d2) ; 2 回目以降の式
local9:
ifn_goto local1,(d1) ; ループ条件
#endm
;----------------------------------------------------------------
; switch
;----------------------------------------------------------------
#amacro switch( d0 )(local0,local1)(*)
;
; switch
;
#calc __cmd_num __cmd_num+1
#pushnum 1000 ; 最初の case/default は 1000 から始まる
#pushnum __cmd_num ; label number
#pushnum 13 ; switch という事を示す(13)
#pushnum 0 ; if 以外をサーチするためのマーカー
#define local1 "{d0}" ; 条件式を pushstr
#unstr local1
#pushstr local1
#define local0 "case_{__cmd_num}_1000"
#unstr local0
goto local0 ; 最初の case/default へ飛ぶ
#endm
;----------------------------------------------------------------
#amacro case( d0 )(local0,local1,locals,localn,localt,localcalc)(*)
;
; case
;
#getnum localt 2
#if (localt!=13)
#error switch文の対応が異常です
#endif
#getnum localn 3
#getnum localcase 4
#define local0 "case_{localn}_{localcase}"
#unstr local0
#calc localcase localcase+1
#subnumsp 4
#pushnum localcase
#addnumsp 3
#define local1 "case_{localn}_{localcase}"
#unstr local1
goto locals ; _case を skip する
local0:
#getstr localcalc 1
ifn_goto local1,((localcalc)==(d0))
locals:
#endm
;----------------------------------------------------------------
#amacro default()(local0,localn,localt,localcase)(*)
;
; default
;
#getnum localt 2
#if (localt!=13)
#error switch文の対応が異常です
#endif
#getnum localn 3
#getnum localcase 4
#define local0 "case_{localn}_{localcase}"
#unstr local0
#calc localcase localcase+1
#subnumsp 4
#pushnum localcase
#addnumsp 3
local0:
#endm
;----------------------------------------------------------------
; if
;----------------------------------------------------------------
#amacro if( d0 )(local0,local1)(*)
;
; if
;
#calc __cmd_num __cmd_num+1
#pushnum 1000 ; 最初の elseif/else は 1000 から始まる
#pushnum __cmd_num ; label number
#pushnum 14 ; if という事を示す(14)
#pushnum 1 ; if 以外と区別するためのマーカー
#define local0 "if_{__cmd_num}_1000"
#unstr local0
ifn_goto local0,(d0)
#endm
;----------------------------------------------------------------
#amacro elseif( d0 )(local0,local1,local2,localn,localif)(*)
;
; elseif
;
#getnum localn 3
#getnum localif 4
#define local0 "if_{localn}_{localif}"
#unstr local0
#calc localif localif+1
#subnumsp 4
#pushnum localif
#addnumsp 3
#define local1 "f_{localn}"
#unstr local1
goto local1
local0:
#define local2 "if_{localn}_{localif}"
#unstr local2
ifn_goto local2,(d0)
#endm
;----------------------------------------------------------------
#amacro else()(local0,local1,localn,localif)(*)
;
; else
;
#getnum localn 3
#getnum localif 4
#define local0 "if_{localn}_{localif}"
#unstr local0
#calc localif localif+1
#subnumsp 4
#pushnum localif
#addnumsp 3
#define local1 "f_{localn}"
#unstr local1
goto local1
local0:
_ (未記入) ― 2009/11/08 12:33
で、メッセージを英語化して、start game と exit game にする時はどうするの?
_ KENJI ― 2009/11/08 12:52
金曜日から質問攻めが凄いですね。
1人の方なのでしょうか?
それともどこかで話題になっているのでしょうか。
どこかで話題になっているようでしたら教えていただけると幸いです。
質問の答えですが、半角英文が先頭に来るメッセージの場合
mes game start
と記述するか、#defineでmesをm辺りに定義して
m game start
とでも記述してください。
半角英文が日本語の中に来るときはそのまま半角文字を記入してokです。
まあしかし、ゲーム中には全角英文字しか使わないので滅多に出番がありませんが。
start_game 1とexit_gane 1はstart_game(1)とexit_game(1)とも記述出来ます。
後はこの場合メインループの外側でstart_game(local)やexit_game(local)の様に外部に登録します。Cとは違い、前方参照も出来ます。
1人の方なのでしょうか?
それともどこかで話題になっているのでしょうか。
どこかで話題になっているようでしたら教えていただけると幸いです。
質問の答えですが、半角英文が先頭に来るメッセージの場合
mes game start
と記述するか、#defineでmesをm辺りに定義して
m game start
とでも記述してください。
半角英文が日本語の中に来るときはそのまま半角文字を記入してokです。
まあしかし、ゲーム中には全角英文字しか使わないので滅多に出番がありませんが。
start_game 1とexit_gane 1はstart_game(1)とexit_game(1)とも記述出来ます。
後はこの場合メインループの外側でstart_game(local)やexit_game(local)の様に外部に登録します。Cとは違い、前方参照も出来ます。
_ KENJI ― 2009/11/08 16:15
書き忘れましたがインクルードは
#include <w95gd.mac>
#include "h00win0.mac"
として、標準マクロと標準命令はw95gd.mac、
そのゲーム専用のマクロはh00win0.macに記述します。
#include <w95gd.mac>
#include "h00win0.mac"
として、標準マクロと標準命令はw95gd.mac、
そのゲーム専用のマクロはh00win0.macに記述します。
_ (未記入) ― 2009/11/08 16:42
から来ました。
_ (未記入) ― 2009/11/08 16:55
CG,WAV,シナリオの圧縮はオリジナルですか?
それとアセンブラは使ってるのでしょうか?
それとアセンブラは使ってるのでしょうか?
_ (未記入) ― 2009/11/08 17:07
2chで晒されてますよ
blogを公開されてる以上は想定内の事と思いますが
見ての通りですので
あまり相手にしない方が
「コンパイラ・スクリプトエンジン」相談室13
http://pc12.2ch.net/test/read.cgi/tech/1233143342/
blogを公開されてる以上は想定内の事と思いますが
見ての通りですので
あまり相手にしない方が
「コンパイラ・スクリプトエンジン」相談室13
http://pc12.2ch.net/test/read.cgi/tech/1233143342/
_ KENJI ― 2009/11/08 17:13
CG,WAV,シナリオの圧縮はオリジナルです。
昔は全てアセンブラで組んでいましたが、
最近は移植性のため一度C言語で組んでそれをインラインアセンブラ化します。
圧縮のビット操作関係とプリプロセッサとコンパイラのラベル解決のプログラムはC言語版は残したままで1からインラインアセンブラで組み直しています。
インラインアセンブラの採用で圧縮展開は5倍、コンパイラは2倍くらいのスピードになります。
ゲーム本体は展開以外はほぼ同じスピードなので、インラインアセンブラを積極的に使ってません
昔は全てアセンブラで組んでいましたが、
最近は移植性のため一度C言語で組んでそれをインラインアセンブラ化します。
圧縮のビット操作関係とプリプロセッサとコンパイラのラベル解決のプログラムはC言語版は残したままで1からインラインアセンブラで組み直しています。
インラインアセンブラの採用で圧縮展開は5倍、コンパイラは2倍くらいのスピードになります。
ゲーム本体は展開以外はほぼ同じスピードなので、インラインアセンブラを積極的に使ってません
_ KENJI ― 2009/11/08 17:19
未記入様。
ご報告、有難う御座います。
読んでみると自分のせいで荒れているみたいですね。
申し訳ないです。
ここでの質問は紳士的でしたので、問題はありません。
ご報告、有難う御座います。
読んでみると自分のせいで荒れているみたいですね。
申し訳ないです。
ここでの質問は紳士的でしたので、問題はありません。
_ (未記入) ― 2009/11/09 14:27
素晴らしいコンセプトのコンパイラですね。
たとえばPICとか用のLINKを用意すれば動かせますか?
その際に式が逆ポーランドだと重くありませんか?
たとえばPICとか用のLINKを用意すれば動かせますか?
その際に式が逆ポーランドだと重くありませんか?
_ KENJI ― 2009/11/09 14:55
有難う御座います。
趣味でPICではないですがAVRのリンカを作っています。
その為に、単純比較式 r0==0 とかを1byteで記する命令を作っています。
しかしPICは変数の割り当てが難しいのでVMを作るのは大変だと思います。
趣味でPICではないですがAVRのリンカを作っています。
その為に、単純比較式 r0==0 とかを1byteで記する命令を作っています。
しかしPICは変数の割り当てが難しいのでVMを作るのは大変だと思います。
_ コンパイラスレ住人 ― 2009/11/11 04:41
自作自演、乙。
_ KENJI ― 2009/11/11 09:41
そう取られてもしょうがない流れでした。
迷惑をかけましてすみません。
迷惑をかけましてすみません。
_ (未記入) ― 2009/11/11 09:54
ソフ倫の裏切り者。
_ KENJI ― 2009/11/11 10:09
裏切り者ではありません。ギリギリのラインが先週、解ったと言うことです。
_ ADPC ― 2009/11/11 10:11
未記入さん
締め出したのはソフ倫側という事実は無視ですか?
業界維持・逮捕者を出さない
その旗の下に何ら補償も斡旋もせずに
戸を閉めたことは棚に上げるべきではないと思います。
裏切りというなら
そのような行動を取るソフ倫側の方も裏切りですが?
締め出したのはソフ倫側という事実は無視ですか?
業界維持・逮捕者を出さない
その旗の下に何ら補償も斡旋もせずに
戸を閉めたことは棚に上げるべきではないと思います。
裏切りというなら
そのような行動を取るソフ倫側の方も裏切りですが?
_ KENJI ― 2009/11/11 10:13
ADPC様。
愉快犯ですよ。適当にあしらいましょう。
愉快犯ですよ。適当にあしらいましょう。
_ C ― 2009/11/11 11:02
何処かが何かを製作して、それを末端の需要に届けるまでの
1サイクルを完成させる諸々の構成要素の中の「1」部品。
ネジやボルトに「隷属」という概念は、厳密に云えば誤りでしょう。
皆々落ち着かないんでしょう。辛いんでしょう。
今にも叫んで逃げ出したいんでしょう。
1サイクルを完成させる諸々の構成要素の中の「1」部品。
ネジやボルトに「隷属」という概念は、厳密に云えば誤りでしょう。
皆々落ち着かないんでしょう。辛いんでしょう。
今にも叫んで逃げ出したいんでしょう。
_ ADPC ― 2009/11/11 12:48
KENJI様
すみません。
気をつけることにします
すみません。
気をつけることにします
_ KENJI ― 2009/11/11 12:51
>今にも叫んで逃げ出したいんでしょう
ええ、自分も醜態を見せてしまいました。
しかし、皆様のおかげでエロゲーをお金が無くならない限り
作り続けよう、そしてプログラマーを続けようと言う勇気をもらいました。
クリエーターなんて大層な物ではないですが、エロゲ業界の末端として可能な限り、活動していこうと思います。
ええ、自分も醜態を見せてしまいました。
しかし、皆様のおかげでエロゲーをお金が無くならない限り
作り続けよう、そしてプログラマーを続けようと言う勇気をもらいました。
クリエーターなんて大層な物ではないですが、エロゲ業界の末端として可能な限り、活動していこうと思います。
_ C ― 2009/11/11 15:51
あなたたち製作者、そして需要側
これらがメインです。
需要、製作者が「ネジ、ボルト」ではありません。
時に支えあいましょう。
BlackPackageの皆々様にもエールを送ります。
ごきげんよう
これらがメインです。
需要、製作者が「ネジ、ボルト」ではありません。
時に支えあいましょう。
BlackPackageの皆々様にもエールを送ります。
ごきげんよう
_ KENJI ― 2009/11/11 17:37
有難う御座います。力になります。
_ KENJI ― 2009/11/12 05:22
ふう、コンパイラスレの方も一段落したみたいです。
もし、私の弁護のために書き込まれた方がいらっしゃたのでしたら
ああいう方法は逆効果です。何もせずそっとしておいていただけると嬉しいです。
もし、私の弁護のために書き込まれた方がいらっしゃたのでしたら
ああいう方法は逆効果です。何もせずそっとしておいていただけると嬉しいです。
_ tips about seo ― 2013/12/19 23:17
AU4RbX I value the article post.Thanks Again. Great.
_ tips about seo ― 2013/12/20 17:33
thSCaS I am so grateful for your article post.Much thanks again. Really Great.
_ autosurf club ― 2013/12/23 01:03
Appreciate you sharing, great post.Really looking forward to read more. Want more.
_ angulus shoes ― 2013/12/23 02:06
Thanks again for the blog. Want more.
_ Real Estate Abu Dhabi ― 2013/12/23 02:16
Really appreciate you sharing this article.Much thanks again. Great.
_ Tempat Karaoke ― 2013/12/23 03:27
I loved your blog post. Great.
_ Auto Locksmith London ― 2013/12/23 04:02
Thanks again for the blog.Thanks Again. Want more.
_ personal care products ― 2013/12/23 04:40
Thanks so much for the article.Much thanks again. Will read on...
_ bet365 ― 2013/12/23 05:55
I really enjoy the blog post.Much thanks again. Keep writing.
_ swarovski jewelry ― 2013/12/23 06:03
I loved your article post.Really thank you! Awesome.
_ download subtitles ― 2013/12/23 07:11
Thanks for the blog post.Really looking forward to read more. Cool.
_ commercial ceiling light ― 2013/12/23 08:02
Im obliged for the article. Want more.
_ Buy ― 2013/12/23 08:27
A big thank you for your blog article.Really thank you! Great.
_ youth protection training ― 2013/12/23 09:44
Thank you for your article.Thanks Again. Cool.
_ work from home ― 2013/12/23 10:00
Great blog article.Thanks Again. Want more.
※コメントの受付件数を超えているため、この記事にコメントすることができません。
トラックバック
このエントリのトラックバックURL: http://kenjikakera.asablo.jp/blog/2009/11/04/4676336/tb
K&Rの本やDirectXが理解出来れば、作れるようになったりするものでしょうか?