Path: blob/master/Sonic 2/Scripts/MPZ/Transporter.txt
1478 views
// ----------------------------------1// RSDK Project: Sonic 22// 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.tablePos18private alias object.value7 : object.parent19private alias object.value8 : object.activePlayers2021// States22private alias 0 : TRANSPORTER_WAITING23private alias 1 : TRANSPORTER_ACTIVATING24private alias 2 : TRANSPORTER_TRANSPORTING2526// Types27private alias 0 : TRANSPORTER_TYPE_LDR28private alias 1 : TRANSPORTER_TYPE_R29private alias 2 : TRANSPORTER_TYPE_LDR_230private alias 3 : TRANSPORTER_TYPE_331private alias 4 : TRANSPORTER_TYPE_432private alias 5 : TRANSPORTER_TYPE_RUL33private alias 6 : TRANSPORTER_TYPE_LUR34private alias 7 : TRANSPORTER_TYPE_RUL_135private alias 8 : TRANSPORTER_TYPE_RDL36private alias 9 : TRANSPORTER_TYPE_937private alias 10 : TRANSPORTER_TYPE_R038private alias 11 : TRANSPORTER_TYPE_LUR_239private alias 12 : TRANSPORTER_TYPE_RUL_24041// Player Aliases42private alias object.state : player.state43private alias object.xpos : player.xpos44private alias object.ypos : player.ypos45private alias object.xvel : player.xvel46private alias object.yvel : player.yvel47private alias object.speed : player.speed48private alias object.gravity : player.gravity49private alias object.animationSpeed : player.animationSpeed50private alias object.animation : player.animation51private alias object.interaction : player.interaction52private alias object.scrollTracking : player.scrollTracking53private alias object.tileCollisions : player.tileCollisions5455private alias object.value5 : player.rollAnimationSpeed56private alias object.value7 : player.invincibleTimer575859// ========================60// Function Declarations61// ========================6263reserve function Transporter_HandleNewNode646566// ========================67// Tables68// ========================6970private table Transporter_tableSizes716, 2, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 672end table7374private table Transporter_frameTable751, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 076end table7778private table Transporter_tablePtrs[13]7980private table Transporter_movementTable0810x7A80000, 0x2700000, 0x7500000, 0x2700000, 0x7400000, 0x2800000, 0x7400000, 0x3E00000, 0x7500000, 0x3F00000, 0x7A80000, 0x3F0000082end table8384private table Transporter_movementTable1850xC580000, 0x5F00000, 0xE280000, 0x5F0000086end table8788private table Transporter_movementTable2890x18280000, 0x6B00000, 0x17D00000, 0x6B00000, 0x17C00000, 0x6C00000, 0x17C00000, 0x7E00000, 0x17B00000, 0x7F00000, 0x17580000, 0x7F0000090end table9192private table Transporter_movementTable3930x5D80000, 0x3700000, 0x7800000, 0x370000094end table9596private table Transporter_movementTable4970x5D80000, 0x5F00000, 0x7000000, 0x5F0000098end table99100private table Transporter_movementTable51010xBD80000, 0x1F00000, 0xC300000, 0x1F00000, 0xC400000, 0x1E00000, 0xC400000, 0xC00000, 0xC500000, 0xB00000, 0xCA80000, 0xB00000102end table103104private table Transporter_movementTable61050x17280000, 0x3300000, 0x15D00000, 0x3300000, 0x15C00000, 0x3200000, 0x15C00000, 0x2400000, 0x15D00000, 0x2300000, 0x16280000, 0x2300000106end table107108private table Transporter_movementTable71090x6D80000, 0x1F00000, 0x7300000, 0x1F00000, 0x7400000, 0x1E00000, 0x7400000, 0x1000000, 0x7500000, 0xF00000, 0x7A80000, 0xF00000110end table111112private table Transporter_movementTable81130x7D80000, 0x3300000, 0x8280000, 0x3300000, 0x8400000, 0x3400000, 0x8400000, 0x4580000, 0x8280000, 0x4700000, 0x7D80000, 0x4700000114end table115116private table Transporter_movementTable91170xFD80000, 0x3B00000, 0x10280000, 0x3B00000, 0x10400000, 0x3980000, 0x10400000, 0x2C40000, 0x10580000, 0x2B00000, 0x10A80000, 0x2B00000118end table119120private table Transporter_movementTable101210xFD80000, 0x4B00000, 0x10280000, 0x4B00000, 0x10400000, 0x4C00000, 0x10400000, 0x5D80000, 0x10580000, 0x5F00000, 0x10A80000, 0x5F00000122end table123124private table Transporter_movementTable111250x20580000, 0x4300000, 0x20A80000, 0x4300000, 0x20C00000, 0x4180000, 0x20C00000, 0x2C00000, 0x20D00000, 0x2B00000, 0x21280000, 0x2B00000126end table127128private table Transporter_movementTable121290x23280000, 0x5B00000, 0x22D00000, 0x5B00000, 0x22C00000, 0x5A00000, 0x22C00000, 0x4C00000, 0x22D00000, 0x4B00000, 0x23280000, 0x4B00000130end table131132133// ========================134// Function Definitions135// ========================136137private function Transporter_HandleNewNode138temp0 = object.nodePos.x139temp2 = 0x1000140temp0 -= player[currentPlayer].xpos141if temp0 < 0142FlipSign(temp0)143FlipSign(temp2)144end if145temp0 >>= 16146147temp1 = object.nodePos.y148temp3 = 0x1000149temp1 -= player[currentPlayer].ypos150if temp1 < 0151FlipSign(temp1)152FlipSign(temp3)153end if154temp1 >>= 16155156if temp1 >= temp0157temp1 = object.nodePos.y158temp1 -= player[currentPlayer].ypos159temp1 &= 0xFFFF0000160temp1 /= temp3161temp0 = object.nodePos.x162temp0 -= player[currentPlayer].xpos163if temp0 != 0164temp0 &= 0xFFFF0000165#platform: USE_STANDALONE166temp0 /= temp1167#endplatform168#platform: USE_ORIGINS169if temp1 != 0170temp0 /= temp1171end if172#endplatform173end if174temp0 <<= 8175temp3 <<= 8176temp1 >>= 8177player[currentPlayer].xvel = temp0178player[currentPlayer].yvel = temp3179Abs(temp1)180object.nodeChangeDelay = temp1181else182temp0 = object.nodePos.x183temp0 -= player[currentPlayer].xpos184temp0 &= 0xFFFF0000185temp0 /= temp2186temp1 = object.nodePos.y187temp1 -= player[currentPlayer].ypos188if temp1 != 0189temp1 &= 0xFFFF0000190#platform: USE_STANDALONE191temp1 /= temp0192#endplatform193#platform: USE_ORIGINS194if temp0 != 0195temp1 /= temp0196end if197#endplatform198end if199temp1 <<= 8200temp2 <<= 8201temp0 >>= 8202player[currentPlayer].xvel = temp2203player[currentPlayer].yvel = temp1204Abs(temp0)205object.nodeChangeDelay = temp0206end if207end function208209210// ========================211// Events212// ========================213214event ObjectUpdate215switch object.state216case TRANSPORTER_WAITING217foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)218#platform: USE_ORIGINS219temp3 = 1220temp3 <<= currentPlayer221temp4 = temp3222temp4 &= object.activePlayers223if temp4 == false224#endplatform225if player[currentPlayer].state != Player_State_Static226temp0 = player[currentPlayer].xpos227temp0 -= object.xpos228temp0 += 0x30000229if object.direction == FLIP_X230temp0 += 0xA0000231end if232233if temp0 >= 0234if temp0 < 0x100000235temp1 = player[currentPlayer].ypos236temp1 -= object.ypos237temp1 += 0x200000238if temp1 >= 0239if temp1 < 0x400000240temp0 = object.propertyValue241temp0 &= 15242CreateTempObject(TypeName[Transporter], object.propertyValue, object.xpos, object.ypos)243GetTableValue(object[tempObjectPos].tablePtr, temp0, Transporter_tablePtrs)244GetTableValue(object[tempObjectPos].tableSize, temp0, Transporter_tableSizes)245GetTableValue(temp1, 0, object[tempObjectPos].tablePtr)246GetTableValue(temp2, 2, object[tempObjectPos].tablePtr)247if temp2 > temp1248object[tempObjectPos].direction = FLIP_X249end if250object[tempObjectPos].state = TRANSPORTER_ACTIVATING251object[tempObjectPos].playerID = currentPlayer252253player[currentPlayer].state = Player_State_Static254player[currentPlayer].interaction = false255player[currentPlayer].tileCollisions = false256player[currentPlayer].animation = ANI_JUMPING257player[currentPlayer].rollAnimationSpeed = 0258player[currentPlayer].animationSpeed = 0259player[currentPlayer].xvel = 0260player[currentPlayer].yvel = 0261player[currentPlayer].gravity = 1262player[currentPlayer].scrollTracking = true263player[currentPlayer].xpos = object.xpos264player[currentPlayer].ypos = object.ypos265PlaySfx(SfxName[Rolling], false)266267#platform: USE_ORIGINS268object.activePlayers |= temp3269object[tempObjectPos].parent = object.entityPos270#endplatform271end if272end if273end if274end if275end if276#platform: USE_ORIGINS277end if278#endplatform279next280break281282case TRANSPORTER_ACTIVATING283currentPlayer = object.playerID284Sin256(player[currentPlayer].ypos, object.angle)285object.angle += 2286287player[currentPlayer].ypos <<= 11288FlipSign(player[currentPlayer].ypos)289player[currentPlayer].ypos += object.ypos290if player[currentPlayer].invincibleTimer < 2291player[currentPlayer].invincibleTimer = 2292end if293294if object.angle == 0x80295temp0 = object.tablePos296temp0 <<= 1297GetTableValue(object.nodePos.x, temp0, object.tablePtr)298temp0++299GetTableValue(object.nodePos.y, temp0, object.tablePtr)300CallFunction(Transporter_HandleNewNode)301object.state++302object.frame = 0303PlaySfx(SfxName[Release], false)304end if305break306307case TRANSPORTER_TRANSPORTING308currentPlayer = object.playerID309object.nodeChangeDelay--310if object.nodeChangeDelay < 0311player[currentPlayer].xpos = object.nodePos.x312player[currentPlayer].ypos = object.nodePos.y313object.tablePos++314if object.tablePos >= object.tableSize315object.type = TypeName[Blank Object]316317#platform: USE_ORIGINS318temp1 = 1319temp1 <<= currentPlayer320arrayPos0 = object.parent321object[arrayPos0].activePlayers ^= temp1322#endplatform323324player[currentPlayer].ypos &= 0x7FF0000325player[currentPlayer].interaction = true326player[currentPlayer].tileCollisions = true327328GetBit(temp1, object.propertyValue, 4)329if temp1 == false330player[currentPlayer].xvel = 0331player[currentPlayer].yvel = 0x20000332player[currentPlayer].speed = 0333player[currentPlayer].animation = ANI_WALKING334#platform: USE_STANDALONE335player[currentPlayer].state = Player_State_Air336#endplatform337#platform: USE_ORIGINS338player[currentPlayer].state = Player_State_Air_NoDropDash339#endplatform340else341player[currentPlayer].xvel = 0x100000342player[currentPlayer].speed = 0x100000343player[currentPlayer].state = Player_State_Ground344end if345else346temp0 = object.tablePos347temp0 <<= 1348GetTableValue(object.nodePos.x, temp0, object.tablePtr)349temp0++350GetTableValue(object.nodePos.y, temp0, object.tablePtr)351CallFunction(Transporter_HandleNewNode)352end if353end if354break355356end switch357358if object.state >= TRANSPORTER_ACTIVATING359temp0 = object.animationTimer360temp0 >>= 1361GetTableValue(object.frame, temp0, Transporter_frameTable)362object.animationTimer++363if object.animationTimer == 30364object.animationTimer = 26365end if366end if367end event368369370event ObjectDraw371DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)372end event373374375event ObjectStartup376LoadSpriteSheet("MPZ/Objects.gif")377SpriteFrame(0, 0, 1, 1, 1, 1)378SpriteFrame(-8, -24, 28, 40, 0, 29)379380SetTableValue(Transporter_movementTable0, TRANSPORTER_TYPE_LDR, Transporter_tablePtrs)381SetTableValue(Transporter_movementTable1, TRANSPORTER_TYPE_R, Transporter_tablePtrs)382SetTableValue(Transporter_movementTable2, TRANSPORTER_TYPE_LDR_2, Transporter_tablePtrs)383SetTableValue(Transporter_movementTable3, TRANSPORTER_TYPE_3, Transporter_tablePtrs)384SetTableValue(Transporter_movementTable4, TRANSPORTER_TYPE_4, Transporter_tablePtrs)385SetTableValue(Transporter_movementTable5, TRANSPORTER_TYPE_RUL, Transporter_tablePtrs)386SetTableValue(Transporter_movementTable6, TRANSPORTER_TYPE_LUR, Transporter_tablePtrs)387SetTableValue(Transporter_movementTable7, TRANSPORTER_TYPE_RUL_1, Transporter_tablePtrs)388SetTableValue(Transporter_movementTable8, TRANSPORTER_TYPE_RDL, Transporter_tablePtrs)389SetTableValue(Transporter_movementTable9, TRANSPORTER_TYPE_9, Transporter_tablePtrs)390SetTableValue(Transporter_movementTable10, TRANSPORTER_TYPE_R0, Transporter_tablePtrs)391SetTableValue(Transporter_movementTable11, TRANSPORTER_TYPE_LUR_2, Transporter_tablePtrs)392SetTableValue(Transporter_movementTable12, TRANSPORTER_TYPE_RUL_2, Transporter_tablePtrs)393end event394395396// ========================397// Editor Events398// ========================399400event RSDKEdit401if editor.returnVariable == true402switch editor.variableID403case EDIT_VAR_PROPVAL // property value404checkResult = object.propertyValue405break406407case 0 // type408checkResult = object.propertyValue409checkResult &= 15410break411412case 1 // exitType413GetBit(checkResult, object.propertyValue, 4)414break415416end switch417else418switch editor.variableID419case EDIT_VAR_PROPVAL // property value420object.propertyValue = editor.variableValue421break422423case 0 // type424object.propertyValue &= 240425editor.variableValue &= 15426427object.propertyValue |= editor.variableValue428break429430case 1 // exitType431CheckNotEqual(editor.variableValue, false)432SetBit(object.propertyValue, 4, checkResult)433break434435end switch436end if437end event438439440event RSDKDraw441DrawSprite(0)442end event443444445event RSDKLoad446LoadSpriteSheet("Global/Display.gif")447SpriteFrame(-8, -8, 16, 16, 168, 18) // "trigger" - #0448449AddEditorVariable("type")450SetActiveVariable("type")451AddEnumVariable("Left, Down, Right", TRANSPORTER_TYPE_LDR)452AddEnumVariable("Right", TRANSPORTER_TYPE_R)453AddEnumVariable("Left, Down, Right (Alt)", TRANSPORTER_TYPE_LDR_2)454AddEnumVariable("Type 3", TRANSPORTER_TYPE_3)455AddEnumVariable("Type 4", TRANSPORTER_TYPE_4)456AddEnumVariable("Right, Up, Left", TRANSPORTER_TYPE_RUL)457AddEnumVariable("Left (Long), Up, Right", TRANSPORTER_TYPE_LUR)458AddEnumVariable("Right, Up, Left (Alt 1)", TRANSPORTER_TYPE_RUL_1)459AddEnumVariable("Right, Down, Left", TRANSPORTER_TYPE_RDL)460AddEnumVariable("Type9", TRANSPORTER_TYPE_9)461AddEnumVariable("Type10", TRANSPORTER_TYPE_R0)462AddEnumVariable("Left, Up, Right", TRANSPORTER_TYPE_LUR_2)463AddEnumVariable("Right, Up, Left (Alt 2)", TRANSPORTER_TYPE_RUL_2)464465AddEditorVariable("exitType")466SetActiveVariable("exitType")467AddEnumVariable("Transporter Exit", 0)468AddEnumVariable("Shoot Out From Exit", 1)469end event470471472