Path: blob/master/Sonic 2/Scripts/CNZ/Elevator.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Elevator Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value1 : object.startPos.y12private alias object.value2 : object.targetVelDest.y13private alias object.value3 : object.targetVelStart.y14private alias object.value4 : object.targetPos.y15private alias object.value5 : object.collisionOffset.y16private alias object.value6 : object.stood17private alias object.value7 : object.canReset1819// States20private alias 0 : ELEVATOR_READY21private alias 1 : ELEVATOR_MOVETOTARGET22private alias 2 : ELEVATOR_REACHEDTARGET23private alias 3 : ELEVATOR_RETURNTOSTART24private alias 4 : ELEVATOR_WAITFORFINISH2526// Player Aliases27private alias object.ypos : player.ypos28private alias object.collisionPlane : player.collisionPlane293031// ========================32// Function Declarations33// ========================3435reserve function Elevator_DebugDraw36reserve function Elevator_DebugSpawn373839// ========================40// Function Definitions41// ========================4243private function Elevator_DebugDraw44DrawSprite(0)45end function464748private function Elevator_DebugSpawn49CreateTempObject(TypeName[Elevator], 0, object.xpos, object.ypos)50object[tempObjectPos].startPos.y = object.ypos51object[tempObjectPos].targetVelDest.y -= 0x20000052object[tempObjectPos].targetPos.y -= 0x40000053end function545556// ========================57// Events58// ========================5960event ObjectUpdate61temp6 = object.ypos62switch object.state63case ELEVATOR_READY64if object.stood == true65object.state = ELEVATOR_MOVETOTARGET66if object.priority != PRIORITY_XBOUNDS_DESTROY67object.priority = PRIORITY_ACTIVE68end if69PlaySfx(SfxName[Elevator], false)70else71foreach (TypeName[Elevator], arrayPos0, ACTIVE_ENTITIES)72if object.entityPos != arrayPos073if object[arrayPos0].state == ELEVATOR_MOVETOTARGET74BoxCollisionTest(C_TOUCH, object.entityPos, -16, -8, 16, 8, arrayPos0, -16, -56, 16, 8)75if checkResult == true76object.state = ELEVATOR_WAITFORFINISH77object.canReset = false78end if79end if80end if81next82end if83break8485case ELEVATOR_MOVETOTARGET86if object.ypos >= object.targetVelDest.y87object.yvel -= 0x80088else89object.yvel += 0x80090end if91object.ypos += object.yvel9293if object.propertyValue == 094if object.ypos <= object.targetPos.y95object.ypos = object.targetPos.y96object.yvel = 097object.state = ELEVATOR_REACHEDTARGET98end if99else100if object.ypos >= object.targetPos.y101object.ypos = object.targetPos.y102object.yvel = 0103object.state = ELEVATOR_REACHEDTARGET104end if105end if106break107108case ELEVATOR_REACHEDTARGET109if object.stood == false110PlaySfx(SfxName[Elevator], false)111object.state = ELEVATOR_RETURNTOSTART112end if113break114115case ELEVATOR_RETURNTOSTART116if object.ypos >= object.targetVelStart.y117object.yvel -= 0x800118else119object.yvel += 0x800120end if121object.ypos += object.yvel122123if object.propertyValue == 0124if object.ypos >= object.startPos.y125object.ypos = object.startPos.y126object.yvel = 0127object.state = ELEVATOR_READY128end if129else130if object.ypos <= object.startPos.y131object.ypos = object.startPos.y132object.yvel = 0133object.state = ELEVATOR_READY134end if135end if136break137138case ELEVATOR_WAITFORFINISH139if object.canReset == true140object.state = ELEVATOR_READY141end if142object.canReset = true143break144145end switch146147object.stood = false148temp0 = object.ypos149temp6 &= 0xFFFF0000150object.collisionOffset.y = object.ypos151object.collisionOffset.y &= 0xFFFF0000152object.collisionOffset.y -= temp6153154object.ypos = temp6155foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)156switch object.state157case ELEVATOR_READY158case ELEVATOR_MOVETOTARGET159case ELEVATOR_REACHEDTARGET160BoxCollisionTest(C_TOUCH, object.entityPos, -48, -64, 48, 8, currentPlayer, 0, C_BOX, 0, C_BOX)161if checkResult == true162player[currentPlayer].collisionPlane = 0163end if164165BoxCollisionTest(C_TOUCH, object.entityPos, -20, -32, 20, 8, currentPlayer, 0, C_BOX, 0, C_BOX)166if checkResult == true167player[currentPlayer].collisionPlane = 1168end if169170BoxCollisionTest(C_PLATFORM, object.entityPos, -16, -8, 16, 8, currentPlayer, 0, C_BOX, 0, C_BOX)171if checkResult == true172player[currentPlayer].ypos += object.collisionOffset.y173player[currentPlayer].collisionPlane = 1174object.stood = true175end if176break177178case ELEVATOR_RETURNTOSTART179BoxCollisionTest(C_TOUCH, object.entityPos, -48, -64, 48, 8, currentPlayer, 0, C_BOX, 0, C_BOX)180if checkResult == true181player[currentPlayer].collisionPlane = 0182end if183// [Fallthrough]184case ELEVATOR_WAITFORFINISH185BoxCollisionTest(C_TOUCH, object.entityPos, -20, -32, 20, 8, currentPlayer, 0, C_BOX, 0, C_BOX)186if checkResult == true187object.canReset = false188end if189break190end switch191next192193object.ypos = temp0194if object.outOfBounds == true195temp0 = object.ypos196object.ypos = object.startPos.y197if object.outOfBounds == true198object.state = ELEVATOR_READY199if object.priority != PRIORITY_XBOUNDS_DESTROY200object.priority = PRIORITY_BOUNDS201end if202object.stood = 0203object.yvel = 0204else205object.ypos = temp0206end if207end if208end event209210211event ObjectDraw212DrawSprite(0)213end event214215216event ObjectStartup217LoadSpriteSheet("CNZ/Objects.gif")218SpriteFrame(-16, -8, 32, 16, 193, 34)219220foreach (TypeName[Elevator], arrayPos0, ALL_ENTITIES)221object[arrayPos0].startPos.y = object[arrayPos0].ypos222object[arrayPos0].targetVelDest.y = object[arrayPos0].ypos223object[arrayPos0].targetVelStart.y = object[arrayPos0].ypos224object[arrayPos0].targetPos.y = object[arrayPos0].ypos225226temp0 = object[arrayPos0].propertyValue227temp0 &= 0x7F228temp0 <<= 18229230object[arrayPos0].propertyValue >>= 7231if object[arrayPos0].propertyValue == 1232object[arrayPos0].ypos -= temp0233object[arrayPos0].startPos.y -= temp0234object[arrayPos0].targetPos.y += temp0235object[arrayPos0].targetVelDest.y += 0x20000236object[arrayPos0].targetVelStart.y -= 0x20000237else238object[arrayPos0].ypos += temp0239object[arrayPos0].startPos.y += temp0240object[arrayPos0].targetPos.y -= temp0241end if242next243244SetTableValue(TypeName[Elevator], DebugMode_ObjCount, DebugMode_TypesTable)245SetTableValue(Elevator_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)246SetTableValue(Elevator_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)247DebugMode_ObjCount++248end event249250251// ========================252// Editor Events253// ========================254255event RSDKEdit256if editor.returnVariable == true257switch editor.variableID258case EDIT_VAR_PROPVAL // property value259checkResult = object.propertyValue260break261262case 0 // distance263checkResult = object.propertyValue264checkResult &= 0x7F265break266267case 1 // direction268GetBit(checkResult, object.propertyValue, 7)269break270271end switch272else273switch editor.variableID274case EDIT_VAR_PROPVAL // property value275object.propertyValue = editor.variableValue276break277278case 0 // distance279editor.variableValue &= 0x7F280object.propertyValue &= 0x80281282object.propertyValue |= editor.variableValue283break284285case 1 // direction286CheckNotEqual(editor.variableValue, false)287SetBit(object.propertyValue, 7, checkResult)288break289290end switch291end if292end event293294295event RSDKDraw296DrawSprite(0)297298if editor.showGizmos == true299editor.drawingOverlay = true300301object.startPos.y = object.ypos302object.targetPos.y = object.ypos303304temp0 = object.propertyValue305temp0 &= 0x7F306temp0 <<= 18307308GetBit(checkResult, object.propertyValue, 7)309if checkResult == true310object.startPos.y -= temp0311object.targetPos.y += temp0312else313object.startPos.y += temp0314object.targetPos.y -= temp0315end if316317object.inkEffect = INK_BLEND318319DrawSpriteFX(0, FX_INK, object.xpos, object.startPos.y)320DrawSpriteFX(0, FX_INK, object.xpos, object.targetPos.y)321322object.inkEffect = INK_NONE323324DrawArrow(object.xpos, object.startPos.y, object.xpos, object.targetPos.y, 0x00, 0xFF, 0x00)325326editor.drawingOverlay = false327end if328end event329330331event RSDKLoad332LoadSpriteSheet("CNZ/Objects.gif")333SpriteFrame(-16, -8, 32, 16, 193, 34)334335AddEditorVariable("distance")336SetActiveVariable("distance")337338AddEditorVariable("direction")339SetActiveVariable("direction")340AddEnumVariable("Up", 0)341AddEnumVariable("Down", 1)342end event343344345