;hsp3.21
;
#include "anthspex3.as"
;↓added by hsp2to3
dim br,16
sdim s,64
sdim t,64
sdim u,64
;↑added by hsp2to3
;このカレンダーは、以下のことを事実と考えて作られています
;・紀元前46年からユリウス暦(したがって、それ以前の動作は未定義)
;・紀元前44年から紀元前8年まで、誤って3年ごとに13の閏年が設けられた
;・上記の誤りを正すため、紀元前5年、紀元前1年、西暦4年は閏年にしなかった
;・紀元前1年の翌年は西暦1年
;・1582年10月4日の翌日は10月15日で、この日からグレゴリオ暦
; (実際の採用は国によって異なる)
;※日本については1873年1月1日から有効
fsize=16
hw=fsize+4 ;1日分の高さ
bday=fsize+8 ;1日分の横幅
bmon=bday*7+8 ;1月分の横幅
;各月の日数
dim mday,13
;mday.2(2月の日数)は後で書き換える
mday=0,31,28,31,30,31,30,31,31,30,31,30,31
;国民の祝日
nholiday=15
dim holidaym,nholiday
dim holidayd,nholiday
dim holidayw,nholiday
dim holidayy,nholiday
;↓後で年による修正が行なわれる
; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
holidaym=1,1, 2,3, 4,5,5,5,7,9, 9,10,11,11,12
holidayd=1,0,11,0,29,3,4,5,0,0, 0, 0, 3,23,23
holidayw=0,2, 0,0, 0,0,0,0,3,3, 0, 2, 0, 0, 0
;holidayd=0 は春分・秋分・第n月曜
;holidaywは第何月曜か
;有効開始年
; 正月 成人 建国 春分 昭和 憲法 みど 子供 海 敬老 秋分 体育 文化 勤労 天皇
; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
holidayy=1873,1948,1873,1948,1912,1948,1985,1948,1996,1966,1948,1966,1873,1948,1989
;画面
wid=bmon*4+16: heit=(8*3+3)*hw
screen 0,wid,heit,,(ginfo_dispx-wid)/2,(ginfo_dispy-heit)/2
title "-46年(日本では1873年)から有効なカレンダー"
getsyscolor br,15: if br==192 {
br--
}
dup bg,br.1: if bg==192 {
bg--
}
dup bb,br.2: if bb==192 {
bb--
}
color br,bg,bb: boxf
font "MS ゴシック",fsize: color
year=gettime(0)
wyear=fsize*2+10: hyear=fsize
objh=fsize+8
btw=fsize+8: objsize btw
x=(wid-(btw*2+wyear+44))/2: y=8
pos x,y: button "←", *l_back: x+=btw+4: btleft=oid: oid++
inyear=""+year
xyear=x: yyear=y+4
pos x,y: input inyear,wyear,objh,4: x+=wyear: inid=oid: oid++
pos x,y+4: mes "年": x+=fsize+4
pos x,y: button "→", *l_forw: x+=btw+4: btrit=oid: oid++
begy=y+32
*l_restart
if year<0 {
if year<-7 { ;-8年以前
if year\3==-2 {
mday.2=29
} else {
mday.2=28
}
} else { ;~-1年
mday.2=28
}
} else { if year\4!=0 { ;4の倍数でない
mday.2=28
} else { if year\400==0 { ;400の倍数
mday.2=29
} else { if year\100==0 { ;100の倍数
if year<1582 {
mday.2=29
} else {
mday.2=28
}
} else { if year!=4 { ;4年でない
mday.2=29
} else { ;4年
mday.2=28
} } } } }
if year>1872 {
;春分の日・秋分の日の計算
d=year-2000
e=d*2421904
holidayd.3 =(e+6911500)/10000000-(d/4)+(d/100)-(d/400)+20
holidayd.10=(e+ 900000)/10000000-(d/4)+(d/100)-(d/400)+23
;祝日
repeat nholiday
if holidayw.cnt>0 {
;第 n 月曜の祝日の日付確定
getweek c,year,holidaym.cnt,1
d=holidayw.cnt*7
if c<2 { ;1日が日曜か月曜のとき
holidayd.cnt=d-5-c
} else { ;1日が火曜~土曜のとき
holidayd.cnt=d+2-c
}
}
loop
if 1912<=year&(year<=1913) { holidaym.4=8: holidayd.4=31 } ;天長節(大正)
else { if 1914<=year&(year<=1926) { holidaym.4=10: holidayd.4=31 } ;同上
else { if 1927<=year { holidaym.4=4: holidayd.4=29 } } } ;昭和天皇誕生日
if 1948<=year {
if year<=1999 {
holidayd.1=15 ;成人の日
}
}
if 1948<=year&(year<1966) { holidayd.2=0 } ;建国記念の日
else { holidayd.2=11 }
if year>=1966 {
if year<=1999 {
holidayd.11=10 ;体育の日
}
if year<=2002 {
holidayd.9=15: holidayd.8=20 ;敬老の日、海の日
}
}
}
;1月1日の曜日
if year>=1582 { ;1582年~
getweek week,year,1,1
if year==1582 {
week=(week+3)\7
}
} else { if year>4 { ;5~1581
week=(year*365+((year-1)/4)+5)\7
} else { if year>0 { ;1~4
week=(year*365+6)\7
} else { if year>-8 { ;-7~-1
week=(year+84)*365\7
} else { ;-44~-8
week=((year+84)*365+((year+85)/3)+2)\7
} } } }
;カレンダー表示
by=begy: mon=1
color br,bg,bb: boxf 16,by,wid,heit
repeat 12
;月の表示
bx=(mon-1)\4*bmon+16: y=by
color: pos (bday*7-32)/2+bx,y: mes ""+mon+"月"
;曜日の表示
x=bx: y+=hw
digit s,""+year,'0',4: digit t,""+mon,'0',2
s+=t
if s!"187300">0&(s!"187603"<0) { color }
else { color 255,0,0 }
pos x,y: mes "日": x+=bday
color: pos x,y: mes "月 火 水 木 金": x+=bday*5
if year>=1873&(s!"187603"<0)|(year<1850) { ;~1850,1873/1~1876/2
color
} else { ;1872年以前と1876/3~
if s!"199204">0 { color 255,0,0 } ;1992/5~
else { color 0,0,255 }
}
pos x,y: mes "土"
;日付の表示
day=1-week: y+=hw
repeat 6
x=bx
w=0
repeat 7
if day>0 {
;祝日判定
flg=0 ;祝日フラグ
repeat nholiday
if holidayd.cnt==day {
if holidaym.cnt==mon {
;日本では1873年1月1日より太陽暦。
;それ以前の祝日は意味なし
if year>1872 { if year>=holidayy.cnt {
flg=1
if year>2007 {
;祝日の間の日は休日(敬老と秋分の差が2日の場合)
if cnt==9 {
if day+2==holidayd.10 {
furikae=1
}
}
}
} }
}
}
loop
r=0: b=0
digit s,""+year,'0',4: digit t,""+mon,'0',2: digit u,""+day,'0',2
s+=t+u
if year>=1873&(s!"18760312"<0) { ;1873年~1876年3月11日
if day\5==1 {
if day!=31 {
r=255
}
}
} else { ;1872年以前と1876年3月12日以降
if (cnt==6) { ;土曜
if s!"19920500">0|flg { r=255 }
else { if year>=1850 { b=255 } }
} else { if cnt==0 { ;日曜
r=255
if flg {
if s!"19730412">=0 {
furikae=1
}
}
} else { ;土日以外
r=0
if flg {
r=255
} else {
if furikae {
r=255: furikae=0
}
}
} }
}
;日付の表示
color r,0,b
pos x,y
astr s,day,2,' '
mes s
}
day++
if year==1582 {
if mon==10 {
if day==5 {
day=15
}
}
}
if day>mday.mon {
week=(cnt+1)\7 ;翌月1日の曜日
break
}
x+=bday
w++
loop
if day>mday.mon {
break
}
y+=hw
loop
mon++
if (mon-1)\4==0 {
by+=hw*8
}
loop
objsel inid: objselstr inid,0,-1
;キー入力待ち
repeat: wait 10
stick key,,1
if key&37 {
break ;←,→,Enter
}
prmx=ginfo_act: prmy=ginfo_sel
if act!=prmx {
if prmx==0 {
objsel inid: objselstr inid,0,-1
}
act=prmx
}
loop
if key==1 {
goto *l_back ;←
}
if key==4 {
goto *l_forw ;→
}
;Enter
year=0+inyear
if year==0 {
year=1: goto *l_setyear
}
goto *l_restart
*l_back
year--
if year==0 {
year=-1
}
goto *l_setyear
*l_forw
year++
if year==0 {
year=1
}
*l_setyear
s=""+year
objprm inid,s
goto *l_restart
たまにバグあり。
0 件のコメント:
コメントを投稿