2026/04/05(日)Serissaで遊ぶときに使える情報まとめ
投稿日:
様々な情報やファイルが散逸しているが、一応何とかなったのでログを残しておく。用がある人はもう持っているだろうし、今時どこに需要があるのか全く分からない情報だ。
言わずもがな裸パッチ関連であるので、未成年は参考にしないこと。
解ってる人向けの記事なので、細かいことは書いてません。
ECOクライアントの入手先
Serissa用に最適化されたファイルが入っているので、落として来てeco.exeを叩けば、そのまま使える。
視点解除
eco.exe向けのレジストリ変更コード。とりあえず全部当ててておけばいいと思う。eco.verの中身が506の状態で確認している。
; シアターモード
8B 44 37 18 → 6A 04 58 90
; 視点解除
83 F8 04 75 2B → 83 F8 04 90 90
F3 0F 10 45 08 0F 2F C8 0F 86 → F3 0F 10 45 08 0F 2F C8 90 E9
; ズーム解除
76 05 0F 28 CA EB 08 0F 2F C8 76 03 → EB 05 0F 28 CA EB 08 0F 2F C8 EB 03
; 壁や地面の強制ズーム解除
84 C0 74 63 F3 → 84 C0 EB 63 F3
Serissa
入手先
基本的にこれ自体を使うことはないが、一応載せておく。
起動方法
ローカルで動かすだけであればeco.exeを蹴れば使える。
どっかのサーバーに繋ぐ場合はeco_flight.exeを蹴る。
SerissaでModを使う
以下のようなパスを作り、そこに配置すれば動く。この時ファイル名の先頭のpri-は消す。
Emil Chronicle Online\Serissa\data\chara5\tex
Serissaサーバー
アイテムの取り方
以下をチャットに流せばアイテムがとれる。
/item {アイテムID}
アイテムIDはEmil Chronicle Online\Serissa\csvの中にあるCSVファイルに入っているので頑張って探す。ゲーム内のヘルプからも一応探せるが、非常に不便で探せないアイテムもあるためお勧めしない。
参考までに一番使うであろう、お顔スイッチャーとヘアカラーのIDを以下に残しておく。
お顔スイッチャー
item3.csvに定義がある。
各お顔スイッチャーの中の見た目は、FaceImageSwitcher - ECO-Wiki (lycolia)が分かり易いだろう。
| アイテムID | お顔スイッチャー |
|---|---|
| 16017300 | お顔スイッチャー1 |
| 16017301 | お顔スイッチャー(ネコマタ) |
| 16017302 | お顔スイッチャー(守護魔) |
| 16017303 | お顔スイッチャー1(ライト) |
| 16017304 | お顔スイッチャー(アルマ・1) |
| 16017305 | お顔スイッチャー2 |
| 16017306 | お顔スイッチャー(ロア) |
| 16017307 | お顔スイッチャー(アルマ・2) |
| 16017308 | お顔スイッチャーEX1 |
| 16017309 | お顔スイッチャー(御魂) |
| 16017310 | お顔スイッチャー3 |
| 16017311 | お顔スイッチャー(アルマ・3) |
| 16017312 | お顔スイッチャー(アルマ・4) |
| 16017400 | EXエモーション |
| 16017500 | お顔スイッチャー(エミル) |
| 16017600 | お顔スイッチャー(タイタニア) |
| 16017700 | お顔スイッチャー(ドミニオン) |
| 16017800 | お顔スイッチャー(DEM) |
| 16017900 | お顔スイッチャー(特殊) |
ヘアカラー
item.csvに定義がある。
| アイテムID | ヘアカラー |
|---|---|
| 10031301 | ヘアカラー・チェリーレッド |
| 10031302 | ヘアカラー・ジェードパープル |
| 10031303 | ヘアカラー・ブルー |
| 10031304 | ヘアカラー・アイスブルー |
| 10031305 | ヘアカラー・グリーン |
| 10031306 | ヘアカラー・ライトグリーン |
| 10031307 | ヘアカラー・キャンディーイエロー |
| 10031308 | ヘアカラー・オレンジ |
| 10031309 | ヘアカラー・マットブラック |
| 10031310 | ヘアカラー・ダルグレー |
| 10031311 | ヘアカラー・シルバー |
| 10031312 | ヘアカラー・モイストシルバー |
| 10031313 | ヘアカラー・エミルカラーライト |
| 10031314 | ヘアカラー・エミルカラーミドル |
| 10031315 | ヘアカラー・エミルカラーヘビー |
| 10031316 | ヘアカラー・タイタニアカラーライト |
| 10031317 | ヘアカラー・タイタニアカラーミドル |
| 10031318 | ヘアカラー・タイタニアカラーヘビー |
| 10031319 | ヘアカラー・ドミニオンカラーライト |
| 10031320 | ヘアカラー・ドミニオンカラーミドル |
| 10031321 | ヘアカラー・ドミニオンカラーヘビー |
| 10031322 | ヘアカラー・オータム |
| 10031323 | ヘアカラー・ウィンター |
| 10031325 | ヘアカラー・サマー |
| 10031326 | ヘアカラー・スプリング |
| 10031327 | ヘアカラー・ペールゴールド |
| 10031328 | ヘアカラー・セラミックホワイト |
| 10031329 | ヘアカラー・ダークブルー |
| 10031330 | ヘアカラー・ライトバイオレット |
| 10031331 | ヘアカラー・メタリックピンク |
| 10031332 | ヘアカラー・モスグリーン |
| 10031333 | ヘアカラー・エメラルドグリーン |
髪型の変え方
アップタウン北の白の聖堂の右にいるNPC「ニーベルングのヘアサロン」にて、紹介状を消費して髪型を変更する。
紹介状は前述した方法でアイテムIDを調べて手に入れる。膨大にあるのと、複数ファイルにまたがっているためここには載せない。
ツール類
解凍くん
lyna.spaceにあるuneco.zipの中にあるやつで代用できる。
抜いたデータは前述した「SerissaでModを使う」に突っ込めばいい
再構築くん
入手不可能だと思う。前述した「SerissaでModを使う」と、後述する「MRB2PMX20171129」の内容で代用できるため、事実上不要だ。
MRB2PMX20171129
某所にもあるが、ライセンス上支障なさそうなため、ここにも置いておく。
こちらでModを使う場合は以下のようなunpack形式のパスが必要。
Emil Chronicle Online\unpack\data\chara5\tex.dat
PictBearSE EcoTga Plug-in
恐らくもう入手できないが、なくてもTGAを弄ることは可能なので後述する。
Susie EcoTga Plug-in(ifeco)
恐らくもう入手できないが、手元にあったので本当はよくないのだが、作者に連絡を取る方法も不明なため、ここに転がしておく。
これは、もし公開しないでほしいと作者から連絡が来たら公開を止める予定だ。
データファイルからTGAを抜いて加工して戻す方法
- 前述したunecoでtex.hedを開き、全選択して中身を適当なフォルダに出力
- TGAをLinarで開き、PNGで保存する
- PNGを好きにいじる
- MRB2PMX20171129付属の
EcoSpr.exeにPNGを突っ込んでTGAに戻す - このTGAを
Emil Chronicle Online\Serissa\data\chara5\texなど、適切なパスに配置する- MRB2PMX20171129でも使う場合は、
Emil Chronicle Online\unpack\data\chara5\tex.datなど、unpack系の適切なパスにも配置する
- MRB2PMX20171129でも使う場合は、
TGAから置換する方法
パッチに入ってるpre-hogehoge.tgaをEmil Chronicle Online\Serissa\data\chara5\texなど、適切なパスに配置するときの逆引き方法。
MRB2PMX20171129でその衣装を着せて情報を開き、衣装らしきやつのMRBのパスがchara5ならchara5\texに突っ込めばたぶん行ける。
アレゲなパッチ類
以下に転がっている。
wget http://某所/uploda/src/file{1..179}.zip
トラブルシューティング
某所ってどこ?
それはここには書けない。
2026/02/22(日)COM3D2のキャラデータをカスタムキャストで使う方法
カスタムキャスト側でCOM3D2のプリセットを再現しようとすると、色周りの設定が数値指定できない関係で難しすぎたので、何とかしようとして見つけた方法。
一撃で同じキャラを持ってこれるのでだいぶ楽。
必要なもの
- スマホとPCを繋ぐためのUSBケーブル
- バイナリエディタ
- COM3D2
- カスタムキャスト
確認環境
| Env | Ver |
|---|---|
| Android | 16 |
| COM3D2 | 2.29.4 |
| カスタムキャスト | 1.04.01 |
やり方
- スマホをUSBケーブルでPCに繋ぐ
- スマホ側の接続形態を充電からファイル転送モードにする
- カスタムキャストを開いて適当に服・体プリセットをセーブする
内部共有ストレージ/Android/data/jp.customcast.cc2/files/Presetを開き、保存したプリセットを取り出す- COM3D2を開き、カスタムキャストで使いたいキャラのエディット画面を開き、服・体プリセットを保存する
- バイナリエディタでCOM3D2のプリセットファイルを開き、
454E44AE426082を検索し、そこより先にあるバイナリコードをすべてコピーする

- カスタムキャストのプリセットを開き、
454E44AE426082を検索し、そこより先にあるバイナリコードを、先ほどコピーしたCOM3D2のバイナリコードですべて上書きし、保存する - 保存したカスタムキャストのプリセットファイルを
内部共有ストレージ/Android/data/jp.customcast.cc2/files/Presetに戻す - カスタムキャストを開き、キャラエディットからプリセットをロードする
備考
恐らくファイルヘッダ以外ほぼ互換だと思われるが、ヘッダのリプレースが面倒なのでボディを書き換えることで達成した。
当たり前だがMODとかは反映されない。
おまけ
データを個別に取得して弄れるようにしようとツールを書こうとしていたが、パラメーターが多いのと、フォーマットが異なるものがあり、解析に飽きたので調べた残骸として残しておく。
using System.Diagnostics;
using System.Text;
class Program {
static void Main(string[] args) {
string filePath = @"C:\path\to\pre_Dummymaid_20260222134142.preset";
if (!File.Exists(filePath)) {
Debug.WriteLine($"ファイルが見つかりません: {filePath}");
return;
}
byte[] fileData = File.ReadAllBytes(filePath);
Debug.WriteLine($"ファイル読み込み完了: {fileData.Length} bytes");
var obj = new ParamFinder(fileData);
var MuneL = obj.FindBodyValue("MuneL");
var MuneS = obj.FindBodyValue("MuneS");
var MuneTare = obj.FindBodyValue("MuneTare");
var RegFat = obj.FindBodyValue("RegFat");
var Hara = obj.FindBodyValue("Hara");
var RegMeet = obj.FindBodyValue("RegMeet");
var KubiScl = obj.FindBodyValue("KubiScl");
var UdeScl = obj.FindBodyValue("UdeScl");
var EyeSclX = obj.FindBodyValue("EyeSclX");
var EyeSclY = obj.FindBodyValue("EyeSclY");
var EyePosX = obj.FindBodyValue("EyePosX");
var EyePosY = obj.FindBodyValue("EyePosY");
var EyeClose = obj.FindBodyValue("EyeClose");
var EyeBallPosX = obj.FindBodyValue("EyeBallPosX");
var EyeBallPosY = obj.FindBodyValue("EyeBallPosY");
var EyeBallSclX = obj.FindBodyValue("EyeBallSclX");
var EyeBallSclY = obj.FindBodyValue("EyeBallSclY");
var FaceShape = obj.FindBodyValue("FaceShape");
var MayuY = obj.FindBodyValue("MayuY");
var HeadX = obj.FindBodyValue("HeadX");
var HeadY = obj.FindBodyValue("HeadY");
var DouPer = obj.FindBodyValue("DouPer");
var Sintyou = obj.FindBodyValue("sintyou");
var Koshi = obj.FindBodyValue("koshi");
var Kata = obj.FindBodyValue("kata");
var West = obj.FindBodyValue("west");
var MuneUpDown = obj.FindBodyValue("MuneUpDown");
var MuneYori = obj.FindBodyValue("MuneYori");
Debug.WriteLine($"MuneL: {MuneL}, MuneS: {MuneS}, MuneTare: {MuneTare}, RegFat: {RegFat}, Hara: {Hara}, RegMeet: {RegMeet}, KubiScl: {KubiScl}, UdeScl: {UdeScl}, EyeSclX: {EyeSclX}, EyeSclY: {EyeSclY}, EyePosX: {EyePosX}, EyePosY: {EyePosY}, EyeClose: {EyeClose}, EyeBallPosX: {EyeBallPosX}, EyeBallPosY: {EyeBallPosY}, EyeBallSclX: {EyeBallSclX}, EyeBallSclY: {EyeBallSclY}, FaceShape: {FaceShape}, MayuY: {MayuY}, HeadX: {HeadX}, HeadY: {HeadY}, DouPer: {DouPer}, Sintyou: {Sintyou}, Koshi: {Koshi}, Kata: {Kata}, West: {West}, MuneUpDown: {MuneUpDown}, MuneYori: {MuneYori}");
}
}
class ParamFinder {
private Byte[] FileData;
static byte[] CreateBinaryStringBytes(string text) {
using var ms = new MemoryStream();
using var writer = new BinaryWriter(ms, Encoding.UTF8);
writer.Write(text);
writer.Flush();
return ms.ToArray();
}
/// <summary>
/// バイト配列内から指定パターンの最初の出現位置を返す (見つからなければ -1)
/// </summary>
static int FindPattern(byte[] data, byte[] pattern) {
int limit = data.Length - pattern.Length;
for (int i = 0; i <= limit; i++) {
bool match = true;
for (int j = 0; j < pattern.Length; j++) {
if (data[i + j] != pattern[j]) {
match = false;
break;
}
}
if (match)
return i;
}
return -1;
}
public ParamFinder(Byte[] fileData) {
this.FileData = fileData;
}
public int FindBodyValue(string subject) {
byte[] signature = CreateBinaryStringBytes(subject);
int sigOffset = FindPattern(this.FileData, signature);
if (sigOffset < 0) {
throw new Exception($"エラー: データセクションのシグネチャ '${subject}' が見つかりませんでした。");
}
using var ms = new MemoryStream(this.FileData, sigOffset, this.FileData.Length - sigOffset);
using var reader = new BinaryReader(ms, Encoding.UTF8);
reader.ReadString();
reader.ReadString();
reader.ReadInt32();
reader.ReadInt32();
reader.ReadString();
reader.ReadInt32();
reader.ReadInt32();
return reader.ReadInt32();
}
}


