Path: blob/master/Sonic 2/Scripts/Enemies/Ball.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Ball Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value1 : object.startPos.x12private alias object.value2 : object.startPos.y1314private alias object.value2 : object.targetPlayer // this is probably NOT meant to be value2, but the code says otherwise so it's prolly a bug1516private alias 0 : BALL_HOVER17private alias 1 : BALL_ATTACKING1819// Player Aliases20private alias object.xpos : player.xpos21private alias object.ypos : player.ypos222324// ========================25// Function Declarations26// ========================2728reserve function Ball_DebugDraw29reserve function Ball_DebugSpawn303132// ========================33// Function Definitions34// ========================3536private function Ball_DebugDraw37DrawSprite(0)38end function394041private function Ball_DebugSpawn42CreateTempObject(TypeName[Ball], 0, object.xpos, object.ypos)43object[tempObjectPos].targetPlayer = -144end function454647// ========================48// Events49// ========================5051event ObjectUpdate52object.priority = PRIORITY_ACTIVE53switch object.state54case BALL_HOVER55if object.direction == FLIP_X56object.yvel += 0x80057if object.yvel >= 0xC00058object.direction = FLIP_NONE59end if60else61object.yvel -= 0x80062if object.yvel <= -0xC00063object.direction = FLIP_X64end if65end if6667object.ypos += object.yvel6869foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)70if object.state == 071BoxCollisionTest(C_TOUCH, object.entityPos, -256, -192, 256, 192, currentPlayer, 0, 0, 0, 0)72if checkResult == true73object.targetPlayer = currentPlayer74object.state = BALL_ATTACKING75end if76end if77next78break7980case BALL_ATTACKING81currentPlayer = object.targetPlayer82if object.xpos > player[currentPlayer].xpos83object.xvel -= 0x100084if object.xvel < -0x2000085object.xvel = -0x2000086end if87else88object.xvel += 0x100089if object.xvel > 0x2000090object.xvel = 0x2000091end if92end if9394temp0 = player[currentPlayer].ypos95temp0 -= 0x40000096if object.ypos > temp097object.yvel -= 0x100098if object.yvel < -0x2000099object.yvel = -0x20000100end if101else102object.yvel += 0x1000103if object.yvel > 0x20000104object.yvel = 0x20000105end if106end if107object.xpos += object.xvel108object.ypos += object.yvel109110temp0 = object.xpos111temp0 -= player[currentPlayer].xpos112Abs(temp0)113if temp0 <= 0x100000114temp0 = player[currentPlayer].ypos115temp0 -= object.ypos116if temp0 >= 0x400000117if temp0 <= 0x600000118if object.outOfBounds == false119CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)120object[tempObjectPos].drawOrder = 4121122CreateTempObject(TypeName[Chemical Drop], 0, object.xpos, object.ypos)123object[tempObjectPos].drawOrder = 2124125object.type = TypeName[Blank Object]126PlaySfx(SfxName[Destroy], false)127end if128end if129end if130end if131132foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)133BoxCollisionTest(C_TOUCH, object.entityPos, -10, -10, 10, 10, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)134if checkResult == true135CallFunction(Player_Hit)136137CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)138object[tempObjectPos].drawOrder = 4139140CreateTempObject(TypeName[Chemical Drop], 0, object.xpos, object.ypos)141object[tempObjectPos].drawOrder = 2142143object.type = TypeName[Blank Object]144PlaySfx(SfxName[Destroy], false)145end if146next147break148149end switch150151if object.outOfBounds == true152temp0 = object.xpos153temp1 = object.ypos154object.xpos = object.startPos.x155object.ypos = object.startPos.y156if object.outOfBounds == true157object.priority = PRIORITY_BOUNDS158object.state = BALL_HOVER159object.targetPlayer = -1160else161object.xpos = temp0162object.ypos = temp1163end if164end if165166object.animationTimer++167if object.animationTimer >= 3168object.animationTimer = 0169object.frame++170if object.frame >= 3171object.frame = 0172end if173end if174end event175176177event ObjectDraw178DrawSprite(object.frame)179end event180181182event ObjectStartup183CheckCurrentStageFolder("Zone02")184if checkResult == true185LoadSpriteSheet("CPZ/Objects.gif")186SpriteFrame(-12, -12, 24, 24, 166, 1)187SpriteFrame(-12, -12, 24, 24, 166, 26)188SpriteFrame(-12, -12, 24, 24, 166, 51)189else190LoadSpriteSheet("MBZ/Objects.gif")191192// These are just duplicates of the CPZ sheet's values, so they don't line up with the actual MBZ sheet where the Ball sprites don't even exist193// -> Interestingly, this frame is also in the... Bubbler script? Strange...194SpriteFrame(-12, -12, 24, 24, 166, 1)195SpriteFrame(-12, -12, 24, 24, 166, 26)196SpriteFrame(-12, -12, 24, 24, 166, 51)197end if198199foreach (TypeName[Ball], arrayPos0, ALL_ENTITIES)200object[arrayPos0].startPos.x = object[arrayPos0].xpos201object[arrayPos0].startPos.y = object[arrayPos0].ypos202object[arrayPos0].targetPlayer = -1203next204205SetTableValue(TypeName[Ball], DebugMode_ObjCount, DebugMode_TypesTable)206SetTableValue(Ball_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)207SetTableValue(Ball_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)208DebugMode_ObjCount++209end event210211212// ========================213// Editor Events214// ========================215216event RSDKDraw217DrawSprite(0)218end event219220221event RSDKLoad222CheckCurrentStageFolder("Zone02")223if checkResult == true224LoadSpriteSheet("CPZ/Objects.gif")225SpriteFrame(-12, -12, 24, 24, 166, 1)226else227LoadSpriteSheet("MBZ/Objects.gif")228SpriteFrame(-12, -12, 24, 24, 166, 1)229end if230231SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")232end event233234235