Path: blob/master/Sonic 2/Scripts/HTZ/BreakBlock.txt
1478 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Break Block Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias 0 : BREAKBLOCK_BLOCK12private alias 1 : BREAKBLOCK_FRAGMENT131415// Player Aliases16private alias object.yvel : player.yvel17private alias object.gravity : player.gravity18private alias object.animation : player.animation19private alias object.collisionPlane : player.collisionPlane2021private alias object.value16 : player.isSidekick22private alias object.value19 : player.badnikBonus23private alias object.value40 : player.hitboxLeft24private alias object.value38 : player.hitboxTop25private alias object.value41 : player.hitboxRight26private alias object.value39 : player.hitboxBottom2728// Debug Mode aliases29private alias object.value17 : debugMode.currentSelection3031// Global Variable ID Aliases32private alias 22 : GLOBAL_PLAYERSCORE333435// ========================36// Function Declarations37// ========================3839reserve function BreakBlock_DebugDraw40reserve function BreakBlock_DebugSpawn414243// ========================44// Static Values45// ========================4647private value BreakBlock_debugStartID = 048private value BreakBlock_groundOffset = 049private value BreakBlock_playerHit = 0 // Introduced in Origins Plus, because using a temp value wasn't good enough505152// ========================53// Tables54// ========================5556private table BreakBlock_fragmentVels57-0x10000, -0x80000580x10000, -0x8000059-0xE000, -0x70000600xE000, -0x7000061-0xC000, -0x60000620xC000, -0x6000063-0xA000, -0x50000640xA000, -0x5000065-0x8000, -0x40000660x8000, -0x4000067end table686970// ========================71// Function Definitions72// ========================7374private function BreakBlock_DebugDraw75temp0 = debugMode.currentSelection76temp0 -= BreakBlock_debugStartID77DrawSprite(temp0)78end function798081private function BreakBlock_DebugSpawn82temp0 = debugMode.currentSelection83temp0 -= BreakBlock_debugStartID84temp0 |= 0x80 // Set it to be on 185CreateTempObject(TypeName[Break Block], temp0, object.xpos, object.ypos)86end function878889// ========================90// Events91// ========================9293event ObjectUpdate94switch object.state95case BREAKBLOCK_BLOCK96foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)97temp1 = object.propertyValue98temp1 &= 0x7F99if temp1 == 0100temp0 = 4101else102temp0 = 5103temp0 -= temp1104end if105temp0 <<= 3106temp1 = temp0107FlipSign(temp0)108109#platform: USE_STANDALONE110if player[currentPlayer].animation != ANI_JUMPING111temp0 += BreakBlock_groundOffset112end if113114BoxCollisionTest(C_SOLID, object.entityPos, -16, temp0, 16, temp1, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)115if checkResult == COL_TOP116if player[currentPlayer].animation == ANI_JUMPING117#endplatform118#platform: USE_ORIGINS119BreakBlock_playerHit = false120121if player[currentPlayer].animation == ANI_JUMPING122BreakBlock_playerHit = true123end if124125if player[currentPlayer].animation == ANI_HAMMER_JUMP126BreakBlock_playerHit = 2127end if128129if BreakBlock_playerHit == false130temp0 += BreakBlock_groundOffset131end if132133if BreakBlock_playerHit != 2134BoxCollisionTest(C_SOLID, object.entityPos, -16, temp0, 16, temp1, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)135else136BoxCollisionTest(C_SOLID, object.entityPos, -16, temp0, 16, temp1, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)137end if138139if checkResult == true140if BreakBlock_playerHit != false141#endplatform142GetBit(temp3, object.propertyValue, 7)143CheckEqual(player[currentPlayer].collisionPlane, 1)144temp3 |= checkResult145if temp3 == true146player[currentPlayer].yvel = 0147player[currentPlayer].gravity = GRAVITY_AIR148temp0 += 8149temp0 <<= 16150temp0 += object.ypos151152temp3 = object.propertyValue153temp3 &= 0x7F154temp4 = 5155temp4 += temp3156temp5 = temp3157temp5 <<= 2158while temp3 < 5159CreateTempObject(TypeName[Break Block], temp4, object.xpos, temp0)160object[tempObjectPos].ixpos -= 8161GetTableValue(object[tempObjectPos].xvel, temp5, BreakBlock_fragmentVels)162temp5++163GetTableValue(object[tempObjectPos].yvel, temp5, BreakBlock_fragmentVels)164temp5++165object[tempObjectPos].state = BREAKBLOCK_FRAGMENT166object[tempObjectPos].drawOrder = 5167168CreateTempObject(TypeName[Break Block], temp4, object.xpos, temp0)169object[tempObjectPos].ixpos += 8170GetTableValue(object[tempObjectPos].xvel, temp5, BreakBlock_fragmentVels)171temp5++172GetTableValue(object[tempObjectPos].yvel, temp5, BreakBlock_fragmentVels)173temp5++174object[tempObjectPos].state = BREAKBLOCK_FRAGMENT175object[tempObjectPos].drawOrder = 5176temp0 += 0x100000177178temp3++179temp4++180loop181182CreateTempObject(TypeName[Object Score], player[currentPlayer].badnikBonus, object.xpos, object.ypos)183object[tempObjectPos].drawOrder = 5184185// Decrease the object's height, and shift it down to match186object.propertyValue++187object.ypos += 0x80000188189temp0 = object.propertyValue190temp0 &= 0x7F191if temp0 >= 5192// If the object's height is 0 now, then remove it193object.type = TypeName[Blank Object]194end if195196// global variable "array" (yes, this is actually how its done)197arrayPos0 = GLOBAL_PLAYERSCORE198#platform: USE_DECOMP199arrayPos0 = VarName[player.score]200#endplatform201if player[currentPlayer].isSidekick == false202arrayPos0 += currentPlayer203end if204205switch player[currentPlayer].badnikBonus206case 0207global[arrayPos0] += 100208break209210case 1211global[arrayPos0] += 200212break213214case 2215global[arrayPos0] += 500216break217218case 3219case 4220case 5221case 6222case 7223case 8224case 9225case 10226case 11227case 12228case 13229case 14230global[arrayPos0] += 1000231break232233case 15234global[arrayPos0] += 10000235break236237end switch238239if player[currentPlayer].gravity == GRAVITY_AIR240if player[currentPlayer].badnikBonus < 15241player[currentPlayer].badnikBonus++242end if243end if244245PlaySfx(SfxName[Block Break], false)246end if247end if248end if249next250break251252case BREAKBLOCK_FRAGMENT253object.xpos += object.xvel254object.ypos += object.yvel255object.yvel += 0x1800256257if object.outOfBounds == true258object.type = TypeName[Blank Object]259end if260break261262end switch263end event264265266event ObjectDraw267temp0 = object.propertyValue268temp0 &= 0x7F269DrawSprite(temp0)270end event271272273event ObjectStartup274CheckCurrentStageFolder("Zone05")275if checkResult == true276LoadSpriteSheet("HTZ/Objects.gif")277SpriteFrame(-16, -40, 32, 80, 69, 1)278SpriteFrame(-16, -32, 32, 64, 69, 17)279SpriteFrame(-16, -24, 32, 48, 69, 33)280SpriteFrame(-16, -16, 32, 32, 69, 49)281SpriteFrame(-16, -8, 32, 16, 69, 65)282SpriteFrame(-8, -8, 16, 16, 69, 1)283SpriteFrame(-8, -8, 16, 16, 69, 17)284SpriteFrame(-8, -8, 16, 16, 69, 33)285SpriteFrame(-8, -8, 16, 16, 69, 49)286SpriteFrame(-8, -8, 16, 16, 69, 65)287BreakBlock_groundOffset = 0288else289LoadSpriteSheet("MBZ/Objects.gif")290SpriteFrame(-16, -40, 32, 80, 105, 687)291SpriteFrame(-16, -32, 32, 64, 105, 703)292SpriteFrame(-16, -24, 32, 48, 105, 719)293SpriteFrame(-16, -16, 32, 32, 105, 735)294SpriteFrame(-16, -8, 32, 16, 105, 751)295SpriteFrame(-8, -8, 16, 16, 105, 687)296SpriteFrame(-8, -8, 16, 16, 105, 703)297SpriteFrame(-8, -8, 16, 16, 105, 719)298SpriteFrame(-8, -8, 16, 16, 105, 735)299SpriteFrame(-8, -8, 16, 16, 105, 751)300BreakBlock_groundOffset = -8301end if302303temp0 = 0304BreakBlock_debugStartID = DebugMode_ObjCount305while temp0 < 5306SetTableValue(TypeName[Break Block], DebugMode_ObjCount, DebugMode_TypesTable)307SetTableValue(BreakBlock_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)308SetTableValue(BreakBlock_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)309DebugMode_ObjCount++310temp0++311loop312end event313314315// ========================316// Editor Events317// ========================318319event RSDKEdit320if editor.returnVariable == true321switch editor.variableID322case EDIT_VAR_PROPVAL // property value323checkResult = object.propertyValue324break325326case 0 // size327checkResult = object.propertyValue328checkResult &= 0x7F329break330331case 1 // collisionPlane332GetBit(checkResult, object.propertyValue, 7)333break334335end switch336else337switch editor.variableID338case EDIT_VAR_PROPVAL // property value339object.propertyValue = editor.variableValue340break341342case 0 // size343editor.variableValue &= 0x7F344object.propertyValue &= 0x80345object.propertyValue |= temp0346break347348case 1 // collisionPlane349CheckNotEqual(editor.variableValue, false)350SetBit(object.propertyValue, 7, checkResult)351break352353end switch354end if355end event356357358event RSDKDraw359temp0 = object.propertyValue360temp0 &= 0x7F361DrawSprite(temp0)362end event363364365event RSDKLoad366CheckCurrentStageFolder("Zone05")367if checkResult == true368LoadSpriteSheet("HTZ/Objects.gif")369SpriteFrame(-16, -40, 32, 80, 69, 1)370SpriteFrame(-16, -32, 32, 64, 69, 17)371SpriteFrame(-16, -24, 32, 48, 69, 33)372SpriteFrame(-16, -16, 32, 32, 69, 49)373SpriteFrame(-16, -8, 32, 16, 69, 65)374else375LoadSpriteSheet("MBZ/Objects.gif")376SpriteFrame(-16, -40, 32, 80, 105, 687)377SpriteFrame(-16, -32, 32, 64, 105, 703)378SpriteFrame(-16, -24, 32, 48, 105, 719)379SpriteFrame(-16, -16, 32, 32, 105, 735)380SpriteFrame(-16, -8, 32, 16, 105, 751)381end if382383AddEditorVariable("size")384SetActiveVariable("size")385AddEnumVariable("5 Blocks", 0)386AddEnumVariable("4 Blocks", 1)387AddEnumVariable("3 Blocks", 2)388AddEnumVariable("2 Blocks", 3)389AddEnumVariable("1 Block", 4)390391AddEditorVariable("collisionPlane")392SetActiveVariable("collisionPlane")393AddEnumVariable("Plane A", 0)394AddEnumVariable("Plane B", 1)395end event396397398