From 524769fcf3de56e20e247d448a5cddb5f04de66d Mon Sep 17 00:00:00 2001 From: ultimateownsz Date: Fri, 7 Feb 2025 16:05:33 +0100 Subject: [PATCH 1/2] feat(code-of-conduct): adapt Contributor Covenant for project needs - Adapted the Contributor Covenant v2.0 to address specific values and requirements of the project. - Added clarifications to align enforcement decisions with open-source community principles. - Updated attribution to reflect both the original source and project-specific modifications. --- CODE_OF_CONDUCT.md | 96 ++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 18c9147..6ff929c 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -9,8 +9,9 @@ identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. +We pledge to foster an open and welcoming community where diverse opinions, perspectives, and backgrounds are respected. Disagreements are natural and encourages, as long as they remain constructive and civil. + +No one will be excluded or penalized for holding a different viewpoint, political belief, or personal opinion, provided it is shared in a respectful and non-disruptive manner. Our focus is on creating a space where everyone feels safe to contribute while maintaining an environment of mutual respect. ## Our Standards @@ -18,35 +19,48 @@ Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences +* Respecting differing opinions, viewpoints, and experiences. * Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community +* Taking responsibility and apologizing for mistakes, and learning from the experience. +* Focusing on what benefits the community as a whole. +* Engage with ideas, not individuals. Critique specific points, not the person making them. +* Proposing alternatives during disagreements rather than dismissing perspectives outright. Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks +* Personal attacks, targeted harassment, or attempts to demean others based on their opinions, beliefs, or identity. * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting +* Actions that disrupt collaboration or inclusivity in the community. +* Using dismissive language to shut down another member's perspective during a debate. +* Repeatedly interrupting or dominating discussions in a way that discourages others from participating. + +## Mentorship and Newcomer Inclusion + +As an open-source communty, we are commited to fostering a welcoming envionment where new contributors feel supported. Experienced members are encouraged to: + +* Answer questions, provide guidance, and help new contributors navigate the community or project tools. +* Share knowledge openly and constructively. +* Provide actionable feedback to help newcomers grow and succeed within the project. +* Ensure documentation is clear and accessible to make onboarding smoother for everyone. + +By mentoring others, we strengthen our community and ensure its values and practices are passed on effectively. ## Enforcement Responsibilities -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. +Members with differing viewpoints, political beliefs, or opinions are welcome, as long as they engage in a respectful, constructive, and inclusive manner. + +Community leaders are responsible for ensuring that all contributions and interactions align with this Code of Conduct. They have the authority to: + + - Remove, edit, or reject any comments, commits, code, wiki edits, issues, or other contributions that violate these guidelines + - Address any behavior deemed harmful, disruptive, or inappropriate. -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. +All enforcement decisions will be reviewed by at least two leaders, and contributors will have a right to request a review if they believe a decision was unfair. + +Leaders will explain decisions to maintain trust. Contributors may request a review of any decision to ensure fairness. ## Scope @@ -66,8 +80,16 @@ All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. +### Appeals + +If a contributor feels that an enforcement decision was unfair or misunderstood their intent, they may request an appeal. Appeals will: + - Be reviewed transparently by community leaders. + - Include input from impartial members where appropriate. This ensures decisions reflect community values and remain fair to all participants. + ## Enforcement Guidelines +Enforcement aims to resolve conflicts constructively and fairly. No enforcement action will target someone solely for expressing a belief or opinion, provided it is shared respectfully. + Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: @@ -76,47 +98,47 @@ the consequences for any action they deem in violation of this Code of Conduct: **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. +**Consequence**: +- A private, written warning from community leaders. +- Clarity on why the behavior was inapproriate. +- A public apology may be requested if necessary. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. +**Consequence**: +- A written warning outlining the consequences of continued behavior. +- Restrictions on interaction with the community for a specified period. +- Failure to comply will result in escalation (e.g., a temporary ban). ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. +**Consequence**: +- A temporary ban from any form of community interaction for a specified period. +- Further violations during this time or upon re-entry will result in a permanent ban. ### 4. Permanent Ban -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. +**Community Impact**: Demonstrating a pattern of repeated violations, sustained inappropriate behavior, harassment, or aggression toward individuals or groups. -**Consequence**: A permanent ban from any sort of public interaction within +**Consequence**: +- A permanent ban from any sort of public interaction within the community. +## Review and Feedback + +This Code of Conduct is a living document. Community members are encouraged to share feedback or propose updates to ensure it continues to reflect our shared values. + ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. While it retains the core principles of the original, it has been modified to address the specific values, goals, and needs of our community. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). From 327c7ce018952f0b50856b857411461576b53fee Mon Sep 17 00:00:00 2001 From: ultimateownsz Date: Sun, 9 Feb 2025 20:15:24 +0100 Subject: [PATCH 2/2] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 60004a70941bd16949620efaa3379c663354d948 Merge: b694eca 7b98805 Author: Danilo <144124813+ultimateownsz@users.noreply.github.com> Date: Sun Feb 9 13:28:09 2025 +0100 Remove old cli codebase to new repo (#95) # Code Pull Request Template ## Summary This PR modifies the CLI codebase, all the old command line interface reference is removed and is moved to its own private repository for now. It will be made public later, to always have a reference to look at, or if you don't want to change code in pygame you can work in the classic repository. Also: - Moved an old unit test from the CLI codebase to that specific repository. - Some images we used as reference to create the board layout is moved to the other repository. - Furthermore I removed some other references that implicitly were used to have a launcher of some sorts. - Nothing is changed from the pygame loop, only the command line interface references! ## Related Issues This PR issue(s) --- ## ✅ Checklist: - [x] 🛠️ I have tested my code, and it works as expected (e.g., game runs without errors). - [x] 📝 I have made sure that the code follows the project's formatting and style guidelines. Optional: - [ ] 💬 Code is commented (if applicable) --- ## 🏷️ Labels: - `type: ...` - `area: ...` - `game: ...` commit 7b98805d7b8838fd906faed5ae9c94fa4da14704 Author: ultimateownsz Date: Tue Feb 4 21:07:22 2025 +0100 fixed ruff formatter after running ruff it made the code more clear to read commit 540062c60b01230cb313576968fb41887b077dd0 Author: ultimateownsz Date: Tue Feb 4 20:41:25 2025 +0100 moved old layout board to new repo these two files were used while creating the command line interface pyceas game commit ef3c107df3032afd6e6a644cf887a434373ce92a Author: ultimateownsz Date: Tue Feb 4 20:34:32 2025 +0100 removed old commented code this will remove the old reference to the different versions, to make it more clear that our main focus will be pygame commit 57e4beb6763344c8708a9cbcfae63eab4fea1b28 Author: ultimateownsz Date: Tue Feb 4 20:33:17 2025 +0100 old codebase refs deleted all files are moved to its own repo, for now the repo is set to private to fix any issues before making it public --- images/board_layout/CLI/board_template.txt | 17 - images/board_layout/CLI/layout_game_board.PNG | Bin 22115 -> 0 bytes main.py | 18 - src/CLI/board.py | 521 ------------------ src/CLI/buying.py | 27 - src/CLI/gameloop.py | 112 ---- src/CLI/inventory.py | 26 - src/CLI/money.py | 37 -- src/CLI/player.py | 63 --- src/CLI/selling.py | 19 - src/game_manager.py | 7 +- src/inventory_gui.py | 10 +- src/sprites.py | 9 +- src/states/base_state.py | 4 +- src/states/game_running.py | 9 +- src/states/paused.py | 10 +- tests/test_inventory.py | 1 - tests/test_py_version.py | 44 -- 18 files changed, 32 insertions(+), 902 deletions(-) delete mode 100644 images/board_layout/CLI/board_template.txt delete mode 100644 images/board_layout/CLI/layout_game_board.PNG delete mode 100644 src/CLI/board.py delete mode 100644 src/CLI/buying.py delete mode 100644 src/CLI/gameloop.py delete mode 100644 src/CLI/inventory.py delete mode 100644 src/CLI/money.py delete mode 100644 src/CLI/player.py delete mode 100644 src/CLI/selling.py delete mode 100644 tests/test_py_version.py diff --git a/images/board_layout/CLI/board_template.txt b/images/board_layout/CLI/board_template.txt deleted file mode 100644 index 3f984c0..0000000 --- a/images/board_layout/CLI/board_template.txt +++ /dev/null @@ -1,17 +0,0 @@ -This is made to see the output of the while loop we used to create the boardgame with, also to check if it prints out correctly. - -We could also just print this out as one print statement but what was the fun in that. - ROW C - _________________________________________________ - | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | - | 17 | | 28 | -R | 16 | | 29 | R -O | 15 | | 30 | O -W | 14 | | 31 | W - | 13 | | 32 | -B | 12 | | 33 | D - | 11 | | 34 | - | 10 |_______________________________________| 35 | - | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | - - ROW A \ No newline at end of file diff --git a/images/board_layout/CLI/layout_game_board.PNG b/images/board_layout/CLI/layout_game_board.PNG deleted file mode 100644 index d23cc645ca74b96882e17beeb5ed4fa743a9a692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22115 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. - # import Pygame specific objects, functions and functionality from src.game_manager import GameStateManager if __name__ == "__main__": - # version choice is disabled for debugging reasons game = GameStateManager() game.run() - - # print( - # """ - # Welcome to Pyseas! - # Please select a version to play: - # 1. CLI version - # 2. GUI version""" - # ) - # choice: str = input("Enter the number of your choice: ") - # while choice not in ['1', '2']: - # choice = input("Enter the number of your choice: ") - - # if choice == "1": - # CLI().run() - # elif choice == "2": - # GUI().run() diff --git a/src/CLI/board.py b/src/CLI/board.py deleted file mode 100644 index 753c628..0000000 --- a/src/CLI/board.py +++ /dev/null @@ -1,521 +0,0 @@ -from random import randrange, choice - -from .inventory import Inventory -from .money import Money -from .selling import ( - chest_wealth, - chest_ancient, - chest_volcanic, - chest_captain, - chest_cursed, - chest_greg, - chest_legend, - chest_mermaid, - chest_rage, - chest_strong, -) -from .buying import basic_quest, medium_quest, hard_quest, drunken_quest - - -player_inventory = Inventory() -player_wallet = Money(currency="", worth=0) - - -class Board: - def __init__(self, players): - - # all the sea of thieves inspired locations you can visit on the board - self.locations: list[str] = [ - "start", - "isle", - "event", - "isle", - "harbor", - "pirate_king", - "isle", - "captain_blazeheart", - "harbor", - "the_syndicate", - "harbor", - "change", - "isle", - "isle", - "pirate_king", - "isle", - "wreckage_isle", - "harbor", - "ghost_brig", - "harbor", - "event", - "isle", - "isle", - "pirate_king", - "harbor", - "captain_blazeheart", - "harbor", - "the_syndicate", - "isle", - "chance", - "harbor", - "harbor", - "pirate_king", - "wreckage_isle", - "dangerous_sea", - "dangerous_sea", - "dangerous_sea", - ] - - # created a list with an index and locations in a dict to handle the game logic of landing on a tile on the board to call a function - self.locations_with_index: list[dict[str, int | str]] = [] - for i, c in enumerate(self.locations): - self.locations_with_index.append({"index": i, "location": c}) - self.current_position = self.locations_with_index[0]["index"] - - # when a player rolls the dice he/she lands on one of these tiles and a function gets called - - # we had the idea to color all the tiles later on but due to time constrains we did not had the time to implement this - self.locations_actions = { - "start": self.visit_start, # yellow - "isle": self.visit_isle, # white - "event": self.visit_event, # green - "harbor": self.visit_harbor, # white - "pirate_king": self.visit_pirate_king, # grey - "captain_blazeheart": self.visit_captain_blazeheart, # grey - "the_syndicate": self.visit_the_syndicate, # red - "change": self.visit_change, # purple - "wreckage_isle": self.visit_wreckage_isle, # brown - "ghost_brig": self.visit_ghost_brig, # black - "dangerous_sea": self.visit_dangerous_sea, # white - } - self.players = {player.player_id: 0 for player in players} - - def visit_locations_by_index(self, index: int): - """ - This handles all the functions in self.locations_actions - When a player lands on a tile the action variable gets called and via that logic a function gets called when it is in the self.locations list - """ - location = self.locations[index] - action = self.locations_actions.get(location) - if action: - action() - - def update_player_position(self, player, total_roll): - """Logic of the game that updates the current player pos to a new player pos when the dices are throwed""" - # current position of the player - current_position = self.players[player.player_id] - # new position after roll - new_position = (current_position + total_roll) % len(self.locations_with_index) - # update current position of the player - self.players[player.player_id] = new_position - return new_position - - def test(self): - """ - This is an old function cause before I was still busy by implementing the logic when you throw the dice, land on a tile, a function gets called - """ - pass - - # print("Board is working!") - - def visit_start(self): - print("You are at the start.") - # self.test() - - # added a randomizer to call different isles you could visit as player - def visit_isle(self): - """The idea was that you could get a random item on the islands you visit, because of time constraints we had no time to implement this.""" - print("You arrived at an isle.") - # isle = "Island" - # isles = [can_cove, cres_isle, lone_cove, m_hide, s_bounty, smug_bay, wand_ref] - # rand_isle = random.randrange(len(isles)) - # print(f"You arrived at {isles[rand_isle]}") - # print("\nThere is a chest on the isle.") - - # we had events you could encounter like sea of thieves does - def visit_event(self): - """You get a little story event which gets you a random reward to your inventory.""" - # print("You encountered an event.\n") - loc_1 = "Red Tornado" - loc_2 = "Green Tornado" - - sea_events = [loc_1, loc_2] - event = choice(sea_events) - print(f"\nYou sail with your crew and on the horizon you see {event}") - - if event == loc_1: - player_inventory.extension(chest_rage.name) - print( - """You see a specific storming red tornado on a horizon and decide to sail and confront it! Uppon arrival you see the legendary Ghost Casper. - You emmidiatly engage in a battle with the Ashen Lord. Its a truely hellish battle. She summons her troops to help her fight you off. - It rains fire balls out of the red sky! Everywhere it shoots fire! You barely survive that fight but in the end you kill the ruthless Lord - and het your reward...""" - ) - print("\nYou get a dangerous Doom Chest!") - return - elif event == loc_2: - player_inventory.extension(chest_cursed.name) - print( - """You see a specific storming green tornado on a horizon and decide to sail and confront it! - You arrive and what you see is a frightening sight. Ghost ships come out of portals appearing on the sea! - You fight them off. You fight them all off! Heaps and heaps of waves of ghos ships appear and you and your - crew fight them until they're all sunk! - You see your price on the see!""" - ) - print("\nYou get a dangerous Cursed Chest!") - return event - - # just as sea of thieves you could visit the different sea posts in the game. - def visit_harbor(self): - """I came up with some star constellations to name these harbors""" - aquila = "The Aquila" - north_star = "The North Star Constellation" - great_har = "The Great Trade Harbor" - steph_spoils = "Stephan's Spoils" - great_bear = "The Great Bear" - phoenix_store = "The Phoenix Store" - orion = "Orion the Hunter" - mermaid = "Mermaid Twins" - - harbors = [ - aquila, - north_star, - great_har, - steph_spoils, - great_bear, - phoenix_store, - orion, - mermaid, - ] - rand_harbor = randrange(len(harbors)) - print(f"You arrived at {harbors[rand_harbor]}") - - # a randomizer of questions the pirate king could ask you if you landed on his tile - def visit_pirate_king(self): - print("You encountered the Pirate King.") - q1 = """What is the main objective in PySeas? - A. Collecting treasure - B. Battling mythical creatures - C. Exploring ancient ruins """ - pirate_king = [q1] - - question = choice(pirate_king) - print(f"Let me ask ye a question, matey! \n{question}") - is_valid_choice = False - while not is_valid_choice: - inp_choice: str = input("So what is it then? ").lower() - is_valid_choice = inp_choice in ['a', 'b', 'c'] - if not is_valid_choice: - print("Didn't they learn you to read, fool? Try again! ") - if question == q1: - if inp_choice == "c": - print( - "I've never heard that one in me life! Piss off! No gold for you..." - ) - elif inp_choice == "b": - print( - "Mate, you'll walk the plank next time if ya give such a pathetic answer again!" - ) - elif inp_choice == "a": - player_inventory.extension(chest_captain.name) - print("Well done, privateer! I'll reward you good for this one.") - # self.test() - - # just as the pirate lord tile, this logic was the same on here - def visit_captain_blazeheart(self): - print("You encountered Captain Blazeheart.") - q1 = """Which of the following is not a type of ship available in PySeas? - A) Brigantine - B) Galleon - C) Sloop """ - - cap_blaze = [q1] - - question = choice(cap_blaze) - print(f"Let me ask ye a question, matey! \n{question}") - is_valid_choice = False - while not is_valid_choice: - inp_choice = input("So what is it then? ").lower() - is_valid_choice = inp_choice in ['a', 'b', 'c'] - if not is_valid_choice: - print("Didn't they learn you to read, sea dog? Try again! ") - if question == q1: - if inp_choice.lower() == "c": - print( - "I've never heard that one in me life! Piss off! No gold for you..." - ) - elif inp_choice.lower() == "b": - print( - "Mate, you'll walk the plank next time if ya give such a pathetic answer again!" - ) - elif inp_choice.lower() == "a": - player_inventory.extension(chest_captain.name) - print("Well done, privateer! I'll reward you good for this one.") - - def visit_the_syndicate(self): - """This is the shop where you can buy quests, sell chests you found or got via events etc""" - - print("You visit the Syndicate.") - while True: - print( - """Welcome to the shop, privateer! There are a couple of actions you could do!: - 1. Choose and buy a quest for a chest! - 2. Check your inventory to see if you have enough gold! - 3. If you have something you'd like to sell, sell it here! - 4. Check how much gold you have! - 5. If you don't mean no bussiness, I'll welcome you another round! Farewell! - """ - ) - choice = input("So, what are ya wating for? What is it?: ") - - if choice == "1": - print( - """Available Quests: - 1. Quest for the burried treasure - 200 gold - 2. Quest for the Lost Chest - 1000 gold - 3. Quest for the Drunken Sailor - 1250 gold - 4. Quest for the The Vault - 1750 gold - """ - ) - quest_choice = input("Wich one would you like to buy, privateer? ") - if quest_choice == "1": - player_wallet.buy_quest(basic_quest) - player_inventory.extension(chest_captain.name) - print( - """You've got a map that leads to the burried treasure. - You make your way all the way to Cutlass Cay and dig out a wonderfull Captain's Chest - """ - ) - elif quest_choice == "2": - player_wallet.buy_quest(medium_quest) - player_inventory.extension(chest_strong.name) - print( - """You got a misterious compass. Although your facing north, the compass doesnt point that way. - It seems that the misterious compass shows you the way to the Lost Treasure! - You quickly gather your crew and sail to the location given by the misterious compass. - You arrive at a vulcanic isle and you see the treasure but its guarded by skeletons. - You and your crew quickly fight them of and take whats yours!""" - ) - elif quest_choice == "3": - player_wallet.buy_quest(hard_quest) - player_inventory.extension(chest_ancient.name) - print( - """The Pirate gives you a location of the Drunken Sailor. The Hoarder adds that he is in a possession of a great price! - You sail forth to the location and you find a port. You ask the locals of they know about the Drunken Sailor. - They tell you about the local tavern. There you find the drunken bastard sleeping with a barrel under his foot. - You slowly but quietly take the barrel out of his possession and you take it onto your ship. You notice that when - holding the treasure your view is distorted and you can’t walk straight. You’re drunk! - It seems to be the effect of holding the barrel. You also hear in your head the famous sea shanty “Drunken Sailor”... - Great! Now you have the chest of thousands Grogs and a shanty in your head...""" - ) - elif quest_choice == "4": - player_wallet.buy_quest(drunken_quest) - player_inventory.extension(chest_greg.name) - print( - """You raise your sails and sail forth to the location. - Uppon arrival it seems that there is no treasure but only another map that leads to a new locations. - You sail to a couple isles with your new maps you keep finding and you arrive at a fort where you find a burned compas. - It leeds you to a isle and the vault on it. You open the vault and see all the treasure it contains. - You take the first chest and suddenly the vault starts to close. You panic and run away with only one chest.""" - ) - else: - print("I don't have that quest in me shop! Try again!") - - elif choice == "2": - player_inventory.show_eq() - - elif choice == "3": - print("This is what you can sell: ") - player_inventory.show_eq() - print( - """Chest's overwiev: - 1. Chest of Wealth - 9500 gold - 2. Legendary Chest - 8600 gold - 3. Captain's Chest - 560 gold - 4. Chest of the Cursed One - 1160 gold - 5. Chest of a the drunken Greg - 2500 gold - 6. Mermaid's Chest - 910 gold - 7. Volcanic Chest - 520 gold - 8. Stronghold's Chest - 2000 gold - 9. Chest of Doom - 3500 gold - 10. Chest of the Ancient - 3000 gold - """ - ) - - while True: - chest_choice = input( - "What would you like to sell? (Press q to quit selling): " - ).lower() - if chest_choice == "q": - break - if chest_choice == "1": - player_wallet.sell_chest(chest_wealth) - player_inventory.remove_item(chest_wealth.name) - elif chest_choice == "2": - player_wallet.sell_chest(chest_legend) - player_inventory.remove_item(chest_legend.name) - elif chest_choice == "3": - player_wallet.sell_chest(chest_captain) - player_inventory.remove_item(chest_captain.name) - elif chest_choice == "4": - player_wallet.sell_chest(chest_cursed) - player_inventory.remove_item(chest_cursed.name) - elif chest_choice == "5": - player_wallet.sell_chest(chest_greg) - player_inventory.remove_item(chest_greg.name) - elif chest_choice == "6": - player_wallet.sell_chest(chest_mermaid) - player_inventory.remove_item(chest_mermaid.name) - elif chest_choice == "7": - player_wallet.sell_chest(chest_volcanic) - player_inventory.remove_item(chest_volcanic.name) - elif chest_choice == "8": - player_wallet.sell_chest(chest_strong) - player_inventory.remove_item(chest_strong.name) - elif chest_choice == "9": - player_wallet.sell_chest(chest_rage) - player_inventory.remove_item(chest_rage.name) - elif chest_choice == "10": - player_wallet.sell_chest(chest_ancient) - player_inventory.remove_item(chest_ancient.name) - print( - "Something else you'd like to sell? (Press q to quit selling) " - ) - - elif choice == "4": - player_wallet.show_money() - elif choice == "5": - print("Farewell, bloody Pirate!") - else: - print("There is no choice like that, try again!") - break - # self.test() - - # just like monopoly you could get a change card, because of time constraints couldn't we get this finished in time - def visit_change(self): - print("You landed on change.") - # self.test() - - # on the board you can land on shipwreck isles, these are also randomized - def visit_wreckage_isle(self): - # print(f"You found {wreck_land[rand_land]}") - wreck_1 = "La Dama Negra" - wreck_2 = "El Impulto" - wreck_3 = "The Black Pearl" - land = "Nassau" - - wreck_land = [wreck_1, wreck_2, wreck_3, land] - # rand_land = random.randrange(len(wreck_land)) - random_item = choice(wreck_land) - print("You dwell with your crew through the sea and find", random_item) - - if random_item == wreck_1: - player_inventory.extension(chest_mermaid.name) - print( - """A great man'o'war galleon that once was feared on the seas... - Now, its just a wreck. It seems a Pirate King has defeated the Legendary ship. - You dive into the water and swim into the shipwreck.!""" - ) - print("\nYou find a Coral Marauder's Chest!") - elif random_item == wreck_2: - player_inventory.extension(chest_strong.name) - print( - """Once the most powerfull ship that these seas have ever seen. Fast, a strong fire power and mighty ram attack. - Now it's just shipwreck with many others, but its legend goes on... - You dive into the water and swim into the shipwreck.""" - ) - print("\nYou find a Stronghold chest!") - elif random_item == wreck_3: - player_inventory.extension(chest_legend.name) - print( - """Every Pirate knows the legend of the Black Pearl! Once the fastest ship on the seas, a ghost ship, with black sails, - a damned crew and a Captain so evil that hell itself spat him back out... - It has been told that people entering the black pearl never came back, but then, where are the stories comming from? - You dive into the water and swim into the shipwreck.""" - ) - print("\n You find a Chest of the Damned!") - - # we wanted to have this as a jail, we could not get to this and hope we may get it later if we refactor the game to pygame for instance - def visit_ghost_brig(self): - print("You are visting the Ghost Brig.") - # self.test() - - # in sea of thieves you have boundaries, we made some tiles the red sea, maybe redundant but in practice it is okay for what you do with it - def visit_dangerous_sea(self): - """We need another name for red sea.""" - print("You are sailing in the dangerous sea.") - # self.test() - - # this is an higher order function that calls the other functions to print out the board - def print(self): - # After the function gets called it prints out this format of the board - # ROW C - # _________________________________________________ - # | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | - # | 17 | | 28 | - # R | 16 | | 29 | R - # O | 15 | | 30 | O - # W | 14 | | 31 | W - # | 13 | | 32 | - # B | 12 | | 33 | D - # | 11 | | 34 | - # | 10 |_______________________________________| 35 | - # | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | - - # ROW A - self.print_header_board() - self.print_left_right_board() - self.print_footer_board() - - def print_header_board(self) -> None: - """Prints out the header of the board""" - - row_c = self.locations_with_index[18:28] - print(" ._________________________________________________. ") - - # creates a new list with all the index numbers - new_row_c = [str(cell["index"]) for cell in row_c] - # print(new_row_c) - - # print a '|' between every index number - header = " | ".join(new_row_c) - - # print the header with a '|' on both ends - print(" | " + header + " | ") - - def print_left_right_board(self) -> None: - """Prints the left/right border of the board""" - - # haal de rijen met indexnummers op - row_b = self.locations_with_index[10:18] - row_d = self.locations_with_index[28:36] - - # for row_b we had to make it reverse, because of in the assignment we had to make the board clockwise, otherwise it could not work. - # reverse de list - row_b.reverse() - - # loops through all the index numbers - for i in range(len(row_b)): - cell_column_b = row_b[i]["index"] - cell_column_d = row_d[i]["index"] - - board_row = f" | {cell_column_b} | | {cell_column_d} |" - print(board_row) - - def print_footer_board(self) -> None: - """Prints the footer of the board""" - - # gets the first row of all index numbers - row_a = self.locations_with_index[0:10] - - row_a.reverse() - - # new list with index numbers only - new_row_a = [] - - # format the index numbers and append them to the list - for cell in row_a: - new_row_a.append(f"{cell['index']:>02}") - - # create a formatted str from the formatted index numbers - formatted_row = " | ".join(new_row_a) - print(f" | {formatted_row} | ") \ No newline at end of file diff --git a/src/CLI/buying.py b/src/CLI/buying.py deleted file mode 100644 index 70b88a5..0000000 --- a/src/CLI/buying.py +++ /dev/null @@ -1,27 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class Buying: - """There are some problems with how the game perceives buying items. it needs to be fixed or it needs to be reworked entirely.""" - - name: str - quest_type: str - quest_worth: int - - -basic_quest = Buying( - name="Quest for the burried treasure", quest_type="Basic Quest", quest_worth=200 -) - -medium_quest = Buying( - name="Quest to the Lost Treasure", quest_type="Medium Quest", quest_worth=1000 -) - -drunken_quest = Buying( - name="Quest for the Drunken Sailor", quest_type="Drunken Quest", quest_worth=1250 -) - -hard_quest = Buying( - name="Quest for the Secret Vault", quest_type="Hard Quest", quest_worth=1750 -) diff --git a/src/CLI/gameloop.py b/src/CLI/gameloop.py deleted file mode 100644 index 818ce42..0000000 --- a/src/CLI/gameloop.py +++ /dev/null @@ -1,112 +0,0 @@ -import os - -# import dataclasses and typchecking -from dataclasses import dataclass, field -from typing import List - -from src.CLI.board import Board -from src.CLI.player import Player - - -@dataclass -class CLI: - """Command Line Interface, only using print statements""" - - players: List[Player] = field(init=False) - board: Board = field(init=False) - current_player_index: int = 0 - running: bool = False - - def __post_init__(self): - self.clear_screen() - self.players = [ - Player(name_of_player="player 1", player_id=0), - Player(name_of_player="player 2", player_id=1), - ] - self.board = Board(self.players) - - # logic which players turn it is - def toggle_player_index(self): - if self.current_player_index == 0: - self.current_player_index = 1 - else: - self.current_player_index = 0 - - @staticmethod - def clear_screen(): - """A function made to clear the screen in the Python boardgame. - Could be used or altered in Pygame if needed.""" - - os.system("cls" if os.name == "nt" else "clear") - - def run(self): - self.initialize_game() - self.running = True - while self.running: - start_the_game = input( - "Would you like to start the game? Press enter to continue. " - ) - if start_the_game == "": - self.clear_screen() - break - self.board.print() - self.player_switch(self.players) - - def player_switch(self, players): - """This decides what the current player pos is and then switch to the other player, when the player gets asked to end the turn""" - - while True: - current_player = players[self.current_player_index] - print( - f"\nIt's {current_player.name_of_player.capitalize()}'s turn! Current position is {self.board.players[self.current_player_index]}" - ) - - # end_turn = False - - while True: - roll_dice = input("\nDo you want to roll the dice? (yes/y) \n") - if roll_dice.lower() in ["yes", "y"]: - # current_player.dice_roll() - current_player.move_player(self.board) - if current_player: - current_player.perform_action( - self.board, - new_position=self.board.players[self.current_player_index], - ) - break - else: - print( - "You made a mistake, you can only answer yes to roll the dice!" - ) - continue - - stop_turn = input("\nDo you want to end your turn? (yes/no) \n") - if stop_turn.lower() in ["yes", "y"]: - self.toggle_player_index() - Board(players).print() - elif stop_turn.lower() in ["no", "n"]: - print("\nYou must continue your turn.") - self.toggle_player_index() - Board(players).print() - else: - print("Input error. Please answer yes or no.") - - def initialize_game(self): - print("Ahoy Mateyy To PySeas!\n") - - for player in self.players: - while True: - name = input(f"Enter player {player.player_id+1} name: ").strip() - if 2 <= len(name) <= 10 and name.isalpha(): - player.name_of_player = name - break - else: - print( - "Input error. Player name should be between two characters and maximum ten characters containing only alphabets." - ) - continue - - # print(f"\nAhoy {self.players[0].name_of_player.capitalize()} & {self.players[1].name_of_player.capitalize()} to the start of the game!\n") - for player in self.players: - player.print_info() - return self.players diff --git a/src/CLI/inventory.py b/src/CLI/inventory.py deleted file mode 100644 index 4196700..0000000 --- a/src/CLI/inventory.py +++ /dev/null @@ -1,26 +0,0 @@ -from dataclasses import dataclass, field -from typing import List - - -@dataclass -class Inventory: - """The inventory has some problems with appending the right items, also because we use lists it can become a bit disorganised to store those items""" - - items: List[str] = field(default_factory=list) - - def extension(self, new_item: str) -> None: - self.items.append(new_item) - - def remove_item(self, sell_item: str) -> None: - if sell_item in self.items: - self.items.remove(sell_item) - else: - print("There is no such item in your inventory!") - - def show_eq(self) -> None: - if not self.items: - print("Your inventory is empty!") - else: - print("Your inventory:") - for item in self.items: - print(item) diff --git a/src/CLI/money.py b/src/CLI/money.py deleted file mode 100644 index b3a0fc8..0000000 --- a/src/CLI/money.py +++ /dev/null @@ -1,37 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class Money: - """The money class should be called something else perhaps, we should""" - - currency: str - worth: int - max_worth: int = 1500000 - # self.purchase = basic_quest - - def buy(self, purchase_amount) -> None: - self.worth -= purchase_amount - self.worth = max(self.worth, 0) - - def buy_quest(self, quest) -> None: - if self.worth >= quest.quest_worth: - print( - f"You have purchesed {quest.name} for {quest.quest_worth} {self.currency}" - ) - self.buy(quest.quest_worth) - else: - print("You don't have enough gold to buy a quest!") - - def sell(self, sell_amount) -> None: - self.worth += sell_amount - - def sell_chest(self, chest) -> None: - if self.worth <= chest.chest_worth and self.worth >= chest.chest_worth: - print(f"You sold {chest.name} for {chest.chest_worth} {self.currency}") - self.sell(chest.chest_worth) - else: - ("You don't have the items to sell!") - - def show_money(self) -> None: - print(f"You have now an impressive amount of {self.worth} {self.currency}") diff --git a/src/CLI/player.py b/src/CLI/player.py deleted file mode 100644 index 74a38eb..0000000 --- a/src/CLI/player.py +++ /dev/null @@ -1,63 +0,0 @@ -from random import randint -from dataclasses import dataclass, field -from typing import List - -from .money import Money -from .inventory import Inventory - - -@dataclass -class Player: - - name_of_player: str - player_id: int - inventory: List[str] = field(default_factory=list) - wallet: int = 0 - board_index: int = 0 - - def __post_init__(self): - self.inventory = Inventory().items - self.wallet = Money(currency="gold", worth=0).worth - - # self.roll_history_p1 = [] - # self.roll_history_p2 = [] - - def print_info(self): - print( - f"Arrr.. Mateyy {self.name_of_player.capitalize()} Down below you can see your stats:\n" - ) - print( - f"Player: {self.name_of_player.capitalize()}\nInventory: {self.inventory}\nWallet: {self.wallet}\nBoard index: {self.board_index}\n" - ) - - def dice_roll(self): - roll_results = [randint(1, 6) for _ in range(2)] - total_roll = sum(roll_results) - print( - f"\n{self.name_of_player.capitalize()} throws the dices {roll_results[0]} and {roll_results[1]}. You rolled a total of {sum(roll_results)}\n" - ) - # if self.player_id == 1: - # self.roll_history_p1.append(roll_results) - # elif self.player_id == 2: - # self.roll_history_p2.append(roll_results) - # print(f"Roll results p1: {self.roll_history_p1}\nRoll results p2: {self.roll_history_p2}") - return total_roll - - def move_player(self, board): - """ - This is the logic of the game, it moves the player when dices are throwed, - and updates the player pos to the new pos - """ - new_position = board.update_player_position( - player=self, total_roll=self.dice_roll() - ) - print( - f"{self.name_of_player.capitalize()} moves to {board.locations_with_index[new_position]}\n" - ) - return new_position - - def perform_action(self, board, new_position): - """Made this function to call the board everytime the player got on a tile to call the function""" - board.visit_locations_by_index(new_position) - if new_position in board.locations_actions: - board.locations_actions[new_position]() diff --git a/src/CLI/selling.py b/src/CLI/selling.py deleted file mode 100644 index 93387a1..0000000 --- a/src/CLI/selling.py +++ /dev/null @@ -1,19 +0,0 @@ -class Selling: - def __init__(self, name: str, chest_worth: str) -> None: - self.name = name - self.chest_worth = chest_worth - - def __str__(self): - return f"{self.name}" - - -chest_wealth = Selling(name="Chest of Wealth", chest_worth="9500") -chest_legend = Selling(name="Legendary Chest", chest_worth="8600") -chest_captain = Selling(name="Captain's Chest", chest_worth="560") -chest_cursed = Selling(name="Chest of the Cursed One", chest_worth="1160") -chest_greg = Selling(name="Chest of the drunken Greg", chest_worth="2500") -chest_mermaid = Selling(name="Mermaid's Chest", chest_worth="910") -chest_volcanic = Selling(name="Volcanic Chest", chest_worth="520") -chest_strong = Selling(name="Stronghold Chest", chest_worth="2000") -chest_rage = Selling(name="Chest of Doom", chest_worth="3500") -chest_ancient = Selling(name="Chest of the Ancients", chest_worth="3000") diff --git a/src/game_manager.py b/src/game_manager.py index 2c82a9f..a02072f 100644 --- a/src/game_manager.py +++ b/src/game_manager.py @@ -3,7 +3,6 @@ structure of the game, using a stack of states """ - import sys import pygame @@ -24,8 +23,8 @@ class GameStateManager: - Handling Pygame events and delegating them to the active state. - Running the main game loop with controlled frame rate. """ - def __init__(self) -> None: + def __init__(self) -> None: # init pygame pygame.init() self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) @@ -44,9 +43,9 @@ def __str__(self) -> str: return a string representing the stack e.g. : >MainMenu>GameRunning>Paused """ - stack_repr:str = "" + stack_repr: str = "" for state in self.states_stack: - stack_repr += '>' + str(state) + stack_repr += ">" + str(state) return stack_repr def enter_state(self, state: BaseState) -> None: diff --git a/src/inventory_gui.py b/src/inventory_gui.py index 81f63c2..abb1776 100644 --- a/src/inventory_gui.py +++ b/src/inventory_gui.py @@ -18,7 +18,7 @@ def __init__(self, screen: pygame.Surface, inventory: Inventory) -> None: self.item_height = 60 # Load sprite sheet and extract the icons (Testing purposes) - # To be replaced when: + # To be replaced when: # 1) Spritesheet has been decide. 2) A 'Buy', 'Found' or 'Add' in-game feature has been implemented self.sprite_sheet = pygame.image.load( "images/tilesets/Treasure+.png" @@ -92,7 +92,9 @@ def extract_icon(self, x, y, size=16): """Extract a single icon from the sprite sheet.""" return self.sprite_sheet.subsurface((x, y, size, size)) - def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: + def draw_buttons( + self, x: int, y: int, item: str + ) -> Tuple[pygame.Rect, pygame.Rect]: """Draw Use and Discard buttons for a specific item.""" use_button = pygame.Rect(x, y, self.button_width, self.button_height) discard_button = pygame.Rect( @@ -181,7 +183,9 @@ def handle_mouse_click(self, mouse_pos) -> None: """Handle mouse clicks on buttons.""" for item, (use_button, discard_button) in self.button_actions.items(): if use_button.collidepoint(mouse_pos): - self.message = self.inventory.use_item(item) # `self.message` stores strings + self.message = self.inventory.use_item( + item + ) # `self.message` stores strings self.message_end_time = pygame.time.get_ticks() + 3000 # 3 seconds elif discard_button.collidepoint(mouse_pos): self.message = self.inventory.remove_item(item, 1) diff --git a/src/sprites.py b/src/sprites.py index 9008089..9ad2a02 100644 --- a/src/sprites.py +++ b/src/sprites.py @@ -7,7 +7,7 @@ # class Entity(pygame.sprite.Sprite): -'''Will be later used on all entities, classes as Player will inherit from this class''' +"""Will be later used on all entities, classes as Player will inherit from this class""" # def __init__(self, pos, surf, groups): # super().__init__(groups) @@ -16,7 +16,8 @@ class AllSprites(pygame.sprite.Group): - '''A sprite group that handles every sprite and handles the camera logic''' + """A sprite group that handles every sprite and handles the camera logic""" + def __init__(self): super().__init__() @@ -32,7 +33,9 @@ def draw(self, player_center, player_preview, player_preview_rect): for sprite in self: self.display_surface.blit(sprite.image, sprite.rect.topleft + self.offset) - self.display_surface.blit(player_preview, player_preview_rect.topleft + self.offset) + self.display_surface.blit( + player_preview, player_preview_rect.topleft + self.offset + ) class Player(pygame.sprite.Sprite): diff --git a/src/states/base_state.py b/src/states/base_state.py index f3db083..94c892e 100644 --- a/src/states/base_state.py +++ b/src/states/base_state.py @@ -4,6 +4,7 @@ - `update`: A method that loops through and handles events. - `render`: A method responsible for drawing the state on the given surface. """ + from abc import ABC, abstractmethod import pygame @@ -12,6 +13,7 @@ class BaseState(ABC): """ using an abstract class to ensure each state has the right methods """ + def __init__(self, game_state_manager) -> None: self.game_state_manager = game_state_manager @@ -19,7 +21,7 @@ def __str__(self): return self.__class__.__name__ @abstractmethod - def update(self, events): # return self + def update(self, events): # return self """ update current state handle events diff --git a/src/states/game_running.py b/src/states/game_running.py index 33cf9a4..911e1c6 100644 --- a/src/states/game_running.py +++ b/src/states/game_running.py @@ -1,6 +1,7 @@ """ Represents the GameRunning state, where the player controls a ship and interacts with the game world. """ + import os import json import pygame @@ -24,10 +25,10 @@ class GameRunning(BaseState): - Updates game entities. - Renders the game world on the screen. """ + def __init__(self, game_state_manager) -> None: super().__init__(game_state_manager) - # Initialize player inventory self.player_inventory = Inventory() self.load_inventory_from_json("data/inventory.json") @@ -46,7 +47,7 @@ def setup(self, player_start_pos): } # Islands - islands = self.tmx_map['map'].get_layer_by_name("Islands") + islands = self.tmx_map["map"].get_layer_by_name("Islands") for x, y, surface in islands.tiles(): src.sprites.Tile( self.all_sprites, @@ -55,7 +56,7 @@ def setup(self, player_start_pos): ) # Objects - for obj in self.tmx_map['map'].get_layer_by_name("Ships"): + for obj in self.tmx_map["map"].get_layer_by_name("Ships"): if obj.name == "Player" and obj.properties["pos"] == player_start_pos: self.player = src.sprites.Player((obj.x, obj.y), self.all_sprites) @@ -91,7 +92,7 @@ def render(self, screen) -> None: self.all_sprites.draw( self.player.rect.center, self.player.player_preview, - self.player.player_preview_rect + self.player.player_preview_rect, ) pygame.display.update() diff --git a/src/states/paused.py b/src/states/paused.py index 8565ca1..5711b96 100644 --- a/src/states/paused.py +++ b/src/states/paused.py @@ -2,6 +2,7 @@ paused state holding the inventory """ + from typing import Dict, Tuple import pygame @@ -16,6 +17,7 @@ class Paused(BaseState): paused state holding the inventory """ + def __init__(self, game_state_manager, inventory: Inventory) -> None: super().__init__(game_state_manager) @@ -97,7 +99,9 @@ def handle_mouse_click(self, mouse_pos) -> None: """Handle mouse clicks on buttons.""" for item, (use_button, discard_button) in self.button_actions.items(): if use_button.collidepoint(mouse_pos): - self.message = self.inventory.use_item(item) # `self.message` stores strings + self.message = self.inventory.use_item( + item + ) # `self.message` stores strings self.message_end_time = pygame.time.get_ticks() + 3000 # 3 seconds elif discard_button.collidepoint(mouse_pos): self.message = self.inventory.remove_item(item, 1) @@ -107,7 +111,9 @@ def extract_icon(self, x, y, size=16): """Extract a single icon from the sprite sheet.""" return self.sprite_sheet.subsurface((x, y, size, size)) - def draw_buttons(self, x: int, y: int, item: str) -> Tuple[pygame.Rect, pygame.Rect]: + def draw_buttons( + self, x: int, y: int, item: str + ) -> Tuple[pygame.Rect, pygame.Rect]: """Draw Use and Discard buttons for a specific item.""" use_button = pygame.Rect(x, y, self.button_width, self.button_height) discard_button = pygame.Rect( diff --git a/tests/test_inventory.py b/tests/test_inventory.py index 8e5f3fd..01649f7 100644 --- a/tests/test_inventory.py +++ b/tests/test_inventory.py @@ -8,7 +8,6 @@ from src.GUI.inventory import Inventory, Chest, Quest - class TestInventory(unittest.TestCase): def setUp(self): """Set up a new Inventory object before each test.""" diff --git a/tests/test_py_version.py b/tests/test_py_version.py deleted file mode 100644 index 498e093..0000000 --- a/tests/test_py_version.py +++ /dev/null @@ -1,44 +0,0 @@ -import sys -import os -from unittest.mock import patch -import pytest - - -def setup_path(): - # Ensure the src directory is given a higher priority - current_dir = os.path.abspath(os.path.dirname(__file__)) - src_dir = os.path.abspath(os.path.join(current_dir, "..", "src")) - sys.path.append(src_dir) - - -setup_path() - - -@patch("random.randint") -def test_dice_roll(mock_randint): - from CLI.player import Player # Import after updating sys.path - - """ - Test that the dice_roll method of the Player class only uses the numbers 3 and 4 to achieve a total roll of 7. - Mocks random.randint to return the sequence [3, 4] repeatedly and asserts the total roll is 7. - """ - print("Running test_dice_roll...") # Debug statement - - # Define the sequence of values to mock - mock_randint.side_effect = [3, 4, 3, 4] # Repeat the sequence if needed - - instance = Player(name_of_player="TestPlayer", player_id=1) - - roll_results = [] - total_roll = 0 - - while total_roll != 7: - total_roll = instance.dice_roll() - roll_results.append(total_roll) - print(f"Generated roll: {total_roll}") - - assert total_roll == 7 - - -if __name__ == "__main__": - pytest.main()