import pygame import os import lib.constants as constants from lib.gameregistry import GameRegistry from lib.block import Block from lib.inventory import Inventory dy_blocks={} def make_block(klass_name,name,clear=False,drops=False): def blk_init(): pass def init(self,x,y,screen): Block.__init__(self,x,y,screen) self.setTextureName(name) self.clear=clear self.drops=drops self.unlocalisedName=name attr_table={ "unlocalisedName":name, "__init__":init, "init":blk_init, } klass=type(klass_name,(Block,),attr_table) GameRegistry.registerBlock(klass,name) Block.registerTexture(name) glob=globals() glob[klass_name]=klass global dy_blocks dy_blocks[klass_name]=name return klass make_block("BlockStone","stone") make_block("BlockTree","tree",False,("wood",8)) make_block("BlockGrass","grass",True) make_block("BlockWood","wood") make_block("BlockCoal","coal_ore") GameRegistry.registerFuel("coal_ore",8) make_block("BlockIron","iron_ore") make_block("ItemIronIngot","iron_ingot",False) #make_block("ItemCoal","coal",False) class BlockDoor(Block): unlocalisedName="door" openDoor=pygame.image.load(os.path.join("tiles","door_open.png")) @classmethod def init(cls): GameRegistry.registerBlock(cls,cls.unlocalisedName) Block.registerTexture(cls.unlocalisedName) def __init__(self,x,y,screen): Block.__init__(self,x,y,screen) self.setTextureName(BlockDoor.unlocalisedName) self.unlocalisedName=BlockDoor.unlocalisedName def interact(self,inv): self.clear=not self.clear pygame.mixer.Sound("door.ogg").play().set_volume(0.2) def getTexture(self): if self.clear: return BlockDoor.openDoor else: return False def interactData(self): return {"clear":self.clear} def loadData(self,data): self.clear=data["clear"] class BlockWorkbench(Block): unlocalisedName="workbench" @classmethod def init(cls): GameRegistry.registerBlock(cls,cls.unlocalisedName) Block.registerTexture(cls.unlocalisedName) def __init__(self,x,y,screen): Block.__init__(self,x,y,screen) self.setTextureName(BlockWorkbench.unlocalisedName) self.unlocalisedName=BlockWorkbench.unlocalisedName self.inv=Inventory() def interact(self,inv): selected=inv.selected if selected!="": inv.remove(selected) self.inv.addTile(selected,1) else: if self.inv.inv in GameRegistry.recipes.values(): out="" for outp,reqs in GameRegistry.recipes.items(): if self.inv.inv==reqs: out=outp break inv.addTile(out,1) self.inv.clear() def interactData(self): return {"inv":self.inv} def loadData(self,data): self.inv=data["inv"] class BlockFurnace(Block): unlocalisedName="furnace" frames=[] @classmethod def init(cls): GameRegistry.registerBlock(cls,cls.unlocalisedName) Block.registerTexture(cls.unlocalisedName) for i in range(3): path=os.path.join("animation",cls.unlocalisedName,"{}.png".format(i)) img=pygame.image.load(path) cls.frames.append(img) def __init__(self,x,y,screen): Block.__init__(self,x,y,screen) self.setTextureName(BlockFurnace.unlocalisedName) self.unlocalisedName=BlockFurnace.unlocalisedName self.frameno=0 self.forward=True self.burn=False self.count=0 self.inp="" self.inp_amount=0 self.outp="" self.outp_amount=0 self.fuel="" self.fuel_amount=0 self.fuel_num=0 self.originator=True def interact(self,inv): sel=inv.selected if sel!="": if sel in GameRegistry.fuels.keys(): if self.fuel!="" and sel!=self.fuel: return self.fuel=sel self.fuel_num=GameRegistry.fuels[sel] self.fuel_amount+=1 if self.inp!="": if self.burn==False: self.fuel_amount-=1 self.burn=True else: if self.inp!="" and sel!=self.inp: return if not sel in GameRegistry.smelting.keys(): return self.inp_amount+=1 self.inp=sel if self.burn==False and self.fuel!="": self.fuel_amount-=1 self.burn=True inv.remove(sel) else: if self.outp!="": inv.addTile(self.outp,self.outp_amount) self.outp="" self.outp_amount=0 self.originator=True def getTexture(self): if self.burn: self.count+=1 if self.count==10: self.update() self.count=0 img=BlockFurnace.frames[self.frameno] if self.forward: self.frameno+=1 if self.frameno>2: self.frameno=1 self.forward=False else: self.frameno-=1 if self.frameno<0: self.frameno=1 self.forward=True return img else: return False self.mp_upd=True def update(self): self.fuel_num-=1 if self.inp=="": self.burn=False return if self.fuel_num<=0: if self.fuel_amount<=0: self.burn=False self.fuel="" return else: self.fuel_amount-=1 self.fuel_num=GameRegistry.fuels[self.fuel] if self.inp!="": if self.inp in GameRegistry.smelting: self.inp_amount-=1 self.outp=GameRegistry.smelting[self.inp] self.outp_amount+=1 if self.inp_amount<=0: self.inp="" if self.originator: self.mp_upd=True def loadData(self,data): self.frameno=data["frameno"] self.forward=data["forward"] self.burn=data["burn"] self.count=data["count"] self.inp=data["inp"] self.inp_amount=data["inp_amount"] self.outp=data["outp"] self.outp_amount=data["outp_amount"] self.fuel=data["fuel"] self.fuel_amount=data["fuel_amount"] self.fuel_num=data["fuel_num"] self.originator=False def interactData(self): self.mp_upd=False return { "frameno":self.frameno, "forward":self.forward, "burn":self.burn, "count":self.count, "inp":self.inp, "inp_amount":self.inp_amount, "outp":self.outp, "outp_amount":self.outp_amount, "fuel":self.fuel, "fuel_amount":self.fuel_amount, "fuel_num":self.fuel_num }