Path: blob/master/SonicMania/Objects/UFO/SpecialClear.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: SpecialClear Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectSpecialClear *SpecialClear;1011void SpecialClear_Update(void) {}1213void SpecialClear_LateUpdate(void)14{15RSDK_THIS(SpecialClear);1617StateMachine_Run(self->state);18}1920void SpecialClear_StaticUpdate(void) {}2122void SpecialClear_Draw(void)23{24RSDK_THIS(SpecialClear);2526Vector2 vertPos[4];27Vector2 drawPos;2829int32 centerX = ScreenInfo->center.x << 16;30drawPos.x = centerX - 0x600000;3132// Draw Emeralds33for (int32 i = 0; i < 7; ++i) {34int32 frame = 7;35if (SaveGame_GetEmerald(i))36frame = i;37self->emeraldsAnimator.frameID = frame;38drawPos.y = self->emeraldPositions[i];39RSDK.DrawSprite(&self->emeraldsAnimator, &drawPos, true);40drawPos.x += 0x200000;41}4243drawPos.x = self->messagePos2.x;44drawPos.y = self->messagePos2.y;45drawPos.x = centerX + 2 * drawPos.x;46vertPos[0].x = drawPos.x - 0x740000;47vertPos[0].y = drawPos.y - 0x140000;48vertPos[1].x = 0x680000 + drawPos.x;49vertPos[2].x = 0x780000 + drawPos.x;50vertPos[3].x = drawPos.x - 0x640000;51vertPos[1].y = drawPos.y - 0x140000;52vertPos[2].y = drawPos.y - 0x40000;53vertPos[3].y = drawPos.y - 0x40000;54RSDK.DrawFace(vertPos, 4, 0x00, 0x00, 0x00, 0xFF, INK_NONE);5556if (self->messageType > SC_MSG_SPECIALCLEAR) {57drawPos.x = self->messagePos1.x;58drawPos.y = self->messagePos1.y;59drawPos.x = centerX + 2 * drawPos.x;60vertPos[0].x = drawPos.x - 0x740000;61vertPos[0].y = drawPos.y + 0x1C0000;62vertPos[1].x = 0x680000 + drawPos.x;63vertPos[2].x = 0x780000 + drawPos.x;64vertPos[3].x = drawPos.x - 0x640000;65vertPos[1].y = drawPos.y + 0x1C0000;66vertPos[2].y = drawPos.y + 0x2C0000;67vertPos[3].y = drawPos.y + 0x2C0000;68RSDK.DrawFace(vertPos, 4, 0x00, 0x00, 0x00, 0xFF, INK_NONE);69}7071drawPos.x = self->messagePos1.x;72drawPos.y = self->messagePos1.y;73drawPos.x += centerX;74switch (self->messageType) {75case SC_MSG_SPECIALCLEAR:76self->playerNameAnimator.frameID = 0;77RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);78break;7980case SC_MSG_GOTEMERALD:81self->playerNameAnimator.frameID = 1;82RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);8384self->playerNameAnimator.frameID = 2;85RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);8687drawPos.x = self->messagePos2.x;88drawPos.y = self->messagePos2.y;89drawPos.x += centerX;90self->playerNameAnimator.frameID = 3;91RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);92break;9394case SC_MSG_ALLEMERALDS:95self->playerNameAnimator.frameID = 4;96RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);9798self->playerNameAnimator.frameID = 5;99RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);100101drawPos.x = self->messagePos2.x;102drawPos.y = self->messagePos2.y;103drawPos.x += centerX;104self->playerNameAnimator.frameID = 6;105RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);106break;107108case SC_MSG_SUPER:109self->playerNameAnimator.frameID = 7;110RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);111112self->playerNameAnimator.frameID = 8;113RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);114115self->playerNameAnimator.frameID = 9;116RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);117118drawPos.x = self->messagePos2.x;119drawPos.y = self->messagePos2.y;120drawPos.x += centerX;121self->playerNameAnimator.frameID = 10;122RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);123124self->playerNameAnimator.frameID = 11;125RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);126127self->playerNameAnimator.frameID = 13;128RSDK.DrawSprite(&self->playerNameAnimator, &drawPos, true);129break;130131default: break;132}133drawPos.x = self->scoreBonusPos.x;134drawPos.y = self->scoreBonusPos.y;135drawPos.x += centerX - 0x560000;136self->bonusAnimator.frameID = 4;137RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);138139self->bonusAnimator.frameID = 6;140drawPos.x += 0x660000;141RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);142143drawPos.x += 0x430000;144SpecialClear_DrawNumbers(&drawPos, self->score);145146drawPos.x = self->ringBonusPos.x;147drawPos.y = self->ringBonusPos.y;148drawPos.x += centerX - 0x560000;149self->bonusAnimator.frameID = 0;150RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);151152drawPos.x += 3276800;153self->bonusAnimator.frameID = 3;154RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);155156self->bonusAnimator.frameID = 6;157drawPos.x += 3407872;158RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);159160drawPos.x += 0x430000;161SpecialClear_DrawNumbers(&drawPos, self->ringBonus);162163if (self->isBSS) {164drawPos.x = self->perfectBonusPos.x;165drawPos.y = self->perfectBonusPos.y;166drawPos.x += centerX - 0x560000;167self->bonusAnimator.frameID = 1;168RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);169170drawPos.x += 0x320000;171self->bonusAnimator.frameID = 3;172RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);173174self->bonusAnimator.frameID = 6;175drawPos.x += 0x340000;176RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);177178drawPos.x += 0x430000;179SpecialClear_DrawNumbers(&drawPos, self->perfectBonus);180}181else {182drawPos.x = self->machBonusPos.x;183drawPos.y = self->machBonusPos.y;184drawPos.x += centerX - 0x560000;185self->bonusAnimator.frameID = 2;186RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);187188drawPos.x += 0x320000;189self->bonusAnimator.frameID = 3;190RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);191192self->bonusAnimator.frameID = 6;193drawPos.x += 0x340000;194RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);195196drawPos.x += 0x430000;197SpecialClear_DrawNumbers(&drawPos, self->machBonus);198}199200if (self->hasContinues) {201drawPos.x = self->continuePos.x;202drawPos.y = self->continuePos.y;203drawPos.x += centerX - 0x560000;204self->bonusAnimator.frameID = 5;205RSDK.DrawSprite(&self->bonusAnimator, &drawPos, true);206207if (self->continueIconVisible) {208drawPos.x += 0xB00000;209drawPos.y += 0xA0000;210RSDK.DrawSprite(&self->continueAnimator, &drawPos, true);211}212}213214if (self->showFade)215RSDK.FillScreen(self->fillColor, self->timer, self->timer - 128, self->timer - 256);216}217218void SpecialClear_Create(void *data)219{220RSDK_THIS(SpecialClear);221222if (!SceneInfo->inEditor) {223self->active = ACTIVE_NORMAL;224self->visible = true;225self->drawGroup = 14;226self->timer = 512;227self->fillColor = 0xF0F0F0;228self->showFade = true;229self->state = SpecialClear_State_SetupDelay;230231if (RSDK.CheckSceneFolder("SpecialBS")) {232// Blue Spheres...?233// This screen doesn't show up in regular BSS gameplay234235self->isBSS = true;236self->ringBonus = 100 * BSS_Setup->rings;237if (!BSS_Setup->ringCount)238self->perfectBonus = 50000;239240self->messageType = SC_MSG_SPECIALCLEAR;241}242else {243RSDK.CopyPalette(7, 0, 0, 0, 128);244245self->isBSS = false;246self->ringBonus = 100 * UFO_Setup->rings;247self->machBonus = 1000 * (UFO_Setup->machLevel + 10 * UFO_Setup->scoreBonus);248249if (globals->gameMode < MODE_TIMEATTACK && self->machBonus + self->ringBonus >= 10000)250self->hasContinues = true;251252SaveRAM *saveRAM = SaveGame_GetSaveRAM();253self->score = saveRAM->score;254self->score1UP = saveRAM->score1UP;255self->lives = saveRAM->lives;256if (SaveGame_AllChaosEmeralds())257self->messageType = SC_MSG_ALLEMERALDS;258else259self->messageType = !UFO_Setup->timedOut ? SC_MSG_GOTEMERALD : SC_MSG_SPECIALCLEAR;260}261262// "Player Got A"263self->messagePos1.x = 0x1400000;264self->messagePos1.y = 0x580000;265266// "Chaos Emerald"267self->messagePos2.x = -0x1400000;268self->messagePos2.y = 0x700000;269270self->scoreBonusPos.x = 0x1E80000;271self->scoreBonusPos.y = 0x8C0000;272273self->ringBonusPos.x = 0x3080000;274self->ringBonusPos.y = 0xAC0000;275276self->machBonusPos.x = 0x4280000;277self->machBonusPos.y = 0xBC0000;278279// this is still here and fully functional, however this object is never shown after BSS, so its unused280self->perfectBonusPos.x = 0x4280000;281self->perfectBonusPos.y = 0xBC0000;282self->continuePos.x = 0x5480000;283self->continuePos.y = 0xCC0000;284285RSDK.CopyPalette(1, 0, 0, 128, 48);286287for (int32 i = 0; i < 7; ++i) {288self->emeraldPositions[i] = 0x1100000 + (i * 0x200000);289self->emeraldSpeeds[i] = -0xA0000 + (i * -0xA000);290}291292RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_BONUS, &self->bonusAnimator, true, 0);293RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_NUMBERS, &self->numbersAnimator, true, 0);294RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_EMERALDS, &self->emeraldsAnimator, true, 0);295switch (GET_CHARACTER_ID(1)) {296default:297case ID_SONIC: RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_SONIC, &self->playerNameAnimator, true, 0);298#if MANIA_USE_PLUS299RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_CONTINUE, &self->continueAnimator, true, SC_ANI_SONIC);300#else301RSDK.SetSpriteAnimation(SpecialClear->continueFrames, 0, &self->continueAnimator, true, SC_ANI_TAILS);302#endif303break;304305case ID_TAILS: RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_TAILS, &self->playerNameAnimator, true, 0);306#if MANIA_USE_PLUS307RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_CONTINUE, &self->continueAnimator, true, SC_ANI_TAILS);308#else309RSDK.SetSpriteAnimation(SpecialClear->continueFrames, 0, &self->continueAnimator, true, SC_ANI_TAILS);310#endif311break;312313case ID_KNUCKLES: RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_KNUX, &self->playerNameAnimator, true, 0);314#if MANIA_USE_PLUS315RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_CONTINUE, &self->continueAnimator, true, SC_ANI_KNUX);316#else317RSDK.SetSpriteAnimation(SpecialClear->continueFrames, 0, &self->continueAnimator, true, SC_ANI_TAILS);318#endif319break;320321#if MANIA_USE_PLUS322case ID_MIGHTY:323RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_MIGHTY, &self->playerNameAnimator, true, 0);324RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_CONTINUE, &self->continueAnimator, true, 3);325break;326327case ID_RAY:328RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_RAY, &self->playerNameAnimator, true, 0);329RSDK.SetSpriteAnimation(SpecialClear->aniFrames, SC_ANI_CONTINUE, &self->continueAnimator, true, SC_ANI_RAY);330break;331#endif332}333}334}335336void SpecialClear_StageLoad(void)337{338SpecialClear->aniFrames = RSDK.LoadSpriteAnimation("Special/Results.bin", SCOPE_STAGE);339#if !MANIA_USE_PLUS340SpecialClear->continueFrames = RSDK.LoadSpriteAnimation("Players/Continue.bin", SCOPE_STAGE);341#endif342343SpecialClear->sfxScoreAdd = RSDK.GetSfx("Global/ScoreAdd.wav");344SpecialClear->sfxScoreTotal = RSDK.GetSfx("Global/ScoreTotal.wav");345SpecialClear->sfxEvent = RSDK.GetSfx("Special/Event.wav");346SpecialClear->sfxSpecialWarp = RSDK.GetSfx("Global/SpecialWarp.wav");347SpecialClear->sfxContinue = RSDK.GetSfx("Special/Continue.wav");348SpecialClear->sfxEmerald = RSDK.GetSfx("Special/Emerald.wav");349}350351void SpecialClear_DrawNumbers(Vector2 *pos, int32 value)352{353RSDK_THIS(SpecialClear);354355int32 cnt = value;356357int32 digitCount = value ? 0 : 1;358while (cnt > 0) {359++digitCount;360cnt /= 10;361}362363int32 digit = 1;364while (digitCount) {365self->numbersAnimator.frameID = value / digit % 10;366RSDK.DrawSprite(&self->numbersAnimator, pos, true);367digit *= 10;368pos->x -= 0x90000;369--digitCount;370}371}372373void SpecialClear_GiveScoreBonus(int32 score)374{375RSDK_THIS(SpecialClear);376377self->score += score;378if (self->score > 9999999)379self->score = 9999999;380381#if MANIA_USE_PLUS382if (globals->gameMode == MODE_ENCORE)383return;384#endif385386if (self->score >= self->score1UP) {387if (self->lives < 99)388self->lives++;389390Music_PlayJingle(TRACK_1UP);391392Music->nextTrack = TRACK_NONE;393while (self->score1UP <= self->score) self->score1UP += 50000;394}395}396397#if MANIA_USE_PLUS398void SpecialClear_SaveCB(bool32 success)399{400RSDK_THIS(SpecialClear);401402UIWaitSpinner_FinishWait();403self->saveInProgress = false;404}405#else406void SpecialClear_SaveCB(void)407{408RSDK_THIS(SpecialClear);409410UIWaitSpinner_FinishWait();411self->saveInProgress = false;412}413#endif414415void SpecialClear_State_SetupDelay(void)416{417RSDK_THIS(SpecialClear);418419if (self->timer <= 0) {420self->timer = 0;421self->showFade = false;422self->state = SpecialClear_State_EnterText;423424Music_PlayTrack(TRACK_ACTCLEAR);425}426else {427self->timer -= 16;428}429}430431void SpecialClear_State_EnterText(void)432{433RSDK_THIS(SpecialClear);434435if (self->messagePos1.x > 0)436self->messagePos1.x -= 0x100000;437438if (self->messagePos2.x < 0) {439self->messagePos2.x += 0x100000;440}441442if (++self->timer == 48) {443self->timer = 0;444self->state = SpecialClear_State_AdjustText;445}446}447448void SpecialClear_State_AdjustText(void)449{450RSDK_THIS(SpecialClear);451452self->messagePos1.y -= 0x10000;453self->messagePos2.y -= 0x10000;454455if (++self->timer == 48) {456self->timer = 0;457self->state = SpecialClear_State_EnterBonuses;458}459}460461void SpecialClear_HandleEmeraldAppear(void)462{463RSDK_THIS(SpecialClear);464465int32 stopPos = self->messageType == SC_MSG_SPECIALCLEAR ? 0x680000 : 0x700000;466467for (int32 i = 0; i < 7; ++i) {468self->emeraldSpeeds[i] += 0x4000;469self->emeraldPositions[i] += self->emeraldSpeeds[i];470471if (self->emeraldPositions[i] > stopPos && self->emeraldSpeeds[i] >= 0) {472self->emeraldPositions[i] = stopPos;473self->emeraldSpeeds[i] = -(self->emeraldSpeeds[i] >> 1);474}475}476}477478void SpecialClear_State_EnterBonuses(void)479{480RSDK_THIS(SpecialClear);481482if (self->scoreBonusPos.x > 0)483self->scoreBonusPos.x -= 0x100000;484485if (self->ringBonusPos.x > 0)486self->ringBonusPos.x -= 0x100000;487488if (self->perfectBonusPos.x > 0)489self->perfectBonusPos.x -= 0x100000;490491if (self->machBonusPos.x > 0)492self->machBonusPos.x -= 0x100000;493494if (self->continuePos.x <= 0) {495if (self->messageType == SC_MSG_ALLEMERALDS) {496API_UnlockAchievement(&achievementList[ACH_EMERALDS]);497}498499self->state = SpecialClear_State_ScoreShownDelay;500}501else {502self->continuePos.x -= 0x100000;503}504505SpecialClear_HandleEmeraldAppear();506}507508void SpecialClear_State_ScoreShownDelay(void)509{510RSDK_THIS(SpecialClear);511512if (++self->timer == 120) {513self->timer = 0;514self->state = SpecialClear_State_TallyScore;515516if (self->messageType != SC_MSG_SPECIALCLEAR)517RSDK.PlaySfx(SpecialClear->sfxEmerald, false, 0xFF);518}519520SpecialClear_HandleEmeraldAppear();521}522523void SpecialClear_State_TallyScore(void)524{525RSDK_THIS(SpecialClear);526527if (self->ringBonus > 0) {528self->ringBonus -= 100;529SpecialClear_GiveScoreBonus(100);530}531532if (self->perfectBonus > 0) {533self->perfectBonus -= 100;534SpecialClear_GiveScoreBonus(100);535}536537if (self->machBonus > 0) {538self->machBonus -= 100;539SpecialClear_GiveScoreBonus(100);540}541542if (ControllerInfo->keyA.press || ControllerInfo->keyStart.press) {543SpecialClear_GiveScoreBonus(self->machBonus + self->ringBonus + self->perfectBonus);544self->ringBonus = 0;545self->perfectBonus = 0;546self->machBonus = 0;547}548549if (self->machBonus + self->ringBonus + self->perfectBonus <= 0) {550self->timer = 0;551552if (self->hasContinues)553self->state = SpecialClear_State_ShowTotalScore_Continues;554else555self->state = SpecialClear_State_ShowTotalScore_NoContinues;556557RSDK.PlaySfx(SpecialClear->sfxScoreTotal, false, 0xFF);558}559else if (++self->timer == 2) {560self->timer = 0;561RSDK.PlaySfx(SpecialClear->sfxScoreAdd, false, 0xFF);562}563}564565void SpecialClear_State_ShowTotalScore_Continues(void)566{567RSDK_THIS(SpecialClear);568569if (++self->timer == 120) {570RSDK.PlaySfx(SpecialClear->sfxContinue, false, 0xFF);571572if (globals->continues < 25)573globals->continues++;574}575else if (self->timer > 120) {576self->continueIconVisible = (self->timer >> 3) & 1;577}578579if (self->timer == 360) {580self->timer = 0;581582SaveRAM *saveRAM = SaveGame_GetSaveRAM();583saveRAM->score = self->score;584globals->restartScore = self->score;585saveRAM->score1UP = self->score1UP;586saveRAM->lives = self->lives;587#if MANIA_USE_PLUS588saveRAM->continues = globals->continues;589saveRAM->characterFlags = globals->characterFlags;590saveRAM->stock = globals->stock;591saveRAM->playerID = globals->playerID;592#endif593594if (SaveGame_AllChaosEmeralds()) {595self->state = SpecialClear_State_ExitFinishMessage;596}597else {598self->timer = 0;599self->showFade = true;600self->state = SpecialClear_State_ExitResults;601602RSDK.PlaySfx(SpecialClear->sfxSpecialWarp, false, 0xFF);603}604}605}606607void SpecialClear_State_ShowTotalScore_NoContinues(void)608{609RSDK_THIS(SpecialClear);610611if (++self->timer == 120) {612self->timer = 0;613SaveRAM *saveRAM = SaveGame_GetSaveRAM();614saveRAM->score = self->score;615globals->restartScore = self->score;616617if (SaveGame_AllChaosEmeralds()) {618self->state = SpecialClear_State_ExitFinishMessage;619}620else {621self->timer = 0;622self->showFade = true;623RSDK.PlaySfx(SpecialClear->sfxSpecialWarp, false, 0xFF);624self->state = SpecialClear_State_ExitResults;625}626}627}628629void SpecialClear_State_ExitFinishMessage(void)630{631RSDK_THIS(SpecialClear);632633self->messagePos1.x += 0x180000;634self->messagePos2.x -= 0x180000;635636if (++self->timer == 30) {637self->timer = 0;638self->messageType = SC_MSG_SUPER;639self->state = SpecialClear_State_EnterSuperMessage;640}641}642643void SpecialClear_State_EnterSuperMessage(void)644{645RSDK_THIS(SpecialClear);646647if (self->messagePos1.x > 0)648self->messagePos1.x -= 0x180000;649650if (self->messagePos2.x >= 0) {651RSDK.PlaySfx(SpecialClear->sfxEvent, false, 0xFF);652self->state = SpecialClear_State_ShowSuperMessage;653}654else {655self->messagePos2.x += 0x180000;656}657}658659void SpecialClear_State_ShowSuperMessage(void)660{661RSDK_THIS(SpecialClear);662663if (++self->timer == 160) {664self->timer = 0;665self->showFade = true;666RSDK.PlaySfx(SpecialClear->sfxSpecialWarp, false, 0xFF);667self->state = SpecialClear_State_ExitResults;668}669}670671void SpecialClear_State_ExitFadeOut(void)672{673RSDK_THIS(SpecialClear);674675if (self->fillColor) {676self->fillColor -= 0x080808;677}678else if (!self->saveInProgress) {679EntityMenuParam *param = MenuParam_GetParam();680681if (param->bssSelection == BSS_SELECTION_EXTRAS) {682RSDK.SetScene("Presentation", "Menu");683RSDK.LoadScene();684}685else {686SaveRAM *saveRAM = SaveGame_GetSaveRAM();687#if MANIA_USE_PLUS688if (globals->gameMode == MODE_ENCORE)689RSDK.SetScene("Encore Mode", "");690else691#endif692RSDK.SetScene("Mania Mode", "");693694SceneInfo->listPos = saveRAM->storedStageID;695RSDK.LoadScene();696}697}698}699700void SpecialClear_State_ExitResults(void)701{702RSDK_THIS(SpecialClear);703704if (self->timer >= 768) {705self->state = SpecialClear_State_ExitFadeOut;706707if (globals->gameMode < MODE_TIMEATTACK && globals->saveSlotID != NO_SAVE_SLOT) {708self->saveInProgress = true;709UIWaitSpinner_StartWait();710GameProgress_TrackGameProgress(SpecialClear_SaveCB);711}712}713else {714self->timer += 8;715}716}717718#if GAME_INCLUDE_EDITOR719void SpecialClear_EditorDraw(void) {}720721void SpecialClear_EditorLoad(void) {}722#endif723724void SpecialClear_Serialize(void) {}725726727