Path: blob/master/Sonic 2/Scripts/Enemies/Jellygnite.txt
1482 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Jellygnite 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.value3 : object.frontTentacleAngle15private alias object.value4 : object.tentacleOffset.x16private alias object.value5 : object.tentacleOffset.y17private alias object.value6 : object.tentaclePos.x18private alias object.value7 : object.tentaclePos.y19private alias object.value8 : object.oscillateAngle20private alias object.value9 : object.frontTentacleFrame21private alias object.value10 : object.backTentacleFrame22private alias object.value11 : object.drawIndex23private alias object.value12 : object.grabbedPlayer24private alias object.value13 : object.shakeTimer25private alias object.value14 : object.shakeCount26private alias object.value15 : object.lastShakeFlags2728// States29private alias 0 : JELLYGNITE_SWIMMING30private alias 1 : JELLYGNITE_GRABBEDPLAYER31private alias 2 : JELLYGNITE_EXPLODE3233// Animations34private alias 0 : JELLYGNITE_ANI_IDLE35private alias 1 : JELLYGNITE_ANI_GRABBED36private alias 2 : JELLYGNITE_ANI_EXPLODING3738// Player Aliases39private alias object.state : player.state40private alias object.xpos : player.xpos41private alias object.ypos : player.ypos42private alias object.xvel : player.xvel43private alias object.yvel : player.yvel44private alias object.speed : player.speed45private alias object.gravity : player.gravity46private alias object.frame : player.frame47private alias object.animationTimer : player.animationTimer48private alias object.animation : player.animation49private alias object.left : player.left50private alias object.right : player.right5152private alias object.value1 : player.timer53private alias object.value40 : player.hitboxLeft54private alias object.value38 : player.hitboxTop55private alias object.value41 : player.hitboxRight56private alias object.value39 : player.hitboxBottom5758// ========================59// Function Declarations60// ========================6162reserve function Jellygnite_DebugDraw63reserve function Jellygnite_DebugSpawn64reserve function Jellygnite_HandleGrabbedPlayer6566private function Jellygnite_DebugDraw67DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)68end function697071private function Jellygnite_DebugSpawn72CreateTempObject(TypeName[Jellygnite], 0, object.xpos, object.ypos)73object[tempObjectPos].startPos.x = object[tempObjectPos].xpos74object[tempObjectPos].startPos.y = object[tempObjectPos].ypos75object[tempObjectPos].grabbedPlayer = 0x7FFFFFFF76end function777879private function Jellygnite_HandleGrabbedPlayer80if object.grabbedPlayer != 0x7FFFFFFF81currentPlayer = object.grabbedPlayer82if object.lastShakeFlags != 083object.shakeTimer--84if object.shakeTimer == 085object.shakeCount = 086object.lastShakeFlags = 087end if8889temp0 = 090if player[currentPlayer].left != false91temp0 |= 192end if9394if player[currentPlayer].right != false95temp0 |= 296end if9798if temp0 != 099if temp0 != 3100if temp0 != object.lastShakeFlags101object.lastShakeFlags = temp0102object.shakeCount++103if object.shakeCount >= 4104#platform: USE_STANDALONE105player[currentPlayer].state = Player_State_Air106#endplatform107#platform: USE_ORIGINS108player[currentPlayer].state = Player_State_Air_NoDropDash109#endplatform110object.grabbedPlayer = 0x7FFFFFFF111else112object.shakeTimer = 32113end if114end if115end if116end if117else118if player[currentPlayer].left != false119object.lastShakeFlags |= 1120object.shakeTimer = 32121end if122123if player[currentPlayer].right != false124object.lastShakeFlags |= 2125object.shakeTimer = 32126end if127end if128129player[currentPlayer].xpos = object.xpos130player[currentPlayer].ypos = object.ypos131player[currentPlayer].ypos += 0xC0000132end if133end function134135136// ========================137// Events138// ========================139140event ObjectUpdate141switch object.state142case JELLYGNITE_SWIMMING143if object.priority != PRIORITY_XBOUNDS_DESTROY144object.priority = PRIORITY_ACTIVE145end if146147object.angle += 4148object.angle &= 0x1FF149Sin(object.frontTentacleAngle, object.angle)150object.frontTentacleAngle <<= 1151152object.oscillateAngle++153object.oscillateAngle &= 0x1FF154Sin(object.xpos, object.oscillateAngle)155object.xpos <<= 11156object.xpos += object.startPos.x157158temp1 = 0x7FFFFFFF159temp2 = 0160foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)161temp0 = object.xpos162temp0 -= player[currentPlayer].xpos163Abs(temp0)164if temp0 < temp1165temp1 = temp0166temp2 = currentPlayer167end if168next169170currentPlayer = temp2171if player[currentPlayer].ypos > stage.newWaterLevel172temp2 = player[currentPlayer].ypos173temp2 -= 0x200000174if object.ypos > temp2175object.yvel -= 0x800176if object.yvel < -0xC000177object.yvel = -0xC000178end if179else180object.yvel += 0x800181if object.yvel > 0xC000182object.yvel = 0xC000183end if184end if185else186object.yvel >>= 1187end if188object.ypos += object.yvel189break190191case JELLYGNITE_GRABBEDPLAYER192if object.frontTentacleAngle < 0x600193object.frontTentacleAngle += 0x80194else195object.state = JELLYGNITE_EXPLODE196object.animation = JELLYGNITE_ANI_EXPLODING197PlaySfx(SfxName[Electricity], false)198end if199200currentPlayer = object.grabbedPlayer201player[currentPlayer].xpos = object.xpos202player[currentPlayer].ypos = object.ypos203player[currentPlayer].ypos += 0xC0000204player[currentPlayer].frame = 0205player[currentPlayer].animationTimer = 0206break207208case JELLYGNITE_EXPLODE209CallFunction(Jellygnite_HandleGrabbedPlayer)210object.timer++211if object.timer == 60212if object.grabbedPlayer != 0x7FFFFFFF213currentPlayer = object.grabbedPlayer214if player[currentPlayer].state != Player_State_Drown215#platform: USE_STANDALONE216player[currentPlayer].state = Player_State_Air217#endplatform218#platform: USE_ORIGINS219player[currentPlayer].state = Player_State_Air_NoDropDash220#endplatform221CallFunction(Player_Hit)222end if223object.grabbedPlayer = 0x7FFFFFFF224end if225226ResetObjectEntity(object.entityPos, TypeName[Smoke Puff], 0, object.xpos, object.ypos)227object.drawOrder = 4228PlaySfx(SfxName[Destroy], false)229end if230break231232end switch233234if object.type == TypeName[Jellygnite]235if object.outOfBounds == true236temp0 = object.xpos237temp1 = object.ypos238object.xpos = object.startPos.x239object.ypos = object.startPos.y240if object.outOfBounds == true241object.animation = JELLYGNITE_ANI_IDLE242if object.priority != PRIORITY_XBOUNDS_DESTROY243object.priority = PRIORITY_BOUNDS244end if245object.state = JELLYGNITE_SWIMMING246else247object.xpos = temp0248object.ypos = temp1249end if250end if251252temp7 = object.grabbedPlayer253foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)254if currentPlayer != temp7255BoxCollisionTest(C_TOUCH, object.entityPos, -14, -14, 14, 14, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)256if checkResult == true257if object.state == JELLYGNITE_SWIMMING258if player[currentPlayer].ypos < object.ypos259CallFunction(Player_BadnikBreak)260else261object.state = JELLYGNITE_GRABBEDPLAYER262object.animation = JELLYGNITE_ANI_GRABBED263object.grabbedPlayer = currentPlayer264player[currentPlayer].xvel = 0265player[currentPlayer].yvel = 0266player[currentPlayer].speed = 0267player[currentPlayer].timer = 0268player[currentPlayer].state = Player_State_Static269player[currentPlayer].gravity = GRAVITY_AIR270player[currentPlayer].animation = ANI_GRABBED271end if272else273if player[currentPlayer].ypos < object.ypos274CallFunction(Player_BadnikBreak)275end if276end if277end if278end if279next280281if object.type == TypeName[Jellygnite]282switch object.animation283case JELLYGNITE_ANI_IDLE284object.frame = 0285object.frontTentacleFrame = 3286object.backTentacleFrame = 5287break288289case JELLYGNITE_ANI_GRABBED290object.frame = 1291object.frontTentacleFrame = 3292object.backTentacleFrame = 5293break294295case JELLYGNITE_ANI_EXPLODING296object.frame = object.animationTimer297object.frame >>= 5298299object.frontTentacleFrame = object.frame300object.frontTentacleFrame += 3301object.backTentacleFrame = object.frame302object.backTentacleFrame += 5303304object.frame++305306object.animationTimer += object.timer307object.animationTimer &= 0x3F308break309end switch310else311if temp7 != 0x7FFFFFFF312currentPlayer = temp7313if player[currentPlayer].state == Player_State_Static314#platform: USE_STANDALONE315player[currentPlayer].state = Player_State_Air316#endplatform317#platform: USE_ORIGINS318player[currentPlayer].state = Player_State_Air_NoDropDash319#endplatform320end if321end if322end if323else324if object.grabbedPlayer != 0x7FFFFFFF325currentPlayer = object.grabbedPlayer326if player[currentPlayer].state == Player_State_Static327player[currentPlayer].state = Player_State_Air328end if329end if330end if331end event332333334event ObjectDraw335if object.drawIndex == 0336// Back Tentacle337temp1 = object.angle338temp1 &= 0x1FF339temp0 = 0340temp2 = object.ypos341temp2 += 0x70000342while temp0 < 4343Cos(object.tentaclePos.x, temp1)344object.tentaclePos.x <<= 9345object.tentaclePos.x += object.xpos346347Sin(object.tentaclePos.y, temp1)348object.tentaclePos.y <<= 8349object.tentaclePos.y += temp2350351DrawSpriteXY(object.backTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)352temp0++353temp1 += 0x20354temp1 &= 0x1FF355temp2 += 0x60000356loop357AddDrawListEntityRef(4, object.entityPos)358else359// Front Tentacle360temp0 = 0361temp4 = object.frontTentacleAngle362object.tentacleOffset.x = 0363object.tentacleOffset.y = 0364while temp0 < 4365temp5 = temp4366temp5 >>= 7367temp5 &= 0x1FF368Sin(temp2, temp5)369temp2 *= 0x312370object.tentacleOffset.x += temp2371372Cos(temp3, temp5)373temp3 *= 0x312374object.tentacleOffset.y += temp3375376object.tentaclePos.x = object.tentacleOffset.x377object.tentaclePos.x += object.xpos378object.tentaclePos.x -= 0xD0000379380object.tentaclePos.y = object.tentacleOffset.y381object.tentaclePos.y += object.ypos382object.tentaclePos.y += 0x10000383384DrawSpriteXY(object.frontTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)385386object.tentaclePos.x = object.tentacleOffset.x387FlipSign(object.tentaclePos.x)388object.tentaclePos.x += object.xpos389object.tentaclePos.x += 0xD0000390DrawSpriteXY(object.frontTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)391392temp0++393temp4 += object.frontTentacleAngle394loop395396// Body397DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)398end if399400object.drawIndex ^= 1401end event402403404event ObjectStartup405LoadSpriteSheet("HPZ/Objects.gif")406SpriteFrame(-16, -16, 32, 20, 33, 123)407SpriteFrame(-16, -16, 32, 20, 66, 123)408SpriteFrame(-16, -16, 32, 20, 40, 144)409SpriteFrame(-3, -3, 6, 6, 198, 50)410SpriteFrame(-3, -3, 6, 6, 131, 97)411SpriteFrame(-3, -3, 6, 6, 33, 144)412SpriteFrame(-3, -3, 6, 6, 131, 90)413414foreach (TypeName[Jellygnite], arrayPos0, ALL_ENTITIES)415object[arrayPos0].startPos.x = object[arrayPos0].xpos416object[arrayPos0].startPos.y = object[arrayPos0].ypos417object[arrayPos0].grabbedPlayer = 0x7FFFFFFF418next419420SetTableValue(TypeName[Jellygnite], DebugMode_ObjCount, DebugMode_TypesTable)421SetTableValue(Jellygnite_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)422SetTableValue(Jellygnite_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)423DebugMode_ObjCount++424end event425426427// ========================428// Editor Events429// ========================430431event RSDKDraw432object.frame = 0433object.frontTentacleFrame = 3434object.backTentacleFrame = 5435436// Back Tentacle437temp1 = object.angle438temp1 &= 0x1FF439temp0 = 0440temp2 = object.ypos441temp2 += 0x70000442while temp0 < 4443Cos(object.tentaclePos.x, temp1)444object.tentaclePos.x <<= 9445object.tentaclePos.x += object.xpos446447Sin(object.tentaclePos.y, temp1)448object.tentaclePos.y <<= 8449object.tentaclePos.y += temp2450451DrawSpriteXY(object.backTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)452temp0++453temp1 += 0x20454temp1 &= 0x1FF455temp2 += 0x60000456loop457458// Front Tentacle459temp0 = 0460temp4 = object.frontTentacleAngle461object.tentacleOffset.x = 0462object.tentacleOffset.y = 0463while temp0 < 4464temp5 = temp4465temp5 >>= 7466temp5 &= 0x1FF467Sin(temp2, temp5)468temp2 *= 0x312469object.tentacleOffset.x += temp2470471Cos(temp3, temp5)472temp3 *= 0x312473object.tentacleOffset.y += temp3474475object.tentaclePos.x = object.tentacleOffset.x476object.tentaclePos.x += object.xpos477object.tentaclePos.x -= 0xD0000478479object.tentaclePos.y = object.tentacleOffset.y480object.tentaclePos.y += object.ypos481object.tentaclePos.y += 0x10000482483DrawSpriteXY(object.frontTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)484485object.tentaclePos.x = object.tentacleOffset.x486FlipSign(object.tentaclePos.x)487object.tentaclePos.x += object.xpos488object.tentaclePos.x += 0xD0000489DrawSpriteXY(object.frontTentacleFrame, object.tentaclePos.x, object.tentaclePos.y)490491temp0++492temp4 += object.frontTentacleAngle493loop494495// Body496DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)497end event498499500event RSDKLoad501LoadSpriteSheet("HPZ/Objects.gif")502SpriteFrame(-16, -16, 32, 20, 33, 123)503SpriteFrame(-16, -16, 32, 20, 66, 123)504SpriteFrame(-16, -16, 32, 20, 40, 144)505SpriteFrame(-3, -3, 6, 6, 198, 50)506SpriteFrame(-3, -3, 6, 6, 131, 97)507SpriteFrame(-3, -3, 6, 6, 33, 144)508SpriteFrame(-3, -3, 6, 6, 131, 90)509510SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")511end event512513514