木曜日, 11月 29, 2007

リスト to 文字、そして文字 to リスト

昨日、劇団四季のウィキッドを見に行って来ました。
声量すごいなーと感心しつつ、やっぱり風邪をこじらせてる Tai子です。
無理しなけりゃよかった。。。


今日ログインすると、いきなりTai子の体が青と赤の派手なもじもじ君になっていて、相当びびりました。
ということで、その時のSSを。






服着替えたら直りました。  よかった、よかった。
No imageでもなく、こんな状態になったのは初めてだと思う。 ある意味新鮮。 


さて、こないだブログにも書いたSimboardのグループに入って情報集めたりしてるのですが、
残念ながら、都合のいい時間にゲームをやってないのが痛いです。 かといって、そのために月曜日休むのもどうかと思うし。。


他には、以前ブログにちょっとだけ書いたSLH(Second Life Hockey)リーグの試合が、SLCN(Second Life Cable Network)で見ることが出来ることを知って、いくつか見てみました。
試合前の解説が長くてかなりイラッとくるのはおいといて、試合自体はなかなか面白そうです。
やっぱり一回は実際に見に行ってみたいですね。

SLCN
http://slcn.tv/


などと、ぐだぐだ書いてますが、今日もホロデッキの修正をいくつかやっていて、特に冒険ネタがないので、スクリプトで最近気になったことを書きます。

llSetPrimitiveParamsやllGetPrimitiveParamsをホロデッキでは使おうとしているのですが、引数になるリストを複数プリム(オブジェクト)間でやり取りする時に、文字列化しなければいけなくて、今まではwikiにあるListConversionのサンプルを参考に(というかそのまま)使っていました。

  http://rpgstats.com/wiki/index.php?title=ExampleListConversion

これを使うと、

データタイプ、区切れ文字、データ、区切れ文字、データタイプ、区切れ文字、データ、・・・

という形の1つの文字列になるので、link_message/listenでやり取りするわけです。

このままでも別になんら問題はないんですが、ちょっと区切れ文字使いすぎじゃないかなと思い立って、少し工夫してみました。

改良点は、データタイプをリストの最初にまとめているため、区切れ文字が半分ぐらいで済みます。

(改良版)

データタイプまとめたもの、区切れ文字、データ、区切れ文字、データ、・・・




string sep = "#!$"; // funky name for clean namespaces

string list2string(list lst) {
list ret = [];
string tlst = "";
integer i;
integer len = llGetListLength(lst);

for(i = 0; i < len; i++){
tlst = tlst + (string)llGetListEntryType(lst, i);
}
ret = llListInsertList(lst, (list)tlst, 0);
return llDumpList2String(ret, sep);
}

list string2list(string str) {
list lst = [];
list ret = [];
lst = llParseStringKeepNulls(str, [sep], []);
integer len = llGetListLength(lst) - 1;
integer i;
integer t;

string tlst = llList2String(lst, 0);
if(tlst == "" || llStringLength(tlst) != len) return [];

for (i = 0; i < len; i++) {
t = (integer)llGetSubString(tlst, i, i);

if (t == TYPE_INTEGER) ret += (integer)llList2String(lst, i+1);
else if (t == TYPE_FLOAT) ret += (float)llList2String(lst, i+1);
else if (t == TYPE_KEY) ret += (key)llList2String(lst, i+1);
else if (t == TYPE_VECTOR) ret += (vector)llList2String(lst, i+1);
else if (t == TYPE_ROTATION) ret += (rotation)llList2String(lst, i+1);
else ret += llList2String(lst, i+1);
}
return ret;
}

1 件のコメント:

匿名 さんのコメント...

Tai子さんこんにちはー^^

> 体が青と赤の派手なもじもじ君になっていて

なんか、Movable Lifeでログインしたアバターは、全身赤と青のチェック模様のテクスチャが貼られたように表示されます、っていう現象があるみたいです><