ペットを調教する ==================== by snelling@bmerh466.bnr.ca (Peter Snelling), dedos4@win.tue.nl (Boudewijn Wayers), and butler@cluster.gps.caltech.edu (Bryan Butler). 日本語訳: dq-ml 和訳プロジェクト akatsu@trdc.ti.com (長本 明) Boudewijnさん曰く ~~~~~~~~~~~~~~~~~ 店から盗みを働く"安全な"方法は、ペットにものを盗ませる方法である。店の入口に 立って、ペットを店の中に入れる。そのうち、ペットは何かを拾い上げるだろう(も ちろん、全部が呪われている場合は別だが)。そして、しばらくすると、それをどこ かに置く。 しばらくすると、ペットが何かをあなたの目の前(店の入口、扉の隣)に置くことが あるだろう。そこにあるものは、ただで手に入れることができる。 もちろん、ペットが何かをそこに置く確率は大きくはない。あなたがやらなくてはな らないことは、ペットがそこに何かを置いた直後(そこから動く前に)に食べるもの (乾し肉が良い)を投げることである。ペットの方があなたよりも速いだろうから、 これは難しいかも知れない。成功すると、ペットはその場所に何かを置くと餌がもら えることを"学習"し、それを繰り返すようになる。食料を投げてあげるのが頻繁であ ればあるほど、ペットは早くそれを覚える。一度投げただけではあまり効果はないだ ろうが、二度三度と投げれば効果があるだろう。 Peterからの返答 ~~~~~~~~~~~~~~~ 以前、これが"厳密に"どのようになっているかを考えた。 - 食料を投げるのは、ペットがものを置いた場所から動く前でなくてはならないのか? - それはペットがものを置いたターンの次のターンでなくてはならないのか? - 餌を投げるのはペットがものを置くまで待たなくてはならないのか? ソースコードでは、それらを示すものを見つけることができなかった。基本的には、 ペットに食料を投げると、ペットはより一層飼い慣らされた状態になる。ペットは 飼い慣らされるほど、何かを拾い上げて、それをあなたの隣に置きやすくなる(そ してそれをするたびに少しずつ飼い慣らされていない状態になってゆく)。 さらに、ペットをより"飼い慣らされた状態にする"ためには、実際に乾し肉を投げ る必要はないのである。ペットは一度あなたが手にしたもの(ゲームシステムは、 以前あなたがそれを持ってたことがあるかどうかを示すために所持品に対する文字 を記憶している)を食べるたびに、"より飼い慣らされた状態"になるのである。 したがって、乾し肉を売っている雑貨やに入った時に、お金を持っていなかったら、 ペットを中に入れずに扉を閉め、中にある乾し肉を一度拾い上げてから元に戻して おく。そして、ペットを中に入れる。ペットは乾し肉を食べて、より飼い慣らされ た状態になる。そして、店の中のものを拾い上げて、あなたの隣に置くようになる だろう。 これをもっと改善するためには、店の中になにか呪われたものを置いて、店の中の ものでいらないものをすべてその上に載せるといい。こうすれば、ペットがいらな いものを持ってこなくなるので、時間を節約することができる。 ペットにひとつ乾し肉を与えることでいくつのものを盗むことができるかを調べた いと思ったことがある。主要なソースコードはdogmove.cにあった。 /* It's a reward if it's DOGFOOD and the player dropped/threw it. */ /* We know the player had it if invlet is set -dlc */ if(dogfood(mtmp,obj) == DOGFOOD && obj->invlet) #ifdef LINT edog->apport = 0; #else edog->apport += (unsigned)(200L/ ((long)edog->dropdist+moves-edog->droptime)); この数式はやや複雑である。ゲームが進むと(1/moves)、ペットを飼い慣らされた状 態にするのが難しくなるようである。ペットが何かをあなたの隣に置くたびに、 apportは減少してゆく。 Brianのこれに続くコメント ~~~~~~~~~~~~~~~~~~~~~~~~~ edog->droptimeの値はペットが最後に何かを置いたときの移動数であるので、(moves - edog->droptime)はペットが最後に何かを置いてから移動した回数になる。したがっ て、ゲームが進んでもペットを飼い慣らすのは難しくはならない。また、ペットが何 かを置いたらすぐに乾し肉/食料を投げてやることで、(moves - edog->droptime) を 最小にすることができ、edog->apportはかなり上昇する。edog->dropdistは、最後に ペットが何かを置いた時のあなたとペットとの間の距離である(これはペットがどの 程度あなたを好きかを表す尺度のようなものである。ペットはあなたを好きであるほ ど、あなたがから餌をもらったときにさらに好きになる度合が大きい)。 次の質問は、"ペットはいつ、ものを置こうとするのか?"である。 これは、2つのチェックで行なわれていて、両方のチェックに成功しなくてはならな い(dogmove.cを参照)。 第1のチェック !rn2(udist) || !rn2(edog->apport) これは、あなたとペットとの距離と、ペットがどのくらいあなたを好きであるかを調 べている。ペットが非常に近くにいるか、ペットがあなたを嫌いでないならば、この チェックは成功する。udistはあなたとペットの間のユークリッド距離の2乗であるの で、ペットが下の図のように隣にいるなら d d@d d このチェックは必ず成功する。もし、ペットが斜めに隣接している時には d d @ d d ユークリッド距離の2乗は2になるので、チェックが成功する確率は50%になる。また、 ペットがあなたを好きでない時にもチェックは成功する(edog->apportの最小値は1で あるので、rn2(1)は必ず0になる)。 第2のチェック rn2(10) < edog->apport つまり、ペットの愛(edog->apport)が10以上であれば、このチェックは必ず成功する。 その他の場合には、ペットがものを置く確率は 100x(edog->apport)/10 % で与えられている。したがって、ペットがあなたを好きでない場合には、ペットが持っ ているものを置く確率は10%(edog->apportの最小値は1である)となる。 あなたが店にいて、扉のところに立ち、ペットが"無料の"場所にものを置いたとしよ う。この場合、すぐにペットに乾し肉を投げるといい(注:これはペットのあなたに 対する愛を最も大きくするが、置いたものをすぐに拾い上げてしまうかもしれないと いう問題点もある)。そうすれば、ペットのapportは、 edog->apport += (200/(1+1)) (edog->apport += 100). だけ、増加する。 注:あなたが乾し肉を投げるのに1ターンしか使わなかったので、この場合(moves - edog->droptime)は1である。次のような場合もあるだろう。ペットが"無料の"場所か ら移動するのを待ってから、乾し肉を投げる(ペットが置いたものをすぐに拾いあげ たりしないことを確認するため)。この場合には、 edog->apport += (200 / (1 + 2)) (edog->apport += 66) となるし、実際にそのアイテムを拾ってから、乾し肉を投げるのであれば、 edog->apport += (200 / (1 + 3)) (edog->apport += 50) となる。ここで、edog->apportは、ペットがものを置くたびに1ずつ減少するので、 店一軒につき1つの乾し肉を投げてやれば、商品をすべて持ち出すのに十分である だろう。