Path: blob/master/Sonic 2/Scripts/Enemies/Redz.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Redz 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.attackDelay1516// States17private alias 0 : REDZ_WALK18private alias 1 : REDZ_TURN19private alias 2 : REDZ_PREPAREATTACK20private alias 3 : REDZ_ATTACK2122// Animations23private alias 0 : REDZ_ANI_MOVING24private alias 1 : REDZ_ANI_STILL2526// Player Aliases27private alias object.value40 : player.hitboxLeft28private alias object.value38 : player.hitboxTop29private alias object.value41 : player.hitboxRight30private alias object.value39 : player.hitboxBottom3132// Path ID Aliases33private alias 0 : PATH_A343536// ========================37// Function Declarations38// ========================3940reserve function Redz_DebugDraw41reserve function Redz_DebugSpawn424344// ========================45// Function Definitions46// ========================4748private function Redz_DebugDraw49DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)50end function515253private function Redz_DebugSpawn54CreateTempObject(TypeName[Redz], 0, object.xpos, object.ypos)55if object.direction == FACING_RIGHT56object[tempObjectPos].direction = FLIP_NONE57object[tempObjectPos].xvel = -0x800058else59object[tempObjectPos].direction = FLIP_X60object[tempObjectPos].xvel = 0x800061end if62end function636465// ========================66// Events67// ========================6869event ObjectUpdate70switch object.state71case REDZ_WALK72if object.priority != PRIORITY_XBOUNDS_DESTROY73object.priority = PRIORITY_ACTIVE74end if7576object.xpos += object.xvel77if object.direction == FLIP_NONE78ObjectTileGrip(CSIDE_FLOOR, -8, 16, PATH_A)79else80ObjectTileGrip(CSIDE_FLOOR, 8, 16, PATH_A)81end if8283if checkResult == false84object.state = REDZ_TURN85object.animation = REDZ_ANI_STILL86object.animationTimer = 087object.frame = 088end if8990if stage.actNum == 291// Different behaviour for Proto Palace, where we should never attack92object.attackDelay = 30093end if9495if object.attackDelay < 196foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)97if object.direction == FLIP_NONE98BoxCollisionTest(C_TOUCH, object.entityPos, -64, -96, 0, -8, currentPlayer, 0, 0, 0, 0)99else100BoxCollisionTest(C_TOUCH, object.entityPos, 0, -96, 64, -8, currentPlayer, 0, 0, 0, 0)101end if102103if checkResult == true104object.state = REDZ_PREPAREATTACK105object.animation = REDZ_ANI_STILL106object.frame = 0107object.attackDelay = 60108end if109next110else111object.attackDelay--112end if113break114115case REDZ_TURN116if object.timer < 59117object.timer++118else119object.timer = 0120object.state = REDZ_WALK121object.animation = REDZ_ANI_MOVING122object.direction ^= FLIP_X123FlipSign(object.xvel)124end if125break126127case REDZ_PREPAREATTACK128if object.timer < 30129object.timer++130else131object.timer = 0132object.frame = 4133object.state = REDZ_ATTACK134PlaySfx(SfxName[Flame Thrower], false)135end if136break137138case REDZ_ATTACK139if object.timer < 90140temp0 = object.timer141temp0 &= 3142if temp0 == 0143CreateTempObject(TypeName[Redz Fire], 0, object.xpos, object.ypos)144object[tempObjectPos].drawOrder = 4145object[tempObjectPos].ypos -= 0x40000146temp0 = object.timer147temp0 <<= 3148temp0 &= 0x1FF149Sin(object.angle, temp0)150object.angle >>= 5151object.angle -= 0x30152object.angle &= 0x1FF153Cos(object[tempObjectPos].xvel, object.angle)154object[tempObjectPos].xvel <<= 8155Sin(object[tempObjectPos].yvel, object.angle)156object[tempObjectPos].yvel <<= 8157if object.direction == FLIP_NONE158object[tempObjectPos].xpos -= 0x80000159FlipSign(object[tempObjectPos].xvel)160else161object[tempObjectPos].xpos += 0x80000162end if163end if164165object.timer++166else167object.timer = 0168object.frame = 0169object.state = REDZ_WALK170object.animation = REDZ_ANI_MOVING171end if172break173174end switch175176if object.outOfBounds == true177temp0 = object.xpos178temp1 = object.ypos179object.xpos = object.startPos.x180object.ypos = object.startPos.y181if object.outOfBounds == true182if object.propertyValue == 0183object.direction = FLIP_NONE184object.xvel = -0x8000185else186object.direction = FLIP_X187object.xvel = 0x8000188end if189190object.timer = 0191object.animation = REDZ_ANI_MOVING192if object.priority != PRIORITY_XBOUNDS_DESTROY193object.priority = PRIORITY_BOUNDS194end if195196object.state = REDZ_WALK197else198object.xpos = temp0199object.ypos = temp1200end if201end if202203foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)204BoxCollisionTest(C_TOUCH, object.entityPos, -14, -14, 14, 14, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)205if checkResult == true206CallFunction(Player_BadnikBreak)207end if208next209210if object.animation == REDZ_ANI_MOVING211object.frame = object.animationTimer212object.frame /= 10213object.animationTimer++214object.animationTimer %= 40215end if216end event217218219event ObjectDraw220DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)221end event222223224event ObjectStartup225LoadSpriteSheet("HPZ/Objects.gif")226227SpriteFrame(-16, -16, 31, 32, 1, 118) // 0 - Standing frame228229SpriteFrame(-16, -16, 30, 32, 1, 85) // 1 - 3 - Walking frames230SpriteFrame(-16, -16, 31, 32, 1, 118)231SpriteFrame(-16, -16, 32, 32, 1, 151)232233SpriteFrame(-16, -16, 31, 32, 143, 140) // 4 - Firing fire frame234235foreach (TypeName[Redz], arrayPos0, ALL_ENTITIES)236object[arrayPos0].startPos.x = object[arrayPos0].xpos237object[arrayPos0].startPos.y = object[arrayPos0].ypos238if object[arrayPos0].propertyValue == 0239object[arrayPos0].direction = FLIP_NONE240object[arrayPos0].xvel = -0x8000241else242object[arrayPos0].direction = FLIP_X243object[arrayPos0].xvel = 0x8000244end if245next246247SetTableValue(TypeName[Redz], DebugMode_ObjCount, DebugMode_TypesTable)248SetTableValue(Redz_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)249SetTableValue(Redz_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)250DebugMode_ObjCount++251end event252253254// ========================255// Editor Events256// ========================257258event RSDKEdit259if editor.returnVariable == true260switch editor.variableID261case EDIT_VAR_PROPVAL // property value262checkResult = object.propertyValue263checkResult &= 1264break265266case 0 // direction267GetBit(checkResult, object.propertyValue, 0)268break269270end switch271else272switch editor.variableID273case EDIT_VAR_PROPVAL // property value274object.propertyValue = editor.variableValue275object.propertyValue &= 1276break277278case 0 // direction279CheckNotEqual(editor.variableValue, 0)280SetBit(object.propertyValue, 0, checkResult)281break282283end switch284end if285end event286287288event RSDKDraw289GetBit(object.direction, object.propertyValue, 0)290DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)291end event292293294event RSDKLoad295LoadSpriteSheet("HPZ/Objects.gif")296SpriteFrame(-16, -16, 31, 32, 1, 118)297298AddEditorVariable("direction")299SetActiveVariable("direction")300AddEnumVariable("Left", 0)301AddEnumVariable("Right", 1)302end event303304305