diff --git a/bg-grass.png b/bg-grass.png new file mode 100644 index 0000000..48a4b65 Binary files /dev/null and b/bg-grass.png differ diff --git a/bg-night.jpg b/bg-night.jpg index 24c2b52..6d43ad5 100644 Binary files a/bg-night.jpg and b/bg-night.jpg differ diff --git a/bg.jpg b/bg.jpg new file mode 100644 index 0000000..b4b3b73 Binary files /dev/null and b/bg.jpg differ diff --git a/common_const.py b/common_const.py index 899af72..87505c1 100644 --- a/common_const.py +++ b/common_const.py @@ -2,3 +2,7 @@ class CWindow: WIDTH: int = 1024 HEIGHT: int = 768 + +class CMath: + PI: float = 3.14159265358979323846 + diff --git a/common_module.py b/common_module.py index aebf3c6..276de44 100644 --- a/common_module.py +++ b/common_module.py @@ -1,17 +1,28 @@ import unicodedata +from common_const import * + class CommonModule: @staticmethod - def is_wide (c: str) -> bool: + def is_wide ( + c: str) \ + -> bool: return unicodedata.east_asian_width (c) in ['F', 'W', 'A'] @classmethod - def len_by_full (cls, string: str) -> float: + def len_by_full ( + cls, + string: str) \ + -> float: return sum (1 if cls.is_wide (c) else .5 for c in string) @classmethod - def index_by_f2c (cls, string: str, index: float) -> int: + def index_by_f2c ( + cls, + string: str, + index: float) \ + -> int: i: int = 0 work: str = '' for c in string: @@ -24,8 +35,19 @@ class CommonModule: return i @classmethod - def mid_by_full (cls, string: str, start: float, length: float) -> str: + def mid_by_full ( + cls, + string: str, + start: float, + length: float) \ + -> str: trimmed_left: str = string[cls.index_by_f2c (string, start):] return trimmed_left[:cls.index_by_f2c (trimmed_left, length)] + @staticmethod + def rad_to_deg ( + rad: float) \ + -> float: + return rad * 180 / CMath.PI + diff --git a/main.py b/main.py index f8896f4..d26f358 100644 --- a/main.py +++ b/main.py @@ -5,9 +5,10 @@ import random import subprocess import sys import time -from datetime import datetime +from datetime import datetime, timedelta import emoji +import ephem import pygame import pytchat from playsound import playsound @@ -51,21 +52,49 @@ class Main: # オセロ用オブジェクト othello = Othello (screen) + # 大月ヨヨコの観測値 + observer = ephem.Observer () + observer.lat, observer.lon = '35', '139' + + # き太く陽オブジェクト + sun = ephem.Sun () + + # 大月ヨヨコ・オブジェクト + moon = ephem.Moon () + # 吹き出し balloon = pygame.transform.scale (pygame.image.load ('talking.png'), (CWindow.WIDTH, 384)) if goatoh_mode: balloon = pygame.transform.flip (balloon, False, True) + # 背景(昼) + bg_day: pygame.Surface = pygame.transform.scale ( + pygame.image.load ('bg.jpg'), + (CWindow.WIDTH, CWindow.HEIGHT)) + # 背景(夕方) bg_evening: pygame.Surface = pygame.transform.scale ( - pygame.image.load ('bg-evening.jpg'), - (CWindow.WIDTH, CWindow.HEIGHT)) + pygame.image.load ('bg-evening.jpg'), + (CWindow.WIDTH, CWindow.HEIGHT)) # 背景(夜) bg_night: pygame.Surface = pygame.transform.scale ( - pygame.image.load ('bg-night.jpg'), - (CWindow.WIDTH, CWindow.HEIGHT)) + pygame.image.load ('bg-night.jpg'), + (CWindow.WIDTH, CWindow.HEIGHT)) + + # 背景の草 + bg_grass: pygame.Surface = pygame.transform.scale ( + pygame.image.load ('bg-grass.png'), + (CWindow.WIDTH, CWindow.HEIGHT)) + + # き太く陽 + kita: pygame.Surface = pygame.transform.scale ( + pygame.image.load ('sun.png'), (200, 200)) + + # 大月ヨヨコ + jojoko: pygame.Surface = pygame.transform.scale ( + pygame.image.load ('moon.png'), (200, 200)) # 音声再生器の初期化 pygame.mixer.init (frequency = 44100) @@ -98,7 +127,48 @@ class Main: histories: list = [] while (True): - cls.draw_bg (screen, bg_evening, bg_night) + # 観測地の日づけ更新 + observer.date: datetime = datetime.now ().date () + + # 日の出開始 + sunrise_start: datetime = ( + (ephem.localtime (observer.previous_rising (sun)) + - timedelta (minutes = 30))) + + # 日の出終了 + sunrise_end: datetime = sunrise_start + timedelta (hours = 1) + + # 日の入開始 + sunset_start: datetime = ( + (ephem.localtime (observer.next_setting (sun)) + - timedelta (minutes = 30))) + + # 日の入終了 + sunset_end: datetime = sunset_start + timedelta (hours = 1) + + # 月の出開始 + 'todo' + + # 月の出終了 + 'todo' + + # 月の入開始 + 'todo' + + # 月の入終了 + 'todo' + + # 日の角度 + observer_with_time: ephem.Observer = observer + observer_with_time.date = datetime.now () - timedelta (hours = 9) + sun.compute (observer_with_time) + sun_alt: float = CommonModule.rad_to_deg (sun.alt) + + # 背景描画 + cls.draw_bg (screen, bg_day, bg_evening, bg_night, bg_grass, + kita, jojoko, + sunrise_start, sunrise_end, sunset_start, sunset_end, + sun_alt) # 左上に時刻表示 for i in range (4): @@ -138,11 +208,13 @@ class Main: # 履歴に追加 histories = (histories + [{'role': 'user', 'content': message}, - {'role': 'assistant', 'content': answer}])[(-12):] + {'role': 'assistant', 'content': answer}])[(-12):] # ログ書込み with open ('log.txt', 'a') as f: - f.write (f'{datetime.now ()}\t{json.dumps (chat_item.__dict__)}\t{answer}\n') + f.write (f'{datetime.now ()}\t' + + f'{json.dumps (chat_item.__dict__)}\t' + + f'{answer}\n') # 吹出し描画(ニジカは上,ゴートうは下) if nizika_mode: @@ -160,7 +232,8 @@ class Main: screen.blit ( user_font.render ( '> ' + (message - if (CommonModule.len_by_full (message) + if (CommonModule.len_by_full ( + message) <= 21) else (CommonModule.mid_by_full ( message, 0, 19.5) @@ -221,7 +294,11 @@ class Main: if not double_mode or random.random () < .5: break - cls.draw_bg (screen, bg_evening, bg_night) + cls.draw_bg (screen, bg_day, bg_evening, bg_night, + bg_grass, kita, jojoko, + sunrise_start, sunrise_end, + sunset_start, sunset_end, + sun_alt) chat_item.author = {'name': 'ゴートうひとり' if goatoh_talking else '伊地知ニジカ', 'id': '', @@ -247,16 +324,48 @@ class Main: @classmethod def draw_bg ( cls, - screen: pygame.Surface, - bg_evening: pygame.Surface, - bg_night: pygame.Surface) \ + screen: pygame.Surface, + bg_day: pygame.Surface, + bg_evening: pygame.Surface, + bg_night: pygame.Surface, + bg_grass: pygame.Surface, + kita: pygame.Surface, + jojoko: pygame.Surface, + sunrise_start: datetime, + sunrise_end: datetime, + sunset_start: datetime, + sunset_end: datetime, + sun_alt: float) \ -> None: - if 17 <= (h := datetime.now ().hour) < 18: - screen.blit (bg_evening, (0, 0)) - elif (h < 6) or (18 <= h): + sunrise_centre: datetime = ( + sunrise_start + (sunrise_end - sunrise_start) / 2) + sunset_centre: datetime = ( + sunset_start + (sunset_end - sunset_start) / 2) + + dt: datetime = datetime.now () + + if sunrise_centre <= dt < sunset_centre: + screen.blit (bg_day, (0, 0)) + else: screen.blit (bg_night, (0, 0)) + + if sunrise_start <= dt < sunrise_end: + bg_evening.set_alpha (255 - ((abs (dt - sunrise_centre) * 510) + / (sunrise_end - sunrise_centre))) + elif sunset_start <= dt < sunset_end: + bg_evening.set_alpha (255 - ((abs (dt - sunset_centre) * 510) + / (sunset_end - sunset_centre))) else: - screen.fill ((0, 255, 0)) + bg_evening.set_alpha (0) + + screen.blit (bg_evening, (0, 0)) + + if -10 <= sun_alt < 40: + y = ((CWindow.HEIGHT / 2 + 100) + - (CWindow.HEIGHT / 2 + 200) / 30 * sun_alt) + screen.blit (kita, kita.get_rect (center = (400, y))) + + screen.blit (bg_grass, (0, 0)) if __name__ == '__main__': diff --git a/moon.png b/moon.png new file mode 100755 index 0000000..80c0c90 Binary files /dev/null and b/moon.png differ diff --git a/sun.png b/sun.png new file mode 100644 index 0000000..112a220 Binary files /dev/null and b/sun.png differ diff --git a/talk.py b/talk.py index fef8bce..e99a8fa 100644 --- a/talk.py +++ b/talk.py @@ -116,9 +116,12 @@ class Talk: + 'ニジカはあくまでも種族名であり、あなたはたくさんいるニジカの中の1匹。' + 'あなたの誕生日は12月3日。' + '現在地は下北沢虹鹿園。' + + '挨拶は「ぬ゛ん゛あ゛す゛!」。' + '草に「きし天」を植え、水で割ったアセロラをかけたらニジカが増殖した。' + 'あなたの趣味はニコニコでエゴサすること。' + 'ニコニコ荒らしすぎて245回BANされたことある。' + + 'そんなニコニコでは100年に1度の『伊地知ニジカ超投稿祭21c』が絶賛開催中だが、ニジカは永久追放されているため参加できない。' + + 'ニジカはその逆恨みでニコニコ本社を爆破したところ、死刑判決を食らった。' + 'あなたの友達は「ゴートうひとり」と「ラマ田リョウ」。' + 'ゴートうのことは「ボッチチャーン」、ラマ田のことは「リョー」と呼ぶこと。' + 'ゴートうは男の子だが、性自認はメスである。'