Path: blob/master/Sonic 2/Scripts/Special/PlayerObject.txt
1478 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Player Object Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.type : player.type12private alias object.entityPos : player.entityPos13private alias object.state : player.state14private alias object.priority : player.priority15private alias object.visible : player.visible16private alias object.xpos : player.xpos17private alias object.ypos : player.ypos18private alias object.xvel : player.xvel19private alias object.yvel : player.yvel20private alias object.speed : player.speed21private alias object.rotation : player.rotation22private alias object.angle : player.angle23private alias object.frame : player.frame24private alias object.animation : player.animation25private alias object.animationSpeed : player.animationSpeed26private alias object.animationTimer : player.animationTimer27private alias object.gravity : player.gravity28private alias object.controlMode : player.controlMode2930// Object input values31private alias object.up : player.up32private alias object.down : player.down33private alias object.left : player.left34private alias object.right : player.right35private alias object.jumpPress : player.jumpPress36private alias object.jumpHold : player.jumpHold3738// Value Aliases39private alias object.value0 : player.rings40private alias object.value1 : player.timer41private alias object.value2 : player.zpos42private alias object.value3 : player.xBoundsR43private alias object.value4 : player.frameOffset44// value5 is unused45private alias object.value6 : player.spinTimer46private alias object.value7 : player.invincibilityTimer47// value8 is unused48private alias object.value9 : player.xBoundsL49private alias object.value10 : player.groundPos50private alias object.value11 : player.localShadowPos.x51private alias object.value12 : player.localShadowPos.y52private alias object.value13 : player.localShadowPos.u53private alias object.value14 : player.localPos.z54private alias object.value15 : player.localPos.x55private alias object.value16 : player.localPos.y56private alias object.value17 : player.tailFrame57private alias object.value18 : player.stateInput58private alias object.value19 : player.vsCheckpointID59private alias object.value20 : player.vsCheckpoint1Rings60private alias object.value21 : player.vsCheckpoint2Rings61private alias object.value22 : player.vsCheckpoint3Rings62private alias object.value23 : player.playerTagFrame63private alias object.value24 : player.currentLeader64private alias object.value25 : player.changedLeader65private alias object.value26 : player.automoveActive66private alias object.value27 : player.jumpInTimer6768// Halfpipe Aliases69private alias object.value13 : halfpipe.playerPos.z70private alias object.value14 : halfpipe.worldTranslation.x71private alias object.value15 : halfpipe.worldTranslation.y72private alias object.value16 : halfpipe.worldTranslation.z73private alias object.value17 : halfpipe.worldRotation.x74private alias object.value18 : halfpipe.worldRotation.y75private alias object.value19 : halfpipe.worldRotation.z7677// LoseRing Aliases78private alias object.value1 : loseRing.gravityStrength7980// Title Card aliases81private alias 8 : TITLECARD_FADETOTITLE8283// Face Buffer Flag Aliases84private alias 6 : FACE_TEXTURED_C_BLEND85private alias 7 : FACE_SPRITE_3D868788// ========================89// Function Declarations90// ========================9192reserve function Player_Input_Gamepad93reserve function Player_Input_AI_Follow94reserve function Player_State_Ground95reserve function Player_State_Air96reserve function Player_State_Hurt97reserve function Player_LoseRings98reserve function Player_Draw_Normal99reserve function Player_Input_Gamepad_2P100reserve function Player_Input_VSPlayer_2P101102103// ========================104// Static Values105// ========================106107private value Player_stateUp = 0108private value Player_stateDown = 0109private value Player_stateLeft = 0110private value Player_stateRight = 0111private value Player_stateJumpPress = 0112private value Player_stateJumpHold = 0113114private value Player_attractTable = 0115private value Player_attractTablePos = 0116private value Player_attractTableSize = 0117private value Player_attractFrameCount = 0118private value Player_attractDuration = 0119private value Player_playerSlot = 0120121// What player is in front right now122private value Player_leadingPlayer = 0123124// ========================125// Tables126// ========================127128// Shadow Y Positions, with index 0 being as far left/right as it goes, and the last index being the center129private table Player_shadowYPosTable130-128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -127, -127, -127, -127131-127, -127, -127, -127, -126, -126, -126, -126, -126, -126, -125, -125, -125, -125, -124, -124132-124, -124, -123, -123, -123, -123, -122, -122, -122, -121, -121, -121, -120, -120, -119, -119133-119, -118, -118, -117, -117, -116, -116, -116, -115, -115, -114, -114, -113, -112, -112, -111134-111, -110, -110, -109, -108, -108, -107, -106, -106, -105, -104, -104, -103, -102, -101, -101135-100, -99, -98, -97, -96, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -85136-84, -83, -82, -81, -79, -78, -77, -75, -74, -72, -71, -69, -68, -66, -64, -62137-61, -59, -57, -54, -52, -50, -47, -45, -42, -39, -35, -31, -27, -21, -13, 0138end table139140141// ========================142// Function Definitions143// ========================144145public function Player_Draw_Normal146MatrixRotateXYZ(MAT_WORLD, halfpipe[0].worldRotation.x, halfpipe[0].worldRotation.y, halfpipe[0].worldRotation.z)147MatrixTranslateXYZ(MAT_TEMP, halfpipe[0].worldTranslation.x, halfpipe[0].worldTranslation.y, halfpipe[0].worldTranslation.z)148MatrixMultiply(MAT_WORLD, MAT_TEMP)149150arrayPos0 = scene3D.vertexCount151arrayPos1 = scene3D.faceCount152153// Draw Shadow154faceBuffer[arrayPos1].flag = FACE_TEXTURED_C_BLEND155faceBuffer[arrayPos1].a = arrayPos0156vertexBuffer[arrayPos0].x = player.localShadowPos.x157vertexBuffer[arrayPos0].y = player.localShadowPos.y158vertexBuffer[arrayPos0].z = player.zpos159vertexBuffer[arrayPos0].u = player.localShadowPos.u160vertexBuffer[arrayPos0].v = 50161arrayPos2 = arrayPos0162arrayPos0++163TransformVertices(MAT_WORLD, arrayPos2, arrayPos0)164165faceBuffer[arrayPos1].b = arrayPos0166vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x167vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y168vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z169if player.zpos > 0x800170vertexBuffer[arrayPos0].u = 0x600171vertexBuffer[arrayPos0].v = 0x600172else173vertexBuffer[arrayPos0].u = 0x580174vertexBuffer[arrayPos0].v = 0x580175end if176arrayPos0++177178faceBuffer[arrayPos1].c = arrayPos0179vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x180vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y181vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z182vertexBuffer[arrayPos0].u = 17183vertexBuffer[arrayPos0].v = 16184arrayPos0++185186faceBuffer[arrayPos1].d = arrayPos0187vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x188vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y189vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z190arrayPos0++191192arrayPos1++193scene3D.vertexCount += 4194scene3D.faceCount++195196// Draw the Player197if player.visible == true198arrayPos2 = arrayPos0199arrayPos0++200201faceBuffer[arrayPos1].flag = FACE_SPRITE_3D202faceBuffer[arrayPos1].a = arrayPos2203vertexBuffer[arrayPos2].x = player.xpos204vertexBuffer[arrayPos2].x >>= 1205player.localPos.x = vertexBuffer[arrayPos2].x206207vertexBuffer[arrayPos2].y = player.ypos208vertexBuffer[arrayPos2].y >>= 1209player.localPos.y = vertexBuffer[arrayPos2].y210211vertexBuffer[arrayPos2].z = player.zpos212TransformVertices(MAT_WORLD, arrayPos2, arrayPos0)213214vertexBuffer[arrayPos2].u = TypeName[Player Object]215vertexBuffer[arrayPos2].v = FX_ROTATE216faceBuffer[arrayPos1].b = arrayPos0217vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x218vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y219vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z220vertexBuffer[arrayPos0].u = player.frame221vertexBuffer[arrayPos0].v = 0222arrayPos0++223224faceBuffer[arrayPos1].c = arrayPos0225vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x226vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y227vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z228vertexBuffer[arrayPos0].u = 0x200229vertexBuffer[arrayPos0].v = player.rotation230arrayPos0++231232faceBuffer[arrayPos1].d = arrayPos0233vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x234vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y235vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z236scene3D.vertexCount += 4237scene3D.faceCount++238239// If the character is Tails, then draw his Tails240if player.frameOffset == 16241if player.animation == 0242arrayPos0++243arrayPos1++244faceBuffer[arrayPos1].flag = FACE_SPRITE_3D245faceBuffer[arrayPos1].a = arrayPos0246vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x247vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y248vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z249vertexBuffer[arrayPos0].u = TypeName[Player Object]250vertexBuffer[arrayPos0].v = FX_ROTATE251arrayPos0++252253faceBuffer[arrayPos1].b = arrayPos0254vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x255vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y256vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z257vertexBuffer[arrayPos0].u = player.tailFrame258vertexBuffer[arrayPos0].u >>= 2259vertexBuffer[arrayPos0].u += 48260vertexBuffer[arrayPos0].v = 0261arrayPos0++262263faceBuffer[arrayPos1].c = arrayPos0264vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x265vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y266vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z267vertexBuffer[arrayPos0].u = 0x200268vertexBuffer[arrayPos0].v = player.rotation269arrayPos0++270271faceBuffer[arrayPos1].d = arrayPos0272vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x273vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y274vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z275scene3D.vertexCount += 4276scene3D.faceCount++277end if278end if279end if280281// If active, draw 1P/2P Tag282if player.playerTagFrame > 0283arrayPos0++284arrayPos1++285faceBuffer[arrayPos1].flag = FACE_SPRITE_3D286faceBuffer[arrayPos1].a = arrayPos0287vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x288vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y289vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z290vertexBuffer[arrayPos0].u = TypeName[Player Object]291vertexBuffer[arrayPos0].v = FX_ROTATE292arrayPos0++293294faceBuffer[arrayPos1].b = arrayPos0295vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x296vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y297vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z298vertexBuffer[arrayPos0].u = player.playerTagFrame299vertexBuffer[arrayPos0].v = 0300arrayPos0++301302faceBuffer[arrayPos1].c = arrayPos0303vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x304vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y305vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z306vertexBuffer[arrayPos0].u = 0x200307vertexBuffer[arrayPos0].v = 0308arrayPos0++309310faceBuffer[arrayPos1].d = arrayPos0311vertexBuffer[arrayPos0].x = vertexBuffer[arrayPos2].x312vertexBuffer[arrayPos0].y = vertexBuffer[arrayPos2].y313vertexBuffer[arrayPos0].z = vertexBuffer[arrayPos2].z314scene3D.vertexCount += 4315scene3D.faceCount++316end if317end function318319320public function Player_Input_Gamepad321if options.attractMode == false322#platform: USE_STANDALONE323if options.touchControls == true324if player.controlMode == CONTROLMODE_P1325CheckTouchRect(0, 96, screen.xcenter, screen.ysize)326if checkResult > -1327arrayPos0 = checkResult328temp0 = touchscreen[arrayPos0].xpos329temp0 -= saveRAM[39]330if temp0 > 0331keyDown[1].right = true332else333keyDown[1].left = true334end if335end if336337CheckTouchRect(screen.xcenter, 96, screen.xsize, 240)338if checkResult > -1339keyDown[1].buttonA = true340end if341342if touchJump == false343keyPress[1].buttonA |= keyDown[1].buttonA344end if345346touchJump = keyDown[1].buttonA347if stage.debugMode == true348CheckTouchRect(0, 0, 112, 56)349if checkResult > -1350keyDown[1].buttonB = true351end if352353if touchDebug == false354keyPress[1].buttonB |= keyDown[1].buttonB355end if356357touchDebug = keyDown[1].buttonB358end if359360CheckTouchRect(240, 0, screen.xsize, 40)361if checkResult > -1362if options.vsMode == false363PlaySfx(SfxName[Menu Back], false)364engine.state = 5365end if366end if367368if keyPress[0].start == true369if options.vsMode == false370PlaySfx(SfxName[Menu Back], false)371engine.state = 5372end if373end if374end if375end if376#endplatform377378#platform: USE_ORIGINS379if keyPress[0].start == true380if options.vsMode == false381// These SFX should never even be playing in the Special Stage...382StopSfx(SfxName[Flying])383StopSfx(SfxName[Tired])384engine.state = 5385end if386end if387#endplatform388389ProcessObjectControl()390391if options.vsMode == true392player.currentLeader = Player_leadingPlayer393CallNativeFunction2(SendEntity, 2, false)394end if395else396// There aren't even any demos in the Special Stages, but may as well leave in the implementation for it anyway...397398#platform: USE_STANDALONE399CheckTouchRect(0, 0, screen.xsize, screen.ysize)400if keyPress[0].start == true401checkResult = false402end if403404if checkResult > -1405if Player_attractDuration > 1406Player_attractDuration = 1407end if408end if409#endplatform410411if keyPress[0].start == true412Player_attractDuration = 1413end if414415Player_attractFrameCount--416if Player_attractFrameCount < 1417if Player_attractTablePos < Player_attractTableSize418GetTableValue(temp0, Player_attractTablePos, Player_attractTable)419GetBit(player.up, temp0, 0)420GetBit(player.down, temp0, 1)421GetBit(player.left, temp0, 2)422GetBit(player.right, temp0, 3)423GetBit(player.jumpPress, temp0, 4)424GetBit(player.jumpHold, temp0, 5)425Player_attractTablePos++426427GetTableValue(Player_attractFrameCount, Player_attractTablePos, Player_attractTable)428Player_attractTablePos++429end if430else431if player.jumpPress == true432player.jumpPress = false433end if434end if435436if Player_attractDuration > 0437Player_attractDuration--438if Player_attractDuration < 1439// This code is copied directly from S1 SS's version of the demo handler, including a fade out for ending the demo440// However, this includes a mention of the Title Card object, which doesn't exist in Sonic 2 Special Stages...441// (TypeName[Title Card] will resolve as 0, a Blank Object, for the reason above)442443arrayPos0 = Player_playerSlot444object[arrayPos0].type = TypeName[Title Card]445object[arrayPos0].state = TITLECARD_FADETOTITLE446object[arrayPos0].priority = PRIORITY_ACTIVE447object[arrayPos0].drawOrder = 6448end if449end if450end if451452if player.invincibilityTimer > 0453player.invincibilityTimer--454GetBit(temp0, player.invincibilityTimer, 2)455if temp0 == true456player.visible = false457else458player.visible = true459end if460end if461end function462463464public function Player_Input_AI_Follow465Player_stateUp <<= 1466Player_stateUp |= player[2].up467Player_stateUp &= 0xFFFF468469Player_stateDown <<= 1470Player_stateDown |= player[2].down471Player_stateDown &= 0xFFFF472473Player_stateLeft <<= 1474Player_stateLeft |= player[2].left475Player_stateLeft &= 0xFFFF476477Player_stateRight <<= 1478Player_stateRight |= player[2].right479Player_stateRight &= 0xFFFF480481Player_stateJumpPress <<= 1482Player_stateJumpPress |= player[2].jumpPress483Player_stateJumpPress &= 0xFFFF484485Player_stateJumpHold <<= 1486Player_stateJumpHold |= player[2].jumpHold487Player_stateJumpHold &= 0xFFFF488489temp0 = Player_stateUp490temp0 >>= 15491player.up = temp0492493temp0 = Player_stateDown494temp0 >>= 15495player.down = temp0496497temp0 = Player_stateLeft498temp0 >>= 15499player.left = temp0500501temp0 = Player_stateRight502temp0 >>= 15503player.right = temp0504505temp0 = Player_stateJumpPress506temp0 >>= 15507player.jumpPress = temp0508509temp0 = Player_stateJumpHold510temp0 >>= 15511player.jumpHold = temp0512513if player.invincibilityTimer > 0514player.invincibilityTimer--515GetBit(temp0, player.invincibilityTimer, 2)516if temp0 == true517player.visible = false518else519player.visible = true520end if521end if522523#platform: USE_ORIGINS524temp0 = keyDown[2].left525temp0 |= keyDown[2].right526temp0 |= keyDown[2].buttonA527temp0 |= keyDown[2].buttonB528temp0 |= keyDown[2].buttonC529if temp0 == true530player.jumpInTimer = 0531player.stateInput = Player_Input_Gamepad_2P532end if533#endplatform534end function535536537public function Player_Input_Gamepad_2P538#platform: USE_ORIGINS539ProcessObjectControl()540if player.invincibilityTimer > 0541player.invincibilityTimer--542GetBit(temp0, player.invincibilityTimer, 2)543if temp0 == true544player.visible = false545else546player.visible = true547end if548end if549550temp0 = player.left551temp0 |= player.right552temp0 |= player.jumpHold553if temp0 == false554player.jumpInTimer++555if player.jumpInTimer >= 600556player.stateInput = Player_Input_AI_Follow557AssignInputSlotToDevice(2, -1)558end if559else560player.jumpInTimer = 0561end if562#endplatform563end function564565566public function Player_Input_VSPlayer_2P567#platform: USE_STANDALONE568temp0 = player.playerTagFrame569CallNativeFunction2(ReceiveEntity, 3, true)570player.type = TypeName[Player Object]571player.stateInput = Player_Input_VSPlayer_2P572player.playerTagFrame = temp0573#endplatform574575#platform: USE_ORIGINS576ProcessObjectControl()577#endplatform578579if vs.playerID == 1580Player_leadingPlayer = player.currentLeader581end if582583if player.invincibilityTimer > 0584player.invincibilityTimer--585GetBit(temp0, player.invincibilityTimer, 2)586if temp0 == true587player.visible = false588else589player.visible = true590end if591end if592end function593594595public function Player_State_Ground596if player.right == true597player.speed -= 48598if player.speed < -0x600599player.speed = -0x600600end if601602player.automoveActive = false603player.timer = 0604else605if player.left == true606player.speed += 48607if player.speed > 0x600608player.speed = 0x600609end if610611player.automoveActive = false612player.timer = 0613else614if player.automoveActive == false615player.timer = 60616player.automoveActive = true617end if618619temp0 = player.speed620temp0 >>= 4621player.speed -= temp0622end if623end if624625temp0 = player.speed626if player.rotation != 0627temp0 /= 256628temp0 *= 128629else630temp0 >>= 1631end if632633player.angle += temp0634player.angle &= 0xFFFF635player.rotation = player.angle636player.rotation >>= 7637638// Wait for it....639if player.timer > 0640player.timer--641else642// Move to center643temp1 = player.rotation644temp1 >>= 1645Sin256(temp0, temp1)646temp0 *= -80647temp0 >>= 9648player.speed += temp0649end if650651Sin(player.xpos, player.rotation)652player.xpos *= player.xBoundsL653player.xpos >>= 9654655Cos(player.ypos, player.rotation)656player.ypos *= player.xBoundsL657player.ypos >>= 9658659player.animation = 0660player.animationSpeed = 60661temp0 = player.rotation662player.changedLeader = false663664if player.jumpPress == true665player.speed = 0666Sin(player.xvel, player.rotation)667player.xvel *= 0x5A0668player.xvel >>= 9669Cos(player.yvel, player.rotation)670player.yvel *= 0x980671player.yvel >>= 9672player.state = Player_State_Air673player.rotation = 0674player.frame = 8675player.frame += player.frameOffset676player.animation = 8677player.animationSpeed = 60678player.animationTimer = 0679player.gravity = GRAVITY_AIR680PlaySfx(SfxName[Jump], false)681else682if player.rotation > 152683if player.rotation < 360684if player.speed < 128685if player.speed > -128686player.xvel = player.speed687player.speed = 0688player.state = Player_State_Air689player.yvel = 0690end if691end if692end if693end if694end if695if temp0 > 128696if temp0 < 384697temp0 += 256698FlipSign(temp0)699temp0 &= 511700end if701end if702703Sin(player.localShadowPos.x, temp0)704player.localShadowPos.x *= -52705player.localShadowPos.x >>= 1706707Cos(player.localShadowPos.y, temp0)708player.localShadowPos.y *= -52709player.localShadowPos.y >>= 1710711player.localShadowPos.u = 116712713if temp0 < 256714if temp0 > 112715player.localShadowPos.u = 224716else717if temp0 > 39718player.localShadowPos.u = 149719end if720end if721else722if temp0 < 400723player.localShadowPos.u = 215724else725if temp0 < 473726player.localShadowPos.u = 182727end if728end if729end if730731if player.rotation < 40732player.rotation = 0733end if734735if player.rotation > 472736player.rotation = 0737end if738end function739740741public function Player_State_Air742if options.vsMode == true743if player.changedLeader == false744Player_leadingPlayer ^= 1745player.changedLeader = true746end if747end if748749player.xpos += player.xvel750if player.xpos <= player.xBoundsL751player.xpos = player.xBoundsL752end if753754if player.xpos >= player.xBoundsR755player.xpos = player.xBoundsR756end if757758if player.left == true759player.xvel -= 32760end if761762if player.right == true763player.xvel += 32764end if765766player.ypos += player.yvel767player.yvel -= 88768if player.ypos < 0769temp0 = player.xpos770temp0 *= player.xpos771temp1 = player.ypos772temp1 *= player.ypos773temp0 += temp1774if temp0 > player.groundPos775player.state = Player_State_Ground776player.gravity = GRAVITY_GROUND777ATan2(player.angle, player.ypos, player.xpos)778player.angle += 128779player.angle <<= 8780end if781end if782783if player.rotation < 0x100784if player.rotation > 0785player.rotation -= 8786else787player.rotation = 0788end if789else790if player.rotation < 0x200791player.rotation += 8792else793player.rotation = 0794end if795end if796797player.localShadowPos.x = player.xpos798player.localShadowPos.x *= 144799player.localShadowPos.x >>= 8800801temp0 = player.xpos802temp0 *= 45803temp0 >>= 13804Abs(temp0)805GetTableValue(player.localShadowPos.y, temp0, Player_shadowYPosTable)806temp0 = player.localShadowPos.y807player.localShadowPos.y *= 105808809player.localShadowPos.u = 116810811// Shadow frame funky stuff812if temp0 > -112813if temp0 > -24814if player.xpos < 0815player.localShadowPos.u = 224816else817player.localShadowPos.u = 215818end if819else820if player.xpos < 0821player.localShadowPos.u = 149822else823player.localShadowPos.u = 182824end if825end if826end if827end function828829830public function Player_State_Hurt831if options.vsMode == true832if vs.playerID == 0833if player.changedLeader == false834Player_leadingPlayer = player.entityPos835Player_leadingPlayer -= 2836Player_leadingPlayer ^= vs.playerID837Player_leadingPlayer ^= 1838player.changedLeader = true839end if840end if841end if842843if player.spinTimer < 512844player.spinTimer += 16845player.rotation += 16846else847player.speed = 0848player.spinTimer = 0849player.invincibilityTimer = 60850if player.gravity == 0851player.state = Player_State_Ground852else853player.state = Player_State_Air854end if855end if856end function857858859public function Player_LoseRings860if player[currentPlayer].rings > 0861PlaySfx(SfxName[Lose Rings], false)862player[currentPlayer].rings -= 10863864temp0 = 10865if player[currentPlayer].rings < 0866temp0 += player[currentPlayer].rings867player[currentPlayer].rings = 0868end if869870temp2 = temp0871temp2 >>= 1872temp2 <<= 5873temp1 = 384874temp1 -= temp2875temp2 = player.angle876temp2 >>= 7877temp1 += temp2878temp3 = player[currentPlayer].xpos879temp3 *= 224880temp4 = player[currentPlayer].ypos881temp4 *= -220882temp5 = player[2].ypos883temp5 *= -48884temp4 += 0x600000885temp4 += temp5886while temp0 > 0887CreateTempObject(TypeName[Lose Ring], 0, temp3, temp4)888Cos(object[tempObjectPos].xvel, temp1)889Sin(object[tempObjectPos].yvel, temp1)890object[tempObjectPos].xvel <<= 9891object[tempObjectPos].yvel <<= 10892object[tempObjectPos].scale = 0x140893Rand(loseRing[tempObjectPos].gravityStrength, 0x2000)894loseRing[tempObjectPos].gravityStrength += 0x7000895Rand(object[tempObjectPos].animationSpeed, 128)896object[tempObjectPos].animationSpeed += 64897temp0--898temp1 += 32899loop900end if901end function902903904// ========================905// Events906// ========================907908event ObjectUpdate909CallFunction(player.stateInput)910CallFunction(player.state)911912if options.vsMode == true913temp0 = player.entityPos914temp0 -= 2915temp0 ^= vs.playerID916temp0 ^= Player_leadingPlayer917if temp0 == 0918if player.zpos < 0x1000919player.zpos += 64920end if921else922if player.zpos > 0x400923player.zpos -= 64924end if925end if926end if927928player.localPos.z = player.zpos929player.localPos.z <<= 8930player.localPos.z += halfpipe[0].playerPos.z931player.localPos.z += 0xC0000932933player.animationTimer += player.animationSpeed934if player.animationTimer >= 240935player.animationTimer -= 240936player.frame++937player.frame &= 7938player.frame += player.animation939player.frame += player.frameOffset940end if941942CallFunction(Player_Draw_Normal)943player.tailFrame++944player.tailFrame %= 28945end event946947948event ObjectStartup949LoadSpriteSheet("Special/Objects.gif")950951// Running - Sonic952SpriteFrame(-16, -28, 32, 56, 1, 68)953SpriteFrame(-16, -28, 32, 56, 34, 68)954SpriteFrame(-16, -28, 32, 56, 67, 68)955SpriteFrame(-16, -28, 32, 56, 100, 68)956SpriteFrame(-16, -28, 32, 56, 1, 125)957SpriteFrame(-16, -28, 32, 56, 34, 125)958SpriteFrame(-16, -28, 32, 56, 67, 125)959SpriteFrame(-16, -28, 32, 56, 100, 125)960961// Jumping - Sonic962SpriteFrame(-16, -20, 32, 40, 133, 67)963SpriteFrame(-16, -20, 32, 40, 166, 67)964SpriteFrame(-16, -20, 32, 40, 133, 67)965SpriteFrame(-16, -20, 32, 40, 166, 67)966SpriteFrame(-16, -20, 32, 40, 133, 67)967SpriteFrame(-16, -20, 32, 40, 166, 67)968SpriteFrame(-16, -20, 32, 40, 133, 67)969SpriteFrame(-16, -20, 32, 40, 166, 67)970971// Running - Tails972SpriteFrame(-12, -24, 24, 48, 199, 67)973SpriteFrame(-16, -24, 32, 48, 224, 67)974SpriteFrame(-16, -24, 32, 48, 257, 67)975SpriteFrame(-16, -24, 32, 48, 290, 67)976SpriteFrame(-12, -24, 24, 48, 199, 116)977SpriteFrame(-16, -24, 32, 48, 224, 116)978SpriteFrame(-16, -24, 32, 48, 257, 116)979SpriteFrame(-16, -24, 32, 48, 290, 116)980981// Jumping - Tails982SpriteFrame(-16, -16, 32, 32, 133, 108)983SpriteFrame(-16, -16, 32, 32, 166, 108)984SpriteFrame(-16, -16, 32, 32, 133, 108)985SpriteFrame(-16, -16, 32, 32, 166, 108)986SpriteFrame(-16, -16, 32, 32, 133, 108)987SpriteFrame(-16, -16, 32, 32, 166, 108)988SpriteFrame(-16, -16, 32, 32, 133, 108)989SpriteFrame(-16, -16, 32, 32, 166, 108)990991// Running - Knux992SpriteFrame(-16, -28, 32, 56, 1, 182)993SpriteFrame(-16, -28, 32, 56, 34, 182)994SpriteFrame(-16, -28, 32, 56, 67, 182)995SpriteFrame(-16, -28, 32, 56, 100, 182)996SpriteFrame(-16, -28, 32, 56, 133, 182)997SpriteFrame(-16, -28, 32, 56, 166, 182)998SpriteFrame(-16, -28, 32, 56, 199, 182)999SpriteFrame(-16, -28, 32, 56, 232, 182)10001001// Jumping - Knux1002SpriteFrame(-16, -20, 32, 40, 133, 141)1003SpriteFrame(-16, -20, 32, 40, 166, 141)1004SpriteFrame(-16, -20, 32, 40, 133, 141)1005SpriteFrame(-16, -20, 32, 40, 166, 141)1006SpriteFrame(-16, -20, 32, 40, 133, 141)1007SpriteFrame(-16, -20, 32, 40, 166, 141)1008SpriteFrame(-16, -20, 32, 40, 133, 141)1009SpriteFrame(-16, -20, 32, 40, 166, 141)10101011// Tails's Tails1012SpriteFrame(-6, -6, 16, 24, 323, 58)1013SpriteFrame(-8, 0, 24, 24, 340, 58)1014SpriteFrame(-8, 8, 24, 16, 365, 58)1015SpriteFrame(-9, -1, 16, 24, 390, 58)1016SpriteFrame(-11, -9, 16, 32, 407, 58)1017SpriteFrame(-16, -9, 24, 24, 424, 58)1018SpriteFrame(-16, -9, 24, 24, 323, 83)10191020// 1P/2P tags, with flipped versions for Mirror Mode1021// See playerTagFrame1022#platform: USE_ORIGINS1023if game.playMode == BOOT_PLAYMODE_MIRRORING1024SpriteFrame(-8, -40, 16, 7, 348, 145)1025SpriteFrame(-8, -40, 16, 7, 348, 153)1026else1027#endplatform1028SpriteFrame(-8, -40, 16, 7, 348, 100)1029SpriteFrame(-8, -40, 16, 7, 348, 108)1030#platform: USE_ORIGINS1031end if10321033// Duplicates of Amy's first running sprite1034// These were added in 2.0.1 to fix a bug. Yes, I am serious.1035SpriteFrame(-15, -26, 30, 52, 1, 373)1036SpriteFrame(-15, -26, 30, 52, 1, 373)1037SpriteFrame(-15, -26, 30, 52, 1, 373)1038SpriteFrame(-15, -26, 30, 52, 1, 373)1039SpriteFrame(-15, -26, 30, 52, 1, 373)1040SpriteFrame(-15, -26, 30, 52, 1, 373)1041SpriteFrame(-15, -26, 30, 52, 1, 373)10421043// Running - Amy1044SpriteFrame(-15, -26, 30, 52, 1, 373)1045SpriteFrame(-15, -26, 30, 52, 32, 373)1046SpriteFrame(-15, -26, 30, 52, 63, 373)1047SpriteFrame(-15, -26, 30, 52, 94, 373)1048SpriteFrame(-15, -26, 30, 52, 1, 426)1049SpriteFrame(-15, -26, 30, 52, 32, 426)1050SpriteFrame(-15, -26, 30, 52, 63, 426)1051SpriteFrame(-15, -26, 30, 52, 94, 426)10521053// Jumping - Amy1054SpriteFrame(-14, -16, 28, 32, 125, 361)1055SpriteFrame(-14, -16, 28, 32, 125, 394)1056SpriteFrame(-14, -16, 28, 32, 125, 361)1057SpriteFrame(-14, -16, 28, 32, 125, 394)1058SpriteFrame(-14, -16, 28, 32, 125, 361)1059SpriteFrame(-14, -16, 28, 32, 125, 394)1060SpriteFrame(-14, -16, 28, 32, 125, 361)1061SpriteFrame(-14, -16, 28, 32, 125, 394)1062#endplatform10631064player[2].type = TypeName[Player Object]1065player[2].priority = PRIORITY_ACTIVE1066player[2].zpos = 0x10001067player[2].state = Player_State_Ground1068player[2].stateInput = Player_Input_Gamepad1069switch stage.playerListPos1070case PLAYER_SONIC_A1071player[2].xBoundsR = 881072player[2].frameOffset = 01073break10741075case PLAYER_TAILS_A1076player[2].xBoundsR = 901077player[2].frameOffset = 161078break10791080case PLAYER_KNUCKLES_A1081player[2].xBoundsR = 881082player[2].frameOffset = 321083break10841085#platform: USE_ORIGINS1086case PLAYER_AMY_A1087player[2].xBoundsR = 891088player[2].frameOffset = 641089break1090#endplatform1091end switch10921093player[2].xBoundsR <<= 81094player[2].xBoundsL = player[2].xBoundsR1095FlipSign(player[2].xBoundsL)1096player[2].groundPos = player[2].xBoundsR1097player[2].groundPos *= player[2].xBoundsR1098player[2].groundPos -= 0x100001099player[2].frame = player[2].frameOffset11001101if options.vsMode == true1102player[3].type = TypeName[Player Object]1103player[3].priority = PRIORITY_ACTIVE1104#platform: USE_STANDALONE1105player[3].playerTagFrame = vs.playerID1106player[3].playerTagFrame ^= 11107player[3].playerTagFrame += 551108#endplatform1109#platform: USE_ORIGINS1110player[2].playerTagFrame = 551111player[3].playerTagFrame = 561112#endplatform1113if vs.playerID == 01114player[2].zpos = 0x10001115player[3].zpos = 0x4001116else1117player[2].zpos = 0x4001118player[3].zpos = 0x10001119end if11201121player[3].state = Player_State_Ground1122#platform: USE_ORIGINS1123player[3].controlMode = CONTROLMODE_P21124#endplatform1125player[3].stateInput = Player_Input_VSPlayer_2P1126switch vs.player2Type1127case PLAYER_SONIC_A1128player[3].xBoundsR = 881129player[3].frameOffset = 01130break11311132case PLAYER_TAILS_A1133player[3].xBoundsR = 901134player[3].frameOffset = 161135break11361137case PLAYER_KNUCKLES_A1138player[3].xBoundsR = 881139player[3].frameOffset = 321140break11411142#platform: USE_ORIGINS1143case PLAYER_AMY_A1144player[3].xBoundsR = 891145player[3].frameOffset = 641146break1147#endplatform1148end switch11491150player[3].xBoundsR <<= 81151player[3].xBoundsL = player[3].xBoundsR1152FlipSign(player[3].xBoundsL)1153player[3].groundPos = player[3].xBoundsR1154player[3].groundPos *= player[3].xBoundsR1155player[3].groundPos -= 0x100001156player[3].frame = player[3].frameOffset11571158stage.player2Enabled = false1159playerCount = 21160CallNativeFunction2(ReceiveEntity, 0x400, true)1161ResetObjectEntity(0x400, TypeName[Blank Object], 0, 0, 0)1162end if11631164if stage.player2Enabled == true1165player[3].type = TypeName[Player Object]1166player[3].priority = PRIORITY_ACTIVE1167player[3].zpos = 0x4001168player[3].state = Player_State_Ground1169#platform: USE_ORIGINS1170object[3].controlMode = CONTROLMODE_P21171#endplatform1172player[3].stateInput = Player_Input_AI_Follow1173player[3].xBoundsR = 901174player[3].frameOffset = 161175player[3].xBoundsR <<= 81176player[3].xBoundsL = player[3].xBoundsR1177FlipSign(player[3].xBoundsL)1178player[3].groundPos = player[3].xBoundsR1179player[3].groundPos *= player[3].xBoundsR1180player[3].groundPos -= 0x100001181player[3].frame = player[3].frameOffset1182#platform: USE_ORIGINS1183AssignInputSlotToDevice(2, -1)1184#endplatform1185end if1186end event118711881189// ========================1190// Editor Events1191// ========================11921193event RSDKDraw1194DrawSprite(0)1195end event119611971198event RSDKLoad1199LoadSpriteSheet("Global/Display.gif")1200SpriteFrame(-16, -16, 32, 32, 1, 143)12011202SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")1203end event120412051206