変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

インターネット

[三国英雄の夜明け]第六回統合大型アップデート

やっと来る。

でも、告知日の明後日に統合するとは・・・告知?あ、忘れてたw(なのかな?

  • 爵位追加
  • 官邸レベル上限解放(+3)
  • 新英雄
  • 新覚醒
  • 新補助スキル
  • 新宝物

後は、ほとんど課金系だから関係無し。

新ゲーム設置予想場所

崑崙仙境が何なのか判らない。

新たな課金ミニゲームの様な気がするけどね。

そして、これらは40枚揃わないまま統合しそう。

なお、ただのアップデートなので、サーバーは統合されませんでした。

ps.2023/4/21

今現在、官邸レベルアップは郡公への爵位上昇条件が後日公開となっているため不可。

4/25(火)にサーバー統合されるので、「サーバー統合直前大型アップデート」だった様です。

なお今回のサーバー統合の対象はS5_1~6らしい。「同勢力に所属となります」の文面があるのでシャフル(バラバラに再配置)ではなさそう。

また統合後、爵位名の変更、英雄の天賦や宝物や戦計等の効果調整、英雄の戦力スーパーインフレで弱体(ゴミ)化した護国軍(NPC)の強化が含まれるとのこと。

ps.2023/4/24

明日サーバー統合する様です。

その影響でシーズンイベントも短縮。



「EXCEL」Lambda関数

謎が多いLambda関数。

外部からの参照時にパラメータを貰い、Lambda関数の処理に引き渡せる点が光っている。

=LAMBDA(a,b,SQRT(a*b))

と書くと

#CALC!

になってしまう。

これはパラメータを指定していないためで、パラメータを追加すると

=LAMBDA(a,b,SQRT(a*b))(10,10) ⇒ 10

となるけど、こうなってしまっては使い道が全くない。

そこで、セル名の参照範囲が=で始まるのを利用し、(10,10)抜きでLAMBDA式を適当なセル名で登録すれば・・・

セル名:あああ
参照範囲:=LAMBDA(a,b,SQRT(a*b))

どこかのセルの式:あああ(10,10)⇒10

と云う感じでVBAマクロを使わなくてもユーザ関数(今風にはカスタム関数と云うらしい)を作ることができる。

但し、処理が1行に収まる様に纏められるならないが

そこはLET関数を使って、1行に纏められるなら

ワークシートに散乱している=LET(・・・な計算式を一纏めにできるので

後々の修正もセル名の計算式を治すだけでうまくいく(かもしれない

好感度やランキングの様なその時々で評価式を一斉に変えないといけない案件には非常に有効な気がする。

尚、このLAMBDA関数はループができるらしい。

式:=REDUCE(0,A1:C2, LAMBDA(a,b,a+b^2))

ちょっと見、訳が判らないけど、A1からC2の2乗値を合算する式となっている

LAMBDAの第1パラメータは多分、初期値か前回のLAMBDA関数の計算結果

LAMBDAの第2パラメータは計算して欲しいセルの値

つまり、LAMBDA関数はA1:C2の6セル分のループ中に6回も計算させられる。

1回目:LAMBDA(0,1,0+1^2)
2回目:LAMBDA(1,2,1+2^2)
3回目:LAMBDA(5,3,5+3^2)
4回目:LAMBDA(14,4,14+4^2)
5回目:LAMBDA(30,5,30+5^2)
6回目:LAMBDA(55,6,55+6^2)
最後:91

な感じになるので、LAMBDAのパラメータが2つあるようだ。

セル単位で処理が済むならMAP関数でループする方が簡単かも、

下図は範囲の値を2倍した範囲を作るだけ

式:=MAP(A1:C2,LAMBDA(a, a*2))

計算式はMAP関数のパラメータに範囲があるので自動的にスピルされるのでD3のみに書けばよい。

さらにMAP関数には範囲を複数指定できるらしいので、A範囲+B範囲な計算結果もつくれるっぽい。

式:=MAP(A1:C2,A4:C5,LAMBDA(x, y, x + y ))

再びLAMBDAのパラメータが2つになったけど、扱う範囲が2つなんだから仕方が無い。

同様に、BYROWやBYCOL関数もあるが、動きは(多分)予想できると思う。

SEQUENCE関数が引き渡した数だけ連番(つまり配列)を出力してくれる。

これを使うとLEN関数を組み合わせ、文字列の長さ分の連番を作ることができるから・・・

それをMAP関数に食わせると、1文字づつ何かの処理をやってくれる。

式:=LET(セル, A1, MAP(SEQUENCE(LEN(セル)), LAMBDA(x, MID(セル, x, 1))))

しかし、具体的な使い道となると、1文字コマンドなプロトコルの場合かな?

ロボットのコマンドとかで、

“1422”: “1”:右折、”4″:後退、”2″:左折

⇒ 右折、後退、後退、左折 とかかな?

更に、自己再帰処理が可能らしい。

式:下参照
=LET(対象セル,A1,
  Z,  LAMBDA(f, LET(g, LAMBDA(x, f(LAMBDA(v, LET(w, x(x), w(v) )))), g(g))),
  myfact, Z(LAMBDA(myfact, LAMBDA(x, IF(x=0, 1, x * myfact(x-1))))),
  myfact(対象セル)
)

元ネタ

元ネタの元ネタ。※リンク切れの可能性あり

再帰して欲しいと思って直行ルートで書くと

=LET(対象セル,$A$1,
  myfact,  LAMBDA(x, IF(x=0, 1, x * myfact(x-1))),
  myfact(対象セル)
)
⇒ #NAME?

そう、LET関数でのmyfact変数宣言中は「myfactの宣言が確定していない」ので、

myfact(x – 1)のmyfactなんて知らないがな?エラーが発生する。

注意1:LET文は直書きな再帰処理は不可能。

なので、事前作業として何か変数宣言して、ここを経由して名前の確定を遅延させてしまえばよい。

しかしmyfactを直接引き渡せないことに変わりは無いので、

LAMBDA関数を使って仮引数仮引数を含む処理の形で一旦処理中で参照するmyfactの実体の確定を保留しつつmyfactの宣言を先に完了させる。

=LET(対象セル,$A$1,
  Z, ・・・(検討中)・・・
  myfact, Z(LAMBDA(myfact, LAMBDA(x, IF(x=0, 1, x * myfact(x-1))))),
  IF( 対象セル=0, 0, myfact(対象セル))
) ⇒ #CALC!

LAMBDA(LAMBDA())な感じになって見苦しいなぁ・・・(泣き

さて・・・

Zは不動点コンビネータで書けばいいらしいけど、

Z = lambda f: (lambda x: f(lambda *y: x(x)(*y)))(lambda x: f(lambda *y: x(x)(*y)))

他の言語の例は無名再帰にあるらしいがEXCELは載ってない。

不動点コンビネータの1例にYコンビネータというのがあるらしく、

これをEXCELの計算式にすると

LAMBDA(f, LET(g, LAMBDA(x, f(x(x)), g(g))))

しかし式を確定しようとすると

LAMBDA関数の宣言中なのに『f(x(x))』の『x(x)』部分を直ぐに計算しようとしてバグった

つまり、今のLAMBDA関数の処理部で関数の引数の式に関数が含まれていると

即評価してしまうのではないか?(ちょっと有り得ないけどね!

そんな気がした。

『x(x)』なら、直ぐに計算しようとは思わない。(ハズ

EXCELの為に少し難易度を下げてみる。

f(x(x))をfとx(x)に分離し

x(x)の処理を一旦wとして定義してから、

x(x)を計算する様にしてみると

LAMBDA(v, LET(w, x(x), w(v) ))

となる。

この仮引数vには外側のLAMBDA関数『LAMBDA(x, f(x(x))』の仮引数xが引き渡されるハズなので、『f(x(x))』と等価になるハズだ。

これで調整しなおして

LAMBDA(f, LET(g, LAMBDA(x, f(LAMBDA(v, LET(w, x(x), w(v) )))), g(g)))

になった。

・・・

元ネタ記事では「今風」に詳しく説明されているので、間違いなくそちらの方が理解しやすいだろう。

僕はよーく読んだ末にやっぱりイミフになってしまった。※頭悪いなぁボクは!

EXCELの式の処理の都合をイメージしながら

僕なりに考察してみるしかなかった。※頭悪いなぁボクは!

だから、やはりあのゴニョゴニョなZの式

「EXCEL風Yコンビーネータ」

の様に思えた。



「EXCEL]LET関数

javascriptでも最近よく使うLET ※予約語

javascriptでは、var同様に変数宣言として使うけど・・・

EXCELでは、やはりBASICでのLET文である。

Rem LET 変数 = 計算式
LET X = SQRT(13)
=LET (変数名1, 計算式1, 変数名2, 計算式2, ・・・, セルの計算式  )

最後のセルの計算式は、この式の結果を計算するための計算式なので、

セルに何も表示しないなら、” ” でも良いかもしれない。

変数名n (n=1,2,・・・)は、このLETでのローカル変数らしくセル名リストに載らない。

なんだか使い道がさっぱり思いつかないが

=LET(範囲,A1:G1,合計,SUM(範囲), 平均, 合計/COLUMNS(範囲), "平均:" & 平均)

と書ける。改行してみると

=LET(
範囲,A1:G1,
合計,SUM(範囲),
平均, 合計/COLUMNS(範囲),
"平均:" & 平均)

つまり、LET関数は複数のセルに分けていた計算式を1つにまとめることができる。(コトもある

パっと見やすいのも高得点。

ワークシートに処理の破片みたいな計算式をバラまいてしまうとシートの端々までチェックしないと動きが読めないので大変。

そんな時はとても重宝するかもしれない。

なんたってEXCELの列は256個しかないしね。(笑



[三国英雄の夜明け]久々・・・

アップデートのおかげでずいぶんと戦力は強化できてるけど、

上を見上げるとキリがない

上を見れば三分の1くらいなので寧ろ後退している。

下位英雄を充実させているだけで先頭は500万目前のまま。

もう少しなんだけど打つ手がない

鎮魂の塔の王の魂もなかなかLv40になってくれない。

40になれば40になれば・・・

砂盤演義は31章に進んだけど入口で停滞中。

全く勝てる気がしない

※朱雀が全回復技を使ってるけどどう対処したら良いのか全く判らないので力押し。

ま、サボってるせいなんだけどね。(笑

サボってる間に自動的に資源が溜まるので遊ぶのは楽なんだけど

イベントの褒章が貰えないし、

強化が進まなかったりする。

洗練で少し上げようとしたら1万下がった。orz



[Javascript]漢字読み仮名辞書とローマ字変換

VBAではバリバリと日本語の変数を使うけど

JavaScriptでは日本語変数は使えないので、よく打ち間違えるからVisualStudioCodeのヘルプは大助かり

しかし、Excelで仕様書を書く時は何もヘルプ機能が無いのでAll JavaScriptで作ってみた。これならダウンロードすれば安心。(なハズ。

漢字読み仮名辞書とローマ字変換

  • ローマ字変換と漢字読み仮名変換はほぼ似てるのでクラス化
    • 対象テキストと辞書のエントリィ(ひらかなとか漢字とか)の両方の先頭部分を比較し一致箇所が一番長いものを拾い出し、辞書の読み(ローマ字とかひらがな)に差し替える。
    • 基本的に辞書はJSONのまま使用。
  • ローマ字変換と漢字ひら仮名変換の2オブジェクトを作成。
    • 辞書はそれぞれ別途用意。
    • 変数名で使うセパレータ(_)は、漢字読み仮名変換のみ指定。
    • 接頭語、接尾語指定は、漢字読み仮名変換のみ指定。
    • 例外的な記述の仕方はtralsrateAfterをオーバーロード。

使い方1:漢字の読みを登録しよう。

  1. 漢字欄に「新幹線」と入力
  2. ひらかな欄に「しんかんせん」と
  3. 【単語の読みを辞書に登録】ボタンを押す

使い方2:辞書に登録されたか確認しよう。

  1. 【辞書⇒クリップボード】ボタンを押す
  2. テキストエディタで貼り付け
  3. 多分、「新幹線\tしんかんせん\r\n」と出るハズ

使い方3:辞書を更新しよう

  1. テキストエディタを「新幹線\tしんかんせんwwww\r\n」に書き換える
  2. 全文をコピー
  3. 【クリップボード⇒辞書差替】ボタンを押す
  4. 漢字欄が「新幹線」なのを確認する
  5. 【漢字⇒ひらかな】ボタンを押す
  6. ひらがな欄に「しんかんせんwwww」と出るハズ

使い方4:ローマ字に変換しよう。

  1. ひらがな欄が「しんかんせんwwww」なのを確認する
  2. 【ひらがな⇒ローマ字】ボタンを押す
  3. ローマ字(スネークケース)欄に「shinkansenwww」と出るハズ
    • ※ローマ字変換処理は「知らない文字はそのまま出力する様になっている」

使い方5:辞書に登録した漢字を組み合わせて使ってみよう

  1. 漢字欄を「新幹線新幹線」と書き換える
  2. 【漢字⇒ひらかな】ボタンを押す
  3. ひらがな欄が「しんかんせん_しんかんせん」になる。
  4. 【ひらがな⇒ローマ字】ボタンを押す
  5. ローマ字(スネークケース)欄に「shinkansen_shinkansen」と出るハズ
    • ※登録した漢字と登録した漢字の間に_が入る。(仕様
  6. キャメルケース欄に「shinkansenShinkansen」と出るハズ
  7. コンスタントケース欄に「SHINKANSEN_SHINKANSEN」と出るハズ
  8. パスカルケース欄に「ShinkansenShinkansen」と出るハズ
  9. チェインケース欄に「shinkansen-shinkansen」と出るハズ

使い方6:「~1」とか「~2」とか、ありがちな変数名がどう変換されるかな?

  1. 漢字欄を「新幹線1」と書き換える
  2. 【漢字⇒ひらかな】ボタンを押す
  3. ひらがな欄が「しんかんせん1」になる。※辞書に未登録な文字の前後に[ _ ]は入らない。
  4. 【ひらがな⇒ローマ字】ボタンを押す
  5. ローマ字(大文字)欄に「SHINKANSEN1」、ローマ字(小文字)欄に「shinkansen1」と出るハズ
    • ※登録した漢字と登録した漢字の間に_が入る。(仕様

使い方7:辞書の登録

  1. 辞書ファイルを用意
  2. 全文をコピー
  3. 【クリップボード⇒辞書差替】ボタンをクリック

使い方8:複数の辞書を登録

  1. 1つ目の辞書は使い方7の通りに【クリップボード⇒辞書差替】ボタンで取込む
  2. 2つ目以降は【クリップボード⇒辞書追加】ボタンで取込む

使い方9:辞書を消そう。※ここ重要。

  1. F12でDevTools画面を開く
  2. 画面上の「アプリケーション」タグを選択
  3. 画面左の「ストレージ」の中の「LocalStrage」をクリックする
  4. 画面中央の「キー」の一覧に「kanjiYomi」を選択
  5. 右クリックして「削除」を選択

使い方は以上です。

ひらがな欄にカタカナを入力してもローマ字に変換できる。(ハズ

変数名中の「ロック」や「ファイル」等の英単語にするものは変則的な使い方ですが・・・

  • 漢字:「ロック」
  • ひらかな:「lock」

の様にして【単語の読みを辞書に登録】して【ひらかな⇒ローマ字】すると良いでしょう。

ローマ字にしたくない変数名中の「の」は

  • 漢字:「の」
  • ひらかな:「」

とすると出来るけど、「のはら」が「はら」になったり予想外のことが起きるでしょう。

新XXXXは「shinXXXX」にしたい場合は

  • 漢字:「新」
  • ひらかな:「しん@」

と読みに@を付けると読み仮名変換時に[ _ ]が付かない様にしたから

ローマ字にするとshinxxxxになるはず。

xxx年はxxxNenにしたい場合

  • 漢字:「年」
  • ひらかな:「@ねん」

と読みの先頭に@を付けると読み仮名変換時に[ _ ]が付かない様にしたから

◇◆◇◆◇◆◇◆

【単語の読みを辞書に登録】や【クリップボード⇒辞書差替】を登録するとLocalStrageに取り合えず保存するので

適当に【辞書⇒クリップボード】して辞書をバックアップすれば安全だろう。

LocalStrageはJSON式データで保存してるけど、

クリップボードは「漢字1\t読み仮名1\r\n」「漢字2\t読み仮名2\r\n」「漢字3\t読み仮名3\r\n」・・・形式なので、

多分、EXCEL⇔クリッップボード⇔画面で利用もできる。(知らんけど

なんでこんなのを作ったのかと云えば

Excelに日本語名とローマ字の対応表を作りXLOOKUPで引けばできることですが、

「xx処理yy関連zz対応www2」の様な日本語名がいっぱいあると登録するのに疲れてくるので

「xx処理」「yy部」「zz対応」「www」を一度登録すれば、

「aa処理yy関連zz関連www2」なら「aa処理」だけ登録すればいいものが欲しかった。(ダケ

それにしても・・・

3人居れば皆ローマ字はバラバラになるのは・・・(実に恐ろしい

試しに

IME用辞書のTEXT形式のものを見つけたので

置換前:^([^\t]+)\t([^\t]+)\t([^\t]+)$

置換後:\2\t\1

で正規表現ONで置換させて、うまく取り込める様だ。

しかし、LocalStrageの制約があるので、5MBを越える様な漢字の読みは登録できない。

ps.TEXTAREAタグに変えた

変数名の列を範囲指定して貼ってみると楽しいかもしれない。

  1. とりあえず、単漢読み仮名だけでも自動的にしたいなら
  2. 文化庁の「常用漢字一覧表」のPDFをダウンロード
  3. MS-WORDに強引に読ませる
  4. 全文をクリップボードに入れる
  5. テキストエディタに貼り付ける
  6. 雰囲気を見ながら
  7. 「^[\r\n]+」で、空行を削除 ※114行減る
  8. 「^\s(\S)\(\s+\)\s+」「\1\t」で、103行調整。
  9. 「^\s.*\r\n」で、タブや空白等で始まる行を削除 ※2249行減る
  10. 「^(\S+)\s+(\S+)\s+(.*)$」「\1\t\2」で、漢字と読みだけ残す ※1958行更新
  11. 「\(\S\)」で、(惡)などの旧字を削除 ※251行更新
  12. 「^漢字\t音訓\r\n」で、表タイトルを削除 ※115行削除
  13. 「^←→[^\r]*\r\n」で、削除 ※8行削除
  14. 微調整が必要なのが以下の14行。
    • 梅雨(つゆ),部屋(へや),今年(ことし), 昨日(きのう), お母(かあ)さん
    • 勺 シャク尺 シャク, 升 ショウ少 ショウ, 昭 ショウ宵 ショウ, 畝 せ瀬 せ, 浦 ホ補 ホ, 匁 もんめ夜 ヤ
    • 「人数」は, 陳 チン 陳列
    • 弁(/辨/瓣/辯/) ベン
  15. 全文コピって【クリップボード⇒辞書】ボタンを押す

と、してみたら良いかもしれない。

常用漢字⇒ジョウヨウカン_ジ⇒jou_you_kan_ji な具合

多分うまくできたと思うので、単漢字変換表サンプルのリンクをサンプルの画面に貼っておく。



[EXCEL]ネストした表の拾い出し

こんなネストした表から(nnn)形式の番号とその後のテキストを拾い出すとしたら・・・

ネストした表

VBAではなくセルの数式で頑張ると

(nnn)を拾い出す簡易な数式
(nnn)の後のテキストを拾い出す簡易な数式

な感じだろうか・・・

一応6行目の様なケースも考慮してSEARCH関数で(nnn)な何かを判定している。

手元のEXCELは数式に改行コードが入るので、図の様に改行できて見やすい。けど、手元のPCのCPUは古いけどi9-9900でメモリ32GBだから不自由なく使えてるダケかもしれない。よくあるハズレPCアンド旧EXCELな状況ではそうもいかない。

多分、重い数式の説明やらヘルプ機能が邪魔で手に負えなくなるから、sakuraエディタで最終行を複製し1行範囲でセル座標を置換して貼り付けた方がマシな気がする。

FINDやSEARCHの検索対象を範囲指定してスピンさせる範囲分列を消費させる方法もあるけど、CONCATでかき集めないといけないし、悪質なくらいネストしている表の場合は列が足りなくなる恐れがあるので複数行な数式の方がマシな気がする。

でも行方向にスピルさせれば・・・

長すぎる番号を拾い出す数式
長すぎる番号の後のテキストを拾い出す数式

数式を行数分コピペしなくていいから便利かもしれない。

※範囲が1行分足りなくなった時に、数式の6を7に一斉置換するためにsakuraエディタが必須かも。

もし10ネストとかになると数式の長さに引っかかったりしそうだし、やっぱり編集も面倒!

「長いIF数式」をLAMBDA関数で括り、セル名の参照範囲に割り当ててみよう。

長い数式をセル名付きのLAMBDA式化
短くなった番号を拾い出す数式
短くなった番号の後のテキストを拾い出す数式

範囲パラメータを指定すると自動的にスピルされてしまうので、4つの番号取得を一つにまとめる方法が無いのかな?

複数列でまとめた数式をLAMBDA化してみよう

複数列からxxxな式を追加してみた

セル名の範囲をシートにすると「シート名!セル名」になってしまうのでセル名の範囲をブックに変更。

セルの数式の方も

もっと短くなった番号を拾い出す数式
もっと短くなった番号の後のテキストを拾い出す数式

とまれ、ここまで短くなれば十分かな。

ネストが深くなったら、

  1. 「複数列からxxx」の参照範囲のLAMBDAのパラメータと式を増やす
  2. セルの数式もパラメータ増やす

で何とかなりそう。

「複数列のxxx」セル名でBYCOL関数を使ってみる

ん-。やはり列範囲を指定した時点でスピルされてしまう。

うまく行かないや(笑

ここまで数式で頑張らなくても

シートからCSVに吐き出して、エディタでTAB(¥t)を一斉削除してシートに戻せばよいのは、秘密です。



[三国英雄の夜明け]第五回統合大型アップデート

10月14日にアップデートが実装されました。

タイトルは多分誤字
謎過ぎる

領地内に鎮魂の塔が追加され、

読みにくいけど「鎮魂の塔」

10階まであるけど、とりあえずは4日ごとに順に解放らしい。

一階の方々

絵はある程度、攻略済みのもので、最初は●●●で、武力や戦力を指定値まで上げると●●になる。

英雄の武力を11も上げるには

星の神紋とか

武力+5

強化した宝物とか

倚天剣

を他から融通して条件クリアし、クリア判定を済んだ後に元に戻せばいい。

武力の場合は魂玉とか獣霊を融通すれば良さげ。

但し、「二人の英雄の合計の武力」が条件の時は、+22(二人分)だから条件自体がギリギリだったり、ちゃんと元の英雄に装備を戻せるかちょっと心配だったりするので、スクショを撮ったり事前準備はしっかりやっておいた方が良さそう。

そして、更に指定のアイテムを貢ぐと●●●、また更に別のアイテムを貢ぐと●●●になる。

食料や銀銭なら都合しやすいが米酒や拝帖はストックが切れてると溜まるまで数日かかるかも。

3個足りない
試練完成(2日後)

これをクリアすると強化リストにご対面。

★★5段階強化★★★

条件のアイテムは、征戦「古代の夢魔」(告知では「永久の悪夢」)で、

征戦のメニュー

あみだくじの様な経路を進め、時にはミニゲームで対戦し、終焉条件(ラスボス対戦)をクリアすると貰える「夢境の塵」で、商店「夢獏見世」でアイテム「古の回響き」や「却数の棘」等に変えることになるので、5段階クリアは長丁場になりそうです。

1段進めたら●●●と色が変わったので、段階ごとに色は変化しそう。

●●●

古代の夢魔は地獄道の他に5個くらいあった様なので、進むたびに厳しくなるんだろうなぁ。

あ、途中で拾った呪われてそうなアイテムは捨ててしまいたいけど

ヤバそうなアイテム

レベル5デス的な状況もあるかもしれないから、取っておくか・・・



[三国英雄の夜明け]残されたもの(のびしろ)

幕府

レベルアップの度に2%づつPC対戦時に戦力がアップする応援システム。※レベル48で110%アップ。

但し、各府英雄の評価合計が低いと十分に戦力がアップされないので全員S評価にするのがお勧め。

押し職を集中して上げる方が無難。

定計

戦計でレベル4に上げると英雄に装備できる。

戦計

百貨市場で各計を3★以上に上げると

図の説明の様に全体または一部の英雄の戦力等が強化される。

4★になれば英雄に装備すると良いこともある。

魂玉

竜金探索でアイテムを収集し英雄に装備させパワーアップ。魂玉を合成して品質アップするとモリモリ強くなるが、品質が上がるほど合成に必要な魂玉の数が増えるので、合成すると全体の戦力は下がり気味。余ったら合成するのがいい。

シーズン(9日間イベント)

任務(全22)を達成する度にアイテムを貰えるので、ほどほどにやっている。

部隊が全滅するとポイントを多く貰えるので食料がいっぱい必要。

襄陽争奪戦(8日間隔)

任務達成や時間制のランキングに応じてアイテムが貰えるので、ほどほどにやっている。

部隊が全滅するとポイントを多く貰えるので食料がいっぱい必要。

襄陽の奪還に成功すると産業のうち3か所で黄金50が拾え(10回/日)、年度報酬も多めに入る。

異民族侵入

ランダムに発生する。報酬は少ないけど、取らないのも勿体ない。

黄巾の乱

襄陽争奪戦の日を除き、毎日10、11、18、19時に発生。※20時に大群が来襲する時もある

報酬は少ないけど、取らないのも勿体ない。

その他(未着手)

乱戦

乱戦商店で欠片の購入に使えるアイテムをゲットできる。参戦料(黄金500~1000。官邸レベルで変動?)が高いし、参加は時間制なのでやっていない。

乱戦商店

兵力を強化する欠片を売っている。

英雄の塚

課金は力也

過去に競売した「神」英雄を入手できる。図の通り課金必須。

ps.2022/9/19

ここを見た訳では無いだろうけれど、鯖統合情報が出た。

領地に鎮魂の塔という修行ストーリーが追加される様だが、課金必須なら「俺には関係ない」感。

そうでなくても、まだ砂盤演義を30章攻略中なので早すぎ感。

新年ぐらいに・・・と予告されていたバージョンアップの前倒しなのかな?

ps.2022/9/24

19.5million

平均すると4~5万/日だけど、戦計アップを含むので、その他の増強ペースが下がっている気がする。

課金勢に引き離され過ぎ。

それと、昨日(9/23)の午後8時くらいつい先ほどまでYoutobeももっさり、ゲーム画面で「ロード中…」が長すぎ!ブラウザを開き直す事x100回?いったい何があったんだろう?Nuro光とかに変えても無駄なんだろうけどね。

ps.2022/9/25

今日も夜から回線が重い。

対戦とは云え、反射神経がほとんど要らないスマホ・ゲームなのに支障が出る程度に酷い。

手元から一番遠いルータを再起動しても変化なし。

手元に一番近いハブをちょっと電源を外して再起動。お、症状は軽くなった。

※「ロード中…」が出たままになる状態から、5~10秒で消える程度に改善。

「あのロ編入投票」が始まったので妨害がきたのか?と思ってたw

昼間は大丈夫だったんだけど?

夜8時を回るとお眠なハブなのか?

やってないものに「究極・強化」があった。

あまりの低確率で「眼中」から外れて久しい。

けど、偶然+8になった。

今まで使えなかった上位アイテムを溶かしまくって・・・

なせか28%で成功

+13まで進む。

統率99だから+1欲しいなぁ

ps.2022.10.9

やっと2千万

爵位条件の1つが未達成に戻っていたので、アップデートの前に達成するようにスキルを調整したら、戦力2千万達成、長かったなぁ。

10月末にアップデートがあるから、そこで今後の進路を考えよう。

ps.2022.10.12

アップデートが前倒しに14:00までメンテらしい。

前倒しアップデート?

ps.2022.10.13

今日はサーバのメンテのみ、アップデートは明日らしい。



[Windows]TypeLibraryってドコにあるの?

色々調べてもラチが空かないので、OLEのインタフェースを書いているハズのタイプライブラリィを調べてみる。

まずはタイプライブラリィを登録するにはRegSvr32.exeを使うので、レジストリィを探してみる。

HKEY_CLASSES_ROOT\TypeLib
HKEY_CLASSES_ROOT\WOW6432Node\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\TypeLib

この5か所に登録したプログラム(exeとかdll)のフルパスを登録しているらしい。

WOW6432Nodeは64ビット版Windowsだけだろう。パスこそ違えど、登録内容は同じみたいなので、一般ユーザで見れそうなトコを使えば良さそうだ。HKEY_CLASSES_ROOT\TypeLibが無難かな?

この配下に、

{CLSID}
  {バージョン1} @={TypeLibraryのバージョン1の名前}
    0
      win32 @={バージョン1の32ビット版のプログラムファイルのフルパス名}
      win64 @={バージョン1の64ビット版のプログラムファイルのフルパス名}
  ・・・
  {バージョンn} @={TypeLibraryのバージョンnの名前}
    0
      win32 @={バージョンnの32ビット版のプログラムファイルのフルパス名}
      win64 @={バージョンnの64ビット版のプログラムファイルのフルパス名}

な構成で、プログラムファイルのフルパス名だけが保存されていた。

※Windowsのバージョンごとにこの構成も違うのかもしれないけどね。

ファイルのありかは解ったけど、具体的なインタフェース(メソッドとかプロパティ等)を取得する方法は不明。またTypeLibの直下がクラス識別子 (CLSID)なので名前で検索しようとすると時間がかかりそうだから、一旦ヒットしたらINIファイルにでも保存して再利用した方がいいだろう。

とりあえず、ネットで探してみたら、この辺にやこのあたりに情報があった。

OLEView.EXEを管理者権限で開けば詳しく調べられるし見つけた内容はIDLファイルで保存できる

※管理者権限で開く必要がる。

CLSIDFromProgIDを使って名前からCLSIDを調べられるらしいが、正しい名前を知らないとダメだろうからOLEView.EXEで事前に正確な名前を判っていないと難しそう。

見つからなかったら、全検索して部分一致した名前を列挙するようなヘルプ機能が欲しい。

一応、TypeInfoを大元の情報を探してみる。

ただ、インタフェースで階層化してるトコまで見えてしまうので、

徹底的に調べ尽くしつくしかなく、最後に纏めて目の前のクラスから使えるメソッドを列挙するようにしないと使いにくい。

IDLファイルからADODB.ConnectionがOpenSchemaメソッドを持っていると判るまで

// Connectionを見つけた_Connectionが親らしい
    coclass Connection {
        [default] interface _Connection;
        [default, source] dispinterface ConnectionEvents;
    };
  ・・・
// _Connectionを見つけたConnection15が親らしい
    interface _Connection : Connection15 {
        [id(0x00000015), helpcontext(0x0012c8b8)]
        HRESULT Cancel();
    };
    ・・・
// Connection15を見つけた。これが本体らしい
    interface Connection15 : _ADO {
        [id(00000000), propget, helpcontext(0x0012c918)]
        HRESULT ConnectionString([out, retval] BSTR* pbstr);   // Getterらしい
        [id(00000000), propput, helpcontext(0x0012c918)]
        HRESULT ConnectionString([in] BSTR pbstr);       // Setterらしい
        ・・・
// OpenSchemaを発見
        [id(0x00000013), helpcontext(0x0012c8d8)]
        HRESULT OpenSchema(
                        [in] SchemaEnum Schema, 
                        [in, optional] VARIANT Restrictions, 
                        [in, optional] VARIANT SchemaID, 
                        [out, retval] _Recordset** pprset);
        }

この場合、Connectionの本体はConnection15らしいから、クラスのテンプレを作るならメソッドを列挙すれば良さそう。

このあたりのソースを改造しoleaut32.dllのLoadTypeLibでComTypes.TYPEKIND.TKIND_DISPATCHをチェックする様に

                    if (ta.typekind == ComTypes.TYPEKIND.TKIND_DISPATCH)
                    {
                        char[] numChars = { '0', '1', '2', '3', '5', '6', '7', '8', '9' };
                        if (sname.IndexOf("_") != 0 && sname.IndexOf("Events") == -1 && sname.IndexOfAny(numChars) == -1)
                        {
                            Console.WriteLine("DISPATCH {0} cFuncs:{1}, cImplTypes:{2}, cVars:{3}", sname, ta.cFuncs, ta.cImplTypes, ta.cVars);
                            int href;
                            info.GetRefTypeOfImplType(-1, out href); // -1は、謎仕様
                            ComTypes.ITypeInfo info2;
                            info.GetRefTypeInfo(href, out info2);
                            info2.GetTypeAttr(out ppta);
                            ComTypes.TYPEATTR ta2 = (ComTypes.TYPEATTR)Marshal.PtrToStructure(ppta, typeof(ComTypes.TYPEATTR));
                            if (ta2.typekind == ComTypes.TYPEKIND.TKIND_INTERFACE)
                            {
                                int con2;
                                string sname2, doc2, hlp2;
                                info2.GetDocumentation(-1, out sname2, out doc2, out con2, out hlp2);
                                Console.WriteLine("INTERFACE {0} cFuncs:{1}, cImplTypes:{2}, cVars:{3}", sname2, ta2.cFuncs, ta2.cImplTypes, ta2.cVars);
                                for (int j = 0; j < ta.cImplTypes; j++)
                                {
                                }
                            }
                        }
                    }

GetRefTypeOfImplTypeの謎仕様は偶然ココで見つけた。

Pythonのソースだけど、これが参考になるかもしれない。tlbparser.py のdef parse_typeinfo

MSのページでは

[in] index

ハンドルが返される実装された型のインデックス。有効な範囲は 0 からTYPEATTR 構造体のcImplTypesフィールドまでです。

となっているのに-1を渡すと得られるインデックスをGetRefTypeInfoに渡すと、その型が引き継いでいるインタフェース(typekind が ComTypes.TYPEKIND.TKIND_INTERFACE)な情報を得られる。

DISPATCH Properties cFuncs:11, cImplTypes:1, cVars:0
DISPATCH Property cFuncs:13, cImplTypes:1, cVars:0
DISPATCH Error cFuncs:14, cImplTypes:1, cVars:0
DISPATCH Errors cFuncs:12, cImplTypes:1, cVars:0
DISPATCH Fields cFuncs:17, cImplTypes:1, cVars:0
DISPATCH Field cFuncs:29, cImplTypes:1, cVars:0
DISPATCH Parameters cFuncs:13, cImplTypes:1, cVars:0
※名前に_や番号やEventsが付いていたものは除外

とインターフェースの情報の数が得られたので一歩前進かな?



[C#]Type.FindMembersとか

Type.GetType({型名})で取得できるタイプの中身を調べるType.FindMembersで見つけたサンプルをちょっこっと加工したもの。

// ToSearch フィルター
public static bool ToSearch(MemberInfo objMemberInfo, Object? objSearch)
{
    // Compare the name of the member function with the filter criteria.
    return true; // 常にtrueなのでFilterはnull以外なら何でもいい。
}
// FindMembers:MemberTypes.xxxx
public static void GetMemberTypes(Type t, MemberTypes mt, List<string> list)
{
    string filter = "*"; // 実はnull以外なら何でもいい。
    var mems = t.FindMembers(mt,
        BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance,
        new MemberFilter(ToSearch),
        filter);
    if (mems.Length > 0)
    {
        for (int j = 0; j < mems.Length; j++)
        {
            list.Add($"{t} {mt}'s supported: {mems[j].ToString()}.");
        }
    }
    else
    {
        // list.Add($"{t} does not implement the {mt}'s {filter}.");
    }
}
// GetMemberTypesAll
public static void GetMemberTypesAll(Type t, List<string>list)
{
    if (!listA.Exists(x => x == t.FullName))
    {
        listA.Add(t.FullName);
        GetMemberTypes(t, MemberTypes.Constructor,list);
        GetMemberTypes(t, MemberTypes.Custom, list);
        GetMemberTypes(t, MemberTypes.Event, list);
        GetMemberTypes(t, MemberTypes.Field, list);
        GetMemberTypes(t, MemberTypes.Method, list);
        GetMemberTypes(t, MemberTypes.NestedType, list);
        GetMemberTypes(t, MemberTypes.Property, list);
        GetMemberTypes(t, MemberTypes.TypeInfo, list);
        //以下はオマケ。
        GetTypeInterfaces(t, list);
        GetMembers(t, list);
    }
}
// FindInterfaces
public static List<string> listA = new();
public static void GetTypeInterfaces(Type t, List<string> list)
{
    string filter = "*";
    TypeFilter myFilter = new TypeFilter(ToSearch);
    Type[] myInterfaces = t.FindInterfaces(myFilter, "*");
    if (myInterfaces.Length > 0)
    {
        list.Add($"{t} implements the interface {filter}.");
        for (int j = 0; j < myInterfaces.Length; j++)
        {
            list.Add($"> Interfaces supported: {myInterfaces[j]}.");
            //
            string iTypename = myInterfaces[j].ToString();
            Type? t2 = Type.GetType(iTypename);
            if (t2 != null)
            {
                if (!listA.Exists(x => x == t2.FullName))
                {
                    List<string> list2 = new List<string>();
                    GetMemberTypesAll(t2, list2);
                    list.AddRange(list2);
                    listA.Add(t2.FullName);
                }
            }
        }
    }
    else
    {
        // list.Add($"{t} does not implement the interface {filter}.");
    }
}
// GetMembers
public static void GetMembers(Type t, List<string> list)
{
    // Get the MemberInfo array.
    MemberInfo[] members = t.GetMembers();
    // Get and display the name and the MemberType for each member.
    list.Add($"Members of {t.Name} ({members.Length})");
    foreach (var member in members)
    {
        MemberTypes memberType = member.MemberType;
        list.Add($"> {member.Name}: {memberType}");
    }
}

をこんな感じで呼び出す。

// 「コンソール・アプリ(>NET Framework)」のC#は、newの型省略表記やNull容認mの指定等が未対応の為
// 「コンソール・アプリ」でプロジェクトを作成。
// プロジェクトへのCOM参照: Microsoft ActiveX Data Object 6.1 Library
// using System.Reflection;

// コンパイラが変数の型宣言に伴う処理を行うことで
// Type.GetType("ADODB.Connection")で情報を得られる様にする。
public static ADODB.Connection dummy = null;
public static ADODB.Recordset? recordset = null;
public static ADODB.Connection? connection = null;
public static ADODB.Field? field = null;
//
public static void Main(string[] args)
{
    Type? t = Type.GetType("ADODB.Connection");
    List<string> list = new ();
    GetMemberTypesAll(t, list);
    //結果表示
    Console.Write("\r\n" + string.Join("\r\n", list.ToArray()) + "\r\n");
}

実行してみると、

ADODB.Connection implements the interface *.
> Interfaces supported: ADODB._Connection.
ADODB._Connection Method's supported: System.String get_ConnectionString().
ADODB._Connection Method's supported: Void set_ConnectionString(System.String).
ADODB._Connection Property's supported: System.String ConnectionString.
ADODB._Connection implements the interface *.
> Interfaces supported: ADODB.Connection15.
ADODB.Connection15 Method's supported: System.String get_ConnectionString().
ADODB.Connection15 Method's supported: Void set_ConnectionString(System.String).
ADODB.Connection15 Property's supported: System.String ConnectionString.
ADODB.Connection15 implements the interface *.
> Interfaces supported: ADODB._ADO.
Members of _ADO (0)
Members of Connection15 (3)
> get_ConnectionString: Method
> set_ConnectionString: Method
> ConnectionString: Property
> Interfaces supported: ADODB._ADO.
Members of _Connection (3)
> get_ConnectionString: Method
> set_ConnectionString: Method
> ConnectionString: Property
> Interfaces supported: ADODB.Connection15.
> Interfaces supported: ADODB._ADO.
> Interfaces supported: ADODB.ConnectionEvents_Event.
Members of ConnectionEvents_Event (0)
Members of Connection (0)ts_Event (0)
Members of Connection (0)

ほとんど情報を得られなかった。


  • タグ:


top