Files
IWaniHugThatGator-Demo-Public/game/dev/actioneditor/ATL_functions.rpy
2024-04-21 13:45:17 -05:00

237 lines
11 KiB
Plaintext

# ATL functions
# This File adds some utility function for ATL function.
# このファイルはATLのfunctionステートメントで使用できるユーソリティー関数を追加します。
#
#class mfn(func1, func2, func3, ...)
# This class takes functions which are called with arguments tran, st, at.
# This is intended to be used to use multiple functions for function statement in ATL.
# このクラスは複数の関数を引数に取り、それらは tran, st, atを引数に呼び出されます。
# これはATLのfunctionステートメントで複数の関数を使用するために使用できます。
# example:
# show test:
# function mfn(func1, func2)
#
#class atl_sin(property, peak, hz, start=None, end=None, damped=False, damped_warper='ease')
# This change the property value with a sine wave.
# プロパティーの値を正弦波で変更します。
# property: property name string
# プロパティーの名前の文字列です。
# peak: peak value
# 振幅
# hz: hz of the wave
# 振動数
# start: This function starts after `start` seconds
# この関数は `start` 秒後に開始します。
# end: This function ends after `end` seconds
# この関数は `end` 秒後に終了します。
# damped: If True and `end` is not None, this wave
# is damped wave. Wave stops in `end` seconds
# True かつ `end` が設定されていれば減衰波になり、
# `end` 秒後に振動が止まります。
# damped_warper: This is warper which is used for damp.
# 減衰に使用されるワーパーです。
#
#class atl_cos(property, peak, hz, start=None, end=None, damped=False, damped_warper='ease')
# This is cos version of atl_sin.
# atl_sinの余弦波バージョンです。
#class atl_wiggle(property, max, deviation, cycle, fast_forward=1, knot_num_per_sec=1, start=None, end=None, damped=False, damped_warper='ease'):
# Random knots are created according to a Gaussian distribution, and sprite interpolation is performed between knots to reproduce random vibration.
# ガウス分布に従ったランダムな中間点を作成し、中間点間をスプライト補間してランダム振動を再現します。
# property: property name string
# プロパティーの名前の文字列です。
# max: The valu is limited in this value.
# 設定される値はこの値を越えません。
# deviation: the standard deviation
# 標準偏差です。
# cycle: The number of seconds of the vibration cycle. The value set for each of these seconds is 0.
# It is important for this vibration looks random to set sufficiently big value
# 振動周期の秒数です。この秒数ごとに設定される値は0となります。振動をランダムに見せるには十分長い必要があります。
# fast_forward: The vibration will be `fast_forward` times faster.
# 振動が `fast_forward` 倍早まわしになります。
# knot_num_per_sec: The number of knot per second. The more knot, the finer the amplitude.
# 1秒あたりの中間点の数です。中間点が増えるほど振幅が細かくなります。
# start: This function starts after `start` seconds
# この関数は `start` 秒後に開始します。
# end: This function ends after `end` seconds
# この関数は `end` 秒後に終了します。
# damped: If True and `end` is not None, this wave
# is damped wave. Wave stops in `end` seconds
# True かつ `end` が設定されていれば減衰波になり、
# `end` 秒後に振動が止まります。
# damped_warper: This is warper which is used for damp.
# 減衰に使用されるワーパーです。
#
# For example, This reproduces camera shake.
# 例: 手ぶれを再現します。
# camera:
# function mfn(atl_wiggle("yoffset", max=20, deviation=40, cycle=10), atl_wiggle("xoffset", max=20, deviation=40, cycle=10))
#
# For example, This reproduces the 10 seconds earthquake
# 例: 10秒間の地震を再現します。
# camera:
# function 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"))
#
#
#def atl_swiggle(deviation, fast_forward=1, start=None, end=None, damped=False, damped_warper='ease', property=("xoffset", "yoffset")):
# This is the wrapper for atl_wiggle.
# これはatl_wiggleのラッパーです。
# Below two code is mostly equivalent.
# 次の2つのコードはほぼ同じ動作をします。
#
# camera:
# function mfn(atl_wiggle("yoffset", max=20, deviation=40, cycle=10), atl_wiggle("xoffset", max=20, deviation=40, cycle=10))
# camera:
# function atl_swiggle(deviation=40)
init python in _viewers:
in_editor = False
init python:
class mfn(object):
def __init__(self, *args):
self.fns = list(args)
def __call__(self, tran, st, at):
min_fr = None
for i in reversed(range(len(self.fns))):
fr = self.fns[i](tran, st, at)
if fr is not None and (min_fr is None or fr < min_fr):
min_fr = fr
elif fr is None and not _viewers.in_editor:
del self.fns[i]
return min_fr
class generate_atl_func(object):
def __init__(self, property, start=None, end=None, check_type=True):
self.property = property
self.start = start
self.end = end
self.check_type = check_type
def __call__(self, tran, st, at):
if self.end is not None:
if st > self.end:
return None
if self.start is not None:
st -= self.start
if st < 0:
return 0
cur_prop = self.get_cur_prop(tran)
fr = self.function(tran, st, at)
if self.check_type and isinstance(cur_prop, int):
setattr(tran, self.property, int(getattr(tran, self.property)))
return fr
def get_cur_prop(self, tran):
cur_prop = getattr(tran, self.property)
if cur_prop is None:
cur_prop = getattr(tran, "inherited_"+self.property)
return cur_prop
class atl_sin(generate_atl_func):
def __init__(self, property, peak, hz, start=None, end=None, damped=False, damped_warper='ease'):
super(atl_sin, self).__init__(property, start, end)
self.peak = peak
self.hz = hz
self.damped = damped
self.damped_warper = damped_warper
def function(self, tran, st, at):
from math import sin, pi
damp = 1
if self.damped and self.end is not None:
damp = renpy.atl.warpers[self.damped_warper]((self.end - st) / self.end)
offset = damp * self.peak * sin(st*2*pi*self.hz)
setattr(tran, self.property, offset)
return 0
class atl_cos(generate_atl_func):
def __init__(self, property, peak, hz, start=None, end=None, damped=False, damped_warper='ease'):
super(atl_cos, self).__init__(property, start, end)
self.peak = peak
self.hz = hz
self.damped = damped
self.damped_warper = damped_warper
def function(self, tran, st, at):
from math import cos, pi
damp = 1
if self.damped and self.end is not None:
damp = renpy.atl.warpers[self.damped_warper]((self.end - st) / self.end)
offset = damp * self.peak * cos(st*2*pi*self.hz)
setattr(tran, self.property, offset)
return 0
class atl_wiggle(generate_atl_func):
def __init__(self, property, max, deviation, cycle, fast_forward=1, knot_num_per_sec=1, start=None, end=None, damped=False, damped_warper='ease'):
super(atl_wiggle, self).__init__(property, start, end)
from random import gauss
start_point = 0
goal_point = 0
#予めランダムな値を生成しておく
self.random_knot = [start_point]
for i in range(0, int(cycle/knot_num_per_sec)):
while True:
v = gauss(0, deviation)
if abs(v) <= max:
break
self.random_knot.append(v)
self.random_knot.append(goal_point)
self.cycle = cycle
self.fast_forward = fast_forward
self.damped = damped
self.damped_warper = damped_warper
def function(self, tran, st, at):
st *= self.fast_forward
g = round((st % self.cycle), 3) / self.cycle
damp = 1
if self.damped and self.end is not None:
damp = renpy.atl.warpers[self.damped_warper]((self.end - st / self.fast_forward) / self.end)
if renpy.version_tuple[3] >= 24011600:
interpolate_spline = renpy.atl.interpolate_spline(g, self.random_knot, renpy.atl.PROPERTIES[self.property])
else:
interpolate_spline = renpy.atl.interpolate_spline(g, self.random_knot)
offset = damp * interpolate_spline
setattr(tran, self.property, offset)
return 0
def atl_swiggle(deviation, fast_forward=1, start=None, end=None, damped=False, damped_warper='ease', property=("xoffset", "yoffset")):
cycle = 20
if not isinstance(property, tuple):
property = tuple([property])
args = []
for p in property:
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))
return mfn(*args)
# class atl_wiggle(generate_atl_func):
# def __init__(self, property, peak, hz, start=None, end=None):
# super(atl_wiggle, self).__init__(property, start, end)
# from random import random
# #予めランダムな値を生成しておく
# self.randoms = [(1+random(), 1+random()) for i in range(0, 100)]
# self.hz = hz
# self.peak = peak
#
# self.octaves = 1
# self.ampMulti = .5
# self.time = 0
#
# def function(self, tran, st, at):
# from math import sin, pi, ceil
# rx1, rx2 = self.randoms[int(ceil(st*self.hz)%100)]
# 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))
# setattr(tran, self.property, offset)
# return 0