Path: blob/master/Sonic 2/Scripts/CNZ/HexBumper.txt
1484 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Hex Bumper 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.offset.x13private alias object.value2 : object.offset.y14private alias object.value3 : object.boundsL15private alias object.value4 : object.boundsR16private alias object.value5 : object.playerTimers1718// States19private alias 0 : HEXBUMPER_IDLE20private alias 1 : HEXBUMPER_BUMPED2122// Player Aliases23private alias object.state : player.state24private alias object.xpos : player.xpos25private alias object.ypos : player.ypos26private alias object.xvel : player.xvel27private alias object.yvel : player.yvel28private alias object.speed : player.speed29private alias object.gravity : player.gravity30private alias object.animation : player.animation31private alias object.tileCollisions : player.tileCollisions3233private alias object.value1 : player.timer34private alias object.value36 : player.flyCarryTimer // Tails assist lockout timer35private alias object.value40 : player.hitboxLeft36private alias object.value38 : player.hitboxTop37private alias object.value41 : player.hitboxRight38private alias object.value39 : player.hitboxBottom394041// ========================42// Function Declarations43// ========================4445reserve function HexBumper_DebugDraw46reserve function HexBumper_DebugSpawn474849// ========================50// Function Definitions51// ========================5253private function HexBumper_DebugDraw54DrawSprite(0)55end function565758private function HexBumper_DebugSpawn59CreateTempObject(TypeName[Hex Bumper], 0, object.xpos, object.ypos)60object[tempObjectPos].drawOrder = 461end function626364// ========================65// Events66// ========================6768event ObjectUpdate69if object.state > HEXBUMPER_IDLE70object.frame = object.timer71object.frame /= 572object.frame++7374object.timer++75if object.timer > 1576object.timer = 077object.state = HEXBUMPER_IDLE78object.frame = 079end if80end if8182if object.outOfBounds == true83object.priority = PRIORITY_BOUNDS84end if8586if object.xvel != 087object.xpos += object.xvel88if object.xvel > 089if object.xpos >= object.boundsR90object.xpos = object.boundsR91FlipSign(object.xvel)92end if93else94if object.xpos <= object.boundsL95object.xpos = object.boundsL96FlipSign(object.xvel)97end if98end if99end if100101temp7 = 0102foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)103temp6 = object.playerTimers104temp6 >>= temp7105temp6 &= 0xFF106if temp6 == 0107if player[currentPlayer].animation != ANI_HURT108BoxCollisionTest(C_TOUCH, object.entityPos, -12, -8, 12, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)109if checkResult == true110if object.state == HEXBUMPER_IDLE111PlaySfx(SfxName[Bumper], false)112end if113114if object.timer > 5115PlaySfx(SfxName[Bumper], false)116end if117118object.state = HEXBUMPER_BUMPED119object.priority = PRIORITY_ACTIVE120121temp0 = player[currentPlayer].xpos122temp0 -= object.xpos123temp1 = player[currentPlayer].ypos124temp1 -= object.ypos125ATan2(temp2, temp0, temp1)126temp2 += 32127temp2 &= 255128temp2 >>= 6129switch temp2130case 0131temp0 = 0x80000132temp1 = player[currentPlayer].yvel133object.offset.x = -0x40000134object.offset.y = 0135break136137case 1138if player[currentPlayer].xpos < object.xpos139temp0 = -0x20000140else141temp0 = 0x20000142end if143temp1 = 0x80000144object.offset.x = 0145object.offset.y = -0x40000146break147148case 2149temp0 = -0x80000150temp1 = player[currentPlayer].yvel151object.offset.x = 0x40000152object.offset.y = 0153break154155case 3156if player[currentPlayer].xpos < object.xpos157temp0 = -0x20000158else159temp0 = 0x20000160end if161temp1 = -0x80000162object.offset.x = 0163object.offset.y = 0x40000164break165166end switch167168if player[currentPlayer].state == Player_State_Carried169player[1].flyCarryTimer = 30170end if171172CheckEqual(player[currentPlayer].animation, ANI_GLIDING)173temp2 = checkResult174CheckEqual(player[currentPlayer].animation, ANI_GLIDING_STOP)175temp2 |= checkResult176CheckEqual(player[currentPlayer].animation, ANI_FLYING)177temp2 |= checkResult178CheckEqual(player[currentPlayer].state, Player_State_TubeRoll)179temp2 |= checkResult180CheckEqual(player[currentPlayer].state, Player_State_TubeAirRoll)181temp2 |= checkResult182if temp2 == false183#platform: USE_STANDALONE184player[currentPlayer].state = Player_State_Air185#endplatform186#platform: USE_ORIGINS187player[currentPlayer].state = Player_State_Air_NoDropDash188#endplatform189// Bug Details:190// This code wasn't updated in Origins Plus to include ANI_HAMMER_JUMP, so191// Amy will always start walking if she hits a Bumper with her hammer out192if player[currentPlayer].animation != ANI_JUMPING193if player[currentPlayer].animation != ANI_RUNNING194player[currentPlayer].animation = ANI_WALKING195end if196end if197end if198199if player[currentPlayer].animation != ANI_GLIDING200player[currentPlayer].xvel += temp0201player[currentPlayer].speed = player[currentPlayer].xvel202player[currentPlayer].timer = 0203end if204205player[currentPlayer].yvel = temp1206player[currentPlayer].gravity = GRAVITY_AIR207player[currentPlayer].tileCollisions = true208temp6 = 3209temp6 <<= temp7210object.playerTimers |= temp6211end if212end if213else214temp5 = 1215temp5 <<= temp7216object.playerTimers -= temp5217end if218219temp7 += 8220next221end event222223224event ObjectDraw225temp0 = object.frame226temp0 &= 1227if temp0 == 0228DrawSprite(0)229else230temp1 = object.xpos231temp1 += object.offset.x232temp2 = object.ypos233temp2 += object.offset.y234DrawSpriteXY(0, temp1, temp2)235end if236end event237238239event ObjectStartup240CheckCurrentStageFolder("Zone04")241if checkResult == true242LoadSpriteSheet("CNZ/Objects.gif")243SpriteFrame(-24, -16, 48, 32, 99, 99)244else245LoadSpriteSheet("MBZ/Objects.gif")246SpriteFrame(-24, -16, 48, 32, 581, 343)247end if248249foreach (TypeName[Hex Bumper], arrayPos0, ALL_ENTITIES)250object[arrayPos0].drawOrder = 4251if object[arrayPos0].propertyValue == 1252object[arrayPos0].xvel = 0x10000253object[arrayPos0].boundsL = object[arrayPos0].xpos254object[arrayPos0].boundsL -= 0x600000255object[arrayPos0].boundsR = object[arrayPos0].xpos256object[arrayPos0].boundsR += 0x600000257end if258next259260SetTableValue(TypeName[Hex Bumper], DebugMode_ObjCount, DebugMode_TypesTable)261SetTableValue(HexBumper_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)262SetTableValue(HexBumper_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)263DebugMode_ObjCount++264end event265266267// ========================268// Editor Events269// ========================270271event RSDKEdit272if editor.returnVariable == true273switch editor.variableID274case EDIT_VAR_PROPVAL // property value275checkResult = object.propertyValue276break277278case 0 // moveType279checkResult = object.propertyValue280break281282end switch283else284switch editor.variableID285case EDIT_VAR_PROPVAL // property value286object.propertyValue = editor.variableValue287break288289case 0 // moveType290object.propertyValue = editor.variableValue291break292293end switch294end if295end event296297298event RSDKDraw299DrawSprite(0)300end event301302303event RSDKLoad304CheckCurrentStageFolder("Zone04")305if checkResult == true306LoadSpriteSheet("CNZ/Objects.gif")307SpriteFrame(-24, -16, 48, 32, 99, 99)308else309LoadSpriteSheet("MBZ/Objects.gif")310SpriteFrame(-24, -16, 48, 32, 581, 343)311end if312313AddEditorVariable("moveType")314SetActiveVariable("moveType")315AddEnumVariable("Static", 0)316AddEnumVariable("Moving", 1)317end event318319320