import time
import random
import sys
import os
import datetime

# mapping from ensei id to suitable fleet id for the ensei.
ensei_id_fleet_map = {3: [2],
                      5: [3],
                      6: [4]}

class Ensei:
    def __init__(self, ensei_id, name_pict, area_pict, duration):
        self.id = ensei_id
        self.name_pict = name_pict
        self.area_pict = area_pict
        self.durati>

    def start(self):
        self.begin_time = datetime.datetime.now()

    def end_time(self):
        if hasattr(self, "begin_time"):
            return self.begin_time + self.duration
        return datetime.datetime.max

    def is_end(self):
        if hasattr(self, "begin_time"):
            return self.end_time() < datetime.datetime.now()
        return False

    def __str__(self):
        return 'ensei id = ' + str(self.id) + ', end time = ' + str(self.end_time())

    def __nonzero__(self):
        return self.is_end()

def ensei_factory(ensei_id):
    if ensei_id == 1: return Ensei(1, 'ensei_name_01.png', 'ensei_area_01.png', datetime.timedelta(minutes = 15))
    if ensei_id == 2: return Ensei(2, 'ensei_name_02.png', 'ensei_area_01.png', datetime.timedelta(minutes = 30))
    if ensei_id == 3: return Ensei(3, 'ensei_name_03.png', 'ensei_area_01.png', datetime.timedelta(minutes = 20))
    if ensei_id == 4: return Ensei(4, 'ensei_name_04.png', 'ensei_area_01.png', datetime.timedelta(minutes = 50))
    if ensei_id == 5: return Ensei(5, 'ensei_name_05.png', 'ensei_area_01.png', datetime.timedelta(minutes = 90))
    if ensei_id == 6: return Ensei(6, 'ensei_name_06.png', 'ensei_area_01.png', datetime.timedelta(minutes = 40))
    if ensei_id == 7: return Ensei(7, 'ensei_name_07.png', 'ensei_area_01.png', datetime.timedelta(housr = 1))
    if ensei_id == 8: return Ensei(8, 'ensei_name_08.png', 'ensei_area_01.png', datetime.timedelta(hours = 3))

    if ensei_id == 9: return Ensei(9, 'ensei_name_09.png', 'ensei_area_02.png', datetime.timedelta(hours = 4))
    if ensei_id == 10: return Ensei(10, 'ensei_name_10.png', 'ensei_area_02.png', datetime.timedelta(hours = 1, minutes = 30))
    if ensei_id == 11: return Ensei(11, 'ensei_name_11.png', 'ensei_area_02.png', datetime.timedelta(hours = 5))
    if ensei_id == 12: return Ensei(12, 'ensei_name_12.png', 'ensei_area_02.png', datetime.timedelta(hours = 8))
    if ensei_id == 13: return Ensei(13, 'ensei_name_13.png', 'ensei_area_02.png', datetime.timedelta(hours = 4))
    if ensei_id == 14: return Ensei(14, 'ensei_name_14.png', 'ensei_area_02.png', datetime.timedelta(hours = 6))
    if ensei_id == 15: return Ensei(15, 'ensei_name_15.png', 'ensei_area_02.png', datetime.timedelta(hours = 12))
    if ensei_id == 16: return Ensei(16, 'ensei_name_16.png', 'ensei_area_02.png', datetime.timedelta(hours = 15))

    if ensei_id == 17: return Ensei(17, 'ensei_name_17.png', 'ensei_area_03.png', datetime.timedelta(minutes = 45))
    if ensei_id == 18: return Ensei(18, 'ensei_name_18.png', 'ensei_area_03.png', datetime.timedelta(hours = 5))
    if ensei_id == 19: return Ensei(19, 'ensei_name_19.png', 'ensei_area_03.png', datetime.timedelta(hours = 6))
    if ensei_id == 20: return Ensei(20, 'ensei_name_20.png', 'ensei_area_03.png', datetime.timedelta(hours = 2))
    if ensei_id == 21: return Ensei(21, 'ensei_name_21.png', 'ensei_area_03.png', datetime.timedelta(hours = 2, minutes = 20))
    if ensei_id == 22: return Ensei(22, 'ensei_name_22.png', 'ensei_area_03.png', datetime.timedelta(hours = 3))

    if ensei_id == 25: return Ensei(25, 'ensei_name_25.png', 'ensei_area_04.png', datetime.timedelta(hours = 40))
    if ensei_id == 26: return Ensei(26, 'ensei_name_26.png', 'ensei_area_04.png', datetime.timedelta(hours = 80))
    if ensei_id == 27: return Ensei(27, 'ensei_name_27.png', 'ensei_area_04.png', datetime.timedelta(hours = 20))
    if ensei_id == 28: return Ensei(28, 'ensei_name_28.png', 'ensei_area_04.png', datetime.timedelta(hours = 25))
    if ensei_id == 29: return Ensei(29, 'ensei_name_29.png', 'ensei_area_04.png', datetime.timedelta(hours = 24))
    if ensei_id == 30: return Ensei(30, 'ensei_name_30.png', 'ensei_area_04.png', datetime.timedelta(hours = 48))

    if ensei_id == 35: return Ensei(35, 'ensei_name_35.png', 'ensei_area_05.png', datetime.timedelta(hours = 7))
    if ensei_id == 36: return Ensei(36, 'ensei_name_36.png', 'ensei_area_05.png', datetime.timedelta(hours = 9))
    if ensei_id == 37: return Ensei(37, 'ensei_name_37.png', 'ensei_area_05.png', datetime.timedelta(hours = 2, minutes = 45))
    if ensei_id == 38: return Ensei(38, 'ensei_name_38.png', 'ensei_area_05.png', datetime.timedelta(hours = 2, minutes = 55))
    return ensei_factory(2)

 

def check_and_click(pict):
    if exists(pict):
        click(pict)
        return True
    return False

def wait_and_click(pict):
    wait(pict)
    click(pict)

def go_next():
    if exists("next.png"):
        click("next.png")
        time.sleep(5)
        go_next()

def go_bokou():
    go_next()
    check_and_click("bokou.png")
    hover("senseki.png")

def shutsugeki():
    hover("senseki.png")
    wait_and_click("shutsugeki.png")
    wait_and_click("ensei.png")

    ensei_list = map(ensei_factory, ensei_id_fleet_map.keys())
    random.shuffle(ensei_list)
    success_ensei_list = []
    for ensei in ensei_list:
        click(ensei.area_pict)
        sleep(2)
        click(ensei.name_pict)
        hover(ensei.area_pict)
        click("decision.png")
        if exists("ensei_enable.png"):
            print "try", ensei
            success_ensei = None
            print 'suitable fleets:', ensei_id_fleet_map[ensei.id]
            for fleet_id in ensei_id_fleet_map[ensei.id]:
                print 'try to use fleet', fleet_id
                fleet_name = "fleet_%d.png" % fleet_id
                click(fleet_name)
                sleep(3)
                click("ensei_start.png")
                sleep(5)
                if not exists("ensei_enable.png"):
                    ensei.start()
                    success_ensei = ensei
                    time.sleep(10)
                    break
            if success_ensei != None:
                print ensei, "successfully started"
                success_ensei_list.append(success_ensei)
            else:
                print "no fleets were aveilable for this ensei."
                click("ensei_area_01.png")
        else:
            print ensei, "is already running. skipped."
    go_bokou()
    return success_ensei_list

def kitou():
    try:
        wait("ensei_finish.png", 5)
    except:
        return False
    click("ensei_finish.png")
    time.sleep(10)
    go_next()
    kitou()
    return True

def hokyu():
    hover("senseki.png")
    wait("hokyu.png")
    click("hokyu.png")
    for fleet_id in [2, 3, 4]:
        fleet_name = "fleet_%d.png" % fleet_id
        click(fleet_name)
        click("hokyu_all.png")
        if check_and_click("matomete_hokyu.png"): time.sleep(5)
    time.sleep(3)
    click("bokou.png")
    return

running_ensei_list = []

def init():
    go_bokou()
    hokyu()
    while not running_ensei_list:
        main()
        time.sleep(120)

def main():
    if kitou():
        hokyu()
    global running_ensei_list
    running_ensei_list += shutsugeki()

def reflesh():
    hover("senseki.png")
    click("hokyu.png")
    time.sleep(3)
    go_bokou()

init()
while True:
    if any(running_ensei_list):
        running_ensei_list = filter(lambda e: not e.is_end, running_ensei_list)
        reflesh()
        main()
    elif not running_ensei_list:
        init()
    else:
        end_time = min(map(lambda e: e.end_time(), running_ensei_list))
        print "next ensei end time:", end_time
    time.sleep(10)

 

돌려보면 init 에서 에러뜨는거 보고 선언에서 뭔가 충돌나는거 같긴한데... 늅이라 모르겠음