したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

NScripterまめ知識スレ

1code00:2008/10/22(水) 22:54:46
勝手に自分スレ!
Nスク暦一ヶ月のにわかスクリプタもどき:104さんがおくる、
人によっては役立つような気がしないでもないNスク講座だよ。
え? なんでここなのかって?
ギャルゲスレに書こうと思ってたら流石に長くなってきて、
さらにギャルゲではなくNスク限定の話だからさ!
え? 自サイトでやれって?
いつか作るかもね!
では早速第一回行ってみよー!

2code00:2008/10/22(水) 22:56:11
★第一回:NScripterのセーブファイルに関するtips

NScripterには、様々な種類のセーブデータが存在する。
ひとつにまとめろよ! って気がしないでもないが、
NScripterは色々なゲームの作成に対応することが一番の目標であって、
ゲームによっては使わないかもしれないデータまでまとめてしまったり
個別にセーブデータが扱えなかったりするのは問題かもしれないから
最大限に分割してあるんだろう。
つーわけで、たぶん全種類、NScripterのセーブデータファイル全6種類を解説するよ!
スクリプタじゃなくても、プレイする側としても知っておいていい知識だよ。


●各種セーブデータとその内容

◆save○.dat
セーブデータ○番。ゲームスクリプト中の、systemcallによる普通のセーブ操作、およびsavegame命令によって作成される。
ロード時に読み込まれるのはこのファイル。
saveonの間、通常変数の値、出現中のスプライトとその位置、現在読んでいるスクリプトが冒頭から数えて何行目か、等を記憶して、ロード時に再現する。
ロード時に始める位置はあくまでも00.txtの冒頭から数えた行数であり、どんな文章のところから始めるかなんて覚えてくれないので、冒頭から現在読んでいる場所までの間の行数が変わっていると変なことになる。
他のファイルと違い、セーブデータの数だけ作られるので、savedir命令によって1つのフォルダにまとめるのがベスト(exeと同じディレクトリに垂れ流してるままのゲームも多いが、フォルダを開いたとき起動ファイルと同じディレクトリにずらずらファイルがあるのは嫌じゃないんだろうかまったく)。

◆kidoku.dat
既読テキストデータ。kudokusukip命令によって作成される。kidokuonのとき、skip命令で利用される。
スクリプトの何行目を読んだかが記録される。セーブデータに関わらず、最も読み進めたものを記録する。
既読のみスキップする場合、このファイルで覚えた行をスキップできる。

◆gloval.sav
グローバル変数セーブ。glovalon命令によって作成される。普通にスクリプト内で変数として利用できる。
グローバル変数の値が記録される。グローバル変数はセーブデータを横断して変数を使えるので
個別のセーブデータに関わらないゲーム全体のセーブとして、
つまりはセーブデータをロードする前に使わなければならないおまけモードの追加やらなにやらに有効。
なお、グローバル変数は通常変数と0〜4000以上まである変数領域を分け合うのだが、
glovalonしただけのデフォルト状態では200以降全部がグローバル変数であり、半分ってレベルじゃない。
当然、通常変数のほうが使うと思われるので、value命令で500〜なり1000〜なりに領域を変えておこう。

3code00:2008/10/22(水) 22:56:50
◆NScrllog.dat
NScripterラベルログデータ。lavellog命令によって作成される。
通過したラベル名が記録されている。lchk命令によって利用できる。
「このラベルを読んでいたらこのルート」とかやって使う、のかなあ。使ったことがない。

◆NScrflog.dat
NScripterファイルログデータ。filelog命令によって作成される。
これまでに読み込んだファイル名が記録されている。fchk命令によって利用できる。
画像閲覧モードとかする場合に、いちいち変数管理しなくていいということだが、
読み込み時の形式などのタグが違うと違うファイルとして扱われるという細かすぎる仕様が若干難点。

◆evndata
環境データ。NScripterが自動で保存する。次回以降の起動時に自動で読み込まれる。
defineなどで設定した環境設定周りのデータを記憶している。
このファイルだけはセーブデータ保存ディレクトリ指定savedirで指定した場所に保存されず、exeと同じディレクトリに置かれる。
(exeをバイナリエディタで軽く弄れば変更は可能)
なぜセーブフォルダに入らないようになっているかというと、
・このファイルは起動時の環境設定情報を保存するだけで、ユーザーの行動自体は何も記録していないので、次回起動が楽になるという以外の効果は無く、引き継がなくても問題ないから
・更新時にdefineの内容を変更している場合、変更を反映するにはevndataを一旦消す必要がある場合があるが、いちいち「evndataだけは消してください」と指示するのも微妙なので、「saveフォルダをコピーして最新版に入れてください」等の指示でセーブフォルダだけ持ってきてもらえばセーブを引き継げるという仕様にするため
というところだろう。

◆番外編:サムネイル画像
savescreenshot命令によって作成される、スクリーンショットの画像。普通の画像と同じようにスクリプト中でlspなどで呼び出す。
セーブ時にスクリーンショットを撮る場合は、これもセーブのデータと言える。
ビットマップファイルしか扱えないので、あまり量が多すぎると重くなるかもしれないのが玉に瑕なのか? まあ普通は小さな画像だし、そんな大した量にはならないだろう。
セーブデータと同じ数だけ作るはずなので、これも1つのフォルダにまとめるのがベスト。
セーブフォルダ内にthumbsフォルダでも作っていれておくようにすれば、同じく上の指示だけでセーブが引き継げるしわかりやすい。

4code00:2008/10/22(水) 22:57:24
●セーブデータ引継ぎに関する問題点と対応策

さてさて、全然書いてなかったが、このセーブデータの話の主目的はセーブデータ引継ぎの問題の言及である。
Nスク製のゲームがバージョンアップする際、その内容の変更によってはセーブデータの引継ぎに問題がある。
以下のようなものが挙げられる。

1、そこまでに読んでいた部分のスクリプトの行数がずれた場合
 →save○.dat:開始行数がずれる。シナリオテキスト内でずれただけならまだいいが、なんかの命令から始まってしまったりすると非常にへんなことになる。
 →kidoku.dat:既読行数、スキップ可能位置がずれる。
2、ラベル名を変更した場合
 →NScrllog.dat:変更後のラベル名は記録されていないので通過していないものとして扱われる。
3、画像や音声のファイル名やディレクトリを変更した場合
 →NScrflog.dat:変更後のファイル名は記録されていないので読み込んでいないものとして扱われる。

このような問題が発生するので、セーブデータ引継ぎを考えるなら、
1、スクリプトがずれないよう、
 ・内部でセーブされないスクリプトはできるだけ後ろに回す。
 ・内部でセーブされるシナリオ部分などは、行が変わるような修正が起きないように全力で練り、かつ適度に空行を確保するなどして対処しておく
2、ラベルログが間違わないよう、ラベル名の付け方の法則などは変更が必要ないように最初から練っておく。
3、ファイルログが間違わないよう、ファイル名の付け方やディレクトリ構成などを変更が必要ないように最初から練っておく。
などのことが重要。


さてさて、たぶん以上!
知らなかった人は、参考になったかな?
常識だぜってNスクマニアさんも、何かひとつでも新しい発見があったらうれしいな!
いやそこはこうだからってツッコミがある人は、ぜひ入れてほしいな!
では、第二回をお楽しみに!

ふう。

(ところで今ここ過疎ってるし、誰も見てなかったら空しくねーか?)
(ま、まあ、自己満足だしいいじゃん、とか)

5code00:2008/10/23(木) 22:42:27
★第二回:上部メニューバーに関するtips

こんばんは、勝手にNスク講座のお時間です。
第一回は>>2-4です。
第二回は、画面上部、タイトルバーの直下にあるメニューバーの設定をお届けします。


●メニューバー消去

いきなりですが、「メニューバーを表示しない」という手があります。
deletemenu命令で実現できます。
メニューバーの各種動作は、基本的にWindowsのダイアログでの操作になりますから、完全にゲーム画面内の動作だけであらゆる動作をさせたい、という場合などには、消してしまうのも手です。
上部メニューバーの動作はカスタマイズできませんからね。

ですが、筆者は反対です。
ゲーム内のコンフィグなどの環境設定画面は、誰でも一目で即座に操作できるでしょうか?
その画面は、いつでも出せるでしょうか?
たとえば、タイトル画面でいきなり音量を下げたかったとして、その場で下げられますか?
ゲーム内の演出で、メニュー画面が出せないということはありませんか?
というわけで、ゲーム独自でない基本的な操作感に関係する設定は、メニューバーに置いておき、いつでも操作できたほうがいいと思うのです。

当然、音声もほとんどなく、文章速度が問われるような文章もなく、画面をフルスクリーンにしたりもしないシンプルなゲームなら、メニューバーはなくていいと思います。
まああとは、独自コンフィグの自信具合で、お好みです。


●初期メニューバーをちょっと整理する

何も設定しない状態で、メニューバーには
「画面」「フォント」「表示形式」「文字速度」「ボリューム」「選択肢まで進む」「オートモード」「CD-DA」「バージョン情報」「終了」
というメニューが並んでいます。
基本的にはそのままでいいけど、CD使わないからCD-DAはいらないなあ、というときなどに、いらないメニューだけを消去することができます。
killmenu命令で実現します。
任意のメニューを消すことができますが、プルダウンで出てくる内容や、メニュー項目名など、詳細なカスタマイズはできません。
次に解説する、というか今回のメインな、insertmenu命令が実装されたことで、ほとんど用無しになったと言える命令です。

6code00:2008/10/23(木) 22:43:44
●メニューバー全体を自分で構築し直す

さて、ようやく今回のメインです。
resetmenu命令と、insertmenu命令によってのメニューバーのカスタマイズ。
resetmenu命令は、メニューバーからメニューを全て消す命令です。deletemenuと違い、項目を消すだけでメニューのバー自体は消さず、ここにメニューを自分で付け足していきます。
insertmenu命令は、メニュー項目として表示する文字列と、実行する命令をひとつずつ記述し、メニューバーを構築していきます。

◆メニューの構築法
○基本的に。
resetmenu
で既存のメニューを排除した後、

insertmenu "メニュー項目名", 実行する命令(, メニューの深さ)

という形式で、順番に記述していきます。

insertmenu "バージョン情報", version
insertmenu "タイトルに戻る", reset
insertmenu "終了", end

などと順に並べていきますが、ちょっと注意。
このメニュー、なぜか逆順に表示されます。
左から読むとして、なのですが、上のように書くと、
[終了][タイトルに戻る][バージョン情報]
という状態になります。
横書きの文字なので、直感的には[バージョン情報][タイトルに戻る][終了]となりそうなのですが、これが逆なのです。
右から、と考えれば正常なのでしょうか。
ともかく、メニューは一番右に出したい項目から書いていきます。
左からのほうが考えやすかったら、一度書き並べてから、逆順に整理しなおすといいでしょう。

○さて、最初にメニュー項目名のルール。
メニュー項目名は、captionなんかと同じで、半角文字は偶数文字の組にしなくても普通に使えます。
ウィンドウズ標準っぽい部分だからでしょうか。
まあ、あまり英字で設定したいメニューはありませんが、英字にもできますよ、ってことで。

○さて、実行できる命令を、以下に列挙します。
sub
end
reset
version
textspeed
textslow / textmiddle / textfast
waveon / waveoff
dwavevolume
window / full
skip
kidokuon / kidokuoff
auto
font
clickdef / clickpage
cddrive
cdon / cdoff
(autospeed)
以上です。たくさんあるようで、対になっているのを1つにまとめると大したことありませんね。
最後のautospeedがカッコに入れてあるのは、設定・実行はできるものの、動作が完全でなく、まだ仮実装予定段階のようだからです(まともに機能しないので使わないほうがいいでしょう)。

○「(, メニューの深さ)」について。
これは、最初の命令、「sub」を解説することになります。

メニュー構築は、基本的に、

insertmenu "タイトルに戻る", reset
insertmenu "終了", end

と順に並べていきますが、あまり多く並べると見づらいですし、どこに何があるかわかりづらいです。
よって、項目別に、階層化することを考えます。
簡単にいうと、いくつかのメニューを1つのメニューにまとめます。
そこでsubという命令が使われます。

insertmenu "システム", sub
insertmenu "タイトルに戻る", reset, 1
insertmenu "終了", end, 1

このように書きます。
こうすると、メニューバーには[システム]というメニュー項目ひとつが登場し、その[システム]をクリックすると、[終了][タイトルに戻る]がその下に並んで表示される、ということになります。
ここで一旦注意。
subの下にくるメニューはsubの下に書いていいのですが、そのsub内の同じ階層のメニューには、最初に書いた「なぜか逆順の法則」が適用されます。すなわち、直感的にはタイトルに戻る→終了と書けばメニューにもそのような順で出てきそうなのですが、実際は終了→タイトルに戻るの順で出てしまうのです。よって、望む順とは逆に書く必要があります。

さて、さりげなく(, メニューの深さ)が出てきました。最後の「, 1」です。
この数字は、「subの中の1段階目にある」ということを意味します。

insertmenu "メニュー", sub
insertmenu "システム", sub, 1
insertmenu "タイトルに戻る", reset, 2
insertmenu "終了", end, 2

たとえば、このように、subと数字を増やしていくことで、より深くメニューを階層化することができます。
なんでもなく書きましたが、subによるメニュー名まとめ項目も、同じく階層番号を付けることでプルダウンの中に含めることができます。
この階層も、あまり増やすと逆にみづらくなるので、3段階くらいまでにしましょう。

設定の仕方の基本は以上です。次に、設定内容の命令に行きましょう。

7code00:2008/10/23(木) 22:45:52
【設定できる命令】

◆システムメニュー
・end
・reset

[設定推奨度] ○

[関連命令]
end
resetdlg
reset

[解説]
endは、ウィンドウ右上の[×]ボタンと同じ効果を発揮します。すなわち、「終了しますか?」というyes-noダイアログを出して、「はい」を選択するとプログラムを終了します。
「終了」「ゲームを終了する」などというメニュー名で利用されます。
実行節でのend命令とは、ダイアログが出るか出ないかの違いです。
[×]ボタンと同じではあるものの、フルスクリーンでは[×]ボタンは当然表示されないので、実装しておくといいでしょう。
resetは、実行節のスクリプトでの「systemcall resetdlg」に該当します。「リセットしますか?」と聞いて、プログラムを最初から始めます。
実行節のreset命令は、すべては把握していませんが一部のデータはリセットされないようで、完全なリセットにはならないので、このメニューとは違うといえそうです。
「リセット」「タイトルに戻る」などというメニュー名で利用されますが、タイトル画面ではなく、起動する最初から始めます。
必要度は未知。テスト段階ではよく使用することは間違いないですが、実際のプレイでどのくらい使用するかは、好みの問題です。


◆バージョン情報
・version

[関連命令]
versionstr
(exec_dll "pverinfo.dll/")

[設定推奨度] ◎

[解説]
versionは、バージョン情報ダイアログを表示するメニューです。
デフォルトではNScripter自体のバージョン情報、すなわち「NScripter Version○ プログラム製作 高橋直樹」という情報が表示されてしまいます。
従って、ゲームを作成する場合は、必ず定義節でversionstr命令を実行し、そのゲーム自体のバージョン情報や製作者情報に書き換えましょう。
versionstr命令は、「versionstr "一行目", "二行目"」の形で、二つの文章で設定し、バージョン情報ダイアログでは二行で表示されます。半角文字なども問題なく使用することができます。
また、バージョン情報には文字列しか表示できませんが、Takashi Toyama氏(君影草工房)によるdll、pverinfo.dllを使用することで、バージョン情報に画像を利用することができます。ロゴなどを入れたカッコイイバージョン情報を出したい場合は利用するといいでしょう。

8code00:2008/10/23(木) 22:46:39
◆文字表示速度
(・textspeed)
・textslow / textmiddle / textfast

[設定推奨度] ◎(基本的にはtextspeed以外の3つのみ必須)

[関連命令]
defaultspeed
textspeeddefault
!sd
---------
setwindow
textspeed
!s

[解説]
テキストウィンドウに表示する表示文の、一文字一文字が表示される速度を設定する命令群です。
まず最初に大事な概念として、文字表示速度には
「デフォルト速度」「現在の設定速度」
という2つの状態があります。
textslow・textmiddle・textfastの3つのメニューは、「デフォルト速度」を調節します。
一方、「textspeed」は「現在の設定速度」を調整します。
この二種類は、両立できません。
まず、デフォルト速度から。
defaultspeed命令は、定義節に書く命令で、
defaultspeed 40, 20, 0
のように、三種類のデフォルト速度を設定します。この数字(ミリ秒)が、順にtextslow・textmiddle・textfastに当たります。
また、textspeeddefault命令と!sd命令は、現在の文字表示速度をデフォルト速度に戻すという命令です。!sdの場合にはついでにテキストウィンドウを表示します。
さて、これらに対し、メニューバーのtextspeed、そして文中のtextspeed命令や!s命令は、「現在の設定速度」を変更する命令です。
テキストウィンドウを表示するおなじみの命令であるsetwindowにも、!sなどと同じ文字速度設定が含まれています。
そして、実は初期状態からsetwindowがかかっているので、「現在の速度設定」はマニュアルにある初期速度になっています。
メニューバーのtextspeedは、文字速度を音量設定のようなバーで調節します。
これらの「現在の設定速度」が設定されている場合、「デフォルト速度」が無効になってしまう、という問題があります。
簡単に言うと、!sやsetwindow、そしてメニューバーのtextspeedなどによる「現在の設定速度」が設定されている間、メニューバーからtextfast「速い」などを選択しても、効果がないのです。
従って、一度演出上の都合で!sをした場合や、setwindowをした場合、通常の文章を表示する前にtextspeeddefaultか!sdで、必ずデフォルト速度に戻しておく必要があります。
これはtextslow・textmiddle・textfastを実装する場合ですが、ここでひとつ問題点。実は、メニューバーのtextspeedで設定した速度はデフォルト速度ではないので、!sやらsetwindowやらで速度が変更された場合、その速度に戻す手段がありません。
従って、メニューバーに設定するのは、textspeedよりはtextslow・textmiddle・textfastのほうがいいと言えます。
ともかく、メニューバーのメニューとしてtextslow・textmiddle・textfastとtextspeedは両立できません。
なお、textslow・textmiddle・textfastは、必ずしもこの3つをセットで設置しなくてもかまいません。というのは、経験上「遅い」を選択したいプレイヤーなんていないと考えられるので、「普通」「ノーウェイト」の2つにする、という手もあるからです。
ちなみに筆者は、前述の問題点以外でも、そもそも文字速度は音量とは違ってtextspeedのバーで細かく設定するほどのものではないと思うので、簡易設定的な「textslow・textmiddle・textfast」を設置することをおススメします。ただし、やっぱり「遅い」なんて選ばないので、「普通」「速い」「ノーウェイト」ぐらいがベストです。
まあ、好みですけどね。

----------
相変わらず長いなっ!
命令はまだまだあるよ!
後編に続くっ!
----------

9MIM:2008/10/24(金) 00:52:17
ものっそ参考になりまくりです。
特に引き継ぎについては、今こちらでも試行錯誤していた段階でした。
本当にありがとうございます。
引き続き楽しみにしています!

10code00:2008/10/24(金) 21:56:18
>>9
どうもです。
参考になったのならやっほーです。
最終チェック段階とのことで、セーブ引継ぎ関連だけでも先に書きたいこと書いとこうと間に合わせた甲斐がありましたw
それでは、続けさせてもらうことにします。
引き続き……


の前に>>2-4へ自分で突っ込むぜ!
つまりいくらかの訂正といくらかの解説付加!
たいした内容でもないけど!


★第一回+:NScripterのセーブファイルに関するtips訂正&補足
>>2-4と合わせてお読みください。


>>2
>様々な種類のセーブデータ
>たぶん全種類
NScripterのセーブファイルはちゃんと6種類で全種類です。
ファイルを扱う機能はいくつかあるので、他のファイルをセーブにできないことはありませんが、デフォルトでは6種類。

>◆save○.dat
>savedir命令によって1つのフォルダにまとめるのがベスト
よくある注意を忘れました。NScripterにはフォルダを作る機能がないので、フォルダを指定してファイルを保存する命令を出す場合には必ずそのフォルダ自体を手動で作っておく必要があります。
savedirでsaveフォルダを指定してsaveフォルダがないと何も保存してくれないので注意。

>◆gloval.sav
>glovalon命令によって作成される。
そんな命令ないです。globalonです。
gloval.savを作るのがglobalonってのは、なんかのギャグですか高橋直樹さん。

>>3
>◆evndata
envdataです。イベント・データじゃなくてエンヴァイロメンタル・データですから。
自分で環境データって書きながらなぜ間違えたんだぜ?

>このファイルは(略)ユーザーの行動自体は何も記録していないので
どう見ても嘘です。
envdataこと環境データには、上部メニューの選択項目(画面モード、文字表示速度、音量、既読スキップかすべてスキップか、文字送りモードなど)や、それらの要素をスクリプト内で設定した場合などの環境周りのデータが入っています。
よって、ユーザーが何もしなければユーザーの行動は何も記録しませんが、上部メニューなどからそれらの要素を変えた場合は当然そのユーザーの行動を記録することになります。
フルスクリーンにしてからそのまま終了させた場合、次回起動時に勝手にフルスクリーンになるのは、envdataの効果です。

>変更を反映するにはevndataを
だからenvironmental dataですってば。

>◆番外編:サムネイル画像
>普通の画像と同じようにスクリプト中でlspなどで呼び出す
普通の画像と違って「あるとは限らない」気がするので、fileexistでチェックでもしといたほうがいい…んでしょうか。

>セーブフォルダ内にthumbsフォルダでも作って
無論手動で。
ホント、Nスクが自動で作ってくれればいいんですけどねぇ……。

>>4
>1、スクリプトがずれないよう、
>・内部でセーブされないスクリプトはできるだけ後ろに回す。
スクリプトを読む順じゃなくて、勝手に位置を回していいの? という疑問が湧くので補足です。
NScripterの動作として、
・まず全ファイルを読み込んで連結し、
・冒頭の;modeとvalueを読み、
・*defineを探し出して飛んで読み始めて行を順に辿り、
・gameにたどり着いたら*startを探して飛び、
・それ以降は行を順に読み、ラベルジャンプ指定などによってシステムを回していきます。
よって、
・00.txtの冒頭に;mode指定とvalue指定があるならすること
・どこかにある*defineを順に辿るとgameがあること
・*start以降の流れがgotoなどできっちり制御されていること
これだけ守れば、どこにどのラベルを書こうが何の問題もありません。

>2、ラベルログが間違わないよう、(略)最初から練っておく。
>3、ファイルログが間違わないよう、(略)最初から練っておく。
これらで取れるデータの代わりに、グローバル変数に記録を残してもいいわけで、最初からグローバル変数でやっておくってのもアリです。
便利は便利ですが、前述の注意は必要。


以上。

★第一回:NScripterのセーブファイルに関するtips
>>2-4,>>10
たぶん完結!

★第二回:上部メニューバーに関するtips
前編は>>5-8
後編はこれからだよ!

11code00:2008/10/24(金) 23:11:48
★第二回:上部メニューバーに関するtips 後編

さて、勝手にNスク講座、第二回後半、はじまるよー。
第一回は>>2-4,>>10です。
第二回前編は、>>5-8です。合わせてお読みください。

今回はいきなり続きのメニュー項目から。


◆音量
(・waveon / waveoff)
・dwavevolume

[設定推奨度] ◎(dwavevolumeのみ必須)

[関連命令]
bgmvol
chvol
voicevol
sevol
他音声制御系

[解説]
waveon、waveoffは、そのままwaveを鳴らすか鳴らさないかの設定です。
waveoffを選択している場合、鳴らす命令を出したりボリュームをいじっても、waveが鳴りません。
しかしwave限定で止める意味が限りなく薄いので、必要ないでしょう。
dwavevolumeは、waveとついていますが、dwave系音声命令全般に効きます。bgm命令も同類です。
どのくらいの音量でBGMや効果音を鳴らしたいかはそれぞれのプレイしている環境や状況次第なので、メニューバーがあるなら絶対に置いておきたい設定事項です。
ダイアログが開き、ボイス・効果音・BGMの3つの項目のスライダーがあって、それぞれ音量調節ができます。
つまり、voicevolとbgmvolとsevolがいっぺんにあるようなものです。
非常に便利ですね。
なお、このダイアログ内の項目は、実行ファイル本体をいじらないと変更できません。
たぶん後に書きます。


◆画面モード
・window / full

[設定推奨度] ○(入れるならセットで)

[関連命令]
menu_full
menu_window
mode320
mode400
mode800
isfull

[解説]
初期起動状態では、windowが選択されています。windowを選択していると、設定がなければ640×480の画面で、mode命令があればそれぞれ設定したサイズになります。
fullを選択していると、フルスクリーンになります。フルスクリーン中はメニューバーが消えていますが、画面最上部のメニューバーがあるはずの位置にマウスポインタをあわせると、メニューバーが出てきて操作できるようになります。
endのところで書きましたが、フルスクリーンにすることを考えればメニューにendはあっていいと思います。
スクリプト内のmenu_window命令、menu_full命令と効果は同じであり、また、isfull命令によってウィンドウモードかフルスクリーンモードかを確かめることができます。(システムカスタマイズで、ウィンドウモード・フルスクリーンモード切替ボタンを作るときなどに使うのでしょう。)


◆文章スキップ
・skip
・kidokuon / kidokuoff

[設定推奨度] ○(kidokuonとoffは入れるならセットで・kidokuonを入れるなら当然skipもセットで)

[関連命令]
kidokuskip
kidokumode
mode_wave_demo
skipoff
isskip

[解説]
skipメニューは、初期状態では「次の選択肢まで進む」として実装されています。
その通りで、テキスト部分を高速で回し、textgosubの飛び先以外でのbtnwait系命令や選択肢が出てくるまで進み続けます。
選択肢でストップします。
この動作ですが、定義節でkidokuskip命令を実行しておくと、「既読の文章だけスキップ・それ以外なら止まる」というモードになります。つまり、すでに読んでいる部分ではあるものの別のセーブデータで開いていたり、セーブしていなかったりした部分の既読テキストだけをすっ飛ばしてくれます。
さて、この既読モードですが、既読以外の文章をスキップしたい場合に、kidokuonとkidokuoffの切り替えを行います。すなわち、既読文章をして記録されていない部分を本当に選択肢までかっ飛ばしたい場合、kidokuoffにすれば実現できるわけです。
kidokumodeは、この状態で、メニューのkidokuonとkidokuoffにあたる切り替えを行います。
アドベンチャーゲームとかノベルゲームというものは、普通は文章を読むものなので、文章スキップしてどうすんねんと思いがちです。しかし単に続けて流してプレイしていくだけならともかく、実際はスキップしたい状況はいろいろ考えられますので、スキップしたいならさせてあげればいいじゃんという話です。
スキップ中であるかどうかはisskipで検出できます。スキップ中ならボタンを出さないで処理を軽くする〜などと使います。

12code00:2008/10/24(金) 23:13:20
◆オートモード
・auto

[設定推奨度] △

[関連命令]
automode_time
isskip

[解説]
スキップと似ていて、選択肢まで勝手に進むモードです。
ただしこちらは、かっ飛ばさず、読める速度で淡々と進んでいきます。
クリックせずに眺めていたい場合や、プレイ動画なんかで使われる感じでしょうか。
速度はautomode_timeで設定できますが、文字数を考慮した進み方などにしたい場合は、システムカスタマイズなどで頑張るしかありません。
メニューバー項目として、なにやらautospeedという項目が潜んでおり、作成中のようです。
(現在の状態でautospeedメニューを呼び出すと、スライダーが最速から動かせないので、オートモードが最速状態になります。)


◆フォント
・font

[設定推奨度] △

[関連命令]
font
defaultfont
spfont

[解説]
テキストのフォントを選択する、正確にはサブメニューを出します。
クリックするとフォントの一覧が出て、そこから選択します。
選択した時点では画面上のフォントは変更されず、それから先で表示される文字のフォントが変更されます。
人それぞれ使いたいフォントがあるのかもしれませんが……私にはさっぱりです。
作品に適したフォントになるように、製作者があらかじめfont系命令で設定しておけばいいと思います。
普通、デフォルトでいいと思いますが。


◆文字送り設定
・clickdef / clickpage

[設定推奨度] × / ◎(全画面ノベルタイプのみ必須・入れるならセットで)

[関連命令]
@
\
clickstr
texec

[解説]
「1ページごと」「普通」というクリック送りの設定とされています。
clickpageメニューを選択していると、正確にはクリック待ち命令「@」が無視されます。
そのまま改ページ「\」まで流し、文章をクリック切りではなくページ切りにします。
要するに、全画面のノベルゲームで、文章をいちいちクリックで出さずに、前面に表示して小説のように読みたい、というときに使う設定項目です。けっこう考えられる要求なので、このタイプでは必須だと思います。
下部に数行のテキストウィンドウを出す形式のゲームでは、どのみち文書を一気に読むことはできず、あまり意味がないのでいりません。
1行で1ページが終わっていたりすると、このメニューが何を設定したのかすらわからなかったりします。
ところで、clickpageを実装する場合、clickpage状態での文章流しテストをしてみることが重要です。clickstrで適当に改ページしてくれると思っていたような部分があった場合、無視して流して勝手につまってエラーで落ちるからです。


◆CD音楽 CD-DA(CDダイレクトオーディオ?)
・cddrive
・cdon / cdoff

[設定推奨度] ×

[関連命令]
chkcdfile
chkcdfile_ex

[解説]
その昔、CDで配布するゲームで、音源をインストールせずにCDから流す、というものがあったようです。
現在はそんなことをする意味はあまりなく、公式にも非推奨となっています。
cddriveはドライブ選択、cdonとcdoffでCDを流すかどうかを設定します。
まあ、普通に、いらないでしょう。

13code00:2008/10/24(金) 23:15:25
○終わりに
長かったですね。
命令解説は以上です。

さて、そんなこんなで、第二回もラストです。
最後に、現在自分で使っているメニューバー設定をサンプルとして載せておきます。

resetmenu
insertmenu "バージョン情報", version
insertmenu "環境設定", sub
insertmenu "スキップ設定", sub, 1
insertmenu "すべてスキップ", kidokuoff, 2
insertmenu "既読のみスキップ", kidokuon, 2
insertmenu "文字速度", sub, 1
insertmenu "ノーウェイト", textfast, 2
insertmenu "速い", textmiddle, 2
insertmenu "普通", textslow, 2
insertmenu "画面", sub, 1
insertmenu "フルスクリーン", full, 2
insertmenu "ウィンドウ", window, 2
insertmenu "音量", dwavevolume, 1
insertmenu "システム", sub
insertmenu "ゲームを終了する", end, 1
insertmenu "タイトルに戻る", reset, 1
insertmenu "オートモード", auto, 1
insertmenu "テキストスキップ", skip, 1

……はい、ギャルゲスレに書いたやつそのものですね。
このメニューはテキトーではなく、色々考えた結果こうなっている、という話でした。
ここまでの話で何がなんだかわからない場合、とりあえずコピペで実装してみて、色々いじって確かめながら把握していきましょう。
また、掲示板ではタブや半角スペースが無視されてしまうので入っていませんが、sub内の階層メニューは階層ごとにそれぞれ字下げしておくとわかりやすいです。

なお、関連で、

versionstr "testscript version0.0", "(C) code00 2008"
defaultspeed 22, 12, 0
kidokuskip

のような設定が*define内にあります。

以上、
★第二回:上部メニューバーに関するtips
でした。

14code00:2008/10/25(土) 23:31:38
-----------------------------------------------
★第一回:NScripterのセーブファイルに関するtips
>>2-4, >>10, >>14 <-new!

★第二回:上部メニューバーに関するtips
>>5-8, >>11-13
-----------------------------------------------

第三回に行こうと思っていたら、画期的なものを見逃していたことに気付いたので、第一回補足追加。

★第一回:NScripterのセーブファイルに関するtips 補足2

この次の次ぐらいでまとめるはずの、Nスクサイト紹介に載せるはずだった、紹介する必要があるのか謎なぐらい「Nスクと言えばここ!」という感じのサイト
【NScripter Scripting Factory】 ttp://senzogawa.s90.xrea.com/
(《リファレンス》→ ttp://senzogawa.s90.xrea.com/reference/NScrAPI.html)
なのですが……
リファレンスは置いておいて。

>>10で出した
>NScripterにはフォルダを作る機能がないので、(略)フォルダ自体を手動で作っておく必要があります。
この、フォルダを作る機能がないという問題ですが。

フォルダを作るDLLがあった

というすごい事実に気が付きました。まさにこのリファレンスのサイトに。
メニューのToolの、NScripter向けプラグインのところの
「フォルダ作成、ログ吐き出し、設定書き出し機能追加プラグイン」がそれですね。
「szpd.dll」というDLL。
このDLLを入れておいて

exec_dll "szpd.dll/mkdir save"

とか命令を書くだけで、フォルダを作れます(この場合はsaveフォルダ)。
これは楽だー。
起動時に、defineの中ででも唱えておけばいいですね。
すでにあるフォルダを壊したりはしないので、フォルダや中身がある状態で呼んでも大丈夫。

ちなみに追加DLL類は、dataフォルダでも作って入れておいて
exec_dll "data\szpd.dll/mkdir save"
とか指定すれば、exeと同じ階層に置かなくても実行できます。(DLLがどこにあろうとフォルダが作られるのはexeと同じ階層。別の階層に作りたい場合はdata\saveとか指定します。セーブフォルダの場合はexeと同じ階層に作るほうがよさそうですけど。)
また、いくつものDLLを使う場合は、arcファイルなんかとともにフォルダにまとめて入れておくといいかもしれません。
(arcも番号振って複数にできるので、構成はdata/arc/arc、arc1……とdata/dll/○.dll、△.dllみたいにしたほうがいいかも……やっぱり好みの問題ですが)


ところでなぜ、最初からsaveフォルダ作っておいてもいいのにNScripterに作らせようという話をするのかというと、

・空のフォルダは解凍時に自動判断で削除してしまう解凍ソフトがある らしい(実例は知りませんが)
・↑の対策として、内容のないダミーファイルを入れておくという手がどこかで書いてあったが、ダミーファイルはなんとなく気持ちが悪い
・しかし空のフォルダがあるのはなんとなく微妙
・セーブデータを削除したい場合はフォルダごと削除できるほうがいい気がする。というか空のフォルダを削除したらまともに動かなくなるってなんか嫌な気が。

とかそんなの。
わー、やっぱり好みの問題だ。

有名サイトだし、今回はすでに知っている人にはまるで意味のない記事になりましたが……まあ自分メモでもあるあるしいいか。

無意味に次回予告!
★第三回:NScripter実行ファイルのカスタマイズに関するtips
をお楽しみにっ!

(……人によってはこれだけで何書くつもりかわかっちゃいそうだけど!)

15のら:2008/10/26(日) 18:56:36
おぉ〜〜〜〜 なんかめちゃくちゃ書いてある
ありですよ〜www ><b
妄想板でレスくれた人ですよね?上部メニューはもろコピペさせてもらいました
いやスイマセンorz

あとセーブ関連についてはかなり参考になりました。
素人の私が言うのもなんですがセーブデータ引継ぎの際には
envdateも引き継がないとグローバル変数に入れたタイトルやセーブ時間は引き継げないようです;;

とはいえ↑のセーブ関連の情報のおかげで本当に助かりましたm(_ _)m
お礼申し上げます;;

16code00:2008/10/26(日) 21:08:25
>envdata
うおっ本当だっ;
envdataに関する書き込みがほぼ全部無意味に; 失礼しましたっ;
Nスク素人なのは私もなので、指摘はありがたいです。……お互い頑張りましょう(公開作何も作ってない私が言うのもアレですが;

ちょっと実験した結果、envdataにはグローバル変数の内容は保存されていないのですが、
「現在gloval.savを使用中である」という情報が入っているようです。同様に、NScrllog、NScrflog、kidoku等も。
そのため、envdataがないと、globalonなどを実行して新たなgloval.savなどを作って上書きしてしまうため、読み込めない模様。
つまり、ラベルログもファイルログも既読スクリプトも全滅です;

まったく無関係な使用中のテストスクリプト(globalon使用)のenvdataを代わりに入れても正常に引き継げました。
要は、globalon、kidokusukip、labellog、filelog命令を実行した後のenvdataがあればいいわけですね。
なので更新する際にはそちらでenvdataを入れちゃうって手もありますね〜。
あとは、セーブファイルを引き継ぐ前に、一旦タイトル画面を出して閉じて(envdata作成)、それからセーブフォルダを引き継ぐとか。
(envdataを消さないといけないような更新がなければ、envdataもコピーすればいいという話ですが)

あ、第一回完成おめでとうございます。感想等はプレイ後にあっちのスレで書かせてもらいます〜。

17のら:2008/10/27(月) 18:26:28
迅速な対応ありがとうございます。
こちらでも見たんですがenvdateにはデータそのものはやっぱり入ってないみたいですね
まぁ…1kbだし当然でしょうけど^^;
saveフォルダの引継ぎでデータは引き継げるようになりました。

情報ありがとうございますw

18code00:2008/10/29(水) 23:11:00
-----------------------------------------------
★第一回:NScripterのセーブファイルに関するtips
>>2-4, >>10, >>14-17

★第二回:上部メニューバーに関するtips
>>5-8, >>11-13
-----------------------------------------------

★第三回:NScripter実行ファイルのカスタマイズに関するtips

さて、ちょっと間を開けて第三回。
今回はスクリプトではなく、nscr.exe自体を改造するお話です。
もう必要ないやって部分まで全部書いているので、たぶん大部分は意味ねーのです。
そして親切なのか不親切なのかわかりにくい説明ごちゃごちゃ仕様はいつもどうり。


◆ファイル名の変更
とても普通ですが、実行ファイル名は、普段ファイルを取り扱っている環境で変更できます。
大抵はエクスプローラでしょう。
やり方は、アイコンを右クリックして「名前の変更」を選ぶとか、アイコンを選択して名前部分をクリックする…とか、アイコンを選択してF2を押す……とかですが、まあこんなのはゲームを作ろうという人に言うことではないですね。
ファイル名は、それほど意味のない常識ですが、日本語はやめましょう。
半角英数で、作品名や略称や愛称や頭文字などにするといいでしょう。あまり長いとエクスプローラで表示したとき「...」とか省略されたりして微妙なので注意。

◆アイコンの変更
デフォルトのアイコンは青いやつですね。
わりとどんなゲームでも大丈夫な感じですが、そのままだとツクールっぽいというか……ゲーム内容にあったオリジナルのものに変えたほうがゲームらしくなるでしょう。
NScripter自体にはアイコンを変更する機能や支援ツールはないので、外部のアイコン変更ソフトで変えます。
その前に、まずはアイコン自体の作成。画像サイズは標準的な32×32と16×16の2枚で、16×16はタイトルバー横のアイコンにも使われます。アイコン画像を作成するソフトは豊富ですが、また別の話なので「アイコン作成」とかで検索。
exeのアイコンを変更するソフトでは、たぶん一番簡単で有名そうなのが「IconReset」。
やり方は……やってみればできてしまうと思います。
また、あとで紹介する「Resource Hacker」というソフトでもアイコンの差し替えは行えます。

◆ダイアログの改造
・デフォルトでの上部のメニューや、初期状態で選択されている設定
・上部メニューや各種命令から開く、ウィンドウズの標準っぽいタイトルバーと[×]ボタンのついた小さなウィンドウ、ことダイアログ(文字列入力、文字表示速度、音量など)
これらもNScripterの標準機能では変更できません。
これらのウィンドウ部分は、プログラムの本体部分からは独立した、外部リソースという形でプログラムに「くっついて」います。
これらを変更できるソフトとして、「Resource Hacker」があります。
Resource Hackerでexeを開くと、「Icon」「Menu」「Dialog」「Accelerators」「Icon Group」「240」という項目が並びます。
名前そのままで、「Icon」「Icon Group」からアイコンの変更ができます。これは省略。
「Menu」は上部メニューです。リソーススクリプトという、プログラムのようなものがありますが、シンプルでわかりやすいので、増やしたり減らしたり並び替えたり名前やデフォルト選択の変更くらいはたぶんカンでできてしまうと思います。内容をテキストの要領で書き換えて、「スクリプトをコンパイルする」でコンパイルし、上部メニューバーのファイル→保存やらCtrl+Sやらで保存します。保存する際、何気にオリジナルのバックアップを作成してくれます。
「Dialog」はダイアログです。順に見ていけば、もしくは名前からわかると思いますが、文字列入力は「IDD_DIALOG」、文字表示速度は「IDD_TXTSPDDLG」、音量は「IDD_VOLUMEDLG」ですね。中身のスクリプトは、「CAPTION」がタイトル、「FONT」がフォント等、見ればこれも大体わかると思います。最上部のタイトル脇の数値がダイアログを出す場所の左上のx座標,y座標,右下のx座標,y座標。スライダー、ボタン、ウィンドウ、文字列入力のNScripterから指定された説明文字列の表示位置などは、右下に出るDialogの、実際の表示自体をマウスでいじることで調節できます。左クリックでドラッグすれば移動、右クリックでメニューを出して削除したり、普通の操作です。操作する文字列やバーなどのアイテムの位置情報は、CONTROLの項目の最後の数値であり、画像のほうを動かすと自動的に変わってくれます。手と目でやっては位置をうまく合わせにくいという場合は、数値で設定するといいでしょう。

19code00:2008/10/29(水) 23:12:22
◆基本ファイル名、ディレクトリの変更
例えば、savedir命令でセーブファイルの5種類の保存場所は指定できますがenvdataの保存場所は変更できません。exeと同じディレクトリに強制的に作られてしまう……非常にウザいですね。
削除して何の問題もないわけではないということが分かってしまったらなおさらウザいですね。
こういった、NScripter側で決められている出力・入力ファイル名、ディレクトリを変更することを考えます。
これには、ある意味万能の最終兵器、「バイナリエディタ」と呼ばれるものを用います。具体的なソフト名では、「Stirling」「バイナリエディタ Bz」などがあります。
さて、まめスレだけに豆知識雑談。
バイナリ、binaryとは、二進数、二進法、二値のデータなどのことです。数値的には、0と1です。コンピュータは色々なソフトウェアを解して最終的にハードウェア、つまり電気のオンオフで処理されることになるわけですが、そのオンとオフが1と0に当たるわけです。つまり、バイナリデータというのは、機械語でできた生のデータだ、ということですね。
バイナリに対するデータ形式としてテキストがあります。今読んでいる文字列です。ファイルの取り扱いとして、文字コードを利用して作られたファイル、htmlなどもテキストデータです。人間がそのまま読めるので非常に便利。それに対し、例えば画像ファイルをメモ帳で開こうとしたら文字になりませんね。この文字にならない、テキストでないデータは全部まとめてバイナリデータです。つまり、exeはバイナリデータです。
バイナリデータですと言ってからなんですが、何もプログラムの機械語の0と1でできている生データをいじろうという話ではありません。バイナリエディタで開いてみるとわかりますが、プログラムは読めないものの、プログラム内の表示文字列はちゃんと文字コードで入っているのです。つまり、文字列は文字列として扱えます。なぜ文字列として扱うのにバイナリエディタかというと、テキストエディタではテキスト以外の部分を破壊してしまうからです。

長すぎる前置きでしたが、要はバイナリエディタで、「envdata」などファイル名の指定がある部分を見つけて、テキスト書き換えの要領でテキトーに書き換えてやればいいというだけの話です。
例えば、envdataをenvに置換すれば、ファイル名はenvとなります。ディレクトリ、フォルダ指定はファイル名と同じようなもので、単に「save/env」とか書き換えてやれば、saveフォルダにenvファイルが作成されます。
他に書き換えたいものとして、「nscript.dat」が筆頭候補です。nsaアーカイブの置き場所はnsadirで指定できますが、それらの場所指定命令を書き込むnscript.dat自体の位置は、nscript.dat内のスクリプトではどうやっても変えようがありません。それ故にexeと同じディレクトリに必ずあることになってしまうわけですが、このせいで「exeと同じフォルダにはreadmeとdataフォルダとsaveフォルダしか置かない」とかいうような整理ができません。よって、「data/scr」とかなんとか書き換えてやって、フォルダにゲームデータのファイルをまとめよう──などということも考えられます。そこまでまとめたいかどうかは好みの問題ですが。
あとは、各セーブデータのファイル名が長くて嫌だったら変える……なんてことがあるんでしょうか。謎。

20code00:2008/10/29(水) 23:14:11
実際に書き換えるに当たって注意点が二つ。
第一に、書き換えて問題がないのは文字列部分だけだということ。文字列は、同じ文字コードで取り扱う限り、基本的にどう書き換えても表示が変わるだけで動作に影響はありませんが、この書き換え時にプログラム部分を消してしまうと動作がバグります。よって、書き換える際は、文字列用にどれだけの幅がとられているのかを見て、その範囲内の名前にする必要があります。
バイナリエディタでexeを開くと、左側にA〜Fのアルファベットと0〜9の数字からなる十六進数表示が、右側に「出来る限り文字コードに直したもの」が表示されます。この両方を使って編集していきます。
左右は同じファイルの内容を表していますが、編集は別々です。
右側の文字列をクリックすると、カーソルがそこへ移動して、入力受付状態になります。こちらは、テキスト形式での入力モードで、普通にひらがなやアルファベットなどを入力できます。入力するファイル名などは半角英数にしておきましょう。
左側の数値列をクリックすると、同じくカーソルが移動して、数値の入力を受け付ける状態になります。こちらは十六進数で、バイナリデータを入力します。こちらは、文字を消すために使います。右側の文字入力モードで、例えばスペースを入力しても、文字入力モードの窓には空白が表示されますが、データとしては「スペースという文字を打った」ということになってしまいます。それゆえに、ファイル名のいらない部分をけずろうと思った場合、「スペースに書き換える」のでは駄目です。右側の文字列窓で消したい文字列の部分にカーソルを合わせると、左側のカーソルも左側の数値列での対応する部分に行きますので、今度はその左側のほうをクリックして、00と入力していきます。半角文字一文字につき二桁(00)です。文字を消したあとは、右側の文字表示は・になります。
さて、書き換えていい範囲ですが、例えばenvdataでは、[空×2]envdata[空白]envdata[空]envdata[空×13]となっており、この範囲にenvdataのファイル名を、空白(バイナリの00)を交えて三回書けばいいということがわかります。よって、[空]ファイル名11文字[空]ファイル名11文字[空]ファイル名11文字[空]というのが最大の範囲の使い方になります。要は、左側のバイナリデータで見て、00をくぎりと考え、他のデータとの間に00が1つ以上あればいいわけです。

さて第二に、同一のファイルの名称を書き換えるときは、全部同じに書き換えましょう。同じファイル名が何箇所かに登場する場合があります(大抵は連続していますが)。単に、不具合を出さないためです。

相変わらずごちゃごちゃして分かりづらいですが、書きたかった内容は以上、

★第三回:NScripter実行ファイルのカスタマイズに関するtips でした。

21code00:2008/10/29(水) 23:20:07
>>17
どうもです。
無事になんとかなったようで何よりです。
>1kb
ですねー。グローバルデータは数千個もあるからどう考えても全然入らないので、最初からどうなってるのかを確かめようと考えられたので、簡単に確認できました。
(「使ってる部分だけ入れてる」とか言われたらやっかいだなーともちらっと思いましたが、グローバルは「環境」データじゃないですし流石にそんなことはなくてよかった。)

22のら:2008/10/29(水) 23:22:47
おぉ…なんつーか、今回はまた重箱の隅つつくような内容ですね^^;

バイナリエディタでのゲームexeの改造は他のゲームで経験があるので出来るんですが
話し合った結果今回は特に変更なしという話になりました。
とはいえこういった話も元になる情報が無ければ出来ないわけで参考情報ありでした(><

23code00:2008/10/29(水) 23:44:42
>>22
どもです。
まめスレですから、こっちのがまめ知識っぽくて正しいのです、たぶんきっと!

さて、バイナリの書き換えはしないとのことですが、自分で実験していていきなりシンプルで重大な問題を見つけたので追記。(書く前に見つけろよと

>>20
>書き換えていい範囲ですが、例えばenvdataでは、[空×2]envdata[空白]envdata[空]envdata[空×13]となっており、この範囲にenvdataのファイル名を、空白(バイナリの00)を交えて三回書けばいいということがわかります。よって、[空]ファイル名11文字 [空]ファイル名11文字[空]ファイル名11文字[空]というのが最大の範囲の使い方になります。要は、左側のバイナリデータで見て、00をくぎりと考え、他のデータとの間に00が1つ以上あればいいわけです。
すまん、ありゃウソだった。
文字列の冒頭位置を元のデータと同じにしないと正常に読み込めないので、文字数は増やせません。envdataなら最大7文字です。save/enとかが最大。
想像通り最初のenvdataが「書き込みファイル名」、次以降が「読み込みファイル名」などのようで、>>20に書いたような書き換えをするとenvが書き込まれるだけで読み込まなくなります。

24名無しさん:2008/12/11(木) 00:35:14
>◆CD音楽 CD-DA(CDダイレクトオーディオ?)
>・cdon / cdoff
ボリュームバーのみ使用するなら問題ないですが
コレを切るとBGMのオンオフの切り替えが出来ません

>◆文字送り設定
システムカスタマイズ時は誤動作します

25<削除>:<削除>
<削除>


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板