Path: blob/master/Sonic 1/Scripts/SBZ/Transporter.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: Transporter Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.playerID12private alias object.value1 : object.nodePos.x13private alias object.value2 : object.nodePos.y14private alias object.value3 : object.nodeChangeDelay15private alias object.value4 : object.tablePtr16private alias object.value5 : object.tableSize17private alias object.value6 : object.tablePos1819// States20private alias 0 : TRANSPORTER_WAITING21private alias 1 : TRANSPORTER_ACTIVATING22private alias 2 : TRANSPORTER_TRANSPORTING2324// Types25private alias 0 : TRANSPORTER_TYPE_D_LONG26private alias 1 : TRANSPORTER_TYPE_D_MED27private alias 2 : TRANSPORTER_TYPE_URU28private alias 3 : TRANSPORTER_TYPE_D_SHORT29private alias 4 : TRANSPORTER_TYPE_DLD30private alias 5 : TRANSPORTER_TYPE_U31private alias 6 : TRANSPORTER_TYPE_ULU32private alias 7 : TRANSPORTER_TYPE_HIDDEN3334// Player Aliases35private alias object.state : player.state36private alias object.xpos : player.xpos37private alias object.ypos : player.ypos38private alias object.xvel : player.xvel39private alias object.yvel : player.yvel40private alias object.speed : player.speed41private alias object.gravity : player.gravity42private alias object.animationSpeed : player.animationSpeed43private alias object.animation : player.animation44private alias object.scrollTracking : player.scrollTracking45private alias object.tileCollisions : player.tileCollisions46private alias object.value0 : player.rings47private alias object.value5 : player.rollAnimationSpeed48private alias object.value7 : player.invincibleTimer4950// Achievement Aliases51private alias 8 : ACHIEVEMENT_HIDDENTRANSPORTER525354// ========================55// Function Declarations56// ========================5758reserve function Transporter_HandleNewNode596061// ========================62// Tables63// ========================6465private table Transporter_tableSizes661, 1, 7, 1, 7, 1, 7, 167end table6869private table Transporter_tablePtrs[8]7071// World Positions of the "nodes", kinda rigid way of doin it, but whatever works I suppose...72private table Transporter_movementTable0730x7940000, 0x98C000074end table7576private table Transporter_movementTable1770x940000, 0x38C000078end table7980private table Transporter_movementTable2810x7940000, 0x2E80000820x7A40000, 0x2C00000830x7D00000, 0x2AC0000840x8580000, 0x2AC0000850x8840000, 0x2980000860x8940000, 0x2700000870x8940000, 0x190000088end table8990private table Transporter_movementTable3910x8940000, 0x690000092end table9394private table Transporter_movementTable4950x11940000, 0x4700000960x11840000, 0x4980000970x11580000, 0x4AC0000980x0FD00000, 0x4AC0000990x0FA40000, 0x4C000001000x0F940000, 0x4E800001010x0F940000, 0x5900000102end table103104private table Transporter_movementTable51050x12940000, 0x4900000106end table107108private table Transporter_movementTable61090x15940000, 0x7E800001100x15840000, 0x7C000001110x15600000, 0x7AC00001120x14D00000, 0x7AC00001130x14A40000, 0x79800001140x14940000, 0x77000001150x14940000, 0x5900000116end table117118private table Transporter_movementTable71190x8940000, 0x900000120end table121122123// ========================124// Function Definitions125// ========================126127private function Transporter_HandleNewNode128temp0 = object.nodePos.x129temp2 = 0x1000130temp0 -= player[currentPlayer].xpos131if temp0 < 0132FlipSign(temp0)133FlipSign(temp2)134end if135136temp0 >>= 16137temp1 = object.nodePos.y138temp3 = 0x1000139temp1 -= player[currentPlayer].ypos140if temp1 < 0141FlipSign(temp1)142FlipSign(temp3)143end if144145temp1 >>= 16146if temp1 >= temp0147temp1 = object.nodePos.y148temp1 -= player[currentPlayer].ypos149temp1 &= 0xFFFF0000150temp1 /= temp3151152temp0 = object.nodePos.x153temp0 -= player[currentPlayer].xpos154if temp0 != 0155temp0 &= 0xFFFF0000156temp0 /= temp1157end if158159temp0 <<= 8160temp3 <<= 8161temp1 >>= 8162player[currentPlayer].xvel = temp0163player[currentPlayer].yvel = temp3164Abs(temp1)165object.nodeChangeDelay = temp1166else167temp0 = object.nodePos.x168temp0 -= player[currentPlayer].xpos169temp0 &= 0xFFFF0000170temp0 /= temp2171172temp1 = object.nodePos.y173temp1 -= player[currentPlayer].ypos174if temp1 != 0175temp1 &= 0xFFFF0000176temp1 /= temp0177end if178179temp1 <<= 8180temp2 <<= 8181temp0 >>= 8182player[currentPlayer].xvel = temp2183player[currentPlayer].yvel = temp1184Abs(temp0)185object.nodeChangeDelay = temp0186end if187end function188189190// ========================191// Events192// ========================193194event ObjectUpdate195switch object.state196case TRANSPORTER_WAITING197foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)198if player[currentPlayer].state != Player_State_Static199temp0 = player[currentPlayer].xpos200temp0 -= object.xpos201if object.direction == FLIP_X202temp0 += 0xF0000203end if204205if temp0 >= 0206if temp0 < 0x100000207temp1 = player[currentPlayer].ypos208temp1 -= object.ypos209temp1 += 0x200000210if temp1 >= 0211if temp1 < 0x400000212temp0 = true213214if object.propertyValue == TRANSPORTER_TYPE_HIDDEN215if player[currentPlayer].rings < 50216temp0 = false217else218if stage.debugMode == false219if currentPlayer == 0220// Grant the "Hidden Transporter" Achievement221CallNativeFunction2(SetAchievement, ACHIEVEMENT_HIDDENTRANSPORTER, 100)222end if223end if224end if225end if226227if temp0 == true228CreateTempObject(TypeName[Transporter], object.propertyValue, object.xpos, object.ypos)229GetTableValue(object[tempObjectPos].tablePtr, object.propertyValue, Transporter_tablePtrs)230GetTableValue(object[tempObjectPos].tableSize, object.propertyValue, Transporter_tableSizes)231object[tempObjectPos].state = TRANSPORTER_ACTIVATING232object[tempObjectPos].playerID = currentPlayer233player[currentPlayer].state = Player_State_Static234player[currentPlayer].tileCollisions = false235player[currentPlayer].animation = ANI_JUMPING236player[currentPlayer].rollAnimationSpeed = 0237player[currentPlayer].animationSpeed = 0238player[currentPlayer].xvel = 0239player[currentPlayer].yvel = 0240player[currentPlayer].gravity = GRAVITY_AIR241player[currentPlayer].scrollTracking = true242player[currentPlayer].xpos = object.xpos243player[currentPlayer].ypos = object.ypos244PlaySfx(SfxName[Rolling], false)245end if246end if247end if248end if249end if250end if251next252break253254case TRANSPORTER_ACTIVATING255currentPlayer = object.playerID256257// Oscillate a bit258Sin256(player[currentPlayer].ypos, object.angle)259object.angle += 2260player[currentPlayer].ypos <<= 11261FlipSign(player[currentPlayer].ypos)262player[currentPlayer].ypos += object.ypos263264// Stay Invincible while in the transporter265if player[currentPlayer].invincibleTimer < 2266player[currentPlayer].invincibleTimer = 2267end if268269if object.angle == 0x80270temp0 = object.tablePos271temp0 <<= 1272GetTableValue(object.nodePos.x, temp0, object.tablePtr)273temp0++274GetTableValue(object.nodePos.y, temp0, object.tablePtr)275276if object.propertyValue == TRANSPORTER_TYPE_ULU // (this one uses screen wrapping)277player[currentPlayer].ypos += 0x8000000278if currentPlayer == 0279tileLayer[2].scrollPos -= 0x1000000280camera[0].ypos += 0x800281screen.yoffset += 0x800282end if283284// Bug Details (kinda?):285// -> Rings are teleported in order to mask the screen wrap, but if P2 enters286// a teleporter without P1 then the rings will visibly disappear in front of the camera287foreach (TypeName[Ring], arrayPos0, ACTIVE_ENTITIES)288BoxCollisionTest(C_TOUCH, object.entityPos, -128, -256, 0, 0, arrayPos0, -8, -8, 8, 8)289if checkResult == true290object[arrayPos0].ypos += 0x8000000291end if292next293end if294295CallFunction(Transporter_HandleNewNode)296object.state++297PlaySfx(SfxName[Release], false)298end if299break300301case TRANSPORTER_TRANSPORTING302currentPlayer = object.playerID303object.nodeChangeDelay--304305if object.nodeChangeDelay < 0306player[currentPlayer].xpos = object.nodePos.x307player[currentPlayer].ypos = object.nodePos.y308309object.tablePos++310if object.tablePos >= object.tableSize311object.type = TypeName[Blank Object]312player[currentPlayer].ypos &= 0x7FF0000313#platform: USE_STANDALONE314player[currentPlayer].state = Player_State_Air315#endplatform316#platform: USE_ORIGINS317player[currentPlayer].state = Player_State_Air_NoDropDash318#endplatform319player[currentPlayer].animation = ANI_WALKING320player[currentPlayer].tileCollisions = true321player[currentPlayer].speed = 0322player[currentPlayer].xvel = 0323player[currentPlayer].yvel = 0x20000324else325temp0 = object.tablePos326temp0 <<= 1327GetTableValue(object.nodePos.x, temp0, object.tablePtr)328temp0++329GetTableValue(object.nodePos.y, temp0, object.tablePtr)330CallFunction(Transporter_HandleNewNode)331end if332end if333break334335end switch336end event337338339event ObjectStartup340LoadSpriteSheet("SBZ/Objects.gif")341342// Set position tables to the master table343SetTableValue(Transporter_movementTable0, TRANSPORTER_TYPE_D_LONG, Transporter_tablePtrs)344SetTableValue(Transporter_movementTable1, TRANSPORTER_TYPE_D_MED, Transporter_tablePtrs)345SetTableValue(Transporter_movementTable2, TRANSPORTER_TYPE_URU, Transporter_tablePtrs)346SetTableValue(Transporter_movementTable3, TRANSPORTER_TYPE_D_SHORT, Transporter_tablePtrs)347SetTableValue(Transporter_movementTable4, TRANSPORTER_TYPE_DLD, Transporter_tablePtrs)348SetTableValue(Transporter_movementTable5, TRANSPORTER_TYPE_U, Transporter_tablePtrs)349SetTableValue(Transporter_movementTable6, TRANSPORTER_TYPE_ULU, Transporter_tablePtrs)350SetTableValue(Transporter_movementTable7, TRANSPORTER_TYPE_HIDDEN, Transporter_tablePtrs)351end event352353354// ========================355// Editor Events356// ========================357358event RSDKEdit359if editor.returnVariable == true360switch editor.variableID361case EDIT_VAR_PROPVAL // property value362checkResult = object.propertyValue363break364365case 0 // type366checkResult = object.propertyValue367break368369end switch370else371switch editor.variableID372case EDIT_VAR_PROPVAL // property value373object.propertyValue = editor.variableValue374break375376case 0 // type377object.propertyValue = editor.variableValue378break379380end switch381end if382end event383384385event RSDKDraw386DrawSprite(0)387388if editor.showGizmos == true389editor.drawingOverlay = true390391temp7 = object.xpos392temp6 = object.ypos393394// TODO: attempt at drawing paths here, prolly broken though395396temp0 = object.propertyValue397temp0 &= 7398399GetTableValue(object.tablePtr, temp0, Transporter_tablePtrs)400GetTableValue(object.tableSize, temp0, Transporter_tableSizes)401object.tableSize *= 2402403temp0 = 0404while temp0 < object.tableSize405GetTableValue(object.nodePos.x, temp0, object.tablePtr)406temp0++407GetTableValue(object.nodePos.y, temp0, object.tablePtr)408temp0++409410DrawArrow(object.xpos, object.ypos, object.nodePos.x, object.nodePos.y, 0xFF, 0xFF, 0x00)411412object.xpos = object.nodePos.x413object.ypos = object.nodePos.y414loop415416object.xpos = temp7417object.ypos = temp6418419editor.drawingOverlay = false420end if421end event422423424event RSDKLoad425LoadSpriteSheet("Global/Display.gif")426SpriteFrame(-8, -8, 16, 16, 239, 239) // "T" (-ransporter)427428AddEditorVariable("type")429SetActiveVariable("type")430AddEnumVariable("Straight Down (Long)", TRANSPORTER_TYPE_D_LONG)431AddEnumVariable("Straight Down", TRANSPORTER_TYPE_D_MED)432AddEnumVariable("Up, Right, Up", TRANSPORTER_TYPE_URU)433AddEnumVariable("Straight Down (Short)", TRANSPORTER_TYPE_D_SHORT)434AddEnumVariable("Down, Left, Down", TRANSPORTER_TYPE_DLD)435AddEnumVariable("Straight Up", TRANSPORTER_TYPE_U)436AddEnumVariable("Up, Left, Up", TRANSPORTER_TYPE_ULU)437AddEnumVariable("Straight up if more than 49 rings (Awards Achievement)", TRANSPORTER_TYPE_HIDDEN)438439SetTableValue(Transporter_movementTable0, TRANSPORTER_TYPE_D_LONG, Transporter_tablePtrs)440SetTableValue(Transporter_movementTable1, TRANSPORTER_TYPE_D_MED, Transporter_tablePtrs)441SetTableValue(Transporter_movementTable2, TRANSPORTER_TYPE_URU, Transporter_tablePtrs)442SetTableValue(Transporter_movementTable3, TRANSPORTER_TYPE_D_SHORT, Transporter_tablePtrs)443SetTableValue(Transporter_movementTable4, TRANSPORTER_TYPE_DLD, Transporter_tablePtrs)444SetTableValue(Transporter_movementTable5, TRANSPORTER_TYPE_U, Transporter_tablePtrs)445SetTableValue(Transporter_movementTable6, TRANSPORTER_TYPE_ULU, Transporter_tablePtrs)446SetTableValue(Transporter_movementTable7, TRANSPORTER_TYPE_HIDDEN, Transporter_tablePtrs)447end event448449450