Path: blob/master/Sonic 2/Scripts/MCZ/RingPlatform.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Ring Platform Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.store.x12private alias object.value1 : object.store.y13private alias object.value2 : object.roundedPos // no subpixel position1415// Player aliases16private alias object.xpos : player.xpos17private alias object.ypos : player.ypos181920// ========================21// Function Declarations22// ========================2324reserve function RingPlatform_DebugDraw25reserve function RingPlatform_DebugSpawn262728// ========================29// Tables30// ========================3132// Unused table, possibly meant to hold values before this object was optimized33// Coincidentally this object is made out of 6 rings, 6*2 = 12, it maybe means something if you squint hard enough34private table RingPlatform_unusedTable[12]353637// ========================38// Function Definitions39// ========================4041private function RingPlatform_DebugDraw42DrawSprite(0)43end function444546private function RingPlatform_DebugSpawn47CreateTempObject(TypeName[Ring Platform], 0, object.xpos, object.ypos)48object[tempObjectPos].drawOrder = 449object[tempObjectPos].direction = object.direction50end function515253// ========================54// Events55// ========================5657event ObjectUpdate58temp0 = object.angle5960// Rotate the object based on which direction it's facing61if object.direction == FLIP_NONE62object.angle++63else64object.angle--65end if6667// Backup the object's position68temp6 = object.xpos69temp7 = object.ypos70foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)7172// Setup some useful numbers73temp0 >>= 174temp5 = object.angle75temp5 >>= 176Cos256(temp2, temp0)77temp2 <<= 1278Sin256(temp3, temp0)79temp3 <<= 1280Cos256(temp0, temp5)81temp0 <<= 1282Sin256(temp1, temp5)83temp1 <<= 128485object.store.x = object.xpos86object.store.y = object.ypos8788// This object uses every temp available (and even then some more!) so here's a short list of what they all are89// - temp0:90// - curCos91// - temp1:92// - curSin93// - temp2:94// - prevCos95// - temp3:96// - prevSin97// - temp4:98// - pieceNum99// - temp5:100// - curAngle101// - temp6:102// - backupPos.x103// - temp7:104// - backupPos.y105// - object.roundedPos106// - temporary in spirit, holds the rounded position of the object in calculations107108temp4 = 0109while temp4 < 6110BoxCollisionTest(C_SOLID, object.entityPos, -8, -8, 8, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)111if checkResult == COL_TOP112temp5 = object.store.x113temp5 &= 0xFFFF0000114object.roundedPos = object.xpos115object.roundedPos &= 0xFFFF0000116temp5 -= object.roundedPos117player[currentPlayer].xpos += temp5118119temp5 = object.store.y120temp5 &= 0xFFFF0000121object.roundedPos = object.ypos122object.roundedPos &= 0xFFFF0000123temp5 -= object.roundedPos124player[currentPlayer].ypos += temp5125end if126127object.xpos += temp2128object.ypos += temp3129object.store.x += temp0130object.store.y += temp1131temp4++132loop133134// Restore the object's position135object.xpos = temp6136object.ypos = temp7137next138end event139140141event ObjectDraw142temp5 = object.angle143temp5 >>= 1144temp0 = object.xpos145temp1 = object.ypos146Cos256(temp2, temp5)147temp2 <<= 12148149Sin256(temp3, temp5)150temp3 <<= 12151152temp4 = 0153while temp4 < 6154DrawSpriteXY(0, temp0, temp1)155temp0 += temp2156temp1 += temp3157temp4++158loop159end event160161162event ObjectStartup163LoadSpriteSheet("Global/Items.gif")164165foreach (TypeName[Ring Platform], arrayPos0, ALL_ENTITIES)166object[arrayPos0].drawOrder = 4167next168169// 0 - First frame of the ring animation170// You don't see that many scripts where the foreach is between the LoadSpriteSheet and SpriteFrames, this is one of the few that does it in v4171SpriteFrame(-8, -8, 16, 16, 1, 1)172173// Add this Object to the Debug Item list174SetTableValue(TypeName[Ring Platform], DebugMode_ObjCount, DebugMode_TypesTable)175SetTableValue(RingPlatform_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)176SetTableValue(RingPlatform_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)177DebugMode_ObjCount++178end event179180181// ========================182// Editor Events183// ========================184185event RSDKEdit186if editor.returnVariable == true187switch editor.variableID188case EDIT_VAR_PROPVAL // property value189checkResult = object.propertyValue190break191192case 0 // rotateDir193checkResult = object.direction194break195196end switch197else198switch editor.variableID199case EDIT_VAR_PROPVAL // property value200object.propertyValue = editor.variableValue201break202203case 0 // rotateDir204object.direction = editor.variableValue205break206207end switch208end if209end event210211212event RSDKDraw213temp5 = 64214215temp0 = object.xpos216temp1 = object.ypos217Cos256(temp2, temp5)218temp2 <<= 12219220Sin256(temp3, temp5)221temp3 <<= 12222223temp4 = 0224while temp4 < 6225DrawSpriteXY(0, temp0, temp1)226temp0 += temp2227temp1 += temp3228temp4++229loop230end event231232233event RSDKLoad234LoadSpriteSheet("Global/Items.gif")235SpriteFrame(-8, -8, 16, 16, 1, 1)236237AddEditorVariable("rotateDir")238SetActiveVariable("rotateDir")239AddEnumVariable("Clockwise", 0)240AddEnumVariable("Counter-Clockwise", 1)241end event242243244