Path: blob/master/Sonic 2/Scripts/MPZ/Cylinder.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Cylinder Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value1 : object.activePlayers12private alias object.value2 : object.player1.angle13private alias object.value3 : object.player2.angle14private alias object.value4 : object.player3.angle15private alias object.value5 : object.player4.angle16private alias object.value6 : object.player1.direction17private alias object.value7 : object.player2.direction18private alias object.value8 : object.player3.direction19private alias object.value9 : object.player4.direction20private alias object.value10 : object.hitbox.left21private alias object.value11 : object.hitbox.right22private alias object.value12 : object.size2324// Player Aliases25private alias object.state : player.state26private alias object.xpos : player.xpos27private alias object.ypos : player.ypos28private alias object.xvel : player.xvel29private alias object.yvel : player.yvel30private alias object.rotation : player.rotation31private alias object.angle : player.angle32private alias object.direction : player.direction33private alias object.gravity : player.gravity34private alias object.frame : player.frame35private alias object.prevAnimation : player.prevAnimation36private alias object.animationSpeed : player.animationSpeed37private alias object.animation : player.animation38private alias object.collisionTop : player.collisionTop39private alias object.collisionBottom : player.collisionBottom404142// ========================43// Tables44// ========================4546private table Cylinder_playerFrameTable476, 5, 4, 3, 2, 1, 0, 11, 10, 9, 8, 7, 648end table495051// ========================52// Events53// ========================5455event ObjectUpdate56object.priority = PRIORITY_ACTIVE5758temp2 = 059foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)60GetBit(temp3, object.activePlayers, temp2)61if temp3 == false62BoxCollisionTest(C_TOUCH, object.entityPos, object.hitbox.left, 60, object.hitbox.right, 76, currentPlayer, C_BOX, 1, C_BOX, C_BOX)63if player[currentPlayer].yvel < 064checkResult = false65end if6667if checkResult == true68SetBit(object.activePlayers, temp2, true)69player[currentPlayer].yvel = 07071// Very strange that it explicitly supports up to 4 players here, there's only 3 playable characters to begin with so not sure how that would've worked72// It should be noted that if 4 players were loaded at once, there'd be no object slot clashes either (that would happen if 5 or more were loaded though)73switch temp274case 075object.player1.angle = 076object.player1.direction = player[currentPlayer].direction77break7879case 180object.player2.angle = 081object.player2.direction = player[currentPlayer].direction82break8384case 285object.player3.angle = 086object.player3.direction = player[currentPlayer].direction87break8889case 390object.player4.angle = 091object.player4.direction = player[currentPlayer].direction92break9394end switch95else96temp0 = player[currentPlayer].collisionTop97temp0 <<= 1698temp0 += player[currentPlayer].ypos99temp0 -= object.ypos100if temp0 < -0x300000101BoxCollisionTest(C_SOLID, object.entityPos, object.hitbox.left, -64, object.hitbox.right, -48, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)102else103temp0 = player[currentPlayer].collisionBottom104temp0 <<= 16105temp0 += player[currentPlayer].ypos106temp0 -= object.ypos107if temp0 > 0x400000108BoxCollisionTest(C_SOLID, object.entityPos, object.hitbox.left, 48, object.hitbox.right, 64, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)109end if110end if111end if112else113temp3 = 0114temp0 = player[currentPlayer].xpos115temp0 -= object.xpos116Abs(temp0)117118CheckLower(player[currentPlayer].yvel, -0x40000)119temp3 |= checkResult120CheckGreater(temp0, object.size)121temp3 |= checkResult122if temp3 == true123SetBit(object.activePlayers, temp2, false)124if player[currentPlayer].gravity == 1125if player[currentPlayer].yvel >= 0126if player[currentPlayer].state != Player_State_Carried127if player[currentPlayer].animation != ANI_SKIDDING128if player[currentPlayer].xvel < 0129player[currentPlayer].direction = FACING_LEFT130end if131132player[currentPlayer].animation = ANI_TWIRL133player[currentPlayer].angle = 0134player[currentPlayer].rotation = 0135end if136end if137end if138end if139140switch temp2141case 0142temp6 = object.player1.angle143break144145case 1146temp6 = object.player2.angle147break148149case 2150temp6 = object.player3.angle151break152153case 3154temp6 = object.player4.angle155break156157end switch158159temp6 += 0x20160temp6 &= 0xFF161if temp6 >= 64162player[currentPlayer].yvel = 0163else164player[currentPlayer].yvel >>= 1165end if166else167player[currentPlayer].yvel = 0168temp0 >>= 16169switch temp2170case 0171temp6 = object.player1.angle172temp7 = object.player1.direction173break174175case 1176temp6 = object.player2.angle177temp7 = object.player2.direction178break179180case 2181temp6 = object.player3.angle182temp7 = object.player3.direction183break184185case 3186temp6 = object.player4.angle187temp7 = object.player4.direction188break189190end switch191192temp6 += 4193temp6 &= 0xFF194Cos256(player[currentPlayer].ypos, temp6)195player[currentPlayer].ypos *= 42196player[currentPlayer].ypos >>= 8197player[currentPlayer].ypos -= player[currentPlayer].collisionBottom198player[currentPlayer].ypos += 19199player[currentPlayer].ypos <<= 16200player[currentPlayer].ypos += object.ypos201if player[currentPlayer].state == Player_State_Ground202if player[currentPlayer].gravity == 1203player[currentPlayer].prevAnimation = ANI_TWIRL204player[currentPlayer].animation = ANI_TWIRL205player[currentPlayer].animationSpeed = 0206player[currentPlayer].direction = 0207208temp0 = temp6209temp0 /= 21210if player[currentPlayer].xvel != 0211if player[currentPlayer].xvel > 0212temp7 = FACING_RIGHT213else214temp7 = FACING_LEFT215end if216end if217218if temp7 == FACING_RIGHT219player[currentPlayer].frame = temp0220player[currentPlayer].rotation = 0x000221else222GetTableValue(player[currentPlayer].frame, temp0, Cylinder_playerFrameTable)223player[currentPlayer].rotation = 0x100224end if225end if226end if227228if player[currentPlayer].state == Player_State_Roll229if player[currentPlayer].xvel != 0230if player[currentPlayer].xvel > 0231player[currentPlayer].direction = FACING_RIGHT232else233player[currentPlayer].direction = FACING_LEFT234end if235end if236end if237238switch temp2239case 0240object.player1.angle = temp6241object.player1.direction = temp7242break243244case 1245object.player2.angle = temp6246object.player2.direction = temp7247break248249case 2250object.player3.angle = temp6251object.player3.direction = temp7252break253254case 3255object.player4.angle = temp6256object.player4.direction = temp7257break258259end switch260261player[currentPlayer].gravity = GRAVITY_GROUND262end if263end if264265temp2++266next267268if object.activePlayers != 0269if object.propertyValue == 0270if object.outOfBounds == true271object.priority = PRIORITY_BOUNDS272end if273end if274275temp0 = false276foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)277BoxCollisionTest(C_TOUCH, object.entityPos, object.hitbox.left, -64, object.hitbox.right, 64, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)278temp0 |= checkResult279next280281if temp0 == false282object.activePlayers = 0283end if284end if285end event286287288event ObjectStartup289foreach (TypeName[Cylinder], arrayPos0, ALL_ENTITIES)290if object[arrayPos0].propertyValue == 0291object[arrayPos0].hitbox.right = 192292object[arrayPos0].priority = PRIORITY_BOUNDS293else294object[arrayPos0].hitbox.right = 384295296// The Cylinder is too large to run with traditional bounds, just make it always active297object[arrayPos0].priority = PRIORITY_ACTIVE298end if299300object[arrayPos0].size = object[arrayPos0].hitbox.right301object[arrayPos0].size <<= 16302object[arrayPos0].hitbox.left = object[arrayPos0].hitbox.right303FlipSign(object[arrayPos0].hitbox.left)304next305end event306307308// ========================309// Editor Events310// ========================311312event RSDKEdit313if editor.returnVariable == true314switch editor.variableID315case EDIT_VAR_PROPVAL // property value316checkResult = object.propertyValue317break318319case 0 // type320checkResult = object.propertyValue321break322323end switch324else325switch editor.variableID326case EDIT_VAR_PROPVAL // property value327object.propertyValue = editor.variableValue328break329330case 0 // type331object.propertyValue = editor.variableValue332break333334end switch335end if336end event337338339event RSDKDraw340DrawSprite(0)341342if editor.showGizmos == true343editor.drawingOverlay = true344345// Draw the Cylinder's hitbox346347if object.propertyValue == 0348temp0 = 192349else350temp0 = 384351end if352353temp2 = temp0354355temp1 = 64; temp3 = 64;356CallFunction(EditorHelpers_DrawHitbox)357358editor.drawingOverlay = false359end if360end event361362363event RSDKLoad364LoadSpriteSheet("Global/Display.gif")365SpriteFrame(-8, -8, 16, 16, 168, 18) // "trigger" - #0366367AddEditorVariable("size")368SetActiveVariable("size")369AddEnumVariable("Small", 0)370AddEnumVariable("Large", 1)371end event372373374