Path: blob/master/Sonic 2/Scripts/CNZ/TargetBumper.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Target 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.bounceCount15private alias object.value4 : object.frameOffset16private alias object.value5 : object.comboType17private alias object.value6 : object.playerTimers1819// States20private alias 0 : TARGETBUMPER_IDLE21private alias 1 : TARGETBUMPER_BUMPED2223// Player Aliases24private alias object.state : player.state25private alias object.xpos : player.xpos26private alias object.ypos : player.ypos27private alias object.xvel : player.xvel28private alias object.yvel : player.yvel29private alias object.speed : player.speed30private alias object.gravity : player.gravity31private alias object.animation : player.animation32private alias object.tileCollisions : player.tileCollisions3334private alias object.value1 : player.timer35private alias object.value16 : player.isSidekick // 0/false is player 1, 1/true if player 236private alias object.value17 : debugMode.currentSelection37private alias object.value36 : player.flyCarryTimer // Tails assist lockout timer3839// Global Variable ID Aliases40private alias 22 : GLOBAL_PLAYERSCORE414243// ========================44// Function Declarations45// ========================4647reserve function TargetBumper_DebugDraw48reserve function TargetBumper_DebugSpawn49reserve function TargetBumper_ProcessHit5051// ========================52// Static Values53// ========================5455private value TargetBumper_startDebugID = 0565758// ========================59// Function Definitions60// ========================6162private function TargetBumper_DebugDraw63temp0 = debugMode[0].currentSelection64temp0 -= TargetBumper_startDebugID65temp1 = object.direction66switch temp067case 068object.direction = FLIP_NONE69temp0 = 070break7172case 173object.direction = FLIP_NONE74temp0 = 375break7677case 278object.direction = FLIP_X79temp0 = 380break8182case 383object.direction = FLIP_NONE84temp0 = 685break8687case 488object.direction = FLIP_X89temp0 = 690break9192end switch9394DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)95object.direction = temp196end function979899private function TargetBumper_DebugSpawn100temp0 = debugMode[0].currentSelection101temp0 -= TargetBumper_startDebugID102CreateTempObject(TypeName[Target Bumper], temp0, object.xpos, object.ypos)103104object[tempObjectPos].drawOrder = 4105switch object[tempObjectPos].propertyValue106case 0107object[tempObjectPos].direction = FLIP_NONE108object[tempObjectPos].frameOffset = 0109object[tempObjectPos].offset.x = 0110object[tempObjectPos].offset.y = 0x20000111break112113case 1114object[tempObjectPos].direction = FLIP_NONE115object[tempObjectPos].frameOffset = 3116object[tempObjectPos].offset.x = -0x20000117object[tempObjectPos].offset.y = 0x20000118break119120case 2121object[tempObjectPos].direction = FLIP_X122object[tempObjectPos].frameOffset = 3123object[tempObjectPos].offset.x = 0x20000124object[tempObjectPos].offset.y = 0x20000125break126127case 3128object[tempObjectPos].direction = FLIP_NONE129object[tempObjectPos].frameOffset = 6130object[tempObjectPos].offset.x = -0x20000131object[tempObjectPos].offset.y = 0132break133134case 4135object[tempObjectPos].direction = FLIP_X136object[tempObjectPos].frameOffset = 6137object[tempObjectPos].offset.x = 0x20000138object[tempObjectPos].offset.y = 0139break140141end switch142end function143144145private function TargetBumper_ProcessHit146switch object.propertyValue147case 0148object.xvel = player[currentPlayer].xvel149if player[currentPlayer].ypos > object.ypos150object.yvel = 0x70000151else152object.yvel = -0x70000153end if154break155156case 1157ATan2(temp0, player[currentPlayer].xvel, player[currentPlayer].yvel)158temp0 -= 96159temp1 = temp0160Abs(temp1)161FlipSign(temp0)162temp0 += 96163temp2 = temp1164temp2 &= 0xFF165if temp2 >= 64166temp1 -= 128167FlipSign(temp1)168temp2 = temp1169temp2 &= 0xFF170if temp2 >= 56171temp0 = 96172temp0 += 128173end if174else175if temp2 >= 56176temp0 = 96177end if178end if179temp0 &= 0xFF180Cos256(object.xvel, temp0)181Sin256(object.yvel, temp0)182object.xvel *= -0x700183object.yvel *= -0x700184break185186case 2187ATan2(temp0, player[currentPlayer].xvel, player[currentPlayer].yvel)188temp0 -= 32189temp1 = temp0190Abs(temp1)191FlipSign(temp0)192temp0 += 32193temp2 = temp1194temp2 &= 0xFF195if temp2 >= 64196temp1 -= 128197FlipSign(temp1)198temp2 = temp1199temp2 &= 0xFF200if temp2 >= 56201temp0 = 32202temp0 += 128203end if204else205if temp2 >= 56206temp0 = 32207end if208end if209temp0 &= 0xFF210Cos256(object.xvel, temp0)211Sin256(object.yvel, temp0)212object.xvel *= -0x700213object.yvel *= -0x700214break215216case 3217object.yvel = player[currentPlayer].yvel218if player[currentPlayer].xpos > object.xpos219object.xvel = 0x70000220else221object.xvel = -0x70000222end if223break224225case 4226object.yvel = player[currentPlayer].yvel227if player[currentPlayer].xpos > object.xpos228object.xvel = 0x70000229else230object.xvel = -0x70000231end if232break233234end switch235236if player[currentPlayer].state == Player_State_Carried237player[1].flyCarryTimer = 30238end if239240CheckEqual(player[currentPlayer].animation, ANI_GLIDING)241temp2 = checkResult242CheckEqual(player[currentPlayer].animation, ANI_GLIDING_STOP)243temp2 |= checkResult244CheckEqual(player[currentPlayer].animation, ANI_FLYING)245temp2 |= checkResult246CheckEqual(player[currentPlayer].state, Player_State_TubeRoll)247temp2 |= checkResult248CheckEqual(player[currentPlayer].state, Player_State_TubeAirRoll)249temp2 |= checkResult250if temp2 == false251#platform: USE_STANDALONE252player[currentPlayer].state = Player_State_Air253#endplatform254#platform: USE_ORIGINS255player[currentPlayer].state = Player_State_Air_NoDropDash256#endplatform257// Bug Details:258// This code wasn't updated in Origins Plus to include ANI_HAMMER_JUMP, so259// Amy will always start walking if she hits a Bumper with her hammer out260if player[currentPlayer].animation != ANI_JUMPING261if player[currentPlayer].animation != ANI_RUNNING262player[currentPlayer].animation = ANI_WALKING263end if264end if265end if266267if player[currentPlayer].animation == ANI_GLIDING268if object.xvel > 0269if player[currentPlayer].xvel < 0270player[currentPlayer].animation = ANI_GLIDING_DROP271player[currentPlayer].state = Player_State_GlideDrop272else273player[currentPlayer].state = Player_State_GlideRight274end if275else276if player[currentPlayer].xvel > 0277player[currentPlayer].animation = ANI_GLIDING_DROP278player[currentPlayer].state = Player_State_GlideDrop279else280player[currentPlayer].state = Player_State_GlideLeft281end if282end if283end if284285player[currentPlayer].xvel = object.xvel286player[currentPlayer].speed = player[currentPlayer].xvel287if player[currentPlayer].animation == ANI_GLIDING288if object.xvel < 0289FlipSign(player[currentPlayer].speed)290end if291end if292293player[currentPlayer].timer = 0294player[currentPlayer].yvel = object.yvel295player[currentPlayer].gravity = GRAVITY_AIR296player[currentPlayer].tileCollisions = true297end function298299300// ========================301// Events302// ========================303304event ObjectUpdate305if object.state > TARGETBUMPER_IDLE306object.animationTimer = object.timer307object.animationTimer >>= 2308object.animationTimer++309310object.timer++311if object.timer > 12312object.timer = 0313object.state = TARGETBUMPER_IDLE314object.animationTimer = 0315if object.bounceCount > 2316object.type = TypeName[Blank Object]317end if318end if319end if320321if object.visible == true322temp7 = 0323foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)324temp6 = object.playerTimers325temp6 >>= temp7326temp6 &= 0xFF327if temp6 == false328switch object.propertyValue329case 0330BoxCollisionTest(C_TOUCH, object.entityPos, -14, -4, 14, 4, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)331break332333case 1334BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)335break336337case 2338BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)339break340341case 3342BoxCollisionTest(C_TOUCH, object.entityPos, -4, -14, 4, 14, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)343break344345case 4346BoxCollisionTest(C_TOUCH, object.entityPos, -4, -14, 4, 14, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)347break348end switch349350if checkResult == true351if object.state == TARGETBUMPER_IDLE352PlaySfx(SfxName[Target Bumper], false)353if object.bounceCount < 3354switch object.comboType355case 0356CheckNotEqual(object[+1].type, TypeName[Target Bumper])357temp0 = checkResult358CheckNotEqual(object[+2].type, TypeName[Target Bumper])359temp0 &= checkResult360break361362case 1363CheckNotEqual(object[-1].type, TypeName[Target Bumper])364temp0 = checkResult365CheckNotEqual(object[+1].type, TypeName[Target Bumper])366temp0 &= checkResult367break368369case 2370CheckNotEqual(object[-1].type, TypeName[Target Bumper])371temp0 = checkResult372CheckNotEqual(object[-2].type, TypeName[Target Bumper])373temp0 &= checkResult374break375end switch376377CheckEqual(object.bounceCount, 2)378temp0 &= checkResult379380// global variable "array" (yes, this is actually how its done)381arrayPos0 = GLOBAL_PLAYERSCORE382#platform: USE_DECOMP383arrayPos0 = VarName[player.score]384#endplatform385if player[currentPlayer].isSidekick == false386arrayPos0 += currentPlayer387end if388389if temp0 == false390CreateTempObject(TypeName[Object Score], 16, object.xpos, object.ypos)391global[arrayPos0] += 10392else393CreateTempObject(TypeName[Object Score], 2, object.xpos, object.ypos)394global[arrayPos0] += 500395end if396object.bounceCount++397end if398399CallFunction(TargetBumper_ProcessHit)400else401if object.timer > 5402PlaySfx(SfxName[Target Bumper], false)403CallFunction(TargetBumper_ProcessHit)404end if405end if406object.state = TARGETBUMPER_BUMPED407408object.priority = PRIORITY_ACTIVE409temp6 = 3410temp6 <<= temp7411object.playerTimers |= temp6412end if413else414temp5 = 1415temp5 <<= temp7416object.playerTimers -= temp5417end if418temp7 += 8419next420end if421end event422423424event ObjectDraw425if object.visible == true426temp0 = object.animationTimer427temp0 &= 1428429object.frame = object.frameOffset430if object.bounceCount < 2431object.frame += object.bounceCount432else433object.frame += 2434end if435436if temp0 == 0437DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)438else439temp1 = object.xpos440temp1 += object.offset.x441temp2 = object.ypos442temp2 += object.offset.y443DrawSpriteFX(object.frame, FX_FLIP, temp1, temp2)444end if445end if446end event447448449event ObjectStartup450LoadSpriteSheet("CNZ/Objects.gif")451SpriteFrame(-16, -6, 32, 12, 1, 166) // Green (V) - #0452SpriteFrame(-16, -6, 32, 12, 1, 153) // Yellow (V) - #1453SpriteFrame(-16, -6, 32, 12, 1, 140) // Red (V) - #2454455SpriteFrame(-12, -12, 24, 24, 1, 229) // Green (D) - #3456SpriteFrame(-12, -12, 24, 24, 1, 204) // Yellow (D) - #4457SpriteFrame(-12, -12, 24, 24, 1, 179) // Red (D) - #5458459SpriteFrame(-6, -16, 12, 32, 60, 140) // Green (H) - #6460SpriteFrame(-6, -16, 12, 32, 47, 140) // Yellow (H) - #7461SpriteFrame(-6, -16, 12, 32, 34, 140) // Red (H) - #8462463foreach (TypeName[Target Bumper], arrayPos0, ALL_ENTITIES)464object[arrayPos0].comboType = object[arrayPos0].propertyValue465object[arrayPos0].comboType >>= 6466467// Orientation468object[arrayPos0].propertyValue &= 0x3F469switch object[arrayPos0].propertyValue470case 0471object[arrayPos0].direction = FACING_RIGHT472object[arrayPos0].frameOffset = 0473object[arrayPos0].offset.x = 0474object[arrayPos0].offset.y = 0x20000475break476477case 1478object[arrayPos0].direction = FACING_RIGHT479object[arrayPos0].frameOffset = 3480object[arrayPos0].offset.x = -0x20000481object[arrayPos0].offset.y = 0x20000482break483484case 2485object[arrayPos0].direction = FACING_LEFT486object[arrayPos0].frameOffset = 3487object[arrayPos0].offset.x = 0x20000488object[arrayPos0].offset.y = 0x20000489break490491case 3492object[arrayPos0].direction = FACING_RIGHT493object[arrayPos0].frameOffset = 6494object[arrayPos0].offset.x = -0x20000495object[arrayPos0].offset.y = 0496break497498case 4499object[arrayPos0].direction = FACING_LEFT500object[arrayPos0].frameOffset = 6501object[arrayPos0].offset.x = 0x20000502object[arrayPos0].offset.y = 0503break504505end switch506next507508temp0 = 0509TargetBumper_startDebugID = DebugMode_ObjCount510while temp0 < 5511SetTableValue(TypeName[Target Bumper], DebugMode_ObjCount, DebugMode_TypesTable)512SetTableValue(TargetBumper_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)513SetTableValue(TargetBumper_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)514DebugMode_ObjCount++515temp0++516loop517end event518519520// ========================521// Editor Events522// ========================523524event RSDKEdit525if editor.returnVariable == true526switch editor.variableID527case EDIT_VAR_PROPVAL // property value528checkResult = object.propertyValue529break530531case 0 // type532checkResult = object.propertyValue533checkResult &= 0x3F534break535536case 1 // comboType537checkResult = object.propertyValue538checkResult >>= 6539break540541end switch542else543switch editor.variableID544case EDIT_VAR_PROPVAL // property value545object.propertyValue = editor.variableValue546break547548case 0 // type549editor.variableValue &= 0x3F550object.propertyValue &= 0xC0551552object.propertyValue |= editor.variableValue553break554555case 1 // comboType556editor.variableValue &= 3557editor.variableValue <<= 6558object.propertyValue &= 0x3F559560object.propertyValue |= editor.variableValue561break562563end switch564end if565end event566567568event RSDKDraw569temp0 = object.propertyValue570temp0 &= 0x3F571572switch temp0573case 0574default575object.direction = FLIP_NONE576object.frame = 0577break578579case 1580object.direction = FLIP_NONE581object.frame = 1582break583584case 2585object.direction = FLIP_X586object.frame = 1587break588589case 3590object.direction = FLIP_NONE591object.frame = 2592break593594case 4595object.direction = FLIP_X596object.frame = 2597break598599end switch600601DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)602603if editor.showGizmos == true604editor.drawingOverlay = true605606// Draw lines to this Bumper's combo set607608// First, find combo type609temp0 = object.propertyValue610temp0 >>= 6611612// Now, jump as needed613// -> case 3, the standalone type, won't do anything here614switch temp0615case 0616DrawArrow(object.xpos, object.ypos, object[+1].xpos, object[+1].ypos, 255, 255, 0)617DrawArrow(object.xpos, object.ypos, object[+2].xpos, object[+2].ypos, 255, 255, 0)618break619620case 1621DrawArrow(object.xpos, object.ypos, object[-1].xpos, object[-1].ypos, 255, 255, 0)622DrawArrow(object.xpos, object.ypos, object[+1].xpos, object[+1].ypos, 255, 255, 0)623break624625case 2626DrawArrow(object.xpos, object.ypos, object[-1].xpos, object[-1].ypos, 255, 255, 0)627DrawArrow(object.xpos, object.ypos, object[-2].xpos, object[-2].ypos, 255, 255, 0)628break629630end switch631632editor.drawingOverlay = false633end if634end event635636637event RSDKLoad638LoadSpriteSheet("CNZ/Objects.gif")639SpriteFrame(-16, -6, 32, 12, 1, 166) // Green (V) - #0640SpriteFrame(-12, -12, 24, 24, 1, 229) // Green (D) - #1641SpriteFrame(-6, -16, 12, 32, 60, 140) // Green (H) - #2642643AddEditorVariable("type")644SetActiveVariable("type")645AddEnumVariable("Vertical", 0)646AddEnumVariable("Diagonal (Right)", 1)647AddEnumVariable("Diagonal (Left)", 2)648AddEnumVariable("Horizontal (Right)", 3)649AddEnumVariable("Horizontal (Left)", 4)650651AddEditorVariable("comboType")652SetActiveVariable("comboType")653AddEnumVariable("Left (slot+1 & slot+2 are required)", 0)654AddEnumVariable("Middle (slot-1 & slot+1 are required)", 1)655AddEnumVariable("Right (slot-1 & slot-2 are required)", 2)656AddEnumVariable("Standalone", 3)657end event658659660