91 lines
3.8 KiB
Python
Executable File
91 lines
3.8 KiB
Python
Executable File
######################################################################
|
|
# NOTE: This was the first mob I wrote in Python / Jython. #
|
|
# It is excessively commented to provide a reference for other #
|
|
# Mobs to be written. #
|
|
# #
|
|
# 88 88 88 #
|
|
# 88 88 "" #
|
|
# 88 88 #
|
|
# ,adPPYb,d8 ,adPPYba, 88,dPPYba, 88 88 8b,dPPYba, #
|
|
# a8" `Y88 a8" "8a 88P' "8a 88 88 88P' `"8a #
|
|
# 8b 88 8b d8 88 d8 88 88 88 88 #
|
|
# "8a, ,d88 "8a, ,a8" 88b, ,a8" 88 88 88 88 #
|
|
# `"YbbdP"Y8 `"YbbdP"' 8Y"Ybbd8"' 88 88 88 88 #
|
|
# aa, ,88 #
|
|
# "Y8bbdP" #
|
|
# #
|
|
######################################################################
|
|
|
|
def __goblin_tick__(g):
|
|
### RUN ALL THE ANIMATIONS
|
|
g.runAnimations()
|
|
|
|
# IF NOT ALIVE, DO AFTER DEATH
|
|
if not g.alive():
|
|
__goblin_after_death__(g)
|
|
return
|
|
|
|
# DISCOVER
|
|
if not g.getDiscoveredStatus(): return
|
|
|
|
## IF HEALTH IS ABOVE THE MAX HEALTH, CLAMP
|
|
g.normalizeHealth()
|
|
|
|
### IF THE GET HIT TIMER IS POSITIVE, START DECREMENTING IT
|
|
g.getHitClock()
|
|
|
|
### COLLISION
|
|
g.collision()
|
|
|
|
### POSITION
|
|
g.updatePosition()
|
|
|
|
## IDLE ANIMATIONS (idles, walks)
|
|
__goblin_idle__(g)
|
|
|
|
### IF IS ALREADY FIGHTING, THEN TICK HIS ATTACK SEQUENCE WITH RUNNING SPEED
|
|
if g.inCombat: g.attackSequence(g.runningSpeed)
|
|
## IF NOT ALREADY FIGHTING, AND AGGRO-RADIUS INTERSECTS THE PLAYER, START FIGHTING
|
|
elif Utils.intersects(g.center, g.aggroRadius, Player.center): g.startAttackSequence()
|
|
|
|
# run bug fixes
|
|
g.allBugFixes()
|
|
|
|
def __goblin_idle__(g):
|
|
## ONLY WORK IF *NOT* IN COMBAT / RUNNING AWAY
|
|
if g.collided or g.runningAway or g.inCombat: return
|
|
|
|
## SUBTRACT FROM ANIMATION TIMER IF DOING IDLE ANIMATION
|
|
if g.currentAnimation != ANIMATION.idleWalk: g.idleAnimationTimer -= 1
|
|
|
|
## SUBTRACT FROM IDLE WALK DISTANCE IF IDLE WALKING
|
|
elif g.currentAnimation == ANIMATION.idleWalk: g.distanceToMove -= Utils.pythagoras(g.velX, g.velY)
|
|
|
|
## IF WALKING AROUND, AND HIS DISTANCE IS UP:
|
|
if g.distanceToMove <= 0 and g.currentAnimation == ANIMATION.idleWalk:
|
|
### CHANCE OF CONTINUING ON WALKING INSTEAD OF IDLING
|
|
if Utils.rand.nextInt(8) == 0: g.idleMove(g.walkingSpeed)
|
|
else: #### ELSE SET HIM GOING TO A RANDOM IDLE ANIMATION
|
|
g.idleAnimationTimer = Utils.rand.nextInt(200) + 100
|
|
g.velX = g.velY = 0
|
|
if Utils.COIN_FLIP(): g.currentAnimation = ANIMATION.idle1
|
|
else: g.currentAnimation = ANIMATION.idle2
|
|
|
|
### IF ANIMATION DOES NOT EQUAL IDLE WALK AND THE IDLE ANIMATION TIMER IS UP, SET HIM WALKING
|
|
if g.currentAnimation != ANIMATION.idleWalk and g.idleAnimationTimer <= 0: g.idleMove(g.walkingSpeed)
|
|
|
|
### IF GOBLIN IS OUTSIDE OF HIS HOME BUT ISNT COMBAT OR WALKING
|
|
if not g.home.contains(g.center):
|
|
g.currentAnimation = ANIMATION.idleWalk ## some mobs may have a run animation
|
|
## IF SO FAR AWAY, RUN HOME, ELSE JUST WALK HOME
|
|
if(g.center.distance(g.home.center) > 5000): g.goHome(g.runningSpeed)
|
|
else: g.goHome(g.walkingSpeed)
|
|
|
|
def __goblin_after_death__(g):
|
|
## SUBTRACT FROM DESTROYING TIMER
|
|
g.destroyingTimer -= 1
|
|
|
|
## IF THE TIMER IS UP, DESTROY!
|
|
if g.destroyingTimer < 0: g.destroy()
|
|
|