ちょこっとティラノスクリプト~自作マクロと躓いた箇所のメモ①~

ティラノスクリプトを使って5分~10分のADVを作りました。
その時に「こんなマクロあったらあとのゲーム制作時にも役立つかな~」と思って作成した自作マクロや、躓いた箇所について、忘れないうちにメモを残します。

ただし!ティラノスクリプトのセオリーは何も知りません!
そこまで頑張るつもりはなくて、いったん形にしてみよ~のノリでした。参考にしたのは短いサンプルプログラムと、詰まった時に参考にした偉大なる先駆者様の解説サイトだけ。長めのゲームのソース実物を見たことがない。
そのため、一切参考にならない可能性があります。ご容赦ください…。

その前に…


ファイル構成

  • macro.ks
    汎用マクロのファイルです。以下のnoteを参考にさせていただきました。
    繰り返し記述するような処理や、長い記述になる処理はマクロ化してまとめたほうがいいよね精神。
    本記事は主にこのファイルに定義したマクロの説明になります。

  • properties.ks
    変数一ヶ所にまとめたほうがいいかなって思ってまとめてみた…。内容はこんな感じ。properties.ksの呼び出しは、シナリオ本編の最初(Initial処理)のところで行っています。後述。
    初期化処理って要らんのか…?分からん!とりあえずやっとけ!(勢い)
    (追記:これが無いとゲームクリア後タイトルに戻る→また始めるをした時にゲーム変数が前回のデータを引き継いでいることを確認。必要みたいです)

;********************************
;	変数定義
;********************************
;------------------
;	システム変数
;------------------
;デッドフラグ
;	死んだと思った後に生き返れるよ!
;	未定義の時のみ初期化
@eval exp="sf.DeadFlg=0" cond="sf.DeadFlg==undefined"

;------------------
;	ゲーム変数
;------------------
;疑念フラグ
;	2以上で玄関から出る選択肢を取れるようになる
@eval exp="f.GinenFlg=0"

;タイマ
;	6になったら時間切れ
@eval exp="f.Timer=0"

;storage
;	ksファイルのInitialで該当のksファイルを格納
@eval exp="f.Storage=0"

@return
  • scene.ks
    シナリオ本編のファイル。Initialってそれっぽく書いた。短いゲームだから本編のファイルこれだけ。
    Initial一行目の「storageに現ファイルの格納」については後述。
    「変数読み込み」は「first.ksだと何回も通る…のか…?scene.ksの冒頭なら確実に一回だけかな…」と思いここに記述してみた。でも今思えばmacro.ksと同様、first.ksにcondを使って記述したほうが分かりやすいのかもしれない。
    動けばええ!

*start

[cm  ]
[clearfix]
[start_keyconfig]

;----------
;Initial
;----------
;storageに現ファイルの格納
@eval exp="f.Storage='scene.ks'"

;キャラ初期設定
@setCharacter

;メッセージウィンドウの表示
@layopt layer=message0 visible=true

;plugin-メニューボタン領域の表示
@showmenubutton

;plugin-メニューボタンの表示
@add_theme_button

;クリック待ち表示固定
@glyph fix="true" left="1116" top="640"

;変数読み込み
@call storage="properties.ks"

;背景表示
@setBackGround pic=ONEROOM time=1000


;------------------
;	ここから本文
;------------------

後のファイルはお決まりのやつ!

自作マクロ説明

①キャラクター設定 setCharacter

表情差分が35枚あります。各表情は「01」といったように登録してます。表情一覧の画像を別に作り、それを参考にしてます。
表情ころころ変える時にしょっちゅうフェードするの違和感あるから表情変更スピードを0にしたよ。身長によって位置変えたかったからpos_modeはfalseにして自分で位置指定できるようにしたよ。

;------------------------------
;	setCharacter
;	機能:キャラクターの初期設定
;------------------------------
@macro name = "setCharacter"
	
	;KAEDE 柏木楓
	[chara_new name="KAEDE" storage="chara/kaede/01_微笑み.png"]
	
	;キャラクターの表情登録
	[chara_face name="KAEDE" face="01" storage="chara/kaede/01_微笑み.png"]
	[chara_face name="KAEDE" face="02" storage="chara/kaede/02_口開け.png"]
	[chara_face name="KAEDE" face="03" storage="chara/kaede/03_通常.png"]

~~~省略~~~

	;表情変更スピード
	@chara_config time=0 pos_mode=false
	
@endmacro

②キャラ登場 showCharacter1、showCharacter2

シングルクォーテーションの書き忘れという理由で何分無駄にしたんだろう。

;----------------------------------
;	showCharacter1
;	機能:キャラクター登場(1人)
;	引数:	chara	= キャラクター
;----------------------------------
@macro name = "showCharacter1"
	
	;指定キャラごとの登場(位置を個別設定)
	[if exp="'KAEDE'==mp.chara"]
		[chara_show name=%chara top=50 left=400 width=500]
	[elsif exp="'KANATA'==mp.chara"]
		[chara_show name=%chara top=20 left=480 width=340]
	[else]
		error: キャラ指定に問題があります[p]
	[endif]
	
@endmacro

同時に登場させる時のマクロ。
一行目の「KAEDE」を「wait=false」にすることで、「KANATA」が「KAEDE」の登場を待つことなく同時に登場するようになる。

;----------------------------------
;	showCharacter2
;	機能:キャラクター登場(KAEDE & KANATA)
;	引数:	chara	= キャラクター
;----------------------------------
@macro name = "showCharacter2"
	
	[chara_show name="KAEDE" top=50 left=620 width=500 wait=false]
	[chara_show name="KANATA" top=20 left=280 width=340]
	
@endmacro

③背景設定 setBackGround

ゴリ押しマクロ。
・tf.storage:storageを一時的に格納する。変数の使い方が分からなくてとりあえず最後に削除した。ローカル変数のノリ。
・else文:こうやって書くと記述に間違いがあって変更できなかった時にテキストで表示される。百万回やらかした。

;---------------------------
;	setBackGround
;	機能:背景を設定
;	引数:	pic = 変更する背景名(対応するurlをマクロ中で定義)
;			time = 切り替え時間(指定無しでもOK)
;---------------------------
@macro name = "setBackGround"
	
	;初期化
	[eval exp="tf.storage=0"]

	;------------------------
	;背景の定義をここでする! 上手くいかない時は「'」忘れに注意
	;------------------------
	;*ワンルーム
	[if exp="'ONEROOM'==mp.pic"]
		[eval exp="tf.storage='oneroom.png'"]
	[elsif exp="'BYOIN'==mp.pic"]
		[eval exp="tf.storage='hospital.png'"]
	[elsif exp="'SHINKAI'==mp.pic"]
		[eval exp="tf.storage='sea.png'"]
	[elsif exp="'SEA'==mp.pic"]
		[eval exp="tf.storage='sea2.png'"]
	[elsif exp="'ROOM'==mp.pic"]
		[eval exp="tf.storage='room.png'"]
	[elsif exp="'BLACK'==mp.pic"]
		[eval exp="tf.storage='black.png'"]
	[elsif exp="'WHITE'==mp.pic"]
		[eval exp="tf.storage='white.png'"]
	[else]
		error: picの設定値、またはstorage指定などに間違いがあります[p]
	[endif]

	;背景を設定
	[bg storage=&tf.storage time=%time]

	;変数の削除
	[eval exp="delete tf.storage"]

@endmacro

後で連想配列を使う方法も見たけど、呼び出す時により簡単で短く書ける気がするので体裁にこだわらないなら、まあいいかなって。

;背景表示
@setBackGround pic=ONEROOM time=1000

指定は「ONEROOM」だけ。分かりやすい!()

④改行 br

改行する時に待ち時間があったほうが読みやすい気がして…。
無駄にHTMLとタグ名を揃えた(?)

@macro name = "br"
	
	[r][wait time=150]
	
@endmacro

⑤選択肢表示(glink) selectText3Row

ここ!!!!バグ発生ポイントでした!!!!
最初に完成形を示します。

;-------------------------------------------
;	selectText3Row
;	機能:選択肢3行
;	引数:	txt1	= 選択肢1の文字列
;		 	txt2	= 選択肢2の文字列	以下略
;			jump1	= txt1のジャンプ先
;			jump2	= txt2のジャンプ先	以下略
;	注意:jumpに設定した名前をjump先として
;		 マクロ外で指定が必要
;-------------------------------------------
@macro name = "selectText3Row"
	
	;storageをマクロの呼び出し元のstorageに書き換え
	[iscript]
		mp.storage = f.Storage
	[endscript]
	
	[glink color="ts19" size="20" width="400" y="180" text=%txt1 target=%jump1 storage="%storage"]
	[glink color="ts19" size="20" width="400" y="270" text=%txt2 target=%jump2 storage="%storage"]
	[glink color="ts19" size="20" width="400" y="360" text=%txt3 target=%jump3 storage="%storage"]
	[s]
	
@endmacro

glinkのタグが長すぎてこんなん繰り返してたら絶対ミスる!マクロ化したい!と思考錯誤し、なんやかんやあってstorageをシナリオ本文のファイルに書き換える必要があることに気づきました。それで、以下のページを参考にし、storageを取得していました。

	[iscript]
		mp.storage = tyrano.plugin.kag.stat.stack.macro[0].storage
	[endscript]
	
	[glink color="ts19" size="20" width="400" y="180" text=%txt1 target=%jump1 storage="%storage"]

しかし、おそらくこれが原因でごく稀に「storageがない」「(ラベル)が見つからない」といったエラーが出現…同じ箇所をぐるぐる回るバグが…。
傾向としてスキップ時にエラー発生することが多かった気がしますが、再現が難しくデバッグも困難。
そのため推測になるのですが、おそらくmacro[0].storageにシナリオ本文ファイルではないファイルが入る→その中にはstorageやラベルの定義がない、というのでエラーになっていたんじゃないかと思いました。

それで、シナリオ本文ファイルのInitialでゲーム変数「f.storage」に現在ファイル名を直書きしました(ゴリ押し)。その直書きした値を選択肢のマクロ内で使っています。

;----------
;Initial
;----------
;storageに現ファイルの格納
@eval exp="f.Storage='scene.ks'"

他の本文ファイルに移った時には、最初に同様の記述を入れれば、ゲーム変数なので読み込み中のファイルがstorageに必ず格納されています。だから問題は起こらない…はず…。
今のところ同じバグは確認していませんが、もし直ってなかったら泣く泣くこのあたりの記述を消します。

⑥タイトルに戻る returnTitle

意外とタイトルに戻るために必要な処理ってまとめてるページを見つけられませんでした。なんとかなれー!の気持ちで寄せ集めました。
動いてる…ヨシ!

@macro name = "returnTitle"

	;メニューのボタンを非表示にする
	[hidemenubutton]
	;メッセージレイヤを非表示にする
	[layopt layer="message0" visible=false]
	;キャラを全員隠す
	[chara_hide_all]
	;黒背景にフェードアウト(自作関数)
	@setBackGround pic=BLACK time=1500
	;お決まりっぽい
	[clearfix]
	[clearstack]
	
	[iscript]
		tf.system.backlog=[];
	[endscript]

	@jump storage="first.ks"
	[s]

@endmacro

以下のページを参考にさせていただきました!

躓き

①フォントが切り替わらない、本文サイズを変えられない

フォントが変わらなかったり、「Config.tjs」でフォントサイズを変更してもサイズが切り替わらなかったり、文字を表示し終えた後ルビの高さぐらい下にテキストがずれる…といった謎現象が発生していました。
原因は「;」を削除していたせいでした。消したらダメなんだ!?(´・ω・`;)
有効化するならksファイルみたくコメントアウトしてるのを解除しなきゃかなって思っちゃって…。

// ◆ 文字の大きさ
// デフォルトの文字の大きさ ( 高さ ) を pixel 単位で指定します。
;defaultFontSize = 24;  // deffont タグの size 属性に相当

②テーマ一括変換プラグインを使用時、タイトル画面からコンフィグ画面の遷移にテーマが適用されない

対処法はこの記事!title.ksにプラグインのコンフィグ画面までの相対パスを記述する必要がありました。

いったんここまで!
制作時のちゃんとした手順はまた記事化したいです。とりあえずのメモ書き。


更新履歴
2024/04/02 properties.ksの欄に追記
2024/04/02 新規作成


この記事が気に入ったらサポートをしてみませんか?