2024/08/14

広告飛行船を予約

広告看板飛行船を出すのに日にち指定で予約できるようにしました。

今までは飛行船の設定はイベント当日に行うか 設定済みの箱を用意しておいても当日にはタッチで起動しなければなりませんでした。
それを当日会場に来れないような場合でも日にち指定で予約できるようにしました。

日にち指定は飛行船を出す箱を編集してオブジェクト名("Airship Go Round Signboard Box")のところに予約日の数字を書きます。
書き方に決まりはなく 1〜31 の数字がどこかにあればそれは予約日とみなされます

写真は 予約日を指定した状態の箱です。この状態で今まで通り手動でタッチしてもスタンバイ状態になるし 日付が予約日になれば自動でスタンバイになります。

スクリプトはこんな感じ:

timer()
{
  integer scheduleday = getScheduleDay(); // オブジェクト名の中に書いた予約日を読む
  integer today = zoneDay(llGetTimestamp()); // 今日の日付
  if (today==scheduleday) { // 今日が予約日なら
    llMessageLinked(LINK_SET,Common,"State:standby",NULL_KEY); // スタンバイに
    llSetTimerEvent(0); // タイマーを止める
  }
}

ここで今日の日付を知る zoneDay(llGetTimestamp()) ですが タイムスタンプはUTC(協定世界時)なので日本とは9時間の時差があります。
日本の真夜中はUTCではまだ前日です。そこで日付をくり上げるのですが 問題なのは月末で31日は32日でなく1日にしなければなりません。
そのためには今日が月末日なのかどうかを月から また2月なら閏年かどうかも調べなくてはなりません。

月末日を調べるスクリプトは:

integer lastDay(integer year,integer month)
{
  if (0<=llListFindList([4,6,9,11],[month])) return 30;
  else if (month != 2 ) return 31; // 1,3,5,7,8,10,12,0(1月の前月はちょうど12月)
  else if (year%400 == 0) return 29; // 2400,2800,..(とうぶん来ないけど)
  else if (year%100 == 0) return 28; // 2100,2200,..(まだまだ先だけど)
  else if (year%4 == 0) return 29; // 2028,2032,..
  else return 28; // 2025,2026,2027,..
}