ウマ娘の特殊タグ練習帳 (uso800)
しおりを挟む
スキル一覧のページ(モバイルまだ)
特定のオプションを削るだけで、それなりに上手く直せるが、イマイチ。
スキル単品
バ場適性 | ____芝____A | ___ダート__F | ||
距離適性 | __短距離__G | __マイル__E | __中距離__B | __長距離__A |
脚質適性 | ___逃げ___F | ___先行___E | ___差し___A | ___追込___B |
_
1.ハートマークの位置が少しおかしい
3.だが、正直、ビットマップフォント使った方が多分早い。
7. 固有スキルの背景色が間違っている。
目次 感想へのリンク しおりを挟む
しおりを挟む
iphone上でのレース前の画面再現
目次 感想へのリンク しおりを挟む
しおりを挟む
レースのファンファーレ(作成途中)
《box,bor2,w4,h4,inline,bg#fff,bor3.5,p1》G1
G1
以下、作者メモでの文字埋め
1. マルの中にG と 1の文字がぶつかって入る演出を作りたいが、同じ位置にアニメーションを重ねるのが難しそう(?)
2. 高速で近づけて疑似的にぶつかったように見せる?
3. 演出を次々と更新していくのがとても難しそう。
4. 参考になりそうな他人のアニメ作りを知りたい
1. マルの中にG と 1の文字がぶつかって入る演出を作りたいが、同じ位置にアニメーションを重ねるのが難しそう(?)
2. 高速で近づけて疑似的にぶつかったように見せる?
3. 演出を次々と更新していくのがとても難しそう。
4. 参考になりそうな他人のアニメ作りを知りたい1. マルの中にG と 1の文字がぶつかって入る演出を作りたいが、同じ位置にアニメーションを重ねるのが難しそう(?)
2. 高速で近づけて疑似的にぶつかったように見せる?
3. 演出を次々と更新していくのがとても難しそう。
4. 参考になりそうな他人のアニメ作りを知りたい
目次 感想へのリンク しおりを挟む
しおりを挟む
ウマ娘の選択肢の画面
! スキップしたレースは見返すことができません
育成中のデータを削除します
よろしいですか?
! 消費したTPは返却されません
こ
TPを40消費して育成を開始します。
よろしいですか?
__100__さ__70
特定のイベントを短縮しますか?
何度も育成しているトレーナーさんにオススメです。
__100__さ__70
__19__さ__18
コンティニューはあと 1 回可能です
《/box》
《/center》
目次 感想へのリンク しおりを挟む
しおりを挟む
時間に関係する特殊タグを自動生成するPythonのコード
タブをtransparentタグに変換してもいいですが……それでもまだ見にくいと思う……
いいアイデアがあったらコメントください。
タブの補完はそれほど難しいことではないと思いますが……
import math
import sys
from datetime import datetime, timedelta
from decimal import ROUND_HALF_EVEN, ROUND_HALF_UP, Decimal
from random import randrange
from string import Template
from typing import Optional
class Blink:
"""
オプションを選択して実行すると点滅のタグが自動生成される。
オプションの詳細は公公式ドキュメントを参照して下さい。
点滅させる文字はcontentという名称で指定してください。
すべてのオプションに対応しているわけではありません。
動作例
>>> Blink(content="ゴリラ")
ゴリラ
>>> Blink(content="ゴリラ", inview=True)
ゴリラ
>>> Blink(content="ゴリラ", start_ratio=10, end_ratio=50, loop_count=1,total_time=1, inview=True, forwards=True)
ゴリラ
>>> Blink(content="必要なオプションだけ指定して下さい。", loop_count=1,total_time=1, inview=True, forwards=True)
必要なオプションだけ指定して下さい。
<TODO> speed が 1より大きいときの動作のテスト。
<TODO> オプションを一個も指定しないとき<<blink>>が理想だが、実際には<<blink:>>で始まってるので':'を取り除く。
<TODO> inview, forwards 以外のオプションへの対応
"""
# ハーメルンに貼ると内容が評価されてバグるので、bl_inkにした。
template = Template("《bl ink:${options}》${content}《/blink》")
"""
def __init__(
self,
content: str | int = "hello",
start_ratio: Optional[int] = None,
end_ratio: Optional[int] = None,
delay_time: Optional[float | int] = None,
loop_count: Optional[float | int] = None,
total_time: Optional[float | int] = None,
inview: Optional[bool] = False,
forwards: Optional[bool] = False,
ext: Optional[str] = None,
):
self.content = content
self.range_option = (
f"v{int(start_ratio)}-{int(end_ratio)}"
if (start_ratio or start_ratio == 0)
and start_ratio >= 0
and 100 >= end_ratio >= start_ratio
else None
)
self.delay_time = f"d{round(delay_time)}" if delay_time else None
self.loop_count = f"l{round(loop_count)}" if loop_count else None
self.time_option = f"t{round(total_time)}" if total_time else None
self.inview_option = "inview" if inview else None
self.forwards_option = "forwards" if forwards else None
self.ext = ext
def _merge_options(self):
base_options = [
self.range_option,
self.delay_time,
self.loop_count,
self.time_option,
self.inview_option,
self.forwards_option,
self.ext,
]
return ",".join(list(filter(lambda item: item is not None, base_options)))
def _substitude_template(self):
return self.template.substitute(
options=self._merge_options(), content=self.content
)
def __str__(self):
return self._substitude_template()
@classmethod
def supply(cls, args):
return cls(**args)._substitude_template()
class FadeInSpeech:
"""FadeInSpeech.
長い文章をフェードインさせるとき、上記のBlink機能を使って一文字づつ表示開始時間を計算させるのは人間技ではないのでまとめて計算する。
content (文字列+一時停止), speed (文字ごとの間隔), delay_time, is_inview, is_forwards(公式ドキュメント参照)を指定できる。
使用例
>>> FadeInSpeech(contents="ゴリラ")
ゴリラ
>>> FadeInSpeech(contents="hello/1.1/world",speed=0.1)
helloworld
一時停止について
一時停止は/{秒数}/を文字列に入れると動作する。
例えば"前/10/後"を文字列の中に入れると前を表示した後、10秒停止してから後が表示される。
/10/をコンテンツの中に入れると、10秒、そこで停止する。
なおspeed分の停止時間と一時停止の時間は加算されて処理される。
例えば『content='前/1/後', speed=1』の場合、「前」が表示されてから二秒後に「後」は表示される。
/1.11/などの少数も入力可能。
delay_timeについて
『content='前/1/後', speed=1, delay=2』と『content='/2/前/1/後', speed=1』は同義。
小数について
最終出力時にはすべてミリ秒まで四捨五入されるが、計算ロジックの中ではそれより先も保持しているので他の端数と合算しての繰り上がりなどが有効。
例えば『content='前/0.001/中/0.001/後',speed=0.001, delay=0.001』のような指定の場合、
「前」と「中」(内部的には0.003秒後)は0.00秒後に同時に表示されるが、「後」(内部的には0.005秒後)は0.01秒後に表示される。
contentsについて
list型を入れることもできる。
>>> FadeInSpeech(contents=["ゴリラ", "ラッパ"])
ゴリララッパ
ただし、listを入れた場合は、一時停止は正常に動作しない。
>>>FadeInSpeech(contents=["ゴリラ", "/10/", "ラッパ"])
ゴリラ/10/ラッパ
"""
def __init__(
self,
contents: str | int | list[str] = "hello worlds",
speed: int | float = 0.10,
delay_time: int | float = 0,
is_inview: bool = True,
is_forwards: bool = True,
ext: Optional[str] = None,
):
self.showing_time = len(contents) * speed
self.speed = speed
self.delay_time = delay_time
self.is_inview = is_inview
self.is_forwards = is_forwards
self.contents = contents
self.sleep_flag = False
self.ext = ext
def make_simple_blinks(self):
"""
簡単なロジックでブリンク郡を作る。
文字列が短いと正常に動作しないし、文字列が長すぎても正常に動作しない。
雑に実装するとこうなる。
抱えてる問題(解決方法はsimple_blinksを参照)
t(整数(>=1)、文字の表示にかかる時間の合計) を与えられると、tの時間を100等分にした上で一文字辺りの表示時間を計算し、各文字に開始時間を割り振る。
これでは、最小のtが1であるため細かな制御が効かない。例えば2文字だと、一文字の表示にかかる時間が0.5秒になりかなり遅い。体感、10文字以下でこの問題が顕著。
100等分なので文字が(t * 100)文字以上だと同時に表示させる必要のある文字が出てくる。(t * 100)文字以下であったとしても、文字が多めだと表現の幅が狭くなる。
"""
blinks = []
for index, content in enumerate(self.contents):
start_ratio = index * 100 // len(self.contents)
end_ratio = 100
total_time = self.showing_time
args = {
"content": content,
"start_ratio": start_ratio,
"end_ratio": end_ratio,
"delay_time": self.delay_time,
"loop_count": 1,
"total_time": total_time,
"inview": self.is_inview,
"forwards": self.is_forwards,
}
blinks.append(Blink.supply(args))
# print(blinks)
return blinks
def make_blinks(self):
"""
simple_blinksの問題を解消させたもの。
simple_blinksとの違い。
文字数が100文字を越えても表現の幅が狭まらないように、個別の文字に対して、全体の中の特定の文字、ではなく、別個に表示タイミングを計算している。
「100秒で完結する100個ロジックの10個目のブリンク」を「10個目のブリンクは10.00秒後に動作を開始するブリンク」に変換している。
そのため最短指定の秒数が一秒を切っている。(やろうと思ったら素数を活用したさらに細かな分割とかできるが、やりたくはない)
つまり「1秒で完結する2個のロジック(表示時間0.5秒)」しかできなかったのを「0.2秒毎に2文字をブリンクさせる」ができるようになっている。
あと、文の途中のスリープを有効にした。
"""
blinks = []
blink_work_time = math.ceil(self.speed)
sleep_count = []
sleep_delay: float = 0.00
is_sleeping = False
# contentsがlist[str]のときは、スリープ関係の動作が正常に動作しない。
for index, content in enumerate(self.contents):
# スリープ関係の処理に入るか
if content == "/" or is_sleeping:
# 開始、終了系か
if content == "/":
if not is_sleeping:
is_sleeping = True
else:
is_sleeping = False
sleep_delay += float("".join(sleep_count))
sleep_count = []
# スリープ時間の読み取り
elif is_sleeping:
try:
if content != ".":
float(content)
except ValueError:
print("多分、スリープのタグを閉じるのを忘れています")
sys.exit()
sleep_count.append(content)
continue
start_time = index * self.speed + sleep_delay
start_f, start_i = math.modf(start_time)
# <TODO> ここら辺りの処理、スピードが一秒より長いとバグりそう。
if start_f != 1:
start_ratio = round(start_f * 100)
blink_start_time = start_i
else:
start_ratio = 50
blink_work_time = start_i + 1
args = {
"content": content,
"start_ratio": start_ratio,
"end_ratio": 100,
"delay_time": self.delay_time + blink_start_time,
"loop_count": 1,
"total_time": blink_work_time,
"inview": self.is_inview,
"forwards": self.is_forwards,
"ext": self.ext,
}
blinks.append(Blink.supply(args))
return blinks
def __str__(self):
return "".join(self.make_blinks())
目次 感想へのリンク しおりを挟む
しおりを挟む
自動生成で作ったもののサンプル
aa = "ー/0.2/ー/0.2/ー/0.2/ここは/0.3/『トレセン学園』。/0.8/皆の憧れ、/0.1/輝ける栄光の舞台、/0.1/『八大競争』を目指して走る/0.2/前途有望なウマ娘が数多く集い/0.1/競い合い/0.1/./0.2/./0.3/./0.4/そして/0.1/最後は/0.1/涙と共に去ることになる場所。"
i = FadeInSpeech(contents=aa)
print(i)
h = FadeInSpeech(
contents="/1/実況:/0.2/すべてのウマ娘が目指す頂点、/0.2/日本ダービー!/0.8/レースもいよいよ終盤戦、/0.5/間もなく第4コーナーカーブ/0.4/解説:/0.2/ウマ娘たちがスパートに向けてどう動くか/0.1/目が話せません。"
)
print(h)
Blinkがかなり万能の道具になっています。アニメーションを作ったり、ストップウォッチを作ったりするときに、これを使い込なせれば作業がかなり楽になります。というより、これか、これと類似のプログラムを作らないと複雑な物を作るのは無理です。
「無理」というのは「面倒」というよりも「計算がやっかい」、暗算のレベルを超えるという問題に直面します。
Blinkの機能の一部を使ってダイアログを吐かせるのがFadeInSpeechの機能になります。
細かな仕様と動作の説明はソースコードの中にコメントで記載してあります。
Pythonの実行環境と基礎知識が必要なので、それがないと難しいかもしれませんが、わかる方なら一瞬で再現できると思います。
(よくわからなくても、ソースコードをコピーして、それをPythonで実行するだけで動くのでそれほど難しくありません。
ただその手順をすべて文字で書くと大変なのでここに書きません。ネットや知人、SNSとかでPythonの動かし方を聞いたり調べたりしてください。不明な点については、コメント頂ければ回答します。)
これがBlinkの最も簡単な実行例です。
以下の内容をソースコードに書きます。
b = Blink(content="hello world")
print(b)
ソースコードを実行すると、
hello world ←が生成されます。
動かし方がわからない方はコメントを頂けたら対応します。
FadeInSpeechについて、
BlinkとFadeInSpeechのソースコードをコピーして、ファイルとして保存して、その保存したファイルの下の方に、作成したい文字列と点滅スピードの指定などを書いてPythonで実行すればダイアログが、Pythonを動かしたパソコン上に生成されます。
例えば、下のように記載すると
melos = "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。"
# ゆっくりめ(0.33秒間隔)のセリフ生成
print(FadeInSpeech(contents=melos, speed=0.35))
# 普通のセリフ送り
print(FadeInSpeech(contents=melos, speed=0.05))
# 高速セリフ送り(0.01以下も指定できる)
print(FadeInSpeech(contents=melos, speed=0.01, delay_time=1))
# 文単位でのセリフ送り(「。」単位で二秒ごとに表示する)
print(FadeInSpeech(contents=melos.split("。"), speed=2))
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。
メロスは激怒した必ず、かの邪智暴虐の王を除かなければならぬと決意したメロスには政治がわからぬメロスは、村の牧人である笛を吹き、羊と遊んで暮して来たけれども邪悪に対しては、人一倍に敏感であった
FadeInSpeechとBlinkに渡す値を調整すれば、結構なんでも作れます。
特に、文字の代わりに特殊タグを流し込んだり、ソースコードの中のextのオプションを活用すると色々作れます。(extオプションを使えば大概のことは実現できます)
高度な使い方の実例として作ったストップウォッチなどもあるのですが、使い方によってはバグるのでまだ公開していません。
必要ならコメント頂ければ急ぎで出すかも知れません。
このツールを使わずに、ハーメルンで表示時間の調整をミリセック単位で調整するのは人間にできることではないので、このツールを使うことを強くおすすめします。
目次 感想へのリンク しおりを挟む