import inc
import fsm
import tile80

################################################################################
# all game function
################################################################################

def show(world):
    win = world.window(0,0,60,20)
    for row in range(20):
        line = ''
        for col in range(60):
            if (col,row) in win.keys():
                line += win[(col,row)]
            else:
                line += ' '
        print line

def actorprompt(world):
    show(world)
    return [raw_input('(a,s,d,w,q)')]

def actortrymove(ran):
    def closure(world):
        for grpid in world.willCollide(you,'wall',ran):
            return []
        world.permute(you,ran)
        return []
    return closure

def shoot(ran):
    def closure(world):
        print 'pow'
        bulletid = world.buildOne(bulletData)
        c,r = world.getPos(you)
        world.setPos(bulletid,c,r)
        world.addTag(bulletid,'momentumRight')
        return []
    return closure

def momemtum(ran,name):
    def closure(world):
        for grpid in world.getGrpByTag(name):
            for t in world.willCollide(grpid,'wall',ran):
                world.rmGrp(grpid)
            world.permute(grpid,ran)
        return []
    return closure  

actorSuite = {
    'idle' : actorprompt,
    'tryup' : actortrymove('up'),
    'trydown' : actortrymove('down'),
    'tryleft' : actortrymove('left'),
    'tryright' : actortrymove('right'),
    'shootright' : shoot('right')
}

if __name__ == '__main__':
    import logging,json
    fsm.log.logger.setLevel(logging.DEBUG)
    fsm.log.logger.addHandler(logging.StreamHandler())

    world = tile80.Tile80()
    you = world.buildOne(json.loads(open('you.json').read()))
    sara = world.buildOne(json.loads(open('sara.json').read()))
    zombi = world.buildOne(json.loads(open('zombi.json').read()))
    room = world.buildOne(json.loads(open('realm.json').read()))
    bulletData = json.loads(open('bullet.json').read())

    machine = fsm.fromJson(json.loads(open('you_fsm.json').read()))
    state = 'idle'
    
    while state!='quit':
        event = actorSuite[state](world)
        state = machine[state](event)

        for grpid in world.getGrpByTag('momentumRight'):
            for t in world.willCollide(grpid,'wall','right'):
                world.rmGrp(grpid)
            world.permute(grpid,'right')
