241 lines
6.1 KiB
Python
241 lines
6.1 KiB
Python
|
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
|
||
|
}
|