Path: blob/master/Sonic 2/Scripts/Enemies/Slicer.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Slicer 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.startPos.x13private alias object.value2 : object.startPos.y14private alias object.value31 : object.wrapOffset.y1516// States17private alias 0 : SLICER_MOVING18private alias 1 : SLICER_CHECKPLAYERINRANGE19private alias 2 : SLICER_THROWARM20private alias 3 : SLICER_ARMTHROWN2122// Player Aliases23private alias object.value40 : player.hitboxLeft24private alias object.value38 : player.hitboxTop25private alias object.value41 : player.hitboxRight26private alias object.value39 : player.hitboxBottom2728// Path ID Aliases29private alias 0 : PATH_A303132// ========================33// Function Declarations34// ========================3536reserve function Slicer_Setup37reserve function Slicer_DebugDraw38reserve function Slicer_DebugSpawn394041// ========================42// Function Definitions43// ========================4445private function Slicer_Setup46object[arrayPos0].direction = object[arrayPos0].propertyValue47GetBit(temp0, object[arrayPos0].direction, 0)48if temp0 == FACING_RIGHT49object[arrayPos0].xvel = 0x400050else51object[arrayPos0].xvel = -0x400052end if5354object[arrayPos0].frame = 055object[arrayPos0].timer = 056object[arrayPos0].state = SLICER_MOVING57object[arrayPos0].priority = PRIORITY_BOUNDS58end function596061private function Slicer_DebugDraw62DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)63end function646566private function Slicer_DebugSpawn67CreateTempObject(TypeName[Slicer], object.direction, object.xpos, object.ypos)68arrayPos0 = object[tempObjectPos].entityPos69object[arrayPos0].startPos.x = object.xpos70object[arrayPos0].startPos.y = object.ypos71CallFunction(Slicer_Setup)72end function737475// ========================76// Events77// ========================7879event ObjectUpdate80switch object.state81case SLICER_MOVING82object.priority = PRIORITY_ACTIVE83object.xpos += object.xvel8485GetBit(temp0, object.direction, 1) // see if the Y flip bit is set86if temp0 == false87ObjectTileGrip(CSIDE_FLOOR, 0, 17, PATH_A)88else89ObjectTileGrip(CSIDE_ROOF, 0, -17, PATH_A)90end if9192if checkResult == false93object.state = SLICER_CHECKPLAYERINRANGE94object.timer = 6095end if9697foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)98if object.direction == FLIP_NONE99BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 128, 256, currentPlayer, -1, -1, 1, 1)100else101BoxCollisionTest(C_TOUCH, object.entityPos, -128, -256, 0, 256, currentPlayer, -1, -1, 1, 1)102end if103104if checkResult == true105object.timer = 9106object.frame = 3107object.state = SLICER_THROWARM108end if109next110111object.animationTimer++112if object.animationTimer >= 20113object.animationTimer = 0114object.frame ^= 1115end if116break117118case SLICER_CHECKPLAYERINRANGE119object.timer--120if object.timer == 0121object.direction ^= FLIP_X122FlipSign(object.xvel)123object.state = SLICER_MOVING124end if125126foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)127if object.direction == FLIP_NONE128BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 128, 256, currentPlayer, -1, -1, 1, 1)129else130BoxCollisionTest(C_TOUCH, object.entityPos, -128, -256, 0, 256, currentPlayer, -1, -1, 1, 1)131end if132133if checkResult == true134object.timer = 9135object.frame = 3136object.state = SLICER_THROWARM137end if138next139break140141case SLICER_THROWARM142object.timer--143if object.timer == 0144CreateTempObject(TypeName[Slicer Arm], 0, object.xpos, object.ypos)145object[tempObjectPos].direction = object.direction146object[tempObjectPos].startPos.x = object.entityPos147if object.direction == FLIP_NONE148object[tempObjectPos].xvel = 0x20000149object[tempObjectPos].xpos += 0x60000150else151object[tempObjectPos].xvel = -0x20000152object[tempObjectPos].xpos -= 0x60000153end if154155CreateTempObject(TypeName[Slicer Arm], 0, object.xpos, object.ypos)156object[tempObjectPos].direction = object.direction157object[tempObjectPos].startPos.x = object.entityPos158if object.direction == FLIP_NONE159object[tempObjectPos].xvel = 0x20000160object[tempObjectPos].xpos -= 0x100000161else162object[tempObjectPos].xvel = -0x20000163object[tempObjectPos].xpos += 0x100000164end if165166object.frame = 4167object.state = SLICER_ARMTHROWN168end if169break170171case SLICER_ARMTHROWN172break173174end switch175176if object.outOfBounds == true177temp0 = object.xpos178temp1 = object.ypos179object.xpos = object.startPos.x180object.ypos = object.startPos.y181object.ypos += object.wrapOffset.y182if object.outOfBounds == true183arrayPos0 = object.entityPos184CallFunction(Slicer_Setup)185else186object.xpos = temp0187object.ypos = temp1188end if189end if190191foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)192BoxCollisionTest(C_TOUCH, object.entityPos, -16, -16, 16, 16, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)193if checkResult == true194CallFunction(Player_BadnikBreak)195end if196next197end event198199200event ObjectDraw201DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)202end event203204205event ObjectStartup206CheckCurrentStageFolder("Zone09")207if checkResult == true208LoadSpriteSheet("MPZ/Objects.gif")209SpriteFrame(-16, -16, 47, 32, 29, 1)210SpriteFrame(-16, -16, 47, 32, 77, 1)211SpriteFrame(-16, -16, 47, 32, 125, 1)212SpriteFrame(-16, -32, 47, 48, 125, 34)213SpriteFrame(-17, -16, 31, 32, 92, 34)214else215LoadSpriteSheet("MBZ/Objects.gif")216SpriteFrame(-16, -16, 47, 32, 880, 256)217SpriteFrame(-16, -16, 47, 32, 928, 256)218SpriteFrame(-16, -16, 47, 32, 976, 256)219SpriteFrame(-16, -32, 47, 48, 976, 289)220SpriteFrame(-17, -16, 31, 32, 943, 289)221end if222223foreach (TypeName[Slicer], arrayPos0, ALL_ENTITIES)224object[arrayPos0].startPos.x = object[arrayPos0].xpos225object[arrayPos0].startPos.y = object[arrayPos0].ypos226object[arrayPos0].propertyValue ^= 1227CallFunction(Slicer_Setup)228next229230SetTableValue(TypeName[Slicer], DebugMode_ObjCount, DebugMode_TypesTable)231SetTableValue(Slicer_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)232SetTableValue(Slicer_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)233DebugMode_ObjCount++234end event235236237// ========================238// Editor Events239// ========================240241event RSDKEdit242if editor.returnVariable == true243switch editor.variableID244case EDIT_VAR_PROPVAL // property value245checkResult = object.propertyValue246break247248case 0 // direction249checkResult = object.propertyValue250break251252end switch253else254switch editor.variableID255case EDIT_VAR_PROPVAL // property value256object.propertyValue = editor.variableValue257break258259case 0 // direction260object.propertyValue = editor.variableValue261break262263end switch264end if265end event266267268event RSDKDraw269object.direction = object.propertyValue270object.direction ^= FLIP_X271DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)272end event273274275event RSDKLoad276CheckCurrentStageFolder("Zone09")277if checkResult == true278LoadSpriteSheet("MPZ/Objects.gif")279SpriteFrame(-16, -16, 47, 32, 29, 1)280else281LoadSpriteSheet("MBZ/Objects.gif")282SpriteFrame(-16, -16, 47, 32, 880, 256)283end if284285AddEditorVariable("direction")286SetActiveVariable("direction")287AddEnumVariable("Left", 0)288AddEnumVariable("Right", 1)289AddEnumVariable("Left (Flip Y)", 2)290AddEnumVariable("Right (Flip Y)", 3)291end event292293294