Sirius X

需要無視の自己満足ブログです。

FADE

Category:C/C++, Rockman Reanimated, ゲーム開発, プログラミング入門・学習 Comment:0

eyecatch

ロックマン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版の当サイトヘッダーリンクからご自由に…。

コメントを残す

メールアドレスが公開されることはありません。