Beispiel #1
0
class Miner(Machine):
    imgs = Img.imgstripxf("Machines/Miner", 16)
    mine_prog = 0
    mine_speed = 0.25
    a = 0
    mrects = [
        Rect(4, 36, 56, 40),
        Rect(4, 4, 44, 72),
        Rect(4, 4, 56, 44),
        Rect(16, 4, 44, 72)
    ]

    def update(self, pos, area, events):
        super().update(pos, area, events)
        if "Ore" in area.ldict:
            ore = area.get("Ore", pos)
            if ore:
                self.a += 0.1
                self.a %= math.tau
                self.mine_prog += self.mine_speed
                if self.mine_prog >= ore.hardness and self.add_output(
                        Items.resources[ore.name]):
                    if not ore.inf:
                        ore.q -= 1
                        if ore.q == 0:
                            area.dobj(ore, pos)
                    self.mine_prog = 0

    def render(self, layer, surf, tpos, area, scale=3):
        if layer == self.renderlayer:
            Img.draw_rotor(surf,
                           V(*tpos) + V(32, 48), 24, 3, self.a, (80, 80, 80))
        super().render(layer, surf, tpos, area, scale)
Beispiel #2
0
class Splitter(Machine):
    imgs=Img.imgstripxf("Transport/Splitter",16)
    phase=-1
    def input(self,d,i):
        for r in (self.phase,-self.phase):
            if self.add_output(i,r):
                self.phase=-r
                return True
Beispiel #3
0
class Tree(Object):
    hardness = 60
    img = Img.imgstripxf("World/Tree")[-1]
    layers = ["Conv", "Items", "Objects"]
    renderlayer = "Objects"
    exoff = Vector.VectorX(0, -16)
    updates = False

    def mined(self):
        return Items.resources["Log"]
Beispiel #4
0
class Farmer(OutputMachine):
    imgs = Img.imgstripxf("Machines/Farmer")
    crops = None
    crop = None

    def __init__(self, c, r, p):
        self.gui = MUI.MUI(
            "Select Crop",
            [MUI.SelList([c.get_name() for c in Agriculture.crops])])
        super().__init__(c, r, p)

    def init_crops(self, area, pos):
        self.crops = {}
        for tpos in V(5, 5).iter_space_2d(pos - V(2, 2)):
            pcrop = True
            for l in self.crop.layers:
                if not area.clear(l, tpos):
                    pcrop = False
                tcrop = area.get(l, tpos)
                if isinstance(tcrop, self.crop) and not tcrop.bound:
                    tcrop.bound = self
                    area.ups.remove((tpos, tcrop))
                    self.crops[tpos] = tcrop
                    break
            if area.get("Tiles", tpos).name != self.crop.tile:
                pcrop = False
            if tpos not in self.crops:
                self.crops[tpos] = area.spawn_new(self.crop, tpos,
                                                  self) if pcrop else None

    def gui_trigger(self, *args):
        self.crop = Agriculture.crops[args[0]]

    def update(self, pos, area, events):
        if self.crops:
            if not randint(0, self.crop.gspeed // 25):
                tpos, ch = choice(list(self.crops.items()))
                if ch:
                    if not ch.exists:
                        self.crops[tpos] = None
                    elif ch.growth < ch.max_g:
                        ch.growth += 1
                    elif self.add_output(ch.mined()):
                        ch.growth = ch.harvest_state
        elif self.crop:
            self.init_crops(area, pos)
        super().update(pos, area, events)

    def on_dest(self, area, pos):
        if self.crops:
            for tpos, crop in self.crops.items():
                if crop:
                    crop.bound = None
                    area.ups.add((tpos, crop))
Beispiel #5
0
class Electrolyser(Furnace):
    imgs = Img.imgstripxf("Machines/Electrolyser")

    def __init__(self, c, r, p):
        SlotMachine.__init__(self, c, r, p)
        self.processor = MUI.Processor("Electrolyser", 20)
        self.fuel = MUI.ElectroSlot(self)
        self.gui = MUI.MUI("Electrolyser", [self.processor, self.fuel])
        self.outputslot = self.processor.output

    def input(self, d, i):
        return self.processor.input.add(i)
Beispiel #6
0
class EntangledBox1(Box):
    img = Img.imgstripxf("Buildings/EntangledBox")[0]
    gen = Generators.EntangledBuilding()

    def __init__(self, c):
        Object.__init__(self, c)
        self.dummy = EntangledDummy(self)
        self.area = Area(self.internalsize, self.gen, self.dummy)

    def in_warp(self, d):
        hb = self.area.bounds // 2
        return Coordinate(self.area, hb - d * hb - V(bool(d.y), bool(d.x)))
Beispiel #7
0
class Monolith(Owned):
    imgs=Img.imgstripxf("Buildings/Monolith",16)
    t=0
    layers = ["Conv","Items","Objects"]
    renderlayer = "Objects"
    def update(self, pos, area, events):
        self.t+=1
        if self.t==240:
            from Lib import GUI
            raise GUI.GameEnd(self.p.team)
    @property
    def img(self):
        return self.imgs[self.t%20==19]
Beispiel #8
0
class Input(Rotatable):
    imgs=Img.imgstripxf("Transport/Input")
    layers = ["Objects"]
    hardness = 10
    slayer = "Conv"
    def update(self, pos, area, events):
        conv=area.get("Conv",pos)
        if isinstance(conv,Conveyor):
            conv.cm=self
            area.de_update(self,pos)
    def conv_update(self,pos,area,conv):
        item = area.get("Items", pos)
        if item and not item.mprog:
            area.move(item, pos, Vector.vdirs[self.r], override_speed=conv.cspeed)
    def mined(self):
        return Placeable(self.__class__)
Beispiel #9
0
class Tunnel(Rotatable):
    imgs=Img.imgstripxf("Transport/Tunnel")
    updates = False
    layers = ["Conv","Items","Objects"]
    renderlayer = "Objects"
    exoff = Vector.VectorX(0,-8)
    hardness = 60
    def in_warp(self,d):
        if d==Vector.vdirs[self.r]:
            for x in range(1,6):
                tc=self.coords+d*x
                o=tc.get("Objects")
                if isinstance(o,Tunnel) and o.r==(self.r+2)%4:
                    tc.pos+=d
                    return tc
    def mined(self):
        return Placeable(Tunnel)
Beispiel #10
0
class EntangledBox2(Box):
    img = Img.imgstripxf("Buildings/EntangledBox")[1]

    def __init__(self, c, a, d):
        Object.__init__(self, c)
        self.area = a
        self.dummy = d
        self.dummy.es.append(self)

    def update(self, pos, area, events):
        if not self.dummy.es[0].exists:
            super().update(pos, area, events)
        else:
            self.area.generate(area.get_power)

    def in_warp(self, d):
        hb = self.area.bounds // 2
        return Coordinate(self.area, hb - d * hb + V(bool(d.y), bool(d.x)))
Beispiel #11
0
class Buffer(Machine):
    imgs=Img.imgstripxf("Transport/Buffer")
    def __init__(self,c,r,p):
        super().__init__(c,r,p)
        self.inv=MultiSlot([Slot() for _ in range(7)])
        self.gui=MUI.MUI("Buffer",[MUI.Inventory(self.inv)])
        self.v=Vector.vdirs[self.r]
    def input(self,d,i):
        if d==self.v:
            return self.inv.add(i)
    def update(self, pos, area, events):
        if not self.output[self.v]:
            for s in self.inv.slots:
                if s.q:
                    if self.add_output(s.item):
                        s.remove(1)
                        break
        super().update(pos,area,events)
Beispiel #12
0
class Lab(FixedMachine):
    imgs = Img.imgstripxf("Machines/Lab")
    working = False

    def __init__(self, c, p):
        super().__init__(c, p)
        self.lab = MUI.Lab(100, 10, p.team)
        self.gui = MUI.MUI("LAB", [self.lab, MUI.ElectroSlot(self)])

    def update(self, pos, area, events):
        lp = self.lab.progress
        super().update(pos, area, events)
        self.working = self.lab.progress != lp

    def input(self, d, i):
        return self.lab.inputs.add(i)

    @property
    def img(self):
        return self.imgs[self.working]
Beispiel #13
0
class Generator(FixedMachine):
    imgs = Img.imgstripxf("Machines/Generator")
    working = False

    def __init__(self, c, p):
        super().__init__(c, p)
        self.fuel = MUI.FuelSlot(20)
        self.gui = MUI.MUI("Generator", [self.fuel])

    def update(self, pos, area, events):
        lfl = self.fuel.left
        area.generate(self.fuel.get_power)
        self.working = lfl != self.fuel.left

    def input(self, d, i):
        if i.name in fuels:
            return self.fuel.slot.add(i, 1)

    @property
    def img(self):
        return self.imgs[self.working]
Beispiel #14
0
class AutoCrafter(SlotMachine):
    imgs = Img.imgstripxf("Machines/AutoCrafter")
    processor = None
    rtype = "Crafting"

    def __init__(self, c, r, p):
        super().__init__(c, r, p)
        self.electro = MUI.ElectroSlot(self)
        self.gui = MUI.MUI("Select Recipe",
                           [MUI.RSelect(get_recipes(self.p.team, self.rtype))])

    def gui_trigger(self, *args):
        if args[0] == "Change Recipe" and not (self.processor and any(
                self.processor.inputs.slots)):
            self.gui.re_init(
                "Select Recipe",
                [MUI.RSelect(get_recipes(self.p.team, self.rtype))])
            self.processor = None
        else:
            self.processor = MUI.Crafter(args,
                                         sum(q for q in args[0].values()) * 10,
                                         10)
            self.outputslot = self.processor.output
            self.gui.re_init(
                "AutoCrafter",
                [self.processor, self.electro,
                 MUI.Button(self.rtype)])

    def input(self, d, i):
        return self.processor and self.processor.inputs.add(i, 1)

    def re_own(self, p):
        self.p = p
        self.gui = MUI.MUI("Select Recipe",
                           [MUI.RSelect(get_recipes(self.p.team, self.rtype))])

    @property
    def img(self):
        return self.imgs[bool(self.processor and self.processor.progress)]
Beispiel #15
0
class Furnace(SlotMachine):
    imgs = Img.imgstripxf("Machines/Furnace", 16)
    working = False

    def __init__(self, c, r, p):
        super().__init__(c, r, p)
        self.processor = MUI.Processor("Smelting", 10)
        self.fuel = MUI.FuelSlot()
        self.gui = MUI.MUI("Furnace", [self.processor, self.fuel])
        self.outputslot = self.processor.output

    def input(self, d, i):
        if i.name in fuels:
            return self.fuel.slot.add(i, 1)
        return self.processor.input.add(i, 1)

    def update(self, pos, area, events):
        lp = self.processor.progress
        super().update(pos, area, events)
        self.working = self.processor.progress != lp

    @property
    def img(self):
        return self.imgs[self.working]
Beispiel #16
0
class Tree(Crop):
    imgs=Img.imgstripxf("World/Tree")
    item = Items.resources["Log"]
Beispiel #17
0
class FireFlower(Crop):
    imgs = Img.imgstripxf("Plants/FireFlower")
    item=Tools.FireFlower()