Path: blob/main/Scripts/R7/SpikeBall.txt
1319 views
//-----------------Sonic CD Spike Ball Script-----------------//1//--------Scripted by Christian Whitehead 'The Taxman'--------//2//-------Unpacked By Rubberduckycooly's Script Unpacker-------//34// Aliases56// Can be either X or Y-based, depending on the Object's Property Value7#alias Object.Value2 : Object.Velocity89// Value3 is unused...1011// Timers12// (These count towards the "Time" values, at which point states switch)13#alias Object.Value0 : Object.PauseTimer14#alias Object.Value1 : Object.MoveTimer1516// Durations17// (How long, in frames, the SpikeBall will do the action for)18#alias Object.Value4 : Object.ShootTime19#alias Object.Value5 : Object.RetractTime20#alias Object.Value6 : Object.PauseTime2122// HUD Alias23#alias Object[24].PropertyValue : HUD.CurrentTimePeriod2425// States26#alias 0 : SPIKEBALL_H_MOVERIGHT27#alias 1 : SPIKEBALL_H_PAUSERIGHT28#alias 2 : SPIKEBALL_H_MOVELEFT29#alias 3 : SPIKEBALL_H_PAUSELEFT3031#alias 4 : SPIKEBALL_V_MOVEDOWN32#alias 5 : SPIKEBALL_V_PAUSEDOWN33#alias 6 : SPIKEBALL_V_MOVEUP34#alias 7 : SPIKEBALL_V_PAUSEUP3536// Time Periods37#alias 0 : TIME_PRESENT38#alias 1 : TIME_PAST39#alias 2 : TIME_GOOD_FUTURE40#alias 3 : TIME_BAD_FUTURE4142// Property Values43#alias 0 : SPIKEBALL_TYPE_H44#alias 1 : SPIKEBALL_TYPE_V454647sub ObjectMain4849switch Object.State5051// Horizontal Spike Ball States52case SPIKEBALL_H_MOVERIGHT53if Object.MoveTimer < Object.ShootTime54Object.MoveTimer++55Object.XPos += Object.Velocity56else57Object.State++58end if59break6061case SPIKEBALL_H_PAUSERIGHT62if Object.PauseTimer < Object.PauseTime63Object.PauseTimer++64else65Object.PauseTimer = 066Object.State++67end if68break6970case SPIKEBALL_H_MOVELEFT71if Object.MoveTimer > Object.RetractTime72Object.MoveTimer--73Object.XPos -= Object.Velocity74else75Object.State++76end if77break7879case SPIKEBALL_H_PAUSELEFT80if Object.PauseTimer < Object.PauseTime81Object.PauseTimer++82else83Object.PauseTimer = 084Object.State = SPIKEBALL_H_MOVERIGHT85end if86break878889// Vertical Spike Ball States90case SPIKEBALL_V_MOVEDOWN91if Object.MoveTimer < Object.ShootTime92Object.MoveTimer++93Object.YPos += Object.Velocity94else95Object.State++96end if97break9899case SPIKEBALL_V_PAUSEDOWN100if Object.PauseTimer < Object.PauseTime101Object.PauseTimer++102else103Object.PauseTimer = 0104Object.State++105end if106break107108case SPIKEBALL_V_MOVEUP109if Object.MoveTimer > Object.RetractTime110Object.MoveTimer--111Object.YPos -= Object.Velocity112else113Object.State++114end if115break116117case SPIKEBALL_V_PAUSEUP118if Object.PauseTimer < Object.PauseTime119Object.PauseTimer++120else121Object.PauseTimer = 0122Object.State = SPIKEBALL_V_MOVEDOWN123end if124break125126end switch127128end sub129130131sub ObjectPlayerInteraction132133PlayerObjectCollision(C_TOUCH, -12, -12, 12, 12)134135if CheckResult == true136CallFunction(Player_Hit)137end if138139end sub140141142sub ObjectDraw143DrawSprite(0)144end sub145146147sub ObjectStartup148LoadSpriteSheet("R7/Objects.gif")149150// Spike Ball Frame151SpriteFrame(-16, -16, 32, 32, 1, 199)152153ArrayPos0 = 32154while ArrayPos0 < 1056155if Object[ArrayPos0].Type == TypeName[Spike Ball]156157if Object[ArrayPos0].PropertyValue == SPIKEBALL_TYPE_V158Object[ArrayPos0].State = SPIKEBALL_V_MOVEDOWN159160switch HUD.CurrentTimePeriod161case TIME_PRESENT162Object[ArrayPos0].Velocity = 0x20000163Object[ArrayPos0].ShootTime = 16164Object[ArrayPos0].RetractTime = -16165Object[ArrayPos0].PauseTime = 40166break167168case TIME_PAST169Object[ArrayPos0].Velocity = 0x40000170Object[ArrayPos0].ShootTime = 8171Object[ArrayPos0].RetractTime = -8172Object[ArrayPos0].PauseTime = 60173break174175case TIME_GOOD_FUTURE176case TIME_BAD_FUTURE177Object[ArrayPos0].Velocity = 0x10000178Object[ArrayPos0].ShootTime = 32179Object[ArrayPos0].RetractTime = -32180Object[ArrayPos0].PauseTime = 20181break182183end switch184else185switch HUD.CurrentTimePeriod186case TIME_PRESENT187Object[ArrayPos0].Velocity = 0x20000188Object[ArrayPos0].ShootTime = 24189Object[ArrayPos0].RetractTime = -24190Object[ArrayPos0].PauseTime = 40191break192193case TIME_PAST194Object[ArrayPos0].Velocity = 0x40000195Object[ArrayPos0].ShootTime = 12196Object[ArrayPos0].RetractTime = -12197Object[ArrayPos0].PauseTime = 60198break199200case TIME_GOOD_FUTURE201case TIME_BAD_FUTURE202Object[ArrayPos0].Velocity = 0x10000203Object[ArrayPos0].ShootTime = 48204Object[ArrayPos0].RetractTime = -48205Object[ArrayPos0].PauseTime = 20206break207208end switch209end if210211end if212213ArrayPos0++214loop215216end sub217218219// ========================220// Editor Subs221// ========================222223sub RSDKEdit224if Editor.ReturnVariable == true225switch Editor.VariableID226case EDIT_VAR_PROPVAL // Property Value227case 0 // Type228CheckResult = Object.PropertyValue229break230end switch231else232switch Editor.VariableID233case EDIT_VAR_PROPVAL // Property Value234case 0 // Type235Object.PropertyValue = Editor.VariableValue236break237end switch238end if239end sub240241242sub RSDKDraw243DrawSprite(0)244245// TODO: it would be cool to see the path of the spike ball via an arrow246// however, spike movement is dependant on time period, so that complicates things...247// update: woahhh we live in post-Origns CheckCurrentStageFolder era now, i think that may be possible248// the following (as well as the time period func) are incredibly scuffed, bring them up to snuff eventually249250if Editor.ShowGizmos == true251Editor.DrawingOverlay = true252253CallFunction(EditorHelpers_FindTimePeriod)254255Object.InkEffect = 1256257if Object.PropertyValue == SPIKEBALL_TYPE_V258switch CheckResult259case TIME_PRESENT260Object.Velocity = 0x20000261Object.ShootTime = 16262Object.RetractTime = -16263Object.PauseTime = 40264break265266case TIME_PAST267Object.Velocity = 0x40000268Object.ShootTime = 8269Object.RetractTime = -8270Object.PauseTime = 60271break272273case TIME_GOOD_FUTURE274case TIME_BAD_FUTURE275Object.Velocity = 0x10000276Object.ShootTime = 32277Object.RetractTime = -32278Object.PauseTime = 20279break280281end switch282283TempValue0 = Object.Velocity284TempValue0 *= Object.ShootTime285286TempValue1 = Object.Velocity287TempValue1 *= Object.RetractTime288289TempValue0 += Object.YPos290TempValue1 += Object.YPos291292DrawSpriteFX(0, FX_INK, Object.XPos, TempValue0)293DrawSpriteFX(0, FX_INK, Object.XPos, TempValue1)294295DrawLine(Object.XPos, TempValue0, Object.XPos, TempValue1, 255, 255, 255)296297else298switch CheckResult299case TIME_PRESENT300Object.Velocity = 0x20000301Object.ShootTime = 24302Object.RetractTime = -24303Object.PauseTime = 40304break305306case TIME_PAST307Object.Velocity = 0x40000308Object.ShootTime = 12309Object.RetractTime = -12310Object.PauseTime = 60311break312313case TIME_GOOD_FUTURE314case TIME_BAD_FUTURE315Object.Velocity = 0x10000316Object.ShootTime = 48317Object.RetractTime = -48318Object.PauseTime = 20319break320321end switch322323TempValue0 = Object.Velocity324TempValue0 *= Object.ShootTime325326TempValue1 = Object.Velocity327TempValue1 *= Object.RetractTime328329TempValue0 += Object.XPos330TempValue1 += Object.XPos331332DrawSpriteFX(0, FX_INK, TempValue0, Object.YPos)333DrawSpriteFX(0, FX_INK, TempValue1, Object.YPos)334335DrawLine(TempValue0, Object.YPos, TempValue1, Object.YPos, 255, 255, 255)336337end if338339Editor.DrawingOverlay = false340end if341end sub342343344sub RSDKLoad345LoadSpriteSheet("R7/Objects.gif")346SpriteFrame(-16, -16, 32, 32, 1, 199)347348AddEditorVariable("Type")349SetActiveVariable("Type")350AddEnumVariable("Horizontal", SPIKEBALL_TYPE_H)351AddEnumVariable("Vertical", SPIKEBALL_TYPE_V)352end sub353354355