見出し画像

診断メーカー・小技

昔作った診断メーカーのソースがキモかったので残します。

https://shindanmaker.com/1117705


あんまこういうの無いですよね。

基本・前提

・リスト構文内評価

リストの指定構文([LIST○])の中では関数が使えます。

りんご, りす, りゅう, りんか
ごりら, ごま, ごえつ, ごうり
らくだ, らっこ, らいおん, らんぷ
ぱんだ, ぱんつ, ぱせり, ぱたー

上のようなLIST1があるとして、
[LIST1_1-=RAND_N(1,1,4)]
と書くと、LIST1のいずれかの行の1番目から4番目までの項目のうちどれかを取り出してくれます。

・条件出現

=IF(<ある条件式>,<trueの時に出したい文>,)
で表示を切り替えられます。

・文字数制限回避

基本テキストには2000字しか書けず、長い処理となると限界があります。
そこで字数を取るような部分はLISTに移してしまいます。

{{ text::能力値セット1 ;; google-font::Yusei Magic;; font-size::10;; color::000000;; }}=CHART(TYPE:RADAR,DATA:[知力:=CALC([LIST5_1]+[LIST1_1-7]+[LIST1_2-7]),判断力:=CALC([LIST5_4]+[LIST1_1-8]+[LIST1_2-8]),魅力:=CALC([LIST5_7]+[LIST1_1-9]+[LIST1_2-9]),運動:[LIST5_10],器用:[LIST5_13],筋力:[LIST5_16],敏捷力:[LIST5_19],耐久力:[LIST5_22],],COLOR:[],MAX:18)

LISTの中では関数が使えるので割と自由に記述できます(おそらく関数の処理が行われるのは、基本テキスト内での[LIST○]の記述が当該LISTの内容と入れ替わったタイミングだからだと思います)。
CHART文とか字数取りますよね。当然ですが、出したい文章は全部改行を消してください。改行を入れたい場合は[BR]文を使いましょう。


・二次元配列的リスト

A型,几帳面, 真面目, 慎重, 優しい
B型,自由奔放, 好奇心旺盛, マイペース, 楽天的
O型,社交的, おおらか, リーダーシップがある, 大雑把
AB型,独特, 冷静, 二面性がある, 芸術的

最初の使い方と被りますが・・・
上のようなLIST1があるとして、
[LIST1_1-1]
と血液型を決めてから、
[LIST1_1-=RAND_N(1,2,4)]
と書くと、決定された血液型に付随した情報を取り出せますね。

・偏った乱数

普通の乱数生成器RAND_Nでは、全ての指定範囲の値の出現確率は等しくなります。
TRPGなどでよく使う「3d6(6面ダイスを3個振った合計)」などを得たい時はRAND_N(1,1,6)+RAND_N(2,1,6)+RAND_N(3,1,6)
とすればいいですが、この値を使い回したり上の例で言えば3d6を何回も出したい時面倒です(自分のやつでは24回+再利用1回ずつやってました)。
そこで全ての組み合わせをリストに書き出して、乱数一個で疑似的に乱数を偏らせます。

6
7
7
8
8
8
9
9
9
9
10
10
10
10
10
11
11
11
11
11
11
12
12
12
12
12
13
13
13
13
14
14
14
15
15
16

(自分が使ってたのは2d4+6でした)
上がLIST1だとして、
[LIST1_1]
[LIST1_2]
      :

と書くだけで済むのでちょっとすっきりするかな?

・一次元配列をインデックス指定

村上春樹, 芥川龍之介, 夏目漱石, 太宰治, 三島由紀夫, 宮部みゆき, 東野圭吾, 湊かなえ, 川端康成, 森鴎外

上のように複数項目入れた一行のリストを用意し、
[LIST1_1-〇]
と書けば、先頭から〇番目の項目を取り出せます。

・連想配列的リスト

キモい(キモい)その1。
連想配列とは、先の一次元配列がインデックス(番号)で指定するのに対し、"キーワード"で要素を指定する配列の事です。

ENFP,1
ISTJ,2
ESTJ,3
ISFP,4
INFP,5
ESFP,6
INFJ,7
ENFJ,8
ISTP,9
ISFJ,10
ESFJ,11
ESTP,12
ENTJ,13
ENTP,14
INTP,15
INTJ,16

1番目の項目がキー(連想配列での要素を指定するキーワード、当然重複は出来ません)のリストを用意しますが、当然これだけでは任意の行を取り出すことは出来ません。
そこでSUMIFLIST関数を利用します。

つまり、[LIST1_〇]として出した事のあるLIST1の行の中から、条件に合う行だけを選んで、任意の項目の合計を算出してくれます。
これを活用すると、「条件に合う行が必ず一つになる」、つまりキーを条件にすれば任意の1行だけ(の項目の合計なので実質その行だけ)を取り出せるようになります。
ただし、SUMIFLIST関数は[LIST1_〇]として出した事のある行しか対象に出来ないので、全ての行を選出しておく必要があります。

=IF([LIST1_1-1][LIST1_2-1][LIST1_3-1][LIST1_4-1][LIST1_5-1][LIST1_6-1][LIST1_7-1][LIST1_8-1][LIST1_9-1][LIST1_10-1][LIST1_11-1][LIST1_12-1][LIST1_13-1][LIST1_14-1][LIST1_15-1][LIST1_16-1]=0,,)

これをSUMIFLIST関数を行う前に書き、
=SUMIFLIST(1-1,INTP,2)
とすれば、INTPに紐づけた"15"という数字が取り出せますね。

・選択リスト行同士の項目ランダム選択

I,N,F,P,1.フェイヒュー,感性に溢れている。,0,1,0
I,N,T,P,2.ウル,周りに流されない確固な意思を持つ。,1,0,0
E,S,T,P,3.スリザス,困難と向き合う強かさを持つ。,1,0,0
I,S,F,P,4.アンザス,好奇心・探求心に溢れている。,0,1,0
I,S,T,J,5.レイド,自己完結を尊ぶ。,1,0,0
I,S,T,P,6.ケナズ,力を求める。,1,0,0
E,N,F,P,7.ゲイボ,優しさに溢れている。,0,0,1
E,N,F,P,8.ウンニョ,楽しさを尊ぶ。,0,1,0
I,S,F,J,9.ハガラズ,自らを尊ぶ。,1,0,0
I,S,T,P,10.ナウシズ,環境を尊ぶ。,0,1,0
E,S,F,P,11.イサ,愛を求める。,0,0,1
I,S,T,J,12.イエラ,辛抱強い。,1,0,0
E,N,F,J,13.ユーワズ,豪胆である。,0,0,1
I,N,F,P,14.ペスロ,衝動を尊ぶ。,0,1,0
E,S,T,J,15.アルギス,責任感が強い。,1,0,0
E,N,F,P,16.ソウィロ,前向きで明るい。,0,0,1
E,N,T,P,17.ティーワズ,勇気に溢れている。,0,0,1
E,N,F,J,18.ベルカノ,慈愛に溢れている。,0,0,1
E,S,F,J,19.エイワズ,協調を尊ぶ。,0,1,0
I,S,T,J,20.マンナズ,客観性を尊ぶ。,0,1,0
I,S,F,P,21.ラグス,直感を尊ぶ。,0,1,0
E,S,T,J,22.イングワズ,大義を尊ぶ,1,0,0
E,S,F,P,23.オセラ,縁を尊ぶ。,0,0,1
I,N,F,J,24.デイガズ,意地が強い。,0,0,1
I,S,F,P,25.ヴェオ,充足を尊ぶ。,0,1,0
E,S,T,J,26.オス,言葉を尊ぶ。,1,0,0
I,N,F,J,27.セン,人には譲れないポリシーを持っている。,0,0,1
E,N,T,J,28.イラ,支配を尊ぶ。,1,0,0
E,N,F,P,29.イング,愛を尊ぶ。,0,0,1
I,S,T,J,30.イル,計画性を尊ぶ。,1,0,0
I,N,F,J,31.カーク,理想を尊ぶ。,0,0,1
E,S,T,J,32.クェオズ,健全を尊ぶ。,0,1,0

キモい(キモい)その2。
上のMBTIを決めるための表ですが、このうち2行を選び、その中にあるアルファベット4文字を都度ランダムで選ぶという事をします。
この表をLIST1とすると、
[LIST1_1][LIST1_2]で行を選出しておき、
[LIST1_=RAND_N(1,1,2)-1][LIST1_=RAND_N(2,1,2)-2][LIST1_=RAND_N(3,1,2)-3][LIST1_=RAND_N(4,1,2)-4]
と書けば2行の中でランダムに選んだアルファベット4文字が出来上がりますね。
この4文字はひとつ前の表のキーとして使用するわけですが、ひとつ前の表をLIST2とすると、
=SUMIFLIST(2-1,=IF(1=1,[LIST1_=RAND_N(1,1,2)-1][LIST1_=RAND_N(2,1,2)-2][LIST1_=RAND_N(3,1,2)-3][LIST1_=RAND_N(4,1,2)-4],n),2)
と書けば目的の項目が取得できます。
一つ注意ですが、このうち「=IF(1=1,[LIST1_=RAND_N(1,1,2)-1][LIST1_=RAND_N(2,1,2)-2][LIST1_=RAND_N(3,1,2)-3][LIST1_=RAND_N(4,1,2)-4],n)」で一見無意味なIF関数を挟んでいますが、これをしないとSUMIFLIST関数が正常に働かず、0が返ってきます。

・基本テキストべた書き

=IF([LIST2_1-1][LIST2_2-1][LIST2_3-1][LIST2_4-1][LIST2_5-1][LIST2_6-1][LIST2_7-1][LIST2_8-1][LIST2_9-1][LIST2_10-1][LIST2_11-1][LIST2_12-1][LIST2_13-1][LIST2_14-1][LIST2_15-1][LIST2_16-1]=0,,)[USER]  高等部[LIST7]年(習熟ボーナス+=CALC([LIST7]+1)=IF([LIST7]>1,・特徴ポイント+=CALC(([LIST7]-1)*2),))
スキラー値:=CALC(=RAND_N(20,1,30)+49)  保有マギ量:=CALC([LIST8]+[LIST8_1]+[LIST8_2]+[LIST8_3]+[LIST8_4]+[LIST8_5]+[LIST8_6]+[LIST8_7]+[LIST8_8]+[LIST8_9]+50)

パーソナルルーン《[LIST1_1-5] × [LIST1_2-5]》

レアスキル[覚醒スキラー値]
[LIST3-=SUMIFLIST(2-1,=IF(1=1,[LIST1_=RAND_N(16,1,2)-1][LIST1_=RAND_N(17,1,2)-2][LIST1_=RAND_N(18,1,2)-3][LIST1_=RAND_N(19,1,2)-4],n),2)]

セット:01,  02,  03│性格ボーナス
知力 :=IF([LIST5_1]>9,,0)[LIST5_1],  =IF([LIST5_2]>9,,0)[LIST5_2],  =IF([LIST5_3]>9,,0)[LIST5_3]=IF(=CALC([LIST1_1-7]+[LIST1_2-7])>=1,│+=CALC([LIST1_1-7]+[LIST1_2-7]),)
判断力:=IF([LIST5_4]>9,,0)[LIST5_4],  =IF([LIST5_5]>9,,0)[LIST5_5],  =IF([LIST5_6]>9,,0)[LIST5_6]=IF(=CALC([LIST1_1-8]+[LIST1_2-8])>=1,│+=CALC([LIST1_1-8]+[LIST1_2-8]),)
魅力 :=IF([LIST5_7]>9,,0)[LIST5_7],  =IF([LIST5_8]>9,,0)[LIST5_8],  =IF([LIST5_9]>9,,0)[LIST5_9]=IF(=CALC([LIST1_1-9]+[LIST1_2-9])>=1,│+=CALC([LIST1_1-9]+[LIST1_2-9]),)
運動 :=IF([LIST5_10]>9,,0)[LIST5_10],  =IF([LIST5_11]>9,,0)[LIST5_11],  =IF([LIST5_12]>9,,0)[LIST5_12]
器用 :=IF([LIST5_13]>9,,0)[LIST5_13],  =IF([LIST5_14]>9,,0)[LIST5_14],  =IF([LIST5_15]>9,,0)[LIST5_15]
筋力 :=IF([LIST5_16]>9,,0)[LIST5_16],  =IF([LIST5_17]>9,,0)[LIST5_17],  =IF([LIST5_18]>9,,0)[LIST5_18]
敏捷力:=IF([LIST5_19]>9,,0)[LIST5_19],  =IF([LIST5_20]>9,,0)[LIST5_20],  =IF([LIST5_21]>9,,0)[LIST5_21]
耐久力:=IF([LIST5_22]>9,,0)[LIST5_22],  =IF([LIST5_23]>9,,0)[LIST5_23],  =IF([LIST5_24]>9,,0)[LIST5_24]

〇生まれ
[LIST4-2]

〇経験
[LIST6-=CALC(=RAND_N(22,1,8)+=RAND_N(23,1,8))]

〇性格指針
・[LIST1_1-6]
・[LIST1_2-6]

[LIST9-1]
[LIST9-2]
[LIST9-3]

いいなと思ったら応援しよう!