Example #1
0
class World(object):
    """description of class"""

    def __init__(self, app):
        
        self.__organisms = []
        self.__born = []
        self.__dead = []
        self.__sheeps = []
        self.__heracleums = []
        self.__organismsC = 0
        self.__start = False
        self.__changed = False
        self.__layout = Layout(self, app)

    @property
    def age(self):
        self.__organismsC += 1
        return self.__organismsC

    @age.setter
    def age(self, value):
        self.__organismsC = value

    @property
    def start(self):
        return self.__start

    @start.setter
    def start(self, value):
        self.__start = value

    @property
    def layout(self):
        return self.__layout
    
    @property
    def finish(self):
        return self.__player.isAlive

    @property
    def input(self):
        pass

    @input.setter
    def input(self, code):
        self.__player.input = code

    def __Populate(self, n):
        for i in range(n):
            for entity in Entities:
                o = entity.Create()
                #o = Entities.CreateString("Fox")
                o.age = self.age
                o.world = self
                self.AddToWorld(o, Navigation.NULL_POINT)

    def __ClearLegend(self):
        legend = self.layout.legend
        legend.Clear()

    def NextTurn(self):
        self.Notify("New turn!")

        if len(self.__born) != 0:
            for o in self.__born:
                self.__organisms.append(o)

            self.__born.clear()
            self.__born.sort(key = Organism.compareTo)

        for o in self.__organisms:
            if o.isAlive == True:
                o.Action()
        
        if len(self.__dead) != 0:
            for o in self.__dead:
                self.__organisms.remove(o)

            self.__dead.clear()

        if self.__changed == True:
            for sheep in self.__sheeps:
                p = self.__SeekClosest(sheep)
                sheep.target = p
            self.__change = False

    def __SeekClosest(self, sheep):
        if len(self.__heracleums) == 0:
            return None

        max = -1
        seek = None

        for heracleum in self.__heracleums:
            result = 0
            result += abs(sheep.location.x - heracleum.location.x)
            result += abs(sheep.location.y - heracleum.location.y)

            if (max == -1) or result < max:
                max = result
                seek = heracleum.location

        return seek

    def WorldInit(self, oc):

        rows = self.layout.height
        cols = self.layout.width

        self.__board = Board(cols, rows)

        self.__player = Human(self.age, self)
        self.AddToWorld(self.__player, Navigation.NULL_POINT)

        self.__Populate(oc)

    def Notify(self, s):
        self.__layout.Print(s)

    def AddToWorld(self, o, p):
        self.__born.append(o)

        if p == Navigation.NULL_POINT:
            self.__board.SetAt(o)
        else:
            self.__board.SetAtPoint(p, o)

        self.__layout.Update(o)

        if isinstance(o, CyberSheep.CyberSheep):
            self.__sheeps.append(o)
        if isinstance(o, HeracleumSosnowskyi.HeracleumSosnowskyi):
            self.__heracleums.append(o)
            self.__changed = True

    def RemoveFromWorld(self, o):
        self.__layout.Clear(o.location)
        self.__board.KillAt(o.location)
        self.__dead.append(o)

        if isinstance(o, CyberSheep.CyberSheep):
            self.__sheeps.remove(o)
        if isinstance(o, HeracleumSosnowskyi.HeracleumSosnowskyi):
            self.__heracleums.remove(o)
            self.__changed = True

    def MassRemoveFromWorld(self, s, p, foo):

        x = 0 if p.x - 1 < 0 else p.x - 1
        y = 0 if p.y - 1 < 0 else p.y - 1

        yMax = p.x if p.x + 1 == self.__board.row else p.x + 1
        xMax = p.y if p.y + 1 == self.__board.col else p.y + 1

        temp = Point(0, 0)

        for i in range(x, xMax + 1):
            for j in range(y, yMax + 1):
                if (i == p.x) and (y == p.y):
                    continue

                temp.set(i, j)

                o = self.__board.GetAt(temp)
                if o == None:
                    continue

                if foo(o) == False:
                    continue
                else:
                    o.Kill(s)

    def PointValidate(self, p):
        return self.__board.Validate(p)

    def SeekForFree(self, p):
        return self.__board.SeekForFree(p)

    def GetAt(self, p):
        return self.__board.GetAt(p)

    def MoveTo(self, p, o):
        self.__layout.Clear(o.location)
        self.__board.SetAtPoint(p, o)
        self.__layout.Update(o)

    def LegendUpdate(self, dir):
        self.__ClearLegend()
        
        legend = self.layout.legend

        legend.AppendText("STATISTICS:\n")
        legend.AppendText("Strength: " + str(self.__player.strength) + "\n")
        legend.AppendText("Position: " + self.__player.location.string + "\n")
        
        legend.AppendText("\n")
        
        if dir != WorldDirections.DIR_NULL:
            legend.AppendText("Current direction: " + Navigation.string(dir) + "\n")

        legend.AppendText("\n")

        legend.AppendText("Cooldown: " + str(self.__player.cooldown) + "\n")
        legend.AppendText("Duration: " + str(self.__player.duration) + "\n")

        if self.__player.duration > 0:
            legend.AppendText("\n")
            legend.AppendText("Player empowered.\n")

    def ClearInput(self):
        self.__direction = WorldDirections.DIR_NULL

    def Save(self, e):

        f = open("C:/Users/abc/source/repos/PythonApplication1/PythonApplication1/General/Resources/save.txt", "w")

        #saving
        self.Notify("Saving...")

        #world
        f.write("%d\n" %self.__organismsC)

        #board
        f.write("%d\n%d\n" %(self.__board.row, self.__board.col))

        p = Point(0, 0)

		#organisms
        for y in range(self.__board.row):
            for x in range(self.__board.col):
                p.set(x, y)
                o = self.GetAt(p)

                if o == None:
                     f.write("%d\n" %0)
                else:
                    f.write("%d\n%c\n%d\n%d\n" %(1, o.token, o.age, o.strength))

        #born
        f.write("%d\n" %len(self.__born))
        for o in self.__born:
            if o == None:
                f.write("%d\n" %0)
            else:
                f.write("%d\n%d\n%d\n" %(1, o.location.x, o.location.y))

        #dead
        f.write("%d\n" %len(self.__dead))
        for o in self.__dead:
            if o == None:
                f.write("%d\n" %0)
            else:
                f.write("%d\n%d\n%d\n" %(1, o.location.x, o.location.y))

        f.write("%d\n%d" %(self.__player.cooldown, self.__player.duration))

        f.close()
        self.Notify("Saving complete!")

    def Load(self, e):

        f = open("C:/Users/abc/source/repos/PythonApplication1/PythonApplication1/General/Resources/save.txt", "r")

        #loading
        self.Notify("Loading...")

        i1 = int(f.readline())
        self.age = i1

        #board
        i1 = int(f.readline())
        i2 = int(f.readline())

        self.layout.Build(i1, i2)

        self.__born.clear()
        self.__dead.clear()

        #organisms
        for y in range(self.__board.row):
            for x in range(self.__board.col):
                p = Point(x, y)

                i1 = int(f.readline())

                if i1 == 0:
                    continue
                else:
                    t = f.readline()[0]
                    i2 = int(f.readline())
                    i3 = int(f.readline())

                    o = Entities.CreateChar(t)
                    o.world = self
                    o.age = i2
                    o.strength = i3
                    o.location = p

                    self.AddToWorld(o, p)

        self.__board.Print()

        #born
        i1 = int(f.readline())
        for i in range(i1):
            i2 = int(f.readline())
            if i2 == 0:
                continue
            else:
                i3 = int(f.readline())
                i4 = int(f.readline())

                p = Point(i3, i4)

                self.__born.append(self.GetAt(p))

        #dead
        i1 = int(f.readline())
        for i in range(i1):
            i2 = int(f.readline())
            if i2 == 0:
                continue
            else:
                i3 = int(f.readline())
                i4 = int(f.readline())

                p = Point(i3, i4)

                self.__dead.append(self.GetAt(p))

        i1 = int(f.readline())
        i2 = int(f.readline())

        self.__player.SetActive(i1, i2)

        f.close()
        self.__ClearLegend()
        self.Notify("Loading complete!")