Path: blob/master/Sonic 2/Scripts/Global/TitleCard.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Title Card Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.timer12private alias object.value1 : object.actNamePos13private alias object.value2 : object.zonePos14private alias object.value3 : object.blueRectPos // well yeah it's green with Knuckles in Plus but you know what i mean15private alias object.value4 : object.yellowRectPos16private alias object.value5 : object.redRectPos17private alias object.value6 : object.displayedActNo18private alias object.value7 : object.vsReady19private alias object.value8 : object.sentReadyFlag2021// States22private alias 0 : TITLECARD_SETUP23private alias 1 : TITLECARD_DELAY24private alias 2 : TITLECARD_ENTERTITLECARD25private alias 3 : TITLECARD_SHOWTITLECARD26private alias 4 : TITLECARD_EXITREDYELLOWRECT27private alias 5 : TITLECARD_EXITBLUERECT28private alias 6 : TITLECARD_STARTSTAGE29private alias 7 : TITLECARD_CREDITSFADEIN30private alias 8 : TITLECARD_FADETOTITLE31private alias 9 : TITLECARD_EXITTITLECARD3233// Types34private alias 0 : TITLECARD_TYPE_ACTNUM35private alias 1 : TITLECARD_TYPE_ACT136private alias 2 : TITLECARD_TYPE_ACT237private alias 3 : TITLECARD_TYPE_ACT338private alias 4 : TITLECARD_TYPE_ZONE39private alias 5 : TITLECARD_TYPE_ZONE_MBZ4041// Player Aliases42private alias object.propertyValue : player.character43private alias object.controlMode : player.controlMode44private alias object.jumpPress : player.jumpPress45private alias object.jumpHold : player.jumpHold46private alias object.up : player.up47private alias object.down : player.down48private alias object.left : player.left49private alias object.right : player.right50private alias object.value1 : player.timer5152// Tracks53private alias 0 : TRACK_STAGE5455// ========================56// Function Declarations57// ========================5859reserve function TitleCard_DrawBG606162// ========================63// Static Values64// ========================6566// Determines whether the act results will say got through zone or got through act [num]67public value TitleCard_showZoneText = 0686970// ========================71// Function Definitions72// ========================7374private function TitleCard_DrawBG75#platform: USE_ORIGINS76// Introduced in Plus, draws the BG and determines if it should be blue (regular Sonic 2) or green (Knuckles in Sonic 2)7778if screen.currentID == 079temp0 = player[0].character80else81temp0 = vs.player2Type82end if8384if temp0 == PLAYER_KNUCKLES85DrawRect(0, 0, screen.xsize, object.blueRectPos, 0, 135, 1, 0xFF)86else87DrawRect(0, 0, screen.xsize, object.blueRectPos, 32, 64, 192, 0xFF)88end if89#endplatform90end function919293// ========================94// Events95// ========================969798event ObjectUpdate99options.touchControls = false100101switch object.state102case TITLECARD_SETUP103object.alpha = 0xFF104object.actNamePos = 720105object.zonePos -= 720106107// 510 is the sega forever value (though you should use 512 instead, as it works properly and doesn't cause a bug)108// 432 is the original/origins one (the forever one works better on wider screens, the value is basically screen.xsize + 10)109object.yellowRectPos = 432110111object.redRectPos = -320112113switch object.propertyValue114case TITLECARD_TYPE_ACTNUM115object.displayedActNo = stage.actNum116TitleCard_showZoneText = false117break118119case TITLECARD_TYPE_ACT1120object.displayedActNo = 1121TitleCard_showZoneText = false122break123124case TITLECARD_TYPE_ACT2125object.displayedActNo = 2126TitleCard_showZoneText = false127break128129case TITLECARD_TYPE_ACT3130object.displayedActNo = 3131TitleCard_showZoneText = false132break133134default135TitleCard_showZoneText = true136break137end switch138139if options.vsMode == true140object.vsReady = false141object.sentReadyFlag = true142else143object.vsReady = true144object.sentReadyFlag = false145end if146147#platform: USE_ORIGINS148game.missionCondition = false149game.missionEnd = false150151if game.playMode == BOOT_PLAYMODE_MISSION152PlayMusic(TRACK_STAGE)153game.missionCondition = false154game.missionEnd = false155object.state = TITLECARD_CREDITSFADEIN156object.timer = 0157stage.timeEnabled = true158stage.state = STAGE_RUNNING159SetScreenFade(0, 0, 0, 0)160else161if game.playMode == BOOT_PLAYMODE_BOSSRUSH162PlayMusic(TRACK_STAGE)163game.missionCondition = false164game.missionEnd = false165object.state = TITLECARD_CREDITSFADEIN166object.timer = 0167stage.timeEnabled = true168stage.state = STAGE_RUNNING169SetScreenFade(0, 0, 0, 0)170else171#endplatform172if credits.screen > 0173object.state = TITLECARD_CREDITSFADEIN174object.timer = 272175stage.state = STAGE_RUNNING176SetScreenFade(0, 0, 0, 255)177else178object.state++179end if180#platform: USE_ORIGINS181end if182end if183#endplatform184break185186case TITLECARD_DELAY187if object.timer < 30188object.timer++189else190if options.vsMode == true191// Only continue if we're ready192CallNativeFunction2(SendEntity, object.entityPos, false)193if ReceiveValue == -1 // if we don't have the recieve func, we cant do VS mode, continue.194object.vsReady = true195else196CallNativeFunction2(ReceiveEntity, 0x400, true)197// we're ready to start if we got the other entity's 'sendReadyFlag'198object.vsReady = object[0x400].sentReadyFlag199ResetObjectEntity(0x400, TypeName[Blank Object], 0, 0, 0)200end if201end if202203if object.vsReady == true204object.timer = 0205PlayMusic(TRACK_STAGE)206object.state++207end if208end if209break210211case TITLECARD_ENTERTITLECARD212if options.vsMode == true213CallNativeFunction2(SendEntity, object.entityPos, false)214end if215216if object.blueRectPos < 240217object.blueRectPos += 16218end if219220if object.yellowRectPos > 0221object.yellowRectPos -= 16222object.redRectPos += 16223end if224225if object.actNamePos > 0226object.actNamePos -= 16227object.zonePos += 16228else229object.state++230end if231break232233case TITLECARD_SHOWTITLECARD234if object.timer < 60235if options.vsMode == true236CallNativeFunction2(SendEntity, object.entityPos, false)237CallNativeFunction2(ReceiveEntity, 0x400, true)238ResetObjectEntity(0x400, TypeName[Blank Object], 0, 0, 0)239end if240object.timer++241else242object.timer = 0243object.state++244end if245break246247case TITLECARD_EXITREDYELLOWRECT248if object.redRectPos > -48249object.redRectPos -= 32250else251if object.yellowRectPos < 424 // 500 is the sega forever value, 424 is the original one (the forever one works better on wider screens, the value is basically just screen.xsize)252object.yellowRectPos += 32253if options.vsMode == true254CallNativeFunction2(ReceiveEntity, 0x400, true)255ResetObjectEntity(0x400, TypeName[Blank Object], 0, 0, 0)256end if257else258if options.vsMode == true259stage.state = STAGE_2P_MODE260else261stage.state = STAGE_RUNNING262end if263264currentPlayer = 0265while currentPlayer < playerCount266player[currentPlayer].controlMode = CONTROLMODE_NONE267player[currentPlayer].up = false268player[currentPlayer].down = false269player[currentPlayer].left = false270player[currentPlayer].right = false271player[currentPlayer].jumpPress = false272player[currentPlayer].jumpHold = false273player[currentPlayer].timer = 0274currentPlayer++275loop276277object.state++278end if279end if280break281282case TITLECARD_EXITBLUERECT283if object.blueRectPos > 0284object.blueRectPos -= 32285else286currentPlayer = 0287while currentPlayer < playerCount288#platform: USE_STANDALONE289player[currentPlayer].controlMode = CONTROLMODE_P1290#endplatform291#platform: USE_ORIGINS292player[currentPlayer].controlMode = currentPlayer293#endplatform294currentPlayer++295loop296object.state++297end if298break299300case TITLECARD_STARTSTAGE301if object.timer < 48302object.timer++303else304object.timer = 0305stage.timeEnabled = true306object.state = TITLECARD_EXITTITLECARD307end if308break309310case TITLECARD_CREDITSFADEIN311if object.timer > 0312object.timer -= 16313SetScreenFade(0, 0, 0, object.timer)314else315currentPlayer = 0316while currentPlayer < playerCount317#platform: USE_STANDALONE318player[currentPlayer].controlMode = CONTROLMODE_P1319#endplatform320#platform: USE_ORIGINS321player[currentPlayer].controlMode = currentPlayer322#endplatform323currentPlayer++324loop325ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0, 0)326end if327break328329case TITLECARD_FADETOTITLE330// This state is set from the Player Object, when a replay is finished331// All the credits.screen checks here are just leftovers that don't do much, since S2 doesn't use in-game credits like S1 did332333if object.timer < 300334object.timer += 5335if credits.screen == 0336music.volume -= 2337end if338else339stage.activeList = PRESENTATION_STAGE340if credits.screen > 0341stage.listPos = 2342else343stage.listPos = 0344StopMusic()345end if346LoadStage()347end if348349SetScreenFade(0, 0, 0, object.timer)350break351352case TITLECARD_EXITTITLECARD353object.actNamePos += 32354object.zonePos -= 32355if object.timer < 20356object.timer++357else358object.timer = 0359object.type = TypeName[Blank Object]360end if361break362363end switch364end event365366367event ObjectDraw368temp2 = screen.xcenter369temp2 -= 160370temp2 >>= 1371372switch object.state373case TITLECARD_SETUP374case TITLECARD_DELAY375case TITLECARD_ENTERTITLECARD376case TITLECARD_SHOWTITLECARD377SetActivePalette(0, 0, screen.ysize)378379#platform: USE_STANDALONE380DrawRect(0, 0, screen.xsize, object.blueRectPos, 0x20, 0x40, 0xC0, 0xFF)381#endplatform382#platform: USE_ORIGINS383CallFunction(TitleCard_DrawBG)384#endplatform385386DrawRect(0, object.blueRectPos, screen.xsize, screen.ysize, 0x00, 0x00, 0x00, 0xFF)387388#platform: USE_STANDALONE389if options.vsMode == true390if object.state == TITLECARD_DELAY391// Waiting for other player...392DrawSpriteScreenXY(32, screen.xsize, screen.ysize)393end if394end if395#endplatform396397// Yellow Rect398DrawRect(object.yellowRectPos, 168, screen.xsize, 72, 0xE0, 0xE0, 0x00, 0xFF)399400// "Sonic The Hedgehog" Text401temp0 = object.yellowRectPos402temp0 += screen.xcenter403DrawSpriteScreenXY(31, temp0, 176)404405// Red Rect (& Red Sidebar)406DrawRect(0, 0, object.redRectPos, screen.ysize, 0xE0, 0x00, 0x00, 0xFF) // Red Rect407DrawSpriteScreenXY(26, object.redRectPos, 0) // Red Sidebar408409temp0 = screen.xcenter410temp0 += temp2411temp0 += 128412temp0 += object.actNamePos413DrawActName(0, temp0, 64, 0, 0, 16, 0)414415temp0 = screen.xcenter416temp0 += temp2417temp0 += 41418temp0 += object.zonePos419DrawSpriteScreenXY(27, temp0, 88)420421if object.displayedActNo > 0422temp1 = 27423temp1 += object.displayedActNo424if temp1 > 30425temp1 = 30426end if427DrawSpriteScreenXY(temp1, temp0, 88)428end if429break430431case TITLECARD_EXITREDYELLOWRECT432case TITLECARD_EXITBLUERECT433SetActivePalette(0, 0, screen.ysize)434435#platform: USE_STANDALONE436DrawRect(0, 0, screen.xsize, object.blueRectPos, 0x20, 0x40, 0xC0, 0xFF)437#endplatform438#platform: USE_ORIGINS439CallFunction(TitleCard_DrawBG)440#endplatform441442DrawRect(object.yellowRectPos, 168, screen.xsize, 72, 0xE0, 0xE0, 0x00, 0xFF)443444temp0 = object.yellowRectPos445temp0 += screen.xcenter446DrawSpriteScreenXY(31, temp0, 176)447DrawRect(0, 0, object.redRectPos, screen.ysize, 0xE0, 0x00, 0x00, 0xFF)448DrawSpriteScreenXY(26, object.redRectPos, 0)449450temp0 = screen.xcenter451temp0 += temp2452temp0 += 128453temp0 += object.actNamePos454DrawActName(0, temp0, 64, 0, 0, 16, 0)455456temp0 = screen.xcenter457temp0 += temp2458temp0 += 41459temp0 += object.zonePos460DrawSpriteScreenXY(27, temp0, 88)461462if object.displayedActNo > 0463temp1 = 27464temp1 += object.displayedActNo465if temp1 > 30466temp1 = 30467end if468DrawSpriteScreenXY(temp1, temp0, 88)469end if470break471472case TITLECARD_STARTSTAGE473case TITLECARD_EXITTITLECARD474SetActivePalette(0, 0, screen.ysize)475476temp0 = screen.xcenter477temp0 += temp2478temp0 += 128479temp0 += object.actNamePos480DrawActName(0, temp0, 64, 0, 0, 16, 0)481482temp0 = screen.xcenter483temp0 += temp2484temp0 += 41485temp0 += object.zonePos486DrawSpriteScreenXY(27, temp0, 88)487488if object.displayedActNo > 0489temp1 = 27490temp1 += object.displayedActNo491if temp1 > 30492temp1 = 30493end if494DrawSpriteScreenXY(temp1, temp0, 88)495end if496break497end switch498end event499500501event ObjectStartup502LoadSpriteSheet("Global/Display.gif")503504// Title card frames505506// Titlecard Letters (0-25)507SpriteFrame(0, 0, 15, 16, 37, 79)508SpriteFrame(0, 0, 16, 16, 53, 79)509SpriteFrame(0, 0, 16, 16, 70, 79)510SpriteFrame(0, 0, 16, 16, 87, 79)511SpriteFrame(0, 0, 15, 16, 104, 79)512SpriteFrame(0, 0, 15, 16, 120, 79)513SpriteFrame(0, 0, 16, 16, 136, 79)514SpriteFrame(0, 0, 16, 16, 153, 79)515SpriteFrame(0, 0, 8, 16, 170, 79)516SpriteFrame(0, 0, 16, 16, 179, 79)517SpriteFrame(0, 0, 16, 16, 196, 79)518SpriteFrame(0, 0, 16, 16, 213, 79)519SpriteFrame(0, 0, 23, 16, 43, 96)520SpriteFrame(0, 0, 16, 16, 67, 96)521SpriteFrame(0, 0, 16, 16, 84, 96)522SpriteFrame(0, 0, 16, 16, 101, 96)523SpriteFrame(0, 0, 16, 16, 118, 96)524SpriteFrame(0, 0, 16, 16, 135, 96)525SpriteFrame(0, 0, 16, 16, 152, 96)526SpriteFrame(0, 0, 16, 16, 169, 96)527SpriteFrame(0, 0, 16, 16, 186, 96)528SpriteFrame(0, 0, 16, 16, 203, 96)529SpriteFrame(0, 0, 22, 16, 220, 96)530SpriteFrame(0, 0, 15, 16, 43, 113)531SpriteFrame(0, 0, 16, 16, 59, 113)532SpriteFrame(0, 0, 16, 16, 76, 113)533534SpriteFrame(0, 0, 8, 256, 248, 0) // Red Sidebar - #26535SpriteFrame(0, 0, 62, 16, 83, 1) // Zone - #27536SpriteFrame(63, 0, 16, 29, 42, 1) // Act 1 - #28537SpriteFrame(63, 0, 23, 29, 59, 1) // Act 2 - #29538SpriteFrame(63, 0, 23, 32, 42, 31) // Act 3 - #30539SpriteFrame(0, 0, 140, 5, 37, 73) // "Sonic The Hedgehog" - #31540541if vs.playerID == 0542SpriteFrame(-160, -16, 136, 7, 110, 172) // "Waiting for 2P" - #32543else544SpriteFrame(-160, -16, 136, 7, 110, 164) // "Waiting for 1P" - #32545end if546547if options.vsMode == true548CallNativeFunction2(ReceiveEntity, 0x400, true)549ResetObjectEntity(0x400, TypeName[Blank Object], 0, 0, 0)550#platform: USE_ORIGINS551SetScreenCount(2)552#endplatform553end if554555// Cycle through all Title Card objects556// (Dunno why a regular foreach isn't used here, but sure...)557arrayPos0 = 32558while arrayPos0 < 0x420559if object[arrayPos0].type == TypeName[Title Card]560object[arrayPos0].priority = PRIORITY_ALWAYS561object[arrayPos0].alpha = 0xFF562object[arrayPos0].drawOrder = 6563stage.state = STAGE_PAUSED564565if object[arrayPos0].propertyValue == TITLECARD_TYPE_ZONE_MBZ566CheckCurrentStageFolder("ZoneM")567if checkResult == false568// If the object has a property value of 5 & we're NOT in the Egg Gauntlet folder (somehow), then go back to the title screen569// (Purpose unknown, idk why this exists or what it's even supposed to mean)570stage.activeList = PRESENTATION_STAGE571stage.listPos = 0572LoadStage()573end if574end if575end if576577arrayPos0++578loop579end event580581582// ========================583// Editor Events584// ========================585586event RSDKEdit587if editor.returnVariable == true588switch editor.variableID589case EDIT_VAR_PROPVAL // property value590checkResult = object.propertyValue591break592593case 0 // actType594checkResult = object.propertyValue595break596597end switch598else599switch editor.variableID600case EDIT_VAR_PROPVAL // property value601object.propertyValue = editor.variableValue602break603604case 0 // actType605object.propertyValue = editor.variableValue606break607608end switch609end if610end event611612613event RSDKDraw614DrawSprite(0)615end event616617618event RSDKLoad619LoadSpriteSheet("Global/Display.gif")620SpriteFrame(-8, -8, 16, 16, 168, 18)621622AddEditorVariable("actType")623SetActiveVariable("actType")624AddEnumVariable("Use Act Num", TITLECARD_TYPE_ACTNUM)625AddEnumVariable("Show Act 1", TITLECARD_TYPE_ACT1)626AddEnumVariable("Show Act 2", TITLECARD_TYPE_ACT2)627AddEnumVariable("Show Act 3", TITLECARD_TYPE_ACT3)628AddEnumVariable("Show Zone Text", TITLECARD_TYPE_ZONE)629AddEnumVariable("Show Zone Text (MBZ)", TITLECARD_TYPE_ZONE_MBZ)630end event631632633