Path: blob/master/Sonic 2/Scripts/MPZ/Nut.txt
1479 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Nut Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.dropPos.y12private alias object.value1 : object.startPos.y13private alias object.value2 : object.stoodPlayers14private alias object.value3 : object.playerDirections15private alias object.value4 : object.activePlayers16private alias object.value5 : object.reachedFloor17private alias object.value6 : object.spinTimer18private alias object.value7 : object.spinSpeed19private alias object.value31 : object.wrapOffset.y2021// States22private alias 0 : NUT_ATTATCHED23private alias 1 : NUT_FALLING2425// Player Aliases26private alias object.xpos : player.xpos27private alias object.ypos : player.ypos28private alias object.xvel : player.xvel29private alias object.gravity : player.gravity3031// Path ID Aliases32private alias 0 : PATH_A333435// ========================36// Function Declarations37// ========================3839reserve function Nut_DebugDraw40reserve function Nut_DebugSpawn4142private function Nut_DebugDraw43DrawSprite(0)44end function454647private function Nut_DebugSpawn48CreateTempObject(TypeName[Nut], 0, object.xpos, object.ypos)49object[tempObjectPos].startPos.y = object.ypos50object[tempObjectPos].dropPos.y = 0x7FFF000051end function525354// ========================55// Events56// ========================5758event ObjectUpdate59temp0 = object.ypos60temp0 &= 0xFFFF00006162object.ypos += object.yvel63if object.yvel >= 064ObjectTileCollision(CSIDE_FLOOR, 0, 12, PATH_A)65if checkResult == true66object.reachedFloor = true67object.spinSpeed = 068object.yvel = 069end if70else71object.reachedFloor = false72end if7374temp1 = object.ypos75temp1 &= 0xFFFF000076temp1 -= temp07778if object.state == NUT_ATTATCHED79GetBit(temp6, object.propertyValue, 7)80if temp6 == true81if object.ypos > object.dropPos.y82object.state = NUT_FALLING83object.spinSpeed = object.yvel84end if85end if8687object.spinTimer += object.yvel88temp0 = object.spinTimer89temp0 >>= 1790temp0 &= 391object.frame = 392object.frame -= temp093object.yvel = 09495temp7 = 096foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)97temp5 = object.reachedFloor9899GetBit(temp6, object.stoodPlayers, temp7)100if temp6 == true101player[currentPlayer].ypos += temp1102else103SetBit(object.activePlayers, temp7, false)104end if105106if object.reachedFloor == true107if player[currentPlayer].xvel < 0108SetBit(object.activePlayers, temp7, false)109else110temp5 = false111end if112end if113114SetBit(object.stoodPlayers, temp7, false)115BoxCollisionTest(C_SOLID, object.entityPos, -32, -12, 32, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)116switch checkResult117case COL_TOP118SetBit(object.stoodPlayers, temp7, true)119if temp6 == false120GetBit(temp6, object.activePlayers, temp7)121temp6 |= temp5122if temp6 == false123temp2 = player[currentPlayer].xpos124temp2 &= 0xFFFF0000125temp3 = object.xpos126temp3 &= 0xFFFF0000127128if temp2 == temp3129SetBit(object.activePlayers, temp7, true)130object.priority = PRIORITY_ACTIVE131else132if player[currentPlayer].xpos > object.xpos133SetBit(object.playerDirections, temp7, 0)134else135SetBit(object.playerDirections, temp7, 1)136end if137end if138end if139else140GetBit(temp6, object.activePlayers, temp7)141if temp6 == false142if temp5 == true143if player[currentPlayer].xvel > 0144SetBit(object.playerDirections, temp7, 0)145else146SetBit(object.playerDirections, temp7, 1)147end if148else149GetBit(temp6, object.playerDirections, temp7)150if temp6 == 0151if player[currentPlayer].xpos < object.xpos152SetBit(object.activePlayers, temp7, true)153player[currentPlayer].xpos = object.xpos154object.priority = PRIORITY_ACTIVE155end if156else157if player[currentPlayer].xpos > object.xpos158SetBit(object.activePlayers, temp7, true)159player[currentPlayer].xpos = object.xpos160object.priority = PRIORITY_ACTIVE161end if162end if163end if164else165player[currentPlayer].xpos = object.xpos166object.yvel += player[currentPlayer].xvel167end if168end if169break170171case COL_BOTTOM172if player[currentPlayer].gravity == 0173CallFunction(Player_Kill)174end if175break176end switch177178temp7++179next180181FlipSign(object.yvel)182object.yvel >>= 3183else184object.yvel += 0x3800185186object.spinTimer += object.spinSpeed187temp0 = object.spinTimer188temp0 >>= 17189temp0 &= 3190object.frame = 3191object.frame -= temp0192193temp7 = 0194foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)195GetBit(temp6, object.stoodPlayers, temp7)196if temp6 == true197player[currentPlayer].ypos += temp1198end if199200SetBit(object.stoodPlayers, temp7, false)201BoxCollisionTest(C_SOLID, object.entityPos, -32, -12, 32, 12, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)202if checkResult == COL_TOP203SetBit(object.stoodPlayers, temp7, true)204end if205206temp7++207next208end if209210if object.outOfBounds == true211temp1 = object.ypos212object.ypos = object.startPos.y213object.ypos += object.wrapOffset.y214215if object.outOfBounds == true216object.stoodPlayers = 0217object.playerDirections = 0218object.activePlayers = 0219object.reachedFloor = false220object.spinTimer = 0221object.spinSpeed = 0222object.state = NUT_ATTATCHED223object.priority = PRIORITY_BOUNDS224else225object.ypos = temp1226end if227end if228end event229230231event ObjectDraw232DrawSprite(object.frame)233end event234235236event ObjectStartup237LoadSpriteSheet("MPZ/Objects.gif")238SpriteFrame(-32, -12, 64, 24, 130, 156)239SpriteFrame(-32, -12, 64, 24, 130, 181)240SpriteFrame(-32, -12, 64, 24, 130, 206)241SpriteFrame(-32, -12, 64, 24, 130, 231)242243foreach (TypeName[Nut], arrayPos0, ALL_ENTITIES)244object[arrayPos0].startPos.y = object[arrayPos0].ypos245246object[arrayPos0].dropPos.y = object[arrayPos0].propertyValue247object[arrayPos0].dropPos.y &= 0x7F248object[arrayPos0].dropPos.y <<= 19249object[arrayPos0].dropPos.y += object[arrayPos0].ypos250next251252SetTableValue(TypeName[Nut], DebugMode_ObjCount, DebugMode_TypesTable)253SetTableValue(Nut_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)254SetTableValue(Nut_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)255DebugMode_ObjCount++256end event257258259// ========================260// Editor Events261// ========================262263event RSDKEdit264if editor.returnVariable == true265switch editor.variableID266case EDIT_VAR_PROPVAL // property value267checkResult = object.propertyValue268break269270case 0 // useDistance271GetBit(checkResult, object.propertyValue, 7)272break273274case 1 // distance275checkResult = object.propertyValue276checkResult &= 0x7F277break278279end switch280else281switch editor.variableID282case EDIT_VAR_PROPVAL // property value283object.propertyValue = editor.variableValue284break285286case 0 // useDistance287CheckNotEqual(editor.variableValue, false)288SetBit(object.propertyValue, 7, checkResult)289break290291case 1 // distance292editor.variableValue &= 0x7F293object.propertyValue &= 0x80294295object.propertyValue |= editor.variableValue296break297298end switch299end if300end event301302303event RSDKDraw304DrawSprite(0)305306if editor.showGizmos == true307GetBit(checkResult, object.propertyValue, 7)308if checkResult == true309object.dropPos.y = object.propertyValue310object.dropPos.y &= 0x7F311object.dropPos.y <<= 19312object.dropPos.y += object.ypos313314object.inkEffect = INK_BLEND315DrawSpriteFX(0, FX_INK, object.xpos, object.dropPos.y)316object.inkEffect = INK_NONE317318DrawArrow(object.xpos, object.ypos, object.xpos, object.dropPos.y, 0x00, 0xFF, 0x00)319end if320end if321end event322323324event RSDKLoad325LoadSpriteSheet("MPZ/Objects.gif")326SpriteFrame(-32, -12, 64, 24, 130, 156)327328AddEditorVariable("allowDrop")329SetActiveVariable("allowDrop")330AddEnumVariable("false", false)331AddEnumVariable("true", true)332333AddEditorVariable("dropDistance")334SetActiveVariable("dropDistance")335end event336337338