2009年9月25日金曜日

ラッキーオブジェクトのスクリプト

今回は名前の最初の文字が一致したら賞品がもらえるラッキーボックス(ただの箱なのでw)ラッキーオブジェクトのスクリプトです。うちで販売してるLucky letterっていう製品(ラッキーボード)がありますが、それの必要最低限の機能だけのスクリプトって感じですね^^

レターや残り時間は箱の上にフローティングテキストで表示しますが、テクスチャで表示するように改造してボード型にするとLucky boardのようになります。更にタッチを調べる部分をsitに変えて椅子を付けたらLucky chairのような装置になります。更に更に、椅子をトイレに変えたら。。。って、もういいですかねwww

// Lucky object
integer interval=5;  // レターチェンジ間隔(分)
integer time;  // 残り時間用
string letter="-?ABCDEFGHIJKLMNOPQRSTUVWXYZ";  // ラッキーレターに使う文字
string ll;  // ラッキーレター用
string tmp;  // 前回のレター記憶用
string prize;

win(key id, string name)
{  // 当たったときの処理
    llSay(0,name+", you win!!");  // 当たりー♪
    llGiveInventory(id,prize);  // アイテムを渡す
    init();  // initへ
}

init()
{
    llSetText("OFF",<1,1,1>,1.0);
    prize=llGetInventoryName(INVENTORY_OBJECT,0);  // コンテンツ内の1つ目のオブジェクト名
    ll="";  // レターをクリア
    time=0;  // 残り時間を0に設定
    if (prize) llSetTimerEvent(0.1);  // 賞品が入ってたら0.1秒後にタイマー
    else llSetTimerEvent(0);  // 入ってなかったらタイマー停止
}

default
{
    state_entry()
    {
        init();  // initへ
    }

    changed(integer change)
    {
        if (change & CHANGED_INVENTORY) {  // コンテンツ内が変化したらinit
            init();
        }
    }

    touch_start(integer total_number)
    {
        if (ll == "") return;  // レターが設定されてないときはリターン
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id == "" || id == NULL_KEY) return;  // キーが取得できなかったらリターン
        string name=llDetectedName(0);  // タッチしたアバターの名前
        if (ll == "?") win(id,name);  // ラッキーレターが?だったら当たり
        else {
            string s=llGetSubString(name,0,0);  // アバター名の最初の1文字
            integer num=FALSE;
            if (s == "0" || (integer)s > 0) num=TRUE;  // 文字が数字かをチェック
            if (ll == llToUpper(s)) win(id,name);  // 文字を大文字に変換してラッキーレターと一致したら当たり
            else if (ll == "0-9" && num) win(id,name);  // 文字が数字でラッキーレターが0-9だったら当たり
            else llSay(0,"Sorry, your name begins with "+s+".");  // それ以外はハズレ;;
        }
    }

    timer()
    {
        llSetTimerEvent(60);  // タイマーを60秒にセット
        if (time < 1) {  // 残り時間が1以下になったらレター変更
            time=interval;  // 残り時間を再設定
            if (ll == "") ll=tmp;
            while (tmp == ll) {  // 前回出たレターと被らないように
                integer i=llFloor(llFrand(llStringLength(letter)));  // 乱数
                ll=llGetSubString(letter,i,i);  // 乱数からラッキーレターを決定
                if (ll == "-") ll="0-9";  // レターが-だったら 0-9にする
            }
            tmp=ll;  // 今回出たラッキーレターを記憶
            llSay(0,"The lucky letter is "+ll+".");  // チャット表示
        }
        // フローティング表示
        llSetText("If your name begins with "+ll+",\ntouch to get a prize!\n"+(string)time+" minute(s) left.",<1,1,1>,1.0);
        time--;  // 残り時間を減算
    }
}

賞品のオブジェクト(オブジェクト以外は箱詰めして)をコンテンツに入れて、レターチェンジの数値を変えて使ってくださいね^^

10月10日追記: あ、箱型プリムのまま使うとは限らないですよね。。。てことで、タイトルもラッキーオブジェクトに変えましたw

10月14日追記: 一応タッチしたアバターのキーが取得できないときリターンさせるようにしました。

0 件のコメント:

コメントを投稿