Pythonでwindows通知(トースト・バルーン)を出す方法

Python Advent Calendar 2019の14日目の記事です。

速攻作れるだろ~と思っていたら、意外とめんどくさかった。
なにより日本語の標準モジュールだけで実現する解説記事が多分ない。(多分)

色々調べたので、忘れないうちに未来の自分と同じことをしたい人へ共有

作り方なんていいんだよ!ソースくれって人は下記のソースをぶっこんで使ってどうぞ。
GitHub-easyToast
ちなみにLicenceはMITLicenceです。
あ、スターください。

また、今回勉強しつつ調べてまとめているので、
もし間違っているところがあればツイッターなどで教えて下さい

今回は利用する標準モジュールのみで実装を行う。

■トーストとは?
古すぎないWindowsでなにかApplicationからのお知らせがあるときに
画面右下に出てくる通知のようなもの。
バルーンと呼ばれることもあるが、厳密にはこれはトーストである。
※バルーンは小アイコンからの吹き出し

■トーストを出すまでの流れ
1. Pythonでctypeを利用する
2. APIにあった構造体を用意する
3. WindowsAPIを利用できるように読み込む
4. LoadImageWで画像アイコンを利用できるようにする
5. Shell_NotifyIconWで通知申請を行う

なにがなんのことかわからないと思うので、順番に説明する。
サンプルコードが何度か登場するが、基本的には以下のimportを行っている前提で話をすすめる。

import os
import ctypes
from ctypes import Structure, windll, sizeof, POINTER, WINFUNCTYPE
from ctypes.wintypes import ( 
    DWORD, HICON, HWND, UINT, WCHAR, WORD, 
    BYTE, LPCWSTR, INT, HINSTANCE, BOOL, HANDLE
    ) 

■Pythonでctypeを利用する
Windowsでトーストを出すにはWindowsAPIからバルーンを出すリクエストを出す必要がある。
WindowsAPIを叩く際にbathなどを経由してもいいが、PythonからWindowsAPIを叩く良いやり方はctypeを使う

ctypeとはPythonでCの関数ライブラリを使うことが出来るものだ。
簡単なコードでとりあえずctypeを試したいのであれば、以下の記事がとても参考になった。
Python から Windows API を呼び出す – MessageBox の例
ctypeの詳細を知りたい方は以下をどうぞ。
ctypes — Pythonのための外部関数ライブラリ

■APIにあった構造体を用意する
ctypeを使って、まずはAPIを叩くための構造体を準備する。
ctypesのStructureを継承したクラスで構造体を定義します。

最初聞いたときなんのこっちゃと思いましたが、
ざっくりいうと、WindowsAPIになんらかの動作を指示する際に渡すデータの集まり(タイトルとか表示方法とか)には
事前に決められた構造体(何番目になんの型のなんて名前のデータが入るなどの定義)を用意する必要があり、
後述するWindowsAPIの仕様書(英語)を片手に準備する必要があります。

今回、トーストを出すために作成する必要がある構造体は以下

class GUID(Structure):
    _fields_ = [
        ("Data1", DWORD),
        ("Data2", WORD),
        ("Data3", WORD),
        ("Data4", BYTE * 8)
    ]

class NOTIFYICONDATAW(Structure):
    _fields_ = [
        ("cbSize", DWORD),
        ("hWnd", HWND),
        ("uID", UINT),
        ("uFlags", UINT),
        ("uCallbackMessage", UINT),
        ("hIcon", HICON),
        ("szTip", WCHAR * 128),
        ("dwState", DWORD),
        ("dwStateMask", DWORD),
        ("szInfo", WCHAR * 256),
        ("uVersion", UINT),
        ("szInfoTitle", WCHAR * 64),
        ("dwInfoFlags", DWORD),
        ("guidItem", GUID),
        ("hBalloonIcon", HICON),
    ]

具体的なやり方などは下記が参考になった。
Python: ctypesパターン集

GUID と NOTIFYICONDATAW ってのを使うんだなーくらいで今は大丈夫。

■WindowsAPIを利用できるように読み込む
WindowsAPIを読み込んで、引数の定義と戻り値の定義を行う
今回利用するAPIはLoadImageとNotifyIconだ。
▼サンプルコード

LoadImageW = windll.User32.LoadImageW
LoadImageW.argtypes = [HINSTANCE, LPCWSTR, UINT, INT, INT, UINT]
LoadImageW.restype = HANDLE
    
Shell_NotifyIconW = windll.Shell32.Shell_NotifyIconW
Shell_NotifyIconW.argtypes = [DWORD, POINTER(NOTIFYICONDATAW)]
Shell_NotifyIconW.restype = BOOL

API名の最後にWがついているが、WindowsAPIは最後にWがつくのと、Aがつくものがあり、
利用している文字コードなどの違いがある。今回はWを利用している。

必要な引数等はMicrosoftのドキュメントが参考になった。
Shell_NotifyIconW function
LoadImageW function
NOTIFYICONDATAW structure

ひとまず、これでWindowsAPIが利用可能になった。

■LoadImageWで画像アイコンを利用できるようにする
バルーンで利用しているアイコンは.icoといった拡張子の画像ファイルだ。
変換サービスやフリー素材などがあるので、適当な画像を用意しよう。
また、アイコンなしでトーストを出す方法も記載するため、この項目は飛ばしても構わない。

hicon = LoadImageW( None, icon, 1, 0, 0, 0x00000050)

これはLoadImageWを呼び出すコード。
引数の詳細は上記Microsoftのドキュメントに記載があるが、ざっくりと解説。

・第一引数
画像を使う場合はNoneを指定する(nullを指定したことになる)
・第二引数
今回は画像のファイルパスを指定する。
・第三引数
読み込む画像の形式を指定する。
アイコンは1を指定。試していないけど0だとビットマップが読み込める?
・第四引数
アイコンの幅を指定する。0なら自動
・第五引数
アイコンの高さを指定する。0なら自動
・第六引数
オプションフラグを設定する。

16進数で記載されていて最初はよくわからないかもしれないが、
WindowsAPIでは有効にする設定の数値を合計したものを指定する。
例えば、0x00000001の設定と0x00000002の設定を有効にするのなら、0x00000003を指定する。(16進数なので繰り上がりに注意)
足し算でなく、ビット演算で合算してもよい。 0x00000001 | 0x00000002
どのような設定値があるかは上記マニュアルを確認する。

今回はLR_DEFAULTSIZE(0x00000040)とLR_LOADFROMFILE(0x00000010)を指定している。
成功すればイメージのハンドルが返却される。

5. Shell_NotifyIconWで通知申請を行う
まずはWindowsAPIに渡すデータを作成する。
▼サンプルコード(画像表示あり)

flags = 0x00000016
infoflag = 0x00000034
mem_size = sizeof(NOTIFYICONDATAW)
notify_data = NOTIFYICONDATAW(
        mem_size, 0, os.getpid(), flags, 0, hicon, "tips", 
        0, 0, "message", 4, "title", infoflag, GUID(), hicon
)

▼サンプルコード(画像表示なし)

hicon = None
flags = 0x00000014
infoflag = 0x00000000
mem_size = sizeof(NOTIFYICONDATAW)
notify_data = NOTIFYICONDATAW(
        mem_size, 0, os.getpid(), flags, 0, hicon, "tips", 
        0, 0, "message", 4, "title", infoflag, GUID(), hicon
)

さて、とうとう通知を出す。
それぞれ何をしているかざっくり解説する。
※詳細は上記Microsoftのドキュメントを確認されたし

第一引数
作成した構造体のメモリサイズを指定する。
ctypeのsizeofで取得が可能
第二引数
今回は13引数を指定するため、読み飛ばされる
第三引数
実行しているPIDを取得する。上記サンプルでは自身のPIDを取得している
第四引数
どんな情報があるかやどんな表示をするかなどを指定する。
今回は NIF_ICON,NIF_TIP,NIF_INFOを有効にした。
画像を利用しない場合はNIF_TIP,NIF_INFOを有効にする。
※詳細は上記Microsoftのドキュメントを確認されたし
第五引数
LoadImageWで生成したハンドルを指定する
画像表示を行わない場合、NONEを指定
第六引数
アプリ名や詳細の記載を行う。
トーストのアプリ名が以前はここの指定内容になっているような記載をみたが、特に反映されなかった。
第七引数
画像の情報の取り扱い?
利用しないので0を指定する
第八引数
0を指定する
第九引数
通知に表示するメッセージを指定
第十引数
シェルのversionを指定する。
第十一引数
通知のタイトルを指定する。
第十二引数
利用するアイコンの設定を行う。
0x00000001や0x00000002を加算するとシステムに用意されたアイコンを利用できる
他にもいくつかあるので、上記のマニュアルを参照
今回はNIIF_USER,NIIF_NOSOUND,NIIF_LARGE_ICONが有効になっている。
通知時に音を出したいなら0x00000010を引く。
第十三引数
GUIDを与える。なぜ設定するかはドキュメント読むだけだとわからなかった。
第十四引数
LoadImageWで生成したハンドルを指定する
画像表示を行わない場合、NONEを指定
第五との違いはタスクバーのアイコンか、トーストのアイコンかの違い。
今回はどちらも同じものを設定する。

データを渡す。
▼サンプルコード

Shell_NotifyIconW(0x00000000, notify_data)
Shell_NotifyIconW(0x00000002, notify_data)

第一引数の0は表示、2は通知を汚さないように削除している。

以上でトーストをPythonから利用できる。
きっと他のWindowsAPIにも応用できるはずだ。

最後にトーストを出す便利ソースを紹介する。
GitHub-easyToast
ぜひスターを(ry

万魔の塔を二人で30万取る方法(サポ入り)

万魔の塔で2週連続4回以内に30万達成をしたので、やり方をメモ。

※1災と2災共にはぐメタ1匹ずつ、3はなし。
※占いは慣れが必要かも。

戦闘は頑張るけど、事前準備は雑で! 週課なんでね!

■構成
占い・バト・賢者(サポ)・デス(サポ)
構成を変えるのがめんどくさいので全て同じ構成でいっています。
肉の方は耐性アクセだけ変えています。
サポートは野良サポートをわりとざくっと選んで雇っています。
 →お互い雇い合えるなら楽かも

■装備

▼全員共通で必要な耐性
麻痺・眠り・即死・呪文耐性

即死は無くても可
肉は指輪等で調整してもOK

必要なアクセ
機神の眼甲・竜のうろこ

▼占い
片手剣・盾
体上下攻撃魔力
首アクセは1災は智謀の首飾り、2以降は竜のうろこ
ベルトは片手剣雷(持っていれば)

デッキ

▼バトマス
ハンマー二本、両手剣
ベルトはハンマー土(持っていれば)
テンションバーンの宝珠

▼賢者(サポ)
扇・盾
腕は詠唱速度

▼デスマスター(サポ)
鎌・腕は詠唱速度

サポートはこだわるならペアの方を雇うと楽です。

■立ち回りで意識すること

▼全災厄共通のポイント
アイテムはすべて回収する。占いがメインに回収するが数が多いときはバトも拾う。
周りに敵がいないときはサポートの近くに寄る。
テンションがないときの攻撃は極力避け、ターンを貯めたりバフを振っておく。

▼サポの作戦
デスマスターは開戦時いのちだいじに、しにがみのきしを召喚したらバッチリ(1のみガンガンでも可)。
賢者はバッチリ。1災のボスや3災の10以降、崩れ気味のときにいのちだいじにに調整

▼占いの立ち回り
力と教皇と恋人(toバトマス)を可能な限り維持する。
皇帝はバト>賢者>デス>占いの順で引くたびに振る。効果時間が5分なので、切れそうなら更新する(皇帝は二枚でもいいかも)。
塔はなるべく遠くを優先して倒す。
オーラを作れるように直近で使ったモンスターカードを優先して切る。
魔王のいざないは10まではボスに打ち、10以降はぐだりそうなときに雑魚にまとめて打つ。
使うカードがないときはすぐリセットベール。
SHTを切らすくらいならギガブレ、周りに敵がいるがカードないときもギガブレ。
はぐメタは片手CTで倒す。

5の倍数のボス登場時は月を敷いておく。
ボス前に魔王のいざないを振れたら振る。
ボスはボスより周りの雑魚を意識、高火力は巻き込みながら使う。

▼バトマスの立ち回り
ランドインパクトをいい感じにぶち当てる。
ボスまでにCTが貯まりそうならプレートも打っていい。
テンションバーンを維持する。

ボスが出てきたらプレート→アースクラッシュと周りを巻き込みながら当てる。
その後は天下無双。
ボス討伐に時間がかかりそうな場合は両手剣に持ち替えて天下や大旋風斬り。

■各災厄ごとのポイント

▼1災
死亡しないことを意識する。ちなみに先週も今週も痛恨と即死で1人ずつ死んだ
時間は多少余裕があるので死なないことが大事。
目標はボス討伐で12.5万

▼2災
10以降はキラーマシン用に月を配置する。陣にキラマが誘導できるように立つ。
一番最後のボスは倒さないので、15以降でCT技は惜しまない。
青いデブドラゴンは怒り時に占いがロスアタ。
はぐメタが2~3匹出たらら楽に30万行けそう。
目標は18以降で時間切れ11.5万

▼3災
石像は幻惑が入らない。占いも協力してなんとしてでも早く倒す。
石像の占い怒りは放置(占いがファランクスやいば)、他怒りは占いがロスアタ。スケープガード打てるなら打ってファランクスかアイギス

10のボス時は次にキラパンが出てくることを意識してアイギスをふったり月を置いておく。
キラパンが出現したらとにかく倒すことを優先。CT技も惜しまない。葉っぱを使うこともある。
おたけびは占いが打ってもいいかもしれないけれど、とくにやっていない。
おにこんぼうが出れば楽に。
目標は12以降で時間切れ、6万

サポ2で30万が取れると気楽に回せて良い

(C)2017 ARMOR PROJECT/BIRD STUDIO/SQUARE ENIX All Rights Reserved.(C)SUGIYAMA KOBO(P)SUGIYAMA KOBO

find grepコマンドするとき文字化けファイルを取り除く方法

サーバー上でfindコマンドを叩き、grepしてxargsで渡す・・・
そんなコマンドを叩くときにファイル名が壊れたファイルが邪魔をする。
そんなファイルを回避するのに手こずり、応急処置を思いついてからは作業がさくサクサク進んだのでメモ。

応急処置なので、場合によっては弾きたいファイルが弾ききれないかもしれないし、除くたくないファイルが除かれるかもしれない。

※もっといいやり方あったら教えてください。

find . | grep .ini | xargs cat | grep root

こんなコマンドを叩くとき、文字化けしたり、文字コードの異なるファイルがいると途中で止まってしまう。
なので以下を書き足す。

find . | grep .ini | grep -v ‘[亜-熙]’ | xargs cat | grep root

ファイル名が想定では漢字が含まれないときにしか使えないし、化け方次第では漏れる。
しかし、私の環境ではなんとかなった。

ちなみに ‘[亜-熙]’は
第1水準と第2水準の漢字を指定している。文字化ければ大体漢字が入るだろうという雑な対応。
ちなみに文字コードがCP932なら、纊-黑を追加するといいらしい。

EXCELで最初に出てくる指定値以上(以下)の条件を満たす行を取得

エクセルであるセルの範囲で条件を満たす一番上の行を取得する方法について、ちょっとつまづいたのでメモ。

★前置き
MATCHに同値であるものを探すオプションがあり、以上や以下が指定できるため、解決と思っていた。

しかし、MATCHはソートされていることを前提としている。
■参考
MATCH関数(Microsoftサポート)

つまり、以上、や以下でなく同値であるものを探す場合や、探査する列がソートされている場合はMATCHを利用するだけでよいが、
範囲内の条件を満たす、一番上の行を取得といった動作はしないのだ。
※MATCHで以上を指定すると、条件を満たすいずれかの行をとってきているようだ。二分探索とも違うし、アルゴリズムは不明。
※Microソフトがソートしろといっているからソートしないで利用すれば、よくわらかない動きをしてもしょーがない。

今回はソートを行わずに条件を満たす最初の行を取得したい。

★解決策
配列数式を利用する。

=MIN(IF([探索する範囲と条件],ROW([探索する範囲の行数])))

探索する範囲と条件 : A1:A10>100 など
探索する範囲の行数 : (A1~A10を探索するなら)1:10

気をつける点は・・・
セルの中身を確定する際にShift+Ctrl+Enterで確定させる。(ちゃんと確定させると入力した内容に中括弧がつく)
配列数式を利用する際は必要な使い方らしい。わかりにくい。
ただエンターを押してしまうと一番上の数値(配列としてみたときの最初の値)が表示されてしまう。

エクセルを利用する場面はなかなか無いけれど、仕事上どうしても使わないといけないときの忘却録

Pythonで設定ファイルをいいようにするクラス

自分用で覚えがき

Pythonで標準で設定ファイルをいじいじする機能があるじゃないですか。(configparser)

自分用のツール作るときはソースに直書きだったけれど、配布のこと考えたり、取り回し考えると
設定値は外だししてたほうがいいんですよね。

ただ、configparserってファイルないときや設定値がないときの処理がめんどくさくて、
機能追加したときに各自propertiesを追記してもらわないといけなかった。
足りない設定値は自動追加しておいて、値書き換えるだけにしたくてもそもそ書いてた機能をきれいにまとめて
ラッパークラスを書いた。

ソース

基本的にやってくれることは、ファイルなければつくって、設定値なければdefault値突っ込む。
なにか必要になれば都度更新すればいいかな。
どこにでもありそうだけど、自分が使いやすいようにしてみた。

常闇を二人で日課討伐のススメ(サポ入り)

Ver5で、常闇のレベルが選択出来るようになりました。

これを期に仲良しなフレンドと二人討伐を日課にしてはいかがですか?

以下のような方々に向けた記事になります。

*野良で毎日PTを募集するのは億劫
*日課はさくさく終わらせたい
*四人も固定を集めるのがめんどくさい
*時間を決めてやりたくない
*毒50アクセさえあれば十分(本当は幻惑100ほしい)

以前から常闇Ⅰのサポート討伐は盛んに行われて、記事も沢山ありますが、いざレグナライトを集めようとしても以下の問題がありました。

*常闇1は1箇所だけだった
*いつ1か分からない。調べるのもめんどくさい
*サポート探すのが手間
*Switchにしてからチャットめんどくさい

さて、ではレベルが選べるようになって何か変わったでしょうか。

*いつ行っても3匹ともレベル1がいる
*毎日ダークグラスを合成可能
*常闇はレベルあげても1個ずつしか増えないためレベル1は時間効率がいい

そして、二人討伐のメリットは
*今いける?いくいくー!など、時間調整が圧倒的に楽
*ペットやペアのサポートを借りれば良いのでサポートを探す必要がない
*やり方をわかっている人といくのでグダらない

といったメリットがあります。

この前野良で、4やろうとしたら、1募集や2募集、5募集などで緑玉が分散してしまっていて、ptが組みにくくなっていました。
一緒に遊べる友達がたった一人でもいればダークグラスが作れちゃうんです!!

■構成や耐性
今回紹介するptは
【バト、バト、天地、キメラ】
になります。

人がバトマスを操作して、天地をどちらかがサポートとして預けたものを借りてもらい、キメラを用意します。
天地は最悪酒場を漁ってもいいですが、日課にするならどちらかが装備揃えちゃうのが楽ですよ。

★天地
【必須耐性】
毒100、封印100
【あると良いやつ】
麻痺100、呪い100、ブレス100、金ロザ

ちなみに武器は扇とスティックどちらでもいいです。
スティックの場合はキラポンをまいてくれるので、ダークキングのやまのはどうや、レグナードの雷を防ぐことができます。
ただ、寄ってきてしまうので範囲に巻き込まれるのことがあるため、気になる方は扇がいいと思います。
作戦はいのち大事に。カカロン以外召喚したらいのち大事にしてないです。

★キメラ
【必須耐性】
毒100、封印100、呪い100
【なくてもいいがあるといいやつ】
麻痺100、詠唱速度錬金、金ロザ、回避足

キメラは聖女と天使とザオラルだけオンにし、ホバリングを覚えさせます。
ベホマラーや祈りは不要。
懐きが足りなくても転生11なくても上記スキルがあればいいです。残りはすばやさぶっぱ。
ブレス耐性とかはいらないです、どうせ死ぬので。
作戦はいのち大事に。天使しなかったらいのち大事にしてないです。
耐性まとめて持たせた方が楽ですが、敵に合わせて都度変えてもいいです。

★バトマス
バトマスは操作キャラ。
両手剣もってれば炎ベルト炎両手でも無属性でもいいです。宝珠とかもある方が当然早くなりますけど、なくていいです。
君に必要なのは、すてみと天下無双。

耐性装備はまとめてもいいですけど、支援職に比べて揃えるのが大変なので、都度顔アクセやらを切り替えでいいと思います。

【耐レグナード】
★必須耐性
呪い、封印
★あるといい効果
麻痺、死亡時バイシ残り、金ロザ

ブレスとかはいらない。

聖女でブレスを耐えるので、状態異常耐性はあったほうがいいです。
戦闘中気をつけることは直線攻撃のウィングダイブをさけることと、テールジャンプをみたらジャンプすること。崩れてなくて聖女あるなら天下無双中にテールきちゃった〜とかやっててもいいです。かわいい。

ブレスや雷を味方を巻き込まないように気をつけます。

開幕キメラ死んだときなどは葉っぱ使うこともありますが、すてみと天下無双、好みでプラブレやブレガすればわりとあっけなく倒せます。
あとレグナライト拾ったらそこからすぐルーラできますよ。

【対ダークキング】
▼必要耐性
毒100
▼あるといいやつ
金ロザ

毒アクセ以外いらないです。
持ってない方はとりあえず毒顔アクセ取るといいと思います。
ダークキングレベル1はクリスタルを1個しか召喚しないので、引っ張って避けるとか気にしなくていいです。
クリスタルから出るビームはダークキングが配置した瞬間の一直線上とその90度へ交互にだすので、なんとなーくあたらない位置にいきます。やみのはどうはさけれたら避けましょう。
クリスタル増えてきたら相撲させて場所を移すのも良いですが、引っ張りすぎるとシャウト打ってくるので適当に攻撃をうけときましょう。
意識することは死にそうな人を毒で巻き込まない。
クリスタルビームとやみのはどうはさける。
くらいです。

【対イカ】
▼必須耐性
幻惑、呪い、封印
▼あるといいやつ
混乱、金ロザ
▼余裕ありすぎてもっとつけたいなら
麻痺

イカはすみはきともやもやしてからうつ技を極力さけます。
雷をまきこまないように。
デスファウンテンはやいばで耐えられますが、別にやらなくていいです。(日課ですし)
ゲノムバースは同じ色の陣にのりましょう。
慣れてきたら8回屈伸したあたりで石を壊して全身全霊うってもいいですが、天地カカロンが平気で壊してくるのでそれを念頭において動いたほうがいいです。
こいつも相撲しすぎると回転するので、やるにしても相撲はほどほどに。(やらなくていいです)

★共通していえること
基本みんなばらける
天下無双はすべてを解決する
キメラかわいい

みんなも!ダークグラスを!つくろう!!

ミストオーバーの紹介と探索前に知っておきたいこと

どうしてこうなってしまったんだ。
どうして欲をかいてしまったんだ。

みんなが、、、!仲間が、、、!

全てを投げ捨てて、全力で逃走した。
次の未来のために。死んだ仲間を無駄にしないために。
ダンジョンから裸足で逃げ出してきたーー

僕です。

アークシステムワークスより2019/10/10発売のローグライクRPG【ミストオーバー】めちゃくちゃ楽しいですね。
常にリスクとリターンと隣り合わせ、石橋を叩けば世界が滅び、失った仲間はもう戻らない。

世界樹の迷宮(ATLAS発売)でのハードコアな探索 帰還ゲームの最高難易度を踏破し、ファイアーエムブレム(任天堂発売)でルナティックの世界を救っていても、手に汗握るターン制RPGです。

ここでは、ミストオーバーに挑戦しようか悩んでいる人、ミストオーバーに挑もうとしているけど、ネタバレにならない範囲ではじめに知っておいた方がいい情報をお伝えします!

■この記事で【書かない】こと
○○が強い、○○がおすすめといった評価情報
ボスが○○してくる。○○の敵の倒し方などの攻略情報
ゲームで初回ボス以降の全ての情報

■この記事で【書く】こと
ゲームオーバーの条件
キャラロストの仕様
終末の時計の仕様
初期スキルについて

ゲームを始める上で、おそらく説明書があれば買いてありそうな各種仕様について、知りたい方に向けた記事です。
所謂、攻略に関わるネタバレや知らない方が楽しい情報については記載しないつもりです。

チュートリアルに補足したような情報を心がけていますが、不安な方は戻るボタンを押してくださいませ。

■ゲームオーバーの条件
このゲームではゲームオーバーの条件が二つあります。
①終末の時計が正午を指すこと。
②キャラクターが全滅すること。

①の終末の時計とは、時計が一定時刻になるとどんな状態であれセーブデータが消える時計となっています。
私が発売日にこのゲームを買わなかった理由であり、このゲームのリスクとリターンをより面白くする仕様です。

私、ペルソナシリーズみたいに有限回しか出来ないものや、ピクミンみたいにゆっくり遊んでるとゲームオーバーになるもの、苦手なんですよね。
ダンジョン隅々まで探索したいし、、、

このゲームの終末の時計は時限とは少し異なります。
このゲームではのんびり街を探索しててもダンジョンを隅々まで探索しても時計は進みません。

ダンジョンの宝箱を全部あけなかった。敵を全部倒さなかった。仲間が死んだ。など、あまり良くない探索をした際に時計が進みます。

また、低レベルのキャラクターで全部の敵を倒し宝箱を全て開け、その他諸々やっていれば時計が逆に動きます。

絶対的な制限時間でなく、怠けさせないための仕組みです。
とはいえ、費用的な問題で無限に潜って無限に回復とはなかなかいかないのですが、、、
※これを知っていたら発売日に買ってた、、、

②キャラクターが全滅すること。
このゲームではキャラクターは死亡するともう戻っては来ません。
しかし、お金があればある程度レベルの高いキャラクターを雇用し直せるので、誰かが死んだら終わりといったものではないです。(キャラクターの死亡については別項で書きます)
ただ、だれかも失っても辛いながらも、詰んではいないため、お気に入りのキャラクターが死んでも前に進むしかありません。(ファイアーエムブレムみたいに仲間が死んだらリセットとか気軽にできません。)

このゲームオーバーとキャラロストのバランスが絶妙で、時には時計を進める事をいとわず、逃げ出す選択が必要かもしれません。

■キャラクターロストの仕様
このゲームではキャラクターロストが売りですが、意外としなないし、時にはあっさり死にます。
例えばバフ巻きが行動不能になり仲間にクリティカルが飛んでくる不運がありHPがなくなってもこのゲームはまだ死にません。
ヌルい仕様と捉える方もいるかもしれませんが、ここで生まれる駆け引きが本当に1ターン1ターン重みが違います。

キャラクターが死亡したとき、HP0の状態でそのキャラクターは【生死の狭間】という状態になります。

この状態で以下が起きると死亡します。
①生死の狭間の状態で3ターンが経過すること
②1でも追加でダメージを受けること

全力で仲間を守りきれば貴方の大切なキャラクターはまだ死なないのです。

では生死の狭間を治すにはどうすればいいか?
①HPを回復する

たったこれだけ。蘇生薬もいりません。
もっといえば生死の狭間のキャラクターも行動可能なため、自分に回復を使えば死なないです。ワォ!

※ただ、生死の狭間を経験すると、そのダンジョン中【後遺症】というバットステータスがかかります。

行動順の制御やタゲ取りの工夫で仲間を蘇生できたときの安堵はこのゲームのリスクを背負っているからこその体験だと思います。

■不運にもキャラクターが死亡してしまった場合
キャラクターが死亡してしまったとき、そのキャラクターはもう戻ってきません。
しかし、そのキャラクターの装備品は少し強い合成材料として【他の仲間が帰還できれば】遺品として持ちかえることができます。

また、メニューから死因と遺影がみれます。

■キャラクターが死ぬと詰むの?
パラディンが死んだらゲームクリア不能みたいなことはありません。
施設のレベル次第ですが、ある程度レベルの上がったキャラクターを再度雇いなおす事が可能です。

じゃあ雇い直して特攻すればよいとお考えのそこの貴方。
死んでも立て直せるけれど、死が軽くなるほどこのゲームは簡単ではないのです。
雇い直すには以下の欠点があります。

①高レベルは1レベルから育てたときよりもスキルポイントが少ない
②何をするにも金がかかるので、雇用費がバカにならない
③レベル1も雇えるが育成する時間を取れない
④初期スキルが異なる
⑤詳細は書かないがパッシブスキルのジンクスがなくなる。

手塩にかけたキャラクターは雇うより強いのです。

■初期スキルについて
職業の違いの他に職業の中でも覚えているスキルが違います。
ある程度厳選は必要ですが、粘らなきゃいけないわけじゃないです。

①覚えていないスキルをスキルポイント1使って覚える手段が存在する(はじめから覚えているやつより1ポイント損)
②利用出来るスキルは結局4つ

はじめ覚えるスキルが個体ごとに違うと思っていたんですけど、初期スキルが違うだけで覚えるスキルはみんな一緒でした。
資源も限られているので、多少の妥協は必要かも。

■最後に
死んだ仲間を助けようとして死んでしまった、アリス。
君のことは忘れない。
もう少し撤退が早ければ、もう少し僕が未熟じゃなかったら、、、

少しでもこの霧の世界に挑戦する人が増え、初心者の手助けもなれば。

c++で文字と数字の変換(char-string-int)

競プロのb問題とかといていて、よく忘れるため、自分用のメモ

■数字→文字(int→string)

string s = to_string(int n);

ちなみにto_stringではMinGW系(clangdで利用する場合も含む)32bitのものだとバグがあり使えない。
対応することも可能だけれど、このご時世64bitを利用しておきましょう。

■文字→数字(string→int)

int n = stoi("2223");

ベストプラクティスを知らないが、大体必要な時はこれで対処している。

■文字→数字(cahr→int)

char a = '1';
int n = a - '0';

非常によく使う。string型を配列のように使って1文字取り出す場合も、
char型として扱われるため、頻出。ググるとatoiでやれと言われるが環境によっては使えなかったりしていつも苦労してた。
charは文字のまま使うとa-zなども含めて何番目にある文字か?といったintとしてつかわれるため、0-9に並んでいるので頭の0の番号を引くと、0-9に変換できる。

ubuntuでeuc環境(Solaris)にsshするときの文字化け対策

Windows10でWSLでかんたんにネイティブLinux環境を利用できるようになった。
TeraTermからログインしていた環境にはいるのを代替をしようとしていたが、一つの問題にぶつかりしばらくsshでは利用していなかった。

その問題とは、EUC環境に置かれているsjisのファイルを開いたときに、上手く表示できないやつ。

いや、当然といえば当然なんですけど、TeraTermから開いていたときは文字化けしつつも表示してくれて、iconvなり、ターミナルの設定なりで開きなおしていたんですよ。
それがubuntuからだと表示が死んで以降操作できなくなったんですね。
うっかりsjisファイル参照すると死亡するのはいかんせん使いにくかったんですけど、ubuntu側にコマンド一ついれるだけでおおよそのぞみ通りの動作をするようになりました。

cocotコマンドっていうやつです。

それで、リモート先をEUC-JP、ホスト側をutf-8にして繋げば見事に動作しました。
※導入方法や設定方法はいくらでもネットにあるのでググっていただいたほうが確実です。

ただ、cocot利用で接続を行うと今までLinux環境にはいるときに使っていたsshpassが上手く動かなくなるんで、そこだけはまだ未解決・・・

これでvimターミナル生活 to EUC環境が快適にできるぞー!

vimでフォントサイズ変更するプラグイン

vimでフォントのサイズ変えるときコマンドがvimrcで肥大化してきたのでプラグインにまとめた。
画面映してだれかに見せたり、画面から離れたときにサクッと文字サイズ変えたくない?

githubの操作練習も兼ねてあげてみた。

まだまだやりたいとこあるけどひとまず公開だー。

■FontController
GitHub

■設定例

nnoremap <silent><leader>f :FontControlSizeDown<CR>
nnoremap <silent><leader>F :FontControlSizeUp<CR>

頭に数字指定するとその分でかくなります。
倍率はg:FontController_zoom_agnificationの数字を適当に変えればよいです。

■課題
ヘルプファイルがない
guifont設定されていないとだめ