起動時のトークを前回からの期間に応じて変える

起動・終了関連より。そちらのページも参照のこと。

・「久しぶりに起動した時のトーク内容を変えたい」
・「一週間以上間を空けて起動した時のトーク内容を変えたい」
といった起動時のトークを変化させたい時のTIPS。

動作のテストをしたい時はPC内蔵時計の時刻を変更する必要がありますが、
SSPであればメニューから表示できる「開発用パレット」に『現在時刻の仮想的変更』という機能もあります。




基準となる時間を設定する

里々では起動していない間の時間を算出するための基準がないので、まずこの基準を作る所から始めましょう。
基準を作る方法は色々あるので、好みで選択してください。
こうして得た基準値を、終了時に記録 → 次の起動時に差を計算することで前回から経過した日数を得ることができます。

以下のすべての例で、初期値としてsatori_conf.txtで「$終了日」に0を設定しています。
これはsatori_conf.txt内では読み込みの関係で自作関数を使う事ができないためですが、実際の運用では特に気にしなくてOKです。*1

ユリウス日

ざっくり言うと西暦-4713年11月24日を基準として、ここからの日数がユリウス日。

@ユリウス日での経過日数
(calc,
365*(ユリウス日要素)+(ユリウス日要素)/4
+3059*((if,(A1)>2,-2,10)+(A1))/100
+(ユリウス日要素)/400
-(ユリウス日要素)/100
+(A2)+1721089)

@ユリウス日要素
((A0)-(if,(A1)>2,0,1))
*OnSatoriLoad
$終了日からの経過日数=(call,ユリウス日での経過日数,(現在年),(現在月),(現在日))-(終了日)

*OnSatoriClose
$終了日【タブ】(call,ユリウス日での経過日数,(現在年),(現在月),(現在日))

*起動
>一年以上経ってから起動【タブ】(終了日からの経過日数)>=365
>一月以上経ってから起動【タブ】(終了日からの経過日数)>=30
:こんにちは。

*一月以上経ってから起動
:こんにちは、お久しぶりです。

*一年以上経ってから起動
:お久しぶりです。私の事覚えてます?
#satori_conf.txtに存在する「*初期化」に1行追加
*初期化
$終了日【タブ】0

フェアフィールドの公式

ユリウス日同様、正確な日数を算出できます。

@グレゴリオ暦での経過日数
(calc,
365*(A0)+(A0)/4-(A0)/100+(A0)/400
+306*(calc,(A1)+1)/10+(A2)-428)
*OnSatoriLoad
$終了日からの経過日数=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))-(終了日)

*OnSatoriClose
$終了日【タブ】(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))

*起動
>一年以上経ってから起動【タブ】(終了日からの経過日数)>=365
>一月以上経ってから起動【タブ】(終了日からの経過日数)>=30
:こんにちは。

*一月以上経ってから起動
:こんにちは、お久しぶりです。

*一年以上経ってから起動
:お久しぶりです。私の事覚えてます?
#satori_conf.txtに存在する「*初期化」に1行追加
*初期化
$終了日【タブ】0

UNIX時間(EPOCH)

コンピュータがよく使っている、協定世界時 (UTC) の1970/1/1 00:00:00を基準とした、ここからの通算経過秒数。
上記の方法は日数ですが、こちらは「秒」であることに注意して下さい。

@UNIX時間
(
	set,__py,(calc,(A0)-1)
)(
	set,__y,(calc,(((A0)%400)+400)%400)
)(
	set,__scale,31
	 (when,(__y)%4==0&&(__y)%100!=0||(__y)%400==0,29,28)
	 31 30 31 30 31 31 30 31 30 31
)(
	nop,(split,(__scale), )
)(
	set,__days,0
)(
	times,(calc,(A1)-1),(
		set,__days,(calc,(__days)+(S(C0)))
	)
)(
	set,__jst,(when,(A6)==1,0,32400)
)(
	calc,(A3)*3600+(A4)*60+(A5)+(
	365*(__py)+(__py)/4-(__py)/100+(__py)/400+(__days)+(A2)-719163
	)*86400-(__jst)
)(
	set,__days,
)(
	set,__jst,
)(
	set,__py,
)(
	set,__scale,
)(
	set,__y,
)
*OnSatoriLoad
$終了日からの経過秒数=(call,UNIX時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))-(終了日)

*OnSatoriClose
$終了日【タブ】(call,UNIX時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))

*起動
>10分以内に起動【タブ】(終了日からの経過秒数)<=60*10
>3時間以内に起動【タブ】(終了日からの経過秒数)<=60*60*3
:こんにちは。

*10分以内に起動
:あれ、さっき終了したばかりだよ?

*3時間以内に起動
:また会ったねー。
#satori_conf.txtに存在する「*初期化」に1行追加
*初期化
$終了日【タブ】0

「@UNIX時間」の引数は、A0~A5でそれぞれ年月日時分秒を指定し、A6は1を指定するとJST(+9:00:00)になります(それ以外または省略時は修正なし)

SAORI

YAYA

GETTIME関数を使いEPOCHからの通算秒数を取得します。

華和梨

dateコマンドを使いEPOCHからの通算秒数を取得します。

time_check.dll

入手先 → 梨野
あらかじめ「saori」フォルダにtime_check.dllを入れ、satori_conf.txtの「@SAORI」項目に

time_check,saori/time_check.dll 

の一行を追加しておいてください。

*起動
$終了から経過日数=(time_check、how_many_days、(終了年)、(終了月)、(終了日))*-1
>一年以上経ってから起動【タブ】(終了から経過日数)>=365
>一月以上経ってから起動【タブ】(終了から経過日数)>=30
:こんにちは。

*一月以上経ってから起動
:こんにちは。
(終了日からの経過日数)日ぶりですね。

*一年以上経ってから起動
$終了日からの経過年数=(終了日からの経過日数)/365
:(終了日からの経過年数)年ぶりですね。
私の事覚えてます?

*OnSatoriClose
$終了年【タブ】(現在年)
$終了月【タブ】(現在月)
$終了日【タブ】(現在日)

現在日から過去の日に向かって数えているためhow_many_daysで取得される数値の先頭に「-」が付いています。
「*」は掛け算、「/」は割り算。
「術師の隠れ里」さんの ユリウス日の計算スクリプト (ssu.dllのcalc使用)を使用しても同じ事ができます。

日数だけでなく時間単位、分単位で起動トークを分けたい

上で紹介したユリウス日、グレゴリオ暦は日数基準なので、前回から「30分以内に起動したとき」「6時間以内に起動したとき」といったケースには対応できません。
その場合は、この基準数値をもう少し分解していく必要があります。

理論上は基準値を24倍して(現在時)を足せば「時」が基準に、
さらに60倍して(現在分)を足せば「分」に……といった風にはなります。
しかし、実際には里々が扱える数値には限界があるため、基準数値の元の数値が大きい場合は対応できません
これは秒にしてあるUNIX時間も同様であり、現時点で

……という、とてつもない数字。 計算可能な範囲である2,147,483,647~-2,147,483,648に、×24時×60分×60秒とやっていればあっという間に限界を超えてしまいます。
確実に分単位まで比較したい場合、使いたい情報に応じて終了時の時分秒を別の変数に記録しておき、差を終了日からの経過日数に格納してから分単位に分解加算するという手もありますが、かなり複雑になるのであまりおすすめしません。
以下に解決策を記載していきます。

分単位のための基準値の整形

一つの解決策として、結果を里々で扱える範囲に落とし込むという手段があります。
例としては、関数を呼び出す時、計算で一番桁数が増えてしまう要因である「年」を減らす修正をします。
具体的には、呼び出す時に与える引数A0(年)を減らせばOKです。
閏年を考慮して4の倍数がベター。
分単位への計算のため、「$終了日」への代入が 【タブ】 から = に変わっている事に注意して下さい。

共通

*起動
>10分以内に起動【タブ】(経過した分)<=10
>3時間以内に起動【タブ】(経過した分)<=180
>一年以上経ってから起動【タブ】(経過した日)>=365
>一月以上経ってから起動【タブ】(経過した日)>=30
:こんにちは。

*一月以上経ってから起動
:こんにちは、お久しぶりです。

*一年以上経ってから起動
:お久しぶりです。私の事覚えてます?

*10分以内に起動
:あれ、さっき終了したばかりだよ?

*3時間以内に起動
:また会ったねー。
#satori_conf.txt
*初期化
$終了日【タブ】0
$終了分【タブ】0

ユリウス日の場合

以下の部分を書き換えます。

*OnSatoriLoad
$経過した日=(call,ユリウス日での経過日数,(現在年)-6000,(現在月),(現在日))-(終了日)
$経過した分=(call,ユリウス日での経過日数,(現在年)-6000,(現在月),(現在日))×24×60+(現在時)×24+(現在分)-(終了分)

*OnSatoriClose
$終了日=(call,ユリウス日での経過日数,(現在年)-6000,(現在月),(現在日))
$終了分=(call,ユリウス日での経過日数,(現在年)-6000,(現在月),(現在日))×24×60+(現在時)×24+(現在分)

フェアフィールドの公式の場合

以下の部分を書き換えます。

*OnSatoriLoad
$経過した日=(call,グレゴリオ暦での経過日数,(現在年)-2000,(現在月),(現在日))-(終了日)
$経過した分=(call,グレゴリオ暦での経過日数,(現在年)-2000,(現在月),(現在日))×24×60+(現在時)×24+(現在分)-(終了分)

*OnSatoriClose
$終了日=(call,グレゴリオ暦での経過日数,(現在年)-2000,(現在月),(現在日))
$終了分=(call,グレゴリオ暦での経過日数,(現在年)-2000,(現在月),(現在日))×24×60+(現在時)×24+(現在分)

UNIX時間の場合

以下の部分を書き換えます。

*OnSatoriLoad
$経過した日=(call,UNIX時間,(現在年)-40,(現在月),(現在日),9,0,0)÷60÷60÷24-(終了日)
$経過した分=(call,UNIX時間,(現在年)-40,(現在月),(現在日),(現在時),(現在分),(現在秒))÷60-(終了分)

*OnSatoriClose
$終了日=(call,UNIX時間,(現在年)-40,(現在月),(現在日),9,0,0)÷60÷60÷24
$終了分=(call,UNIX時間,(現在年)-40,(現在月),(現在日),(現在時),(現在分),(現在秒))÷60

いわゆる2038年問題もこうした修正で一応の回避ができます。

補足

上記の$終了日と$終了分は、ただ1440倍しただけで似た値に見えますが、ちょっとした違いがあります。
それはズバリ「日を跨いだかどうか」です。
例えば、24時間(=1440分)きっかりを判定するのか、それとも日付が変わったかを判定するのか、といった用途で使い分けましょう。


*1 具体的には、このセクションをゴースト公開後に追加した場合、「そのゴーストが起動していない時にゴーストエクスプローラーやアーカイブから更新を行った場合のみ」、その直後の一回目だけ久しぶり扱いされる事があります。完璧に防ぎたいなら、初回起動イベントのあるゴーストの初稿から実装することをオススメします。

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-04-09 (火) 10:06:29