ロックマン2の最初に表示されるクレジットロゴの表示アニメーションを移植。
着々とお構いなしに🙄
フェードイン/フェードアウトもエミュレータのHex Editorで該当っぽい箇所を見つけて解析。
そのままメモリを擬似実装して再現してみました( ˘ω˘)
とにかくクオリティ重視。
リファクタリングは進め中😅🙏
namespace modules {
namespace phase {
CreditLogoState::CreditLogoState() {
using namespace factory;
using namespace factory::interface__;
abstract__::ClayDiecast* graph = new GraphicClay();
IClays* gadget = graph->createDiv("assets/graphic_material/BG_tile/General/FLAT_NUMBER_PACK_30.png", 10, 10, 1, 8, 8);
BG_.push_back(gadget);
gadget = graph->createDiv("assets/graphic_material/BG_tile/General/FLAT_ALPHABETS_PACK_30.png", 32, 16, 2, 8, 8);
BG_.push_back(gadget);
SetBackgroundColor(0x00, 0x00, 0x00); // TODO:NESパレット背景色。環境変数化。
circuit.lounge = 0x01, circuit.lap = 0x12, circuit.counter = 0x08;
delete graph;
}
CreditLogoState::~CreditLogoState() {
BG_.shrink_to_fit();
}
void CreditLogoState::memoryOperation(void) {
// Spining register.
circuit.counter--;
if (circuit.counter == 0x00) {
circuit.lap--;
circuit.counter = 0x08;
}
if (circuit.lap < 0) {
circuit.lounge--;
circuit.lap = 0x12;
}
}
bool CreditLogoState::changePAL(int no) {
int red, green, blue, track;
// Fade.
if (0x0F >= circuit.lap && circuit.lap >= 0x03) {
red = 0xFF, green = 0xFF, blue = 0xFF;
} else if (0x10 == circuit.lap || circuit.lap == 0x02) {
red = 0xBC, green = 0xBC, blue = 0xBC;
} else if (0x11 == circuit.lap || circuit.lap == 0x01) {
red = 0x75, green = 0x75, blue = 0x75;
} else {
red = 0x00, green = 0x00, blue = 0x00;
}
if (0x01 == circuit.lounge) {
track = 0;
} else {
track = 1;
}
return BG_[track]->changePalette(no, red, green, blue);
}
bool CreditLogoState::drawGraphic(void) {
if (!this->changePAL(1)) return false;
if (0x01 == circuit.lounge) {
if (!BG_[0]->divCreate(10, 10, 1, 8, 8)) return false;
if (!BG_[0]->Use(112, 104, 2)) return false; // 2
if (!BG_[0]->Use(120, 104, 0)) return false; // 0
if (!BG_[0]->Use(128, 104, 2)) return false; // 2
if (!BG_[0]->Use(136, 104, 1)) return false; // 1
} else {
if (!BG_[1]->divCreate(32, 16, 2, 8, 8)) return false;
if (!BG_[1]->Use( 72, 104, 21)) return false; // U
if (!BG_[1]->Use( 80, 104, 14)) return false; // N
if (!BG_[1]->Use( 88, 104, 12)) return false; // L
if (!BG_[1]->Use( 96, 104, 9)) return false; // I
if (!BG_[1]->Use(104, 104, 13)) return false; // M
if (!BG_[1]->Use(112, 104, 9)) return false; // I
if (!BG_[1]->Use(120, 104, 20)) return false; // T
if (!BG_[1]->Use(128, 104, 5)) return false; // E
if (!BG_[1]->Use(136, 104, 4)) return false; // D
if (!BG_[1]->Use(144, 104, 0)) return false; //
if (!BG_[1]->Use(152, 104, 12)) return false; // L
if (!BG_[1]->Use(160, 104, 15)) return false; // O
if (!BG_[1]->Use(168, 104, 15)) return false; // O
if (!BG_[1]->Use(176, 104, 16)) return false; // P
}
return true;
}
bool CreditLogoState::doExecute(interface__::IPhaseContext* obj) {
if (!this->drawGraphic()) return false; // Drawing a any graphic.
this->memoryOperation();
if (0 > circuit.lounge) {
obj->recordLog("Process-Log", "executed successfully of Eris credit logo screen process.");
obj->setState(nullptr);
}
return true;
}
} // namespace phase
} // namespace modules
GitHubにUPしてますので、もし興味ある方はPC版の当サイトヘッダーリンクからご自由に…。
コメント