Path: blob/master/Sonic 2/Scripts/HPZ/RailRocket.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Rail Rocket 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.startPos.x13private alias object.value2 : object.startPos.y14private alias object.value3 : object.handlePos.x15private alias object.value4 : object.handlePos.y16private alias object.value5 : object.handleAngle17private alias object.value6 : object.chainPos.x18private alias object.value7 : object.chainPos.y19private alias object.value8 : object.grabDelay20private alias object.value9 : object.targetPos.y21private alias object.value10 : object.hasPlayer22private alias object.value11 : object.rocketDir23private alias object.value12 : object.handleAngleVel24private alias object.value13 : object.flameAnimTimer2526// States27private alias 0 : RAILROCKET_AWAITPLAYER28private alias 1 : RAILROCKET_MOVETOTARGET29private alias 2 : RAILROCKET_REACHEDTARGET30private alias 3 : RAILROCKET_RETURNTOSTART31private alias 4 : RAILROCKET_FINISHED3233// Player Aliases34private alias object.state : player.state35private alias object.xpos : player.xpos36private alias object.ypos : player.ypos37private alias object.xvel : player.xvel38private alias object.yvel : player.yvel39private alias object.speed : player.speed40private alias object.gravity : player.gravity41private alias object.animation : player.animation42private alias object.collisionTop : player.collisionTop43private alias object.jumpPress : player.jumpPress444546// ========================47// Function Declarations48// ========================4950reserve function RailRocket_DebugDraw51reserve function RailRocket_DebugSpawn525354// ========================55// Function Definitions56// ========================5758private function RailRocket_DebugDraw59DrawSprite(object.direction)60end function616263private function RailRocket_DebugSpawn64CreateTempObject(TypeName[Rail Rocket], 0, object.xpos, object.ypos)65object[tempObjectPos].rocketDir = object.direction66end function676869// ========================70// Events71// ========================7273event ObjectUpdate74switch object.state75case RAILROCKET_AWAITPLAYER76if object.handleAngle > 077if object.handleAngleVel > 078object.handleAngleVel -= 1679else80object.handleAngleVel -= 881end if82else83if object.handleAngleVel < 084object.handleAngleVel += 1685else86object.handleAngleVel += 887end if88end if89object.handleAngle += object.handleAngleVel9091if object.hasPlayer == true92object.speed = -0x8000093object.state = RAILROCKET_MOVETOTARGET94PlaySfx(SfxName[Launch], false)95end if96break9798case RAILROCKET_MOVETOTARGET99object.ypos += object.speed100temp0 = object.speed101temp0 >>= 1102if object.rocketDir == FLIP_NONE103object.xpos += temp0104object.handleAngle += 0x20105if object.handleAngle >= 0x200106object.handleAngle = 0x200107end if108else109object.xpos -= temp0110object.handleAngle -= 0x20111if object.handleAngle <= -0x200112object.handleAngle = -0x200113end if114end if115116if object.ypos <= object.targetPos.y117object.speed = 0118object.ypos = object.targetPos.y119if object.rocketDir == FLIP_NONE120object.handleAngleVel = -0x80121else122object.handleAngleVel = 0x80123end if124object.state = RAILROCKET_REACHEDTARGET125end if126127object.frame = object.animationTimer128object.frame >>= 3129temp0 = object.speed130Abs(temp0)131temp0 >>= 16132object.animationTimer += temp0133object.animationTimer &= 15134object.flameAnimTimer++135object.flameAnimTimer &= 3136137if ringTimer == 0138CreateTempObject(TypeName[Dust Puff], 0, object.xpos, object.ypos)139if object.rocketDir == FLIP_NONE140object[tempObjectPos].ixpos += 10141else142object[tempObjectPos].ixpos -= 10143end if144object[tempObjectPos].iypos += 22145end if146break147148case RAILROCKET_REACHEDTARGET149if object.handleAngle > 0150if object.handleAngleVel > 0151object.handleAngleVel -= 16152else153object.handleAngleVel -= 8154end if155else156if object.handleAngleVel < 0157object.handleAngleVel += 16158else159object.handleAngleVel += 8160end if161end if162163object.handleAngle += object.handleAngleVel164object.timer++165if object.timer == 60166object.timer = 0167object.state = RAILROCKET_RETURNTOSTART168end if169170object.flameAnimTimer++171object.flameAnimTimer &= 3172break173174case RAILROCKET_RETURNTOSTART175object.speed += 0x1800176if object.speed > 0x80000177object.speed = 0x80000178end if179object.ypos += object.speed180181temp0 = object.speed182temp0 >>= 1183if object.rocketDir == FLIP_NONE184object.xpos += temp0185object.handleAngle -= 0x20186if object.handleAngle <= -0x200187object.handleAngle = -0x200188end if189else190object.xpos -= temp0191object.handleAngle += 0x20192if object.handleAngle >= 0x200193object.handleAngle = 0x200194end if195end if196197if object.ypos >= object.startPos.y198object.speed = 0199object.xpos = object.startPos.x200object.ypos = object.startPos.y201if object.rocketDir == FLIP_NONE202object.handleAngleVel = 0x80203else204object.handleAngleVel = -0x80205end if206object.state = RAILROCKET_FINISHED207end if208209object.frame = object.animationTimer210object.frame >>= 3211temp0 = object.speed212Abs(temp0)213temp0 >>= 16214object.animationTimer += temp0215object.animationTimer &= 15216break217218case RAILROCKET_FINISHED219if object.handleAngle > 0220if object.handleAngleVel > 0221object.handleAngleVel -= 16222else223object.handleAngleVel -= 8224end if225else226if object.handleAngleVel < 0227object.handleAngleVel += 16228else229object.handleAngleVel += 8230end if231end if232object.handleAngle += object.handleAngleVel233234if object.hasPlayer == false235object.state = RAILROCKET_AWAITPLAYER236end if237break238239end switch240241temp0 = 0242temp4 = object.handleAngle243object.handlePos.x = object.xpos244object.handlePos.y = object.ypos245while temp0 < 8246temp5 = temp4247temp5 >>= 7248temp5 &= 0x1FF249250Sin(temp2, temp5)251temp2 *= 0x312252object.handlePos.x += temp2253254Cos(temp3, temp5)255temp3 *= 0x312256object.handlePos.y += temp3257258temp0++259temp4 += object.handleAngle260loop261262if object.grabDelay > 0263object.grabDelay--264end if265object.hasPlayer = false266267temp0 = object.xpos268temp1 = object.ypos269object.xpos = object.handlePos.x270object.ypos = object.handlePos.y271foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)272if player[currentPlayer].state != Player_State_Static273if object.grabDelay == 0274BoxCollisionTest(C_TOUCH, object.entityPos, -10, 16, 10, 24, currentPlayer, C_BOX, 0, C_BOX, 0)275if checkResult == true276if player[currentPlayer].gravity == GRAVITY_AIR277player[currentPlayer].state = Player_State_Static278player[currentPlayer].animation = ANI_HANGING279player[currentPlayer].speed = 0280player[currentPlayer].xvel = 0281player[currentPlayer].yvel = 0282player[currentPlayer].xpos = object.xpos283player[currentPlayer].ypos = player[currentPlayer].collisionTop284FlipSign(player[currentPlayer].ypos)285player[currentPlayer].ypos += 8286player[currentPlayer].ypos <<= 16287player[currentPlayer].ypos += object.ypos288289PlaySfx(SfxName[Catch], false)290object.hasPlayer = true291end if292end if293end if294else295BoxCollisionTest(C_TOUCH, object.entityPos, -8, -4, 8, 20, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)296if checkResult == true297if player[currentPlayer].jumpPress == true298#platform: USE_STANDALONE299player[currentPlayer].state = Player_State_Air300#endplatform301#platform: USE_ORIGINS302player[currentPlayer].state = Player_State_Air_NoDropDash303#endplatform304player[currentPlayer].yvel = -0x40000305player[currentPlayer].gravity = GRAVITY_AIR306object.grabDelay = 30307else308player[currentPlayer].xpos = object.xpos309player[currentPlayer].ypos = player[currentPlayer].collisionTop310FlipSign(player[currentPlayer].ypos)311player[currentPlayer].ypos += 8312player[currentPlayer].ypos <<= 16313player[currentPlayer].ypos += object.ypos314object.hasPlayer = true315end if316end if317end if318next319320object.xpos = temp0321object.ypos = temp1322end event323324325event ObjectDraw326temp0 = 0327temp4 = object.handleAngle328object.chainPos.x = object.xpos329object.chainPos.y = object.ypos330331// Draw Handle Chain332while temp0 < 7333temp5 = temp4334temp5 >>= 7335temp5 &= 0x1FF336337Sin(temp2, temp5)338temp2 *= 0x312339object.chainPos.x += temp2340341Cos(temp3, temp5)342temp3 *= 0x312343object.chainPos.y += temp3344345DrawSpriteXY(2, object.chainPos.x, object.chainPos.y)346347temp0++348temp4 += object.handleAngle349loop350351// Draw Handle352DrawSpriteXY(3, object.handlePos.x, object.handlePos.y)353354// Draw Flame355switch object.state356default357case RAILROCKET_AWAITPLAYER358case RAILROCKET_RETURNTOSTART359case RAILROCKET_FINISHED360break361362case RAILROCKET_MOVETOTARGET363case RAILROCKET_REACHEDTARGET364object.direction = object.rocketDir365temp0 = object.flameAnimTimer366temp0 >>= 1367temp0 += 4368DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)369break370371end switch372373object.direction = object.rocketDir374object.direction ^= object.frame375DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)376end event377378379event ObjectStartup380LoadSpriteSheet("HPZ/Objects.gif")381SpriteFrame(-20, -27, 40, 54, 66, 168) // rocket body L - #0382SpriteFrame(-20, -27, 40, 54, 140, 57) // rocket body R - #1383SpriteFrame(-3, -3, 6, 6, 198, 50) // handle chain - #2384SpriteFrame(-8, -3, 16, 16, 193, 57) // handle - #3385SpriteFrame(4, 11, 12, 16, 210, 46) // flame (big) - #4386SpriteFrame(5, 11, 8, 12, 184, 57) // flame (small) - #5387388foreach (TypeName[Rail Rocket], arrayPos0, ALL_ENTITIES)389object[arrayPos0].startPos.x = object[arrayPos0].xpos390object[arrayPos0].startPos.y = object[arrayPos0].ypos391object[arrayPos0].rocketDir = object[arrayPos0].propertyValue392object[arrayPos0].rocketDir >>= 7393temp0 = object[arrayPos0].propertyValue394temp0 &= 0x7F395if temp0 == 0396object[arrayPos0].targetPos.y = object[arrayPos0].ypos397object[arrayPos0].targetPos.y -= 0x1000000398else399temp0 <<= 21400object[arrayPos0].targetPos.y = object[arrayPos0].ypos401object[arrayPos0].targetPos.y -= temp0402end if403next404405SetTableValue(TypeName[Rail Rocket], DebugMode_ObjCount, DebugMode_TypesTable)406SetTableValue(RailRocket_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)407SetTableValue(RailRocket_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)408DebugMode_ObjCount++409end event410411412// ========================413// Editor Events414// ========================415416event RSDKEdit417if editor.returnVariable == true418switch editor.variableID419case EDIT_VAR_PROPVAL // property value420checkResult = object.propertyValue421break422423case 0 // direction424GetBit(checkResult, object.propertyValue, 7)425break426427case 1 // distance428checkResult = object.propertyValue429checkResult &= 0x7F430break431432end switch433else434switch editor.variableID435case EDIT_VAR_PROPVAL // property value436object.propertyValue = editor.variableValue437break438439case 0 // direction440CheckNotEqual(editor.variableValue, false)441SetBit(object.propertyValue, 7, checkResult)442break443444case 1 // distance445object.propertyValue &= 0x80446editor.variableValue &= 0x7F447448object.propertyValue |= editor.variableValue449break450451end switch452end if453end event454455456event RSDKDraw457GetBit(object.rocketDir, object.propertyValue, 7)458459temp0 = 0460temp4 = object.handleAngle461object.handlePos.x = object.xpos462object.handlePos.y = object.ypos463while temp0 < 8464temp5 = temp4465temp5 >>= 7466temp5 &= 0x1FF467468Sin(temp2, temp5)469temp2 *= 0x312470object.handlePos.x += temp2471472Cos(temp3, temp5)473temp3 *= 0x312474object.handlePos.y += temp3475476temp0++477temp4 += object.handleAngle478loop479480temp0 = 0481temp4 = object.handleAngle482object.chainPos.x = object.xpos483object.chainPos.y = object.ypos484485// Draw Handle Chain486while temp0 < 7487temp5 = temp4488temp5 >>= 7489temp5 &= 0x1FF490491Sin(temp2, temp5)492temp2 *= 0x312493object.chainPos.x += temp2494495Cos(temp3, temp5)496temp3 *= 0x312497object.chainPos.y += temp3498499DrawSpriteXY(2, object.chainPos.x, object.chainPos.y)500501temp0++502temp4 += object.handleAngle503loop504505// Draw Handle506DrawSpriteXY(3, object.handlePos.x, object.handlePos.y)507508object.direction = object.rocketDir509DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)510511if editor.showGizmos == true512// Draw arrow of where and how far the rocket will go513514temp0 = object.propertyValue515temp0 &= 0x7F516if temp0 == 0517object.targetPos.y = object.ypos518object.targetPos.y -= 0x1000000519else520temp0 <<= 21521object.targetPos.y = object.ypos522object.targetPos.y -= temp0523end if524525temp0 = object.xpos526temp1 = object.ypos527temp2 = -0x80000528temp2 >>= 1529530while temp1 > object.targetPos.y531temp1 += -0x80000532if object.rocketDir == 0533temp0 += temp2534else535temp0 -= temp2536end if537loop538539DrawArrow(object.xpos, object.ypos, temp0, temp1, 0x00, 0xFF, 0x00)540end if541end event542543544event RSDKLoad545LoadSpriteSheet("HPZ/Objects.gif")546SpriteFrame(-20, -27, 40, 54, 66, 168) // rocket body L - #0547SpriteFrame(-20, -27, 40, 54, 140, 57) // rocket body R - #1548SpriteFrame(-3, -3, 6, 6, 198, 50) // handle chain - #2549SpriteFrame(-8, -3, 16, 16, 193, 57) // handle - #3550SpriteFrame(4, 11, 12, 16, 210, 46) // flame (big) - #4551SpriteFrame(5, 11, 8, 12, 184, 57) // flame (small) - #5552553AddEditorVariable("direction")554SetActiveVariable("direction")555AddEnumVariable("Left", 0)556AddEnumVariable("Right", 1)557558AddEditorVariable("distance")559SetActiveVariable("distance")560end event561562563