マップメイキングテクニック

1ランク上のマップメイカーへ


XMLの編集

ジョイントやバグ技を扱う際に、mapeditorでは設定できない要求をする場合がある。その時はXMLと呼ばれるスクリプトを直接編集する。XMLの取得はマップエディタのSave/Load/Testを参照。
XMLはメモ帳で編集する。Copy map to clipboardを実行するまえに、編集したい項目(たとえばグラウンドの反発を-1にしたいのなら、そのグラウンドのfriction)を他とかぶらないであろう数値(円周率でも虹嫁の誕生日でも)に書き換えておくとメモ帳の検索機能を使って簡単に見つけだすことができる。

お役立ちツール

xmlの編集という厄介な作業を少しでも扱いやすいものにしようと、有志たちが骨を折ってくれている。
viprin move
xmlの座標を一括して移動させることができる。
値を無記入でもxmlを見やすく改行してくれるので使い勝手がよい。
http://vipstats.s372.xrea.com/draw/move/
TFMapCanvas
いわゆる外部エディター。普通にグラウンドを並べるだけならば公式エディターのほうがよほど使い勝手がよい。しかしジョイントを視覚的に扱える、テストプレイも可能という点で画期的で、複雑なメカニズムでは真価を発揮する。
http://tfmapcanvas.webuda.com/

ジョイントを複雑に組み込ませたxmlでは、無数に膨れ上がったジョイント群の全てのM1=""M2=""の値をひとつずつずらしたいなんていう、うんざりするような場面がでてくる。このエディターをつかえばそんな悩みから解放される。もしかするとこのページにずらりと紹介されている煩雑なテクニック集も目を通す程度で間に合うのかもしれない。
Rotator
作ったマップを回転させる。回転の軸と角度を指定する。花びらなど幾何学模様のカラージョイントアート等で役に立つかもしれない。
http://tfmapcanvas.webuda.com/rotate/
Compressor
xmlを圧縮する。指定する必要のない値や、不要なスペースを削ってくれる。こちらもカラージョイントアートで、マップ投稿の上限である20kbを超えてしまった場合に役立つ。
http://tfmapcanvas.webuda.com/compress/
viprin's drawing editor!
アートマップメイカーの常識。
http://vipstats.s372.xrea.com/draw/



マップセッティング

XMLの先頭、<C><P ~のすぐ後にくる部分を編集する。複数設定する場合は半角スペースに注意。
サンプルコード、備考
画面外を隠す Ca="" <C><P Ca="" H="800" L="1600" F="1" /><Z><S><S X="800" L="400" Y="265" H="50" P="0,0,0.3,0.2,0,0,0,0" T="6" /><S X="800" L="1600" Y="775" H="50" P="0,0,0,1.2,0,0,0,0" T="2" /></S><D><T X="800" Y="243" /></D><O /></Z></C>
ナイトモード N="" <C><P N="" /><Z><S><S Y="230" T="0" P="0,0,0.3,0.2,0,0,0,0" L="130" X="400" H="20" /></S><D><DS Y="204" X="400" /></D><O /></Z></C>
横スクローリング L="1600" 1600の部分がマップの全長。800~1600の範囲で書き換え可能。800より小さくすると少し変わった動きをする。サンプルコードは「画面外を隠す」を参照。
縦スクローリング H="800" 800の部分がマップの全長。400~800の範囲で書き換え可能。400より小さくすると少し変わった動きをする。サンプルコードは「画面外を隠す」を参照。
ネズミ分割出現 DS="m;x1,y1,x2,y2" x1,y2にネズミを出現する座標を指定。DS="y;y1"とすると指定座標軸にランダムスポウン
強制スクロール defilante="速度,加速度,(速度上限),(フリースクロール)" <P defilante="10,4" L="4800" />スクロールマップの限界は1600だが、強制スクロールにかぎり4800が限界となる。
defilante(強制スクロールマップ)補足
defilanteでは設置したシャーマンオブジェクトが変化する。
  • ルーンはブースター
  • ボールはチーズ
  • 左回転青ネイルはスプリング
  • 右回転青ネイルは即死髑髏

defilante="速度,加速度,速度上限,フリースクロール"
フリースクロールの値は1か0
L="4800" defilante="-1,-1,-1,1"とすると強制スクロール無しの4800マップ



回転ネイルの挙動を細かく設定する

mapedirot上で回転ネイルを選択することもできるが、xmlをいじることでより細かい設定が可能。ジョイントタグが実装されて以降、あまり出番はない。
ネイルはシャーマンオブジェクトとしてxml上<0><0 />にはさまれた位置に格納されている。
Mp="回転の力" Mv="回転の速さ"
回転ネイルに限らずどのネイルに対しても有効。ジョイントタグに慣れてしまっているとp、vを大文字にしてしまいがちなので注意が必要。Mpの値には最大値をあらわすInfinityが有効。この値を意味を持たない文字列にすると、グラウンドを左上送りにできる。No-Bマップをつくりたいのなら便利かもしれない。Mvの値を0.4とすると、半時計回転ネイルと同等の速度を再現できる。-0.4ならば時計まわり。



Lタグによるグラウンドリンキング

xmlを直接編集し<L>タグを書き加えることで、ふたつのグラウンドを様々な形で関連付けることができる。目に見えないネイルのようなものだと思って差し支えない。xmlの一番最後の部分、<O /></Z>の間に<L></L>ではさまれたリンキングのためのスクリプトを手で書き加える。
<C><P /><Z><S><S Y="390" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="40" /><S Y="340" T="12" P="1,0,0.3,0.2,0,0,0,0" L="60" o="5b87" X="250" H="60" /><S Y="340" T="12" P="1,0,0.3,0.2,0,0,0,0" L="60" o="7b1336" X="550" H="60" /></S><D /><O /><L><JD M1="1" M2="2" /></L></Z></C>
上のサンプルではもっとも基本的なジョイント、<JD />のタグを組み込んである。<JD />だけでなく、<L>と</L>もマップエディターで生成されることはないので自分で書き込む必要がある。
サンプルでは、<JD />にM1=""とM2=""という二つのパラメータしか指定されていない。宣言されていないパラメータはデフォルト値になるので、必要な項目だけ指定すればよい。
M1、M2のデフォ値はMx="0"となる。つまりz値が0のグラウンドにリンクする場合は指定する必要がない。
M1、M2のグラウンドのどちらかが非ダイナミックグラウンドであった場合、ダイナミックグラウンドは他のグラウンドをすり抜けるようになる。(ちなみにこの場合、シャーマンオブジェクトとは判定を保つ)
これを回避するためには固定のダイナミックグラウンドをネガティブmass(質量が-1のダイナミックグラウンド)にする。
フォーマット
ジョイントは四種類用意されているが、ここで共通のパラメータをざっと紹介する。初見で理解できるはずも無いのでなめる程度にし、後でもどってくるといいかもしれない。
<J? M1="A" M2="B" P1="Xa,Ya" P2="Xb,Yb" c="色,太さ,透明度,foreground(前面)" />
J? = ジョイントの種類。JD、JP、JR、JPLの4種類がある。
M1 = 一つ目のグラウンド。グラウンドのステータスでいうZの値を指定する。エディター上で確認できる。
M2 = 関連づける二つ目のグラウンド。
P1 = M1の重心を置く座標。P1="400,50"のように絶対座標を指定する。デフォはM1の中心となる。例外的に<JR />のP1は回転軸を置く位置となる。
P2 = M2の座標。例外的に<JR />にはP2が存在しない。
c="色,太さ,透明度,階層" = ジョイントの色。デフォは無色。c=","とした場合、c="000000,1,1,0"と認識される
  • 色 = 6桁の16進数。
  • 太さ = ジョイントの太さ。もちろん見た目だけの話。マックスは255。
  • 透明度。0~1の範囲で指定。1ならば透明度はゼロ。0.5ならば半透明。
  • foreground = 1 or 0
<C><P /><Z><S><S Y="390" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="40" /><S Y="340" T="12" P="1,0,0.3,0.2,0,0,0,0" L="60" o="5b87" X="250" H="60" /><S Y="340" T="12" P="1,0,0.3,0.2,0,0,0,0" L="60" o="7b1336" X="550" H="60" /></S><D /><O /><L><JD M1="1" M2="2" c="C5C0BB,20,1,0" /><JD M1="1" M2="2" P1="270,360" P2="530,360" c="0A8C7D,30,0.4,1" /></L></Z></C>
以下に各ジョイントを紹介しているが、混乱を避けるためP1,P2の説明は省いている。サンプルにすら出していないが、前述のように<JR />にはP1が、そのほかのジョイントにはそれぞれP1、P2の両方を指定することができる。これは言ってみればネイルをつける場所のようなものだとおもってもらって差し支えない。


JDタグ - Distance Joint
二つのグラウンドの距離を一定に保つためのジョイント。グラウンドをゴムひものようなものでつなぐ感覚。soul mateをつないでいる紐に近いかもしれない。

<JD M1="A" M2="B" HZ="x" AMP="y" />
  • HZ = 揺れ幅。力が加わったときに伸び縮みする範囲と思っていい。値を小さくすると、ジョイントは弾力を持ったような動きをする。大きくすると伸縮性がなくなる。デフォは30らしい。
  • AMP = 弾力性。HZと併せて指定する必要がある。弾力性というと少し違うのだがいい言葉が見つからない。値を大きくすると元の距離から離れにくく、そして戻りにくくなる。0~1が有効範囲で、デフォは1という記事を見つけたが、すると下のサンプルと矛盾する。よくわからない。

<C><P /><Z><S><S Y="390" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="40" /><S Y="100" T="12" P="1,-1,0.3,0.2,0,0,0,0" L="80" o="5b87" X="400" H="20" /><S Y="300" T="12" P="1,0,0.3,0.2,0,1,0,0" L="60" o="7b1336" X="400" H="60" /></S><D /><O><O Y="120" P="0,1" X="410" C="10" /></O><L><JD HZ="1" AMP="5" M1="1" M2="2" c="000000,5,0.1,0" /></L></Z></C>
HZがジョイントに弾力を持たせていることがわかる。

JPタグ - Prismatic Joint
関連づけられた2つのグラウンドの角度を維持し、指定した軸での距離を一定に保つ。
外人はスライダージョイントなどと呼んでいて、この表現のほうがわかりやすいかもしれない。

<JP M1="A" M2="B" AXIS="x,y" MV="P,V" LIM1="value" LIM2="value" A="value" />
  • AXIS = 軸の指定。垂直の0,1かあるいは水平の1,0を指定する場面が多いと思われる。詳細は後述。
  • LIM1 = スライドを許す下限。ストッパーだと思っていい。下限というのはaxisの反対方向ということになる。1とすれば30ピクセルが可動域となる。
  • LIM2 = 上限。
  • MV = モーター。AXISと併せて使う。AXIS方向に力が働く。つまりお互いのグラウンドが反発しあう、あるいは引き合うような形になる。Pがパワー、Vが速度になる。Pの値には最大値をあらわすInfinityも有効。
  • A = 角度。関連づける二つのグラウンドの角度が違った場合に指定する。デフォのままではゲームが始まった途端に角度が合うように力が働いてしまう。値の指定にはラジアンを使う。ラジアンは下でおおまかな一覧を用意した。
<C><P /><Z><S><S Y="395" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="40" /><S Y="335" T="12" P="1,-1,0.3,0.2,0,0,0,0" L="100" o="3752" X="400" H="80" /><S Y="335" T="12" P="1,10,0.3,0.2,0,1,0,0" c="1" L="20" o="3752" X="465" H="80" /><S Y="195" T="12" P="0,0,0.3,0.2,0,0,0,0" L="280" o="324650" X="300" H="40" /></S><D><DS Y="160" X="330" /><F Y="170" X="390" /></D><O /><L><JP M1="1" M2="2" AXIS="0,-1" MV="500,2" LIM2="5" /></L></Z></C>
MVにより上方向に向かう。そしてLIM2がストッパーのように働いている。
AXIS="0,-1"となっているが正負は方向を示していて、MVを指定するとき以外に意味を持たない。細かい角度も、グラウンド自体を傾けることで大概の場合は解決する。
とりあえずは
<JP M1="1" M2="2" AXIS="1,0" />
<JP M1="1" M2="2" AXIS="0,1" />
これだけ覚えておけばよい。

AXISガイド
-1,1 0,1 1,1
-1,0 0,0 1,0
-1,-1 0,-1 1,-1
単純に比率の話のようで、融通がきく。AXIS="1,-2.57"で35度に近い軸を取れた。ほかにもいろいろやり方はあるだろう。

LIM1、2ガイド
10px 0.3333
20px 0.6666
30px 1

ラジアンガイド 180/π=1ラジアン
0.0873
10° 0.1745
15° 0.2618
20° 0.3491
25° 0.4363
30° 0.5236
45° 0.7854
60° 1.0572
90° 1.5708
135° 2.3562
180° 3.1416
270° 5.7124
360° 6.2832


JRタグ - Revolute Joint
グラウンドの距離を保ちつつM2を回転させるタグ。LIM1、2を指定することで回転の幅を制御できる。

<JR M1="A" M2="B" MV="P,V" LIM1="value" LIM2="value" />
  • LIM1 = 下限の角度。反時計回りの限界をラジアンで指定する。ラジアンは上に一覧がある。
  • LIM2 = 上限の角度。
  • MV = モーター。指定しなければ青ネイルのように機能する。Pがパワー、Vが速度。

P1="x,y"が設定できる。これを使うと回転の軸を設定したいときに座標を指定することができる。グラウンドから離れた場所を指定することもできる。英語のforumにはP2を指定できるような記事も散見されるが、できないんじゃないかと思う。
P1の指定をしない場合はM2の中心が回転軸となる。
双方のグラウンドの角度を固定し、且つ回転を与えるとバグる。

<C><P /><Z><S><S Y="390" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="30" /><S Y="180" T="12" P="0,0,0.3,0.2,0,0,0,0" H="10" L="10" o="53d5a" X="400" c="4" /><S Y="225" T="12" P="1,0,0.3,0.2,0,0,0,0" H="180" L="40" o="53d5a" X="400" c="1" /></S><D><T Y="375" X="163" /></D><O /><L><JR MV="50000,2" LIM2="2.35" M1="2" M2="1" /></L></Z></C>
LIM2が135度で効いている。LIMを片方でも指定した場合、もう一方は自動的に0に設定される。
双方の角度を固定して
<JR M1="1" M2="2" />
とするとかなり安定したオブジェクト群ができる。ゴンドラ状の足場なんかによく使う形になると思う。
オブジェクト群の角度は固定したくないが、オブジェクト群の中での相対的な位置関係を保ちたいのであれば
<JR M1="1" M2="2" LIM1="0" LIM2="0" />
とする。これは
<JR M1="1" M2="2" LIM1="" />
と省略することができる。ジョイントが導入される前のいわゆるrypeバグの代用として広まった表現。まだジョイントの理解が進んでいない時代、人々は意味も分からずこれをつかって壊れたマップを直した。
角度固定とLIM指定は一緒に使わないほうが好ましい。


JPLタグ
ふたつのグラウンドを、天秤のように作用する滑車でつなぐ。 P1、P2はそれぞれM1、M2のグラウンドの重心を置く場所。省略するとそれぞれのグラウンドの中心がそれになる。P3、P4は滑車の位置。Rの値を設定することで、P3-M1間、P4-M2間の力が影響しあう(距離と考えたほうがわかりやすいかもしれないが)比率を設定できる。

<JPL M1="A" M2="B" P3="x,y" P4="x,y" R="value" />
  • P3 = M1とリンクされる滑車の位置。
  • P4 = M2とリンクされる滑車の位置。
  • R = 倍率。R="1" がデフォ値。R="0.1" とすると、P4-M2間は反対側の1/10しか影響を受けなくなる。逆にR="2"とすると、P3-M1間が弱くなる。

サンプル
Rの値がM2を地面まで落とす。均衡をとらせたいならば単純にR値を取り除けばよい。
<C><P /><Z><S><S Y="390" T="12" P="0,0,0.3,0.2,0,0,0,0" L="800" o="324650" X="400" H="40" /><S Y="200" T="12" P="1,0,0.3,0.2,0,1,0,0" L="40" o="5b87" X="300" H="40" /><S Y="200" T="12" P="1,0,0.3,0.2,0,1,0,0" L="40" o="7b1336" X="500" H="40" /></S><D><T Y="370" X="400" /></D><O /><L><JPL M1="1" P3="300,100" M2="2" P4="500,100" R="0.5" c="000000,5,1,0" /></L></Z></C>
ここでは触れていないが、前述のようにP1P2を指定することも出来る。


<L>タグでお絵かきをする

ジョイントに色をつけることのできる機能を使い、絵を描くことができる。以下のパラメータを色をつけたいジョイントのタグに組み込む。

c="色。6桁のカラーコード,太さ,透明度,階層(前面or背面)"&br()
<JP /><JR />は力が加わった場合にしかジョイントの色が見えないので、<JD />か<JPL />を使用す。<JPL />のP3、P4は固定なのでダイナミックなオブジェクトには利用できないが、ひとつのタグで4点を指定できるため動かない絵であれば<JD />よりも<JPL />使い勝手がよい。
サンプル
<C><P /><Z><S><S X="400" Y="380" T="6" H="40" P="0,0,0.3,0,0,0,0,0" L="800" /><S X="320" Y="80" T="12" H="40" P="1,0,0.3,0.2,0,0,0,0" L="40" /></S><D></D><O /><L><JD P1="305,60" M1="1" c="7CE3F7,30,1,1" P2="335,60" M2="1" /><JD P1="305,100" M1="1" c="7CE3F7,30,1,1" P2="335,100" M2="1" /><JD P1="305,60" M1="1" c="7CE3F7,30,1,1" P2="305,100" M2="1" /><JD P1="335,60" M1="1" c="7CE3F7,30,1,1" P2="335,100" M2="1" /></L></Z></C>
やってみると大変な苦行であることがわかる。手で容量限界まで描いてしまうような頭のおかしいひとは数人しか確認されておらず、お役立ちツールでも紹介しているviprin's drawing editor! がアートマップメイカーの常識となっている。
http://vipstats.s372.xrea.com/draw/

20kbがmapeditorにロードできる限界。注意が必要。20kb以下というのはマップエディターにロード可能なxmlの容量であり、20kb以下のxmlを読み込んだ後にエディター上で編集することは可能。容量いっぱいの作品を投稿したい場合、マップエディターで編集できることに関してはxmlとしてロードする必要は無い。平たく言えば、20kbいっぱいにジョイントで絵を描いて、それをエディターに読み込み、その上でグラウンドを50個追加してマップを投稿することが可能。この方法で結果的に20kbを超えるマップを投稿することができる。
さらには、タグには明記する必要のない項目がいくつもある。0の値は大抵の場合空白で済ませることが出来るし、デフォルト値のままで使用する予定のパラメータであれば、そもそも項目をつくる必要が無い。たとえばジョイントのグラウンド指定のM1=""は、省略すればM1="0"として扱われる。xmlの省略を駆使すれば容量を減らすことができる。このあたりのこまごまとしたところはこのページの上の方、お役立ちツールで紹介しているCompressorにおんぶに抱っこでいいだろう。



見えないグラウンド

Froi's Invalid Rotation
角度が36000を超えると見かけ上の角度が-8で固定されたままになるバグを利用する。
ウォークスルー <C><P /><Z><S><S Y="220" T="0" P="0,0,0.3,0.2,36090,0,0,0" L="60" H="200" X="400" /></S><D><DS Y="100" X="400" /></D><O /></Z></C> 角度が36090のグラウンド。実体は水平
インヴィジブルウォール <C><P /><Z><S><S Y="220" T="0" P="0,0,0.3,0.2,36090,0,0,0" L="200" X="400" H="20" /></S><D><DS Y="100" X="400" /></D><O /></Z></C> 実体は垂直
36090の値を変えることで実体の角度は反映されるが、36000以上であるかぎり見かけの角度は変化しない。

Greendyj's Invalid Ground Color Glitch
rectangleグラウンドの色、通常6ケタの十六進数を8ケタにすることでグラウンドが見えなくなる。
エディター上でも輪郭がつかめなくなるので、マップを投稿する直前に編集するとよい。
ダイナミックグラウンドにも運用できるがネイルはつかない。
<C><P F="0" /><Z><S><S Y="255" T="12" P="0,0,0.3,0.2,0,0,0,0" L="400" o="ffffffff" X="400" H="100" /></S><D><T Y="155" X="400" /></D><O /></Z></C>

グラウンドの色項目を完全に削除する
グラウンドのタグからo=""を削除する。エディター上では黒く見え、クリックもできるので従来の色バグよりも編集しやすい。デメリットがあるとすれば、CFMのサムネイルでも黒く見えてしまうという点。
<C><P F="0" /><Z><S><S Y="255" T="12" P="0,0,0.3,0.2,0,0,0,0" L="400" X="400" H="100" /></S><D><T Y="155" X="400" /></D><O /></Z></C>



ダイナミックグラウンドを、非ダイナミックグラウンドのように設置する

ネガティブマス
その名のとおり、ダイナミックグラウンドの質量をマイナスにする。するとまるで非ダイナミックグラウンドのように、まったく動かないグラウンドができる。しかしダイナミックなのでシャーマンはネイルをつけることができる。ネイルもつかない非ダイナミックグラウンドに偽装したいのならば色バグと併用し、さらにその上にネズミ、オブジェクト両方の判定を消した見掛けだけの非ダイナミックグラウンドをかぶせるとよい。
<C><P /><Z><S><S P="1,-1,0.3,0.2,0,0,0,0" L="220" H="40" X="250" Y="380" T="0" /><S P="0,0,0.3,0.2,0,0,0,0" X="550" L="220" H="40" c="4" Y="380" T="0" /><S P="1,-1,0.3,0.2,0,0,0,0" L="220" H="40" X="550" Y="380" T="12" /></S><D><DS Y="345" X="250" /></D><O /></Z></C>
左右ともにダイナミックグラウンド。左にはネイルがつくが、右にはつかない。



シャーマン(sync)とネズミたちとで見え方の違うグラウンドをつくる

ダイナミックの角度バグ
シャーマンだけがとおり抜ける壁、あるいは逆にシャーマンだけがとおり抜けることのできない壁をつくる。作り方は先に述べたFroi's Invalid Rotationをダイナミックグラウンドにするだけ。
<C><P /><Z><S><S P="1,-1,0.3,0.2,36090,0,0,0" L="40" H="200" X="150" Y="220" T="0" /><S P="0,0,0.3,0.2,-8,0,0,0" X="400" L="40" o="666600" H="200" c="4" Y="220" T="12" /><S P="0,0,0.3,0.2,90,0,0,0" L="40" o="660000" H="200" X="400" Y="220" T="12" /><S P="0,0,0.3,0.2,-20,0,0,0" L="40" o="000066" H="200" X="650" Y="220" T="12" /></S><D><DS Y="100" X="400" /></D><O /></Z></C>
ダイナミックでは都合が悪いのでネガティブマスにした。左のwoodが件の角度バグ。シャーマンにとっては見た目が黄色の角度、実体は赤の角度にある。ここまでは非ダイナミックの角度バグと同じ。しかしシャーマン以外のねずみからすると、青の角度に見ためと実体がある。サブアカウントを作らない限りぼっちでは確認できない。



吸い付くグラウンド

スティッキーグラウンド
いくつかやり方がある。フォーラムでこのxmlを見つけたのでこのやり方が一般的なのかもしれない。申し訳ないことにどうしてこれでうまくいっているのかわからない。
<C><P /><Z><S><S X="400" H="40" Y="380" T="0" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="360" H="10" Y="317" T="13" o="000033" P="1,0,0.3,0.2,0,0,0,0" c="4" L="10" /><S X="400" H="10" Y="317" T="13" o="000033" P="1,-1,0.3,0.2,0,1,0,0" c="4" L="10" /><S X="440" H="10" Y="317" T="13" o="000033" P="0,0,0.3,0.2,0,0,0,0" c="4" L="10" /><S X="100" H="100" Y="350" T="6" P="1,-1,0.3,0.2,0,0,0,0" c="3" L="200" /><S X="700" H="100" Y="350" T="6" P="1,-1,0.3,0.2,0,0,0,0" c="3" L="200" /><S X="400" H="40" Y="20" T="0" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="400" H="20" Y="10" T="6" P="1,-1,0.3,0.2,180,0,0,0" c="3" L="800" /><S X="400" H="10" Y="356" T="3" P="1,-1,0,5,0,0,0,0" c="3" L="400" /></S><D><DS Y="290" X="100" /></D><O /><L><JPL P2="0,0" P4="0,0" P3="0,0" M1="2" M2="1" /><JPL P4="0,0" P3="0,0" M1="1" M2="3" /></L></Z></C>
個人的には以下のやり方を好んでつかっている。角度を固定したダイナミックのIRグラウンド(反発を無効な値にしたグラウンド)を<JR />で無理やり回転させて左上送りにする。そのIRと、非ダイナミックグラウンドを<JP />でつないでおく。
<C><P /><Z><S><S X="400" H="40" Y="380" T="0" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="360" H="10" Y="317" T="13" o="000033" P="1,0,0.3,.,0,1,0,0" c="4" L="10" /><S X="100" H="100" Y="350" T="6" P="1,-1,0.3,0.2,0,0,0,0" c="3" L="200" /><S X="700" H="100" Y="350" T="6" P="1,-1,0.3,0.2,0,0,0,0" c="3" L="200" /><S X="400" H="40" Y="20" T="0" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="400" H="20" Y="10" T="6" P="1,-1,0.3,0.2,180,0,0,0" c="3" L="800" /><S X="400" H="10" Y="356" T="3" P="1,-1,0,5,0,0,0,0" c="3" L="400" /></S><D><DS Y="290" X="100" /></D><O /><L><JR M1="1" M2="1" MV="Infinity,0.4" /><JP M1="1" M2="4" /></L></Z></C>
バグ状態になるとすべての非ダイナミックグラウンドがスティッキーグラウンドになる。普通に歩いたりwjをさせたいグラウンドはネガティブマス(非ダイナミックに偽装したダイナミックグラウンド)にしておく。
他に999e999を使ったやり方もある。



ブースターグラウンド

Invalid Restitutionを利用したブースター
Invalid Restitution、つまり反発を無効な値(.)にしたグラウンドを利用する。若干工夫が必要だが下向きにも設置できる。
<C><P /><Z><S><S Y="396" T="1" P="0,0,0,0.2,0,0,0,0" L="272" H="10" X="330" /><S Y="375" T="0" P="0,0,0.4,.,0,0,0,0" L="10" X="461" H="50" /><S Y="371" T="0" P="1,99999,9,.,0,1,0,0" L="262" X="308" H="40" /><S Y="375" T="0" P="0,0,0.3,0.2,0,0,0,0" L="50" H="50" X="545" /><S Y="249" T="0" P="1,999999,2,.,0,1,0,0" L="100" H="220" X="719" /><S Y="127" T="0" P="0,0,0.3,.,0,0,0,0" L="100" X="719" H="20" /><S Y="259" T="0" P="0,0,0,0,0,0,0,0" L="10" H="284" X="774" /><S Y="390" T="3" P="0,0,0,20,0,0,0,0" L="100" H="20" X="719" /><S Y="325" T="8" P="1,99999,0,24,45,0,0,0" L="16" X="172" H="16" /></S><D><DS Y="336" X="220" /></D><O /></Z></C>
IRグラウンド(反発が無効な値のダイナミックグラウンド)を、IRグラウンドにぶつけることで力が発生する。
ダイナミックグラウンドのfixed rotationを有効にすることと、重量を最大値にすることを忘れないように。
縦に置くと重力の影響をうけるので力が変化する。
横に置いたものは最大重量のダイナミックグラウンドをぶつけてきっかけをつくる。ぶつけたあとのこのグラウンドの行方に注意。
要求する挙動を得られるように摩擦を調節する。



ダイナミックグラウンドを左上送りにする

IFグラウンドなどと呼ばれるメカニズムマップに欠かせない仕掛け。Invalid Frictionとは名ばかりで摩擦の値は関係ない。かつての仕様の名残り。一回使いきりのスイッチなんかにはこれが使われる。
999e999mass
ダイナミックグラウンドの質量を999e999にする。
<C><P /><Z><S><S L="100" o="324650" H="100" X="400" Y="400" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S L="100" H="50" X="520" Y="375" o="000066" T="12" P="1,999e999,0,0,0,1,30,0" /></S><D /><O /></Z></C>
この場合、丸いオブジェクトしか左上送りにすることはできない。シャーマンオブジェクトでいえばボールやルーンはワープするがボックスはワープしない。ネズミは丸いのでワープする。(丸いグラウンドをバグ状態にすると、四角いオブジェクトに対しても影響を及ぼすようになるが、角度を持たせたオブジェクトに対する判定の位置が少し面倒になる)
ワープしたオブジェクトとリンクされているオブジェクトも同時にワープする。丸いグラウンドとリンクさせておけば四角いオブジェクトもワープさせることができる。
<C><P /><Z><S><S P="0,0,0.3,0.2,0,0,0,0" L="200" X="350" H="100" Y="400" T="0" /><S P="1,999e999,0.3,0.2,0,0,0,0" L="100" o="000066" H="50" X="520" Y="375" T="12" /><S P="1,1,0,0,0,1,30,0" X="400" L="20" o="ffffff" H="30" c="3" Y="335" T="12" /><S P="1,1,0,0,0,1,30,0" H="10" L="10" o="ffffff" X="500" c="2" Y="325" T="13" /><S P="1,9999,0,0.2,0,1,30,0" L="40" H="40" X="280" Y="330" T="1" /></S><D><DS Y="335" X="350" /></D><O /><L><JR M2="4" M1="1" /><JP AXIS="0,1" M1="2" M2="4" /><JR M2="3" M1="2" /></L></Z></C>
ダイナミックのアイスは、大胆にもIFとリンクして固定している。マス999e999が知られるまでの主流である非ダイナミックをバグらせる方法を経験していると衝撃をうける。

全ての非ダイナミックグラウンドをIFグラウンドにする
角度を固定したダイナミックグラウンドと、非ダイナミックグラウンドを<JR />で繋ぎ、無理やり回転させてバグ状態を作る。するとすべての非ダイナミックグラウンドがIFグラウンドになる。
999e999massを知っていれば、この方法を知っておく必要はないかもしれない。
<C><P /><Z><S><S P="1,-1,0.3,0.2,0,0,0,0" L="100" o="324650" X="400" H="100" Y="400" T="12" /><S P="0,0,0.3,0.2,0,0,0,0" L="100" o="000066" H="50" X="520" Y="375" T="12" /><S P="1,0,0.3,0.2,0,1,0,0" L="40" o="006600" H="40" X="520" Y="250" T="12" /></S><D /><O /><L><JR M2="2" M1="1" MV="Infinity,0.4" /></L></Z></C>
999e999massと同様、丸いオブジェクトしか左上送りにすることはできない。すべての非ダイナミックグラウンドがIFグラウンドになるのでネズミが触れるグラウンドはすべてネガティブマスにしておかなければならない。

sync依存のIFグラウンド
ネガティブマスのグラウンドをバグ状態にする。
問題なく機能しているように見えるがsyncのみにしかバグ状態は起こっていない。syncからみて何かしらのオブジェクトが左上にワープすると、すぐにネズミたちにもグラウンドの位置が同期されるのでまったく機能しないわけではないが、大変に見苦しい。ちょうどシャーマンのスピリットバグと同じ現象だとおもってもらえばいい。
<C><P /><Z><S><S P="0,0,0.3,0.2,0,0,0,0" L="100" o="324650" X="400" H="100" Y="400" T="12" /><S P="1,-1,0.3,0.2,0,0,0,0" L="100" o="000066" H="50" X="520" Y="375" T="12" /><S P="1,0,0.3,0.2,0,1,0,0" L="40" o="006600" H="40" X="520" Y="250" T="12" /></S><D /><O /><L><JR M2="2" M1="1" MV="Infinity,0.4" /></L></Z></C>

ダイナミックIF
反発の値をを999e999にする。単純に999e999と呼ばれることもある。
ゆっくりぶつかると機能しない。liner5.8が限界らしい。四角いグラウンドにも問題なく引導を渡せる。接触に勢いを持たせる工夫さえできれば、一番使いやすいかもしれない。何よりも動かせるというのが最大のメリット。
<C><P /><Z><S><S L="100" o="324650" H="100" X="400" Y="400" T="12" P="0,0,0.3,0.2,0,0,0,0" /><S L="100" H="50" X="520" Y="375" T="3" P="1,0,0,999e999,0,1,30,0" /></S><D /><O /></Z></C>
ちなみにネガティブmassと併用すると、一回だけオブジェクトをワープさせた後にスティッキーグラウンドへ変化する。



テレポート

横置きタイプ
反発を最大値にしたlavaでネズミを吹っ飛ばすことによって、瞬間移動したようにみせる。
<C><P /><Z><S><S Y="383" T="8" P="0,0,0.3,0.2,0,0,0,0" L="83" X="400" H="65" /><S Y="392" T="5" P="0,0,0.3,0.2,0,0,0,0" L="10" H="85" X="440" /><S Y="380" T="5" P="0,0,0.3,0.2,0,0,0,0" L="10" H="63" X="360" /><S Y="375" T="6" P="0,0,0.3,0.2,0,0,0,0" L="80" H="50" X="250" /><S Y="378" T="3" P="0,0,0,9999,0,0,0,0" L="80" H="50" X="400" /><S Y="377" T="6" P="0,0,0.3,0,0,0,0,0" L="80" X="550" H="50" /><S Y="61" T="0" P="0,0,0,0,-20,0,0,0" L="100" H="10" X="400" /><S Y="80" T="0" P="0,0,0,0,70,0,0,0" L="100" X="609" H="10" /></S><D><T Y="352" X="250" /></D><O /></Z></C>
頭上の反射板二枚と、着地点は反発を0にする。
サンプルでは、ネズミがlavaの側面、角に触れないようにアースグラウンドではさみこんである。
lavaに雲をかぶせてあるが、これはクラッシュさせないためにこのような措置をとることが望ましいとされている。lavaの、オブジェクトとの判定を消せば問題ないだろう。
走りながら落下してlavaに乗るとうまく動かないので、ネズミが自らジャンプしてlavaに飛び乗るようなデザインにするのが望ましい。
瞬間移動の距離が伸びれば伸びるほど予期せぬ動作を起こしやすくなる。長距離のテレポートは縦置きタイプが安定する。

縦置きタイプ
lavaを縦に置くタイプ。精度が高い。
<C><P /><Z><S><S X="400" H="50" Y="375" T="6" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="5" H="100" Y="300" T="3" P="0,0,0,9999,0,0,0,0" L="10" /><S X="795" H="100" Y="300" T="3" P="0,0,0,9999,0,0,0,0" L="10" /></S><D><T Y="350" X="400" /></D><O /></Z></C>
ご想像のとおり、lavaが高反発でなければ大変なことになる。
lavaに当たった時の高さも維持される。
<C><P /><Z><S><S X="400" H="50" Y="375" T="6" P="0,0,0.3,0.2,0,0,0,0" L="800" /><S X="795" H="100" Y="300" T="3" P="0,0,0,9999,0,0,0,0" L="10" /><S X="5" H="100" Y="300" T="2" P="0,0,0,1.2,0,0,0,0" L="10" /></S><D><T Y="350" X="400" /></D><O /></Z></C>
受け止める側はlavaである必要はない。


マップローテーションガイドライン

CFMについて
transformiceのマップデータベースサイト。ゲーム内から自分の投稿したマップを確認できないというでたらめな仕様なので、CFMを知らずにマップ製作に没頭することは困難。
http://cheese.formice.com/
自分でつくったマップを検索するためには登録が必要。CFMのアカウント名は、ゲームでの自分のアカウントと同一であることが求められる。メールアドレスは任意。パスワードを決めて申請すると暗号が生成される。その暗号を、ゲーム内からCFMのボットにwhisperすると登録が完了する。ちなみにCFMのボットは/room *801に常駐している。

マップローテーションガイドライン
CFMで確認してもらえばわかるとおり、ユーザーマップは無数にある。100万に迫ろうかという勢いで日々増えている。一年間廃プレイして、一回でも自分のマップが引ければ幸運といえる。それでもせっかくマップを作るとなれば、やはりたくさんの人にプレイしてもらいたい。そのためには high perm あるいは higher perm などと呼ばれる、ローテーションでよく出現するマップに認定してもらう必要がある。

マップにはそのマップの評価や性格によってP0~P44というステータスが与えられている。チャットコマンドの/infoから、現在表示されているマップのステータスを確認することができる。ステータスのうち主なものは、左上のアイコンから判断することもできる。

ユーザーが投稿できるマップはP0かP22(ハウスマップ)のどちらかに限られる。投稿したP0マップがプレイヤーの投票により斥けられればP44(削除済み)となる。その他のステータスについては、マップクルー(map crew)と呼ばれる官僚組織が管理している。つまり自分の作ったマップを多くの人にプレイしてもらいたいのであれば、マップクルーのお墨付きをもらわなければならない。

マップクルーのお墨付きをもらうためにはコネをつかうか、あるいは公式フォーラムの投稿スレ(Map submission thread)に投稿すると担当のクルーがお役所仕事で評価(review)してくれる。レビューしてくれたクルーが、完成度の高いマップだと認めてくれればP1(後述)にしてもらえるかも知れない。それ以上の価値があると判断されればディスカッション行きとなり、クルーの複数のメンバーで行うディスカッションのテーブルへとあげてくれる。出張なんでも鑑定団でいうところの「スタジオへ」というわけである。

投稿スレに投稿する際には、作ったマップの特性にあったカテゴリを選ぶこと。各カテゴリには条件があり、スレのテンプレに記されている。


以下、主なマップステータスについて簡単に説明する。

P1 (Protection)
楽しめるマップであることが条件。クルー個人の裁量で認定することができるため、あまり価値のあるものとは思われていない。higher perm というとき、それにP1は含まれない。しかしP1マップひとつにつきマップ投稿コストが4チーズ割引されるので、駆け出しのマップメーカーはまず目標にしたいところ。現在P1の投稿スレは無く、前述の通り何れかのカテゴリの投稿スレ、あるいはコネや賄賂、何らかの縁でクルーの目に止まればP1に認定してもらえる。

これより後に説明するP3以降のステータスはhigher permなどとも呼ばれ、投稿コストはひとつにつき10チーズ割引される。

P3 (Prime Bootcamp)
上位のブートキャンプマップ。P13もブートキャンプマップであるが、こちらはブートキャンプマップでいうところのP1といえるかもしれない。

P4 (Single Shaman)
シャーマンマップ

P5 (Art/Monster map)
アートマップ
進化が激しい。普通にプレイしていて古いP5マップなんかを見ると、これくらいなら作れそうだと思うかもしれないが、生半可な作品ではきっとはねつけられる。アートの完成度に加え、レーシング要素、メカニズム要素などが求められる難しいカテゴリではあるが、P1は狙いやすいかもしれない。

P6 (Trap/Mice Coop/Mechanism)
メカニズムマップ
斬新さが大事。二番煎じ乙を回避するためにも、インスピレーションを得るためにも他の人のマップを知っておくといいかもしれない。メカニズムの知識も必要だが、レトロな仕掛けで評価されることもある。

P7 (No-sham map)
レーシング

P8 (Dual-sham map)
ダブルシャーマンマップ

P9 (Miscellaneous maps)
複合的なマップというのがそのままの意味。複合的にみえても、メカニズムやアート要素があればそちらに分類されることが多い。ソウルメイトマップ、コリジョンマップはここに分類される。

P10 (Survivor maps)
サバイバーマップ

P11 (Vampire maps)
ヴァンパイアマップ

P17 (Racing)
room racing用のレースマップ
シャーマンオブジェクト、バックグラウンド、ダイナミックグラウンドは禁止されている。グラウンドのパラメータをいじることも基本的に禁止されている。wj trampなどは例外の模様。

その他、公式でないミニゲームの専用マップにはステータスが与えられないが、投稿スレが存在しているものもある。

|