mirror of
https://github.com/Yonokid/PyTaiko.git
synced 2026-02-04 03:30:13 +01:00
add more english
This commit is contained in:
@@ -120,7 +120,10 @@ class BaseBox():
|
|||||||
self.wait = 0
|
self.wait = 0
|
||||||
|
|
||||||
def load_text(self):
|
def load_text(self):
|
||||||
self.name = OutlinedText(self.text_name, tex.skin_config["song_box_name"].font_size, ray.WHITE, outline_thickness=5, vertical=True)
|
font_size = tex.skin_config["song_box_name"].font_size
|
||||||
|
if len(self.text_name) >= 30:
|
||||||
|
font_size -= int(10 * tex.screen_scale)
|
||||||
|
self.name = OutlinedText(self.text_name, font_size, ray.WHITE, outline_thickness=5, vertical=True)
|
||||||
if self.back_color is not None:
|
if self.back_color is not None:
|
||||||
self.shader = ray.load_shader('shader/dummy.vs', 'shader/colortransform.fs')
|
self.shader = ray.load_shader('shader/dummy.vs', 'shader/colortransform.fs')
|
||||||
source_rgb = (142, 212, 30)
|
source_rgb = (142, 212, 30)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from typing import Callable
|
|||||||
import pyray as ray
|
import pyray as ray
|
||||||
|
|
||||||
from libs.global_data import PlayerNum
|
from libs.global_data import PlayerNum
|
||||||
|
from libs.global_data import global_data
|
||||||
from libs.utils import OutlinedText, global_tex
|
from libs.utils import OutlinedText, global_tex
|
||||||
from libs.config import get_config
|
from libs.config import get_config
|
||||||
from libs.audio import audio
|
from libs.audio import audio
|
||||||
@@ -98,6 +99,7 @@ class Indicator:
|
|||||||
self.don_fade = global_tex.get_animation(6)
|
self.don_fade = global_tex.get_animation(6)
|
||||||
self.blue_arrow_move = global_tex.get_animation(7)
|
self.blue_arrow_move = global_tex.get_animation(7)
|
||||||
self.blue_arrow_fade = global_tex.get_animation(8)
|
self.blue_arrow_fade = global_tex.get_animation(8)
|
||||||
|
self.select_text = OutlinedText(global_tex.skin_config["indicator_text"].text[global_data.config["general"]["language"]], global_tex.skin_config["indicator_text"].font_size, ray.WHITE, spacing=-3)
|
||||||
|
|
||||||
def update(self, current_time_ms: float):
|
def update(self, current_time_ms: float):
|
||||||
"""Update the indicator's animations."""
|
"""Update the indicator's animations."""
|
||||||
@@ -109,7 +111,8 @@ class Indicator:
|
|||||||
"""Draw the indicator at the given position with the given fade."""
|
"""Draw the indicator at the given position with the given fade."""
|
||||||
tex = global_tex
|
tex = global_tex
|
||||||
tex.draw_texture('indicator', 'background', x=x, y=y, fade=fade)
|
tex.draw_texture('indicator', 'background', x=x, y=y, fade=fade)
|
||||||
tex.draw_texture('indicator', 'text', frame=self.state.value, x=x, y=y, fade=fade)
|
tex.draw_texture('indicator', 'text', frame=self.state.value, x=x, y=y, fade=fade, color=ray.BLACK)
|
||||||
|
self.select_text.draw(ray.BLANK, x=x+global_tex.skin_config["indicator_text"].x, y=y, fade=fade)
|
||||||
tex.draw_texture('indicator', 'drum_face', index=self.state.value, x=x, y=y, fade=fade)
|
tex.draw_texture('indicator', 'drum_face', index=self.state.value, x=x, y=y, fade=fade)
|
||||||
if self.state == Indicator.State.SELECT:
|
if self.state == Indicator.State.SELECT:
|
||||||
tex.draw_texture('indicator', 'drum_kat', fade=min(fade, self.don_fade.attribute), x=x, y=y)
|
tex.draw_texture('indicator', 'drum_kat', fade=min(fade, self.don_fade.attribute), x=x, y=y)
|
||||||
@@ -127,15 +130,14 @@ class CoinOverlay:
|
|||||||
"""Coin overlay for the game."""
|
"""Coin overlay for the game."""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Initialize the coin overlay."""
|
"""Initialize the coin overlay."""
|
||||||
pass
|
self.free_play = OutlinedText(global_tex.skin_config["free_play"].text[global_data.config["general"]["language"]], global_tex.skin_config["free_play"].font_size, ray.WHITE, spacing=5, outline_thickness=4)
|
||||||
def update(self, current_time_ms: float):
|
def update(self, current_time_ms: float):
|
||||||
"""Update the coin overlay. Unimplemented"""
|
"""Update the coin overlay. Unimplemented"""
|
||||||
pass
|
pass
|
||||||
def draw(self, x: int = 0, y: int = 0):
|
def draw(self, x: int = 0, y: int = 0):
|
||||||
"""Draw the coin overlay.
|
"""Draw the coin overlay.
|
||||||
Only draws free play for now."""
|
Only draws free play for now."""
|
||||||
tex = global_tex
|
self.free_play.draw(ray.BLACK, x=global_tex.screen_width//2 - self.free_play.texture.width//2, y=global_tex.skin_config["free_play"].y)
|
||||||
tex.draw_texture('overlay', 'free_play', x=x, y=y)
|
|
||||||
|
|
||||||
class AllNetIcon:
|
class AllNetIcon:
|
||||||
"""All.Net status icon for the game."""
|
"""All.Net status icon for the game."""
|
||||||
|
|||||||
@@ -15,12 +15,13 @@ from libs.config import get_config
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class SkinInfo:
|
class SkinInfo:
|
||||||
def __init__(self, x: float, y: float, font_size: int, width: float, height: float):
|
def __init__(self, x: float, y: float, font_size: int, width: float, height: float, text: dict[str, str]):
|
||||||
self.x = x
|
self.x = x
|
||||||
self.y = y
|
self.y = y
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = height
|
self.height = height
|
||||||
self.font_size = font_size
|
self.font_size = font_size
|
||||||
|
self.text = text
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"{self.__dict__}"
|
return f"{self.__dict__}"
|
||||||
@@ -78,7 +79,7 @@ class TextureWrapper:
|
|||||||
|
|
||||||
data = json.loads((self.graphics_path / "skin_config.json").read_text())
|
data = json.loads((self.graphics_path / "skin_config.json").read_text())
|
||||||
self.skin_config: dict[str, SkinInfo] = {
|
self.skin_config: dict[str, SkinInfo] = {
|
||||||
k: SkinInfo(v.get('x', 0), v.get('y', 0), v.get('font_size', 0), v.get('width', 0), v.get('height', 0)) for k, v in data.items()
|
k: SkinInfo(v.get('x', 0), v.get('y', 0), v.get('font_size', 0), v.get('width', 0), v.get('height', 0), v.get('text', dict())) for k, v in data.items()
|
||||||
}
|
}
|
||||||
self.screen_width = int(self.skin_config["screen"].width)
|
self.screen_width = int(self.skin_config["screen"].width)
|
||||||
self.screen_height = int(self.skin_config["screen"].height)
|
self.screen_height = int(self.skin_config["screen"].height)
|
||||||
@@ -88,7 +89,7 @@ class TextureWrapper:
|
|||||||
self.parent_graphics_path = Path("Skins") / parent
|
self.parent_graphics_path = Path("Skins") / parent
|
||||||
parent_data = json.loads((self.parent_graphics_path / "skin_config.json").read_text())
|
parent_data = json.loads((self.parent_graphics_path / "skin_config.json").read_text())
|
||||||
for k, v in parent_data.items():
|
for k, v in parent_data.items():
|
||||||
self.skin_config[k] = SkinInfo(v.get('x', 0) * self.screen_scale, v.get('y', 0) * self.screen_scale, v.get('font_size', 0) * self.screen_scale, v.get('width', 0) * self.screen_scale, v.get('height', 0) * self.screen_scale)
|
self.skin_config[k] = SkinInfo(v.get('x', 0) * self.screen_scale, v.get('y', 0) * self.screen_scale, v.get('font_size', 0) * self.screen_scale, v.get('width', 0) * self.screen_scale, v.get('height', 0) * self.screen_scale, v.get('text', dict()))
|
||||||
|
|
||||||
def unload_textures(self):
|
def unload_textures(self):
|
||||||
"""Unload all textures and animations."""
|
"""Unload all textures and animations."""
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import string
|
||||||
import ctypes
|
import ctypes
|
||||||
import hashlib
|
import hashlib
|
||||||
import sys
|
import sys
|
||||||
@@ -135,7 +136,7 @@ for file in Path('cache/image').iterdir():
|
|||||||
|
|
||||||
class OutlinedText:
|
class OutlinedText:
|
||||||
"""Create an outlined text object."""
|
"""Create an outlined text object."""
|
||||||
def __init__(self, text: str, font_size: int, color: ray.Color, outline_thickness=5.0, vertical=False):
|
def __init__(self, text: str, font_size: int, color: ray.Color, outline_thickness=5.0, vertical=False, spacing=1):
|
||||||
"""
|
"""
|
||||||
Create an outlined text object.
|
Create an outlined text object.
|
||||||
|
|
||||||
@@ -158,7 +159,7 @@ class OutlinedText:
|
|||||||
if vertical:
|
if vertical:
|
||||||
self.texture = self._create_text_vertical(text, font_size, color, ray.BLANK, self.font)
|
self.texture = self._create_text_vertical(text, font_size, color, ray.BLANK, self.font)
|
||||||
else:
|
else:
|
||||||
self.texture = self._create_text_horizontal(text, font_size, color, ray.BLANK, self.font)
|
self.texture = self._create_text_horizontal(text, font_size, color, ray.BLANK, self.font, spacing=spacing)
|
||||||
ray.gen_texture_mipmaps(self.texture)
|
ray.gen_texture_mipmaps(self.texture)
|
||||||
ray.set_texture_filter(self.texture, ray.TextureFilter.TEXTURE_FILTER_TRILINEAR)
|
ray.set_texture_filter(self.texture, ray.TextureFilter.TEXTURE_FILTER_TRILINEAR)
|
||||||
outline_size = ray.ffi.new('float*', self.outline_thickness)
|
outline_size = ray.ffi.new('float*', self.outline_thickness)
|
||||||
@@ -358,19 +359,25 @@ class OutlinedText:
|
|||||||
ray.unload_image(image)
|
ray.unload_image(image)
|
||||||
return texture
|
return texture
|
||||||
|
|
||||||
def _create_text_horizontal(self, text: str, font_size: int, color: ray.Color, bg_color: ray.Color, font: Optional[ray.Font]=None, padding: int=10):
|
def _create_text_horizontal(self, text: str, font_size: int, color: ray.Color, bg_color: ray.Color, font: Optional[ray.Font]=None, padding: int=10, spacing: int=1):
|
||||||
if font:
|
if font:
|
||||||
text_size = ray.measure_text_ex(font, text, font_size, 0)
|
text_size = ray.measure_text_ex(font, text, font_size, spacing)
|
||||||
|
for char in text:
|
||||||
|
if char in string.whitespace:
|
||||||
|
text_size.x += 2
|
||||||
total_width = text_size.x + (padding * 2)
|
total_width = text_size.x + (padding * 2)
|
||||||
total_height = text_size.y + (padding * 2)
|
total_height = text_size.y + (padding * 2)
|
||||||
else:
|
else:
|
||||||
total_width = ray.measure_text(text, font_size) + (padding * 2)
|
total_width = ray.measure_text(text, font_size) + (padding * 2)
|
||||||
total_height = font_size + (padding * 2)
|
total_height = font_size + (padding * 2)
|
||||||
|
|
||||||
image = ray.gen_image_color(int(total_width), int(total_height), bg_color)
|
image = ray.gen_image_color(int(total_width), int(total_height), bg_color)
|
||||||
|
|
||||||
if font:
|
if font:
|
||||||
text_image = ray.image_text_ex(font, text, font_size, 0, color)
|
text_image = ray.image_text_ex(font, text, font_size, spacing, color)
|
||||||
else:
|
else:
|
||||||
text_image = ray.image_text(text, font_size, color)
|
text_image = ray.image_text(text, font_size, color)
|
||||||
|
|
||||||
text_x = padding
|
text_x = padding
|
||||||
text_y = padding
|
text_y = padding
|
||||||
ray.image_draw(image, text_image,
|
ray.image_draw(image, text_image,
|
||||||
@@ -378,7 +385,6 @@ class OutlinedText:
|
|||||||
ray.Rectangle(text_x, text_y, text_image.width, text_image.height),
|
ray.Rectangle(text_x, text_y, text_image.width, text_image.height),
|
||||||
ray.WHITE)
|
ray.WHITE)
|
||||||
ray.unload_image(text_image)
|
ray.unload_image(text_image)
|
||||||
|
|
||||||
ray.export_image(image, f'cache/image/{self.hash}.png')
|
ray.export_image(image, f'cache/image/{self.hash}.png')
|
||||||
texture = ray.load_texture_from_image(image)
|
texture = ray.load_texture_from_image(image)
|
||||||
ray.unload_image(image)
|
ray.unload_image(image)
|
||||||
|
|||||||
@@ -439,9 +439,9 @@ class BoxManager:
|
|||||||
"""BoxManager class for the entry screen"""
|
"""BoxManager class for the entry screen"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.box_titles: list[OutlinedText] = [
|
self.box_titles: list[OutlinedText] = [
|
||||||
OutlinedText('演奏ゲーム', tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True),
|
OutlinedText(tex.skin_config["entry_game"].text[global_data.config["general"]["language"]], tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True),
|
||||||
OutlinedText('特訓モード', tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True),
|
OutlinedText(tex.skin_config["entry_practice"].text[global_data.config["general"]["language"]], tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True),
|
||||||
OutlinedText('ゲーム設定', tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True)]
|
OutlinedText(tex.skin_config["entry_settings"].text[global_data.config["general"]["language"]], tex.skin_config["entry_box_text"].font_size, ray.WHITE, outline_thickness=5, vertical=True)]
|
||||||
self.box_locations = ["SONG_SELECT", "PRACTICE_SELECT", "SETTINGS"]
|
self.box_locations = ["SONG_SELECT", "PRACTICE_SELECT", "SETTINGS"]
|
||||||
self.num_boxes = len(self.box_titles)
|
self.num_boxes = len(self.box_titles)
|
||||||
self.boxes = [Box(self.box_titles[i], self.box_locations[i]) for i in range(len(self.box_titles))]
|
self.boxes = [Box(self.box_titles[i], self.box_locations[i]) for i in range(len(self.box_titles))]
|
||||||
|
|||||||
@@ -448,7 +448,7 @@ class Player:
|
|||||||
self.get_load_time(note)
|
self.get_load_time(note)
|
||||||
if note.type == NoteType.TAIL:
|
if note.type == NoteType.TAIL:
|
||||||
note.load_ms = last_note.load_ms
|
note.load_ms = last_note.load_ms
|
||||||
note.unload_ms = last_note.unload_ms
|
last_note.unload_ms = note.unload_ms
|
||||||
last_note = note
|
last_note = note
|
||||||
|
|
||||||
self.draw_note_list = deque(sorted(self.draw_note_list, key=lambda n: n.load_ms))
|
self.draw_note_list = deque(sorted(self.draw_note_list, key=lambda n: n.load_ms))
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ class SongSelectScreen(Screen):
|
|||||||
self.dan_transition = DanTransition()
|
self.dan_transition = DanTransition()
|
||||||
self.shader = ray.load_shader('shader/dummy.vs', 'shader/colortransform.fs')
|
self.shader = ray.load_shader('shader/dummy.vs', 'shader/colortransform.fs')
|
||||||
self.color = None
|
self.color = None
|
||||||
|
song_format = tex.skin_config["song_num"].text[global_data.config["general"]["language"]]
|
||||||
|
self.song_num = OutlinedText(song_format.format(global_data.songs_played+1), tex.skin_config["song_num"].font_size, ray.WHITE)
|
||||||
self.load_shader_values(self.color)
|
self.load_shader_values(self.color)
|
||||||
|
|
||||||
session_data = global_data.session_data[global_data.player_num]
|
session_data = global_data.session_data[global_data.player_num]
|
||||||
@@ -387,8 +389,8 @@ class SongSelectScreen(Screen):
|
|||||||
|
|
||||||
self.indicator.draw(tex.skin_config['song_select_indicator'].x, tex.skin_config['song_select_indicator'].y)
|
self.indicator.draw(tex.skin_config['song_select_indicator'].x, tex.skin_config['song_select_indicator'].y)
|
||||||
|
|
||||||
tex.draw_texture('global', 'song_num_bg', fade=0.75)
|
tex.draw_texture('global', 'song_num_bg', fade=0.75, x=-(self.song_num.texture.width-127), x2=(self.song_num.texture.width-127))
|
||||||
tex.draw_texture('global', 'song_num', frame=global_data.songs_played % 4)
|
self.song_num.draw(ray.BLACK, x=tex.skin_config["song_num"].x-self.song_num.texture.width, y=tex.skin_config["song_num"].y)
|
||||||
if self.state == State.BROWSING or self.state == State.DIFF_SORTING:
|
if self.state == State.BROWSING or self.state == State.DIFF_SORTING:
|
||||||
self.timer_browsing.draw()
|
self.timer_browsing.draw()
|
||||||
elif self.state == State.SONG_SELECTED:
|
elif self.state == State.SONG_SELECTED:
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ from libs.audio import audio
|
|||||||
from libs.global_objects import AllNetIcon, CoinOverlay, EntryOverlay
|
from libs.global_objects import AllNetIcon, CoinOverlay, EntryOverlay
|
||||||
from libs.texture import tex
|
from libs.texture import tex
|
||||||
from libs.utils import (
|
from libs.utils import (
|
||||||
|
OutlinedText,
|
||||||
get_current_ms,
|
get_current_ms,
|
||||||
global_data,
|
global_data,
|
||||||
global_tex,
|
global_tex,
|
||||||
is_l_don_pressed,
|
is_l_don_pressed,
|
||||||
is_r_don_pressed,
|
is_r_don_pressed,
|
||||||
)
|
)
|
||||||
|
import pyray as ray
|
||||||
from libs.video import VideoPlayer
|
from libs.video import VideoPlayer
|
||||||
from libs.screen import Screen
|
from libs.screen import Screen
|
||||||
|
|
||||||
@@ -30,9 +32,6 @@ class TitleScreen(Screen):
|
|||||||
base = Path(f"Skins/{global_data.config["paths"]["skin"]}/Videos")
|
base = Path(f"Skins/{global_data.config["paths"]["skin"]}/Videos")
|
||||||
self.op_video_list += list((base/"op_videos").glob("**/*.mp4"))
|
self.op_video_list += list((base/"op_videos").glob("**/*.mp4"))
|
||||||
self.attract_video_list += list((base/"attract_videos").glob("**/*.mp4"))
|
self.attract_video_list += list((base/"attract_videos").glob("**/*.mp4"))
|
||||||
self.coin_overlay = CoinOverlay()
|
|
||||||
self.allnet_indicator = AllNetIcon()
|
|
||||||
self.entry_overlay = EntryOverlay()
|
|
||||||
|
|
||||||
def on_screen_start(self):
|
def on_screen_start(self):
|
||||||
super().on_screen_start()
|
super().on_screen_start()
|
||||||
@@ -40,6 +39,10 @@ class TitleScreen(Screen):
|
|||||||
self.op_video = None
|
self.op_video = None
|
||||||
self.attract_video = None
|
self.attract_video = None
|
||||||
self.warning_board = None
|
self.warning_board = None
|
||||||
|
self.coin_overlay = CoinOverlay()
|
||||||
|
self.allnet_indicator = AllNetIcon()
|
||||||
|
self.entry_overlay = EntryOverlay()
|
||||||
|
self.hit_taiko_text = OutlinedText(global_tex.skin_config["hit_taiko_to_start"].text[global_data.config["general"]["language"]], tex.skin_config["hit_taiko_to_start"].font_size, ray.WHITE, spacing=5)
|
||||||
self.fade_out = tex.get_animation(13)
|
self.fade_out = tex.get_animation(13)
|
||||||
self.text_overlay_fade = tex.get_animation(14)
|
self.text_overlay_fade = tex.get_animation(14)
|
||||||
|
|
||||||
@@ -116,8 +119,8 @@ class TitleScreen(Screen):
|
|||||||
self.allnet_indicator.draw()
|
self.allnet_indicator.draw()
|
||||||
self.entry_overlay.draw(tex.skin_config["entry_overlay_title"].x, y=tex.skin_config["entry_overlay_title"].y)
|
self.entry_overlay.draw(tex.skin_config["entry_overlay_title"].x, y=tex.skin_config["entry_overlay_title"].y)
|
||||||
|
|
||||||
global_tex.draw_texture('overlay', 'hit_taiko_to_start', index=0, fade=self.text_overlay_fade.attribute)
|
self.hit_taiko_text.draw(ray.BLACK, x=tex.screen_width*0.25 - self.hit_taiko_text.texture.width//2, y=tex.skin_config["hit_taiko_to_start"].y, fade=self.text_overlay_fade.attribute)
|
||||||
global_tex.draw_texture('overlay', 'hit_taiko_to_start', index=1, fade=self.text_overlay_fade.attribute)
|
self.hit_taiko_text.draw(ray.BLACK, x=tex.screen_width*0.75 - self.hit_taiko_text.texture.width//2, y=tex.skin_config["hit_taiko_to_start"].y, fade=self.text_overlay_fade.attribute)
|
||||||
|
|
||||||
class WarningScreen:
|
class WarningScreen:
|
||||||
"""Warning screen for the game"""
|
"""Warning screen for the game"""
|
||||||
|
|||||||
Reference in New Issue
Block a user