今日も陽気にアレグロ技研

allegorgikenの気が向いた時の日記です

Oxygen Not Included のDLC「Spaced Out!」をご紹介

2年間で総プレイ時間が 1,200 時間を超えてしまった Oxygen Not Included というゲームがあります。 今回は唐突ですが、このゲームの追加コンテンツ(DLC)である「Spaced Out!」を詳しく紹介します。

対象読者

下記のような方を想定しています。

  • Oxygen Not Included を購入し、ある程度プレイしている
  • DLC「Spaced Out!」をプレイしていない

Spaced Out! とは

2020年末にリリースされたDLCです。こちらで購入できます。 store.steampowered.com

「リリースされた」と記載しましたが、状態としては早期アクセスです。 バギーな挙動・仕様変更はそこそこの頻度で発生します。 概ね2週間に1度のサイクルで大きめの機能追加を伴うリリースが行われています。 リリース当初は「ゲーム要素の不足」みたいなものを感じましたが 2021/08 現在ではかなり遊べるようになっていると思います。

DLCが適用されていないゲームを「バニラ」と呼ぶようですが、DLC購入後にバニラとDLCを共存させることは可能です。 新規ゲームを開始するときに選択することができます。(既存セーブデータをどこまで引き継いで使えるかは自信がないです)

ゲームの変更点

早速内容に触れていきましょう。変更点のまとめを列挙します。

  • 「硫黄」を取り巻く作物や動物が追加された
  • 冷えた汚水・塩水の間欠泉が増えてコロニーの冷却が簡単になった
  • 複数の惑星がコロニーの対象として登場するようになった
  • 放射能の概念が追加された
  • ロケットの作成がやりやすくなった
  • ロケット内の生活スペースを作成できるようになった
  • 宇宙がグリッド状のマップとなり、ロケットの移動経路が自由になった

個別に解説をしていきます。

「硫黄」を取り巻く作物や動物が追加された

硫黄は従来では特に用法のない副産物でしたが、DLCでは自然タイル・間欠泉から取得できる資源になりました。 用法としては、 sweetle というテントウムシっぽい動物の餌になり、 grubfruit という作物の肥料にもなります。

f:id:VVani07:20210830014650p:plain
sweetle
f:id:VVani07:20210830014733p:plain
grubfruit と、sweetleから派生するイモムシ(grubgrub)

sweetle は作物の成長をスピードアップさせる能力を持ち、さらに grubfruit を特別な状態にクラスアップさせてくれます。 grubfruit は硫黄だけで育ち、40℃までの環境に耐えることができます。カロリー量も十分で、序盤から終盤まで安定して使える作物です。

冷えた汚水・塩水の間欠泉が増えてコロニーの冷却が簡単になった

-10℃の汚水が沸き出すのは「雪氷間欠泉」ですが、-10℃の濃塩水が湧き出す間欠泉が実装されました。 実装されただけではなく、間欠泉として確実に登場する(最低保証)ようです。これにより、序盤の熱問題を楽に緩和できるようになりました。

f:id:VVani07:20210830014909p:plain
冷えた水を下さい

濃塩水からは塩が抽出できて、塩は砂に変換できます。濾過剤の供給としても非常に助かります。

複数の惑星がコロニーの対象として登場するようになった

画像を見て頂くのが早いと思いますが、右上のメニューに惑星のリストが出ています。

f:id:VVani07:20210830015156p:plain
惑星とロケットが一覧で表示される

スタート時点では惑星は1つですが、掘り進めていくうちに「テレポーター」なるものを見つけることができます。 テレポーターでは複製人間を特定の別惑星に転送することができ、そこから新たな惑星でのコロニー構築が始まることになります・・

惑星はそれぞれで特徴を持っており、場合によっては生活できるだけの資源がないような惑星もあります。 惑星間での資源転送も専用の施設で行うことができますので、それらをうまく使って不足資源を補いあうと良いですね。

f:id:VVani07:20210830015757p:plain
謎の資源転送施設

放射能の概念が追加された

ウィーズウォート・シャインバグなどの動植物が放射能を発するようになりました。 大きな放射能を発生させる素材として「ウラン鉱石」とそれにまつわる動物も登場しています。

f:id:VVani07:20210830020008p:plain
放射能ビュー

放射能radbolt という単位で収集できて、研究ツリーや宇宙開発を進めるのに必要です。

f:id:VVani07:20210831233354g:plain
収集した radbolt をロケットエンジンに射出している様子

上の動画ではウィーズウォートが発する放射能を収集して射出し、エンジンの燃料として蓄積させています。 中盤の研究でも radbolt が必要で、専用の施設に蓄積させることで研究を進めることが出来ます。

f:id:VVani07:20210831234103p:plain
ウィーズウォートで空間を冷やしつつ、放射能を集めて研究施設で使う

radbolt は専用の施設で反射させることもできて、画像のようなデザインも組めます。 放射する点から受け取る側までの距離に比例して減衰しますし、複製人間にぶつけてしまうとダメージになるので短いほうが効率良く安全です。

ロケットの作成がやりやすくなった

Rocket Platform の設備でロケット構成要素の追加・変更・削除・入れ替えが容易にできるようになりました。個人的に最も推せる要素です。

f:id:VVani07:20210831234930g:plain
ロケットのモジュールを上下に入れ替える様子
工事のしやすさだけではなく、Spaced Out! ではロケットの開発を早い段階から実施できるように、下記の通り色々な仕様が変わっています。

  • 表土の温度がマイナス30℃くらいまで下がり、隕石が降らなくなった
  • 二酸化炭素、砂糖をロケットの燃料として使えるようになった
  • アトムスーツが無くてもロケットに搭乗できるようになった
  • 研究を進めるためにロケットを繰り返し発射させる必要が無くなった

ロケット内の生活スペースを作成できるようになった

従来仕様ではロケットを飛ばしたら帰ってくるまで待つだけでしたが、だいぶ変わりました。 Spaced Out! ではロケットが飛んでいる間も搭乗員はコロニー上と同じように生活を行うようになりました。そのための空間作りもロケット毎に必要です。

f:id:VVani07:20210901001259p:plain
広いロケット生活空間

これは3人乗れる設計で、トイレとベッド、冷蔵庫、発電機をロケット内に用意しています。 ロケット向けの壁付けトイレなども新規実装されていますので、限られた空間でも結構いろいろな設計ができます。 酸素は事前に気体ボトル開けを使って高圧状態になるまで放り込んでいます。鼓膜は破れますが、命には代えられません・・

画像にはありませんが・・ 宇宙空間の観測を行うテレスコープを置いたり、宇宙空間でしか行えない研究施設を置いたりすることがゲーム道中で必要になります。従来では仮想プラネタリウム + データバンクで宇宙系の研究を進めていましたが、データバンクの概念はなくなりました。宇宙空間上にあるロケットの中で研究を進めることが出来ます。

ロケット内で水・食物・酸素の生成が完結できれば、無限に宇宙空間を漂い続けることもできそうです。こういったチャレンジも楽しいですね!

宇宙がグリッド状のマップとなり、ロケットの移動経路が自由になった

f:id:VVani07:20210901002411p:plain
Spaced Out! の宇宙マップ
画像の通りですが、宇宙空間は二次元に拡がり、そこに複数の惑星が存在するようになりました。 ロケットは発射された後で、このマップ上を自由な経路で移動することができますし、「移動せず漂うだけ」ということもできます。 燃料は移動する際にしか消費しないので、宇宙空間に永くいても食料や酸素が保つ限りは問題ありません。

ロケットでやることはたくさんあります。

  • 宇宙空間に漂い続けて、研究ツリーを進める
  • 宇宙空間を縦横無尽に移動しつつ、テレスコープでマップを解明していく
  • 近くの惑星に遠隔操作用のロボットを投下する
  • 近くの惑星に資源を届ける
  • 近くの惑星に複製人間を投下する
  • 宇宙空間に漂ってる資源・アーティファクトを回収する

ロケットから惑星に何かを投下する際は「表土」にしか届けられないので、新惑星の開拓は表土から始まります。このプロセスが非常に楽しいです。

  • 遠隔ロボットを投下し、惑星の様子をうかがう
  • ロケットの土台作成に必要な資源を届ける
  • 複製人間を投下し、ロケットの土台を表土に作成する
  • ロケットを着陸させる

このような手順を踏むと、新しい惑星に本格的な開拓を始められます。 惑星によっては生活すら困難なケースがあり、その場合はロケットが惑星上での生活スペースとして活躍できます。

まとめ

Spaced Out! ではその名の通り、宇宙関連のゲーム性が大幅に拡大されています。 フラーレン・ニオブといった特殊素材も点在する惑星で採掘可能な素材として登場しており、終盤の楽しみ方もだいぶ変わっています。

リリース当初はロケット内生活空間の作成が非常に大変だったのですが、2021/08 時点では非常にやりやすくなりました。 惑星関連の劇的なアップデートも落ち着いてきており、完成度もかなり高まってきていると感じています。

宇宙開拓というロマンを具体的に体感できる Spaced Out! ぜひ始めてみませんか?

2020年振り返り

AtCoderずっと続けた

1.5 年間ほど続けて、ダレたり頑張ったりしました・・ 最近は会社の同僚とかも巻き込んで競争できたりしている。幸甚。 https://atcoder.jp/users/allegrogiken

f:id:VVani07:20201231233107p:plain
実績

この 1.5年間でも参加者の水準はけっこう上がっているなぁということを思います。 レーティングは相対なので、勉強し続けても平気で下がりますね・・ とはいえ、ゆるく続けるのはわりと得意なのでやっていく。来年は4桁に届かせたい。

引っ越しした

夏が暑すぎて無理だったので、関西圏から北海道に引っ越しました。今はマイナス15℃とかいってて大変寒い。 気温湿度もろもろが急変した結果、体がカリッカリに乾燥して死にかけました。今は小康状態。

時代的に在宅勤務の割合が高くなったので、家はそこそこの広さを確保しています。 今のところもてあまし気味だけど、はたらくスペースとリラックスするスペースとか分けていく所存。

勉強会で登壇した

関西での「Kubernetes超入門勉強会」で声をかけてもらって登壇しました。 その節は大変お世話になりました。

Splatoon2 でウデマエXになった

ヤグラだけXに到達できました。ずっとダイナモローラーを握っています。ときどきわかばシューター。 また、ペアのリーグマッチで金メダルも取れたりしています。圧倒的成長。

Splatoon2はけっこうやり続けていて、最近はリーグマッチできるメンツが揃いました。ペア、チームともに結構な頻度でリーグマッチに参戦しています。真面目にPvPのゲームをやると、人の性質がそのままプレイに現れるなーということをよく感じます。私は反射神経だけでプレイするタイプなので、チームメイトにはいつもケアしてもらって感謝の極みです。

デレステ、ピンポイントでイベント参加した

担当の市原仁奈さんがつい最近のイベントに出演したので、そこそこ尽力しました。

最近実装された「プロデュース方針」によって営業でのエンブレム稼ぎが捗ります。 イベント走るのがだいぶ楽になったと思いますね・・

AtCoder Regular Contest 105 出場記

AtCoder を初めて一年以上経つけれど、Regular Contest は初めての参加。 自分のレートは想定されるレンジよりも低めなので気軽なお気持ちで臨んだのだけど、久々にレート上昇させることができたのでちょっとテンションが上がった。 今回のARCはC以降がすごい難しくて、強者でもB完で速解き勝負っぽくなっていたもよう。

A - Fourtune Cookies

なつかしさを感じるタイトルだけど、Fortune と4枚を示す Four がかかっている。 4枚のうち 1, 2, 3 枚クッキーを食べたときのパターンを計算すればよい。 bit全探索とか呼ばれるやつで 4つのBooleanを全パターン上げてACを得た。 ABCのA問題よりはさすがに難易度が上という印象。

B - MAX-=min

データの扱い方を最初に考えて、以下を試みた - 数列のうち重複は取り除いても良さそうだったので最初に省いた。 - 最小値は滅多に動かず、最大値は頻繁に入れ替わりそうだったのでバイナリヒープを使った。

あとは問題の通りに計算をしてサンプルの入出力が一致させることができた。 ここまで早めに実装できたので、AC取れたらおいしいなーと思って投げたけどTLEになった。なるほど。

最大値が1億、最小値が1だとそれだけで1億ループしてしまうことになるので、 Max -= min の繰り返しをできる限り掛け算で省略してやることが必要とされる。どこまで省略するかの閾値を「次の最大値まで」「最小値まで」どっちにするかで迷った。

「次の最大値まで」だとあまり計算量が縮まらないケースもありそうなので、思い切って「最小値を超えない」とこまで一気に引き算してみた。この結果サンプルはいずれも通っていたので提出してみたところACを得た。あまり深く考えていないのでラッキーACという印象。あとで解説を読む。

C - Camels and Bridge

時間いっぱいつかってWAだった。脳みそはたくさんつかったので記録を残す。

考えたこと

  • 橋のパーツのうち、ネックとなる部分さえ通せればとりあえず良さそう
  • ラクダは最大で8頭いて、1個から8個のグループに分けることができれば良さそう
    • グループ内のラクダは間隔0, つまり密着した状態
  • このグループのうち、合計重量が最大のものがネックとなる橋を通れたら良さそう
  • 通れた時、 (グループ数 -1) * ネックとなる橋パーツの長さ を解とすれば良さそう

これらをコードに落としたのは下のもの。 atcoder.jp

そもそもサンプル4が合ってないので、前提として考えたことのいくつかが間違っているようだ。 答えのずれ方からして、ネックとなる橋以外についても考慮する必要がある気がする。解説を読んで復習する。

D以降

未だ見ず

HHKB プログラミングコンテスト 2020 出場記

atcoder.jp

遅めのC完でレートを落としてしまった。 誤読というよりは純粋に文の理解力が落ちている気がするので、問題を解くことに触れる時間を少しずつ増やしていきたい。

A - Keyboard

HHKBコンテストなのでキーボードのふるまいっぽい問題。 SHIFTキーが押されているか?のフラグと英子文字が入力として来るので、適切に小文字か大文字を出力してやればOK。

B - Futon

冬支度を感じる問題。 縦か横に2マス連続した「散らかってないマス」のパターン数を数え上げる。 入力のマス目は [100, 100] と小さいので雑に全探索して十分に間に合った。

C - Neq Min

盛大に誤読して40分くらいかかってACを得た。 0..200,001 までの数値を用意しておいて、数列に登場したものをマークしていく。マークされていない数のうち最小を出力することを繰り替えせばよいのだけど、これは 0 から初めて 0 がマークされたら 1, 1もマークされてるなら 2, .. という感じの振る舞いをするだけで十分に間に合う。

D - Squares

解けなかったし、なぜか青と赤の正方形は全体の周上だけにしか設置できないという誤読をしてた。 解説とかを見てもわかったようなわからんような、という感じで数学力が足りないことが分かった。

解説を見ていて、正方形の重なり合いを計算するとき縦と横は独立した事象と考えてよいというのは頭良すぎるなーと思った。つまり、線と線同しの重なり合いを計算して、その結果を二乗すれば正方形同士の重なり合い方を求められるということ。

E - Lamps

見るからに難しそうな問題、コンテスト中は見れず。 解説をたくさんみて模倣したコードを書いてみたけど、配列の操作が遅いせいかTLEがどうしても解消しない・・

F

未だ見ず

京都大学プログラミングコンテスト 2020 出場記

atcoder.jp

A

座標同士のマンハッタン距離の累積和を求める問題。 距離の計算方法も問題文に書いてあるので、その通りに計算してACを得た。

B

最大で [100, 10000] サイズの整数行列の各行から1個ずつ数を拾っていって、拾い続けた数列が広義単調増加 ( a >= b, b>= c, ... ) になるような組み合わせ数を求める問題。

DPで解けそうな感じがしたけど、計算量が O(NK^^2) になってTLEの嵐だった・・ 行末から値を選択していくことにして「n行目に 値x を選択したときの組み合わせ数」を dp[n][x] としてた。しゃくとり法などを用いて計算量を削減できないかなーと思ったけど、この問題は数字を選択するための数列が毎回変わるので適用できるイメージがわかなかった。時間をかけまくったけ全くわからず。

C

部分点がもらえるという問題を初めて見た。ABCでも昔は登場していたようだ。

問題文を読んでもどのような文字列の重複が評価されるのかイメージがわかなかったので、それを判定するコードを書いてみた。グリッドの横・縦それぞれに2文字以上の部分文字列をすべて列挙する感じだった。 それで重複を回避するグリッドを生成するコードを書こうと思ったけど、時間がなかったので 6x6 のグリッドを手作成してAC(60点)を得た。

D以降

問題を見なかった

AtCoder Beginner Contest 158

AtCoderはじめてました

今の会社に入るにあたってコーディング試験があったのですが、その時に時間制限の中でコーディングをするのが圧倒的に苦手になっていたことが解りました。これの対策として、2019/03 くらいからAtCoderをやっており現在まで継続しています。

2019/10 までに緑コーダーになるのを目標としていましたが、断片的にしか勉強していないこともあって 2020/02 にようやく緑になりました。

AtCoder Beginner Contest 158

atcoder.jp

A - Station and Bus

入力が AAA or BBB の時はバスが不要でそれ以外は必要になるので、そのまま出力します。

B - Count Balls

青ボールをB, 赤ボールをR と表現すると、A=3, B=1 のとき最終的なボールの並びは BBBRBBBRBBBR...BBBR と4個ずつの繰り返しとなって表現できます。 N=10 のとき、先頭10個のボールは BBBR × 2 + BB という形になりますが、これは N ÷ (A+B) の商( BBBR の繰り返し回数)とあまり( BB の文字列長)として計算できます。

桁がデカそうなので多倍長整数を使いましたが、後から見返すと64ビット整数で十分に表現可能でした・・

C - Tax Increase

こういう問題で浮動小数点を使うとだいたい合わないので、愚直に小さい順に計算していきます。 入力条件の A, B は最大で100と大変小さいので、0から20,000くらいの税抜き価格を順番に計算して条件を満たし次第出力すればOKです。 20,000 までで条件を満たさなければ -1 です。

D - String Formation

クエリの度に文字列を反転したり、生成する処理をしてるとTLEで死にそうなやつです。 元の文字列S, 頭に付与していく文字列, 尻に付与していく文字列 をそれぞれストックしていきます。

反転クエリが奇数回登場していると反転状態なので、それは状態として持っておきます。

  • Fi = 1 かつ 非反転状態 or Fi = 2 かつ 反転状態 のときは頭につける
  • それ以外の時は尻につける

という感じで文字列をストックしていき、最終的な出力の際にも反転クエリの回数を鑑みていい感じに反転出力すればよいです。 D言語では string とか char[] を使うと動的長なのがネックになりやすいので、私は雑に固定長で処理しました。

E - Divisible Substring

愚直に多倍長整数でやったら5桁の時点でTLEとなることが解り、提出しませんでした。ジャッジに無駄な負担をかけないのは淑女の嗜みなのです。

F - Removing Robots

ロボットを左から順番に並べて「右側にいるロボットを何台巻き込んで消えるのか」を計算しておきグループ分けをしました。 グループごとに組み合わせ数を出して、それを累乗していくと答えがでてくれるのではないだろうか、と思いますが時間も思考も足りませんでした。

締め

きりみんちゃんの記事が競プロについての話を最高にまとめてくれているので、気になる人はこっちを見ましょう qiita.com

オンライン勉強会「Kubernetes超入門勉強会」で発表してきた

ちょっとしたご縁があって、主催のキット(@kitkat_twit)さん・みうら(@kazuhito_m)さんと私の3人で「Kubernetes超入門勉強会」の番組を配信しました。

⬇ オンライン配信のアーカイブ www.youtube.com

「番組を配信しました」って書いてますが、本来は「勉強会を開催しました」って言うところだと思います😉 ただ、後で配信のアーカイブを見直したら「あっ、これ外から見たら番組じゃん」という気持ちになってしまいこの記載となりました(笑)

実は、発表者3人は互いのスライドを本番までタイトル以外知らないという状態だったのです。 通してみると、みうらさんの発表で「概念」を、私の発表で「入門の手順」を、キットさんの発表で「入門した所感」を説明するいい感じのフォーメーションになってて奇跡的でしたね!

ちょっとした裏側の話

今回の勉強会の開催にあたり、発表者は私を含め3名でした。 この人数だと、自然と運営メンバーとしてのロールが全員についてきます。なので裏側の話をちょっとだけ書きます。

運営の立場として、最も大きなトピックがあります。2月の中旬から「新型コロナウイルス」の影響で次々と大きいカンファレンスが中止になっていました。 中止にする?という話もちょっと出ましたが「時代はオンライン配信やろ」という時代の波に乗っていく方向にすぐに転換しました。 さらに、オンラインにするなら、発表者が一同に会する必要もないのですが「トラブルが起こりやすい」「ライブ感が出しにくい」などの印象があり「発表者は一同に集まり、そこからオンライン配信を行う」と良いとこどりを目指した形になりました。

ここらへんの判断のタイミングと決定の早さが絶妙で、スムーズに物事が決まっていくさまが非常に気持ちよかったです。 私は雑に「いいね!」するだけのフォロワーシップBotみたいな振る舞いをしてましたが、なんか丁度いい感じのチームだったと思います(笑)

小さいトラブルはいくつかありましたが、結果としては人数も増えてリアルタイムの反応をインターネット越しにもらえて最高だったと思ってます! 声をかけてくださったキットさん、オンライン配信のノウハウから機材まで殆ど提供してくださったみうらさん、めちゃくちゃいい学びの場を頂きましてありがとうございました! また、当初想定していた会場の調整して頂いた@takesectionさん、最後までお付き合い頂きまして誠にありがとうございました!

自分の発表について

スライドにもある通り、2020/01 の時点では Kubernetes 未経験と言っていいレベルでした。 現場ではバッチ処理を多く書いていて、コンテナベースのインフラに置き換える妄想で Kubernetes 使えそうだな―、ということは定期的に考えていました。

しかし Kubernetes は入門のハードルを高そう・・ と感じていたところでキットさんに声をかけて頂きまして。じゃあこれを機に「勉強会のタイトル通り『超入門』するか!」という気持ちで実際に超入門し、その過程をアウトプットにしたものが今回のスライドです。典型的な勉強会ドリブン勉強ですね!

⬇ スライドは改めて Speakerdeck にアップロードしました。 speakerdeck.com

⬇ また、今回のスライドで作ったサンプルコードはリポジトリとして公開しています。スライドも入ってる。コミットログは汚いけど堪忍してくださいまし。 github.com