0% found this document useful (0 votes)
9 views14 pages

Act Finish

The document describes the Act Finish Object script for the RSDK Project: Sonic 1/Sonic 2, authored by Christian Whitehead and Simon Thomley. It outlines the logic for handling various game states, scoring, and player bonuses during the act finish sequence. The script includes detailed handling of player states, score calculations, and transitions between game stages.

Uploaded by

fmszin3
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views14 pages

Act Finish

The document describes the Act Finish Object script for the RSDK Project: Sonic 1/Sonic 2, authored by Christian Whitehead and Simon Thomley. It outlines the logic for handling various game states, scoring, and player bonuses during the act finish sequence. The script includes detailed handling of player states, score calculations, and transitions between game stages.

Uploaded by

fmszin3
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 14

// ----------------------------------

// RSDK Project: Sonic 1/Sonic 2


// Script Description: Act Finish Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//
private alias 8 : TYPE_ACTFINISH
private alias object.value3 : score.offset
private alias object.value4 : time.offset
private alias object.value5 : time.bonus
private alias object.value6 : ring.bonus
private alias object.value7 : ring.offset
private alias object.value8 : perfect.offset
private alias object.value10 : perfect.bonus
private alias object.value20 : player.perfect

// Static Values

// Tables

event ObjectMain
switch object.state
case 0
stage.pauseEnabled = 0
object.drawOrder = 6
object.priority = PRIORITY_ACTIVE
object.xpos = screen.xcenter
object.xpos += 128
object.ypos = screen.xcenter
object.value1 = screen.xcenter
FlipSign(object.value1)
object.value1 -= 160
object.value2 = screen.xcenter
FlipSign(object.value2)
object.value2 -= 160
score.offset = screen.xcenter
score.offset += 128
time.offset = score.offset
time.offset += 32
ring.offset = time.offset
ring.offset += 32
perfect.offset = ring.offset
perfect.offset += 32
if PlayerObject_SuperState == 1
PlayerObject_SuperState = 2
end if
switch stage.minutes
case 0
if stage.seconds < 30
time.bonus = 0xC350
else
if stage.seconds < 45
time.bonus = 0x2710
else
time.bonus = 0x1388
end if
end if
break
case 1
if stage.seconds < 30
time.bonus = 0xFA0
else
time.bonus = 0xBB8
end if
break
case 2
time.bonus = 0x7D0
break
case 3
time.bonus = 1000
break
case 4
time.bonus = 500
break
case 5
time.bonus = 100
break
case 9
if stage.debugMode == 0
if options.gameMode < 2
if stage.seconds == 59
time.bonus = 0x186A0
end if
end if
end if
break
end switch
ring.bonus = object[0].value0
ring.bonus *= 100
switch stage.playerListPos
case 0
case 3
case 5
temp0 = 0
foreach (TypeName[Ring], arrayPos0, ALL_ENTITIES)
if object[arrayPos0].propertyValue <= 1
temp0++
end if
next
break
case 1
case 2
case 4
temp0 = 0
foreach (TypeName[Ring], arrayPos0, ALL_ENTITIES)
if object[arrayPos0].propertyValue != 2
temp0++
end if
next
break
end switch
if options.gameMode == 3
if temp0 == 0
perfect.bonus = 50000
player.perfect = 1
end if
end if
object.state++
break
case 1
if object.xpos > 0
object.xpos -= 16
if object.xpos < 0
object.xpos = 0
end if
end if
if object.value1 < 0
object.value1 += 16
if object.value1 > 0
object.value1 = 0
end if
else
object.state++
end if
break
case 2
if object.value2 < 0
object.value2 += 16
if object.value2 > 0
object.value2 = 0
end if
else
object.state++
end if
break
case 3
if object.ypos > 0
object.ypos -= 16
if object.ypos < 0
object.ypos = 0
end if
else
object.state++
end if
break
case 4
if score.offset > 0
score.offset -= 16
if score.offset < 0
score.offset = 0
end if
end if
if time.offset > 0
time.offset -= 16
if time.offset < 0
time.offset = 0
end if
end if
if ring.offset > 0
ring.offset -= 16
if ring.offset < 0
ring.offset = 0
end if
else
object.state++
end if

if perfect.offset > 0
perfect.offset -= 16
if perfect.offset < 0
perfect.offset = 0
end if
end if
break
case 5
if perfect.offset > 0
perfect.offset -= 16
if perfect.offset < 0
perfect.offset = 0
end if
end if

object.value0++
if options.gameMode == 2
if object.value0 > 400
object.value0 = 0
object.state = 8
end if
else
if object.value0 > 299
object.value0 = 0
object.state++
end if
end if
break
case 6
temp2 = inputDown.buttonA
temp2 |= inputDown.buttonB
temp2 |= inputDown.buttonC
if temp2 == 1
temp3 = 2000
if temp3 > ring.bonus
temp3 = ring.bonus
end if
temp4 = 2000
if temp4 > time.bonus
temp4 = time.bonus
end if
temp6 = 2000
if temp6 > perfect.bonus
temp6 = perfect.bonus
end if
else
temp3 = 100
temp4 = 100
temp6 = 100
end if
if ring.bonus > 0
ring.bonus -= temp3
player.score += temp3
end if
if time.bonus > 0
time.bonus -= temp4
player.score += temp4
end if
if perfect.bonus > 0
perfect.bonus -= temp6
player.score += temp6
end if
CheckGreater(ring.bonus, 0)
temp0 = checkResult
CheckGreater(time.bonus, 0)
temp0 |= checkResult
CheckGreater(perfect.bonus, 0)
temp0 |= checkResult
if temp0 == 1
object.value0++
if object.value0 == 2
PlaySfx(SfxName[Score Add], 0)
object.value0 = 0
end if
else
object.state++
object.value0 = 0
PlaySfx(SfxName[Score Total], 0)
end if
break
case 7
object.value0++
if object.value0 == 160
object.value0 = 0
if options.gameMode != 2
CheckCurrentStageFolder("Zone06")
temp0 = checkResult
CheckEqual(stage.actNum, 2)
temp0 &= checkResult
if temp0 == 1
object.state = 9
else
object.state++
if object[0].type == TypeName[Blank Object]
if escape.trigger != 2
PlaySfx(SfxName[Warp], 0)
end if
end if
end if
else
object.state++
if object[0].type == TypeName[Blank Object]
if escape.trigger != 2
PlaySfx(SfxName[Warp], 0)
end if
end if
end if
end if
break
case 8
if object[0].type == TypeName[Blank Object]
if escape.trigger != 2
object.value0 += 8
SetScreenFade(color6, color7, color6, object.value0)
if object.value0 == 0x400
fadeColor = 208
fadeColor <<= 16
temp0 = 255
temp0 <<= 8
fadeColor += temp0
fadeColor += 224
object.direction = FLIP_NONE
object.value0 = 0
lampPostID = 0
stage.listPos++
if options.gameMode == 1
arrayPos1 = options.saveSlot
arrayPos1 <<= 3
arrayPos1 += 1000
if stage.player2Enabled == 1
switch stage.playerListPos
case 0
saveRAM[arrayPos1] = 3
break
case 2
saveRAM[arrayPos1] = 4
break
end switch
else
saveRAM[arrayPos1] = stage.playerListPos
end if
arrayPos1++
saveRAM[arrayPos1] = player.lives
arrayPos1++
saveRAM[arrayPos1] = player.score
arrayPos1++
saveRAM[arrayPos1] = player.scoreBonus
arrayPos1++
temp0 = stage.listPos
temp0++
if temp0 > saveRAM[arrayPos1]
saveRAM[arrayPos1] = temp0
saveRAM[arrayPos1] += 128
end if
arrayPos1++
saveRAM[arrayPos1] = specialStage.emeralds
arrayPos1++
saveRAM[arrayPos1] = specialStage.listPos
end if
specialStage.nextZone = stage.listPos
stage.listPos = specialStage.listPos
stage.activeList = SPECIAL_STAGE
temp0 = engine.trialMode
if stage.listPos >= stage.listSize
temp0 = 1
end if
if temp0 == 0
WriteSaveRAM()
LoadStage()
else
stage.activeList = PRESENTATION_STAGE
stage.listPos = 0
WriteSaveRAM()
LoadStage()
end if
end if
else
object.value0 += 8
SetClassicFade(0, 0, 0, object.value0)
if object.value0 >= 384
fadeColor = 0
object.value0 = 0
lampPostID = 0
object.direction = FLIP_NONE
stage.listPos++
if options.gameMode == 1
arrayPos1 = options.saveSlot
arrayPos1 <<= 3
arrayPos1 += 1000
if stage.player2Enabled == 1
switch stage.playerListPos
case 0
saveRAM[arrayPos1] = 3
break
case 2
saveRAM[arrayPos1] = 4
break
end switch
else
saveRAM[arrayPos1] = stage.playerListPos
end if
arrayPos1++
saveRAM[arrayPos1] = player.lives
arrayPos1++
saveRAM[arrayPos1] = player.score
arrayPos1++
saveRAM[arrayPos1] = player.scoreBonus
arrayPos1++
temp0 = stage.listPos
temp0++
if temp0 > saveRAM[arrayPos1]
saveRAM[arrayPos1] = temp0
end if
arrayPos1++
saveRAM[arrayPos1] = specialStage.emeralds
arrayPos1++
saveRAM[arrayPos1] = specialStage.listPos
end if
switch options.gameMode
case 2
if stage.activeList == BONUS_STAGE
stage.listPos = 6
recGoggles = 102
else
stage.listPos = 8
end if
stage.activeList = PRESENTATION_STAGE

LoadStage()
//CallNativeFunction2(SetLeaderboard,
stage.listPos, timeAttack.result)
//engine.state = 8
break
case 5
stage.listPos = 11
stage.activeList = PRESENTATION_STAGE
LoadStage()
default
temp0 = engine.trialMode
if stage.listPos >= stage.listSize
temp0 = 1
end if
if temp0 == 0
LoadStage()
else
stage.activeList = PRESENTATION_STAGE
stage.listPos = 0
LoadStage()
end if
break
end switch
WriteSaveRAM()
end if
end if
else
object.value0 += 8
SetScreenFade(0, 0, 0, object.value0)
if object.value0 >= 384
fadeColor = 0
object.value0 = 0
lampPostID = 0
object.direction = FLIP_NONE
stage.listPos++
if options.gameMode == 1
arrayPos1 = options.saveSlot
arrayPos1 <<= 3
arrayPos1 += 1000
if stage.player2Enabled == 1
switch stage.playerListPos
case 0
saveRAM[arrayPos1] = 3
break
case 2
saveRAM[arrayPos1] = 4
break
end switch
else
saveRAM[arrayPos1] = stage.playerListPos
end if
arrayPos1++
saveRAM[arrayPos1] = player.lives
arrayPos1++
saveRAM[arrayPos1] = player.score
arrayPos1++
saveRAM[arrayPos1] = player.scoreBonus
arrayPos1++
temp0 = stage.listPos
temp0++
if temp0 > saveRAM[arrayPos1]
saveRAM[arrayPos1] = temp0
end if
arrayPos1++
saveRAM[arrayPos1] = specialStage.emeralds
arrayPos1++
saveRAM[arrayPos1] = specialStage.listPos
end if
switch options.gameMode
case 2
if stage.activeList == BONUS_STAGE
stage.listPos = 6
recGoggles = 102
else
stage.listPos = 8
end if
stage.activeList = PRESENTATION_STAGE

LoadStage()
//CallNativeFunction2(SetLeaderboard, stage.listPos,
timeAttack.result)
//engine.state = 8
break
case 5
stage.listPos = 11
stage.activeList = PRESENTATION_STAGE
LoadStage()
default
temp0 = engine.trialMode
if stage.listPos >= stage.listSize
temp0 = 1
end if
if temp0 == 0
LoadStage()
else
stage.activeList = PRESENTATION_STAGE
stage.listPos = 0
LoadStage()
end if
break
end switch
WriteSaveRAM()
end if
end if
break
case 9
object.xpos += 32
object.ypos += 32
object.value1 -= 32
object.value0++
if object.value0 == 8
object.value0 = 0
object.state++
end if
break
case 10
object.xpos += 32
object.ypos += 32
object.value1 -= 32
object.value2 -= 32
object.value0++
if object.value0 == 8
object.value0 = 0
object.state++
end if
break
case 11
object.xpos += 32
object.ypos += 32
object.value1 -= 32
object.value2 -= 32
score.offset += 32
if score.offset > 96
time.offset += 32
if time.offset > 96
ring.offset += 32
if ring.offset > 96
perfect.offset += 32
end if
end if
end if
object.value0++
if object.value0 == 35
object.value0 = 0
foreach (TypeName[Special Ring], arrayPos0, ACTIVE_ENTITIES)
if object[arrayPos0].propertyValue == 2
object[arrayPos0].state = 5
end if
next
//object.value0 = 0
//temp0 = tileLayer[0].xsize
//temp0 <<= 7
//stage.newXBoundary2 = temp0
//foreach (TypeName[Sign Post], arrayPos0, ACTIVE_ENTITIES)
// object[arrayPos0].state = 5
//next
//currentPlayer = 0
// while currentPlayer < playerCount
// object[currentPlayer].interaction = 1
// object[currentPlayer].controlMode = 0
// object[currentPlayer].right = 1
// currentPlayer++
//loop
ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, 0,
0)
SetMusicTrack("Final.ogg", 0, 0x14AC8)
end if
break
end switch
end event

event ObjectDraw
SetActivePalette(0, 0, screen.ysize)
temp0 = screen.xcenter
temp0 += 16
temp0 += object.xpos
DrawSpriteScreenXY(3, temp0, 56)
temp0 = screen.xcenter
temp0 += 3
temp0 += object.value1
if stage.playerListPos == 5
DrawSpriteScreenXY(29, temp0, 60)
else
DrawSpriteScreenXY(stage.playerListPos, temp0, 60)
end if
DrawSpriteScreenXY(4, temp0, 60)
temp0 = screen.xcenter
temp0 -= 48
temp0 += object.value2
DrawSpriteScreenXY(5, temp0, 80)
temp0 = screen.xcenter
temp0 += 24
temp0 += object.ypos
if stage.actNum == 5
temp1 = 27
else
temp1 = stage.actNum
temp1 += 5
if temp1 < 6
temp1 = 6
end if
if temp1 > 8
temp1 = 8
end if
end if
DrawSpriteScreenXY(temp1, temp0, 82)
temp0 = screen.xcenter
temp0 -= 79
temp0 += score.offset
switch options.gameMode
case 2 //time attack
temp1 = temp0
temp1 += 24
DrawSpriteScreenXY(26, temp1, 117)
DrawSpriteScreenXY(10, temp0, 117)
temp0 += 114

temp1 = stage.minutes
while temp1 >= 10
temp0 += 8
temp1 /= 10
loop

DrawSpriteScreenXY(25, temp0, 117)


temp0 += 37
DrawNumbers(13, temp0, 117, stage.milliSeconds, 2, 8, 1)
temp0 -= 24
DrawNumbers(13, temp0, 117, stage.seconds, 2, 8, 1)
temp5 = temp0
temp0 -= 24
DrawNumbers(13, temp0, 117, stage.minutes, 10, 8, 0)
break
default
DrawSpriteScreenXY(9, temp0, 117)
temp0 += 151
DrawNumbers(13, temp0, 117, player.score, 6, 8, 0)
break
end switch

temp0 = screen.xcenter
temp0 -= 79
temp0 += time.offset
switch options.gameMode
case 2 //time attack
temp1 = temp0
temp1 += 63
DrawSpriteScreenXY(26, temp1, 133)
DrawSpriteScreenXY(23, temp0, 133)
temp0 += 114
if object[9].value5 > 9
temp0 += 8
end if
DrawSpriteScreenXY(25, temp0, 133)
temp0 += 37
DrawNumbers(13, temp0, 133, object[9].value3, 2, 8, 1)
temp0 -= 24
DrawNumbers(13, temp0, 133, object[9].value4, 2, 8, 1)
temp5 = temp0
temp0 -= 24
DrawNumbers(13, temp0, 133, object[9].value5, 2, 8, 0)
break
case 5 //golf
time.bonus = 0
break
default
DrawSpriteScreenXY(10, temp0, 133)
DrawSpriteScreenXY(12, temp0, 133)
temp0 += 151
DrawNumbers(13, temp0, 133, time.bonus, 6, 8, 0)
break
end switch

temp0 = screen.xcenter
temp0 -= 79
temp0 += ring.offset

switch options.gameMode
case 2 //time attack
if object[9].value2 > timeAttack.result
temp0 += 37
temp1 = temp0
temp1 += 76
DrawSpriteScreenXY(26, temp1, 149)
DrawSpriteScreenXY(24, temp0, 149)
end if
break
case 5 //golf
ring.bonus = 0
break
default
DrawSpriteScreenXY(11, temp0, 149)
DrawSpriteScreenXY(12, temp0, 149)
temp0 += 151
DrawNumbers(13, temp0, 149, ring.bonus, 5, 8, 0)
break
end switch

temp0 = screen.xcenter
temp0 -= 79
temp0 += perfect.offset
if options.gameMode == 3
if player.perfect == 1
DrawSpriteScreenXY(28, temp0, 165)
temp0 += 24
DrawSpriteScreenXY(12, temp0, 165)
temp0 += 127
DrawNumbers(13, temp0, 165, perfect.bonus, 5, 8, 0)
end if
end if
end event

event ObjectStartup
LoadSpriteSheet("Global/Display.gif")
SpriteFrame(-70, 0, 70, 16, 1, 222) //0 Sonic
if saved.region == 0
SpriteFrame(-69, 0, 69, 16, 72, 222) //1 Tails
else
SpriteFrame(-69, 0, 69, 16, 145, 205) //1 Miles
end if
SpriteFrame(-107, 0, 127, 16, 51, 256) //2 Knuckles
if stage.playerListPos != 2
SpriteFrame(0, 0, 56, 56, 41, 1) //3 Blue Egg
SpriteFrame(17, 0, 47, 16, 1, 205) //4 Has
SpriteFrame(0, 0, 95, 16, 49, 205) //5 Passed
SpriteFrame(0, 0, 39, 24, 98, 1) //6 Act 1
SpriteFrame(0, 0, 43, 24, 138, 1) //7 Act 2
SpriteFrame(0, 0, 43, 24, 182, 1) //8 Act 3
else
SpriteFrame(20, 0, 56, 56, 41, 1) //3 Blue Egg
SpriteFrame(37, 0, 47, 16, 1, 205) //4 Has
SpriteFrame(20, 0, 95, 16, 49, 205) //5 Passed
SpriteFrame(20, 0, 39, 24, 98, 1) //6 Act 1
SpriteFrame(20, 0, 43, 24, 138, 1) //7 Act 2
SpriteFrame(20, 0, 43, 24, 182, 1) //8 Act 3
end if
SpriteFrame(0, -2, 44, 16, 161, 26) //9 Score
SpriteFrame(0, 0, 31, 11, 1, 17) //10 Time
SpriteFrame(0, 0, 31, 11, 1, 33) //11 Ring
SpriteFrame(40, -2, 46, 16, 98, 43) //12 Bonus

//Numbers
SpriteFrame(0, 0, 8, 11, 1, 50) // 13 0
SpriteFrame(0, 0, 8, 11, 10, 50) //14 1
SpriteFrame(0, 0, 8, 11, 19, 50) //15 2
SpriteFrame(0, 0, 8, 11, 28, 50) //16 3
SpriteFrame(0, 0, 8, 11, 1, 62) //17 4
SpriteFrame(0, 0, 8, 11, 10, 62) //18 5
SpriteFrame(0, 0, 8, 11, 19, 62) //19 6
SpriteFrame(0, 0, 8, 11, 28, 62) //20 7
SpriteFrame(0, 0, 8, 11, 1, 74) //21 8
SpriteFrame(0, 0, 8, 11, 10, 74) //22 9

SpriteFrame(0, 0, 70, 11, 46, 192) //23 Best Time


SpriteFrame(0, 0, 83, 11, 118, 192) //24 New Record
SpriteFrame(0, 0, 29, 4, 1, 45) //25 Time Marker
SpriteFrame(-4, -2, 16, 16, 182, 175) //26 Results Oval
if stage.playerListPos != 2
SpriteFrame(0, 16, 32, 8, 174, 64) //27 Act 1
else
SpriteFrame(20, 16, 32, 8, 174, 64) //27 Act 1
end if

SpriteFrame(0, 0, 56, 11, 199, 179) //28 Perfect


SpriteFrame(-51, 0, 48, 16, 1, 256) //29 Amy

end event

event RSDKDraw
DrawSprite(0)
end event

event RSDKLoad
LoadSpriteSheet("Global/Display.gif")
SpriteFrame(-16, -16, 32, 32, 1, 143)
end event

You might also like