Type typeSprite Field x# Field y# Field oldX# Field oldY# Field moved Field speedX# Field speedY# Field speedLimit# Field speedStep# Field targetSpeedX# Field targetSpeedY# Field targetX# Field targetY# Field width# Field height# Field targetWidth# Field targetHeight# Field shapeStep# Field red Field green Field blue Field targetRed Field targetBlue Field targetGreen Field colorSpeed Field class Field pushedX Field pushedY Field pushedBy Field subPushedBy Field dying Field morphEnergy Field oldClass Field energy Field energyDirection Field layer Field subClass Field counter Field counterMax Field counterRestart Field subEnergy Field handleSubEnergyGone Field image Field frameMax Field frame Field frameWaitMax Field frameWaitCounter End Type Function handleSpriteDefault(sprite.typeSprite) adjustColor sprite adjustToSpeedLimit sprite adjustToTargetShape sprite adjustToTarget sprite handleAnimation sprite adjustSpeed sprite adjustPosition sprite adjustCounter sprite adjustEnergy sprite End Function Function handleAnimation(sprite.typeSprite) If sprite\image <> 0 doCount = False If sprite\frameMax > 0 sprite\frameWaitCounter = sprite\frameWaitCounter + 1 If sprite\frameWaitCounter > sprite\frameWaitMax doCount = True sprite\frameWaitCounter = 0 EndIf Else doCount = True EndIf If doCount sprite\frame = sprite\frame + 1 If sprite\frame = sprite\frameMax sprite\frame = firstFrame End If EndIf EndIf End Function Function reachedTargets(sprite.typeSprite) reachedShape = (sprite\targetWidth# = nothing#) And (sprite\targetHeight# = nothing#) reachedPosition = (sprite\targetX# = nothing#) And (sprite\targetY# = nothing#) reachedSpeed = (sprite\targetSpeedX# = nothing#) And (sprite\targetSpeedY# = nothing#) Return reachedShape And reachedPosition And reachedSpeed End Function Function adjustToTargetShape(sprite.typeSprite) If sprite\targetWidth <> nothing If sprite\width < sprite\targetWidth sprite\width = sprite\width + sprite\shapeStep sprite\x = sprite\x - sprite\shapeStep / 2 ElseIf sprite\width > sprite\targetWidth sprite\width = sprite\width - sprite\shapeStep sprite\x = sprite\x + sprite\shapeStep / 2 Else sprite\targetWidth = nothing EndIf EndIf If sprite\targetHeight <> nothing If sprite\height < sprite\targetHeight sprite\height = sprite\height + sprite\shapeStep sprite\y = sprite\y - sprite\shapeStep / 2 ElseIf sprite\height > sprite\targetHeight sprite\height = sprite\height - sprite\shapeStep sprite\y = sprite\y + sprite\shapeStep / 2 Else sprite\targetHeight = nothing EndIf EndIf End Function Function adjustColor(sprite.typeSprite) followColor sprite, sprite\colorSpeed, sprite\targetRed, sprite\targetGreen, sprite\targetBlue End Function Function behindX(sprite.typeSprite) Return sprite\x + sprite\width / 2 - Sgn(sprite\speedX) * (sprite\width / 2) End Function Function behindY(sprite.typeSprite) Return sprite\y + sprite\height / 2 - Sgn(sprite\speedY) * (sprite\height / 2) End Function Function adjustCounter(sprite.typeSprite) If sprite\counterMax > 0 sprite\counter = sprite\counter + 1 If sprite\counter = sprite\counterMax sprite\counter = 0 If Not sprite\counterRestart sprite\counterMax = 0 EndIf EndIf EndIf If sprite\subEnergy > 0 sprite\subEnergy = sprite\subEnergy - 1 If sprite\subEnergy = 0 sprite\handleSubEnergyGone = True EndIf EndIf End Function Function checkCollision(a.typeSprite, b.typeSprite) If RectsOverlap(a\x, a\y, a\width, a\height, b\x, b\y, b\width, b\height) If a\pushedBy = 0 And b\pushedBy = 0 rightBorderIn = (a\x + a\width > b\x And a\x + a\width < b\x + b\width) leftBorderIn = (a\x < b\x + b\width And a\x > b\x) bottomBorderIn = (a\y + a\height > b\y And a\y + a\height < b\y + b\height) topBorderIn = (a\y < b\y + b\height And a\y > b\y) setPushed a, b, rightBorderIn, leftBorderIn, topBorderIn, bottomBorderIn EndIf EndIf End Function Function setPushed(a.typeSprite, b.typeSprite, rightBorderIn, leftBorderIn, topBorderIn, bottomBorderIn) If (rightBorderIn Or leftBorderIn) And (bottomBorderIn Or topBorderIn) If rightBorderIn a\pushedX = -1 b\pushedX = 1 ElseIf leftBorderIn a\pushedX = 1 b\pushedX = -1 EndIf If bottomBorderIn a\pushedY = -1 b\pushedY = 1 ElseIf topBorderIn a\pushedY = 1 b\pushedY = -1 EndIf If leftBorderIn And rightBorderIn Then a\pushedX = Sgn(a\speedX) b\pushedX = Sgn(b\speedX) EndIf If topBorderIn And bottomBorderIn Then a\pushedY = Sgn(a\speedY) b\pushedY = Sgn(b\speedY) EndIf a\pushedBy = b\class a\subPushedBy = b\subClass b\pushedBy = a\class b\subPushedBy = a\subClass EndIf End Function Function borderBounceSpecific(sprite.typeSprite, checkLeft, checkTop, checkRight, checkBottom) If checkLeft If sprite\x < screenLeft sprite\speedX = sprite\speedLimit EndIf EndIf If checkRight If sprite\x + sprite\width > screenWidth sprite\speedX = -sprite\speedLimit EndIf EndIf If checkTop If sprite\y < screenTop sprite\speedY = sprite\speedLimit EndIf EndIf If checkBottom If sprite\y + sprite\height > screenHeight sprite\speedY = -sprite\speedLimit EndIf EndIf End Function Function emptyCollision(sprite.typeSprite) sprite\pushedX = 0 sprite\pushedY = 0 sprite\pushedBy = 0 End Function Function adjustEnergy(sprite.typeSprite) If sprite\energyDirection <> 0 sprite\energy = sprite\energy + sprite\energyDirection EndIf If sprite\energy = 0 sprite\dying = True EndIf End Function Function adjustToSpeedLimit(sprite.typeSprite) If sprite\speedX# < -sprite\speedLimit# sprite\speedX# = -sprite\speedLimit# ElseIf sprite\speedX# > sprite\speedLimit# sprite\speedX# = sprite\speedLimit# EndIf If sprite\speedY# < -sprite\speedLimit# sprite\speedY# = -sprite\speedLimit# ElseIf sprite\speedY# > sprite\speedLimit# sprite\speedY# = sprite\speedLimit# EndIf End Function Function adjustPosition(sprite.typeSprite) sprite\oldX = sprite\x sprite\oldY = sprite\y sprite\x = sprite\x + sprite\speedX * game\speed# sprite\y = sprite\y + sprite\speedY * game\speed# sprite\moved = (sprite\x <> sprite\oldX) Or (sprite\y <> sprite\oldY) End Function Function adjustSpeed(sprite.typeSprite) If sprite\targetSpeedX# <> nothing# If sprite\speedX# < sprite\targetSpeedX# sprite\speedX# = sprite\speedX# + sprite\speedStep# hitSpeedX = (sprite\speedX# >= sprite\targetSpeedX#) ElseIf sprite\speedX# > sprite\targetSpeedX# sprite\speedX# = sprite\speedX# - sprite\speedStep# hitSpeedX = (sprite\speedX# <= sprite\targetSpeedX#) Else hitSpeedX = True EndIf If hitSpeedX sprite\speedX# = sprite\targetSpeedX# sprite\targetSpeedX# = nothing# EndIf EndIf If sprite\targetSpeedY# <> nothing# If sprite\speedY# < sprite\targetSpeedY# sprite\speedY# = sprite\speedY# + sprite\speedStep# hitSpeedY = (sprite\speedY# >= sprite\targetSpeedY#) ElseIf sprite\speedY# > sprite\targetSpeedY# sprite\speedY# = sprite\speedY# - sprite\speedStep# hitSpeedY = (sprite\speedY# <= sprite\targetSpeedY#) Else hitSpeedY = True EndIf If hitSpeedY sprite\speedY# = sprite\targetSpeedY# sprite\targetSpeedY# = nothing# EndIf EndIf End Function Function followColor(sprite.typeSprite, speed, red, green, blue) sprite\red = followValue(sprite\red, red, speed) sprite\green = followValue(sprite\green, green, speed) sprite\blue = followValue(sprite\blue, blue, speed) End Function Function followValue(original, target, speed) returnValue = original If target <> nothing If original < target returnValue = original + speed If returnValue > target Then returnValue = target ElseIf original > target returnValue = original - speed If returnValue < target Then returnValue = target EndIf EndIf Return returnValue End Function Function spriteSetTargetColorToBack(sprite.typeSprite) sprite\targetRed = backRed sprite\targetGreen = backGreen sprite\targetBlue = backBlue End Function Function spriteSetTargetColorToSelf(sprite.typeSprite) sprite\targetRed = sprite\red sprite\targetGreen = sprite\green sprite\targetBlue = sprite\blue End Function Function spriteSetTargetColorToSprite(spriteA.typeSprite, spriteB.typeSprite) spriteB\targetRed = spriteA\red spriteB\targetGreen = spriteA\green spriteB\targetBlue = spriteA\blue End Function Function spriteSetColorToSprite(spriteA.typeSprite, spriteB.typeSprite, light) spriteB\red = intoLimits(spriteA\red + light, 0, paletteMax) spriteB\green = intoLimits(spriteA\green + light, 0, paletteMax) spriteB\blue = intoLimits(spriteA\blue + light, 0, paletteMax) End Function Function adjustToTarget(sprite.typeSprite) If sprite\targetX# <> nothing# If sprite\x# < sprite\targetX# sprite\speedX# = sprite\speedX# + sprite\speedStep# hitTargetX = (sprite\x# + sprite\speedX# * game\speed# >= sprite\targetX#) ElseIf sprite\x# > sprite\targetX# sprite\speedX# = sprite\speedX# - sprite\speedStep# hitTargetX = (sprite\x# + sprite\speedX# * game\speed# <= sprite\targetX#) Else hitTargetX = True EndIf If hitTargetX sprite\x# = sprite\targetX# sprite\targetX# = nothing# sprite\targetSpeedX# = nothing# sprite\speedX# = 0 EndIf EndIf If sprite\targetY# <> nothing# If sprite\y# < sprite\targetY# sprite\speedY# = sprite\speedY# + sprite\speedStep# hitTargetY = (sprite\y# + sprite\speedY# * game\speed# >= sprite\targetY#) ElseIf sprite\y# > sprite\targetY# sprite\speedY# = sprite\speedY# - sprite\speedStep# hitTargetY = (sprite\y# + sprite\speedY# * game\speed# <= sprite\targetY#) Else hitTargetY = True EndIf If hitTargetY sprite\y# = sprite\targetY# sprite\targetY# = nothing# sprite\targetSpeedY# = nothing# sprite\speedY# = 0 EndIf EndIf End Function Function spritePushInScreenX(sprite.typeSprite) didPush = False If sprite\x < screenLeft Then sprite\x = screenLeft didPush = True ElseIf sprite\x + sprite\width > screenWidth sprite\x = screenWidth - sprite\width didPush = True EndIf Return didPush End Function Function handleMorph(sprite.typeSprite) If sprite\morphEnergy > 0 sprite\morphEnergy = sprite\morphEnergy - 1 If sprite\morphEnergy = 0 sprite\class = sprite\oldClass sprite\oldClass = 0 EndIf EndIf End Function Function morphTo(sprite.typeSprite, newClass, morphEnergy) sprite\oldClass = sprite\class sprite\class = newClass sprite\morphEnergy = morphEnergy End Function Function dieOutside(sprite.typeSprite) dieOutsideX sprite dieOutsideY sprite End Function Function dieOutsideX(sprite.typeSprite) If sprite\x + sprite\width < screenLeft sprite\dying = True ElseIf sprite\x > screenWidth sprite\dying = True EndIf End Function Function dieOutsideY(sprite.typeSprite) If sprite\y + sprite\height < screenTop sprite\dying = True ElseIf sprite\y > screenHeight sprite\dying = True EndIf End Function Function colorFromSprite(sprite.typeSprite, light) safeColor sprite\red + light, sprite\green + light, sprite\blue + light End Function Function bounceSoftX(sprite.typeSprite, border) If sprite\targetX = nothing If sprite\x < screenLeft + border And sprite\speedX <= 0 sprite\targetSpeedX = sprite\speedLimit ElseIf sprite\x + sprite\width > screenWidth - border And sprite\speedX >= 0 sprite\targetSpeedX = -sprite\speedLimit EndIf EndIf End Function Function spriteShiftX(sprite.typeSprite) If sprite\x > screenWidth sprite\x = screenLeft - sprite\width ElseIf sprite\x < screenLeft - sprite\width sprite\x = screenWidth EndIf End Function Function headingOutsideScreen(sprite.typeSprite) If sprite\x + sprite\width < screenLeft headingOutsideX = sprite\speedX < 0 ElseIf sprite\x > screenWidth headingOutsideX = sprite\speedX > 0 EndIf If sprite\y + sprite\height < screenTop headingOutsideY = sprite\speedY < 0 ElseIf sprite\y > screenHeight headingOutsideY = sprite\speedY > 0 EndIf Return (headingOutsideX Or headingOutsideY) End Function