# -*- coding: utf-8 -*- """舞台型ショートの部品(2026-11-06「研究のスキル一覧」で決めた見た目を、2本目から共通にした)。 モニターの中(900×600)は面で組む: 左上に小さな見出し、その下に言いたいことを1文、図は1つ。 オレンジは「いま話している1つ」だけ。細い枠線・記号のアイコンは使わない。 """ import json, os from kabe_kit import shake_js, counter_js ORANGE, FACE_C, FACE_2, DIM, INK = "#E2683A", "#1B2433", "#2C3647", "#8A93A3", "#F5F3EE" HERE = os.path.dirname(os.path.abspath(__file__)) STAGE_DIR = os.path.join(HERE, "stage") CSS = f"""""" def win(t0, t1, inner): an = f"show .15s linear {t0:.3f}s forwards" + (f", hide .15s linear {t1:.3f}s forwards" if t1 else "") return f'
{inner}
' def kick(name): return f'
{name}
' def a(name, t, d=.3, ease="ease-out"): """animation の1つ分""" return f"{name} {d}s {ease} {t:.3f}s forwards" def stage_fx(T, bursts=(), shakes=(), ring_sec=48.0, fx=()): """床の円を回す(stage_bg_noring.png の上にカメラの値で描き直す)+紙吹雪(bursts: [(秒, 片の数)])+画面の揺れ fx: 紙吹雪のほかの演出 [dict(kind=, t=秒, d=長さ, ...)](毎回紙吹雪にしない・2026-11-06 エイイチの指示) rays … 床の円の真ん中から光の筋が回る(お祝い・決まった所) speed … マンガの集中線がモニターに集まる(叩きつけ・ツッコミ) shock … 床の円から波紋が広がる(知らせ・音・決定) spot … まわりを暗くして、x の位置にスポットライト(決めるのは○○) stars … 上の方に星がまたたき、少し暗くなる(夜・ひらめき) shine … モニターの上を光の帯が斜めに走る(作り直した・きれいになった) rise … 床から小さな四角が立ちのぼる(データ・記録・読まれる)""" R = json.load(open(os.path.join(STAGE_DIR, "ring_lut.json"))) bs = [dict(t=t, n=n) for t, n in bursts] js = f""" """ return js + (shake_js(list(shakes), amp=7) if shakes else "") # 舞台型の共通の値(spec.py で from butai_parts import * して使う) STAGE = STAGE_DIR BG_NAME = "stage_bg_noring" FOOT_L, FOOT_R, SIZE, SUB_MID = (390, 1525), (690, 1525), 0.88, 1590 SUB_ONE_LINE = True LEAD = 0.8 OUTRO_TEXT = "研究の記録は、毎日サイトで公開中です!" def outro(T, k): """締め(サイトへの入口)。モニターを pixelstomotors.com で覆う。文 k は narration.py の最後に足した OUTRO_TEXT の文 (2026-11-07 エイイチ「うちのサイトへの動線部分がないけど?」。2本目からの8本で入れ忘れていた)""" t = T(k, 0) return (f'
' f'
研究の記録
' f'
pixelstomotors.com
' f'
毎日、公開中
')