Path: blob/master/Sonic 2/Scripts/Enemies/SpinyWall.txt
1482 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Spiny Wall Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.startPos.x12private alias object.value1 : object.startPos.y13private alias object.value2 : object.dirChangeTimer14private alias object.value3 : object.shootTimer15private alias object.value4 : object.shotVelocity16private alias object.value5 : object.targetDistance1718private alias 0 : SPINYWALL_MOVING19private alias 1 : SPINYWALL_IDLE2021// Player Aliases22private alias object.xpos : player.xpos23private alias object.value40 : player.hitboxLeft24private alias object.value38 : player.hitboxTop25private alias object.value41 : player.hitboxRight26private alias object.value39 : player.hitboxBottom272829// ========================30// Function Declarations31// ========================3233reserve function SpinyWall_Setup34reserve function SpinyWall_DebugDraw35reserve function SpinyWall_DebugSpawn36373839// ========================40// Function Definitions41// ========================4243private function SpinyWall_Setup44object[arrayPos0].xpos = object[arrayPos0].startPos.x45object[arrayPos0].ypos = object[arrayPos0].startPos.y46object[arrayPos0].dirChangeTimer = 25647object[arrayPos0].shootTimer = 12848object[arrayPos0].frame = 049object[arrayPos0].animationTimer = 050object[arrayPos0].state = 051object[arrayPos0].direction = object[arrayPos0].propertyValue52object[arrayPos0].yvel = -0x400053object[arrayPos0].priority = PRIORITY_BOUNDS54end function555657private function SpinyWall_DebugDraw58DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)59end function606162private function SpinyWall_DebugSpawn63CreateTempObject(TypeName[Spiny Wall], temp0, object.xpos, object.ypos)64object[tempObjectPos].startPos.x = object.xpos65object[tempObjectPos].startPos.y = object.ypos66arrayPos0 = object[tempObjectPos].entityPos67object[tempObjectPos].propertyValue = object.direction68CallFunction(SpinyWall_Setup)69end function707172// ========================73// Events74// ========================7576event ObjectUpdate77object.priority = PRIORITY_ACTIVE78switch object.state79case SPINYWALL_MOVING80object.dirChangeTimer--81if object.dirChangeTimer <= 082object.dirChangeTimer = 25683object.shootTimer = 12884FlipSign(object.yvel)85object.direction ^= FLIP_Y86end if8788object.ypos += object.yvel8990object.animationTimer++91if object.animationTimer == 1092object.animationTimer = 093object.frame ^= 194end if9596if object.shootTimer == 097object.targetDistance = 0x7FFFFFFF98foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)99BoxCollisionTest(C_TOUCH, object.entityPos, -96, -256, 96, 256, currentPlayer, 1, 1, 1, 1)100if checkResult == true101object.shootTimer = 40102object.frame = 2103object.state = 1104temp0 = object.xpos105temp0 -= player[currentPlayer].xpos106Abs(temp0)107if temp0 < object.targetDistance108object.targetDistance = temp0109if player[currentPlayer].xpos > object.xpos110object.shotVelocity = 0x30000111else112object.shotVelocity = -0x30000113end if114end if115end if116next117else118object.shootTimer--119end if120break121122case SPINYWALL_IDLE123object.shootTimer--124if object.shootTimer == 20125CreateTempObject(TypeName[Spiny Shot], 0, object.xpos, object.ypos)126object[tempObjectPos].xvel = object.shotVelocity127object[tempObjectPos].drawOrder = 2128end if129130if object.shootTimer < 0131object.shootTimer = 64132object.frame = 0133object.state = 0134end if135break136137end switch138139if object.outOfBounds == true140temp0 = object.xpos141temp1 = object.ypos142object.xpos = object.startPos.x143object.ypos = object.startPos.y144if object.outOfBounds == true145arrayPos0 = object.entityPos146CallFunction(SpinyWall_Setup)147else148object.xpos = temp0149object.ypos = temp1150end if151end if152153foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)154BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)155if checkResult == true156CallFunction(Player_BadnikBreak)157end if158next159end event160161162event ObjectDraw163DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)164end event165166167event ObjectStartup168LoadSpriteSheet("CPZ/Objects.gif") // this was probably meant to be removed when MBZ became a thing, makes no real difference whether its here or not though169170CheckCurrentStageFolder("Zone02")171if checkResult == true172LoadSpriteSheet("CPZ/Objects.gif")173SpriteFrame(-12, -24, 23, 48, 1, 25)174SpriteFrame(-12, -22, 23, 44, 25, 25)175SpriteFrame(-12, -24, 23, 48, 49, 25)176else177LoadSpriteSheet("MBZ/Objects.gif")178SpriteFrame(-12, -24, 23, 48, 99, 501)179SpriteFrame(-12, -22, 23, 44, 99, 550)180SpriteFrame(-12, -24, 23, 48, 99, 595)181end if182183foreach (TypeName[Spiny Wall], arrayPos0, ALL_ENTITIES)184object[arrayPos0].startPos.x = object[arrayPos0].xpos185object[arrayPos0].startPos.y = object[arrayPos0].ypos186CallFunction(SpinyWall_Setup)187next188189SetTableValue(TypeName[Spiny Wall], DebugMode_ObjCount, DebugMode_TypesTable)190SetTableValue(SpinyWall_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)191SetTableValue(SpinyWall_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)192DebugMode_ObjCount++193end event194195196// ========================197// Editor Events198// ========================199200event RSDKEdit201if editor.returnVariable == true202switch editor.variableID203case EDIT_VAR_PROPVAL // property value204checkResult = object.propertyValue205break206207case 0 // direction208GetBit(checkResult, object.propertyValue, 1)209break210211end switch212else213switch editor.variableID214case EDIT_VAR_PROPVAL // property value215object.propertyValue = editor.variableValue216break217218case 0 // direction219CheckNotEqual(editor.variableValue, 0)220SetBit(object.propertyValue, 1, checkResult)221break222223end switch224end if225end event226227228event RSDKDraw229object.direction = object.propertyValue230DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)231end event232233234event RSDKLoad235CheckCurrentStageFolder("Zone02")236if checkResult == true237LoadSpriteSheet("CPZ/Objects.gif")238SpriteFrame(-12, -24, 23, 48, 1, 25)239else240LoadSpriteSheet("MBZ/Objects.gif")241SpriteFrame(-12, -24, 23, 48, 99, 501)242end if243244AddEditorVariable("direction")245SetActiveVariable("direction")246AddEnumVariable("Left", 0)247AddEnumVariable("Right", 1)248end event249250251