☆ベルトアクション作成 Beats of rageスレッド☆ (658レス)
1-

113: 2021/05/06(木)02:16 ID:/KeaSO9B(1/5) AAS
訂正 setspawnentry("name", "fire") X setspawnentry "name" "fire" O
@CMD でスクリプトやコマンドを直接呼び出す際は
コマンドに最初から設定されている 括弧やカンマ、ピリオドを消して
スペース記号(見えませんが)で区切って記述しないとエラーになることが多いです。
便利な反面、エラーがでるとかなりてこずります。
スクリプトを弄っていてエラー落ちが発生した場合、便利なのがLogフォルダの
Scriptlog.txt ここに、どのようなスクリプトが実行されているか出力されるので
エラー箇所を特定することになります。
114: 2021/05/06(木)02:24 ID:/KeaSO9B(2/5) AAS
括弧やカンマなど消すといっても getlocalvar("self") これは?
スクリプトや@cmdを使う際にさらに別なコマンドを使うときは
基本どおりの記述でよいので
@cmd bindentity spawn() getlocalvar("self") 0 1 10 1 0 1
この場合 spawn() と getlocalvar("self") は通常の記述
大元の bindentityについては括弧やカンマなど削除して記述します。
bindentity(spawn(), getlocalvar("self"), 0, 1, 10, 1, 0, 1);
本来あるべき姿は上のようになります。
OpenBoRのシステムに直接干渉するので、エラー(大概こちらの勘違い)のさいは
結構な手間になりますが、基本コマンド以上に色々弄れるのが痛し痒し。
115: 2021/05/06(木)02:47 ID:/KeaSO9B(3/5) AAS
>>111さん
すいません、あまりブラウザ更新しないので気付かずに居ました。
画像を拝見しました。
上からっぽくてすいませんが、
1枚の画像からも kt住江様の世界観や作風を大切になさる様が大いに感じられ
ワクワクが止まりません。
いつも人様のムゲンキャラを弄って消費してばかりの私にとって、
いつかは自分もと参考&励みにさせて頂いています。
既存のものを改変するのってとても簡単なので、ついつい人様の作品に弄って楽しんでばかりで
そのぬるま湯から抜け出せすにいます。
別なスレに「作品を完成させられない人」ってのもありますが、私はそのタイプ。
イメージを形に出来る方を本当に尊敬します。
116
(2): 2021/05/06(木)23:33 ID:/KeaSO9B(4/5) AAS
@script
void self = getlocalvar("self");
int MP = getentityproperty(self,"mp");
setlocalvar("T"+self, findtarget(self));
if( frame == 0 && getlocalvar("T"+self) != NULL() ) {
void target = getlocalvar("T"+self);
void vAniID = getentityproperty(target,"animationID");
void TType = getentityproperty(target,"type");
int Boss = getentityproperty(target, "boss");
if(TType == openborconstant("TYPE_ENEMY") && Boss==0 && vAniID != openborconstant("ANI_DIE") && vAniID != openborconstant("ANI_SPAWN") && vAniID != openborconstant("ANI_RISE")) {
changeentityproperty(self,"mp",MP-80);
changeentityproperty(target, "parent", self);
changeentityproperty(target, "type", openborconstant("TYPE_NPC"));
changeentityproperty(target, "hostile", "TYPE_ENEMY");
changeentityproperty(target, "candamage", "TYPE_ENEMY");
changeentityproperty(target, "lifespancountdown", 2200);
changedrawmethod(target, "reset", 1);
setlocalvar("T"+self, NULL());
changedrawmethod(target,"tintmode",3);
changedrawmethod(target,"tintcolor",rgbcolor(128, 255, 255));
}
}
@end_script
117
(1): 2021/05/06(木)23:43 ID:/KeaSO9B(5/5) AAS
上は、敵をNPCにしてしまうスクリプト
anim runjumpattack
followanim 9
followcond 1
attack 25 9 76 85 10 1 1 0 60 20
dropv 4 1
offset 31 91
frame data/chars/kunagi/399.gif
こんな感じで、攻撃がヒットしたらFollow9に跳ぶようにして
anim follow9
## charm
@script

@end_script
delay 22
offset 32 91
frame data/chars/kunagi/401.gif
跳び先のFollowにこんな感じでスクリプトを仕込みます。
簡単に説明すると、攻撃がヒットした相手の種別をNPCにして、敵対者をENEMYにしてるだけ
そして、Lifespancountdown 2200(およそ100で0.5秒)11秒後に自動で消滅します。
ヒットした直後にスクリプトを即発動せず、わざわざFollowを挟んでいるのは
単なる趣味で、私の場合、このキャラには予備動作、発動、決めポーズの段階を踏ませているため
べつに当たるを構わず片っ端からNPC化しても良いのですが、その辺は好みで。
後、これの問題点はステージ終端のラッシュなどで片っ端からNPC化するとステージクリアしてしまうことw
118
(2): 2021/05/07(金)00:13 ID:RxUWGAGV(1) AAS
上のスクリプトは元々、もっと複雑な仕様(使うにはアイテムを購入して消費)だったものを
簡略化したのでMPさえあれば連続使用できてしまう訳です。
さらには時間で元の敵に戻るということも出来るのですが、それにはMODELS.txtにて
専用 Entityを作成して、それを Bindentityしなければならないので、結構手間がかかります。
簡単に説明すると、Bindentityには必ずParent(親Entity)が必要、それを逆に利用して
透明なEntityをBindentityし、一定時間経ったら元のParent(Entity)の情報に上書きするというもの。
一瞬頭が混乱しますが、Bindentityの特性を理解すると「なるほどー!」となります
もちろんオリジナルは私などでは無く、D&D Rise of Warduke2015から拝借しました。
119: 2021/05/08(土)00:13 ID:S2juEpeY(1/4) AAS
少し前に、data/scripts/フォルダ下に特定のファイルを入れておくと自動で読み込まれ
優先的に実行されると書きましたが、Loading.c もその一つ
void main()
{
void s;
void value = getlocalvar("value");
void max = getlocalvar("max");
if(max==1){
return;
}else{}
void percent=value*99/max;
percent%=++percent;
void dot=percent%3;
if(dot==0)
s=".";
else if(dot==1)
s="..";
else
s="...";
drawstring(80,144,1,"Loading Please Wait Moment"+percent);
drawstring(128,176,1,"Loading Complete Part"+s);
drawbox(160,197,126,10,11,rgbcolor(200,0,0),0);
drawbox(160,197,percent*126*0.01,10,15,rgbcolor(200,200,0),0);
}
こんな感じでテキストファイルを先のファイル名で保存しておけばOK
いくつかMODをプレイしていると、最初にパーセントやメーターが上昇してゆく
スクリーンを見た事があるかと思います。
data/BGS/ フォルダ下にLoading.gif など画像を入れておくと、同じく最初に自動で表示されます。
その他にも色々と自動で表示される画像などは多々ありますが、
その辺は各MODの data/BGS/ フォルダの中を見てみれば殆どの方が用意しているので参考になるかと思います。
120: 2021/05/08(土)00:34 ID:S2juEpeY(2/4) AAS
didhitscript @script
void main() {
void self = getlocalvar("self");
void opp = getlocalvar("damagetaker");
if(opp != NULL()) {
if(getentityproperty(self, "animationID") == openborconstant("ANI_RUNATTACK")) {
if (getentityproperty(opp,"a")==0) {
changeentityproperty(opp, "nextanim", getentityproperty(opp, "nextanim")+360);
changeentityproperty(opp, "nextthink", getentityproperty(opp, "nextthink")+360);
setglobalvar(getlocalvar("self")+"_delayhit",1);
}
}
}
}
@end_script
普通なら data/SCRIPTS/ フォルダに入れておいて都度参照するように指定するスクリプトを
じかにEntityに仕込みAnim RUNATTACKがヒットしたら、その相手が3.5秒ほど硬直するというもの
setglobalvar(getlocalvar("self")+"_delayhit",1);これは攻撃が当たったというフラグ
121: 2021/05/08(土)00:41 ID:S2juEpeY(3/4) AAS
anim runattack
jumpframe 0 0 1 0
@script
if (frame==13){
void self = getlocalvar("self");
if (getglobalvar(self +"_delayhit")) {
setglobalvar(self +"_delayhit",NULL());
changeentityproperty(self, "animation", openborconstant("ANI_SPECIAL"));
}
}
で、件のAnim RUNATTACKにて最終 frame(この例ではFrame==13)にて
getglobalvar(self +"_delayhit")フラグが成立していると
SPECIALに自動で移行するというもの
別にスクリプト使わなくてもAttackコマンドの後にSTUN 3と記述すれば
攻撃がヒットした相手は3秒ほど硬直するので、追撃は可能なのですが、
例の場合、直線にならんだ多数の敵を硬直させ、SPECIALで一網打尽に出来るという
演出重視の処理ができて、仕込んだ本人はご満悦というものです。
122: 2021/05/08(土)01:01 ID:S2juEpeY(4/4) AAS
jumpframe {Frame}{a}{x}{z}について
もともとキャラクター(Entity)の座標を直接変化させるには
Move(水平)Movea(垂直)Movez(奥行き)があり、
コマンド後に書かれたFrame 掛ける Moveの数値分座標が移動します(+なら進行方向 ーなら逆)
Move 0コマンドが記述されるまでFrameの度に移動しますので注意。
Jumpframeコマンドは、その名の通りジャンプに関するコマンドなのですが
指定したFrame(最初は0で数える)からスタートして、{a}{x}{z}分
自動で移動します。{a}を3などにすれば通常通りジャンプするのですが、
{a}を0にし、{x}{z}に+−数値を入れる事で、ジャンプせずに移動も可能になります。
すべる様にに移動するので、Moveではガクガクしてしまう動作も滑らかにすることができます。
が、微妙な距離調整が必要になるので、そんな時便利なのが
@cmd changeentityproperty getlocalvar("self") "velocity" 0 0 0
後ろのほうの数値が 0 0 0 とあるように全ての方向への慣性が0になります。
つまり動作STOP、数値の並びは x z a なので色々弄って遊ぶのも良いかと。
jumpframeだけでも結構いろいろ使えるので便利ではあります。
問題は、Anim中に複数記述しても有効なのは1つだけです。
123: 2021/05/09(日)18:57 ID:uQy3TiTw(1) AAS
OpenBoR stats 0.53 では mugen のairファイルが読み込めて便利と以前に書きましたが
たまにファイルが灰色に表示され、選択出来なくなることがあります。
そんな時は無限用のファイターファクトリーでsffファイルを8bit用のデータでセーブしてやると
OpenBoRstatsでも読み込めるようになることもあります。
124: 2021/05/09(日)23:30 ID:1QV0D9Lf(1/2) AAS
>>118 ここで「## Charm」とありますが、「#」これ一つで以降に書かれたテキストはOpenBoRとしては無視する
いわゆる「コメント(人間が読んだときの栞や説明)」となります。
で一つ「#」を使えば十分なのですが、大量に使って作成者が目印にしたりもします。
私は基本「##」2つ連続で使うのですが、一時的に使わないけど、また後で使うかもなコマンドの最初に
# jumpframe 0 0 1 0
こんな感じに使う事で、一時的に無効にすることができます。
で、OpenBoR stats を使っていると、#を使っているとたまに行ごと削除されてしまうことが有り
それを防ぐおまじないとして##2つ重ねています。
125: 2021/05/09(日)23:36 ID:1QV0D9Lf(2/2) AAS
「## Charm」は >>117 でした。
@Script

@End_script
ここで使うコメントは「//」となります。
@cmd これをコメントにするときはこんな感じ「# @cmd」 なので
スクリプト的に内部動作を弄るときはC言語みたいに「//」だったよなと
「// @cmd 」とするとエラーになりますので注意です。
126
(1): 2021/05/10(月)00:00 ID:snJfXwVZ(1/2) AAS
この様なサイトがあるのを初めて知りました。
レベルの高い内容ばかりで参考になります。
素人ながら「RescueCommand?」を色々いじって遊んでるのですが
試したいことがあるので教えていただきたいです。
敵キャラ同士が同じ座標に重なったり、すり抜けたりしないように
接触判定の条件?をいいじりたいのですが、どこをどのようにいじればよいか
どなたかご教示いただけないでしょうか。
敵キャラ同士の攻撃は従来通り当たらないで、あくまで接触判定だけ変えたいです。
何卒よろしくお願いします。
127: 2021/05/10(月)00:05 ID:LcOGIvvu(1/4) AAS
>>118 で説明しようとしてた Entityの内容がこれになります。
name Charm
type none
anim idle
@script
void self = getlocalvar("self");
int Parent = getentityvar(self,1);
if(frame==1) {
setdrawmethod(Parent, 1, 128, 128, 0, 0, 0, 6);
changedrawmethod(Parent,"tintmode",3);
changedrawmethod(Parent,"tintcolor",rgbcolor(128, 255, 255)); }
if(frame==3) {
setdrawmethod(Parent, 1, 256, 256, 0, 0, 0.5, 0);
changedrawmethod(Parent,"flag",0);
changeentityproperty(Parent,"hostile","TYPE_PLAYER","TYPE_NPC");
changeentityproperty(Parent,"type",openborconstant("TYPE_ENEMY"));
changeentityproperty(Parent,"candamage","TYPE_PLAYER","TYPE_NPC"); }
@end_script
delay 1
frame data/chars/misc/empty.gif
delay 220
frame data/chars/misc/empty.gif
delay 1100
frame data/chars/misc/empty.gif
delay 1
frame data/chars/misc/empty.gif
128: 2021/05/10(月)00:23 ID:LcOGIvvu(2/4) AAS
>>116 のスクリプト中に
clearspawnentry();
setspawnentry("name", "Charm");
void Ceff = spawn();
setentityvar(Ceff, 1, target);
bindentity(Ceff, target, 0, 1, 0, 0, 0, 0);
このような感じでMODEL.txt で設定した Entity CharmをBindentityしてあげると
name Charm の親Entity(攻撃がヒットした相手)の情報がCharmに収納され
一定時間(delay 1100) frame data/chars/misc/empty.gifが実行されると
Frame==3で
元のEntity、changeentityproperty(Parent,"type",openborconstant("TYPE_ENEMY")に戻ることになります。
こういう閃きが出来る方って本当に凄いと尊敬します。
私はスクリプトの中身を読んで「ほへ〜凄いなー」となって、何も考えずコピーして「動いたー!」
さっそくスレに書き込むことしかしないので、どういう経緯でこうなるのか基本全く分かりません。
世の中には凄い人が沢山いるものです。
129
(1): 2021/05/10(月)01:02 ID:LcOGIvvu(3/4) AAS
>>126 さん、私は適当に人様のMOD内を覗き込んで、スゲーと思ったことを
こちらに転載してるだけなので、何の取り柄もありませんが分かる範囲では、
敵同士の「重なり判定」については謎になってます。
きっと調べる手段はあると思います。
実際、画面上に存在するキャラ(TYPE_ENEMY)の数をカウントするコマンドは存在します、
カウント数からPROPERTYを取得、さらに座標を取得して、互いにぶつからない様処理することは
たぶんですが、可能だとは思います。
MODのMIXMASTERSでは、そのコマンドを利用して画面上の全ての敵、味方にHPアップや
一斉攻撃などを実現していました。
プレイヤーについてはGetPlayerPropertyで1〜4プレイヤーの情報取得が簡単になってます。
しかし敵については漏れることもあり(画面端でボーっとしてたりw)、けっこう大雑把でもありました。
一番簡単なところでは、各敵キャラをSPAWNさせる際に
changeentityproperty(vSpawn, "speed", (rand()%14)+6); 動くか分かりません。
こんな風に移動速度("speed")にランダム要素を組み込む感じで、
移動速度をずらす位にして置いたほうが悶絶しなくて済むかもです。
Entityの性格づけにSubtypeやAimoveなどいくつか設定できるものもありますが、
敵同士で移動の衝突判定して、それを避けるようなものは私はまだ見た事がありません。
そこまで細かく判定してないからこれだけOpenBoR Engineが軽いんじゃないかな?と想像してます。
130: 2021/05/10(月)01:16 ID:LcOGIvvu(4/4) AAS
せっかくラッシュな感じで敵を大量に出現させても、
重なって団子になってしまうと興ざめな部分もありますよね。
かといって敵があまりにランダムな動きをしてしまうと、
それはそれで、、、となってしまいます。
このスレでも度々お世話になっている、kt住江氏のMODを遊んでいると、
絶妙な敵のコンビネーション(ザコは固まるし、バラける、ボスは適度に意地悪)
ステージの作り方でどちらも一方的にならないように工夫されているなど、
OpenBoRの基本システムだけで表現しているので、とても参考になるかと思います。
131: 2021/05/10(月)02:53 ID:snJfXwVZ(2/2) AAS
>>129さん

ご丁寧に返信いただきありがとうございます。
私も自分なりにマニュアルを読みましたがわからず相談させていただきました。
頂いた代替案も参考にさせて頂きつつもうちょっと粘ってみます。
ありがとうございました!!
132: 2021/05/10(月)09:21 ID:iq7vM874(1/2) AAS
敵の動きについては昔2016年頃のMODだと
AiMove1やAiMove2など思考に優先順位を付ける事ができたようす
最近のBoRエンジンでは省略されたぽい
公式でも話題になってた。
133: 2021/05/10(月)10:46 ID:iq7vM874(2/2) AAS
今ふと思いついただけなんですが
敵のidleやwalkにattackコマンドをダメージ0で記述して
painにmove-1とかすれば敵同士重なったら多少ずれるかな?
134
(2): 2021/05/11(火)00:12 ID:W5SAA6KE(1/2) AAS
やってみました。
敵のヘッダーにcandamage player enemyと記述
Anim WalkにAttack6(普段あまり使わない、MODELS.txtにMaxAttacks 99など必要)を
ダメージ 0、吹っ飛び無し 0、必中 1、エフェクト無し 1、で設定
そしてAnim Pain6(Attack6がヒットしたとき専用リアクション)に適当に
Delay 12くらいでMove -16とFrame 〜といった感じに。
プレイヤー側にはAnim Pain6をリアクションしないように設定
Delay 1でFrame 〜Empty.gifとか

結果、敵同士がぶつかる(Attack6がヒット)すると、敵Anim Pain6の処理のおかげで
立ち止まったり、Move分移動したりはできた。
が、OpenBoRのシステム上、攻撃がヒットするとヒットした方向を自動で向くため
なんとも野暮ったい感じに(お前が先いけよ、どうぞどうぞみたいなw)、
あとCandamage player enemyのせいで、敵の通常攻撃も敵にヒットするようになり(当たりまえですが)
これはこれで、同士討ちは面白いのでこういう敵(中・大型の敵味方かまわない感じの)を少々混ぜる分には良いかも。
ファンタジーの中ボスが味方を蹴散らして乱入みたいな演出に良いかも?
しかし、通常の敵に仕込んでも苦労の割りに効果は「渋滞と同士討ちが発生する」なので、
適当にNPCをSPAWNさせて標的を散らすほうが簡単かも。
135: 2021/05/11(火)00:32 ID:W5SAA6KE(2/2) AAS
上のAttack6はattackコマンドの方で、Anim Attack6ではありません。
Attack6 0 0 100 100 0 0 1 1 0 15の方です。
この攻撃がヒットした際にAnim Pain6が存在すると、
このAnimが優先して実行されます。
136
(1): 2021/05/11(火)21:24 ID:hyfsamfM(1) AAS
>>134さん

なんと!!私も早速試してみます。情報ありがとうございます。
同士討ちは、それはそれで面白そうなのでやってみます。
同士討ちは”Anim Walk”による判定か”Anim Attack”による判定か
判別出来れば解消するんですかね〜。やれるかわかりませんが・・
137
(2): 2021/05/12(水)00:57 ID:z4QIhI5l(1/6) AAS
近くにいる敵に向かって進む
@script
if(frame==6) {
float Velx=2, Velz=1, dx=0, dz=0;
void self = getlocalvar("self");
int dir = getentityproperty(self, "direction");
float x = getentityproperty(self, "x");
float z = getentityproperty(self, "z");
if (dir == 0) { dx = -dx; }
setlocalvar("T"+self, findtarget(self));
if( getlocalvar("T"+self) != NULL()) {
void target = getlocalvar("T"+self);
float Tx = getentityproperty(target, "x");
float Tz = getentityproperty(target, "z");
if(Tx < x){
changeentityproperty(self, "direction", 0);
} else {
changeentityproperty(self, "direction", 1); }
続く
138: 2021/05/12(水)01:03 ID:z4QIhI5l(2/6) AAS
続き
x = x+dx;
z = z+dz;
float Disx = Tx - x;
float Disz = Tz - z;
if(Disx < 0){ Disx = -Disx; }
if(Disz < 0){ Disz = -Disz; }
if(Disz < Disx) {
if(Tx < x){
setlocalvar("x"+self, -Velx);
} else { setlocalvar("x"+self, Velx); }
setlocalvar("z"+self, Velx*(Tz-z)/Disx);
} else {
if(Tz < z){
setlocalvar("z"+self, -Velz);
} else { setlocalvar("z"+self, Velz); }
setlocalvar("x"+self, Velz*(Tx-x)/Disz); }
} else {
setlocalvar("z"+self, 0);
if(dir==0){
setlocalvar("x"+self, -Velx);
} else { setlocalvar("x"+self, Velx); }
}
float Vvx = getlocalvar("x"+self);
float Vvz = getlocalvar("z"+self);
if( Vvx!=NULL() && Vvz!=NULL() ) {
changeentityproperty(self, "velocity", Vvx, Vvz);
}
}
@end_script
近くにいる敵をFindtargetして座標を割り出し、自分の座標と比較して
向きと距離から計算して、敵のいる方向にVelocity(慣性とでもいいますか、強制移動)させるというもの
139: 2021/05/12(水)01:15 ID:z4QIhI5l(3/6) AAS
>>137 で(Frame==6)とあるようにAnim のFrame 7番目(1番は0なので)で実行されます。
frame 7番目にAttackコマンドが記述してあれば、攻撃判定を持ったまま移動します。
勢いは Velx(横方向)Velz(奥行き)dx、dzはスタート位置をずらしたりの調整(0でOK)
適当なFrameで@cmd changeentityproperty getlocalvar("self") "velocity" 0 0 0として
止めてあげます。
利点は、奥や手前の敵にホーミング攻撃できる!
問題点はFindtarget(OpenBoRに最初から用意されてるコマンド)が結構雑で思った敵に行かない所でしょうか
一対一の格闘ではないですし、現在画面内にいる敵をカウントして自分との距離を算出するなんて
想像しただけで気が遠くなるので、コマンドを用意してくれてる公式に感謝です。
140: 2021/05/12(水)01:48 ID:z4QIhI5l(4/6) AAS
>>136 さん
同士討ちの原因は簡単で
candamage player enemy
candamage(Attackコマンドの攻撃判定が有効になる対象)
player(そのままプレイヤー) enemy(TYPE_ENEMYと設定されたentity)なので
これが記述されていると同士討ちになる訳です。
特別スクリプトを使わずに、OpenBoRの基本設定でなんとできるかな?と試しただけなので穴だらけです。
丁寧に処理するには、OnDoAttack(Entityが攻撃コマンド実行時に処理されるスクリプト)か
AnimationScript(Entityが何かするたび処理)辺りで設定してみるか、
@scriptでうまいこと座標の重なりを検知できれば良いのですが、
攻撃対象を検知(FindTarget)するのはあるんで、きっと存在はしてる筈なのですが
141: 2021/05/12(水)01:56 ID:z4QIhI5l(5/6) AAS
>>134 で苦労の割りにと書いたのは、場合によっては全ての敵にAnim Pain6などリアクション設定しないと
あまり効果が出ないので、同じ種類の敵でもSpeed(移動速度)をランダムにしてみる。
などのステータスを弄ってみたほうが楽かなと思いました。
srand(seed)
set a seed for random number generator
まだ使った事ないですが、こんなコマンドもあるようなので試してみようと思います。
142: 2021/05/12(水)15:39 ID:z4QIhI5l(6/6) AAS
スクリプトばっかりで意味がわからん、という方も多いかと思います。
スクリプトはあくまで味付けなので、殆どのMODはOpenBoRの基本コマンドだけで作られていますので
もし、たとえばOpenBoR STATSに触れる機会があったら、+LEVELSをクリックしていってみて
spawn Bob
health 50
coords 500 200
at 0
こんな感じの所をコピペで増やしてみたり
+PLAYERをクリックしていってHealth 100などとあったら300にしてみたり
ちょっとづつ出来合いのものを変えてみてはいかがでしょう?
でもちょっと味付けを変えてみようかな?と思ったら
Chrono Crash 公式?サイトから
OpenBOR >Help & Resources >Scripting >Scripts Index とたどっていって

Bloodbane's Simple Scriptsあたりを見てみると大量に実例とファイルが用意されているので
覗いてみると泥沼に嵌るかもしれません。
1-
あと 516 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.013s