#author("2024-03-22T19:51:50+09:00","default:post","post")
#author("2024-03-24T22:53:59+09:00;2024-03-22T19:51:50+09:00","default:post","post")
*起動時のトークを前回からの期間に応じて変える [#v220760f]

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

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

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

----
#contents
----
~

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

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

-参考
--里々で年月日からユリウス日を計算するスクリプト 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]

***YAYA [#jc65d5ef]
GETTIME関数を使いEPOCHからの通算秒数を取得します。

-YAYAの使い方
--公式 https://emily.shillest.net/ayaya/
--wiki内解説 [[SAORI/YAYA]]

***華和梨 [#f8b50935]
dateコマンドを使いEPOCHからの通算秒数を取得します。

-華和梨の使い方
--公式 https://kawari.github.io/
--wiki内解説 [[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]
上で紹介したユリウス日、グレゴリオ暦は日数基準なので、前回から「30分以内に起動したとき」「6時間以内に起動したとき」といったケースには対応できません。~
その場合は、この基準数値をもう少し分解していく必要があります。

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

-「ユリウス日」''7桁''
-「グレゴリオ暦での経過日数」''6桁''
-「UNIX時間」''10桁''

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


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

***「ユリウス日」修正例 [#ee5792c5]
計算結果を-2400000。なお-2400000.5するものは修正ユリウス日と呼ばれます。

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

***「グレゴリオ暦での経過日数」修正例 [#bf24cc78]
計算結果を-730000。こちらは一桁小さいので「分」までなら修正は不要で、「秒」まで差を使いたい時に。

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

***「UNIX時間」修正例 [#a20d7b35]
関数をいじらずとも、呼び出す時に与える引数A0(年)を減らせばOKです。~
この関数は1970年が基準なので(当たり前ですが計算において年数が数値の巨大化の最大要因なので)、2020年を過ぎている現在ならば、年を-50して指定すれば2038年以降も運用可能になります。
この関数は1970年が基準なので、呼び出す時に与える引数A0(年)を減らせばOKです。~
閏年と2020年を過ぎている現在を考慮すると、-40を与えると良いでしょう。これで2038年以降も運用可能になります。

 (call,UNIX時間,(現在年),(現在月),(現在日),(現在時),(現在分),(現在秒))

 (call,UNIX時間,(現在年)-50,(現在月),(現在日),(現在時),(現在分),(現在秒))
 (call,UNIX時間,(現在年)-40,(現在月),(現在日),(現在時),(現在分),(現在秒))


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