diff --git a/Main.py b/Main.py index 4bb189c..504d37e 100644 --- a/Main.py +++ b/Main.py @@ -13,8 +13,8 @@ import RealmManager # pygame setup pygame.init() -w,h = 1280, 720 -screen = pygame.display.set_mode((w, h)) +screenwidth,screenheight = 1280, 720 +screen = pygame.display.set_mode((screenwidth,screenheight)) pygame.display.set_caption('CountDuchKing') clock = pygame.time.Clock() running = True @@ -132,25 +132,22 @@ class uText: self.takenPos = [] self.texts_to_remove = [] + def getRect(self,text): + tp = self.font.render(text, True, (255, 255, 255)) + return tp.get_rect() + def write(self, text, position): if not (text,position) in self.texts: for textTest in self.texts: if textTest[0] != text and textTest[1] == position: self.texts.remove(textTest) self.texts.append((text,position)) - #print("\n\nT E X T S :") - #p = [] - #for t in self.texts: - # p.append(t[0]) - #print(p) - def delete(self, parameter, info): + def removeText(self, t): text2 = [] - for place in self.texts: - if place[0] != info and parameter == "name": - text2.append(place) - elif place[1] != info and parameter == "pos": - text2.append(place) + for text in self.texts: + if str(text[0]) != str(t): + text2.append(text) self.texts = text2 def runText(self): @@ -182,6 +179,12 @@ class uText: for subbit in bit[1]: i += 1 self.write(f"{subbit[1].capitalize()}, {subbit[0]}",(1090,100+50*i)) + elif bit[0] == "buildings": + self.write(f"{bit[0].capitalize()}:", (840,100 + 50*i)) + i -= 1 + for subbit in bit[1]: + i += 1 + self.write(f"{subbit.capitalize()}",(1090,100+50*i)) else: self.write(f"{bit[0].capitalize()}:",(840,100 + 50*i)) if bit[1] != [] and bit[1] != {}: @@ -225,7 +228,7 @@ class uButtons: "blue": (0, 0, 255,) } - def addButton(self, name, x, y, width, height, colour_standby=(255,255,255), colour_hover=(200, 200, 200), onAction=None, delOnAction=False): + def addButton(self, name, x, y, colour_standby=(255,255,255), colour_hover=(200, 200, 200), onAction=None, delOnAction=False, padX=10, padY=4, padding=None): if colour_standby != (255,255,255): if self.colours[colour_standby] != None: colour_standby = self.colours[colour_standby] @@ -236,21 +239,39 @@ class uButtons: colour_hover = self.colours[colour_hover] else: colour_hover = (200, 200, 200) + if padding != None: + padding[0] = self.colours[padding[0]] + + textRect = uTexter.getRect(name) + width = textRect.width + padX + height = textRect.height + padY button = { "text": name, - "xPos": x, - "yPos": y, + "xPos": x-(padX/2), + "yPos": y-(padY/2), "width": int(width), "height": int(height), "colour_standby": colour_standby, "colour_hover": colour_hover, "button_action": onAction, "delOnAction": delOnAction, - "isHover": False + "isHover": False, + "padding": padding } self.buttons.append(button) uTexter.write(name,(x,y)) + def removeButton(self, name): + for b in self.buttons: + if b["text"] == name: + print(f"Succesfully removed button {name}") + uTexter.removeText(name) + self.buttons.remove(b) + pass + print(f"Failed to remove button {name} among buttons ") + for b in self.buttons: + print(b["text"]) + def updateHover(self): pos = pygame.mouse.get_pos() for button in self.buttons: @@ -264,6 +285,11 @@ class uButtons: def drawButtons(self): for button in self.buttons: + if button["padding"] != None: + bP = button["padding"] + ofst = bP[1]/2 + padRect = pygame.Rect(button["xPos"]-ofst,button["yPos"]-ofst,button["width"]+bP[1],button["height"]+bP[1]) + pygame.draw.rect(screen,(bP[0]),padRect) buttonRect = pygame.Rect(button["xPos"],button["yPos"],button["width"],button["height"]) if button["isHover"] == False: pygame.draw.rect(screen,(button["colour_standby"]),buttonRect) @@ -275,11 +301,11 @@ class uButtons: if button["isHover"] == True: if button["button_action"] != None: if button["delOnAction"] == True: - self.buttons.remove(button) - uTexter.write("",(button["xPos"],button["yPos"])) + self.removeButton(button["text"]) exec(button["button_action"]) else: print(f"No action found for button {button["text"]}") + class uCommunicate: @@ -289,29 +315,33 @@ class uCommunicate: self.turnHolder = 0 self.resourceView = False #False = State resources, True = Player resources self.resourceViewActive = True #False = No Button Rendered, True = Button Rendered + self.tileSelectable = True def startGame(self): GameRealms.load(map) self.globalGameState = 1 self.globalTurn = 1 uTexter.write("Turn:",(850,580)) - uButtoner.addButton("Player", 850, 0, 120, 50, "darkgray", "gray", "uCommunicator.switchResourceView()", True) - uButtoner.addButton("Claim", 850, 500,110,40,"darkgray","gray","uCommunicator.claimState()") + uButtoner.addButton("Player", 850, 0, "darkgray", "gray", "uCommunicator.switchResourceView()", True) + uButtoner.addButton("Claim", 850, 500,"darkgray","gray","uCommunicator.claimState()") t2 = Thread(target=uCommunicator.gameLoop) t2.start() - def tileSelected(self): - uButtoner.addButton("Build", 0, 600, 100, 50, "darkgray", "gray", "uPopper.buildMenu()") - uButtoner.addButton("Assemble", 150, 600, 180, 50, "darkgray", "gray", "uPopper.buildMenu()") - uButtoner.addButton("Order", 380, 600, 120, 50, "darkgray", "gray", "uPopper.buildMenu()") - + def tileSelected(self, tPressed): + if self.globalGameState == 1: + print(f"Checking for {tPressed} in {GameRealms.getPlayer("p1").heldTiles}") + if GameRealms.tileInPlayer(tPressed,self.turnHolder): + uPopper.buttonManager() + else: + uPopper.buttonManager(True) + def switchResourceView(self): if self.resourceView: - uButtoner.addButton("Player", 850, 0, 120, 50, "darkgray", "gray", "uCommunicator.switchResourceView()", True) + uButtoner.addButton("Player", 850, 0, "darkgray", "gray", "uCommunicator.switchResourceView()", True) self.resourceView = False elif not self.resourceView: if tile_pressed != None: - uButtoner.addButton("State", 850, 0, 120, 50, "darkgray", "gray", "uCommunicator.switchResourceView()", True) + uButtoner.addButton("State", 850, 0, "darkgray", "gray", "uCommunicator.switchResourceView()", True) self.resourceViewActive = True else: self.resourceViewActive = False @@ -394,31 +424,147 @@ class uCommunicate: GameMap.claimTileFor(expandTile,GameRealms.getPlayer(f"{ccc}"),map) curPlayer.heldTiles.append(expandTile) +class tileMod: + + def __init__(self): + self.ct = 0 #Current tile + + def cct(self, t): #cycle current tile + self.ct = t + + def modIsAvailable(self,mod): + tile = GameMap.tiles[str(self.ct)] + if str(mod) in tile.buildings: + return False + return True + def buildHouse(self): + tile = GameMap.tiles[str(self.ct)] + tile.buildings.append("house") + tile.resources.append((0.25,"villagers")) + + def buildLogger(self): + print("building logger") + tile = GameMap.tiles[str(self.ct)] + tile.buildings.append("logger") + for r in tile.resources: + print(r) + if r[1] == "wood": + a = r[0]*2 + i = tile.resources.index(r) + tile.resources.remove(r) + tile.resources.insert(i,(a,"wood")) + break + + print((a,"wood")) + class uPop: def __init__(self): - self.yes = True - self.menuColour = (100, 100, 100) - self.itemColour = (200, 200, 200) - self.Popup = None - self.hasPopup = False - - def buildMenu(self): - self.hasPopup = True - self.Popup = { - "x": 200, "y": 200 - } + self.pops = {} + self.pop = None + self.buttons = False + self.popButtons = False + self.doneCheck = False + def buttonManager(self,clean=False): + if self.buttons == False and not clean: + print("Creating buttons") + uButtoner.addButton("Build", 0, 600, "darkgray", "gray", "uPopper.prefabBuild()", True) + uButtoner.addButton("Assemble", 150, 600, "darkgray", "gray", "uPopper.prefabAssemble()", True) + uButtoner.addButton("Order", 380, 600, "darkgray", "gray", "uPopper.prefabOrder()", True) + self.buttons = True + elif clean == True and self.buttons == True: + uButtoner.removeButton("Build") + uButtoner.removeButton("Assemble") + uButtoner.removeButton("Order") + self.buttons = False + + def prefabBuild(self): + print("running prefab build") + uPopper.buildPop("build",(("house","tModder.buildHouse()"),("logger","tModder.buildLogger()"))) + uButtoner.addButton("Exit", 0, 600, "darkgray", "gray", "uPopper.closePop()", True) + def prefabAssemble(self): + uPopper.buildPop("assemble",(("hello","print(\"gayass\")"),("goodbye","print(\"WootWoot\")"))) + uButtoner.addButton("Exit", 150, 600, "darkgray", "gray", "uPopper.closePop()", True) + def prefabOrder(self): + uPopper.buildPop("order",(("hello","print(\"gayass\")"),("goodbye","print(\"WootWoot\")"))) + uButtoner.addButton("Exit", 380, 600, "darkgray", "gray", "uPopper.closePop()", True) + + def buildPop(self,nameId,content,defaultColour=(100,100,100),itemColour=(200,200,200)): + curWidth = 0 + curHeight = 0 + for item in content: + t = item[0] + w, h = uTexter.getRect(str(t)).width,uTexter.getRect(str(t)).height + curHeight += h+10 + if curWidth < w: + curWidth = w + + w = curWidth + 20 + h = curHeight + 20 + x = (mapWidth-w)/2 + y = (mapHeight-h)/2 + popup = { + "x":x,"y":y,"w":w,"h":h, + "name": nameId, + "defaultColour": defaultColour, + "itemColour": itemColour, + "contents": content #Lists in the format of (buttonName,buttonAction) as the position and size is predefined + } + self.pops[nameId] = popup + self.pop = nameId + + def drawPop(self): + if self.pop != None: + p = self.pops[self.pop] + iX = p["x"] + 10 + iY = p["y"] + 10 + oY = 0 + a = 0 + if self.popButtons == False: + + uCommunicator.tileSelectable = False + for item in p["contents"]: + text = item[0] + action = item[1] + if tModder.modIsAvailable(text): + uButtoner.addButton(str(text), iX,iY+oY,"darkgray", "gray",action,True,10,4,["black",2]) + oY += uTexter.getRect(str(text)).height+10 + a += 1 + if a == 0: + uButtoner.addButton("All buildings completed",iX,iY+oY,"darkgray", "gray","uPopper.closePop()",True,10,4,["black",2]) + p["contents"] = (("All buildings completed",),) + self.doneCheck = True + self.popButtons = True + if self.doneCheck: + self.popRect = uTexter.getRect("All buildings completed") + self.popRect.x, self.popRect.y = p["x"],p["y"] + pygame.draw.rect(screen,(p["defaultColour"]),self.popRect) + else: + self.popRect = pygame.Rect(p["x"],p["y"],p["w"],p["h"]) + pygame.draw.rect(screen,(p["defaultColour"]),self.popRect) - + def closePop(self): + for c in self.pops[self.pop]["contents"]: + uButtoner.removeButton(str(c[0])) + print(f"Removed {c[0]}") + uCommunicator.tileSelectable = True + self.doneCheck = False + self.popButtons = False + self.pop = None + self.buttonManager(True) + self.buttonManager() + + +tModder = tileMod() uPopper = uPop() uButtoner = uButtons() uTexter = uText() uCommunicator = uCommunicate() def prerenderGraphics(): - uButtoner.addButton("Start Game", 850, 500, 200, 50, "darkgray", "gray", "uCommunicator.startGame()", True) + uButtoner.addButton("Start Game", 850, 500, "darkgray", "gray", "uCommunicator.startGame()", True) prerenderGraphics() @@ -457,30 +603,31 @@ while running: print(f"MB1 is true") pos = pygame.mouse.get_pos() uButtoner.pressed(pos) - if pos[0] < 830 and pos[1] < 580: + if pos[0] < 830 and pos[1] < 580 and uCommunicator.tileSelectable == True: tile_pressed = GameMap.findTileAt(pos) if tile_pressed != None: GameMap.paintTileBorder(tile_pressed, map) + tModder.cct(tile_pressed) + uCommunicator.tileSelected(tile_pressed) # fill the screen with a color to wipe away anything from last frame screen.fill("black") if uCommunicator.resourceViewActive == False and uCommunicator.resourceView == True and tile_pressed != None: - uButtoner.addButton("State", 850, 0, 120, 50, "darkgray", "gray", "uCommunicator.switchResourceView()", True) + uButtoner.addButton("State", 850, 0, "darkgray", "gray", "uCommunicator.switchResourceView()", True) if tile_pressed != None and uCommunicator.resourceView == False: uTexter.runResourceView(tile_pressed, "t") elif uCommunicator.globalGameState == 1: uTexter.runResourceView("p1", "p") - - if tile_pressed != None: - uCommunicator.tileSelected() + + screen.blit(map, maprect) + uPopper.drawPop() uButtoner.updateHover() uButtoner.drawButtons() uTexter.runText() - screen.blit(map, maprect) # RENDER YOUR GAME HERE diff --git a/Map/MapManager.py b/Map/MapManager.py index d933a4e..76d252a 100644 --- a/Map/MapManager.py +++ b/Map/MapManager.py @@ -159,7 +159,13 @@ class MapManager: tile.paint_pixels(mapObject, int(colour1),int(colour2),int(colour3)) tile.findBorder(mapObject) tile.add_resources(self.TileWorker.get_resource_for(terrain)) - + + #### Interactions + def buildHouse(self, tile): + pass + def buildBigHouse(self, tile): + pass + # Etc etc def re_load(self): print("To Be Implomented") diff --git a/Map/__pycache__/MapManager.cpython-312.pyc b/Map/__pycache__/MapManager.cpython-312.pyc index 63033af..fd70b27 100644 Binary files a/Map/__pycache__/MapManager.cpython-312.pyc and b/Map/__pycache__/MapManager.cpython-312.pyc differ diff --git a/Map/__pycache__/TileTypes.cpython-312.pyc b/Map/__pycache__/TileTypes.cpython-312.pyc index c461dca..81bf385 100644 Binary files a/Map/__pycache__/TileTypes.cpython-312.pyc and b/Map/__pycache__/TileTypes.cpython-312.pyc differ diff --git a/Realms/RealmManager.py b/Realms/RealmManager.py index 464de50..f57cdd6 100644 --- a/Realms/RealmManager.py +++ b/Realms/RealmManager.py @@ -28,6 +28,12 @@ class RealmManager: p = self.players[x] print(f"Player {p.id}/{p.name} with colour {p.borderColour}") + def tileInPlayer(self, tile, player): + for t in self.players[int(player)].heldTiles: + if str(tile) == str(t): + return True + return False + def getPlayer(self, detail): if detail == "p1": return self.players[0] @@ -72,6 +78,8 @@ class Player: "tools": 0.0, } self.daywiseResourceGain = { + "settlers": 0.0, + "villagers": 0.0, "wood": 0.0, "stone": 0.0, "food": 0.0, diff --git a/Realms/__pycache__/RealmManager.cpython-312.pyc b/Realms/__pycache__/RealmManager.cpython-312.pyc index 8192c88..1be7675 100644 Binary files a/Realms/__pycache__/RealmManager.cpython-312.pyc and b/Realms/__pycache__/RealmManager.cpython-312.pyc differ diff --git a/Script/__pycache__/ScriptUtils.cpython-312.pyc b/Script/__pycache__/ScriptUtils.cpython-312.pyc index 24c6d33..6a56826 100644 Binary files a/Script/__pycache__/ScriptUtils.cpython-312.pyc and b/Script/__pycache__/ScriptUtils.cpython-312.pyc differ