#author("2023-11-22T17:30:12+09:00","default:post","post")
#author("2023-11-22T19:28:10+09:00","default:post","post")
*起動時のトークを前回からの期間に応じて変える [#v220760f]

「久しぶりに起動した時のトーク内容を変えたい」~
「一週間以上間を空けて起動した時のトーク内容を変えたい」~
といったアクションをさせたい時のTIPS。~
動作のテストをしたい時はPC内蔵時計の時刻を変更しましょう。 
といったアクションをさせたい時のTIPS。

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

----
#contents
----
~

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

**ユリウス日を使う方法 [#v844442c]
-参考
--里々で年月日からユリウス日を計算するスクリプト https://umihotaru.hateblo.jp/entries/2010/12/20
--ぽな氏による修正版 https://ponapalt.hatenablog.com/entry/20140517/1400291141

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

 *起動
 $終了日からの経過日数=(call,ユリウス日での経過日数,(現在年),(現在月),(現在日))-(終了ユリウス日)
 >一年以上経ってから起動【タブ】(終了日からの経過日数)>=365
 >一月以上経ってから起動【タブ】(終了日からの経過日数)>=30
 :こんにちは。
 
 *一月以上経ってから起動
 :こんにちは、お久しぶりです。
 
 *一年以上経ってから起動
 :お久しぶりです。私の事覚えてます?
 
 *OnSatoriClose
 $終了ユリウス日【タブ】(call,ユリウス日での経過日数,(現在年),(現在月),(現在日))

 #satori_conf.txtに存在する「*初期化」に1行追加
 *初期化
 $終了ユリウス日【タブ】(call,ユリウス日での経過日数,(現在年),(現在月),(現在日))


**フェアフィールドの公式を使う方法 [#c2c1bbe9]
ユリウス日同様、正確な日数を算出出来ます。
-参考
--日数差を取得する https://earlduant.blog.fc2.com/blog-entry-357.html

 @グレゴリオ暦での経過日数
 (calc,
 365*(A0)+(A0)/4-(A0)/100+(A0)/400
 +306*(calc,(A1)+1)/10+(A2)-428)

 *OnSatoriLoad
 $終了日からの経過日数=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))-(終了日)

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

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

 #satori_conf.txtに存在する「*初期化」に1行追加
 *初期化
 $終了日=(call,グレゴリオ暦での経過日数,(現在年),(現在月),(現在日))


**UNIX時間(EPOCH)を使う方法 [#o6dc3962]
これはコンピュータがよく使っている、協定世界時 (UTC) の1970/1/1 00:00:00からの通算経過秒数のこと。~
秒なので、上記の方法と違い時分秒への整形が楽ちんという長所がありますが、~
やはり短所として桁数が多いために計算限界があります。こちらは''2038年問題''とも。~

 @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時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))-(終了日)
 
 *起動
 >10分以内に起動【タブ】(終了日からの経過秒数)<=60*10
 >3時間以内に起動【タブ】(終了日からの経過秒数)<=60*60*3
 :こんにちは。
 
 *OnSatoriClose
 $終了日=(call,UNIX時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))

 #satori_conf.txtに存在する「*初期化」に1行追加
 *初期化
 $終了日=(call,UNIX時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))

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


**SAORIを使う方法 [#w2efcb70]
SAORIを使う方はこちら。

***YAYAをSAORIとして使う [#jc65d5ef]
[[SAORI/YAYA]]のページを参照。

***華和梨をSAORIとして使う [#f8b50935]
[[SAORI/華和梨]]のページを参照。

***time_check.dllを使う [#u3c3e01b]
入手先 → [[梨野:http://www.junkyard.jp/nasino/index.shtml]]~
あらかじめ「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使用)を使用しても同じ事ができます。 ~


**日数だけでなく時間単位、分単位で起動トークを分けたい [#b69dfdac]
上記の値は日数基準なので、&color(red){前回の終了から「30分以内に起動したとき」「6時間以内に起動したとき」};といったケースには対応できません。~
*日数だけでなく時間単位、分単位で起動トークを分けたい [#b69dfdac]
上で紹介したユリウス日、グレゴリオ暦は日数基準なので、&color(red){前回の終了から「30分以内に起動したとき」「6時間以内に起動したとき」};といったケースには対応できません。~
その場合は、この基準数値をもう少し分解していく必要があります。

理論上は基準値を24倍して(現在時)を足せば「時」が基準に、~
さらに60倍して(現在分)を足せば「分」に……といった風にはなります。~
しかし、実際には里々が扱える数値には限界があるため、''基準数値の元の数値が大きい場合は対応できません''。~
上記の例では「ユリウス日」「グレゴリオ暦での経過日数」は現時点で前者は7桁、後者は6桁の数字を持っているので、里々の2,147,483,647~-2,147,483,648(=確実なのは9桁まで)に×24だの×60だのやっていればあっという間に限界を超えてしまいます。~
確実に分単位まで比較したい場合、使いたい情報に応じて終了時の時分秒を別の変数に記録しておき、差を終了日からの経過日数に格納してから分単位に分解加算するという手もありますが、かなり複雑になるのであまりおすすめしません。~
これは秒にしてあるUNIX時間も同様であり、現時点で

***基準値の整形 [#o3113b8c]
一つの解決策として、「ユリウス日での経過日数」「グレゴリオ暦での経過日数」の結果を里々で扱える範囲に落とし込む、という手段があります。~
下記の例として前者は-2460000、後者は-738000してから時間と分の計算を行います。
-「ユリウス日」''7桁''
-「グレゴリオ暦での経過日数」''6桁''

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

なお「UNIX時間」は''10桁''と危険領域に達していますが(これが2038年問題です)、既に「秒」なのでここから減らす分には問題ありません。~
もちろん増やしたらアウト。


**基準値の整形 [#o3113b8c]
一つの解決策として、結果を里々で扱える範囲に落とし込むという手段があります。~
例としては以下のような修正を行います。

-「ユリウス日」~
計算結果を-2400000。なお-2400000.5するものは修正ユリウス日と呼ばれます。
-「グレゴリオ暦での経過日数」~
計算結果を-730000。こちらは一桁小さいので「分」までなら修正は不要で、「秒」まで差を使いたい時に。

 @ユリウス日での経過時
 (calc,((
 365*(ユリウス日要素)+(ユリウス日要素)/4
 +3059*((if,(A1)>2,-2,10)+(A1))/100
 +(ユリウス日要素)/400
 -(ユリウス日要素)/100
 +(A2)+1721089
 )-2460000)*24+(現在時)
 )-2400000)*24+(現在時)
 )
 
 @ユリウス日での経過分
 (calc,(((
 365*(ユリウス日要素)+(ユリウス日要素)/4
 +3059*((if,(A1)>2,-2,10)+(A1))/100
 +(ユリウス日要素)/400
 -(ユリウス日要素)/100
 +(A2)+1721089
 )-2460000)*24+(現在時))*60+(現在分)
 )-2400000)*24+(現在時))*60+(現在分)
 )

 @グレゴリオ暦での経過時
 (calc,((
 365*(A0)+(A0)/4-(A0)/100+(A0)/400
 +306*(calc,(A1)+1)/10+(A2)-428
 )-738000)*24+(現在時)
 )-730000)*24+(現在時)
 )
 
 @グレゴリオ暦での経過分
 (calc,(((
 365*(A0)+(A0)/4-(A0)/100+(A0)/400
 +306*(calc,(A1)+1)/10+(A2)-428
 )-738000)*24+(現在時))*60+(現在分)
 )-730000)*24+(現在時))*60+(現在分)

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS