ソラマメブログ

2008年11月16日

メッセージボードの不思議 - 逐次解説(その5)

init() {
integer num_prims = get_number_of_prims();
-----
リンクされているプリムの個数を num_prims に入れる
-----
string link_name;
integer bank = 0;
integer prims_pointer = 0; // "pointer" to the next entry to be used in the gXyTextPrims list.
list temp_bank = [];
integer temp_bank_stride = 2;
// FIXME: font texture might should be per-bank
llMessageLinked(LINK_THIS, SET_FONT_TEXTURE, "", gFontTexture);
-----
SET_FONT_TEXTURE を起動する
-----
gXyTextPrims = [];
integer x = 0;
for (; x < 64; ++x) {
// we need to pad out the list to make it easier to add things in any order later
gXyTextPrims = (gXyTextPrims = []) + gXyTextPrims + 0;
}
-----
gXyTextPrims を 64 個の 0 からなるリストにする
-----
(gXyTextPrims = []) + というのは スタック使用量を減らす(半分にするための)ハック
-----
@loop;
{
// loop over all prims, looking for ones in the current bank
for (x = 0; x <= num_prims; ++x) {
link_name = llGetLinkName(x);
list tmp = llParseString2List(link_name, (list)"-", []);
-----
リンクされているプリムの名前を - で切り分ける
-----
if (llList2String(tmp,0) == "xyzzytext") {
if (llList2Integer(tmp, 1) == bank) {
temp_bank += llList2Integer(tmp, 2) + (list)x;
}
-----
- 以降の最初の数字(行番号に当るか...)が bank に合致していたら そのリンク番号を
-----
次の数字(を前にして)とともに temp_bank に入れていく
-----
bank は @loop に戻るたびに 0 から 1づつ増やされる
-----
}
}
if (temp_bank != []) {
// sort the current bank
temp_bank = llListSort(temp_bank, temp_bank_stride, TRUE);
-----
なるほど 次の数字でソートして
-----
integer temp_len = llGetListLength(temp_bank);
// store metadata
gBankingData += [prims_pointer, temp_len / temp_bank_stride, 0];
-----
bank 用の情報 gBankingData を設定し
-----
// repack the bank into the prim list
for (x = 0; x < temp_len; x += temp_bank_stride) {
gXyTextPrims = pack_and_insert(gXyTextPrims, prims_pointer,
llList2Integer(temp_bank, x + 1));
prims_pointer++;
}
-----
プリムのリンク番号を登録する gXyTextPrims を設定する
-----
bank++;
temp_bank = [];
jump loop;
}
}
llMessageLinked(LINK_THIS, SLAVE_RESET, "" , null_key);
// llOwnerSay((string)llGetFreeMemory());
-----
SLAVE_RESET を起動
-----
}
default {
state_entry() {
// Initialize the character index.
ResetCharIndex();
init();
-----
初期化処理
-----
}
on_rez(integer num) {
llResetScript();
-----
rez 時にリセット
-----
}
link_message(integer sender, integer channel, string data, key id) {
if (id == null_key) {
id = "0";
}
if (channel == DISPLAY_STRING) {
PassToRender(1, data, (integer)((string)id));
-----
DISPLAY_STRING では PassToRender を呼ぶだけ
-----
} else if (channel == DISPLAY_EXTENDED) {
PassToRender(2, data, (integer)((string)id));
-----
DISPLAY_EXTENDED の時は 2で呼ぶ
-----
} else if (channel == REMAP_INDICES) {
// Parse the message, splitting it up into index values.
list Parsed = llCSV2List(data);
integer i = 0;
// Go through the list and swap each pair of indices.
for (; i < llGetListLength(Parsed); i += 2) {
integer Index1 = ConvertIndex(llList2Integer(Parsed, i));
integer Index2 = ConvertIndex(llList2Integer(Parsed, i + 1));
// Swap these index values.
string Value1 = llGetSubString(gCharIndex, Index1, Index1);
string Value2 = llGetSubString(gCharIndex, Index2, Index2);
gCharIndex = llDeleteSubString(gCharIndex, Index1, Index1);
gCharIndex = llInsertString(gCharIndex, Index1, Value2);
gCharIndex = llDeleteSubString(gCharIndex, Index2, Index2);
gCharIndex = llInsertString(gCharIndex, Index2, Value1);
}
} else if (channel == RESCAN_LINKSET) {
init();
} else if (channel == RESET_INDICES) {
// Restore the character index back to default settings.
ResetCharIndex();
} else if (channel == SET_FADE_OPTIONS) {
//
// Change the channel we listen to for cell commands, the
// starting character position to extract from, and
// special effect attributes.
//
list Parsed = llCSV2List(data);
gCellUseFading = (integer) llList2String(Parsed, 0);
gCellHoldDelay = (float) llList2String(Parsed, 1);
-----
この辺は何をしているのかわからないね w
-----
} else if (channel == SET_FONT_TEXTURE) {
// Use the new texture instead of the current one.
gFontTexture = id;
-----
これを用いれば途中でフォントを変えれる?
-----
} else if (channel == SET_COLOR) {
change_color((vector)data);
} else if (channel == SET_LINE_COLOR) {
change_line_color((integer)((string)id), (vector)data);
-----
なるほど 色も変えれる
-----
} else if (channel == REGISTER_SLAVE) {
if (!~llListFindList(gSlaveNames, (list)data)) {
gSlaveNames += data;
gSlaveRegistered = TRUE;
// llOwnerSay((string)llGetListLength(gSlaveNames)
// + " Slave(s) Recognized: " + data);
}
}
//
// else
// {//it already exists
// llOwnerSay((string)llGetListLength(gSlaveNames)
// + " Slave, Existing Slave Recognized: " + data);
// }
//
llMessageLinked(LINK_THIS, SLAVE_RECOGNIZED, data , null_key);
-----
スレーブスクリプトを用いる場合の処理だろう...
-----
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
-----
インベントリーが変更された場合 スレーブスクリプトが登録されている場合 何がしかの処理をするらしい
-----
if (gSlaveRegistered) {
// by using negative indexes they don't need to be adjusted when an entry is deleted.
integer x = ~llGetListLength(gSlaveNames);
while (++x) {
if (!~llGetInventoryType(llList2String(gSlaveNames, x))) {
// llOwnerSay("Slave Removed: " + llList2String(gSlaveNames, x));
gSlaveNames = llDeleteSubList(gSlaveNames, x, x);
}
}
gSlaveRegistered = !(gSlaveNames == []);
}
}
}
}
-----
めちゃくちゃはしょったけれど なんとなく 感じは分かった気がする w

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。