Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2008年9月1日月曜日

ランダムに喋るスクリプト

今回は言葉をリストに登録しといて、それをテキトーにチャットで喋らせるスクリプトです^^

簡単に書いてみたんですが
// ランダムに喋る
float time=180;  // 喋る間隔(秒)
integer len;
list message=[  // 喋る言葉リスト
"こんにちは^^",
"いらっしゃい♪",
"お元気ですか?",
NULL_KEY];  // 最後のデータにカンマを付けたいので最後はNULLキー

default
{
    state_entry()
    {
        len=llGetListLength(message)-1;  // NULLキーを引いたリストの長さ
        llSetTimerEvent(0.1);  // 最初は0.1秒でタイマー始動
    }

    timer()
    {
        llSetTimerEvent(time);  // timeの間隔でタイマー設定
        integer i=llFloor(llFrand(len));  // リストの長さぶんの乱数発生して
        llSay(0,llList2String(message,i));  // リストの対応する言葉をチャットで発言
    }
}

んー、余りにも簡単すぎですかねwww まあ簡単なほうが理解しやすくていいんですけどね^^
でも、ちょっとつまんないかなって思って少し改造してみましたw


オーナー限定のスイッチを付けて、一定時間ごとだったタイマーも乱数で毎回変動させてみました^^
予想外の処理も入れることになったので、ちょっと長くなっちゃいましたが特別難しいところはないですよね。
// ランダムに喋る(改)
float time_min=120;  // 喋る間隔(最小)
float time_max=180;  // 喋る間隔(最大)
integer power=FALSE;  // スイッチ用
integer tmp=-1;  // 乱数と重複しないように -1
integer len;
list message=[  // 喋る言葉リスト
"こんにちは^^",
"いらっしゃい♪",
"お元気ですか?",
NULL_KEY];  // カンマを付けたいので最後はNULLキー

default
{
    state_entry()
    {
        len=llGetListLength(message)-1;  // NULLキーを引いたリストの長さ
    }

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner()) {  // オーナーのみ
            if (power) {  // スイッチが入ってたら
                llSetTimerEvent(0);  // タイマー停止
                llWhisper(0,"停止");
            }
            else {  // そうでないとき
                llSetTimerEvent(0.1);  // 0.1秒後にタイマー開始
                llWhisper(0,"開始");
            }
            power=!power;  // ブーリアン変数の値を反転
        }
    }

    timer()
    {
        integer t=llFloor(llFrand(time_max-time_min));  // 最大と最小の差で乱数発生
        llSetTimerEvent(time_min+t);  // タイマー設定
        integer i=llFloor(llFrand(len));  // リストの長さぶんの乱数発生
        while (len > 1 && i == tmp) {  // リストの言葉が複数で、乱数が前回と同じときは
            i=llFloor(llFrand(len));  // また乱数発生
        }
        tmp=i;  // 乱数を比較用に保存
        llSay(0,llList2String(message,i));  // リストの対応する言葉をチャットで発言
    }
}

最初はオフにしてるのでstate_entryではタイマー起動してないです。
timerイベントでタイマー用と言葉用の2つの乱数を発生させたら、言葉が3~4回連続で同じになってしまったので同じ言葉にならないよう処理を加えました^^;
http://wiki.secondlife.com/wiki/LlFrand/ja を見たら、なるほど、あまり精密でないってことなんですねw

2009年9月9日追記: オーナー限定に if (llDetectedKey(0) != llGetOwner()) return; としてましたが、これだと同時にタッチがあったとき正常動作しないと思いますので修正しました。

0 件のコメント:

コメントを投稿