Path: blob/master/Sonic 1/Scripts/Mission/ReviveBatbrain.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: Batbrain 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.backupPlayer14private alias object.value3 : object.targetPlayer15private alias object.value4 : object.targetDistance16private alias object.value5 : object.dropPos.y1718// States19private alias 0 : BATBRAIN_AWAITPLAYER20private alias 1 : BATBRAIN_DROPPING21private alias 2 : BATBRAIN_FLYING22private alias 3 : BATBRAIN_RETURNTOROOF23private alias 4 : BATBRAIN_REVIVE2425// Animations26private alias 0 : BATBRAIN_ANI_IDLE27private alias 1 : BATBRAIN_ANI_DROPPING28private alias 2 : BATBRAIN_ANI_FLYING2930// Player Aliases31private alias object.xpos : player.xpos32private alias object.ypos : player.ypos33private alias object.value38 : player.hitboxTop34private alias object.value39 : player.hitboxBottom35private alias object.value40 : player.hitboxLeft36private alias object.value41 : player.hitboxRight3738// Revive Enemy Aliases39private alias object.value47 : object.backupType40private alias object.value46 : object.backupState41private alias object.value0 : object.target4243// Path ID Aliases44private alias 0 : PATH_A454647// ========================48// Function Declarations49// ========================5051reserve function Batbrain_DebugDraw52reserve function Batbrain_DebugSpawn53reserve function Batbrain_CheckOutOfRange545556// ========================57// Function Definitions58// ========================5960private function Batbrain_DebugDraw61DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)62end function636465private function Batbrain_DebugSpawn66CreateTempObject(TypeName[Batbrain], 0, object.xpos, object.ypos)67object[tempObjectPos].startPos.x = object.xpos68object[tempObjectPos].startPos.y = object.ypos69end function707172private function Batbrain_CheckOutOfRange73temp1 = object.ixpos74temp1 -= screen.xoffset75CheckLower(temp1, 0)76temp0 = checkResult7778CheckGreater(temp1, screen.xsize)79temp0 |= checkResult8081temp1 = object.iypos82temp1 -= screen.yoffset83CheckLower(temp1, 0)84temp0 |= checkResult8586CheckGreater(temp1, screen.ysize)87checkResult |= temp088end function899091// ========================92// Events93// ========================949596event ObjectUpdate97switch object.state98case BATBRAIN_AWAITPLAYER99object.priority = PRIORITY_ACTIVE100object.targetDistance = 0x7FFFFFFF101object.backupPlayer = 0102object.targetPlayer = 0xFFFF103104foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)105temp0 = player[currentPlayer].xpos106temp0 -= object.xpos107Abs(temp0)108if temp0 < object.targetDistance109object.targetDistance = temp0110object.backupPlayer = currentPlayer111end if112113if temp0 < 0x800000114if player[currentPlayer].ypos >= object.ypos115if object.targetPlayer != 0xFFFF116arrayPos0 = object.targetPlayer117if player[currentPlayer].ypos < player[arrayPos0].ypos118object.targetPlayer = currentPlayer119end if120else121object.targetPlayer = currentPlayer122end if123end if124end if125next126127if object.targetPlayer != 0xFFFF128arrayPos0 = object.targetPlayer129temp0 = player[arrayPos0].ypos130temp0 -= object.ypos131if temp0 >= 0132if temp0 <= 0x800000133Rand(temp0, 8)134if temp0 == 0135object.state = BATBRAIN_DROPPING136object.dropPos.y = player[arrayPos0].ypos137object.animation = BATBRAIN_ANI_DROPPING138end if139end if140end if141else142arrayPos0 = object.backupPlayer143end if144145if player[arrayPos0].xpos < object.xpos146object.direction = FLIP_NONE147else148object.direction = FLIP_X149end if150break151152case BATBRAIN_DROPPING153object.ypos += object.yvel154object.yvel += 0x1800155arrayPos0 = object.targetPlayer156if player[arrayPos0].xpos < object.xpos157object.direction = FLIP_NONE158else159object.direction = FLIP_X160end if161temp0 = object.dropPos.y162temp0 -= object.ypos163if temp0 < 0x100000164if object.direction == FLIP_NONE165object.xvel = -0x10000166else167object.xvel = 0x10000168end if169object.yvel = 0170object.animation = BATBRAIN_ANI_FLYING171object.state = BATBRAIN_FLYING172end if173break174175case BATBRAIN_FLYING176object.xpos += object.xvel177arrayPos0 = object.targetPlayer178temp0 = player[arrayPos0].xpos179temp0 -= object.xpos180Abs(temp0)181if temp0 >= 0x800000182Rand(temp0, 8)183if temp0 == 0184object.state = BATBRAIN_RETURNTOROOF185end if186end if187break188189case BATBRAIN_RETURNTOROOF190object.xpos += object.xvel191object.ypos += object.yvel192object.yvel -= 0x1800193194ObjectTileCollision(CSIDE_ROOF, 0, -12, PATH_A)195if checkResult == true196object.xvel = 0197object.yvel = 0198object.state = BATBRAIN_AWAITPLAYER199object.animation = BATBRAIN_ANI_IDLE200end if201break202203case BATBRAIN_REVIVE204object.startPos.x = object.xpos205object.startPos.y = object.ypos206object.drawOrder = 5207object.state = BATBRAIN_AWAITPLAYER208break209210end switch211212if object.outOfBounds == true213temp0 = object.xpos214temp1 = object.ypos215object.xpos = object.startPos.x216object.ypos = object.startPos.y217if object.outOfBounds == true218object.xvel = 0219object.yvel = 0220object.direction = FLIP_NONE221object.animation = BATBRAIN_ANI_IDLE222object.frame = 0223object.priority = PRIORITY_BOUNDS224object.state = BATBRAIN_AWAITPLAYER225else226object.xpos = temp0227object.ypos = temp1228end if229end if230231foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)232BoxCollisionTest(C_TOUCH, object.entityPos, -12, -18, 12, 18, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)233234if checkResult == true235CreateTempObject(TypeName[Revive Enemy], object.propertyValue, object.startPos.x, object.startPos.y)236object[tempObjectPos].priority = PRIORITY_ACTIVE237object[tempObjectPos].target = object.entityPos238object[tempObjectPos].backupType = object.type239object[tempObjectPos].backupState = BATBRAIN_REVIVE240CallFunction(Player_BadnikBreak)241end if242next243244switch object.animation245case BATBRAIN_ANI_IDLE246object.frame = 0247break248249case BATBRAIN_ANI_DROPPING250object.frame = 1251break252253case BATBRAIN_ANI_FLYING254if object.animationTimer == 0255CallFunction(Batbrain_CheckOutOfRange)256if checkResult == 0257PlaySfx(SfxName[Batbrain Fly], false)258end if259end if260object.frame = object.animationTimer261object.frame >>= 2262object.frame++263object.animationTimer++264object.animationTimer &= 15265break266267end switch268end event269270271event ObjectDraw272DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)273end event274275276event ObjectStartup277CheckCurrentStageFolder("Zone02")278temp0 = checkResult279if game.playMode == BOOT_PLAYMODE_MISSION280CheckCurrentStageFolder("Zone01")281temp0 |= checkResult282CheckCurrentStageFolder("Zone03")283temp0 |= checkResult284end if285if temp0 == true286LoadSpriteSheet("MZ/Objects.gif")287SpriteFrame(-7, -12, 14, 24, 37, 98)288SpriteFrame(-12, -14, 32, 30, 52, 81)289SpriteFrame(-15, -6, 35, 20, 1, 106)290SpriteFrame(-12, -8, 29, 28, 85, 81)291SpriteFrame(-15, -6, 35, 20, 1, 106)292end if293294CheckCurrentStageFolder("Zone07")295if checkResult == true296LoadSpriteSheet("MBZ/Objects.gif")297SpriteFrame(-7, -12, 14, 24, 52, 68)298SpriteFrame(-12, -14, 32, 30, 1, 93)299SpriteFrame(-15, -6, 35, 20, 64, 99)300SpriteFrame(-12, -8, 29, 28, 34, 93)301SpriteFrame(-15, -6, 35, 20, 64, 99)302end if303304foreach (TypeName[Batbrain], arrayPos0, ALL_ENTITIES)305object[arrayPos0].startPos.x = object[arrayPos0].xpos306object[arrayPos0].startPos.y = object[arrayPos0].ypos307object[arrayPos0].drawOrder = 5308next309310SetTableValue(TypeName[Batbrain], DebugMode_ObjCount, DebugMode_TypesTable)311SetTableValue(Batbrain_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)312SetTableValue(Batbrain_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)313DebugMode_ObjCount++314end event315316317// ========================318// Editor Events319// ========================320321event RSDKDraw322DrawSprite(0)323end event324325326event RSDKLoad327CheckCurrentStageFolder("Zone01")328temp0 = checkResult329CheckCurrentStageFolder("Zone02")330temp0 |= checkResult331CheckCurrentStageFolder("Zone03")332temp0 |= checkResult333if temp0 == true334// This following sheet *should* be only in Zone02, but Sonic Team kinda just didn't wanna...335LoadSpriteSheet("MZ/Objects.gif")336SpriteFrame(-7, -12, 14, 24, 37, 98)337SpriteFrame(-12, -14, 32, 30, 52, 81)338SpriteFrame(-15, -6, 35, 20, 1, 106)339SpriteFrame(-12, -8, 29, 28, 85, 81)340SpriteFrame(-15, -6, 35, 20, 1, 106)341end if342343CheckCurrentStageFolder("Zone07")344if checkResult == true345LoadSpriteSheet("MBZ/Objects.gif")346SpriteFrame(-7, -12, 14, 24, 52, 68)347SpriteFrame(-12, -14, 32, 30, 1, 93)348SpriteFrame(-15, -6, 35, 20, 64, 99)349SpriteFrame(-12, -8, 29, 28, 34, 93)350SpriteFrame(-15, -6, 35, 20, 64, 99)351end if352353SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")354end event355356357