空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

カテゴリー:「吉里吉里/KAG 小ネタ」の記事一覧

・2016/11/11|吉里吉里/KAG:セーブラベル名に変数を使用する
・2016/08/27|吉里吉里/KAG:adjustGammaで画像の明度を調整する
・2016/05/31|吉里吉里/KAG:万能ダイスを作ってみよう 後編
・2016/05/24|吉里吉里/KAG:万能ダイスを作ってみよう 中編
・2016/05/17|吉里吉里/KAG:万能ダイスを作ってみよう 前編
・2016/04/28|吉里吉里/KAG:外部フォルダに格納した画像を呼び出すには
・2015/10/17|吉里吉里/KAG:配列変数をテキスト形式で出力する
・2015/05/09|吉里吉里/KAG:YesNoダイアログを使ってみよう
・2015/01/24|吉里吉里/KAG:0か1の整数をランダムで発生させる
・2014/12/12|吉里吉里/KAG:メッセージボックスを表示する

古い記事一覧へ ≫

吉里吉里/KAG:セーブラベル名に変数を使用する  

2016-11-11[Fri]
cm0
tb0

ひさしぶりの吉里吉里2/KAG3 ちょいネタ。
最近ティラノとHTMLばかり触ってたのでカンを取り戻すのが大変。年食うとダメっすな。


*001|セーブラベル名 ←今回のお題

通常は「シーン1」「◯◯ルートA」「選択肢:◯◯◯を選んだ」といったように
セーブラベル名を直接シナリオに書き込むことがほとんどだと思うのですが
ここに変数を代入したいときはどう書けばよいかというのが今回のお題です。

シミュレーションゲーム等でよく見かける「◯日目」というセーブラベル名を変数で制御してみましょう。
「◯日目」の「◯」に当たる部分を変数 f.日数 と定義します。


*001
; 変数 f.日数 に 1 を代入する
[ eval exp="f.日数 = 1" ]

*002|f.日数+'日目'
[ cm ]
この書き方は失敗例です。f.日数が単なる文字列として認識されてしまいます。[ p ]

*003|&f.日数+'日目'
[ cm ]
f.日数の直前に「&」をつけることで「これは変数ですよ」とシステムに伝えています。
変数がセーブラベル名の先頭&変数がひとつしかない場合は、この書き方で大丈夫です。[ p ]

*004|&@'${f.日数}日目'
[ cm ]
変数がセーブラベル名の先頭ではない or 変数が2つ以上ある場合は
エンティティ+@付き文字列即値で対応します。[ p ]



変数が2つ以上ある場合


*001
; 変数 f.日数 に 1 を代入する
[ eval exp="f.日数 = 1" ]
; 変数 f.月 に 1 を代入する
[ eval exp="f.月 = 1" ]

*005|&@'${f.月}月 ${f.日数}日目'
[ cm ]
このときセーブラベル名は「1月 1日目」となります。[ p ]



関数を作って呼び出す場合


ラベル名を返すだけの関数を作っておくとスクリプトの記述量を減らすことができます。


[ iscript ]
/* 文字列を返すだけの関数 */
function labelName()
 {
  return f.年 +'年 '+ f.月 + '月 ' + f.日数 +'日目';
 }


[ endscript ]

*001
; 変数 f.年 に 1、f.月 に 1 、f.日数に 5 を代入します
[ eval exp="f.年 = 1, f.月 = 1, f.日数 = 5" ]

*002|&labelName()
[ cm ]
関数を使った場合。セーブラベル名は「1年 1月 5日目」となります。

*002|&@'${f.年}年 ${f.月}の月 ${f.日数}日目'
[ cm ]
直接書いた場合。セーブラベル名は上と同じく「1年 1月 5日目」となります。


どちらを使うかはお好みで。修正の手間を考えるなら関数のほうがオススメです。


吉里吉里/KAG:adjustGammaで画像の明度を調整する  

2016-08-27[Sat]
cm0
tb0

吉里吉里/KAG ちょいネタシリーズ。

テキストリンクにカーソルが乗っているときだけ画像の明度を上げ
それ以外は画像の明度を下げて表示するスクリプトを書いていきます。
昔のエントリ「oneterを使って遊んでみた」で書いたことのある小ネタなのですが
到底、実用に耐えうるものではなかったので、再度、組み直してきました。
今回は Layer クラスの adjustGamma メソッドを利用しています。


▼続きを読む▼

吉里吉里/KAG:万能ダイスを作ってみよう 後編  

2016-05-31[Tue]
cm0
tb0

(_´Д`)ノ< つづきよ、奥さん。

 リンク:万能ダイスを作ってみよう 前編
 リンク:万能ダイスを作ってみよう 中編

万能ダイスを作ってみようシリーズ最後です。
今回は edit タグを使ってダイスの個数と面数を設定できるようにします。

それではスクリプトから


[ iscript ]

var dice = new Array(); // ダイスの出目を格納しておく配列変数
var diceNum; // ダイスの個数
var diceSide; // 追加:ダイスの面数

/* ダイスロール
---------------------------------------------------*/

// ※引数 num のデフォルト値をdiceNum、maxのデフォルト値をdiceSideに修正

function diceRoll(num=diceNum,min=1,max=diceSide){
 //diceNum = num; // 要らなくなったのでコメントアウト
  for(var i=0; i < num; i++){
   dice[i] = int(Math.floor(Math.random()*((max-min)+1))+min);
   }
  return;
 }
[ endscript ]


つぎはエディット欄を作成します。


*edit
[ cm ]
; エディット欄を作る(ダイスの個数)
[ edit length=50 maxchars=2 name=diceNum ][ r ]

; エディット欄を作る(ダイスの面数)
[ edit length=50 maxchars=3 name=diceSide ][ r ]

; ひとつめのエディット欄にフォーカス
[ eval exp="kag.fore.messages[0].links[0].object.focus()" ]

[ link target=*check ]ダイスロール[ endlink ]
[ s ]

*check
; エディット欄の内容を確定する
[ commit ]

; 数値が入ってない、0が先頭に入っている、どちらかに0が入力されている場合はNG
;ここでは途中で改行してるけどスクリプトは一行で書ききってください

[ if exp="!/^([1-9]\d*|0)$/.test(diceNum) || !/^([1-9]\d*|0)$/.test(diceSide)
|| diceNum == 0 || diceSide == 0" ]


; 変数をリセットして
[ eval exp="diceNum = diceSide = ''" ]

; エディット入力へ戻す
[ jump target=*edit ]

; きちんと入力されているとき
[ else ]

[ iscript ]

// editで入力された変数は全て文字列変数なので数値に変換
diceNum = +diceNum;
diceSide = +diceSide;

[ endscript ]

[ jump target=*diceroll ]
[ endif ]


エディット欄に入力した数値の判定については「正規表現」でググってちょーよ。
では、残りの処理をサクサク書いていきましょう。


*diceroll
; さいころコロコロするころん
[ eval exp="diceRoll()" ]

*result
; tf.count:「◯回目」用のカウンター
; tf.num:出目用のカウンター
[ eval exp="tf.count = 1, tf.num = 0" ]

*loop
; 出目表示:回数は2ケタ右詰め、出目は3ケタ右詰め
[ emb exp="@'${'%2d'.sprintf(tf.count)}回目:${'%3d'.sprintf(dice[tf.num])}'" ]
[ r ]

; カウンターをそれぞれ+1
[ eval exp="tf.count++, tf.num++" ]

; 出目カウンターとダイスの個数が同じになったらループを抜ける
[ if exp="tf.num < diceNum" ]
[ jump target=*loop ]

; それ以外はループ
[ else ]
[ jump target=*end ]
[ endif ]


*end
; ダイスロール終了
[ s ]


じつはワザと処理をスルーしていることがひとつあります。
TRPGをプレイされる方ならご存知だと思うのですが
10面ダイスって最小値が0で最大値が9じゃないですか。

そうなると出目の最小値も edit で指定できたほうがいいですよね。
でも「出目の最小値 > ダイスの面数」という入力ミスがあったら
出目がおかしくなっちゃうから対策を練らないとダメだよなとか。

…………
……………………

∠( ゚д゚)/< できるできるキミなら改造できる(最後の最後で丸投げしていくスタイル)


吉里吉里/KAG:万能ダイスを作ってみよう 中編  

2016-05-24[Tue]
cm0
tb0

(_´Д`)ノ< つづきよー

 リンク:万能ダイスを作ってみよう 前編

前回はダイスの「面数」を自由に設定できるようにしたので
今回はダイスの「個数」を自由に設定できるようにしていきます。

まずは必要な変数を宣言しておきましょう。


[ iscript ]

var dice = new Array(); // ダイスの出目を格納する配列変数
var diceNum =0; // ダイスの個数

[ endscript ]


ダイスの個数が1個のときは普通の変数で良かったのですが
今回は個数が可変になるため、出目の管理を配列で行うことにします。
では、前回作った diceRoll 関数を修正していきましょう。


/* ダイスロール
-------------------------------------------------------------*/

function diceRoll(num,min,max){
 diceNum = num;
// 追加:ダイスの個数に引数 num の値を代入
  if(min > max){min <-> max;} // min が max より大きいときは値を入れ替える
   // 指定したダイスの個数分ぶん回す
   for(var i=0; i < num; i++){
    // 出目は配列変数diceの添字0から順に格納
    dice[i] = int(Math.floor(Math.random()*((max-min)+1))+min);
    }
  return;
 }


※コピペして使うときはスクリプト内の全角スペースをすべて削除してください


おなじみの for 文を放り込んで修正完了です。
それではKAGに戻ってスクリプトを書いていきます。


*test
; ダイスロール関数を実行(6面ダイスを6個ふる)
[ eval exp="diceRoll(6,1,6)" ]

; 結果表示
1回目:[ emb exp="dice[0]" ][ r ]
2回目:[ emb exp="dice[1]" ][ r ]
3回目:[ emb exp="dice[2]" ][ r ]
4回目:[ emb exp="dice[3]" ][ r ]
5回目:[ emb exp="dice[4]" ][ r ]
6回目:[ emb exp="dice[5]" ]


この書き方だとダイスの個数が変わったときに対応できないので修正します。
ついでに「◯回目:」も自動的にカウントするようにしましょう。


*count
; tf.countは「◯回目の結果」のカウンター
; tf.numはダイスの個数のカウンター

[ eval exp="tf.count = 1, tf.num = 0" ]

*loop
; 結果表示
[ emb exp="@'${tf.count}回目:${dice[tf.num]}'" ][ r ]
; カウンターをそれぞれ+1
[ eval exp="tf.count++, tf.num++" ]

; ダイスの個数カウンターの値がダイスの個数と一緒になるまでループ
[ if exp="tf.num < diceNum" ]
[ jump target=*loop ]
[ else ]
[ jump target=*loopend ]
[ endif ]

*loopend
; ダイスロール後の処理


ダイスの個数を増やしすぎると結果を画面に表示しきれなくなるので
レイアウトは最大個数を基準にして組みましょう。

あと、今回は取り上げませんがテキストではなくサイコロの画像で表示したいときは
あらかじめ出目に対応した画像を配列変数に入れて置いて呼び出すのがカンタンだと思います。



diceImg = [ ,dice1.png,dice2,png,... ];
↑こういうのを作っといて……

[ image storage="diceImg[dice[0]]" layer=0 visible=true ]
↑こんなカンジで呼び出す。座標指定とか考えるとちょっと面倒だけども(´ε`;)

といったところで、今回は終了です。
次回は edit タグを使ってダイスの個数と面数を設定できるようにします。


吉里吉里/KAG:万能ダイスを作ってみよう 前編  

2016-05-17[Tue]
cm0
tb0

吉里吉里/KAGちょいネタシリーズ。
TRPG等で使用するダイスツールを吉里吉里で作ろうぜというネタです。
少し改造すればティラノスクリプトでも使えるかと思います。

全3回、内容は以下を予定しています。

 前編:ダイスの面数を自由に設定できるようにする
 中編:ダイスの個数を自由に設定できるようにする
 後編:ダイスの面数と個数をeditで入力できるようにする

まずは基本になる6面ダイスを作っていくよいよい ヽ(・∀・ )ノ
今回、KAGの intrandom は使用しませんのでご注意ください。


[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]
ダイスロールの結果:[ emb exp="f.dice"]

このスクリプトを実行すると6面ダイスを1個ロールした結果を表示します。
f.dice の値は実数で弾き出されるため int で括って整数にするのを忘れずに。

ダイスの個数と面数が固定であればこれで十分なのですが
今回は「万能ダイス」を作るのが目的なのでもうちょい頑張りましょう。


/* 乱数を発生させる関数を作る
------------------------------------------------------------*/

// 引数:min=最小値、max=最大値
function diceRoll(min,max){
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


処理の内容をざっくり説明します。



1.Math.randomで0~1未満の乱数を発生させる


ためしに[ emb exp="f.dice = Math.random()" ]と書いて実行してみます。


0.91977
0.44133
0.51011
0.67559
0.55129
0.49673
0.51269
0.59877
0.78376
0.03391


本当は小数点以下の位がズラズラ並んでいるのですが要らないので小数点以下5位でカット。



2.乱数に「最大値-最小値+1」を乗算する


6面ダイスの最小値は1、最大値は6なので6を掛けます。


[ emb exp="f.dice = Math.random() * ((6 - 1) + 1)"]


0.91977*6 = 5.51862
0.44133*6 = 2.64798
0.51011*6 = 3.06066
0.67559*6 = 4.05354
0.55129*6 = 3.30774
0.49673*6 = 2.98038
0.51269*6 = 3.07614
0.59877*6 = 3.59262
0.78376*6 = 4.70256
0.03391*6 = 0.20346



3.Math.floorで小数点以下を切り捨てた後、最小値を足す


[ emb exp="f.dice = Math.floor(Math.random() * 6) + 1" ]


5.51862 → 5+1=6
2.64798 → 2+1=3
3.06066 → 3+1=4
4.05354 → 4+1=5
3.30774 → 3+1=4
2.98038 → 2+1=3
3.07614 → 3+1=4
3.59262 → 3+1=4
4.70256 → 4+1=5
0.20346 → 0+1=1


Math オブジェクトの floor メソッドは小数点以下を切り捨てます。
詳しく知りたい人は「Mathオブジェクト」で検索すると幸せになれるよ。



ということで最初に書いた

[ eval exp="f.dice = int(Math.floor(Math.random() * 6) + 1)" ]

を diceRoll() を使って書き直していきます。



;1~6の6面ダイスをふる
[ eval exp="f.dice =diceRoll(1,6)" ]
1D 6の結果:[ emb exp="f.dice" ]

;0~9の10面ダイスをふる
[ eval exp="f.dice =diceRoll(0,9)" ]
1D 10の結果:[ emb exp="f.dice" ]

;1~100の100面ダイスをふる
[ eval exp="f.dice =diceRoll(1,100)" ]
1D100の結果:[ emb exp="f.dice" ]


あとは引数 min の値を max の値より大きく書いてしまったときに
自動的に min と max の値を入れ替えるように修正しておきます。
うっかりさんもこれなら安心です。


/* ダイスロール
---------------------------------------------------*/

// 引数:min=最小値、max=最大値

function diceRoll(min,max){
if(min > max){min <-> max;}
// min が max より大きいときは値を入れ替える
return int(Math.floor(Math.random() * ((max - min) + 1)) + min);
}


ということで何面ダイスでも好きなだけコロコロできるようになりました。
次回はダイスの個数を設定できるようにしていきます。

今回はここまでー (´∀`*)ノシ


吉里吉里/KAG:外部フォルダに格納した画像を呼び出すには  

2016-04-28[Thu]
cm0
tb0

忘れた頃にやってくる吉里吉里/KAG ちょいネタシリーズ。

今回の「外部フォルダに格納した画像ファイルをゲーム内で呼び出す」の内容ですが
要は「プレイヤーが用意した画像をゲーム内で読み込ませよう」というネタです。

準備するものは

 ・新規KAGプロジェクトファイル
 ・画像を入れておくフォルダ
 ・読み込ませたい画像
 ・代替用の画像

の4つです。では、いってみましょう。

1.画像を入れておくフォルダの名前を「illust」にします
2.読み込ませたい画像の名前を「chara.png」にします
3.illust フォルダの中に chara.png を入れます
4.illust フォルダを吉里吉里の実行ファイルと同じフォルダの中に置きます
5.代替用の画像の名前を「default.png」にします
6.KAGプロジェクトフォルダの bgimage フォルダに default.png を入れます


それではスクリプトを書いていきます。おーぷん ゆあ first.ks (*'д'* )ノ


[ iscript ]

tf.img_chara = System.exePath + "illust/chara.png";

[ endscript ]


一時変数 tf.img_chara に illust フォルダ内の chara.png 画像のパスを入れます。
System.exePath というのは吉里吉里の実行ファイルが置いてある場所を指しています。

あとは image タグを使って呼び出すだけです。


[ image storage=&tf.img_chara layer=0 visible=1 ]


これを実行すると画面に chara.png の画像が読み込まれるのですが
illust フォルダに chara.png がないとエラーになるので修正していきます。


[ iscript ]

// 変数 imgChara にさっきのパスをつっこみます
var imgChara = System.exePath + "illust/chara.png";

// ファイルがあれば tf.img_chara = imgChara にする
if(Storages.isExistentStorage(imgChara)){
tf.img_chara = imgChara;
// chara.png がないときは tf.img_chara = default.png にする
}else{
tf.img_chara = "default.png";
}
[ endscript ]


Storages クラスの isExistentStorage メソッドを使ってファイルがあるかどうかチェックしています。
ファイルがあるとき(=true)は tf.img_chara にさっきと同じパスが入り
ファイルがないとき(=false)は代替用の default.png を呼び出すようにします。
代替のほうは System.exePath~の記述が不要なのでファイル名だけでおっけいです。


アーカイブ後はゲーム実行ファイルが置いてあるフォルダと同じ場所に illust フォルダを置き
「illust フォルダに chara.png という名前で画像ファイルを入れてね」とアナウンスしておけば
プレイヤーさんが準備したイラストをゲーム内に登場させることが可能となります。
分かりやすいようにサンプル画像を入れて上書きしてもらってもいいかもしれません。


例では一時変数を使用していますが、セーブ・ロード周りで問題が生じる場合は
普通の変数に切り替えるなどして対応してやってください。

といったところで、今回はこれにておしまい。

次回は「万能ダイス作ろうぜシリーズ」をお送りする予定です。
お楽しみにー ε=ε=ε=ヾ(´∀`*)ノ


※2016/05/02 スクリプト修正しました。盛大に間違えてたごめんよ。


吉里吉里/KAG:配列変数をテキスト形式で出力する  

2015-10-17[Sat]
cm0
tb0

吉里吉里/KAGちょいネタシリーズ。
配列変数の中身をテキストファイルで出力する方法です。


▼続きを読む▼

吉里吉里/KAG:YesNoダイアログを使ってみよう  

2015-05-09[Sat]
cm0
tb0

吉里吉里/KAGちょいネタ。
覚えておくとちょっと便利なYesNoダイアログのお話。

自分がよく使うのはゲームのリプレイやギブアップの確認させたいとき。
以下は実際に使っていたスクリプトのコピペです。

*replay
; YesNoダイアログを表示する
[ eval exp="tf.replay = askYesNo('もう一度あそぶ?')" ]

; 「はい」をクリックしたとき
[ if exp="tf.replay == 1" ]
[ jump storage="game.ks" target=*start ]

; 「いいえ」をクリックしたとき
[ else ]
[ jump storage="first.ks" target=*stage_select ]

[ endif ]

YesNoダイアログには決まりがあって

「は い」をクリック → tf.replay = 1
「いいえ」をクリック → tf.replay = 0

となるので、あとは tf.replay の値に応じて分岐させるだけです。
あちこちで使用したい場合はマクロにしてもいいと思います。

[ macro name=YesNo_ck ]
; YesNoダイアログを表示(質問は mp.txt に渡す)
[ eval exp="tf.check = askYesNo(mp.txt)" ]
; 「はい」をクリックしたとき
[ if exp="tf.check == 1" ]
[ jump storage=%sto1 ]
; 「いいえ」をクリックしたとき
[ else ]
[ jump storage=%sto2 ]
[ endif ]
[ endmacro ]

実際に使用するときは次のとおり。

[ YesNo_ck txt='やらないか?' sto1="001.ks" sto2="002.ks" ]

ちょっと大雑把ですが、こんな感じで書けるよということで。

あと、ダイアログの「はい」「いいえ」のメッセージを変えたい人は
YesNoDialog.tjs の 89行目と99 行目付近を修正すればおっけいです。
yesButton.caption と noButton.caption のところです。

では、今回はこれにてー (´∀`*)ノシ


吉里吉里/KAG:0か1の整数をランダムで発生させる  

2015-01-24[Sat]
cm0
tb0

吉里吉里/KAG 小ネタシリーズ。
前にツイッターでつぶやいたものをもう少し詳しく書く。

■今回やりたいこと
 配列変数 Arr の先頭から順に0か1の整数をランダムで放り込む。
 なお、Arr は Arr[0][0]~Arr[4][4]の二次元配列である。

[ iscript ]

// 配列変数 Arr の宣言
var Arr = new Array();

// 配列ぶん回し
for(var i=0; i < 5; i++)
 {
  for(var j=0; j < 5; j++)
   {
    Arr[i][j] = int(Math.random()*2);

    // Arrの添字[i][j]に0か1の整数をランダムで入れる
   }
 }

[ endscript ]

int(Math.random()*2) も Math.floor(Math.random()*2) も
出てくる値は0か1なんだけど変数のデータ型が違ったりする。

実はこの処理の後、配列に入った値に応じて処理を分けようとしたら
エラーが発生してしまった。なんでよ。いみわかんないよヽ(`Д´#)ノ
んで、とりあえずデバッグメニューのコントローラを開いてみると
配列変数に格納されている値がすべて実数型になっていたけど
floor は値を切り捨てるメソッドなので当然といえば当然。

( ゚д゚).oO(まさか、これが原因とかないよなぁ)


これが原因だった (ノ∀`)


整数型に直したらあっさり動いたよ。
ちなみに round メソッドも試したけど結果は floor と同じ。
用途が限定的すぎて「いつ使えばいいんだよ」という小ネタだけど
ランダム処理そのものは覚えておいて損はないので頭の片隅にでも。

なお、KAGで書きたい場合は intrandom 関数を使います。
int(整数型)+ random(乱数)という意味なので出てくる値は整数型。
実数型で出したいときは random 関数を使えばおっけいですよ。

では、今回はこれにて (´∀`*)ノシ


吉里吉里/KAG:メッセージボックスを表示する  

2014-12-12[Fri]
cm0
tb0

吉里吉里/KAG ちょいネタシリーズ。
わりと使用頻度が高いのに記事にしていなかった。

↓メッセージボックスってコレね。正式名称は知らない
メッセージボックス



メッセージボックスを表示する


スクリプトはとても簡単です。


[ iscript ]

System.inform("あんたバカァ?");

[ endscript ]


これだけ ヾ(*´∀`*)ノ
テキストが長いときは「\n」を入れると改行してくれる。
くわしく知りたい人はTJSリファレンスで「\」をキーワード検索してみよう。



メッセージに変数を使いたいとき


メッセージに変数を埋め込みたいときのスクリプト。


*test
; 変数 f.a を評価
[ eval exp="f.a = '吉里吉里'" ]

[ iscript ]

var b = 'カグコ'; // 変数 b を評価

System.inform("私の名前は"+f.a+""+b+"だよ!\n変な名前だよね!");

[ endscript ]


↓実行するとこのように表示される
変数を入れる場合
※背景画像は「誰そ彼亭」さまからお借りしました

"+f.a+" と "+b+" は変数の中身をその場で展開している。
@付き文字列即値でも書けるけど、こっちのほうがラクだと思う。
iscript 内で変数を評価するときは記述する場所に注意が必要なので
不安な人は変数をすべてKAG側で評価しておけばいい。



関数にしたいとき


しょっちゅう使うなら関数にしておくと便利。


[ iscript ]
// 引数aに名前、引数bに正気度
function S_info(a,b)
 {
  System.inform(""+a+"の正気度は"+b+"だよ!\n発狂寸前だね!");
 }

[ endscript ]

*test
; 変数 f.正気度 を評価
[ eval exp="f.正気度 += f.ダイス結果" ]
; 引数aに「カグコ」、引数bに変数 f.正気度 を入れる
[ eval exp="S_info('カグコ', f.正気度)" ]


↓実行するとこのように表示される。
関数にした場合

引数に文字列を入れるときはシングルクォーテーションで括らないとエラーになるよ。
数値のときはそのままで大丈夫。

では、今回はこれにて (´∀`*)ノシ< いあいあ!


現在のページ

Category

Link

Comment

Mailform

Author

Twitter