Path: blob/master/Sonic 1/Scripts/Global/ActFinish.txt
1482 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: Act Finish Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// Looks like this is one of the objects that was programmed during the "S1 proto" phase, since it only uses values0-7 and doesn't use v4 syntax much at all89// ========================10// Aliases11// ========================1213private alias object.xpos : object.decorPos // "decor" is the blue circle btw14private alias object.ypos : object.actPos15private alias object.value0 : object.timer16private alias object.value1 : object.playerNamePos17private alias object.value2 : object.passedPos18private alias object.value3 : object.totalPos19private alias object.value4 : object.timePos20private alias object.value5 : object.timeBonus21private alias object.value6 : object.ringBonus22private alias object.scale : object.ringPos2324// States25private alias -1 : ACTFINISH_NORESULTS26private alias 0 : ACTFINISH_INIT27private alias 1 : ACTFINISH_ENTERACTFINISH28private alias 2 : ACTFINISH_ENTERPASSEDTEXT29private alias 3 : ACTFINISH_ENTERACTID30private alias 4 : ACTFINISH_ENTERBONUSES31private alias 5 : ACTFINISH_ACTFINISHJINGLE32private alias 6 : ACTFINISH_TALLYSCORE33private alias 7 : ACTFINISH_SHOWRESULTS34private alias 8 : ACTFINISH_LOADNEXTSTAGE35private alias 9 : ACTFINISH_EXITUISPRITES36private alias 10 : ACTFINISH_EXITTEXT37private alias 11 : ACTFINISH_EXITSCORES38private alias 12 : ACTFINISH_WAITFORCALLBACK39private alias 13 : ACTFINISH_RETRY40private alias 14 : ACTFINISH_SETSCREENFADE4142// Game Modes Aliases43private alias 1 : MODE_SAVEGAME44private alias 2 : MODE_TIMEATTACK4546// Super States47private alias 1 : SUPERSTATE_SUPER48private alias 2 : SUPERSTATE_UNTRANSFORM4950// Player Aliases51private alias object.type : player.type52private alias object.interaction : player.interaction53private alias object.controlMode : player.controlMode54private alias object.right : player.right5556private alias object.value0 : player.rings5758// Sign Post Aliases59private alias 5 : SIGNPOST_BLANK606162// ========================63// Events64// ========================6566event ObjectUpdate67switch object.state68case ACTFINISH_INIT69object.drawOrder = 670object.priority = PRIORITY_ACTIVE7172object.decorPos = screen.xcenter73object.decorPos += 12874object.actPos = screen.xcenter7576object.playerNamePos = screen.xcenter77FlipSign(object.playerNamePos)78object.playerNamePos -= 1607980object.passedPos = screen.xcenter81FlipSign(object.passedPos)82object.passedPos -= 1608384object.totalPos = screen.xcenter85object.totalPos += 1288687object.timePos = object.totalPos88object.timePos += 328990object.ringPos = object.timePos91object.ringPos += 329293if Player_superState == SUPERSTATE_SUPER94Player_superState = SUPERSTATE_UNTRANSFORM95end if9697switch stage.minutes98case 099if stage.seconds < 30100object.timeBonus = 50000101else102if stage.seconds < 45103object.timeBonus = 10000104else105object.timeBonus = 5000106end if107end if108break109110case 1111if stage.seconds < 30112object.timeBonus = 4000113else114object.timeBonus = 3000115end if116break117118case 2119object.timeBonus = 2000120break121122case 3123object.timeBonus = 1000124break125126case 4127object.timeBonus = 500128break129130case 5131object.timeBonus = 100132break133134case 9135// If the player finished the stage at the last possible moment, then reward a whole lotta points!136// Fun note - this wasn't in the initial versions of S1, back then the time bonus stopped at 5 minutes and that was it137if stage.debugMode == false138if options.gameMode < MODE_TIMEATTACK139if stage.seconds == 59140object.timeBonus = 100000141end if142end if143end if144break145146end switch147148object.ringBonus = player[0].rings149object.ringBonus *= 100150151#platform: USE_ORIGINS152if game.playMode == BOOT_PLAYMODE_MISSION153object.state = ACTFINISH_NORESULTS154else155if game.playMode == BOOT_PLAYMODE_BOSSRUSH156object.state = ACTFINISH_NORESULTS157else158object.state++159end if160end if161162CallNativeFunction4(NotifyCallback, NOTIFY_STATS_ENEMY, StageStatsUsabilityParam1, StageStatsUsabilityParam2, StageStatsUsabilityParam3)163CallNativeFunction2(NotifyCallback, NOTIFY_STATS_RING, player[0].rings)164CallNativeFunction2(NotifyCallback, NOTIFY_ACT_FINISH, 0)165166StageStatsUsabilityParam1 = 0167StageStatsUsabilityParam2 = 0168StageStatsUsabilityParam3 = 0169StageStatsUsabilityParam4 = 0170StageStatsUsabilityParam5 = 0171StatsUsabilityParam1 = 0172StatsUsabilityParam2 = 0173StatsUsabilityParam3 = 0174StatsUsabilityParam4 = 0175StatsUsabilityParam5 = 0176#endplatform177178#platform: USE_STANDALONE179object.state++180#endplatform181break182183case ACTFINISH_ENTERACTFINISH184if object.decorPos > 0185object.decorPos -= 16186if object.decorPos < 0187object.decorPos = 0188end if189end if190191if object.playerNamePos < 0192object.playerNamePos += 16193if object.playerNamePos > 0194object.playerNamePos = 0195end if196else197object.state++198end if199break200201case ACTFINISH_ENTERPASSEDTEXT202if object.passedPos < 0203object.passedPos += 16204if object.passedPos > 0205object.passedPos = 0206end if207else208object.state++209end if210break211212case ACTFINISH_ENTERACTID213if object.actPos > 0214object.actPos -= 16215if object.actPos < 0216object.actPos = 0217end if218else219object.state++220end if221break222223case ACTFINISH_ENTERBONUSES224if object.totalPos > 0225object.totalPos -= 16226if object.totalPos < 0227object.totalPos = 0228end if229end if230231if object.timePos > 0232object.timePos -= 16233if object.timePos < 0234object.timePos = 0235end if236end if237238if object.ringPos > 0239object.ringPos -= 16240if object.ringPos < 0241object.ringPos = 0242end if243else244object.state++245end if246break247248case ACTFINISH_ACTFINISHJINGLE249object.timer++250if object.timer > 299251object.timer = 0252object.state++253end if254break255256case ACTFINISH_TALLYSCORE257if object.ringBonus > 0258object.ringBonus -= 100259player.score += 100260end if261262if object.timeBonus > 0263object.timeBonus -= 100264player.score += 100265end if266267CheckGreater(object.ringBonus, 0)268temp0 = checkResult269CheckGreater(object.timeBonus, 0)270temp0 |= checkResult271if temp0 == true272object.timer++273if object.timer == 2274PlaySfx(SfxName[Score Add], false)275object.timer = 0276end if277else278object.state++279object.timer = 0280PlaySfx(SfxName[Score Total], false)281end if282break283284case ACTFINISH_SHOWRESULTS285object.timer++286if object.timer == 160287object.timer = 0288289if options.gameMode != MODE_TIMEATTACK290CheckCurrentStageFolder("Zone06")291temp0 = checkResult292CheckEqual(stage.actNum, 2)293temp0 &= checkResult294#platform: USE_ORIGINS295CheckEqual(game.oneStageFlag, false)296temp0 &= checkResult297#endplatform298if temp0 == true299// In SBZ Act 2, exit the HUD rather than fading out to the next level300object.state = ACTFINISH_EXITUISPRITES301else302#platform: USE_ORIGINS303if game.oneStageFlag != false304game.callbackResult = -1305CallNativeFunction4(NotifyCallback, NOTIFY_STAGE_RETRY, true, stage.listPos, 0)306object.state = ACTFINISH_WAITFORCALLBACK307else308object.state++309end if310#endplatform311#platform: USE_STANDALONE312object.state++313#endplatform314if player[0].type == TypeName[Blank Object]315PlaySfx(SfxName[Warp], false)316end if317end if318else319#platform: USE_ORIGINS320if game.oneStageFlag != false321game.callbackResult = -1322CallNativeFunction4(NotifyCallback, NOTIFY_STAGE_RETRY, true, stage.listPos, 0)323object.state = ACTFINISH_WAITFORCALLBACK324else325object.state++326end if327#endplatform328#platform: USE_STANDALONE329object.state++330#endplatform331if player[0].type == TypeName[Blank Object]332PlaySfx(SfxName[Warp], false)333end if334end if335end if336break337338case ACTFINISH_LOADNEXTSTAGE339if player[0].type == TypeName[Blank Object]340// If the player object is blank, then they entered a Special Ring341// So, off to the Special Stage!342object.timer += 8343SetScreenFade(208, 255, 224, object.timer)344if object.timer == 0x400345fadeColor = 208346fadeColor <<= 16347temp0 = 255348temp0 <<= 8349fadeColor += temp0350fadeColor += 224351object.direction = FACING_RIGHT // huh? does this even matter?352object.timer = 0353lampPostID = 0354stage.listPos++355356if options.gameMode == MODE_SAVEGAME357arrayPos1 = options.saveSlot358arrayPos1 <<= 3359if stage.player2Enabled == true360#platform: USE_STANDALONE361saveRAM[arrayPos1] = PLAYER_SONIC_TAILS_A362#endplatform363364#platform: USE_ORIGINS365switch stage.playerListPos366case PLAYER_SONIC_A367saveRAM[arrayPos1] = PLAYER_SONIC_TAILS_A368break369case PLAYER_AMY_A370saveRAM[arrayPos1] = PLAYER_AMY_TAILS_A371break372end switch373#endplatform374else375saveRAM[arrayPos1] = stage.playerListPos376end if377arrayPos1++378saveRAM[arrayPos1] = player.lives379arrayPos1++380saveRAM[arrayPos1] = player.score381arrayPos1++382saveRAM[arrayPos1] = player.scoreBonus383arrayPos1++384temp0 = stage.listPos385temp0++386if temp0 > saveRAM[arrayPos1]387saveRAM[arrayPos1] = temp0388saveRAM[arrayPos1] += 0x80389end if390arrayPos1++391saveRAM[arrayPos1] = specialStage.emeralds392arrayPos1++393saveRAM[arrayPos1] = specialStage.listPos394WriteSaveRAM()395end if396397#platform: USE_ORIGINS398recScore = player.score399400if game.oneStageFlag != false401stage.listPos--402object.state = ACTFINISH_RETRY403else404#endplatform405406specialStage.nextZone = stage.listPos407stage.listPos = specialStage.listPos408stage.activeList = SPECIAL_STAGE409410temp0 = engine.trialMode411if stage.listPos >= stage.listSize412temp0 = true413end if414415if temp0 == false416LoadStage()417else418// Invalid Stage, Go back to the title screen419stage.activeList = PRESENTATION_STAGE420stage.listPos = 0421LoadStage()422end if423#platform: USE_ORIGINS424end if425#endplatform426end if427else428object.timer += 4429SetScreenFade(0, 0, 0, object.timer)430if object.timer == 384431fadeColor = 0432object.timer = 0433lampPostID = 0434object.direction = FACING_RIGHT // i don't think this does anything...435stage.listPos++436437if options.gameMode == MODE_SAVEGAME438arrayPos1 = options.saveSlot439arrayPos1 <<= 3440if stage.player2Enabled == true441#platform: USE_STANDALONE442saveRAM[arrayPos1] = PLAYER_SONIC_TAILS_A443#endplatform444445#platform: USE_ORIGINS446switch stage.playerListPos447case PLAYER_SONIC_A448saveRAM[arrayPos1] = PLAYER_SONIC_TAILS_A449break450case PLAYER_AMY_A451saveRAM[arrayPos1] = PLAYER_AMY_TAILS_A452break453end switch454#endplatform455else456saveRAM[arrayPos1] = stage.playerListPos457end if458arrayPos1++459saveRAM[arrayPos1] = player.lives460arrayPos1++461saveRAM[arrayPos1] = player.score462arrayPos1++463saveRAM[arrayPos1] = player.scoreBonus464arrayPos1++465temp0 = stage.listPos466temp0++467if temp0 > saveRAM[arrayPos1]468saveRAM[arrayPos1] = temp0469end if470arrayPos1++471saveRAM[arrayPos1] = specialStage.emeralds472arrayPos1++473saveRAM[arrayPos1] = specialStage.listPos474WriteSaveRAM()475end if476477#platform: USE_ORIGINS478recScore = player.score479480if game.oneStageFlag != false481stage.listPos--482object.state = ACTFINISH_RETRY483else484#endplatform485if options.gameMode == MODE_TIMEATTACK486timeAttack.result = stage.seconds487timeAttack.result *= 100488temp0 = stage.minutes489temp0 *= 0x1770490timeAttack.result += temp0491timeAttack.result += stage.milliSeconds492stage.listPos--493CallNativeFunction2(SetLeaderboard, stage.listPos, timeAttack.result)494engine.state = 8495else496temp0 = engine.trialMode497if stage.listPos >= stage.listSize498temp0 = true499end if500501if temp0 == false502LoadStage()503else504// Invalid Stage, Go back to the title screen505stage.activeList = PRESENTATION_STAGE506stage.listPos = 0507LoadStage()508end if509end if510#platform: USE_ORIGINS511end if512#endplatform513end if514end if515break516517case ACTFINISH_EXITUISPRITES518object.decorPos += 32519object.actPos += 32520object.playerNamePos -= 32521object.timer++522if object.timer == 8523object.timer = 0524object.state++525end if526break527528case ACTFINISH_EXITTEXT529object.decorPos += 32530object.actPos += 32531object.playerNamePos -= 32532object.passedPos -= 32533object.timer++534if object.timer == 8535object.timer = 0536object.state++537end if538break539540case ACTFINISH_EXITSCORES541object.decorPos += 32542object.actPos += 32543object.playerNamePos -= 32544object.passedPos -= 32545object.totalPos += 32546if object.totalPos > 96547object.timePos += 32548if object.timePos > 96549object.ringPos += 32550end if551end if552553object.timer++554if object.timer == 35555object.timer = 0556temp0 = tileLayer[0].xsize557temp0 <<= 7558stage.newXBoundary2 = temp0559foreach (TypeName[Sign Post], arrayPos0, ACTIVE_ENTITIES)560object[arrayPos0].state = SIGNPOST_BLANK561next562563currentPlayer = 0564while currentPlayer < playerCount565player[currentPlayer].interaction = true566#platform: USE_STANDALONE567player[currentPlayer].controlMode = CONTROLMODE_P1568#endplatform569#platform: USE_ORIGINS570player[currentPlayer].controlMode = currentPlayer571#endplatform572player[currentPlayer].right = true573currentPlayer++574loop575576ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0, 0)577SetMusicTrack("Final.ogg", 0, 84680)578PlayMusic(0)579end if580break581582#platform: USE_ORIGINS583case ACTFINISH_WAITFORCALLBACK584if game.callbackResult >= 0585object.state = ACTFINISH_LOADNEXTSTAGE // I think this is supposed to set it to the next state instead of this one...586end if587break588589case ACTFINISH_RETRY590if game.callbackResult == 0591engine.state = 8592else593LoadStage()594end if595596object.state++597if player[0].type == TypeName[Blank Object]598SetScreenFade(208, 255, 224, 255)599else600SetScreenFade(0, 0, 0, 255)601end if602break603604case ACTFINISH_SETSCREENFADE605if player[0].type == TypeName[Blank Object]606SetScreenFade(208, 255, 224, 255)607else608SetScreenFade(0, 0, 0, 255)609end if610break611#endplatform612end switch613end event614615616event ObjectDraw617SetActivePalette(0, 0, screen.ysize)618619temp0 = screen.xcenter620temp0 += 16621temp0 += object.decorPos622DrawSpriteScreenXY(3, temp0, 56) // Blue Circle623624temp0 = screen.xcenter625temp0 += 3626temp0 += object.playerNamePos627#platform: USE_STANDALONE628DrawSpriteScreenXY(stage.playerListPos, temp0, 60) // Player name629#endplatform630631#platform: USE_ORIGINS632if stage.playerListPos != PLAYER_AMY_A633DrawSpriteScreenXY(stage.playerListPos, temp0, 60)634else635DrawSpriteScreenXY(23, temp0, 60)636end if637#endplatform638639DrawSpriteScreenXY(4, temp0, 60) // "Has"640641temp0 = screen.xcenter642temp0 -= 48643temp0 += object.passedPos644DrawSpriteScreenXY(5, temp0, 80) // "Passed"645646temp0 = screen.xcenter647temp0 += 24648temp0 += object.actPos649temp1 = stage.actNum650temp1 += 5651if temp1 < 6652// Minimum of Act 1 to be displayed653temp1 = 6654end if655if temp1 > 8656// Maximum of Act 3 to be displayed657temp1 = 8658end if659DrawSpriteScreenXY(temp1, temp0, 82) // Act number660661temp0 = screen.xcenter662temp0 -= 79663temp0 += object.totalPos664DrawSpriteScreenXY(9, temp0, 117) // "Score" text665666temp0 += 151667DrawNumbers(13, temp0, 117, player.score, 6, 8, false)668669temp0 = screen.xcenter670temp0 -= 79671temp0 += object.timePos672DrawSpriteScreenXY(10, temp0, 133) // "Time" text673DrawSpriteScreenXY(12, temp0, 133) // "Bonus" text674675temp0 += 151676DrawNumbers(13, temp0, 133, object.timeBonus, 6, 8, false)677678temp0 = screen.xcenter679temp0 -= 79680temp0 += object.ringPos681DrawSpriteScreenXY(11, temp0, 149) // "Rings" text682DrawSpriteScreenXY(12, temp0, 149) // "Bonus" text683684temp0 += 151685DrawNumbers(13, temp0, 149, object.ringBonus, 5, 8, false)686end event687688689event ObjectStartup690LoadSpriteSheet("Global/Display.gif")691692// Results frames693SpriteFrame(-70, 0, 70, 16, 1, 222) // #0 - "Sonic"694695if options.region == false696SpriteFrame(-69, 0, 69, 16, 72, 222) // #1 - "Tails"697else698SpriteFrame(-69, 0, 69, 16, 145, 205) // #1 - "Miles"699end if700701SpriteFrame(-93, 0, 113, 16, 142, 222) // #2 - "Knuckles"702703// Change offset of sprites if Knuckles is P1704// (Done to make space for his large name)705if stage.playerListPos != PLAYER_KNUCKLES_A706SpriteFrame(0, 0, 56, 56, 41, 1) // #3 - Title card blue circle707SpriteFrame(17, 0, 47, 16, 1, 205) // #4 - "Has"708SpriteFrame(0, 0, 95, 16, 49, 205) // #5 - "Passed"709SpriteFrame(0, 0, 39, 24, 98, 1) // #6 - Act 1 sign710SpriteFrame(0, 0, 43, 24, 138, 1) // #7 - Act 2 sign711SpriteFrame(0, 0, 43, 24, 182, 1) // #8 - Act 3 sign712else713SpriteFrame(20, 0, 56, 56, 41, 1) // #3 - Title card blue circle714SpriteFrame(37, 0, 47, 16, 1, 205) // #4 - "Has"715SpriteFrame(20, 0, 95, 16, 49, 205) // #5 - "Passed"716SpriteFrame(20, 0, 39, 24, 98, 1) // #6 - Act 1 sign717SpriteFrame(20, 0, 43, 24, 138, 1) // #7 - Act 2 sign718SpriteFrame(20, 0, 43, 24, 182, 1) // #8 - Act 3 sign719end if720721SpriteFrame(0, -2, 44, 16, 161, 26) // #9 - "Score"722SpriteFrame(0, 0, 31, 11, 1, 17) // #10 - "Time" (cropped from normal HUD graphic)723SpriteFrame(0, 0, 31, 11, 1, 33) // #11 - "Rings" (also cropped from normal HUD graphic)724SpriteFrame(40, -2, 45, 16, 98, 43) // #12 - "Bonus"725SpriteFrame(0, 0, 8, 11, 1, 50) // #13 - Number 0726SpriteFrame(0, 0, 8, 11, 10, 50) // #14 - Number 1727SpriteFrame(0, 0, 8, 11, 19, 50) // #15 - Number 2728SpriteFrame(0, 0, 8, 11, 28, 50) // #16 - Number 3729SpriteFrame(0, 0, 8, 11, 1, 62) // #17 - Number 4730SpriteFrame(0, 0, 8, 11, 10, 62) // #18 - Number 5731SpriteFrame(0, 0, 8, 11, 19, 62) // #19 - Number 6732SpriteFrame(0, 0, 8, 11, 28, 62) // #20 - Number 7733SpriteFrame(0, 0, 8, 11, 1, 74) // #21 - Number 8734SpriteFrame(0, 0, 8, 11, 10, 74) // #22 - Number 9735736#platform: USE_ORIGINS737SpriteFrame(-43, 0, 47, 16, 182, 166) // #23 - "Amy"738#endplatform739end event740741742// ========================743// Editor Events744// ========================745746event RSDKDraw747DrawSprite(0)748end event749750751event RSDKLoad752LoadSpriteSheet("Global/Display.gif")753SpriteFrame(-16, -16, 32, 32, 1, 143)754755SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")756end event757758759