├── 00warper.rpy ├── ATL_functions.rpy ├── ActionEditor.rpy ├── ActionEditor_config.rpy ├── ActionEditor_screens.rpy ├── README.md ├── image_viewer.rpy ├── keymap.rpy ├── menu_screen.rpy ├── sound_viewer.rpy └── tl ├── chinese ├── ActionEditor.rpy ├── ActionEditor_screens.rpy ├── image_viewer.rpy └── sound_viewer.rpy └── japanese ├── ActionEditor.rpy ├── ActionEditor_screens.rpy ├── image_viewer.rpy └── sound_viewer.rpy /00warper.rpy: -------------------------------------------------------------------------------- 1 | python early hide: 2 | 3 | @renpy.atl_warper 4 | def power_in2(x): 5 | if x >= 1.0: 6 | return 1.0 7 | return 1.0 - (1.0 - x)**2 8 | 9 | @renpy.atl_warper 10 | def power_out2(x): 11 | if x >= 1.0: 12 | return 1.0 13 | return x**2 14 | 15 | @renpy.atl_warper 16 | def power_in3(x): 17 | if x >= 1.0: 18 | return 1.0 19 | return 1.0 - (1.0 - x)**3 20 | 21 | @renpy.atl_warper 22 | def power_out3(x): 23 | if x >= 1.0: 24 | return 1.0 25 | return x**3 26 | 27 | @renpy.atl_warper 28 | def power_in4(x): 29 | if x >= 1.0: 30 | return 1.0 31 | return 1.0 - (1.0 - x)**4 32 | 33 | @renpy.atl_warper 34 | def power_out4(x): 35 | if x >= 1.0: 36 | return 1.0 37 | return x**4 38 | 39 | @renpy.atl_warper 40 | def power_in5(x): 41 | if x >= 1.0: 42 | return 1.0 43 | return 1.0 - (1.0 - x)**5 44 | 45 | @renpy.atl_warper 46 | def power_out5(x): 47 | if x >= 1.0: 48 | return 1.0 49 | return x**5 50 | 51 | @renpy.atl_warper 52 | def power_in6(x): 53 | if x >= 1.0: 54 | return 1.0 55 | return 1.0 - (1.0 - x)**6 56 | 57 | @renpy.atl_warper 58 | def power_out6(x): 59 | if x >= 1.0: 60 | return 1.0 61 | return x**6 62 | 63 | @renpy.atl_warper 64 | def spring1(x): 65 | from math import exp, cos 66 | rho = 5 # 減衰率 67 | mu = 30# 角振動数 68 | return (1.0 - exp(-rho * x) * cos(mu * x)) / (1.0 - exp(-rho) * cos(mu)) 69 | 70 | @renpy.atl_warper 71 | def spring2(x): 72 | from math import exp, cos 73 | rho = 5 # 減衰率 74 | mu = 20# 角振動数 75 | return (1.0 - exp(-rho * x) * cos(mu * x)) / (1.0 - exp(-rho) * cos(mu)) 76 | 77 | @renpy.atl_warper 78 | def spring3(x): 79 | from math import exp, cos 80 | rho = 5 # 減衰率 81 | mu = 10# 角振動数 82 | return (1.0 - exp(-rho * x) * cos(mu * x)) / (1.0 - exp(-rho) * cos(mu)) 83 | 84 | @renpy.atl_warper 85 | def bop_time_warp(x): 86 | return -23.0 * x**5 + 57.5 * x**4 - 55 * x**3 + 25 * x**2 - 3.5 * x 87 | 88 | @renpy.atl_warper 89 | def bop_in_time_warp(x): 90 | return -2.15 * x**2 + 3.15 * x 91 | 92 | @renpy.atl_warper 93 | def bop_out_time_warp(x): 94 | return 2.15 * x**2 - 1.15 * x 95 | 96 | @renpy.atl_warper 97 | def bop_to_time_warp(x): 98 | return -5 * x**5 + 5 * x**4 + x**2 99 | 100 | @renpy.atl_warper 101 | def to_bop_time_warp(x): 102 | return -5 * x**5 + 20 * x**4 - 30 * x**3 + 19 * x**2 - 3 * x 103 | 104 | @renpy.atl_warper 105 | def easeout2(x): 106 | if x >= 1.0: 107 | return 1.0 108 | import math 109 | return 1.0 - math.cos(x * math.pi / 2.0) 110 | 111 | @renpy.atl_warper 112 | def easein2(x): 113 | if x >= 1.0: 114 | return 1.0 115 | import math 116 | return math.cos((1.0 - x) * math.pi / 2.0) 117 | 118 | @renpy.atl_warper 119 | def ease2(x): 120 | if x >= 1.0: 121 | return 1.0 122 | import math 123 | return .5 - math.cos(math.pi * x) / 2.0 124 | @renpy.atl_warper 125 | def power_in_time_warp_real(x): 126 | if x >= 1.0: 127 | return 1.0 128 | return 1.0 - (1.0 - x)**6 129 | 130 | #互換性のために残しておく 131 | @renpy.atl_warper 132 | def power_out_time_warp_real(x): 133 | if x >= 1.0: 134 | return 1.0 135 | return 1.0 - (1.0 - x)**6 136 | 137 | @renpy.atl_warper 138 | def power_in_time_warp_real5(x): 139 | if x >= 1.0: 140 | return 1.0 141 | return 1.0 - (1.0 - x)**5 142 | 143 | @renpy.atl_warper 144 | def power_out_time_warp_real5(x): 145 | if x >= 1.0: 146 | return 1.0 147 | return x**5 148 | 149 | @renpy.atl_warper 150 | def loop_cos(x): 151 | from math import cos, pi 152 | if x >= 1.0: 153 | return 1.0 154 | return (-1*cos(x*2*pi)+1)/2 155 | -------------------------------------------------------------------------------- /ATL_functions.rpy: -------------------------------------------------------------------------------- 1 | # ATL functions 2 | # This File adds some utility function for ATL function. 3 | # このファイルはATLのfunctionステートメントで使用できるユーソリティー関数を追加します。 4 | # 5 | #class mfn(func1, func2, func3, ...) 6 | # This class takes functions which are called with arguments tran, st, at. 7 | # This is intended to be used to use multiple functions for function statement in ATL. 8 | # このクラスは複数の関数を引数に取り、それらは tran, st, atを引数に呼び出されます。 9 | # これはATLのfunctionステートメントで複数の関数を使用するために使用できます。 10 | # example: 11 | # init python: 12 | # example_func = mfn(func1, func2) 13 | # label start: 14 | # show test: 15 | # function example_func(func1, func2) 16 | # 17 | #class atl_sin(property, peak, hz, start=None, end=None, damped=False, damped_warper='ease') 18 | # This change the property value with a sine wave. 19 | # プロパティーの値を正弦波で変更します。 20 | # property: property name string 21 | # プロパティーの名前の文字列です。 22 | # peak: peak value 23 | # 振幅 24 | # hz: hz of the wave 25 | # 振動数 26 | # start: This function starts after `start` seconds 27 | # この関数は `start` 秒後に開始します。 28 | # end: This function ends after `end` seconds 29 | # この関数は `end` 秒後に終了します。 30 | # damped: If True and `end` is not None, this wave 31 | # is damped wave. Wave stops in `end` seconds 32 | # True かつ `end` が設定されていれば減衰波になり、 33 | # `end` 秒後に振動が止まります。 34 | # damped_warper: This is warper which is used for damp. 35 | # 減衰に使用されるワーパーです。 36 | # 37 | #class atl_cos(property, peak, hz, start=None, end=None, damped=False, damped_warper='ease') 38 | # This is cos version of atl_sin. 39 | # atl_sinの余弦波バージョンです。 40 | 41 | #class atl_wiggle(property, max, deviation, cycle, fast_forward=1, knot_num_per_sec=1, start=None, end=None, damped=False, damped_warper='ease'): 42 | # Random knots are created according to a Gaussian distribution, and sprite interpolation is performed between knots to reproduce random vibration. 43 | # ガウス分布に従ったランダムな中間点を作成し、中間点間をスプライト補間してランダム振動を再現します。 44 | # property: property name string 45 | # プロパティーの名前の文字列です。 46 | # max: The valu is limited in this value. 47 | # 設定される値はこの値を越えません。 48 | # deviation: the standard deviation 49 | # 標準偏差です。 50 | # cycle: The number of seconds of the vibration cycle. The value set for each of these seconds is 0. 51 | # It is important for this vibration looks random to set sufficiently big value 52 | # 振動周期の秒数です。この秒数ごとに設定される値は0となります。振動をランダムに見せるには十分長い必要があります。 53 | # fast_forward: The vibration will be `fast_forward` times faster. 54 | # 振動が `fast_forward` 倍早まわしになります。 55 | # knot_num_per_sec: The number of knot per second. The more knot, the finer the amplitude. 56 | # 1秒あたりの中間点の数です。中間点が増えるほど振幅が細かくなります。 57 | # start: This function starts after `start` seconds 58 | # この関数は `start` 秒後に開始します。 59 | # end: This function ends after `end` seconds 60 | # この関数は `end` 秒後に終了します。 61 | # damped: If True and `end` is not None, this wave 62 | # is damped wave. Wave stops in `end` seconds 63 | # True かつ `end` が設定されていれば減衰波になり、 64 | # `end` 秒後に振動が止まります。 65 | # damped_warper: This is warper which is used for damp. 66 | # 減衰に使用されるワーパーです。 67 | # 68 | # For example, This reproduces camera shake. 69 | # 例: 手ぶれを再現します。 70 | # init python: 71 | # camera_shake = mfn(atl_wiggle("yoffset", max=20, deviation=40, cycle=10), atl_wiggle("xoffset", max=20, deviation=40, cycle=10)) 72 | # label start: 73 | # camera: 74 | # function camera_shake 75 | # 76 | # For example, This reproduces the 10 seconds earthquake 77 | # 例: 10秒間の地震を再現します。 78 | # init python: 79 | # earthquake = mfn(atl_wiggle("yoffset", max=20, deviation=40, cycle=100, fast_forward=10, end=10, damped=True, damped_warper="ease"), atl_wiggle("xoffset", max=20, deviation=40, cycle=100, fast_forward=10, end=10, damped=True, damped_warper="ease")) 80 | # label start: 81 | # camera: 82 | # function earthquake 83 | # 84 | # 85 | #def atl_swiggle(deviation, fast_forward=1, start=None, end=None, damped=False, damped_warper='ease', property=("xoffset", "yoffset")): 86 | # This is the wrapper for atl_wiggle. 87 | # これはatl_wiggleのラッパーです。 88 | # Below two code is mostly equivalent. 89 | # 次の2つのコードはほぼ同じ動作をします。 90 | # 91 | # init python: 92 | # sample1 = mfn(atl_wiggle("yoffset", max=20, deviation=40, cycle=10), atl_wiggle("xoffset", max=20, deviation=40, cycle=10)) 93 | # sample2 = atl_swiggle(deviation=40) 94 | 95 | init python in _viewers: 96 | in_editor = False 97 | 98 | init python: 99 | class mfn(object): 100 | def __init__(self, *args): 101 | self.fns = list(args) 102 | 103 | def __call__(self, tran, st, at): 104 | min_fr = None 105 | for i in reversed(range(len(self.fns))): 106 | fr = self.fns[i](tran, st, at) 107 | if fr is not None and (min_fr is None or fr < min_fr): 108 | min_fr = fr 109 | elif fr is None and not _viewers.in_editor: 110 | del self.fns[i] 111 | return min_fr 112 | 113 | 114 | class generate_atl_func(object): 115 | def __init__(self, property, start=None, end=None, check_type=True): 116 | self.property = property 117 | self.start = start 118 | self.end = end 119 | self.check_type = check_type 120 | 121 | def __call__(self, tran, st, at): 122 | if self.end is not None: 123 | if st > self.end: 124 | return None 125 | if self.start is not None: 126 | st -= self.start 127 | if st < 0: 128 | return 0 129 | cur_prop = self.get_cur_prop(tran) 130 | fr = self.function(tran, st, at) 131 | if self.check_type and isinstance(cur_prop, int): 132 | setattr(tran, self.property, int(getattr(tran, self.property))) 133 | return fr 134 | 135 | def get_cur_prop(self, tran): 136 | cur_prop = getattr(tran, self.property) 137 | if cur_prop is None: 138 | cur_prop = getattr(tran, "inherited_"+self.property) 139 | return cur_prop 140 | 141 | 142 | class atl_sin(generate_atl_func): 143 | def __init__(self, property, peak, hz, start=None, end=None, damped=False, damped_warper='ease'): 144 | super(atl_sin, self).__init__(property, start, end) 145 | self.peak = peak 146 | self.hz = hz 147 | self.damped = damped 148 | self.damped_warper = damped_warper 149 | 150 | def function(self, tran, st, at): 151 | from math import sin, pi 152 | damp = 1 153 | if self.damped and self.end is not None: 154 | damp = renpy.atl.warpers[self.damped_warper]((self.end - st) / self.end) 155 | offset = damp * self.peak * sin(st*2*pi*self.hz) 156 | setattr(tran, self.property, offset) 157 | return 0 158 | 159 | 160 | class atl_cos(generate_atl_func): 161 | def __init__(self, property, peak, hz, start=None, end=None, damped=False, damped_warper='ease'): 162 | super(atl_cos, self).__init__(property, start, end) 163 | self.peak = peak 164 | self.hz = hz 165 | self.damped = damped 166 | self.damped_warper = damped_warper 167 | 168 | def function(self, tran, st, at): 169 | from math import cos, pi 170 | damp = 1 171 | if self.damped and self.end is not None: 172 | damp = renpy.atl.warpers[self.damped_warper]((self.end - st) / self.end) 173 | offset = damp * self.peak * cos(st*2*pi*self.hz) 174 | setattr(tran, self.property, offset) 175 | return 0 176 | 177 | 178 | class atl_wiggle(generate_atl_func): 179 | def __init__(self, property, max, deviation, cycle, fast_forward=1, knot_num_per_sec=1, start=None, end=None, damped=False, damped_warper='ease'): 180 | super(atl_wiggle, self).__init__(property, start, end) 181 | from random import gauss 182 | 183 | start_point = 0 184 | goal_point = 0 185 | #予めランダムな値を生成しておく 186 | self.random_knot = [start_point] 187 | for i in range(0, int(cycle/knot_num_per_sec)): 188 | while True: 189 | v = gauss(0, deviation) 190 | if abs(v) <= max: 191 | break 192 | self.random_knot.append(v) 193 | self.random_knot.append(goal_point) 194 | self.cycle = cycle 195 | self.fast_forward = fast_forward 196 | self.damped = damped 197 | self.damped_warper = damped_warper 198 | 199 | def function(self, tran, st, at): 200 | st *= self.fast_forward 201 | g = round((st % self.cycle), 3) / self.cycle 202 | damp = 1 203 | if self.damped and self.end is not None: 204 | damp = renpy.atl.warpers[self.damped_warper]((self.end - st / self.fast_forward) / self.end) 205 | 206 | if renpy.version_tuple[3] >= 24011600: 207 | interpolate_spline = renpy.atl.interpolate_spline(g, self.random_knot, renpy.atl.PROPERTIES[self.property]) 208 | else: 209 | interpolate_spline = renpy.atl.interpolate_spline(g, self.random_knot) 210 | 211 | offset = damp * interpolate_spline 212 | setattr(tran, self.property, offset) 213 | return 0 214 | 215 | 216 | def atl_swiggle(deviation, fast_forward=1, start=None, end=None, damped=False, damped_warper='ease', property=("xoffset", "yoffset")): 217 | cycle = 20 218 | if not isinstance(property, tuple): 219 | property = tuple([property]) 220 | args = [] 221 | for p in property: 222 | args.append(atl_wiggle(p, max=deviation/2, deviation=deviation, cycle=cycle*fast_forward, fast_forward=fast_forward, start=start, end=end, damped=damped, damped_warper=damped_warper)) 223 | return mfn(*args) 224 | 225 | 226 | # class atl_wiggle(generate_atl_func): 227 | # def __init__(self, property, peak, hz, start=None, end=None): 228 | # super(atl_wiggle, self).__init__(property, start, end) 229 | # from random import random 230 | # #予めランダムな値を生成しておく 231 | # self.randoms = [(1+random(), 1+random()) for i in range(0, 100)] 232 | # self.hz = hz 233 | # self.peak = peak 234 | # 235 | # self.octaves = 1 236 | # self.ampMulti = .5 237 | # self.time = 0 238 | # 239 | # def function(self, tran, st, at): 240 | # from math import sin, pi, ceil 241 | # rx1, rx2 = self.randoms[int(ceil(st*self.hz)%100)] 242 | # offset = rx1*self.peak*sin(2*pi*self.hz*st) + rx2*self.peak*self.ampMulti*sin(2*pi*self.hz*2*self.octaves*(st+self.time)) 243 | # setattr(tran, self.property, offset) 244 | # return 0 245 | -------------------------------------------------------------------------------- /ActionEditor_config.rpy: -------------------------------------------------------------------------------- 1 | init 999 python in _viewers: 2 | #this is used for default transition 3 | #デフォルトで使用されるトランジションの文字列です。Noneも指定可能です。 4 | default_transition = "dissolve" 5 | init -999 python in _viewers: 6 | #hide winodw during animation in clipboard data 7 | #アニメーション中ウィンドウを隠すようにクリップボードを出力するか決定します 8 | #シーンが1つのとき動作します。 9 | hide_window_in_animation = True 10 | #If this is True and hide_window_in_animation is True, allow animation to be skipped 11 | #アニメーションをスキップできる形式でクリップボードに出力します。hide_window_in_animationがTrueかつ 12 | #シーンが1つのとき動作します。 13 | allow_animation_skip = True 14 | #this is used for default warper 15 | #デフォルトで使用されるwarper関数名の文字列を指定します。 16 | default_warper = "linear" 17 | # If True, show rot default. 18 | #True, なら格子をデフォルトで表示します。 19 | default_rot = True 20 | # If True, simulate defpth of field and focusing is enable by default. 21 | # Trueならカメラブラーを再現するフォーカシングをデフォルトで有効にします。 22 | focusing = False 23 | # If True, show icons which is dragged to move camera or iamges by default 24 | # Trueならドラッグでカメラや画像を移動できるアイコンをデフォルトで表示します。 25 | default_show_camera_icon = True 26 | # If True, One line includes only one property in clipboard data 27 | # Trueならクリップボードデータで一行に1つのプロパティーのみ記述します。 28 | default_one_line_one_prop = False 29 | # If True, use legacy action editor screen 30 | # Trueなら以前のレイアウトでActionEditorを表示します。 31 | default_legacy_gui = False 32 | # If True, set camera keymap FPS(wasd), otherwise vim(hjkl) 33 | #Trueなら、カメラはWASD, wasdで、Falseならhjkl, HJKLで移動します。 34 | fps_keymap = True 35 | # If True, only one page is opened at once. this has no effect for legacy gui 36 | #Trueなら、一度に1つの項目のみ開きます。これはレガシーGUIでは無効です。 37 | default_open_only_one_page = False 38 | # the number of tabs shown at onece(In legacy GUI). 39 | #一度に表示する画像タグ数を設定します(レガシーGUIのみ)。 40 | tab_amount_in_page = 5 41 | #The blur value where the distance from focus position is dof. 42 | #フォーカシングでフォーカス位置からDOF離れた場所でのブラー量を設定します。 43 | _camera_blur_amount = 2.0 44 | #warper function name which is used for the distance from focus position and blur amount. 45 | #フォーカス位置からの距離とカメラブラーの効きを決定するwarper関数名の文字列です 46 | _camera_blur_warper = "linear" 47 | # the range of values of properties for int type(In legacy GUI) 48 | #エディターのバーに表示する整数の範囲です(レガシーGUIのみ)。 49 | wide_range = 1500 50 | # the range of values of properties for float type(In legacy GUI) 51 | #エディターのバーに表示する浮動小数の範囲です(レガシーGUIのみ)。 52 | narrow_range = 7.0 53 | # change per pix 54 | #Set the amount of change per pixel when dragging the value of the float property(In new GUI) 55 | narrow_drag_speed = 1./200 56 | #Set the amount of change per pixel when dragging the value of the integer property(In new GUI) 57 | #整数プロパティーの値をドラッグしたときの1pixelごとの変化量を設定します(新GUIのみ)。 58 | wide_drag_speed = int(config.screen_width/200) 59 | # the range of time 60 | #エディターのバーに表示する時間の範囲です。 61 | time_range = 7.0 62 | # the list of channel for playing 63 | # ActionEditorで使用するチャンネルのリストです 64 | default_channel_list = ["sound"] 65 | #default side view. 66 | default_sideview = True 67 | #Not included layers 68 | not_included_layer = ("transient", "screens", "overlay") 69 | 70 | default_graphic_editor_narrow_range = 2. 71 | default_graphic_editor_wide_range = 2000 72 | 73 | preview_size=0.6 74 | preview_background_color="#111" 75 | 76 | props_sets = ( 77 | ("Child/Pos ", ("child", "xpos", "ypos", "zpos", "xaround", "yaround", "radius", "angle", "rotate", 78 | "xrotate", "yrotate", "zrotate", "xorientation", "yorientation", "zorientation", "point_to",)), 79 | ("3D Matrix ", ("matrixtransform",)), 80 | ("Anchor/Offset", ("xanchor", "yanchor", "matrixanchorX", "matrixanchorY", "xoffset", "yoffset")), 81 | ("Zoom/Crop ", ("xzoom", "yzoom", "zoom", "cropX", "cropY", "cropW", "cropH")), 82 | ("Effect ", ("blend", "alpha", "blur", "additive", "matrixcolor", "dof", "focusing")), 83 | ("Misc ", ("zzoom", "perspective", "function", "xpan", "ypan", "xtile", "ytile")), 84 | ) 85 | 86 | props_groups = { 87 | "around":["xaround", "yaround"], 88 | "matrixanchor":["matrixanchorX", "matrixanchorY"], 89 | "crop":["cropX", "cropY", "cropW", "cropH"], 90 | "focusing":["focusing", "dof"], 91 | "orientation":["xorientation", "yorientation", "zorientation"], 92 | } 93 | 94 | #These variables are always wide range even if it is float type. 95 | #浮動小数であっても整数と同じスケールで表示される変数です。 96 | force_wide_range = {"rotate", "rotateX", "rotateY", "rotateZ", "offsetX", "offsetY", "offsetZ", "zpos", "xoffset", "yoffset", "hue", "dof", "focusing", "angle", "xpan", "ypan", "xrotate", "yrotate", "zrotate", "xorientation", "yorientation", "zorientation"} 97 | force_narrow_range = {"xtile", "ytile"} 98 | #These variables are always plus 99 | #常に正数になる変数です。 100 | force_plus = {"additive", "blur", "alpha", "invert", "contrast", "saturate", "cropW", "cropH", "dof", "focusing", "xtile", "ytile"} 101 | #These varialbes aren't setted without keyframe. 102 | #crop doesn't work when perspective True and rotate change the pos of image when perspective is not True 103 | #キーフレームを設定しなければ適用されない変数です。 104 | not_used_by_default = {"rotate", "cropX", "cropY", "cropW", "cropH", "xpan", "ypan", "function"} 105 | #These variables are always float type. 106 | #常に浮動小数になる変数です。 107 | force_float = ("zoom", "xzoom", "yzoom", "alpha", "additive", "blur", "invert", "contrast", "saturate", "bright", "xaround", "yaround", "scaleX", "scaleY", "scaleZ", "xrotate", "yrotate", "zrotate", "xorientation", "yorientation", "zorientation") 108 | 109 | boolean_props = {"zzoom"} 110 | any_props = {"blend", "point_to"} 111 | def check_perspective(v): 112 | if isinstance(v, (int, float)): 113 | return True 114 | if isinstance(v, tuple) and len(v) == 3: 115 | for i in v: 116 | if not isinstance(v, (int, float)): 117 | return False 118 | else: 119 | return True 120 | check_any_props = {"perspective":check_perspective} 121 | def check_poi(v): 122 | if isinstance(v, tuple) and len(v) == 3: 123 | x, y, z = v 124 | if isinstance(x, (int, float)) and isinstance(y, (int, float)) and isinstance(z, (int, float)): 125 | return True 126 | elif isinstance(v, renpy.display.transform.Camera): 127 | return True 128 | elif v is None: 129 | return True 130 | else: 131 | return False 132 | check_any_props = {"point_to":check_poi} 133 | #properties which is included in any_props and is choiced by menu. 134 | menu_props = {"blend":[None] + [key for key in config.gl_blend_func]} 135 | 136 | #disallow properties to edit at sametime. 137 | #Editorの都合で同時に編集されたくないプロパティー 138 | exclusive = ( 139 | ({"xpos", "ypos"}, {"xaround", "yaround", "radius", "angle"}), 140 | # ({"xpan", "ypan"}, {"xtile", "ytile"}), 141 | ) 142 | disallow_spline = ("focusing", "matrixtransform", "matrixcolor", "orientation") 143 | xygroup = {"pos": ("xpos", "ypos"), "anchor": ("xanchor", "yanchor"), "offset": ("xoffset", "yoffset")} 144 | default_matrixtransform = [ 145 | ("matrixtransform_1_1_scaleX", 1.), ("matrixtransform_1_2_scaleY", 1.), ("matrixtransform_1_3_scaleZ", 1.), 146 | ("matrixtransform_2_1_offsetX", 0.), ("matrixtransform_2_2_offsetY", 0.), ("matrixtransform_2_3_offsetZ", 0.), 147 | ("matrixtransform_3_1_rotateX", 0.), ("matrixtransform_3_2_rotateY", 0.), ("matrixtransform_3_3_rotateZ", 0.), 148 | ("matrixtransform_4_1_offsetX", 0.), ("matrixtransform_4_2_offsetY", 0.), ("matrixtransform_4_3_offsetZ", 0.), 149 | ("matrixtransform_5_1_offsetX", 0.), ("matrixtransform_5_2_offsetY", 0.), ("matrixtransform_5_3_offsetZ", 0.), 150 | ] 151 | default_matrixcolor = [ 152 | ("matrixcolor_1_1_invert", 0.), 153 | ("matrixcolor_2_1_contrast", 1.), 154 | ("matrixcolor_3_1_saturate", 1.), 155 | ("matrixcolor_4_1_bright", 0.), 156 | ("matrixcolor_5_1_hue", 0.), 157 | ] 158 | #The order of properties in clipboard data. 159 | #この順番でクリップボードデータが出力されます 160 | #ないものは出力されません 161 | sort_order_list = ( 162 | "blend", 163 | "pos", 164 | "anchor", 165 | "offset", 166 | "xpos", 167 | "xanchor", 168 | "xoffset", 169 | "ypos", 170 | "yanchor", 171 | "yoffset", 172 | "around", 173 | "radius", 174 | "angle", 175 | "zpos", 176 | "xrotate", 177 | "yrotate", 178 | "zrotate", 179 | "orientation", 180 | "point_to", 181 | "matrixtransform", 182 | "matrixanchor", 183 | "rotate", 184 | "xzoom", 185 | "yzoom", 186 | "zoom", 187 | "crop", 188 | "alpha", 189 | "additive", 190 | "blur", 191 | "matrixcolor", 192 | "xpan", 193 | "ypan", 194 | "xtile", 195 | "ytile", 196 | ) 197 | 198 | 199 | #clipboardで個別に出力するプロパティー 200 | special_props = {"child", "function"} 201 | in_editor = False 202 | aspect_16_9 = round(float(config.screen_width)/config.screen_height, 2) == 1.78 203 | 204 | init 999 python in _viewers: 205 | #The properties used in image tag tab 206 | #画像タブに表示されるプロパティー 207 | #(property name, default value) 208 | transform_props = [ 209 | "child", 210 | "xpos", 211 | "ypos", 212 | "zpos", 213 | "xaround", 214 | "yaround", 215 | "radius", 216 | "angle", 217 | "xanchor", 218 | "yanchor", 219 | "matrixanchorX", 220 | "matrixanchorY", 221 | "xoffset", 222 | "yoffset", 223 | "rotate", 224 | "xzoom", 225 | "yzoom", 226 | "zoom", 227 | "cropX", 228 | "cropY", 229 | "cropW", 230 | "cropH", 231 | "matrixtransform", 232 | "dof", 233 | "focusing", 234 | "alpha", 235 | "additive", 236 | "blur", 237 | "matrixcolor", 238 | "zzoom", 239 | "xpan", 240 | "ypan", 241 | "xtile", 242 | "ytile", 243 | "blend", 244 | "function", 245 | ] 246 | 247 | #The properties used in camera tab 248 | #カメラタブに表示されるプロパティー 249 | #(property name, default value) 250 | camera_props = [ 251 | "xpos", 252 | "ypos", 253 | "zpos", 254 | "xaround", 255 | "yaround", 256 | "radius", 257 | "angle", 258 | "xanchor", 259 | "yanchor", 260 | "matrixanchorX", 261 | "matrixanchorY", 262 | "xoffset", 263 | "yoffset", 264 | "rotate", 265 | "xzoom", 266 | "yzoom", 267 | "zoom", 268 | "cropX", 269 | "cropY", 270 | "cropW", 271 | "cropH", 272 | "matrixtransform", 273 | "dof", 274 | "focusing", 275 | "alpha", 276 | "additive", 277 | "blur", 278 | "matrixcolor", 279 | "xpan", 280 | "ypan", 281 | "xtile", 282 | "ytile", 283 | "perspective", 284 | "function", 285 | ] 286 | 287 | if check_version(23032300): 288 | transform_props += [ 289 | "xrotate", 290 | "yrotate", 291 | "zrotate", 292 | "xorientation", 293 | "yorientation", 294 | "zorientation", 295 | "point_to"] 296 | 297 | camera_props += [ 298 | "xrotate", 299 | "yrotate", 300 | "zrotate", 301 | "xorientation", 302 | "yorientation", 303 | "zorientation", 304 | "point_to"] 305 | 306 | property_default_value = { 307 | "child": (None, None), 308 | "xpos": 0, 309 | "ypos": 0, 310 | "zpos": 0., 311 | "xaround": 0., 312 | "yaround": 0., 313 | "around": (0., 0.), 314 | "radius": 0, 315 | "angle": 0, 316 | "xanchor": 0, 317 | "yanchor": 0, 318 | "matrixanchorX": 0.5, 319 | "matrixanchorY": 0.5, 320 | "matrixanchor": (0.5, 0.5), 321 | "xoffset": 0, 322 | "yoffset": 0, 323 | "rotate": 0., 324 | "xzoom": 1., 325 | "yzoom": 1., 326 | "zoom": 1., 327 | "cropX": 0., 328 | "cropY": 0., 329 | "cropW": 1., 330 | "cropH": 1., 331 | "crop": (0., 0., 1., 1.), 332 | "xrotate":0., 333 | "yrotate":0., 334 | "zrotate":0., 335 | "xorientation": 0., 336 | "yorientation": 0., 337 | "zorientation": 0., 338 | "orientation": (0., 0., 0.), 339 | "point_to": None, 340 | "offsetX": 0., 341 | "offsetY": 0., 342 | "offsetZ": 0., 343 | "rotateX": 0., 344 | "rotateY": 0., 345 | "rotateZ": 0., 346 | "scaleX": 1., 347 | "scaleY": 1., 348 | "scaleZ": 1., 349 | "dof": 400, 350 | "focusing": round(renpy.config.perspective[1], 2), 351 | "alpha": 1., 352 | "additive": 0., 353 | "blur": 0., 354 | "hue": 0., 355 | "bright": 0., 356 | "saturate": 1., 357 | "contrast": 1., 358 | "invert": 0., 359 | "zzoom": False, 360 | "xpan": 0., 361 | "ypan": 0., 362 | "xtile": 1, 363 | "ytile": 1, 364 | "function": (None, None), 365 | "perspective": None, #Falseならカメラ動作せず、Noneなら普通の画像として動作 366 | "blend": "normal", 367 | } 368 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 本ライブラリでは、GUI上で設定できる演出エディターおよび画像ビューワーとサウンドビューワー、さらにATLのfunctionステートメントでの使用を意図した便利な関数群と多数のワーパー関数を追加します。 2 | 日本語マニュアルはドキュメント後半にあります。 3 | 4 | This script adds Ren'py the ability to adjust and view transform properties of images 5 | and camera by in-game Action Editor, Image Viewer and Sound Viewer. 6 | Many warpers and useful functions intended to be used in function statements in ATL are 7 | also added. 8 | 9 | Ren'Py 10 | 11 | lemma forum 12 | 13 | 14 | youtube samples: 15 | * Tutorials チュートリアル 16 | 17 | * Introduce ATL_functions 18 | * Introduce generate warper 19 | * Introduce ActionEditor Update 20220212 20 | 21 | ![Demo](https://dl.dropboxusercontent.com/s/cyfizgl2pvk8w9x/ActionEditor.png) 22 | 23 | 24 | 25 | English Document 26 | ================ 27 | 28 | This script adds Ren'py the ability to adjust and view transform properties of images 29 | and camera by in-game Action Editor, Image Viewer and Sound Viewer. 30 | Many warpers and useful functions intended to be used in function statements in ATL are 31 | also added. 32 | 33 | About old version 34 | ================ 35 | This is available in v7.4.5 later. 36 | To use an older version, use the old version of ActionEditor. 37 | 38 | 39 | In the current version of ActionEditor, the below functions are removed. 40 | * expression 41 | * loading last action 42 | 43 | To install 44 | ================ 45 | To install, copy all files in the camera directory into your game directory. 46 | ActionEditor.rpy is required for release version if you use camera blur or warper_generator. 47 | 00warper.rpy is also required if you use added warpers. 48 | ATL_funcctions.rpy is also required if you use added functions for ATL statement. 49 | Other files are not required. 50 | 51 | Action Editor 52 | ================ 53 | 54 | This allows you to adjust transform properties of camera and images in 55 | real-time with a GUI. It can then generate a script based on these changes and 56 | place it on the clipboard for later pasting into Ren'Py scripts. 57 | 58 | When `config.developer` is True, pressing action_editor (by default, 59 | "shift+P") will open the Action editor. 60 | 61 | The Action Editor has the following features: 62 | 63 | * View and adjust the transform properties of images and camera by adjusting a bar or typing a value. 64 | * View and adjust the x and y coordinates of the camera with a draggable camera icon. 65 | * Adjust the z coordinate of the camera with the mouse wheel. 66 | * Adjust the x,y coordinate of the camera with the keyboard(hjkl, HJKL, wasd, WASD). 67 | * Reset the value by right-clicking on the value button. 68 | * Add, delete, and edit keyframes on a timeline like video editing software. 69 | * The spline motion and loop is available 70 | * After setting up a scene with the desired look and animations, the Action 71 | Editor will generate a script and place it on your clipboard for pasting 72 | into your Ren'Py scripts. (v6.99 and later only) 73 | * Introducing the concept of depth of field and allow to adjust focus position and dof. 74 | Blur each image according to dof, focus position and the distance between the camera and the image. 75 | * Show, replace and hide a image with transition(use None for a image name to hide image) 76 | * Change a scene with scene statement. 77 | * There is the option for hiding window during the ATL animation in clipboard data. 78 | * There is the option for allowing to skip ATL animation in clipboard data. 79 | 80 | Note 81 | * blur transform property of each images are used for simulating camera blur in function transform property, 82 | so blur transform properties of each images aren't available when focusing is enabled. 83 | Set function property to None when you want to disable camera blur for already shown images. 84 | * Unfortunately, The behavior of functions for function property isn't the same as ATL. 85 | There are some different points. 86 | 1. inherited_ have no value. 87 | 2. Setting properties have no effect when it is called next time. 88 | 3. The return value from it has no effect. 89 | 4. It isn't always called in time. 90 | ActionEditor can't get current function when opened. 91 | 92 | * Skipping animations may not work when those include the tags which are already shown and have loop animations. 93 | When using functions other than camera_blur, these may cause malfunction after skip. 94 | * ActionEditor supports ScaleMatrix, OffsetMatrix, RotateMatrix and ignores other matrixtransforms. 95 | * ActionEditor supports InvertMatrix, ContrastMatrix, SaturationMatrix, BrightnessMatrix, HueMatrix and ignores other matrixcolors. 96 | 97 | 98 | How to add desired properties to the editor. 99 | ================ 100 | 101 | variable is edited in ActionEditor_config.rpy. 102 | 103 | Commonly, add the following variables the property name you want to add to be added.: 104 | 105 | * `props_set`: control where that is shown in ActionEditor. 106 | * `sort_order_list`: control where that is shown in the clipboard. 107 | * `transform_props` or `camera_props`: Add the the property name. 108 | Adding `transform_props` shows it in each images and Adding `camera_props` shows it in camera. 109 | * `property_default_value`: Add the default value of the property. 110 | 111 | Further add the following variables according to the type of property. 112 | 113 | If it is integer or float and required. : 114 | 115 | * `force_wide_range`: it has the same scale as integer even when it is float type. 116 | * `force_narrow_range`: it has the same scale as float even when it is int type. 117 | * `force_plus`: it is always plus. 118 | * `force_float`: it is always float. 119 | 120 | If it is boolean type. : 121 | 122 | * `boolean_props` 123 | 124 | Others: 125 | 126 | * `any_props`: this accepts all types. I recommend also using `check_any_props` or `menu_props`. 127 | 128 | * `check_any_props`: This maps a property name to the function. This is called 129 | with the value of the property and set the property the value if result is 130 | True. Otherwise, the error message is shown. 131 | 132 | any_props = {"blend"} 133 | check_any_props = {"blend":lambda v: v in (None, "normal", "add", "multiply", "min", "max")} 134 | 135 | * `menu_props` : use selectable buttons to change `anpy_props` instead of input screen. 136 | 137 | any_props = {"blend"} 138 | menu_props = {"blend":[None] + [key for key in config.gl_blend_func]} 139 | 140 | Exclusive properties like tile and pan should be set in `exclusive`. example: 141 | 142 | exclusive = ( 143 | ({"xpos", "ypos"}, {"xalignaround", "yalignaround", "radius", "angle"}), 144 | ({"xtile", "ytile"}, {"xpan", "ypan"}), 145 | ) 146 | 147 | 148 | Property Group 149 | ================ 150 | 151 | For tuples, you can use `props_groups` where that key is the property name and that value 152 | is the tuple of each element name, so that they can be edited individually. example: 153 | 154 | props_groups = { 155 | "alignaround":["xalignaround", "yalignaround"], 156 | "matrixanchor":["matrixanchorX", "matrixanchorY"], 157 | "crop":["cropX", "cropY", "cropW", "cropH"], 158 | "focusing":["focusing", "dof"], 159 | } 160 | 161 | 162 | Image Viewer 163 | ================ 164 | If `config.developer` is True, pressing Shift+U or +(add image) textbutton on ActionEditor 165 | to open Image Viewer. 166 | 167 | Defined image tags and attribute textbuttons are shown in this viewer. 168 | You can filter them by the text entered in the top-most text entry field. 169 | The completion feature is also available by tab. 170 | 171 | When these textbuttons get focus and the same image name exists as these text, the image is 172 | shown. 173 | Pressing the textbutton add that text to the filter if the same image name doesn't exist 174 | as that text. the image is added to ActionEditor if that exist and viewer is opened by 175 | ActionEditor. the image name is outputted to the clipboard if that exist and viewer isn't 176 | opened by ActionEditor. 177 | 178 | Pressing clipboard button at the bottom also outputs the filter string to clipboard 179 | 180 | 181 | Sound Viewer 182 | ================ 183 | If `config.developer` is True, pressing Shift+S or sounds textbutton on ActionEditor 184 | to open Sound Viewer. 185 | 186 | Variable names in audio store are shown in this viewer. 187 | The music files should be automatically defined as these name. 188 | You can filter them by the text entered in the top-most text entry field. 189 | The completion feature is also available by tab. 190 | 191 | When these textbuttons get focus and the music file is played. 192 | Pressing the textbutton adds that to ActionEditor if the viewer is opened by ActionEditor. 193 | Otherwise, that name is outputted to the clipboard. 194 | 195 | Pressing clipboard button at the bottom also outputs the filter string to clipboard 196 | 197 | ATL functions 198 | ================ 199 | ATL_funcctions.rpy adds useful functions which are intended to be used for 200 | function statement in ATL block. For more information, see that file. 201 | 202 | 203 | Matrix 204 | ================ 205 | 206 | The default matrix and order for each is as follows. 207 | 208 | matrixtransform: ScaleMatrix*OffsetMatrix*RotateMatrix*OffsetMatrix*OffsetMatrix 209 | matrixcolors: InvertMatrix*ContrastMatrix*SaturationMatrix*BrightnessMatrix*HueMatrix 210 | 211 | You can change default matrix, that order and default value by editing default_matrixtransform or default_matrixcolor in ActionEditor_config.rpy. 212 | 213 | default_matrixtransform = [ 214 | ("matrixtransform_1_1_scaleX", 1.), ("matrixtransform_1_2_scaleY", 1.), ("matrixtransform_1_3_scaleZ", 1.), 215 | ("matrixtransform_2_1_offsetX", 0.), ("matrixtransform_2_2_offsetY", 0.), ("matrixtransform_2_3_offsetZ", 0.), 216 | ("matrixtransform_3_1_rotateX", 0.), ("matrixtransform_3_2_rotateY", 0.), ("matrixtransform_3_3_rotateZ", 0.), 217 | ("matrixtransform_4_1_offsetX", 0.), ("matrixtransform_4_2_offsetY", 0.), ("matrixtransform_4_3_offsetZ", 0.), 218 | ("matrixtransform_5_1_offsetX", 0.), ("matrixtransform_5_2_offsetY", 0.), ("matrixtransform_5_3_offsetZ", 0.), 219 | ] 220 | default_matrixcolor = [ 221 | ("matrixcolor_1_1_invert", 0.), 222 | ("matrixcolor_2_1_contrast", 1.), 223 | ("matrixcolor_3_1_saturate", 1.), 224 | ("matrixcolor_4_1_bright", 0.), 225 | ("matrixcolor_5_1_hue", 0.), 226 | ] 227 | 228 | 229 | Text Size 230 | ================ 231 | 232 | All text style is changeable by new_action_editor_text style. 233 | 234 | init: 235 | style new_action_editor_text: 236 | size 10 237 | 238 | Troubleshooting 239 | ================ 240 | 241 | Layout is corrupted 242 | 243 | Too long tag names and big font sizes corrupt the layout of ActionEditor. 244 | In that case, try to adjust the size of font by the above manner. 245 | 246 | 247 | Known issue 248 | ================ 249 | 250 | ActionEditor can't show camera and displayable with "at clause" including animation correctly. 251 | 252 | ActionEditor can't show movie displayable correctly. 253 | 254 | 255 | Note 256 | ================ 257 | 258 | The clipboard from ActionEditor includes the difference from the state when ActionEditor is opened on. Therefore that is intended to be pasted on next that line. Images aren't shown correctly if the existing lines are overwritten. 259 | 260 | 261 | 日本語ドキュメント 262 | ================ 263 | 本ライブラリでは、GUI上で設定できる3Dステージ対応の演出エディター、および画像ビューワーとサウンドビューワーさらに多数のワーパー関数とATLのfunctionステートメントでの使用を意図した便利な関数群を追加します。 264 | 265 | 旧バージョンについて 266 | ================ 267 | 268 | Ren'Py v7.4.5から追加された3Dステージ機能により、旧版にあった自作の3Dカメラ再現関数は不要になりました。 269 | v7.4.5以前のバージョンでは旧版のActionEditorを使用してください。 270 | 271 | 272 | 3Dカメラの再現を自作スクリプトから3Dステージに切り替えたことにより、旧版にあった最後のアクションを読み込む機能とエクスプレッション機能はなくなりました。 273 | 使用したい場合はそれぞれ以下で代用してください。 274 | * エクスプレッション function ステートメントで代用してください。 275 | 276 | インストール方法 277 | ================ 278 | 279 | 使用にはフォルダ内のファイルをgameフォルダにコピーしてください。 280 | リリース時には追加したファイルは不要になりますが、次の場合は配布ファイルに追加ファイルを残してください。 281 | * カメラブラー、ワーパージェネレータを使用している場合にはActionEditor.rpが必要です。 282 | * 追加ワーパーを使用している場合は00warper.rpyが必要です。 283 | * function ステートメント向け追加関数を使用している場合はATL_functions.rpyが必要です。 284 | 285 | 演出エディター(Action Editor) 286 | ================ 287 | 288 | 演出エディターではcameraや画像の transform プロパティーをGUI上で変更し、結果を 289 | 確認できます。さらにそれらの値を時間軸に沿って変更可能なので、スクリプトを変更 290 | するたびに、リロードで結果を確認する従来の方法より遥かに短時間でアニメーション 291 | を作成可能です。設定したアニメーションはクリップボード経由でスクリプトに貼り付 292 | けられます。 293 | さらにfocusingを有効にすると被写界深度の概念をRen'Pyに導入して、カメラと画像と 294 | の距離に応じてブラーがかかるようにもできます。 295 | 296 | config.developer が True なら、Shift+Pで演出エディターが起動します。 297 | 298 | 演出エディターでは以下の機能が利用可能です。: 299 | 300 | * カメラや各画像の transform プロパティーを直接数値入力またはバーの操作により変更 301 | * カメラアイコンのドラッグでカメラのx,y座標を移動 302 | * マウスホイールでカメラのz座標を移動 303 | * キーボード(hjkl,HJKL,wasd,WASD)によりカメラのxy座標を移動 304 | * 数値を右クリックでリセット 305 | * 動画編集ソフトの様にキーフレームを設定して時間軸にそった演出を作成 306 | * transform プロパティーへのスプライン補間やループ設定 307 | * 作成した演出のコードをクリップボードに送る(v6.99以上, Windows限定) 308 | * 被写界深度の概念を導入し、フォーカス位置と被写界深度を操作可能にする。これらの 309 | 値とカメラと各画像のz座標から各画像にブラーがかけられる(通常のブラーと排他) 310 | * トランジションを伴う画像の表示、置き換え、非表示 311 | (画像を非表示するには画像名にNoneを入力してください) 312 | * sceneステートメントによるシーンの切り替え 313 | * オプションから、アニメーション中はウィンドウを非表示にするフォーマットでクリップボードに出力するか選択可 314 | (複数シーンを使用する場合は強制的にウィンドウ非表示となります) 315 | * オプションから、アニメーションスキップ可能にするフォーマットでクリップボードに出力するか選択可 316 | (複数シーンを使用する場合は強制的にスキップ可となります) 317 | 318 | 注意 319 | 320 | * focusingを有効化している間、function transform プロパティーで利用しているため各画像のblurは利用できなくなります。 321 | * function ステートメントに関数を指定できますが、ActionEditorとATL中で関数が同じ動作をしないことに注意してください。 322 | 以下の制限があります。 323 | 1. inherited_(property) では値を取得できません 324 | 2. プロパティーを変更しても次のその関数呼び出し時の値には反映されません 325 | 3. 返り値は機能しません 326 | 4. 時間どおりの順に呼び出されるとは限りません。 327 | これらの制限のため、プロパティーの値に対するオフセットとして動作させるには癖があり、もっぱらx,yoffsetへの値の代入が主な用途となるでしょう。 328 | 加えて、ActionEditor起動時に現在のfuncitonは読み込めません 329 | 参考リンク 330 | https://akakyouryuu.com/renpy/atl-%e3%81%aefunction%e3%82%b9%e3%83%86%e3%83%bc%e3%83%88%e3%83%a1%e3%83%b3%e3%83%88%e3%81%a7%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3%e3%83%bc%e3%81%ae%e5%80%a4%e3%82%92%e3%82%aa%e3%83%95/ 331 | * camera_blur 以外を function プロパティーに使用しているとスキップ後に誤作動する可能性があります。 332 | * アニメーション開始前から同じタグの画像がすでに表示されており、かつそのタグのアニメーションにループが含まれている場合は正常に動作しません。 333 | 参考リンク 334 | http://akakyouryuu.com/renpy/renpy%e3%81%aeatl%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%92%e3%82%af%e3%83%aa%e3%83%83%e3%82%af%e3%81%a7%e3%82%b9%e3%82%ad%e3%83%83%e3%83%97%e3%81%a7%e3%81%8d%e3%82%8b/ 335 | * matrixtransformはScaleMatrix, OffsetMatrix, RotateMatrixのみサポートしています。それ以外は無視されます。 336 | * matrixcolorはInvertMatrix, ContrastMatrix, SaturationMatrix, BrightnessMatrix, HueMatrixのみサポートしています。それ以外は無視されます。 337 | 338 | 339 | 任意のプロパティーをエディターに追加する方法 340 | ================ 341 | 342 | ActionEditor_config.rpy を編集します。 343 | 344 | 共通の設定項目として以下に追加したいプロパティー名を加えます。: 345 | 346 | * `props_set`: ActionEditor上でプロパティーが表示される位置を指定します。 347 | * `sort_order_list`: クリップボードに出力されるプロパティーの順番を指定します。 348 | * `transform_props` または `camera_props`: プロパティー名を追加してください。前者は画像に、後者はカメラにプロパティーを追加します。 349 | * `transform_props` または `camera_props`: プロパティー名を追加してください。前者は画像に、後者はカメラにプロパティーを追加します。 350 | * `property_default_value`: プロパティーのデフォルト値を設定してください。 351 | 352 | さらに追加したいプロパティーの型に応じて設定します。 353 | 354 | 整数または浮動小数の場合、必要なら以下に追加したいプロパティー名を加えます。: 355 | 356 | * `force_wide_range`: 値が浮動小数でも整数と同じ幅で値を調整できます。 357 | * `force_narrow_range`: 値が整数でも浮動小数と同じ幅で値を調整できます。 358 | * `force_plus`: 常に値が正の数となります。 359 | * `force_float`: 常に値が浮動小数となります。 360 | 361 | 真偽値の場合、以下に追加したいプロパティー名を加えます。: 362 | 363 | * `boolean_props` 364 | 365 | 他の型の場合、以下に追加したいプロパティー名を加えます。: 366 | 367 | * `any_props` 368 | 369 | `any_props` はすべての型を受け入れます。使用するなら `check_any_props` か `menu_props`と併用すると安全です。 370 | 371 | * `check_any_props` 372 | 373 | エラーチェックを設定します。プロパティー名とチェック関数を対応させる辞書です。 374 | 関数はプロパティーの値を引数に実行され、結果がTrueならその値を入力し、Falseならエラーメッセージを表示します。 例: 375 | 376 | any_props = {"blend"} 377 | #"blend"プロパティーの入力を(None, "normal", "add", "multiply", "min", "max")に限定する 378 | check_any_props = {"blend":lambda v: v in (None, "normal", "add", "multiply", "min", "max")} 379 | 380 | * `menu_props` 381 | 382 | `any_props` の変更を直接入力ではなく選択制にします。 例: 383 | 384 | any_props = {"blend"} 385 | #"blend"プロパティー(None, "normal", "add", "multiply", "min", "max")からの選択制にする 386 | menu_props = {"blend":[None] + [key for key in config.gl_blend_func]} 387 | 388 | tileとpanのような排他的なプロパティーは `exclusive` にも登録してください。例: 389 | 390 | exclusive = ( 391 | ({"xpos", "ypos"}, {"xalignaround", "yalignaround", "radius", "angle"}), 392 | ({"xtile", "ytile"}, {"xpan", "ypan"}), 393 | ) 394 | 395 | 396 | プロパティーグループ 397 | ================ 398 | 399 | 値がタプルであるプロパティーは props_groups でプロパティー名をキーに、 400 | 各要素名を値にして登録すれば個別に編集できます。例: 401 | 402 | props_groups = { 403 | "alignaround":["xalignaround", "yalignaround"], 404 | "matrixanchor":["matrixanchorX", "matrixanchorY"], 405 | "crop":["cropX", "cropY", "cropW", "cropH"], 406 | "focusing":["focusing", "dof"], 407 | } 408 | 409 | 410 | 画像ビューワー 411 | ================ 412 | 413 | `config.developer` が True なら、ゲーム画面でShift+UまたはActionEditor上の+(add image)のボタンから開けます。 414 | 415 | 定義済の画像のタグ、属性のテキストボタンとして一覧表示します。 416 | 最上段のテキスト入力欄に入力されたテキストで表示結果をフィルターします。 417 | フィルターではタブキーでの補完も可能です。 418 | 419 | テキストボタンにフォーカスするとそのテキストに対応する画像名があればその画像を表示します。 420 | ボタンを押すと、対応する画像名がなければ、そのテキストをフィルターに追加します。 421 | ある場合、ActionEditor上から開いてれば、それをActionEditorに追加します。そうでなければ、 422 | その画像名をクリップボードに出力します。 423 | 424 | 425 | 最底段のclipboardボタンでフィルターテキストをクリップボードに出力できます。 426 | 427 | 428 | サウンドビューワー 429 | ================ 430 | 431 | `config.developer` が True なら、ゲーム画面でShift+SまたはActionEditor上のSoundsの項目から開けます。 432 | 433 | audio store にある変数名をテキストボタンとして一覧表示します。 434 | 音声ファイルがgame/audioディレクトリーにあれば変数は自動定義されるはずです。 435 | 最上段のテキスト入力欄に入力されたテキストで表示結果をフィルターします。 436 | フィルターではタブキーでの補完も可能です。 437 | 438 | ボタンにフォーカスするとその音声が再生されます。 439 | ボタンをクリックするとActionEditor上から開いていれば、それがActionEditorに追加されます。 440 | そうでなければ、そのボタンテキストをクリップボードに出力します。 441 | 442 | 最低段のclipboardボタンでフィルターテキストをクリップボードに出力できます。 443 | 444 | 445 | ATL functions 446 | ================ 447 | 448 | ATL_funcctions.rpy に ATL function ステートメントでの使用を意図した関数群を用意しました。 449 | 使用方法は該当ファイルを参照してください。 450 | 451 | 452 | Matrix 453 | ================ 454 | 455 | デフォルトのマトリックスと順番はそれぞれ以下のようになっています。 456 | 457 | matrixtransform: ScaleMatrix*OffsetMatrix*RotateMatrix*OffsetMatrix*OffsetMatrix 458 | matrixcolors: InvertMatrix*ContrastMatrix*SaturationMatrix*BrightnessMatrix*HueMatrix 459 | 460 | マトリックスの組み合わと順番、デフォルト値はActionEditor_config.rpyの以下の変数で変更できます。 461 | 462 | default_matrixtransform = [ 463 | ("matrixtransform_1_1_scaleX", 1.), ("matrixtransform_1_2_scaleY", 1.), ("matrixtransform_1_3_scaleZ", 1.), 464 | ("matrixtransform_2_1_offsetX", 0.), ("matrixtransform_2_2_offsetY", 0.), ("matrixtransform_2_3_offsetZ", 0.), 465 | ("matrixtransform_3_1_rotateX", 0.), ("matrixtransform_3_2_rotateY", 0.), ("matrixtransform_3_3_rotateZ", 0.), 466 | ("matrixtransform_4_1_offsetX", 0.), ("matrixtransform_4_2_offsetY", 0.), ("matrixtransform_4_3_offsetZ", 0.), 467 | ("matrixtransform_5_1_offsetX", 0.), ("matrixtransform_5_2_offsetY", 0.), ("matrixtransform_5_3_offsetZ", 0.), 468 | ] 469 | default_matrixcolor = [ 470 | ("matrixcolor_1_1_invert", 0.), 471 | ("matrixcolor_2_1_contrast", 1.), 472 | ("matrixcolor_3_1_saturate", 1.), 473 | ("matrixcolor_4_1_bright", 0.), 474 | ("matrixcolor_5_1_hue", 0.), 475 | ] 476 | 477 | 478 | 文字サイズ 479 | ================ 480 | 481 | new_action_editor_text スタイルから全てのテキストのスタイルを変更できます。 482 | 483 | init: 484 | style new_action_editor_text: 485 | size 10 486 | 487 | 488 | よくあるトラブル 489 | ================ 490 | レイアウトが崩れる 491 | 492 | ActionEditorではタグ名が長過ぎる、フォントサイズが大きすぎる場合はレイアウトが崩れます。 493 | それらしい症状が発生した場合は上記の方法でフォントサイズを調整してください。 494 | 495 | 次のエラーが発生する 496 | 497 | NameError: name '_open_image_viewer' is not defined 498 | 499 | 旧版ActionEditorのファイルがあるゲームに本ActionEditor3のスクリプトファイルをコピーした場合に発生します。旧版とは互換性がないため、以前のActionEditorにあったファイルとスクリプト中で追加関数を使用していればそちらも削除してから、本ActionEditor3のファイルをコピーしてください。 500 | 501 | 既知の問題 502 | ================ 503 | 504 | アニメーションするat 節を使用したcamera, displayableは正常に表示できない 505 | 506 | Movie DisplayableするDisplayableは正常に表示できない 507 | 508 | 注意 509 | ================ 510 | 511 | ActionEditorから出力されるクリップボードデータはActionEditorが開かれた状態からの差分として出力され、その次の行への貼り付けを意図しています。このため既存のshowステートメントを上書きするように貼り付けると正常に表示されない場合があります。 512 | -------------------------------------------------------------------------------- /image_viewer.rpy: -------------------------------------------------------------------------------- 1 | #Image Viewer 2 | #Shift+U: Open Image Viewer 3 | #2016 1/22 v6.99 4 | 5 | screen _image_selecter(default=""): 6 | default filter_string = default 7 | default filter_string_cache = default 8 | key "game_menu" action Return("") 9 | zorder 20 10 | frame: 11 | style_group "image_selecter" 12 | vbox: 13 | label _("Type a image name") style "image_selecter_input" 14 | label _("Tab: completion") style "image_selecter_input" 15 | input value ScreenVariableInputValue("filter_string", default=True, returnable=True) copypaste True style "image_selecter_input" id "input_filter_strings" 16 | $filtered_list = _viewers.filter_image_name(filter_string) 17 | viewport: 18 | mousewheel True 19 | scrollbars "vertical" 20 | vbox: 21 | for image_name in filtered_list: 22 | textbutton image_name action _viewers.Add_tag_or_Return(tuple(image_name.split())) hovered _viewers.ShowImage(tuple(image_name.split())) unhovered Function(renpy.hide, "preview", layer="screens") 23 | textbutton _("clipboard") action [SensitiveIf(filter_string), Function(_viewers.put_clipboard_text, filter_string)] xalign 1.0 idle_background None insensitive_background None 24 | if filter_string_cache != filter_string: 25 | if len(filtered_list) == 1: 26 | if "preview" not in renpy.get_showing_tags("screens"): 27 | $filter_string_cache = filter_string 28 | $_viewers.ShowImage(tuple(filtered_list[0].split()))() 29 | elif "preview" in renpy.get_showing_tags("screens"): 30 | $filter_string_cache = filter_string 31 | $_viewers._image_viewer_hide() 32 | key "K_TAB" action Function(_viewers.tag_completion, filter_string, filtered_list) 33 | 34 | init: 35 | style image_selecter_frame: 36 | background "#0006" 37 | xmaximum 400 38 | yfill True 39 | style image_selecter_viewport: 40 | ymaximum 600 41 | style image_selecter_input: 42 | outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ] 43 | style image_selecter_button: 44 | size_group "image_selecter" 45 | idle_background None 46 | style image_selecter_button_text: 47 | color "#CCC" 48 | hover_underline True 49 | selected_color "#FFF" 50 | insensitive_color "#888" 51 | outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ] 52 | xalign .0 53 | 54 | init -999 python in _viewers: 55 | def open_image_viewer(): 56 | if not renpy.config.developer: 57 | return 58 | _skipping_org = renpy.store._skipping 59 | renpy.store._skipping = False 60 | renpy.invoke_in_new_context(renpy.call_screen, "_image_selecter") 61 | renpy.store._skipping = _skipping_org 62 | 63 | def filter_image_name(filter_string): 64 | filtered_list = [] 65 | filter_elements = filter_string.split() 66 | if filter_elements: 67 | for name in get_image_name_candidates(): 68 | if name[0].startswith(filter_elements[0]): 69 | if len(filter_elements) == 1: 70 | filtered_list.append(" ".join(name)) 71 | else: 72 | for e in filter_elements[1:]: 73 | if e in name: 74 | continue 75 | else: 76 | for e2 in name[1:]: 77 | if e2.startswith(e): 78 | break 79 | else: 80 | break 81 | continue 82 | else: 83 | filtered_list.append(" ".join(name)) 84 | else: 85 | filtered_list = list({name[0] for name in renpy.display.image.images}) 86 | return filtered_list 87 | 88 | def put_clipboard_text(s): 89 | from pygame import scrap, locals 90 | scrap.put(locals.SCRAP_TEXT, s.encode("utf-8")) 91 | renpy.notify("'{}'\nis copied to clipboard".format(s)) 92 | 93 | def tag_completion(filter_string, filtered_list): 94 | if filter_string and filter_string[-1] != " ": 95 | completed_string = filter_string.split()[-1] 96 | candidate = [] 97 | if len(filter_string.split()) == 1: 98 | for es in filtered_list: 99 | candidate.append(es.split()[0]) 100 | else: 101 | for es in filtered_list: 102 | for e in es.split()[1:]: 103 | if e.startswith(completed_string): 104 | candidate.append(e) 105 | 106 | if candidate: 107 | cs = renpy.current_screen() 108 | if len(candidate) > 1: 109 | completed_candidate = candidate[0] 110 | for c in candidate[1:]: 111 | for i in range(len(completed_candidate)): 112 | if i < len(c) and completed_candidate[i] != c[i]: 113 | completed_candidate = completed_candidate[0:i] 114 | break 115 | cs.scope["filter_string"] += completed_candidate[len(completed_string):] 116 | else: 117 | completed_candidate = candidate[0] 118 | cs.scope["filter_string"] += completed_candidate[len(completed_string):] + " " 119 | input = renpy.get_displayable("_image_selecter", "input_filter_strings") 120 | input.caret_pos = len(cs.scope["filter_string"]) 121 | 122 | def _image_viewer_hide(): 123 | renpy.hide("preview", layer="screens") 124 | renpy.restart_interaction() 125 | 126 | init -1 python in _viewers: 127 | @renpy.pure 128 | class ShowImage(renpy.store.Action, renpy.store.DictEquality): 129 | def __init__(self, image_name_tuple): 130 | self.string = " ".join(image_name_tuple) 131 | self.check = None 132 | 133 | def __call__(self): 134 | if self.check is None: 135 | for n in get_image_name_candidates(): 136 | if set(n) == set(self.string.split()) and n[0] == self.string.split()[0]: 137 | self.string = " ".join(n) 138 | try: 139 | for fn in renpy.display.image.images[n].predict_files(): 140 | if not renpy.loader.loadable(fn): 141 | self.check = False 142 | break 143 | else: 144 | self.check = True 145 | except: 146 | self.check = True #text displayable or Live2D 147 | try: 148 | if self.check: 149 | renpy.show(self.string, at_list=[renpy.store.truecenter], layer="screens", tag="preview") 150 | else: 151 | renpy.show("preview", what=renpy.text.text.Text("No files", color="#F00"), at_list=[renpy.store.truecenter], layer="screens") 152 | except: 153 | renpy.show("preview", what=renpy.text.text.Text("No files", color="#F00"), at_list=[renpy.store.truecenter], layer="screens") 154 | renpy.restart_interaction() 155 | 156 | 157 | @renpy.pure 158 | class Add_tag_or_Return(renpy.store.Action, renpy.store.DictEquality): 159 | def __init__(self, image_name_tuple): 160 | self.image_name_tuple = image_name_tuple 161 | self.string = " ".join(image_name_tuple) 162 | self.check = None 163 | 164 | def __call__(self): 165 | if self.check is None: 166 | for n in get_image_name_candidates(): 167 | if set(n) == set(self.string.split()) and n[0] == self.string.split()[0]: 168 | self.string = " ".join(n) 169 | try: 170 | for fn in renpy.display.image.images[n].predict_files(): 171 | if not renpy.loader.loadable(fn): 172 | self.check = False 173 | break 174 | else: 175 | self.check = True 176 | except: 177 | self.check = False #text displayable or Live2D 178 | if self.check: 179 | if in_editor: 180 | return self.image_name_tuple 181 | else: 182 | put_clipboard_text(self.string) 183 | 184 | else: 185 | cs = renpy.current_screen() 186 | cs.scope["filter_string"] = self.string + " " 187 | input = renpy.get_displayable("_image_selecter", "input_filter_strings") 188 | input.caret_pos = len(cs.scope["filter_string"]) 189 | renpy.restart_interaction() 190 | -------------------------------------------------------------------------------- /keymap.rpy: -------------------------------------------------------------------------------- 1 | init 999 python: 2 | config.locked = False 3 | if _viewers.check_version(23060707): 4 | config.keymap["action_editor"] = ['shift_K_p'] 5 | config.keymap["image_viewer"] = ['shift_K_u'] 6 | config.keymap["sound_viewer"] = ['shift_K_s'] 7 | else: 8 | config.keymap["action_editor"] = ['P'] 9 | config.keymap["image_viewer"] = ['U'] 10 | config.keymap["sound_viewer"] = ['S'] 11 | config.locked = True 12 | -------------------------------------------------------------------------------- /menu_screen.rpy: -------------------------------------------------------------------------------- 1 | init python: 2 | 3 | @renpy.pure 4 | class ShowAlternateMenu(Action, DictEquality): 5 | """ 6 | :doc: menu_action 7 | 8 | Show alternate menu screen at the bottom right corner of the cursor. 9 | That screen can include textbuttons. 10 | 11 | `button_list` 12 | The list of tuple which has two elements. first is a string used 13 | as text for textbutton and second is action. 14 | `menu_width` 15 | If the x-coordinate of the cursor plus this number is greater than 16 | :var:`config.scren_witdth`, the menu will be displayed to the left 17 | of the cursor. default is 300 18 | `menu_height` 19 | If the y-coordinate of the cursor plus this number is greater than 20 | :var:`config.scren_witdth`, the menu will be displayed to the upper 21 | of the cursor. default is 300 22 | `style_prefix` 23 | If not None, this is used for menu screen as style_prefix. 24 | 25 | """ 26 | def __init__(self, button_list, menu_width=300, menu_height=200, style_prefix=None): 27 | self.button_list = button_list 28 | self.style_prefix = style_prefix 29 | self.menu_width = menu_width 30 | self.menu_height = menu_height 31 | 32 | def predict(self): 33 | renpy.predict_screen("_alternate_menu", self.button_list, 34 | menu_width=self.menu_width, menu_height=self.menu_height, style_prefix=self.style_prefix, _transient=True) 35 | 36 | def __call__(self): 37 | 38 | renpy.show_screen("_alternate_menu", self.button_list, 39 | menu_width=self.menu_width, menu_height=self.menu_height, style_prefix=self.style_prefix, _transient=True) 40 | renpy.restart_interaction() 41 | 42 | 43 | init -999: 44 | $_alternate_menu_pos = None 45 | screen _alternate_menu(button_list, menu_width=300, menu_height=200, style_prefix=None): 46 | key ["game_menu", "dismiss"] action [Hide("_alternate_menu"), SetVariable("_alternate_menu_pos", None)] 47 | modal True 48 | 49 | if _alternate_menu_pos is None: 50 | $_alternate_menu_pos = renpy.get_mouse_pos() 51 | $(x, y) = _alternate_menu_pos 52 | 53 | frame: 54 | if style_prefix: 55 | style_prefix style_prefix 56 | pos (x, y) 57 | if x + menu_width > config.screen_width: 58 | xanchor 1.0 59 | else: 60 | xanchor 0.0 61 | if y + menu_height > config.screen_height: 62 | yanchor 1.0 63 | else: 64 | yanchor 0.0 65 | vbox: 66 | xfill False 67 | for text, action in button_list: 68 | if not isinstance(action, list): 69 | $action = [action] 70 | textbutton text action action+[Hide("_alternate_menu"), SetVariable("_alternate_menu_pos", None)] 71 | -------------------------------------------------------------------------------- /sound_viewer.rpy: -------------------------------------------------------------------------------- 1 | #Sound Viewer 2 | #Open by shift + S 3 | #The files in only game/audio/**/* is shown 4 | 5 | screen _sound_selector(default=""): 6 | default filter_string = default 7 | key "game_menu" action Return("") 8 | on "hide" action Stop("music") 9 | zorder 20 10 | frame: 11 | style_group "sound_selecter" 12 | vbox: 13 | label _("type filenames(ex: variable, '' or [[variable, variable])") style "sound_selecter_input" 14 | label _("Tab: completion") style "sound_selecter_input" 15 | input value ScreenVariableInputValue("filter_string", default=True, returnable=True) copypaste True style "sound_selecter_input" id "input_filter_strings" 16 | $filtered_list = _viewers.filter_sound_name(filter_string) 17 | viewport: 18 | mousewheel True 19 | scrollbars "vertical" 20 | vbox: 21 | for sound_name in filtered_list: 22 | if "<" not in sound_name: 23 | $file = renpy.python.store_dicts["store.audio"].get(sound_name) 24 | else: 25 | $file = "" 26 | textbutton sound_name action Function(_viewers.return_sound, filter_string, sound_name) hovered Play("music", file) unhovered Stop("music") 27 | textbutton _("clipboard") action [SensitiveIf(filter_string), Function(_viewers.put_clipboard_text, filter_string)] xalign 1.0 idle_background None insensitive_background None 28 | key "K_TAB" action Function(_viewers.completion, filter_string, filtered_list) 29 | 30 | init python: 31 | import re 32 | 33 | def audio_list(dir=""): 34 | list = renpy.list_files() 35 | ext = [ ".aac", ".flac", ".mp2", ".mp3", ".ogg", ".opus", ".wav", ".weba"] 36 | for f in list: 37 | if re.match(dir,f): 38 | if f.lower().endswith(tuple(ext)): 39 | if not renpy.python.store_dicts["store.audio"].get("\""+str(f[(len(dir)):])+"\""): 40 | renpy.python.store_dicts["store.audio"]["\""+str(f[(len(dir)):])+"\""] = str(f[(len(dir)):]) 41 | return 42 | 43 | # Load all audio into Store.Audio 44 | audio_list() 45 | 46 | init: 47 | style sound_selecter_frame: 48 | background "#0006" 49 | yfill True 50 | style sound_selecter_viewport: 51 | ymaximum 600 52 | style sound_selecter_input: 53 | outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ] 54 | style sound_selecter_button: 55 | size_group "sound_selecter" 56 | idle_background None 57 | style sound_selecter_button_text: 58 | color "#CCC" 59 | hover_underline True 60 | selected_color "#FFF" 61 | insensitive_color "#888" 62 | outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ] 63 | xalign .0 64 | 65 | init -999 python in _viewers: 66 | def open_sound_viewer(): 67 | if not renpy.config.developer: 68 | return 69 | _skipping_org = renpy.store._skipping 70 | renpy.store._skipping = False 71 | renpy.invoke_in_new_context(renpy.call_screen, "_sound_selector") 72 | renpy.store._skipping = _skipping_org 73 | 74 | def filter_sound_name(filter_string): 75 | filtered_list = [] 76 | if "," in filter_string: 77 | last_element = filter_string[filter_string.rfind(",")+1:].strip() 78 | elif "[" in filter_string: #]" 79 | last_element = filter_string[1:] 80 | else: 81 | last_element = filter_string 82 | if "<" in last_element: 83 | filtered_list.append(" 1: 116 | completed_candidate = candidate[0] 117 | for c in candidate[1:]: 118 | for i in range(len(completed_candidate)): 119 | if i < len(c) and completed_candidate[i] != c[i]: 120 | completed_candidate = completed_candidate[0:i] 121 | break 122 | else: 123 | completed_candidate = candidate[0] 124 | cs = renpy.current_screen() 125 | cs.scope["filter_string"] += completed_candidate[len(last_element):] 126 | input = renpy.get_displayable("_sound_selector", "input_filter_strings") 127 | input.caret_pos = len(cs.scope["filter_string"]) 128 | 129 | 130 | def return_sound(filter_string, sound_name): 131 | if not in_editor: 132 | put_clipboard_text(sound_name) 133 | else: 134 | if "," in filter_string: 135 | prefix = "[" 136 | other_element = filter_string[:filter_string.rfind(",")+1] 137 | if "[" in other_element: 138 | other_element = other_element[1:] 139 | last_element = filter_string[filter_string.rfind(",")+1:] 140 | suffix = "]" 141 | elif "[" in filter_string: #]" 142 | prefix = "[" 143 | other_element = "" 144 | last_element = filter_string[1:] 145 | suffix = "]" 146 | else: 147 | prefix = "[" 148 | last_element = filter_string 149 | other_element = "" 150 | suffix = "]" 151 | return prefix + other_element + sound_name + suffix 152 | -------------------------------------------------------------------------------- /tl/chinese/ActionEditor.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate chinese strings: 4 | # game/ActionEditor.rpy:269 5 | old "can't change values before the start tiem of the current scene" 6 | new "在当前场景开始前的数值无法更改" 7 | 8 | # game/ActionEditor.rpy:966 9 | old "Please type value" 10 | new "请输入数值" 11 | 12 | # game/ActionEditor.rpy:974 13 | old "Please type plus value" 14 | new "请输入正值" 15 | 16 | # game/ActionEditor.rpy:986 17 | old "Please Input Transition" 18 | new "请输入转场效果" 19 | 20 | # game/ActionEditor.rpy:1031 21 | old "Please type the list of channel names(ex ['sound', 'sound2'])" 22 | new "请输入音频频道名称列表(例如 ['sound', 'sound2'])" 23 | 24 | # game/ActionEditor.rpy:1044 25 | old "can't include audio channel" 26 | new "无法包含Audio频道" 27 | 28 | # game/ActionEditor.rpy:1079 29 | old "too many same tag images is used" 30 | new "使用了过多相同标签的图像" 31 | 32 | # game/ActionEditor.rpy:1102 33 | old "Please type image name" 34 | new "请输入图像名称" 35 | 36 | # game/ActionEditor.rpy:1179 37 | old "Please type a valid data" 38 | new "请输入有效数据" 39 | 40 | # game/ActionEditor.rpy:1382 41 | old "Can't open clipboard" 42 | new "无法打开剪贴板" 43 | 44 | # game/ActionEditor.rpy:1387 45 | old "Placed \n\"%s\"\n on clipboard" 46 | new "已将\n\"%s\"\n放置在剪贴板上" 47 | 48 | # game/ActionEditor.rpy:1566 49 | old "Please type float value" 50 | new "请输入浮点值" 51 | 52 | # game/ActionEditor.rpy:1568 53 | old "Please type int value" 54 | new "请输入整数值" 55 | 56 | # game/ActionEditor.rpy:1798 57 | old "This channel is already used in this time" 58 | new "此音频频道已被使用" 59 | 60 | # game/ActionEditor.rpy:1815 61 | old "Please Input filenames" 62 | new "请输入文件名" 63 | 64 | # game/ActionEditor.rpy:2888 65 | old "Can't open clip board" 66 | new "无法打开剪贴板" 67 | 68 | # game/ActionEditor.rpy:2896 69 | old "Nothing to put" 70 | new "没有要放置的内容" 71 | 72 | # game/ActionEditor.rpy:978 73 | old "Type transition" 74 | new "请输入过渡效果" 75 | 76 | # game/ActionEditor.rpy:1030 77 | old "Please type the list of channel names(ex [['sound', 'sound2'])" 78 | new "请输入音频频道名称列表(例如 ['sound', 'sound2'])" 79 | 80 | # game/ActionEditor.rpy:1640 81 | old "the new scene must be later than the start time of the previous scene." 82 | new "新场景必须在前一场景的开始时间之后。" -------------------------------------------------------------------------------- /tl/chinese/ActionEditor_screens.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate chinese strings: 4 | # game/ActionEditor_screens.rpy:114 5 | old "option" 6 | new "选项" 7 | 8 | # game/ActionEditor_screens.rpy:115 9 | old "show image pins" 10 | new "显示图像定位点" 11 | 12 | # game/ActionEditor_screens.rpy:116 13 | old "scene editor" 14 | new "场景编辑器" 15 | 16 | # game/ActionEditor_screens.rpy:119 17 | old "remove keys" 18 | new "删除关键帧" 19 | 20 | # game/ActionEditor_screens.rpy:122 21 | old "move keys" 22 | new "移动关键帧" 23 | 24 | # game/ActionEditor_screens.rpy:129 25 | old "play" 26 | new "播放" 27 | 28 | # game/ActionEditor_screens.rpy:130 29 | old "clipboard" 30 | new "剪贴板" 31 | 32 | # game/ActionEditor_screens.rpy:131 33 | old "close" 34 | new "关闭" 35 | 36 | # game/ActionEditor_screens.rpy:464 37 | old "+(add scene)" 38 | new "+(添加场景)" 39 | 40 | # game/ActionEditor_screens.rpy:698 41 | old "time: [current_time:>05.2f] s" 42 | new "时间: [current_time:>05.2f] 秒" 43 | 44 | # game/ActionEditor_screens.rpy:707 45 | old "remove keyframes" 46 | new "删除关键帧" 47 | 48 | # game/ActionEditor_screens.rpy:710 49 | old "move keyframes" 50 | new "移动关键帧" 51 | 52 | # game/ActionEditor_screens.rpy:713 53 | old "hide" 54 | new "隐藏" 55 | 56 | # game/ActionEditor_screens.rpy:715 57 | old "x" 58 | new "x" 59 | 60 | # game/ActionEditor_screens.rpy:718 61 | old "scene" 62 | new "场景" 63 | 64 | # game/ActionEditor_screens.rpy:721 65 | old "+" 66 | new "+" 67 | 68 | # game/ActionEditor_screens.rpy:727 69 | old "camera" 70 | new "摄像机" 71 | 72 | # game/ActionEditor_screens.rpy:875 73 | old "remove" 74 | new "删除" 75 | 76 | # game/ActionEditor_screens.rpy:952 77 | old "Use Legacy ActionEditor Screen(recommend legacy gui for the 4:3 or small window)" 78 | new "使用经典编辑界面(建议在4:3或小窗口下使用传统GUI)" 79 | 80 | # game/ActionEditor_screens.rpy:953 81 | old "legacy gui" 82 | new "经典GUI" 83 | 84 | # game/ActionEditor_screens.rpy:954 85 | old "Show/Hide rule of thirds lines" 86 | new "显示/隐藏辅助线" 87 | 88 | # game/ActionEditor_screens.rpy:955 89 | old "show rot" 90 | new "显示旋转" 91 | 92 | # game/ActionEditor_screens.rpy:956 93 | old "Show/Hide window during animation in clipboard(window is forced to be hide when the action has multi scene)" 94 | new "在剪贴板中的动画期间显示/隐藏对话框(当动作包含多个场景时,窗口将被强制隐藏)" 95 | 96 | # game/ActionEditor_screens.rpy:957 97 | old "hide window" 98 | new "隐藏对话框" 99 | 100 | # game/ActionEditor_screens.rpy:958 101 | old "Allow/Disallow skipping animation in clipboard(be forced to allow when the action has multi scene)" 102 | new "在剪贴板中允许/禁止跳过动画(当动作包含多个场景时,将强制允许)" 103 | 104 | # game/ActionEditor_screens.rpy:959 105 | old "(*This doesn't work correctly when the animation include loops and that tag is already shown)" 106 | new "(*当动画包含循环并且标签已经显示时,此功能不起作用)" 107 | 108 | # game/ActionEditor_screens.rpy:960 109 | old "skippable" 110 | new "可跳过" 111 | 112 | # game/ActionEditor_screens.rpy:961 113 | old "Enable/Disable simulating camera blur(This is available when perspective is True)" 114 | new "启用/禁用模拟相机模糊效果(仅在透视为True时有效)" 115 | 116 | # game/ActionEditor_screens.rpy:962 117 | old "focusing" 118 | new "聚焦" 119 | 120 | # game/ActionEditor_screens.rpy:963 121 | old "One line includes only one property in clipboard data" 122 | new "在剪贴板数据中,属性分行编写" 123 | 124 | # game/ActionEditor_screens.rpy:964 125 | old "one_line_one_property" 126 | new "一行一个参数" 127 | 128 | # game/ActionEditor_screens.rpy:965 129 | old "Assign default warper" 130 | new "分配默认变形器" 131 | 132 | # game/ActionEditor_screens.rpy:967 133 | old "Assign default transition(example: dissolve, Dissolve(5), None)" 134 | new "分配默认过渡效果(示例: dissolve, Dissolve(5), None)" 135 | 136 | # game/ActionEditor_screens.rpy:969 137 | old "the time range of property bar(type float)" 138 | new "属性栏的时间范围(浮点数)" 139 | 140 | # game/ActionEditor_screens.rpy:971 141 | old "Show/Hide camera and image icon" 142 | new "显示/隐藏相机和图像图标" 143 | 144 | # game/ActionEditor_screens.rpy:972 145 | old "show icon" 146 | new "显示图标" 147 | 148 | # game/ActionEditor_screens.rpy:974 149 | old "following options have effect for only New GUI" 150 | new "以下选项仅对新 GUI 有效" 151 | 152 | # game/ActionEditor_screens.rpy:975 153 | old "Open only one page at once" 154 | new "一次只打开一页" 155 | 156 | # game/ActionEditor_screens.rpy:976 157 | old "open only one page" 158 | new "一次只打开一页" 159 | 160 | # game/ActionEditor_screens.rpy:977 161 | old "Set the amount of change per pixel when dragging the value of the integer property" 162 | new "拖动整数属性值时每像素的变化量" 163 | 164 | # game/ActionEditor_screens.rpy:979 165 | old "Set the amount of change per pixel when dragging the value of the float property" 166 | new "拖动浮点属性值时每像素的变化量" 167 | 168 | # game/ActionEditor_screens.rpy:981 169 | old "Set the list of channels for playing in ActionEditor" 170 | new "设置在编辑器中播放的音频通道列表" 171 | 172 | # game/ActionEditor_screens.rpy:983 173 | old "the wide range of property in Graphic Editor(type int)" 174 | new "图形编辑器中属性的广泛范围(整数)" 175 | 176 | # game/ActionEditor_screens.rpy:985 177 | old "the narrow range of property in Graphic Editor(type float)" 178 | new "图形编辑器中属性的狭窄范围(浮点数)" 179 | 180 | # game/ActionEditor_screens.rpy:988 181 | old "following options have effect for only Legacy GUI" 182 | new "以下选项仅对经典 GUI 有效" 183 | 184 | # game/ActionEditor_screens.rpy:989 185 | old "the wide range of property bar which is mainly used for int values(type int)" 186 | new "主要用于整数值的属性栏的广泛范围(整数)" 187 | 188 | # game/ActionEditor_screens.rpy:991 189 | old "the narrow range of property bar which is used for float values(type float)" 190 | new "主要用于浮点值的属性栏的狭窄范围(浮点数)" 191 | 192 | # game/ActionEditor_screens.rpy:1006 193 | old "Select a warper function" 194 | new "选择变形器功能" 195 | 196 | # game/ActionEditor_screens.rpy:1017 197 | old "add" 198 | new "添加" 199 | 200 | # game/ActionEditor_screens.rpy:1045 201 | old "time: [_viewers.moved_time:>.2f] s" 202 | new "时间: [_viewers.moved_time:>.2f] 秒" 203 | 204 | # game/ActionEditor_screens.rpy:1080 205 | old "KeyFrames" 206 | new "关键帧" 207 | 208 | # game/ActionEditor_screens.rpy:1092 209 | old "spline" 210 | new "样条" 211 | 212 | # game/ActionEditor_screens.rpy:1096 213 | old "[t:>05.2f] s" 214 | new "[t:>05.2f] 秒" 215 | 216 | # game/ActionEditor_screens.rpy:1119 217 | old "loop" 218 | new "循环" 219 | 220 | # game/ActionEditor_screens.rpy:1144 221 | old "spline_editor" 222 | new "样条编辑器" 223 | 224 | # game/ActionEditor_screens.rpy:1185 225 | old "scene_editor" 226 | new "场景编辑器" 227 | 228 | # game/ActionEditor_screens.rpy:1366 229 | old "time: {:>05.2f} s" 230 | new "时间: {:>05.2f} 秒" 231 | 232 | # game/ActionEditor_screens.rpy:3097 233 | old "open warper selecter: warper_generator" 234 | new "打开变形器选择器: warper_generator" 235 | 236 | # game/ActionEditor_screens.rpy:3103 237 | old "use warper generator" 238 | new "使用变形器生成器" 239 | 240 | # game/ActionEditor_screens.rpy:3107 241 | old "spline editor" 242 | new "样条编辑器" 243 | 244 | # game/ActionEditor_screens.rpy:3118 245 | old "toggle graphic editor" 246 | new "切换图形编辑器" 247 | 248 | # game/ActionEditor_screens.rpy:3119 249 | old "reset" 250 | new "重置" 251 | 252 | # game/ActionEditor_screens.rpy:3124 253 | old "toggle loop" 254 | new "切换循环" 255 | 256 | # game/ActionEditor_screens.rpy:926 257 | old "type value" 258 | new "输入数值" -------------------------------------------------------------------------------- /tl/chinese/image_viewer.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate chinese strings: 4 | 5 | # game/image_viewer.rpy:13 6 | old "Type a image name" 7 | new "请输入图像名" 8 | 9 | -------------------------------------------------------------------------------- /tl/chinese/sound_viewer.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate chinese strings: 4 | 5 | # game/sound_viewer.rpy:13 6 | old "type filenames(ex: variable, '' or [[variable, variable])" 7 | new "请输入文件名(如:变量,''或[[变量名, 变量名])" 8 | 9 | -------------------------------------------------------------------------------- /tl/japanese/ActionEditor.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate japanese strings: 4 | 5 | # game/ActionEditor.rpy:269 6 | old "can't change values before the start tiem of the current scene" 7 | new "現在のシーン開始前の値は変更できません" 8 | 9 | # game/ActionEditor.rpy:966 10 | old "Please type value" 11 | new "値を入力してください" 12 | 13 | # game/ActionEditor.rpy:974 14 | old "Please type plus value" 15 | new "正の値を入力してください" 16 | 17 | # game/ActionEditor.rpy:986 18 | old "Please Input Transition" 19 | new "トランジションを入力してください" 20 | 21 | # game/ActionEditor.rpy:1031 22 | old "Please type the list of channel names(ex ['sound', 'sound2'])" 23 | new "チャンネル名のリストを入力してください(例 ['sound', 'sound2'])" 24 | 25 | # game/ActionEditor.rpy:1044 26 | old "can't include audio channel" 27 | new "オーディオチャンネルは含められません" 28 | 29 | # game/ActionEditor.rpy:1079 30 | old "too many same tag images is used" 31 | new "多すぎる同じタグの画像が使用されています" 32 | 33 | # game/ActionEditor.rpy:1102 34 | old "Please type image name" 35 | new "画像名を入力してください" 36 | 37 | # game/ActionEditor.rpy:1179 38 | old "Please type a valid data" 39 | new "適切な値を入力してください" 40 | 41 | # game/ActionEditor.rpy:1382 42 | old "Can't open clipboard" 43 | new "クリップボードを開けません" 44 | 45 | # game/ActionEditor.rpy:1387 46 | old "Placed \n\"%s\"\n on clipboard" 47 | new "次のデータをクリップボードに出力しました\n\"%s\"" 48 | 49 | # game/ActionEditor.rpy:1566 50 | old "Please type float value" 51 | new "浮動小数を入力してください" 52 | 53 | # game/ActionEditor.rpy:1568 54 | old "Please type int value" 55 | new "整数を入力してください" 56 | 57 | # game/ActionEditor.rpy:1798 58 | old "This channel is already used in this time" 59 | new "このチャンネルはこの時間すでに使用されています" 60 | 61 | # game/ActionEditor.rpy:1815 62 | old "Please Input filenames" 63 | new "ファイル名を入力してください。" 64 | 65 | # game/ActionEditor.rpy:2888 66 | old "Can't open clip board" 67 | new "クリップボードを開けません" 68 | 69 | # game/ActionEditor.rpy:2896 70 | old "Nothing to put" 71 | new "出力するものがありません" 72 | 73 | # game/ActionEditor.rpy:978 74 | old "Type transition" 75 | new "トランジションを入力してください" 76 | 77 | # game/ActionEditor.rpy:1030 78 | old "Please type the list of channel names(ex [['sound', 'sound2'])" 79 | new "チャンネル名のリストを入力してください(例 ['sound', 'sound2'])" 80 | 81 | # game/ActionEditor.rpy:1640 82 | old "the new scene must be later than the start time of the previous scene." 83 | new "新規シーンは以前のシーン開始より後であるべきです。" 84 | 85 | -------------------------------------------------------------------------------- /tl/japanese/ActionEditor_screens.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate japanese strings: 4 | 5 | # game/ActionEditor_screens.rpy:114 6 | old "option" 7 | new "option" 8 | 9 | # game/ActionEditor_screens.rpy:115 10 | old "show image pins" 11 | new "show image pins" 12 | 13 | # game/ActionEditor_screens.rpy:116 14 | old "scene editor" 15 | new "scene editor" 16 | 17 | # game/ActionEditor_screens.rpy:119 18 | old "remove keys" 19 | new "remove keys" 20 | 21 | # game/ActionEditor_screens.rpy:122 22 | old "move keys" 23 | new "move keys" 24 | 25 | # game/ActionEditor_screens.rpy:129 26 | old "play" 27 | new "play" 28 | 29 | # game/ActionEditor_screens.rpy:130 30 | old "clipboard" 31 | new "clipboard" 32 | 33 | # game/ActionEditor_screens.rpy:131 34 | old "close" 35 | new "close" 36 | 37 | # game/ActionEditor_screens.rpy:464 38 | old "+(add scene)" 39 | new "+(add scene)" 40 | 41 | # game/ActionEditor_screens.rpy:698 42 | old "time: [current_time:>05.2f] s" 43 | new "time: [current_time:>05.2f] s" 44 | 45 | # game/ActionEditor_screens.rpy:707 46 | old "remove keyframes" 47 | new "remove keyframes" 48 | 49 | # game/ActionEditor_screens.rpy:710 50 | old "move keyframes" 51 | new "move keyframes" 52 | 53 | # game/ActionEditor_screens.rpy:713 54 | old "hide" 55 | new "hide" 56 | 57 | # game/ActionEditor_screens.rpy:715 58 | old "x" 59 | new "x" 60 | 61 | # game/ActionEditor_screens.rpy:718 62 | old "scene" 63 | new "scene" 64 | 65 | # game/ActionEditor_screens.rpy:721 66 | old "+" 67 | new "+" 68 | 69 | # game/ActionEditor_screens.rpy:727 70 | old "camera" 71 | new "camera" 72 | 73 | # game/ActionEditor_screens.rpy:875 74 | old "remove" 75 | new "remove" 76 | 77 | # game/ActionEditor_screens.rpy:952 78 | old "Use Legacy ActionEditor Screen(recommend legacy gui for the 4:3 or small window)" 79 | new "レガシーGUIを使用するか(4:3や小さなウィンドウではレガシーGUIを推奨します)" 80 | 81 | # game/ActionEditor_screens.rpy:953 82 | old "legacy gui" 83 | new "legacy gui" 84 | 85 | # game/ActionEditor_screens.rpy:954 86 | old "Show/Hide rule of thirds lines" 87 | new "三分割法の補助線を表示するか" 88 | 89 | # game/ActionEditor_screens.rpy:955 90 | old "show rot" 91 | new "show rot" 92 | 93 | # game/ActionEditor_screens.rpy:956 94 | old "Show/Hide window during animation in clipboard(window is forced to be hide when the action has multi scene)" 95 | new "アニメーション中はウィンドウを非表示するフォーマットでクリップボードに出力するか(シーンが複数ある場合常に非表示になります)" 96 | 97 | # game/ActionEditor_screens.rpy:957 98 | old "hide window" 99 | new "hide window" 100 | 101 | # game/ActionEditor_screens.rpy:958 102 | old "Allow/Disallow skipping animation in clipboard(be forced to allow when the action has multi scene)" 103 | new "アニメーションをスキップできる形式でクリップボードに出力するか(シーンが複数ある場合常にスキップ可になります)" 104 | 105 | # game/ActionEditor_screens.rpy:959 106 | old "(*This doesn't work correctly when the animation include loops and that tag is already shown)" 107 | new "(アニメーションにループがある場合やタグがすでに表示されている場合、これは正常に動作しません)" 108 | 109 | # game/ActionEditor_screens.rpy:960 110 | old "skippable" 111 | new "skippable" 112 | 113 | # game/ActionEditor_screens.rpy:961 114 | old "Enable/Disable simulating camera blur(This is available when perspective is True)" 115 | new "カメラブラーのシミュレーションを使用するか(perspective が True のときのみ有効です)" 116 | 117 | # game/ActionEditor_screens.rpy:962 118 | old "focusing" 119 | new "focusing" 120 | 121 | # game/ActionEditor_screens.rpy:963 122 | old "One line includes only one property in clipboard data" 123 | new "クリップボードのフォーマットとを1行で1つのプロパティーのみ変更するようにする" 124 | 125 | # game/ActionEditor_screens.rpy:964 126 | old "one_line_one_property" 127 | new "one_line_one_property" 128 | 129 | # game/ActionEditor_screens.rpy:965 130 | old "Assign default warper" 131 | new "デフォルトワーパーの設定" 132 | 133 | # game/ActionEditor_screens.rpy:967 134 | old "Assign default transition(example: dissolve, Dissolve(5), None)" 135 | new "デフォルトトランジションの設定(例:dissolve, Dissolve(5), None)" 136 | 137 | # game/ActionEditor_screens.rpy:969 138 | old "the time range of property bar(type float)" 139 | new "バーに表示する時間(浮動小数)" 140 | 141 | # game/ActionEditor_screens.rpy:971 142 | old "Show/Hide camera and image icon" 143 | new "カメラと画像の位置を操作するアイコンを表示" 144 | 145 | # game/ActionEditor_screens.rpy:972 146 | old "show icon" 147 | new "show icon" 148 | 149 | # game/ActionEditor_screens.rpy:974 150 | old "following options have effect for only New GUI" 151 | new "次のオプションはレガシーGUIに影響しません" 152 | 153 | # game/ActionEditor_screens.rpy:975 154 | old "Open only one page at once" 155 | new "一度に開けるのを一つのページのみにするか" 156 | 157 | # game/ActionEditor_screens.rpy:976 158 | old "open only one page" 159 | new "open only one page" 160 | 161 | # game/ActionEditor_screens.rpy:977 162 | old "Set the amount of change per pixel when dragging the value of the integer property" 163 | new "整数のプロパティーの値をドラッグしたときの1ピクセルごとの変化量" 164 | 165 | # game/ActionEditor_screens.rpy:979 166 | old "Set the amount of change per pixel when dragging the value of the float property" 167 | new "浮動小数のプロパティーの値をドラッグしたときの1ピクセルごとの変化量" 168 | 169 | # game/ActionEditor_screens.rpy:981 170 | old "Set the list of channels for playing in ActionEditor" 171 | new "ActionEditorで再生するチャンネルのリスト" 172 | 173 | # game/ActionEditor_screens.rpy:983 174 | old "the wide range of property in Graphic Editor(type int)" 175 | new "Graphic Editorで表示するプロパティー整数値のスケール(整数)" 176 | 177 | # game/ActionEditor_screens.rpy:985 178 | old "the narrow range of property in Graphic Editor(type float)" 179 | new "Graphic Editorで表示するプロパティー浮動小数値のスケール(浮動小数)" 180 | 181 | # game/ActionEditor_screens.rpy:988 182 | old "following options have effect for only Legacy GUI" 183 | new "次のオプションはレガシーGUIにのみ影響します" 184 | 185 | # game/ActionEditor_screens.rpy:989 186 | old "the wide range of property bar which is mainly used for int values(type int)" 187 | new "主に整数で使用されるプロパティーバーのスケール(整数)" 188 | 189 | # game/ActionEditor_screens.rpy:991 190 | old "the narrow range of property bar which is used for float values(type float)" 191 | new "主に浮動小数で使用されるプロパティーバーのスケール(浮動小数)" 192 | 193 | # game/ActionEditor_screens.rpy:1006 194 | old "Select a warper function" 195 | new "ワーパー関数の選択" 196 | 197 | # game/ActionEditor_screens.rpy:1017 198 | old "add" 199 | new "add" 200 | 201 | # game/ActionEditor_screens.rpy:1045 202 | old "time: [_viewers.moved_time:>.2f] s" 203 | new "time: [_viewers.moved_time:>.2f] s" 204 | 205 | # game/ActionEditor_screens.rpy:1080 206 | old "KeyFrames" 207 | new "KeyFrames" 208 | 209 | # game/ActionEditor_screens.rpy:1092 210 | old "spline" 211 | new "spline" 212 | 213 | # game/ActionEditor_screens.rpy:1096 214 | old "[t:>05.2f] s" 215 | new "[t:>05.2f] s" 216 | 217 | # game/ActionEditor_screens.rpy:1119 218 | old "loop" 219 | new "loop" 220 | 221 | # game/ActionEditor_screens.rpy:1144 222 | old "spline_editor" 223 | new "spline_editor" 224 | 225 | # game/ActionEditor_screens.rpy:1185 226 | old "scene_editor" 227 | new "scene_editor" 228 | 229 | # game/ActionEditor_screens.rpy:1366 230 | old "time: {:>05.2f} s" 231 | new "time: {:>05.2f} s" 232 | 233 | # game/ActionEditor_screens.rpy:3097 234 | old "open warper selecter: warper_generator" 235 | new "open warper selecter: warper_generator" 236 | 237 | # game/ActionEditor_screens.rpy:3103 238 | old "use warper generator" 239 | new "use warper generator" 240 | 241 | # game/ActionEditor_screens.rpy:3107 242 | old "spline editor" 243 | new "spline editor" 244 | 245 | # game/ActionEditor_screens.rpy:3118 246 | old "toggle graphic editor" 247 | new "toggle graphic editor" 248 | 249 | # game/ActionEditor_screens.rpy:3119 250 | old "reset" 251 | new "reset" 252 | 253 | # game/ActionEditor_screens.rpy:3124 254 | old "toggle loop" 255 | new "toggle loop" 256 | 257 | 258 | # game/ActionEditor_screens.rpy:926 259 | old "type value" 260 | new "値を入力してください" 261 | 262 | -------------------------------------------------------------------------------- /tl/japanese/image_viewer.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate japanese strings: 4 | 5 | # game/image_viewer.rpy:13 6 | old "Type a image name" 7 | new "画像名を入力してください" 8 | 9 | -------------------------------------------------------------------------------- /tl/japanese/sound_viewer.rpy: -------------------------------------------------------------------------------- 1 | # TODO: Translation updated at 2022-05-04 16:37 2 | 3 | translate japanese strings: 4 | 5 | # game/sound_viewer.rpy:13 6 | old "type filenames(ex: variable, '' or [[variable, variable])" 7 | new "ファイル名を入力してください(例: 変数名 または '' [[変数名, 変数名])" 8 | 9 | --------------------------------------------------------------------------------