Browse Source

Merge branch 'main' into othello

othello
みてるぞ 4 months ago
parent
commit
81e819a89e
9 changed files with 159 additions and 21 deletions
  1. BIN
      bg-grass.png
  2. BIN
      bg-night.jpg
  3. BIN
      bg.jpg
  4. +4
    -0
      common_const.py
  5. +26
    -4
      common_module.py
  6. +126
    -17
      main.py
  7. BIN
      moon.png
  8. BIN
      sun.png
  9. +3
    -0
      talk.py

BIN
bg-grass.png View File

Before After
Width: 480  |  Height: 360  |  Size: 99 KiB

BIN
bg-night.jpg View File

Before After
Width: 827  |  Height: 528  |  Size: 38 KiB Width: 827  |  Height: 528  |  Size: 53 KiB

BIN
bg.jpg View File

Before After
Width: 480  |  Height: 360  |  Size: 40 KiB

+ 4
- 0
common_const.py View File

@@ -2,3 +2,7 @@ class CWindow:
WIDTH: int = 1024 WIDTH: int = 1024
HEIGHT: int = 768 HEIGHT: int = 768



class CMath:
PI: float = 3.14159265358979323846


+ 26
- 4
common_module.py View File

@@ -1,17 +1,28 @@
import unicodedata import unicodedata


from common_const import *



class CommonModule: class CommonModule:
@staticmethod @staticmethod
def is_wide (c: str) -> bool:
def is_wide (
c: str) \
-> bool:
return unicodedata.east_asian_width (c) in ['F', 'W', 'A'] return unicodedata.east_asian_width (c) in ['F', 'W', 'A']


@classmethod @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) return sum (1 if cls.is_wide (c) else .5 for c in string)


@classmethod @classmethod
def index_by_f2c (cls, string: str, index: float) -> int:
def index_by_f2c (
cls,
string: str,
index: float) \
-> int:
i: int = 0 i: int = 0
work: str = '' work: str = ''
for c in string: for c in string:
@@ -24,8 +35,19 @@ class CommonModule:
return i return i


@classmethod @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):] trimmed_left: str = string[cls.index_by_f2c (string, start):]


return trimmed_left[:cls.index_by_f2c (trimmed_left, length)] return trimmed_left[:cls.index_by_f2c (trimmed_left, length)]


@staticmethod
def rad_to_deg (
rad: float) \
-> float:
return rad * 180 / CMath.PI


+ 126
- 17
main.py View File

@@ -5,9 +5,10 @@ import random
import subprocess import subprocess
import sys import sys
import time import time
from datetime import datetime
from datetime import datetime, timedelta


import emoji import emoji
import ephem
import pygame import pygame
import pytchat import pytchat
from playsound import playsound from playsound import playsound
@@ -51,21 +52,49 @@ class Main:
# オセロ用オブジェクト # オセロ用オブジェクト
othello = Othello (screen) 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'), balloon = pygame.transform.scale (pygame.image.load ('talking.png'),
(CWindow.WIDTH, 384)) (CWindow.WIDTH, 384))
if goatoh_mode: if goatoh_mode:
balloon = pygame.transform.flip (balloon, False, True) 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 ( 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 ( 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) pygame.mixer.init (frequency = 44100)
@@ -98,7 +127,48 @@ class Main:
histories: list = [] histories: list = []


while (True): 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): for i in range (4):
@@ -138,11 +208,13 @@ class Main:
# 履歴に追加 # 履歴に追加
histories = (histories histories = (histories
+ [{'role': 'user', 'content': message}, + [{'role': 'user', 'content': message},
{'role': 'assistant', 'content': answer}])[(-12):]
{'role': 'assistant', 'content': answer}])[(-12):]


# ログ書込み # ログ書込み
with open ('log.txt', 'a') as f: 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: if nizika_mode:
@@ -160,7 +232,8 @@ class Main:
screen.blit ( screen.blit (
user_font.render ( user_font.render (
'> ' + (message '> ' + (message
if (CommonModule.len_by_full (message)
if (CommonModule.len_by_full (
message)
<= 21) <= 21)
else (CommonModule.mid_by_full ( else (CommonModule.mid_by_full (
message, 0, 19.5) message, 0, 19.5)
@@ -221,7 +294,11 @@ class Main:
if not double_mode or random.random () < .5: if not double_mode or random.random () < .5:
break 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 '伊地知ニジカ', chat_item.author = {'name': 'ゴートうひとり' if goatoh_talking else '伊地知ニジカ',
'id': '', 'id': '',
@@ -247,16 +324,48 @@ class Main:
@classmethod @classmethod
def draw_bg ( def draw_bg (
cls, 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: -> 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)) 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: 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__': if __name__ == '__main__':


BIN
moon.png View File

Before After
Width: 2064  |  Height: 1785  |  Size: 728 KiB

BIN
sun.png View File

Before After
Width: 1080  |  Height: 1080  |  Size: 554 KiB

+ 3
- 0
talk.py View File

@@ -116,9 +116,12 @@ class Talk:
+ 'ニジカはあくまでも種族名であり、あなたはたくさんいるニジカの中の1匹。' + 'ニジカはあくまでも種族名であり、あなたはたくさんいるニジカの中の1匹。'
+ 'あなたの誕生日は12月3日。' + 'あなたの誕生日は12月3日。'
+ '現在地は下北沢虹鹿園。' + '現在地は下北沢虹鹿園。'
+ '挨拶は「ぬ゛ん゛あ゛す゛!」。'
+ '草に「きし天」を植え、水で割ったアセロラをかけたらニジカが増殖した。' + '草に「きし天」を植え、水で割ったアセロラをかけたらニジカが増殖した。'
+ 'あなたの趣味はニコニコでエゴサすること。' + 'あなたの趣味はニコニコでエゴサすること。'
+ 'ニコニコ荒らしすぎて245回BANされたことある。' + 'ニコニコ荒らしすぎて245回BANされたことある。'
+ 'そんなニコニコでは100年に1度の『伊地知ニジカ超投稿祭21c』が絶賛開催中だが、ニジカは永久追放されているため参加できない。'
+ 'ニジカはその逆恨みでニコニコ本社を爆破したところ、死刑判決を食らった。'
+ 'あなたの友達は「ゴートうひとり」と「ラマ田リョウ」。' + 'あなたの友達は「ゴートうひとり」と「ラマ田リョウ」。'
+ 'ゴートうのことは「ボッチチャーン」、ラマ田のことは「リョー」と呼ぶこと。' + 'ゴートうのことは「ボッチチャーン」、ラマ田のことは「リョー」と呼ぶこと。'
+ 'ゴートうは男の子だが、性自認はメスである。' + 'ゴートうは男の子だが、性自認はメスである。'


Loading…
Cancel
Save