leopardgeckoのブログ

Macの関連事項など

日本語版ローグ(Rogue 5.4)for macOS よもやま話 その3。<走る>

以前の記事で公開したMac用日本語版ローグ(Rogue)についての独り言の続きです。

今回は走る動作についての説明をしてみます。

シフトキーとコントロールキーの違い

ローグで移動するためには「hjkl」キーをタイプするのは皆さんよくご存知でしょうが、シフトキーまたはコントロールキーを押しながら移動キーをタイプすると走ることができます。

シフトキーを押した場合は、モンスターにぶつかったりアイテムの上に乗って拾ったりするところまで進みます。動かないモンスターにもぶつかってしまうので、むやみに使うと危険なコマンドです。氷の怪物に衝突して一瞬でゲームオーバーになってしまうこともありますから。

コントロールキーを押した場合は、ぶつかる前に自分の隣に何かを見つけると止まります。比較的安全なコマンドだと言えるでしょう。

慣れるまではコントロールキーだけを使った方が良いでしょうが、明らかに止まる必要がないところを駈け抜けるときにシフトキーを使うなど使い分けをすれば動作のサクサク感が上がるでしょう。

言葉だけで動作の違いを説明するのは難しいので、一例を動画でお見せします。

www.youtube.com

 

オプションの「jump」とは

jRogue for macOSでは走るときに動いている様子が一コマ一コマ表示されますが、オプション設定で瞬間移動させることも可能です。そのためには、「o」キーでオプション設定を呼び出し、「移動中の表示を行わない ("jump")」を「True」に設定します。

設定を変えるには、オプション画面が表示されたらリターンキーを押して設定を変えたい行にカーソルを移動し、オン(True)にしたい場合は「t」を、オフ(False)にしたい場合は「f」を押すだけです。

アニメ表示はいらないのでサクサクと進めたい時には便利な設定です。

www.youtube.com

 

オプションの「passgo」とは

オプションの「通路の角で止まらずに進む ("passgo")」で、通路を走るときに曲がり角で止まるかどうかの設定をすることができます。

もともと初期のRogueでは曲がり角で止まるのがデフォルトの動作で、のちのバージョンで曲がった通路でもドアからドアまで一気に走ることができるオプションが追加されたようです。曲がり角で止まらなければならない理由も特にないと思いますので、これは常に「True」にしておいて良いのではないでしょうか。

初期Rogueの雰囲気を味わいたいオールドファンであれば、あえて「False」に設定するのもありでしょう。GUI版のオリジナルモードやCUI版のデフォルト設定は「False」になっています。

www.youtube.com

 

Rogueは非常に古い黎明期のコンピューターRPGですが、走るという単純な行動に対する設定だけでもこれだけのバリエーションがあるのは驚きです。Rogueの制作者たち自身がRogueを愛し丁寧に作っていた証であろうと思います。

GeekToolでお天気表示 改訂版

(以前GeekToolで天気を表示するためのスクリプトを公開したのですが、見直してみると地域やプロキシの変更が面倒そうなのでもっと簡単に設定を変えられるように全面的に改定してみました。前回の記事を読んでいない人にもわかるように記述がかぶりますがご容赦ください。ここのスクリプトは転載や改変なども自由にやっていただいて構いませんが、公開される場合はこのブログがオリジナルである旨の記載を入れてください。

はじめに

GeekToolとはMacのデスクトップをカスタマイズできるソフトです。スクリプト次第で色々なものを表示できて便利なのですが、スクリプトが公開されているものでなければ自分でスクリプトを書かなければなりません。
天気を表示するスクリプトは情報が古くて今では使えないものが多い上に自力で作るとなるとHTMLソースを解析する必要があるなど結構大変な作業なので、AccuWeatherという天気予報サイトを利用したスクリプトをご紹介します。GeekTool自体の使い方は他の入門用サイトを参照してください。

例えば下の画像のような感じで表示させるとします。一番上の小さめの文字が本日の最高・最低気温。一番大きな文字が現在の気温・天気、その左が現在の天気の画像です。中段のずらっと並んだ画像と文字が時間単位の天気予報で、とりあえず16時間後まで表示しています。下段が明日と週末の天気予報です。

f:id:leopardgecko:20170803144326p:plain

現在の気温と天気

現在の気温と天気を表示してリアルな画像の天気アイコンを取得するスクリプトを下に示します。Propertiesウインドウの「Refresh every 〜s」のところで表示を更新する秒数を設定するのを忘れないでください。

このままでは東京都江東区の天気が表示されてしまうので、スクリプトを書き換える必要があります。まずhttps://www.accuweather.com/en/jp/japan-weatherにアクセスして、天気を表示したい市や区の名前をローマ字で入力して検索するとその地域の天気が表示されるようになりますので、そこのURLを記録してください。「https://www.accuweather.com/en/jp/場所/数字/weather-forecast/数字」のような形式になるはずです。下のスクリプトの「# 場所のURL」の下に「weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"」という記述がありますが、この赤い文字で示した部分が表示したい場所のURLです。ここを上で記録したURLに書き換えてください。このURLは他のスクリプトでも使います。

(社内での使用などでプロキシを指定する必要がある場合は、「# プロキシ」の次の行の「weather_proxy=""」を「weather_proxy="--proxy http://hogehoge:8080"」のように適宜書き換えてください)

天気アイコンの画像は「/tmp/weather_now.png」に保存されるので、GeekToolの「Image」をデスクトップにドラッグ&ドロップしてURLを「file://localhost/private/tmp/weather_now.png」と指定してください。上のスクリプトと同じようにRefreshの秒数設定も忘れずに。

画像をリアルではなく他と同じシンプルなものにしたい場合は、スクリプトの最後の方の「https://vortex.accuweather.com/adc2010/images/icons-numbered/」のところを「https://vortex.accuweather.com/adc2010/images/slate/icons/」に変えてください。

# 現在の気温と天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_data=`curl $weather_proxy --silent $weather_url`

# 現在の温度と天気を取得して表示
echo "$weather_data" | grep -A 8 'Current Weather' | grep -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 天気アイコンのナンバーを取得し二桁でゼロパディングする
icon_cur=`echo "$weather_data" | grep -A 2 'Current Weather' | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789' | awk '{printf "%02d", $1}'`

# 天気アイコンナンバーをURLに変換して画像を保存
echo "https://vortex.accuweather.com/adc2010/images/icons-numbered/"$icon_cur"-xl.png" | xargs curl $weather_proxy --silent -o /tmp/weather_now.png

最高気温と最低気温

最高気温と最低気温の表示は以下の通りです。AccuWeatherでは夜になると最低気温のみの表示に変わるのですが、それにも対応させてあります。「場所のURL」は上と同じように天気を表示したい地域のURLに書き換えて、必要がある方はプロキシも書き換えてください。以下のスクリプトも全て同様です。

# 最高気温と最低気温のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_today=`curl $weather_proxy --silent ${weather_url/weather-forecast/daily-weather-forecast}"?day=1"`

# 今日の最高温度と最低温度を取得して表示
echo "$weather_today" | grep -A 6 'Today\|Tonight' | grep  -e 'large-temp\|small-temp\|temp-label tonight selected' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

時間単位

以下は現在時刻から8時間後までと、9時間後から16時間後までのスクリプトです。これは等幅フォントを指定しないと表示がずれますのでご注意を。(上の画像ではRicty Discordというプログラミング用の等幅フォントを使っています)

天気アイコンの画像は「/tmp/weather_hour_0.png」から連番で「/tmp/weather_hour_7.png」まで保存されるので、上の応用で画像を一つずつ貼り付けて並べてください。

視認性を上げるためにamとpmの色を変えていますが、色を変えたくない場合は「時刻を左揃え8桁で表示」のところの「 | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g」をごそっと削除してください。(「printf "%-8s" ${current_time[*]}」だけ残す)

まず一つ目、現在時刻から8時間後までのスクリプトはこんな感じです。

# 現在時刻から8時間後までのスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
my_hour=`date +%H`
curl_data=`curl $weather_proxy --silent ${weather_url/weather-forecast/hourly-weather-forecast}"?hour=$my_hour"`

# 8時間分の時刻を取得(後で配列変数として使う。以下同様)
current_time=(`echo "$curl_data" | grep -A 37 "overview-hourly" | grep -A 29 "first-col" | sed -e 's/<[^>]*>//g' -e 's/^ *//' | tr -d "\r"`) 

# 8時間分の天気を取得(データにスペースが入ることがあるのでIFSを使って処理)
_IFS="$IFS";IFS="_"
current_weather=(`echo "$curl_data" | grep -A 67 "overview-hourly" | grep -A 23 "Forecast" | sed -e 's/<[^>]*>//g' -e 's/^ *//' -e '1,2d' -e 's/ \&amp;/\&/g'| tr -s '\r\n' '_'`)
IFS="$_IFS"

# 8時間分の天気アイコンのナンバーを取得
current_icon=(`echo "$curl_data" | grep -A 38 "overview-hourly" | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789\n'`)

# 時刻を左揃え8桁で表示
printf "%-8s" ${current_time[*]} | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g

# 天気を左揃え8桁かつ2段で表示
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $1}'
done
echo
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $2}'
done

# 天気アイコンを取得して保存(URLに使うアイコンのナンバーはゼロパディングする)
for (( i=0; i < ${#current_icon[@]}; ++i))
do
current_icon[$i]=`printf "%02d" ${current_icon[$i]}`
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/${current_icon[$i]}-s.png" | xargs curl $weather_proxy --silent -o /tmp/weather_hour_$i.png
done

9時間後から16時間後まではこんな感じ。上のスクリプトの応用ですから内容はほとんど同じです。「later=」の後の数値を「16」にすれば17時間後から24時間後の表示にすることもできます。天気アイコンの画像は「/tmp/weather_hour_8.png」から連番で「/tmp/weather_hour_15.png」まで保存されます。

# 9時間後から16時間後までのスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 何時間後?
later=8

# 元データ取得
my_hour=`date +%H` ; my_hour=`expr $my_hour + $later`
curl_data=`curl $weather_proxy --silent ${weather_url/weather-forecast/hourly-weather-forecast}"?hour=$my_hour"`

# 時刻を取得
current_time=(`echo "$curl_data" | grep -A 37 "overview-hourly" | grep -A 29 "first-col" | sed -e 's/<[^>]*>//g' -e 's/^ *//' | tr -d "\r"`)

# 天気を取得(スペースを含んだデータを配列に格納)
_IFS="$IFS";IFS="_"
current_weather=(`echo "$curl_data" | grep -A 67 "overview-hourly" | grep -A 23 "Forecast" | sed -e 's/<[^>]*>//g' -e 's/^ *//' -e '1,2d'  -e 's/ \&amp;/\&/g' | tr -s '\r\n' '_'`)
IFS="$_IFS"

# 天気アイコンのナンバーを取得
current_icon=(`echo "$curl_data" | grep -A 38 "overview-hourly" | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789\n'`)

# 時刻を左揃え8桁で表示
printf "%-8s" ${current_time[*]} | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g
# 天気を左揃え8桁かつ2段で表示
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $1}'
done
echo
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $2}'
done

# 天気アイコンを取得して保存(取得するアイコンのナンバーはゼロパディングする)
for (( i=0; i < ${#current_icon[@]}; ++i))
do
current_icon[$i]=`printf "%02d" ${current_icon[$i]}`
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/${current_icon[$i]}-s.png" | xargs curl $weather_proxy --silent -o /tmp/weather_hour_`expr $i + $later`.png
done

明日の天気

明日の天気は以下の通り。AccuWeatherでは深夜を過ぎるとその日の早朝の天気に表示が変わりますが、それにも対応させてあります。天気アイコンは「/tmp/weather_tomorrow.png」に保存されます。

# 明日の天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_data=`curl $weather_proxy --silent $weather_url`

# 明日(または早朝)の天気を表示
echo "$weather_data" | grep -e 'Tomorrow\|Early' | sed -e 's/<[^>]*>//g'  -e 's/^ *//' 
echo "$weather_data" | grep -A 9 'Tomorrow\|Early' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 明日の天気アイコンのナンバーを取得しゼロパディングする
icon_data=`echo "$weather_data" | grep -A 2 'Tomorrow\|Early' | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789' | awk '{printf "%02d", $1}'`

echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_data"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_tomorrow.png

週末の天気

週末の天気は以下の通り。天気アイコンの場所は土曜日が「/tmp/weather_sat.png」、日曜日が「/tmp/weather_sun.png」です。

# 土日の天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_weekend=`curl $weather_proxy --silent ${weather_url/weather-forecast/weekend-weather}`

# 土日の天気を表示
echo "\033[0;34mSaturday\033[0m"
echo "$weather_weekend" | grep -A 9 'Saturday' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "
echo "\n\033[0;31mSunday\033[0m"
echo "$weather_weekend" | grep -A 9 'Sunday' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 土日の天気アイコン取得
icon_sat=`echo "$weather_weekend" | grep -A 2 'Saturday' | grep 'icon' | sed -e 's/^ *//' -e s/'<div class=\"icon '//g -e s/' \"><\/div>'//g -e s/i-//g -e 's/\([0-9]*\).*/\1/' | tr -d '\n' | tr -d '\r'`
icon_sat=`printf "%.2d\n" $icon_sat`
icon_sun=`echo "$weather_weekend" | grep -A 2 'Sunday' | grep 'icon' | sed -e 's/^ *//' -e s/'<div class=\"icon '//g -e s/' \"><\/div>'//g -e s/i-//g -e 's/\([0-9]*\).*/\1/' | tr -d '\n' | tr -d '\r'`
icon_sun=`printf "%.2d\n" $icon_sun`

echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_sat"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_sat.png
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_sun"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_sun.png

さいごに

他にもAccuWeatherには色々な予報がありますので、これまでに挙げたスクリプトの仕組みがわかれば様々な応用が可能でしょう。要はHTMLソースの中から欲しい情報をゲットするためのキーワードを拾ってHTMLタグを除去してテキストを整形しているだけですから、キーワードを確実に拾えるパターンを見つけさえすればOKです。

メカニカルキーボードのカスタマイズ。

日本では一部の業界を除いて全く流行る気配がないのですが、海外ではキーボードのカスタマイズが盛んに行われており、様々なスタイルのキーキャップが販売されていたり、キーキャップのデザインを自分で行えるようなサービスがあったり、全て自作するキットまであったりします。

キーボード本体も様々なキータッチのものが存在しており、スムーズに押し込む感触だけのもの、わずかなクリック感があるもの、カチカチと音が鳴るものなどから好みのものを選びます。また、それぞれキーの重さも何種類か用意されています。

私はCherry MX黒軸のいわゆる60%サイズのコンパクトキーボード(KBParadise V60)をベースにして、外側のケースを木製のものに変更し、キーキャップは黒の無刻印、ESCキーだけ顔のマークがついているものを使っています。また、打鍵音を抑えるために静音リングをつけています。

f:id:leopardgecko:20170221110805j:plain

海外の猛者に比べれば全く特別なカスタマイズではありませんが、日本国内ではこういうものはなかなか入手できないので海外サイトを利用することになります。具体的には、木製ケースはMassdrop、黒の無刻印キーキャップのセットはAliExpress、ESCキーはEbayで購入しました。

中でも苦労したのはキーキャップのセットで、黒の無刻印で質の良いものを見つけるのは意外と大変でした。最初は国内で簡単に入手できるFILCOのMajestouch用を買ったのですが、これは実際には黒というよりはかなり色の濃いグレーの半透明で、しかもプラスチックの厚みが全体的に薄く使用感は良いものではありませんでした。薄いと打鍵音が甲高く耳障りなものになってしまうのです。また、これはABS樹脂製で磨耗に弱く使っているうちに表面がツルツルになってしまい見た目が安っぽく触り心地も良いものではありませんでした。次にMAX Keyboardという海外サイトから磨耗に強いPBT樹脂製のセットを買ってみました。これは厚みもありツルツルにもならず使用感は良かったのですが見た目のばらつきがかなりあり、キーによってグレーに見えたり黒に見えたりしてかなり格好悪い仕上がりになってしまいました。

最後にたどり着いたのがAliExpressで売っているNPKCのPBT製キーキャップです。キーキャップの形状にはいくつか種類があって、私が買ったのはCherry profileという高さが低めのもの(一般的な高さのものはOEM profileという)です。これが今までで一番まともなものでした。厚みがあり、外観のばらつきが少なく、触った感触も良く、打鍵音は静かで静音リングはなくても良いくらいです。(音の差は樹脂の種類や厚み以外にもprofileの違いも影響がありそうですが)

一見良いことずくめのようですが、AliExpressは中国からの直輸入になるので、ある程度のトラブルは覚悟の上で注文する必要があります。私はうっかり春節の時期に注文をしてしまったので出荷されるまでかなり待つことになりました。あまりにも時間がかかるので一度キャンセルを試みたのですが、「休暇が終わったら出荷するからもう少し待ってくれ」みたいな返事が来て簡単にはキャンセルに応じてくれないのです。

 

キーボードのカスタマイズはとても楽しいのですが、日本人向けの情報が少なく失敗のリスクがある上に面倒なことも多く費用もかかります。国内でもこういう世界がもっと盛り上がってくれれば品質の良いものをもっと簡単に入手できるようになると思うのですが、なかなかそういう流れにならないのが残念です。

油性ZOOM505のジェットストリーム化。

今回はMacとは何の関係もないボールペンの話題ですが、このまま埋もれさせるのもちょっともったいないかなと思ったのであえて書いてみます。

ZOOM505というボールペンがあります。それほど高価なものでもないのですが、デザインがシンプルで格好良く、低重心で持ちやすく、握るところがラバーで滑りにくく、ラバーの先がわずかに太くなっているので押し付けるように書く時でも安定感があり、お気に入りのボールペンです。ボールペンは高級だからといって必ずしも持ちやすいとか書きやすいとは限らないのが難しいところです。

f:id:leopardgecko:20170220135905p:plain

このボールペンは基本的に水性なのですが、水性ボールペンは乾くまで時間がかかったり質の悪い紙に書くとにじんでしまったりという弱点があります。その手の紙に書く機会が多いので油性があれば良いなと思っていたのですが、実はしばらく前に油性タイプが出ており、さらに30周年記念モデルというものにも油性タイプがあることをつい最近知りました。通常モデルの油性タイプは少し黄色がかったマットのシルバーで、30周年記念モデルはピカピカの普通のシルバーです。本当はブラックがあれば一番良かったのですがないものを望んでも仕方がないので、30周年モデルを買ってみました。

芯は油性としてはごく普通の書き味で特に書きやすいとか書きにくいとかはないのですが、近年人気の低粘度油性(ジェットストリームやアクロインキなど)に比べると書き始めがかすれたり字の濃さが一定でなかったりと見劣りしてしまいます。また、細かい字を書くには線が少々太いのも気になりました。そこで、芯を入れ替える作戦を立てました。

油性ZOOM505の芯はいわゆるパーカータイプです。パーカー互換の替芯は何種類かあるのですが、低粘度かつ0.5mm程度の細芯はないようです。パーカータイプでそのような替芯を使う方法として、リフィルアダプターというものを使う手があります。アダプターを介することによりいわゆる4Cタイプの替芯が使えるようになりますので、4Cタイプの替芯があるジェットストリームも入れられることになります。

早速パーカー用のリフィルアダプター(PK-01)とジェットストリームの替芯(SXR-200-05)を入手して入れ替えてみましたが、アダプターが途中でつっかえて最後まで入りません。元々入っていた芯とアダプターの形状を見比べてみると、芯の胴体は先が細くなっているのですがアダプターの方はそこまで細くありません。わずかな違いですが、ここが問題なのでしょう。

f:id:leopardgecko:20170220141326p:plain

アダプターはアルミ製のようなので、ダイソーで入手したダイヤモンドやすりを使って先を削ってみることにしました。少し削っては入れてみる、ダメならさらに削る、という手順を繰り返し、ようやくアダプターを入れることができました。替芯はアダプターと先端の2ヶ所にわずかに遊びがあってカタカタしていたので、替芯のその2ヶ所にセロテープを1周分だけ巻きつけてみたところカタカタはなくなりました。

f:id:leopardgecko:20170220134448j:plain

 これで握りやすいZOOM505と書きやすいジェットストリームの組み合わせが完成しました。多少の追加費用と手間はかかりますが、個人的にはそれだけの価値はあると思っています。

ちなみに、同じように手頃な価格でシンプルなデザインと質感が良いボールペンとしてOHTOのリバティというモデルがあります。重心バランスやグリップの安定感はZOOM505の方が良いと思いますが、このボールペンは替芯の選択肢が非常に広いという特徴があり(リバティという名前の由来でもある)、ジェットストリーム化も簡単です。面倒な改造はしたくないとか色々な替芯を使ってみたいという方にはこちらもお勧めです。

また、油性にこだわらない場合は、水性のZOOM505にぺんてるのスリッチというゲルインキボールペンの芯の長さを合わせてカットして入れるという手もあります。スリッチの0.25mmだとジェットストリームの0.5mmより少し細い感じです。簡単に極細のゲルインキが使えるようになるので、細字が好きな方にはこれもお勧めです。

 

パーカー互換で低粘度油性かつ0.5mmくらいの細字リフィルがあれば売れると思うんですが、どこかで出してもらえないものでしょうか・・・

 

日本語版ローグ(Rogue 5.4)for macOS 重大アップデート。

前の記事で公開したMac用日本語版ローグ(Rogue)についての記事です。

 

本日、和訳を修正したjRogueの最新版をアップしました。

修正箇所はわずかなものですが、個人的にはかなり重要な修正だと思っています。具体的には、ゲームをクリアした時のメッセージの修正を行いました。もともとこの部分はデータ分離型のメッセージをそのまま使っていましたが、オリジナルの英文と比べてみると重大な違いがあることに気がつきました。ここは添付文書の【運命の洞窟へのガイド】の導入部と対になる部分でもあり、訳が正しいものでないとローグの世界観というか主人公のストーリーが完結しないのです。

データ分離型のメッセージがやや意味を外した訳になっているのはおそらくファンタジーがあまり一般的ではなかった時代によるものだと思います。あまり知られていない単語をそのまま訳しても意味がわからないかもしれないという配慮によるものだったのでしょう。今はわからない言葉があってもすぐに検索することができますから、ここは正しい訳に直しておくべきだと考えました。ネタバレになってしまうので回りくどい言い方になってしまい申し訳ありませんが・・・

データ分離型ローグをクリアしたことがある方は、ぜひともこのjRogueでのクリアも目指してください。【運命の洞窟へのガイド】の導入部を読んでいればデータ分離型ローグのクリアメッセージには少々違和感を覚えるでしょうが、最新版jRogueのクリアメッセージには矛盾がなく納得がいくものだろうと思います。

 

データ分離型では他にも時代によると思われる訳があり、例えば【運命の洞窟へのガイド】の導入部では「elf」を「妖精」と訳しています。これはもちろん間違いではないのですが、ファンタジー世界で「エルフ」と言えばJ.R.トールキンの「指輪物語」に出てくるエルフのイメージが多かれ少なかれ含まれているものだろうと思います。おとぎ話に出てくるような妖精ではなく、特殊な力を持った超人的な種族としてのイメージです。(「指輪物語」と言われてもピンとこないかもしれませんが、映画の「ロード・オブ・ザ・リング」の原作本といえばお分かりになる人は多いでしょう)

当時は「エルフ」と訳しても何のことだかわからない人も多かったと思いますが、今は「ロード・オブ・ザ・リング」や「ホビット」のおかげでトールキン的なエルフのイメージもだいぶ知られるようになったでしょうし、知らなかったとしても現代ではネットで検索すればイメージを掴むのはそれほど難しいことではないと思います。そこでjRogueの添付文書では「エルフ」という訳語を使いました。

 

私自身が気がついたところは適宜修正していますが、まだおかしなところやわかりにくいところなどは残っているだろうと思います。もし気がついた点があればお知らせいただければ幸いです。

日本語版ローグ(Rogue 5.4)for macOS よもやま話 その2。<細部のこだわり>

前の記事で公開したMac用日本語版ローグ(Rogue)についての独り言の続きです。

当初はこのブログから直接ファイルにリンクしていましたが、ブログでアプリを配布するのも如何なものかという気もしますので、ファイル配布用のサイトを作ってみました。

リンクはこちら。

もしダウンロードした方がいらっしゃいましたら、感想でもご要望でもお叱りでもなんでも良いのでなんらかのリアクションをいただければ嬉しいです。

 

以下はよもやま話です。

この日本語化の作業で初めてRogueソースコードをじっくり見たのですが、30年も前の古いゲームなのに細かいこだわりがあちこちに見られて驚きました。

例えば指輪や杖の材質、水薬などの色の設定がやたらとたくさんあるのです。それぞれ20〜30種類くらいの設定があり、杖(staff)の材質は木材で魔法の棒(wand)は金属という決まりもあります。しかもこれらの設定はゲームの展開には一切影響を及ぼさないのです。

f:id:leopardgecko:20170808140436p:plainf:id:leopardgecko:20170808140519p:plain

RPGやファンタジーに詳しい人ならば常識なのかもしれませんが、「staff」と「wand」の使い分けにも面食らいました。Rogueでは魔法が使える「stick」がstaffとwandの2種類に分類されています。イメージとしてはstaffがロード・オブ・ザ・リングガンダルフが持っているような大きな杖で、wandがハリー・ポッターが持っているような小さめの棒といったところなのでしょうか。データ分離版ではstaffもwandも「つえ」としてまとめているようですが、今回の日本語版では「つえ」「魔法の棒」と分けてみました。どちらも魔法のstickとしては同じ機能ですが、staffは武器としても使えるという違いがあります。

魔法の巻き物の設定も異様に凝っていて、名前は150種類くらいの音節が設定されていてそこからランダムに作られています。おそらく全く同じ名前の巻き物が出てくることは二度とないでしょう。

f:id:leopardgecko:20170808140552p:plain

これらを全て日本語に置き換えるのは結構大変な作業でしたが、そもそもこんな設定を作ること自体が大変なことだったでしょう。何せ、木材だけでも30種類以上の設定があるのです。これはおそらく何度プレイしても以前に見たような展開にならないようにする工夫の一つだったのだろうと思います。

 

表示の設定も細かくできています。簡潔な表示に設定するとメッセージが微妙に違ってくるのですが、ここまでの微妙な違いをこれほどたくさん用意する必要があったのかと思います。通信速度が遅かった時代には実際に意味があった設定なのかもしれませんが・・・

データ分離版では主語があまり使われていません。これはおそらくデータ分離版の元になったClone IIがオリジナルの簡潔表示を元にしたメッセージを使っていたために、簡略表現としてそのような形をとっていたのでしょう。オリジナル版のデフォルトは簡潔表示ではないので、データ分離版に比べると全体的にやや長めのメッセージになっています。オプションから簡潔表示をオンにするとデータ分離版っぽいメッセージになります。

 

幻覚を見ているときにはメッセージが微妙に変わるという設定もあちこちに散りばめられています。例えば武器に魔法をかける巻き物を読んだ時は武器が銀色に光るのですが、幻覚を見ている時にはその色がランダムに変更されます。空腹になった時や食料を食べた時のメッセージも違います。そのような仕掛けがあちこちにあるのです。これもゲームの展開には全く関係がない設定ですが、限られた表現の中でどうやって多様性を出すかと考えた結果でしょう。

データ分離版にも同じような演出はありますがここまでは細かくないので、オリジナル版ならではの楽しみの一つと言えるでしょう。

 

また、おそらく動作確認用として、ほとんどあらゆることができるようになるwizardモードという隠し機能があるのですが、一般プレーヤーが使うことはないと思いますがこれも凝った設定になっています。wizardモードで迷宮をウロウロするだけでも結構楽しめます。ほぼ無敵になってしまうためスリルはありませんが。(申し訳ありませんが、公開版ではwizardモードは使えない設定になっています)

 

見た目はシンプルでも意外と奥が深いというのはRougeの魅力の一つだろうと思います。冒険と戦いのスリルを味わうだけではなく、幻覚の水薬をあえて飲んでメッセージの変化を楽しんだり、「今度出てくる杖の材質は何かな」というような視点を持ってみても面白いのではないでしょうか。

日本語版ローグ(Rogue 5.4)for macOS よもやま話。<コンセプト>

前回の記事で公開したMac用日本語版ローグ(Rogue)についての独り言です。

 

私がRogueに触れるきっかけになったのは、後藤寿庵さんがMac用に移植されたデータ分離版Rogueでした。Rogueの存在自体は昔から知っていましたが、実際にプレイするのはそれが初めてだったのです。これには随分はまりまして、ついにはイェンダーの魔除けを手にして洞窟から生還することができました。ところが残念ながらこのアプリは今のMacでは起動することができません。前に書いた記事のように手間をかければ他のデータ分離版Rogueで遊ぶことはできますが、これではハードルが高すぎて普通の人はなかなか手が出せないでしょう。手軽に日本語版Rogueで遊ぶにはどうすれば良いかと考えた末に、自分で作ることにしました。

コンセプトは、「Macで手軽に遊べる親しみやすいRogue」です。

しかし一言にRogueといっても現在公開されているものには様々なバージョンがあり、どれを選ぶのかで少々悩みました。Rogueには二つの大まかな系列があり、一つはオリジナルのRogue、もう一つはデータ分離版の元になったクローンの系列です。

クローンの系列にはデータ分離版などの親しみやすい日本語版があり、操作感が軽快でとっつきやすいのもポイントです。最初のうちはおっかなびっくり一コマずつ移動していても慣れてくると通路などはバーっと走りたくなります。Rogueにはちゃんと走るためのコマンドがあって、データ分離版では曲がり角でも止まらず一気に駆け抜けてくれます。カラーの配色は見やすく雰囲気も出ていて良い感じです。

一方、オリジナルのRogueはデフォルトの設定では走る時に曲がり角で止まってしまう、カラー対応していない、scroll(巻き物)やpotion(水薬)を使った後にいちいち呼び名をつける必要がある、などなど面倒くさいところがあるのですが、オリジナルならではの魅力として「暗い部屋」があります。データ分離版ではどの部屋でも入った途端に隅から隅まで見渡すことができるのですが、オリジナルでは暗い部屋は自分の周りしか見えません。これがスリルがあって良いのですね。魔法の灯りの杖を振るとパッと明るくなるというカタルシスのようなものも味わえます。

怪物の強さにも少々違いがあって、データ分離版ではケンタウロスが出てくるあたりから突然に難しくなるのですが、オリジナルではそこまで急激な変化はないので中盤からやたらと死にまくるというような展開はありません。

 

考えた結果、オプション設定などを駆使してデータ分離版っぽいオリジナルにすれば一番面白いRogueになるのではないかとの結論を出しました。見た目や操作感をなるべくデータ分離版に似せて、中身はオリジナルの最終版であるRogue 5.4という形です。

ソースを改変してデータ分離版のように使ったアイテムを自動判別するオプションも追加してみたのですが、これはさすがに逸脱しすぎかなと思って最終的にはボツにしています。外観以外の機能的には後述する5.4pから移植したもの以外の独自要素は加えないことにしました。やりすぎるとRogue 5.4ではなくなってしまいますので・・・。

 

Y.Oz Voxさんがカラー化したRogue 5.4pというものを作っておられますので、最初はそれの日本語化を試みました。いったん完成はしたものの、5.4pはもともとWindowsLinux用として作られており、Macコンパイルするとセーブしたゲームを再開した時に異常終了してしまうという致命的な不具合がありました。これを最後まで直すことができなかったので公開は断念しました。

別のところで入手したRogue 5.4.4のソースをコンパイルしてみたところ上記の不具合は出ませんでしたので、一からやり直してこれをベースにして日本語化した上で、5.4pのカラー化や識別の巻き物を一種類にする設定などの独自仕様を移植してみました。これが案外うまくいったので最終的な採用版になりました。バージョン名は一応5.4.5Jとしましたが、実際には5.4.4と5.4.5(5.4p)のハイブリッドで中間的なものです。

ちなみに作業の途中でバージョン3.6や5.2にも手を出してみたのですが、これらは色々な理由でうまくいかず断念しました。

 

日本語訳に関してはデータ分離版のもの(おそらくローグ・クローン2日本語版を作った太田純さんによる訳)が個人的にかなり好きなので、あえて独自の和訳はせずにほぼそのまま使わせていただきました。この和訳があるからこそデータ分離版には独特の親しみやすさがあるのだろうと思います。

カラーの配色もどうするべきか悩みました。5.4pはIBM-PCやPC 9801/8801を参考にしているそうですが、個人的にはデータ分離版の配色の方が好みです。また、ゲーム中のメッセージを見ると部屋の明かりは青とされているようですので、データ分離型の床が青いのはRogueの世界観にも合致します。デフォルトの配色はデータ分離型に準ずるものとして、PC-9801/8801の配色のオプション(brightモード)だけ残すことにしました。

 

また、親しみやすさの一環として、ターミナル用の実行バイナリだけでなくMac用のアプリとしてGUIで起動できる環境も用意したいと考えました。とはいっても私はド素人ですから難しいことはできません。Applescriptを使ってスタンドアロンのアプリっぽいものをでっち上げてみました。ただ起動するだけのアプリではなく、オプションを選べるようにしてみました。Rogueはオプションを駆使すると結構色々な設定ができるのですが、それをGUIから手軽に体験できるようになったと思います。

 

CUI版も併せて公開しましたが、独自仕様で起動するGUI版とは違って元のRogue 5.4のデフォルト設定のままで起動します。CUI版を使う人ならば環境変数などでご自身でお好きな設定にすることができると思いますので。

 

今の時代にコンピューター黎明期のゲームであるRogueがどれほど需要があるものかわかりませんが、単に歴史的な意義のあるRPGというだけでなく気軽に遊べるゲームとして今でも十分に楽しめるものだろうと思います。