kiki/coffee/action.coffee
monsterkodi 17dbe2b590 action
2016-08-12 00:07:30 +02:00

132 lines
3.4 KiB
CoffeeScript

# 0000000 0000000 000000000 000 0000000 000 000
# 000 000 000 000 000 000 000 0000 000
# 000000000 000 000 000 000 000 000 0 000
# 000 000 000 000 000 000 000 000 0000
# 000 000 0000000 000 000 0000000 000 000
class Action
@NOOP = 0
@PUSH = 1
@FALL = 2
@FORWARD = 3
@CLIMB_UP = 4
@CLIMB_DOWN = 5
@TURN_LEFT = 6
@TURN_RIGHT = 7
@JUMP = 8
@JUMP_FORWARD = 9
@FALL_FORWARD = 10
@SHOOT = 11
@END = 12
constructor: (o, i, n, d, m) ->
@action_object = o
@action_name = n
@action_id = i
@mode = m
@duration = d
@event = null
@delete_flag_ptr = false
@reset()
# KikiAction (KikiActionObject* o, int d, int m )
# {
# action_object = o
# action_id = 0
# mode = m
# duration = d
# event = null
# delete_flag_ptr = null
# @reset()
# }
del: ->
if @event then @event.removeAction @
if @action_object then @action_object.removeAction @
if @delete_flag_ptr then @delete_flag_ptr = true
init: () -> @action_object.initAction @
perform: () -> @action_object.performAction @
finish: () -> @action_object.finishAction @
finished: () ->
@action_object.actionFinished @
return if @delete_flag_ptr
if @current == @getDuration() # if keepRest wasn't called -> reset start and current values
@reset()
reset: () ->
@start = 0
@rest = 0
@last = 0
@current = 0
takeRest: (action) ->
@current = action.rest
@start = action.start
@last = 0
@rest = 0
keepRest: () ->
if @rest != 0
@current = @rest
@rest = 0
getRelativeTime: () ->
return @current / @getDuration()
getDuration: () ->
return world.mapMsTime @duration
performWithEvent: (event) ->
eventTime = event.getTime()
if @start == 0
@start = eventTime
@current = 0
@rest = 0
@last = 0
if @duration == 0 and @mode == ONCE
event.removeAction @
@perform()
@last = @current
if @duration == 0 and @mode == ONCE
@finished()
else
currentDiff = eventTime - @start
if currentDiff >= @getDuration()
@current = @getDuration()
@start += @current
@rest = eventTime - @start
@perform()
@last = 0
if @mode == CONTINUOUS
@current = @rest
return
if @mode == ONCE
event.removeAction @
@finish()
if @mode == REPEAT
if @current == @getDuration() # if keepRest wasn't called -> reset start and current values
@reset()
return
event.addFinishedAction @
else
@current = currentDiff
@perform()
@last = @current
module.exports = Action