├── .coveragerc ├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.yml │ ├── config.yml │ ├── enhancement.yml │ └── feature-request.yml ├── PULL_REQUEST_TEMPLATE │ ├── code_pr_template.md │ ├── docs_pr_template.md │ └── pr_revert_template.md ├── pull_request_template.md └── workflows │ └── lint-and-test.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── audio ├── axe.ogg ├── bg.ogg ├── cant_plant.ogg ├── countdown_count.ogg ├── countdown_end.ogg ├── hoe.ogg ├── mixkit-inside-a-volcano-2438.ogg ├── mixkit-volcano-lava-hiss-2447.ogg ├── music.ogg ├── music_old.ogg ├── plant.ogg ├── pop0.ogg ├── pop1.ogg ├── pop2.ogg ├── success.ogg ├── swing.ogg └── water.ogg ├── copy_round_config.sh ├── data ├── .DS_Store ├── database │ └── database.db ├── maps │ ├── farm.tmx │ ├── farm_new.tmx │ ├── forest.tmx │ ├── minigame.tmx │ └── town.tmx ├── npc_scripted_paths │ └── cow_herding │ │ ├── example.json │ │ ├── ingroup │ │ ├── 10-48.json │ │ ├── 11-61.json │ │ ├── 13-38.json │ │ ├── 16-88.json │ │ ├── 17-71.json │ │ ├── 21-13.json │ │ ├── 23-49.json │ │ ├── 25-35.json │ │ ├── 28-18.json │ │ ├── 30-90.json │ │ ├── 35-88.json │ │ ├── 36-01.json │ │ ├── 50-08.json │ │ └── 6-26.json │ │ └── outgroup │ │ ├── 10-21.json │ │ ├── 11-85.json │ │ ├── 14-02.json │ │ ├── 16-43.json │ │ ├── 17-64.json │ │ ├── 21-04.json │ │ ├── 24-16.json │ │ ├── 25-04.json │ │ ├── 27-26.json │ │ ├── 29-74.json │ │ ├── 34-16.json │ │ ├── 38-36.json │ │ ├── 58-92.json │ │ └── 6-94.json ├── save.json ├── settings │ └── rounds_config.json ├── textboxes │ ├── de │ │ ├── dialogues.json │ │ └── tutorial.json │ └── en │ │ ├── dialogues.json │ │ └── tutorial.json ├── tilesets │ ├── Barn structures.tsx │ ├── Basic_Furniture.tsx │ ├── Bush_Tiles.tsx │ ├── Chest.tsx │ ├── Darker_Grass_Hill_Tiles_Slopes_v2.tsx │ ├── Darker_Grass_Hills_Tiles_v2.tsx │ ├── Darker_Grass_Tile_Layers.tsx │ ├── Grass_Tile_layers2.tsx │ ├── Grass_tiles_v2.tsx │ ├── Interaction.tsx │ ├── NPCs.tsx │ ├── Paths.tsx │ ├── Stone_Path.tsx │ ├── Water_troughs.tsx │ ├── Wooden_Bridge_v2.tsx │ ├── Wooden_House_Roof_Tileset.tsx │ ├── Wooden_House_Walls_Tileset_modified.tsx │ ├── fence_tileset.tsx │ ├── grass_tileset.tsx │ ├── hill_tileset.tsx │ ├── house_tileset.tsx │ ├── objects.tsx │ ├── soil_tileset.tsx │ └── trees_and_bushes.tsx └── translations │ ├── de.txt │ └── en.txt ├── docs └── CODE_OF_CONDUCT.md ├── export_excel2json.sh ├── extract_translations.sh ├── font └── LycheeSoda.ttf ├── formatlint.py ├── images ├── characters │ ├── rabbit │ │ ├── axe.png │ │ ├── goggles_axe.png │ │ ├── goggles_hoe.png │ │ ├── goggles_idle.png │ │ ├── goggles_walk.png │ │ ├── goggles_water.png │ │ ├── hat_axe.png │ │ ├── hat_hoe.png │ │ ├── hat_idle.png │ │ ├── hat_walk.png │ │ ├── hat_water.png │ │ ├── hoe.png │ │ ├── horn_axe.png │ │ ├── horn_hoe.png │ │ ├── horn_idle.png │ │ ├── horn_walk.png │ │ ├── horn_water.png │ │ ├── idle.png │ │ ├── necklace_axe.png │ │ ├── necklace_hoe.png │ │ ├── necklace_idle.png │ │ ├── necklace_walk.png │ │ ├── necklace_water.png │ │ ├── outgroup_axe.png │ │ ├── outgroup_hoe.png │ │ ├── outgroup_idle.png │ │ ├── outgroup_walk.png │ │ ├── outgroup_water.png │ │ ├── walk.png │ │ └── water.png │ └── test 1 │ │ └── t1.png ├── entities │ ├── chicken │ │ ├── idle.png │ │ └── walk.png │ └── cow │ │ ├── idle.png │ │ └── walk.png ├── fast_forward │ ├── 0001.png │ ├── 0002.png │ ├── 0003.png │ ├── 0004.png │ ├── 0005.png │ ├── 0006.png │ ├── 0007.png │ ├── 0008.png │ ├── 0009.png │ └── 0010.png ├── misc │ ├── smoke_infinite.png │ ├── smoke_start.png │ ├── volcano.png │ ├── volcano_exploding.png │ └── water.png ├── objects │ ├── Piknik basket.png │ ├── Piknik blanket.png │ ├── Signpost_Bathtub_Down_LSA.png │ ├── Signpost_Bathtub_Left.png │ ├── Signpost_Bathtub_Right.png │ ├── Signpost_Emoji_New.png │ ├── Signpost_Farm_Left.png │ ├── Signpost_Farm_Right.png │ ├── Signpost_Farm_Right_Left.png │ ├── Signpost_Farm_Up_RSA.png │ ├── Signpost_Forest_01_Down_RSA.png │ ├── Signpost_Forest_02_Right.png │ ├── Signpost_Forrest_01_Left.png │ ├── Signpost_Forrest_01_Right.png │ ├── Signpost_Forrest_02_Left.png │ ├── Signpost_Forrest_02_Right.png │ ├── Signpost_Forrest_03_Left.png │ ├── Signpost_Forrest_03_Right.png │ ├── Signpost_Forrest_RL.png │ ├── Signpost_Left.png │ ├── Signpost_RL.png │ ├── Signpost_Right.png │ ├── Signpost_Village_Down_LSA.png │ ├── Signpost_Village_Down_RSA.png │ ├── Signpost_Village_Left.png │ ├── Signpost_Village_Right.png │ ├── Water well.png │ ├── bed.png │ ├── blanket.png │ ├── boat.png │ ├── bush_medium.png │ ├── bush_medium_blackberry.png │ ├── bush_medium_blueberry.png │ ├── bush_medium_raspberry.png │ ├── bush_small.png │ ├── candy_bar.png │ ├── chicken.png │ ├── coop_blue.png │ ├── coop_green.png │ ├── cow.png │ ├── desk.png │ ├── flower_0.png │ ├── flower_1.png │ ├── flower_2.png │ ├── flower_3.png │ ├── flower_4.png │ ├── flower_5.png │ ├── flower_6.png │ ├── flower_7.png │ ├── flower_8.png │ ├── flower_9.png │ ├── items │ │ ├── apple.png │ │ ├── axe.png │ │ ├── beetroot.png │ │ ├── beetroot_seed.png │ │ ├── blackberry.png │ │ ├── blue_cabbage.png │ │ ├── blue_cabbage_seed.png │ │ ├── blue_star.png │ │ ├── blue_star_seed.png │ │ ├── blueberry.png │ │ ├── cabbage.png │ │ ├── cabbage_seed.png │ │ ├── carrot.png │ │ ├── carrot_seed.png │ │ ├── cauliflower.png │ │ ├── cauliflower_seed.png │ │ ├── corn.png │ │ ├── corn_seed.png │ │ ├── eggplant.png │ │ ├── eggplant_seed.png │ │ ├── green_bean.png │ │ ├── green_bean_seed.png │ │ ├── hoe.png │ │ ├── orange.png │ │ ├── parsnip.png │ │ ├── parsnip_seed.png │ │ ├── peach.png │ │ ├── pear.png │ │ ├── pumpkin.png │ │ ├── pumpkin_seed.png │ │ ├── raspberry.png │ │ ├── rose.png │ │ ├── rose_seed.png │ │ ├── tomato.png │ │ ├── tomato_seed.png │ │ ├── water.png │ │ ├── wheat.png │ │ ├── wheat_seed.png │ │ └── wood.png │ ├── log.png │ ├── log_medium.png │ ├── log_medium_mushroom.png │ ├── mailbox.png │ ├── merchant.png │ ├── mushroom_pink.png │ ├── mushroom_red.png │ ├── mushrooms_red.png │ ├── npc_ingroup.png │ ├── npc_nogroup.png │ ├── npc_outgroup.png │ ├── rabbit.png │ ├── rock.png │ ├── rock_large.png │ ├── rock_small.png │ ├── rock_very_large.png │ ├── seaweed_0.png │ ├── seaweed_1.png │ ├── sign.png │ ├── stump.png │ ├── stump_large.png │ ├── stump_small.png │ ├── stump_very_large.png │ ├── sunflower.png │ ├── tree.png │ ├── tree_fallen_medium.png │ ├── tree_fallen_small.png │ ├── tree_large.png │ ├── tree_medium_apple.png │ ├── tree_medium_orange.png │ ├── tree_medium_peach.png │ ├── tree_medium_pear.png │ ├── tree_small.png │ ├── water_lilies.png │ ├── water_lily.png │ ├── water_rock.png │ ├── water_rock_small.png │ ├── weed_0.png │ ├── weed_1.png │ ├── weed_2.png │ └── weed_3.png ├── rain │ ├── drops │ │ ├── 0.png │ │ ├── 1.png │ │ └── 2.png │ └── floor │ │ ├── 0.png │ │ ├── 1.png │ │ └── 2.png ├── sam │ ├── arousal │ │ ├── sam-arousal-1.png │ │ ├── sam-arousal-2.png │ │ ├── sam-arousal-3.png │ │ ├── sam-arousal-4.png │ │ ├── sam-arousal-5.png │ │ ├── sam-arousal-6.png │ │ ├── sam-arousal-7.png │ │ └── sam-arousal-9.png │ ├── dominance │ │ ├── sam-dominance-1.png │ │ ├── sam-dominance-2.png │ │ ├── sam-dominance-3.png │ │ ├── sam-dominance-4.png │ │ ├── sam-dominance-5.png │ │ ├── sam-dominance-6.png │ │ ├── sam-dominance-7.png │ │ └── sam-dominance-9.png │ └── valence │ │ ├── sam-valence-1.png │ │ ├── sam-valence-2.png │ │ ├── sam-valence-3.png │ │ ├── sam-valence-4.png │ │ ├── sam-valence-5.png │ │ ├── sam-valence-6.png │ │ ├── sam-valence-7.png │ │ └── sam-valence-9.png ├── tilesets │ ├── Barn structures.png │ ├── Basic_Furniture.png │ ├── Bush_Tiles.png │ ├── Chest.png │ ├── Darker_Grass_Hill_Tiles_Slopes_v2.png │ ├── Darker_Grass_Hills_Tiles_v2.png │ ├── Darker_Grass_Tile_Layers.png │ ├── Grass_Tile_layers2.png │ ├── Grass_tiles_v2.png │ ├── Paths.png │ ├── Stone_Path.png │ ├── Tilled_Dirt.png │ ├── Water tray.png │ ├── Wooden_Bridge_v2.png │ ├── Wooden_House_Roof_Tileset.png │ ├── Wooden_House_Walls_Tileset_modified.png │ ├── fence_tileset.png │ ├── grass_tileset.png │ ├── hill_tileset.png │ ├── house_tileset.png │ ├── plants │ │ ├── beetroot │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── blue_cabbbage │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── blue_star │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── cabbage │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── carrot │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── cauliflower │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── corn │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ └── 4.png │ │ ├── eggplant │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── green_bean │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── parsnip │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── pumpkin │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── rose │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ ├── tomato │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ └── wheat │ │ │ ├── 0.png │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ └── soil │ │ ├── b.png │ │ ├── bl.png │ │ ├── br.png │ │ ├── l.png │ │ ├── lr.png │ │ ├── lrb.png │ │ ├── lrt.png │ │ ├── o.png │ │ ├── r.png │ │ ├── soil water │ │ ├── 0.png │ │ ├── 1.png │ │ └── 2.png │ │ ├── t.png │ │ ├── tb.png │ │ ├── tbl.png │ │ ├── tbr.png │ │ ├── tl.png │ │ ├── tr.png │ │ └── x.png └── ui │ ├── Cursor.png │ ├── KeyBindUI_Placeholder-new.png │ ├── KeyBindUI_Placeholder.png │ ├── bg.png │ ├── checkmark.png │ ├── cosmetics.png │ ├── cursor │ ├── 0.png │ ├── 1.png │ └── 2.png │ ├── dialog_boxes │ └── tiny_down.png │ ├── emotes │ └── sprout_lands │ │ ├── cheer_ani.png │ │ ├── cool_ani.png │ │ ├── furious_ani.png │ │ ├── love_ani.png │ │ ├── sad_ani.png │ │ ├── sad_sick_ani.png │ │ ├── sleep_ani.png │ │ ├── smile_ani.png │ │ └── wink_ani.png │ ├── health_bar │ ├── health_bar.png │ ├── health_cat_1.png │ ├── health_cat_2.png │ └── health_cat_3.png │ ├── indicators │ ├── entity_focused.png │ └── entity_focused_big.png │ ├── interaction.png │ ├── keys │ ├── E-black.png │ ├── E-white.png │ ├── I-black.png │ ├── I-white.png │ ├── alt.png │ ├── down.png │ ├── generic.png │ ├── lclick.png │ ├── lctrl.png │ ├── left.png │ ├── lshift.png │ ├── rclick.png │ ├── rctrl.png │ ├── return.png │ ├── right.png │ ├── rshift.png │ ├── space.png │ ├── tab.png │ └── up.png │ └── textbox.png ├── main.py ├── pyproject.toml ├── requirements-dev.txt ├── requirements-test.txt ├── requirements.txt ├── run_game.sh ├── run_web_mode.sh ├── src ├── .DS_Store ├── __init__.py ├── camera │ ├── __init__.py │ ├── camera.py │ ├── camera_target.py │ ├── quaker.py │ ├── zoom_area.py │ └── zoom_manager.py ├── client.py ├── colors.py ├── controls.py ├── enums.py ├── events.py ├── exceptions.py ├── fblitter.py ├── groups.py ├── gui │ ├── __init__.py │ ├── health_bar.py │ ├── interface │ │ ├── __init__.py │ │ ├── dialog.py │ │ ├── emotes.py │ │ ├── emotes_base.py │ │ └── indicators.py │ ├── menu │ │ ├── __init__.py │ │ ├── abstract_menu.py │ │ ├── components.py │ │ ├── description.py │ │ └── general_menu.py │ ├── scene_animation.py │ └── setup.py ├── import_checks.py ├── map_objects.py ├── npc │ ├── __init__.py │ ├── bases │ │ ├── __init__.py │ │ ├── ai_behaviour.py │ │ ├── ai_behaviour_base.py │ │ ├── animal.py │ │ ├── chicken_base.py │ │ ├── cow_base.py │ │ └── npc_base.py │ ├── behaviour │ │ ├── __init__.py │ │ ├── ai_behaviour_tree_base.py │ │ ├── chicken_behaviour_tree.py │ │ ├── cow_behaviour_tree.py │ │ └── npc_behaviour_tree.py │ ├── chicken.py │ ├── cow.py │ ├── npc.py │ ├── path_scripting.py │ ├── setup.py │ └── utils.py ├── overlay │ ├── box_keybindings.py │ ├── clock.py │ ├── fast_forward.py │ ├── fps.py │ ├── game_time.py │ ├── money.py │ ├── overlay.py │ ├── sky.py │ ├── soil.py │ └── transition.py ├── savefile │ ├── __init__.py │ ├── savefile.py │ └── tile_info.py ├── screens │ ├── game_map.py │ ├── inventory.py │ ├── level.py │ ├── menu_main.py │ ├── menu_notification.py │ ├── menu_pause.py │ ├── menu_round_end.py │ ├── menu_settings.py │ ├── minigames │ │ ├── base.py │ │ ├── cow_herding.py │ │ ├── cow_herding_behaviour.py │ │ ├── cow_herding_overlay.py │ │ └── gui.py │ ├── player_task.py │ ├── self_assessment_menu.py │ ├── shop.py │ ├── social_identity_assessment.py │ └── switch_to_outgroup_menu.py ├── settings.py ├── sprites │ ├── __init__.py │ ├── base.py │ ├── entities │ │ ├── __init__.py │ │ ├── character.py │ │ ├── entity.py │ │ └── player.py │ ├── objects │ │ ├── berry_bush.py │ │ ├── plant.py │ │ └── tree.py │ ├── particle.py │ ├── setup.py │ └── water_drop.py ├── support.py ├── tests │ ├── __init__.py │ ├── test_event_expansion.py │ ├── test_support.py │ └── test_utils.py ├── timer.py ├── tutorial │ └── tutorial.py ├── utils.py └── xplat.py ├── test_formatting.sh └── tools ├── ReadMe.md ├── excel_to_json.py ├── extract_translations.py ├── game_levels.xlsx └── impl_excel_to_json ├── cell_parser.py └── excel_helpers.py /.coveragerc: -------------------------------------------------------------------------------- 1 | [report] 2 | show_missing = True -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/Dockerfile 2 | *.md 3 | **/__pycache__ 4 | .github 5 | .git 6 | .ruff_cache -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Discord Community 4 | url: https://discord.gg/SuthU2qKaZ 5 | about: Join our Discord community to ask questions, get help and report problems. 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.yml: -------------------------------------------------------------------------------- 1 | name: Project Enhancement 2 | description: Suggest an enhancement to the project overall. 3 | title: "Enha: " 4 | labels: ["type: enhancement"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to make your suggestion! 10 | - type: input 11 | id: enhancement-title 12 | attributes: 13 | label: What would you like to see changed in one sentence? 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: enhancement-body 18 | attributes: 19 | label: Elaborate on your suggestion above as needed. 20 | placeholder: Tell us why this change is needed! 21 | value: | 22 | ... 23 | 24 | 26 | 30 | validations: 31 | required: true 32 | - type: dropdown 33 | id: aspect 34 | attributes: 35 | label: Which aspect(s) of the project is this enhancement affecting? 36 | description: See [this wiki page](https://github.com/sloukit/pydew-valley-uzh/wiki/How-to-choose-labels) for more information on how to choose labels. 37 | multiple: true 38 | options: 39 | - "area: ci" 40 | - "area: code quality" 41 | - "area: dependencies" 42 | - "area: documentation" 43 | - "area: publishing" 44 | - "area: testing" 45 | - game-art 46 | - game-audio 47 | - game-design 48 | - game-level-design 49 | - game-ui 50 | - game-gameplay 51 | - game-playtesting 52 | - game-ai 53 | - game-help 54 | - game-story 55 | validations: 56 | required: true 57 | - type: checkboxes 58 | id: terms 59 | attributes: 60 | label: Code of Conduct 61 | description: By submitting this issue, you agree to follow our Code of Conduct. 62 | options: 63 | - label: I agree to follow this project's Code of Conduct. 64 | required: true 65 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Request a new feature to be added to the game. 3 | title: "Feat: " 4 | labels: ["type: feature request"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to suggest a new feature! 10 | - type: input 11 | id: feature-request-title 12 | attributes: 13 | label: What feature would you like to see added in one sentence? 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: feature-request-body 18 | attributes: 19 | label: Elaborate on your request above as needed. 20 | placeholder: Tell us why this feature should be added! 21 | value: | 22 | ... 23 | 24 | 26 | 30 | validations: 31 | required: true 32 | - type: dropdown 33 | id: aspect 34 | attributes: 35 | label: Which aspect(s) of the project is this enhancement affecting? 36 | description: See [this wiki page](https://github.com/sloukit/pydew-valley-uzh/wiki/How-to-choose-labels) for more information on how to choose labels. 37 | multiple: true 38 | options: 39 | - game-art 40 | - game-audio 41 | - game-design 42 | - game-level-design 43 | - game-ui 44 | - game-gameplay 45 | - game-playtesting 46 | - game-ai 47 | - game-help 48 | - game-story 49 | validations: 50 | required: true 51 | - type: checkboxes 52 | id: terms 53 | attributes: 54 | label: Code of Conduct 55 | description: By submitting this issue, you agree to follow our Code of Conduct. 56 | options: 57 | - label: I agree to follow this project's Code of Conduct. 58 | required: true 59 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/code_pr_template.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | ## Summary 6 | 7 | This PR . 8 | 9 | 10 | 11 | 13 | 14 | ## Checklist 15 | 16 | - [ ] I have tested this change locally and it works as expected. 17 | - [ ] I have made sure that the code follows the formatting and style guidelines of the project. 18 | 19 | 20 | ## Labels 21 | `type: ...`, `area: ...`, `game-...`, ... 22 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/docs_pr_template.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | ## Summary 6 | 7 | This PR documentation for ... 8 | 9 | 10 | 11 | ## Checklist 12 | - [ ] I have proofread files for spelling and grammar errors. 13 | 14 | 15 | ## Labels 16 | `type: enhancement`, `area: documentation`, ... 17 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/pr_revert_template.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | ## Summary 6 | This PR reverts the changes made in PR #... . 7 | 8 | 9 | 10 | ## Checklist 11 | - [ ] I have checked that my revert leaves the codebase in the same state as before the target PR. 12 | 13 | 14 | ## Labels 15 | `type: ...`, `area: ...`, `game-...`, ... 16 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Please go the the `Preview` tab and select the appropriate sub-template: 2 | 3 | * [Features/Enhancements/Fixes](?expand=1&template=code_pr_template.md) 4 | * [Documentation](?expand=1&template=docs_pr_template.md) 5 | * [Reverts](?expand=1&template=pr_revert_template.md) 6 | -------------------------------------------------------------------------------- /.github/workflows/lint-and-test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, reopened] 6 | push: 7 | branches: [main] 8 | 9 | jobs: 10 | style-lint: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout code 15 | uses: actions/checkout@v4 16 | 17 | - name: Set up Python 18 | uses: actions/setup-python@v5 19 | with: 20 | python-version: "3.12" 21 | 22 | - name: Install lint dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | pip install -r requirements-dev.txt 26 | pip install tox 27 | 28 | - name: Check code style and lint with Ruff 29 | run: | 30 | tox -e ruff 31 | 32 | test: 33 | runs-on: ubuntu-latest 34 | 35 | steps: 36 | - name: Checkout code 37 | uses: actions/checkout@v4 38 | 39 | - name: Set up Python 40 | uses: actions/setup-python@v5 41 | with: 42 | python-version: "3.12" 43 | 44 | - name: Install test dependencies 45 | run: | 46 | python -m pip install --upgrade pip 47 | pip install -r requirements-test.txt 48 | 49 | - name: Run tests 50 | run: | 51 | tox -e py312 52 | -------------------------------------------------------------------------------- /audio/axe.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/axe.ogg -------------------------------------------------------------------------------- /audio/bg.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/bg.ogg -------------------------------------------------------------------------------- /audio/cant_plant.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/cant_plant.ogg -------------------------------------------------------------------------------- /audio/countdown_count.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/countdown_count.ogg -------------------------------------------------------------------------------- /audio/countdown_end.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/countdown_end.ogg -------------------------------------------------------------------------------- /audio/hoe.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/hoe.ogg -------------------------------------------------------------------------------- /audio/mixkit-inside-a-volcano-2438.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/mixkit-inside-a-volcano-2438.ogg -------------------------------------------------------------------------------- /audio/mixkit-volcano-lava-hiss-2447.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/mixkit-volcano-lava-hiss-2447.ogg -------------------------------------------------------------------------------- /audio/music.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/music.ogg -------------------------------------------------------------------------------- /audio/music_old.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/music_old.ogg -------------------------------------------------------------------------------- /audio/plant.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/plant.ogg -------------------------------------------------------------------------------- /audio/pop0.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/pop0.ogg -------------------------------------------------------------------------------- /audio/pop1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/pop1.ogg -------------------------------------------------------------------------------- /audio/pop2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/pop2.ogg -------------------------------------------------------------------------------- /audio/success.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/success.ogg -------------------------------------------------------------------------------- /audio/swing.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/swing.ogg -------------------------------------------------------------------------------- /audio/water.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/audio/water.ogg -------------------------------------------------------------------------------- /copy_round_config.sh: -------------------------------------------------------------------------------- 1 | # WARNING! this will overwrite the config currently in use 2 | cp tools/output/rounds_config.json data/settings/ 3 | -------------------------------------------------------------------------------- /data/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/data/.DS_Store -------------------------------------------------------------------------------- /data/database/database.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/data/database/database.db -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/example.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729288697.5426562, "total_time": 12.853, "paths": {"4": {"start_pos": [1684.0, 1084.0], "waypoints": [{"pos": [25, 18], "speed": 150, "waiting_duration": 0.0}, {"pos": [25, 17], "speed": 350, "waiting_duration": 0.0}, {"pos": [25, 18], "speed": 150, "waiting_duration": 1.59}, {"pos": [26, 17], "speed": 350, "waiting_duration": 0.0}, {"pos": [27, 16], "speed": 350, "waiting_duration": 0.27}, {"pos": [28, 15], "speed": 350, "waiting_duration": 0.31}, {"pos": [28, 14], "speed": 350, "waiting_duration": 0.61}, {"pos": [28, 13], "speed": 350, "waiting_duration": 0.08}, {"pos": [28, 12], "speed": 350, "waiting_duration": 0.07}, {"pos": [27, 9], "speed": 350, "waiting_duration": 0.51}, {"pos": [29, 8], "speed": 150, "waiting_duration": 3.48}]}, "5": {"start_pos": [1472.0, 1212.0], "waypoints": [{"pos": [22, 21], "speed": 150, "waiting_duration": 0.0}, {"pos": [22, 21], "speed": 350, "waiting_duration": 0.0}, {"pos": [21, 21], "speed": 350, "waiting_duration": 0.03}, {"pos": [21, 22], "speed": 350, "waiting_duration": 0.07}, {"pos": [25, 19], "speed": 150, "waiting_duration": 3.43}, {"pos": [26, 15], "speed": 150, "waiting_duration": 2.13}, {"pos": [25, 10], "speed": 350, "waiting_duration": 0.62}]}, "17": {"start_pos": [1600.0, 1472.0], "waypoints": [{"pos": [23, 20], "speed": 250, "waiting_duration": 0.0}, {"pos": [25, 18], "speed": 250, "waiting_duration": 1.02}, {"pos": [26, 16], "speed": 250, "waiting_duration": 0.05}, {"pos": [27, 14], "speed": 250, "waiting_duration": 0.46}, {"pos": [27, 11], "speed": 250, "waiting_duration": 0.41}, {"pos": [28, 15], "speed": 250, "waiting_duration": 1.16}, {"pos": [28, 20], "speed": 250, "waiting_duration": 0.07}, {"pos": [26, 18], "speed": 250, "waiting_duration": 0.29}, {"pos": [26, 14], "speed": 250, "waiting_duration": 0.16}]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/ingroup/10-48.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1730030286.6376312, "total_time": 10.47899999999993, "paths": {"2": {"waypoints": [{"pos": [17, 16], "speed": 150, "waiting_duration": 0.01}, {"pos": [16, 15], "speed": 350, "waiting_duration": 0.36}, {"pos": [16, 15], "speed": 150, "waiting_duration": 1.09}, {"pos": [16, 15], "speed": 350, "waiting_duration": 0.0}, {"pos": [15, 14], "speed": 350, "waiting_duration": 0.58}, {"pos": [16, 14], "speed": 150, "waiting_duration": 1.42}, {"pos": [14, 13], "speed": 350, "waiting_duration": 0.0}, {"pos": [12, 11], "speed": 350, "waiting_duration": 1.18}, {"pos": [13, 8], "speed": 350, "waiting_duration": 0.88}], "start_pos": [1044.0, 1212.0]}, "3": {"waypoints": [{"pos": [17, 15], "speed": 150, "waiting_duration": 0.01}, {"pos": [15, 12], "speed": 350, "waiting_duration": 2.53}, {"pos": [14, 7], "speed": 350, "waiting_duration": 3.08}], "start_pos": [832.0, 1084.0]}, "14": {"waypoints": [{"pos": [18, 20], "speed": 250, "waiting_duration": 0.82}, {"pos": [18, 17], "speed": 250, "waiting_duration": 0.3}, {"pos": [18, 15], "speed": 250, "waiting_duration": 1.73}, {"pos": [15, 15], "speed": 250, "waiting_duration": 1.62}, {"pos": [14, 13], "speed": 250, "waiting_duration": 0.82}, {"pos": [12, 12], "speed": 250, "waiting_duration": 0.4}], "start_pos": [1024.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/ingroup/11-61.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1730033103.845973, "total_time": 11.607999999999972, "paths": {"2": {"waypoints": [{"pos": [15, 14], "speed": 150, "waiting_duration": 0.0}, {"pos": [15, 9], "speed": 350, "waiting_duration": 4.03}, {"pos": [19, 8], "speed": 150, "waiting_duration": 2.58}], "start_pos": [1044.0, 1212.0]}, "3": {"waypoints": [{"pos": [13, 19], "speed": 150, "waiting_duration": 0.0}, {"pos": [12, 15], "speed": 350, "waiting_duration": 1.5}, {"pos": [12, 13], "speed": 350, "waiting_duration": 1.73}, {"pos": [14, 14], "speed": 150, "waiting_duration": 2.64}, {"pos": [12, 11], "speed": 350, "waiting_duration": 0.0}, {"pos": [13, 8], "speed": 350, "waiting_duration": 1.22}], "start_pos": [832.0, 1084.0]}, "14": {"waypoints": [{"pos": [12, 20], "speed": 250, "waiting_duration": 1.26}, {"pos": [12, 16], "speed": 250, "waiting_duration": 1.29}, {"pos": [17, 16], "speed": 250, "waiting_duration": 0.53}, {"pos": [12, 15], "speed": 250, "waiting_duration": 1.56}, {"pos": [12, 13], "speed": 250, "waiting_duration": 0.45}], "start_pos": [1024.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/ingroup/21-13.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1730032987.147968, "total_time": 21.128999999999813, "paths": {"2": {"waypoints": [{"pos": [18, 20], "speed": 150, "waiting_duration": 0.02}, {"pos": [18, 18], "speed": 350, "waiting_duration": 0.14}, {"pos": [15, 15], "speed": 150, "waiting_duration": 2.11}, {"pos": [14, 11], "speed": 350, "waiting_duration": 1.94}, {"pos": [12, 7], "speed": 350, "waiting_duration": 2.18}, {"pos": [13, 9], "speed": 150, "waiting_duration": 3.46}], "start_pos": [1044.0, 1212.0]}, "3": {"waypoints": [{"pos": [16, 21], "speed": 150, "waiting_duration": 0.02}, {"pos": [16, 21], "speed": 350, "waiting_duration": 0.96}, {"pos": [17, 18], "speed": 350, "waiting_duration": 0.81}, {"pos": [18, 14], "speed": 350, "waiting_duration": 1.3}, {"pos": [16, 14], "speed": 150, "waiting_duration": 4.44}, {"pos": [18, 16], "speed": 350, "waiting_duration": 0.0}, {"pos": [18, 14], "speed": 350, "waiting_duration": 4.28}, {"pos": [15, 12], "speed": 350, "waiting_duration": 1.07}, {"pos": [14, 10], "speed": 350, "waiting_duration": 1.13}], "start_pos": [832.0, 1084.0]}, "14": {"waypoints": [{"pos": [19, 22], "speed": 250, "waiting_duration": 0.75}, {"pos": [15, 23], "speed": 250, "waiting_duration": 0.94}, {"pos": [16, 21], "speed": 250, "waiting_duration": 0.3}, {"pos": [15, 18], "speed": 250, "waiting_duration": 0.91}, {"pos": [15, 15], "speed": 250, "waiting_duration": 0.98}, {"pos": [14, 12], "speed": 250, "waiting_duration": 1.91}, {"pos": [12, 14], "speed": 250, "waiting_duration": 1.05}, {"pos": [12, 17], "speed": 250, "waiting_duration": 0.49}, {"pos": [15, 18], "speed": 250, "waiting_duration": 0.41}, {"pos": [19, 18], "speed": 250, "waiting_duration": 0.42}, {"pos": [19, 14], "speed": 250, "waiting_duration": 0.48}, {"pos": [15, 14], "speed": 250, "waiting_duration": 0.73}], "start_pos": [1024.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/ingroup/6-26.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1730033942.096256, "total_time": 6.264999999999999, "paths": {"2": {"waypoints": [{"pos": [15, 20], "speed": 150, "waiting_duration": 0.01}, {"pos": [13, 18], "speed": 350, "waiting_duration": 0.0}, {"pos": [12, 18], "speed": 350, "waiting_duration": 0.57}, {"pos": [12, 17], "speed": 350, "waiting_duration": 0.08}, {"pos": [12, 16], "speed": 350, "waiting_duration": 0.03}, {"pos": [12, 15], "speed": 350, "waiting_duration": 0.02}, {"pos": [12, 13], "speed": 350, "waiting_duration": 1.84}, {"pos": [12, 11], "speed": 350, "waiting_duration": 0.17}, {"pos": [14, 9], "speed": 350, "waiting_duration": 0.77}], "start_pos": [1044.0, 1212.0]}, "3": {"waypoints": [{"pos": [15, 16], "speed": 150, "waiting_duration": 0.01}, {"pos": [13, 13], "speed": 350, "waiting_duration": 0.0}, {"pos": [14, 9], "speed": 350, "waiting_duration": 2.68}], "start_pos": [832.0, 1084.0]}, "14": {"waypoints": [{"pos": [16, 19], "speed": 250, "waiting_duration": 0.01}, {"pos": [14, 18], "speed": 250, "waiting_duration": 0.02}, {"pos": [15, 16], "speed": 250, "waiting_duration": 0.03}, {"pos": [12, 18], "speed": 250, "waiting_duration": 0.03}, {"pos": [12, 15], "speed": 250, "waiting_duration": 0.05}, {"pos": [13, 14], "speed": 250, "waiting_duration": 0.02}, {"pos": [12, 12], "speed": 250, "waiting_duration": 0.31}], "start_pos": [1024.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/10-21.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729362883.132202, "total_time": 10.21, "paths": {"4": {"waypoints": [{"pos": [24, 18], "speed": 150, "waiting_duration": 0.01}, {"pos": [25, 17], "speed": 350, "waiting_duration": 0.97}, {"pos": [27, 18], "speed": 350, "waiting_duration": 0.71}, {"pos": [28, 19], "speed": 350, "waiting_duration": 1.94}, {"pos": [28, 17], "speed": 350, "waiting_duration": 2.14}, {"pos": [28, 15], "speed": 350, "waiting_duration": 0.16}, {"pos": [28, 13], "speed": 350, "waiting_duration": 0.15}, {"pos": [27, 8], "speed": 350, "waiting_duration": 0.35}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [24, 15], "speed": 150, "waiting_duration": 0.01}, {"pos": [25, 14], "speed": 350, "waiting_duration": 0.51}, {"pos": [26, 10], "speed": 350, "waiting_duration": 0.51}, {"pos": [23, 8], "speed": 150, "waiting_duration": 3.35}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [22, 21], "speed": 250, "waiting_duration": 0.24}, {"pos": [22, 17], "speed": 250, "waiting_duration": 0.01}, {"pos": [24, 16], "speed": 250, "waiting_duration": 0.1}, {"pos": [25, 14], "speed": 250, "waiting_duration": 0.23}, {"pos": [25, 19], "speed": 250, "waiting_duration": 0.48}, {"pos": [25, 22], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 20], "speed": 250, "waiting_duration": 0.12}, {"pos": [27, 16], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 13], "speed": 250, "waiting_duration": 0.01}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/14-02.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729367289.30415, "total_time": 14.02, "paths": {"4": {"waypoints": [{"pos": [27, 16], "speed": 150, "waiting_duration": 0.01}, {"pos": [28, 18], "speed": 350, "waiting_duration": 3.68}, {"pos": [26, 22], "speed": 150, "waiting_duration": 2.51}, {"pos": [27, 23], "speed": 350, "waiting_duration": 0.0}, {"pos": [28, 23], "speed": 350, "waiting_duration": 0.65}, {"pos": [28, 22], "speed": 350, "waiting_duration": 0.08}, {"pos": [28, 21], "speed": 350, "waiting_duration": 0.01}, {"pos": [28, 19], "speed": 350, "waiting_duration": 0.03}, {"pos": [28, 17], "speed": 350, "waiting_duration": 0.14}, {"pos": [28, 15], "speed": 350, "waiting_duration": 0.16}, {"pos": [28, 13], "speed": 350, "waiting_duration": 0.14}, {"pos": [27, 8], "speed": 350, "waiting_duration": 0.34}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [22, 21], "speed": 150, "waiting_duration": 0.01}, {"pos": [22, 19], "speed": 350, "waiting_duration": 0.0}, {"pos": [23, 15], "speed": 350, "waiting_duration": 0.29}, {"pos": [27, 12], "speed": 350, "waiting_duration": 0.45}, {"pos": [28, 8], "speed": 350, "waiting_duration": 0.97}, {"pos": [29, 9], "speed": 150, "waiting_duration": 4.68}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [21, 23], "speed": 250, "waiting_duration": 0.04}, {"pos": [21, 18], "speed": 250, "waiting_duration": 0.01}, {"pos": [24, 15], "speed": 250, "waiting_duration": 0.01}, {"pos": [26, 14], "speed": 250, "waiting_duration": 0.09}, {"pos": [26, 12], "speed": 250, "waiting_duration": 0.01}, {"pos": [23, 15], "speed": 250, "waiting_duration": 0.77}, {"pos": [23, 19], "speed": 250, "waiting_duration": 0.01}, {"pos": [24, 21], "speed": 250, "waiting_duration": 0.01}, {"pos": [24, 23], "speed": 250, "waiting_duration": 0.07}, {"pos": [27, 23], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 18], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 13], "speed": 250, "waiting_duration": 0.01}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/16-43.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729363054.7617245, "total_time": 16.43, "paths": {"4": {"waypoints": [{"pos": [27, 13], "speed": 150, "waiting_duration": 0.0}, {"pos": [26, 13], "speed": 150, "waiting_duration": 3.36}, {"pos": [27, 9], "speed": 350, "waiting_duration": 0.0}, {"pos": [23, 8], "speed": 150, "waiting_duration": 2.36}, {"pos": [28, 9], "speed": 150, "waiting_duration": 3.87}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [22, 21], "speed": 150, "waiting_duration": 0.0}, {"pos": [21, 17], "speed": 350, "waiting_duration": 0.0}, {"pos": [21, 15], "speed": 350, "waiting_duration": 2.28}, {"pos": [23, 19], "speed": 150, "waiting_duration": 2.74}, {"pos": [24, 23], "speed": 350, "waiting_duration": 0.31}, {"pos": [25, 23], "speed": 350, "waiting_duration": 1.31}, {"pos": [27, 23], "speed": 350, "waiting_duration": 0.43}, {"pos": [28, 23], "speed": 350, "waiting_duration": 0.15}, {"pos": [28, 22], "speed": 350, "waiting_duration": 0.08}, {"pos": [28, 21], "speed": 350, "waiting_duration": 0.01}, {"pos": [28, 20], "speed": 350, "waiting_duration": 0.01}, {"pos": [28, 18], "speed": 350, "waiting_duration": 0.1}, {"pos": [28, 16], "speed": 350, "waiting_duration": 0.23}, {"pos": [28, 14], "speed": 350, "waiting_duration": 0.14}, {"pos": [28, 12], "speed": 350, "waiting_duration": 0.21}, {"pos": [26, 8], "speed": 350, "waiting_duration": 0.28}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [22, 23], "speed": 250, "waiting_duration": 0.0}, {"pos": [25, 18], "speed": 250, "waiting_duration": 2.18}, {"pos": [26, 14], "speed": 250, "waiting_duration": 0.01}, {"pos": [22, 14], "speed": 250, "waiting_duration": 0.71}, {"pos": [21, 18], "speed": 250, "waiting_duration": 0.93}, {"pos": [22, 23], "speed": 250, "waiting_duration": 0.34}, {"pos": [26, 23], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 20], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 14], "speed": 250, "waiting_duration": 0.09}, {"pos": [27, 13], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 12], "speed": 250, "waiting_duration": 0.01}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/17-64.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729362644.1780062, "total_time": 17.64, "paths": {"4": {"waypoints": [{"pos": [24, 20], "speed": 150, "waiting_duration": 0.01}, {"pos": [21, 21], "speed": 350, "waiting_duration": 1.83}, {"pos": [22, 19], "speed": 150, "waiting_duration": 2.51}, {"pos": [23, 23], "speed": 350, "waiting_duration": 3.72}, {"pos": [24, 23], "speed": 350, "waiting_duration": 0.46}, {"pos": [26, 23], "speed": 350, "waiting_duration": 0.43}, {"pos": [28, 23], "speed": 350, "waiting_duration": 0.15}, {"pos": [28, 22], "speed": 350, "waiting_duration": 0.16}, {"pos": [28, 21], "speed": 350, "waiting_duration": 0.01}, {"pos": [28, 19], "speed": 350, "waiting_duration": 0.03}, {"pos": [28, 17], "speed": 350, "waiting_duration": 0.26}, {"pos": [28, 15], "speed": 350, "waiting_duration": 0.15}, {"pos": [28, 13], "speed": 350, "waiting_duration": 0.16}, {"pos": [27, 8], "speed": 350, "waiting_duration": 0.34}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [25, 16], "speed": 150, "waiting_duration": 0.01}, {"pos": [24, 11], "speed": 350, "waiting_duration": 1.72}, {"pos": [24, 11], "speed": 350, "waiting_duration": 0.65}, {"pos": [23, 8], "speed": 350, "waiting_duration": 0.01}, {"pos": [24, 7], "speed": 150, "waiting_duration": 3.38}, {"pos": [28, 8], "speed": 150, "waiting_duration": 2.56}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [27, 22], "speed": 250, "waiting_duration": 0.08}, {"pos": [27, 20], "speed": 250, "waiting_duration": 0.19}, {"pos": [25, 19], "speed": 250, "waiting_duration": 1.45}, {"pos": [25, 17], "speed": 250, "waiting_duration": 0.01}, {"pos": [25, 12], "speed": 250, "waiting_duration": 0.33}, {"pos": [23, 14], "speed": 250, "waiting_duration": 1.79}, {"pos": [21, 14], "speed": 250, "waiting_duration": 0.37}, {"pos": [21, 19], "speed": 250, "waiting_duration": 1.22}, {"pos": [21, 23], "speed": 250, "waiting_duration": 0.01}, {"pos": [24, 23], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 23], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 21], "speed": 250, "waiting_duration": 0.01}, {"pos": [27, 17], "speed": 250, "waiting_duration": 0.11}, {"pos": [27, 14], "speed": 250, "waiting_duration": 0.01}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/25-04.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729362347.1144307, "total_time": 25.04, "paths": {"4": {"waypoints": [{"pos": [22, 13], "speed": 150, "waiting_duration": 0.01}, {"pos": [23, 15], "speed": 150, "waiting_duration": 4.74}, {"pos": [25, 14], "speed": 150, "waiting_duration": 2.61}, {"pos": [23, 16], "speed": 350, "waiting_duration": 0.0}, {"pos": [22, 14], "speed": 350, "waiting_duration": 4.31}, {"pos": [25, 13], "speed": 150, "waiting_duration": 4.88}, {"pos": [25, 11], "speed": 350, "waiting_duration": 0.57}, {"pos": [24, 7], "speed": 350, "waiting_duration": 0.29}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [22, 15], "speed": 150, "waiting_duration": 0.01}, {"pos": [26, 18], "speed": 150, "waiting_duration": 1.93}, {"pos": [27, 17], "speed": 350, "waiting_duration": 1.88}, {"pos": [28, 13], "speed": 350, "waiting_duration": 0.85}, {"pos": [28, 12], "speed": 350, "waiting_duration": 0.73}, {"pos": [27, 9], "speed": 350, "waiting_duration": 0.08}, {"pos": [23, 7], "speed": 150, "waiting_duration": 3.98}, {"pos": [28, 9], "speed": 150, "waiting_duration": 4.57}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [22, 22], "speed": 250, "waiting_duration": 0.72}, {"pos": [22, 17], "speed": 250, "waiting_duration": 2.8}, {"pos": [23, 19], "speed": 250, "waiting_duration": 1.1}, {"pos": [26, 19], "speed": 250, "waiting_duration": 0.12}, {"pos": [26, 15], "speed": 250, "waiting_duration": 0.58}, {"pos": [26, 12], "speed": 250, "waiting_duration": 0.28}, {"pos": [26, 15], "speed": 250, "waiting_duration": 1.77}, {"pos": [26, 17], "speed": 250, "waiting_duration": 0.27}, {"pos": [26, 18], "speed": 250, "waiting_duration": 0.01}, {"pos": [21, 18], "speed": 250, "waiting_duration": 1.26}, {"pos": [22, 18], "speed": 250, "waiting_duration": 2.46}, {"pos": [22, 15], "speed": 250, "waiting_duration": 2.92}, {"pos": [25, 15], "speed": 250, "waiting_duration": 0.01}, {"pos": [25, 12], "speed": 250, "waiting_duration": 0.01}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/npc_scripted_paths/cow_herding/outgroup/6-94.json: -------------------------------------------------------------------------------- 1 | {"random_seed": 1729361995.4348137, "total_time": 6.94, "paths": {"4": {"waypoints": [{"pos": [25, 19], "speed": 150, "waiting_duration": 0.0}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.0}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.07}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 18], "speed": 350, "waiting_duration": 0.01}, {"pos": [25, 17], "speed": 350, "waiting_duration": 0.79}, {"pos": [26, 12], "speed": 350, "waiting_duration": 0.04}, {"pos": [26, 12], "speed": 150, "waiting_duration": 2.49}, {"pos": [25, 7], "speed": 350, "waiting_duration": 0.58}], "start_pos": [1684.0, 1084.0]}, "5": {"waypoints": [{"pos": [26, 16], "speed": 150, "waiting_duration": 0.0}, {"pos": [27, 12], "speed": 350, "waiting_duration": 1.54}, {"pos": [27, 13], "speed": 150, "waiting_duration": 1.5}, {"pos": [27, 12], "speed": 350, "waiting_duration": 0.0}, {"pos": [28, 8], "speed": 350, "waiting_duration": 0.06}], "start_pos": [1472.0, 1212.0]}, "17": {"waypoints": [{"pos": [24, 20], "speed": 250, "waiting_duration": 0.65}, {"pos": [25, 18], "speed": 250, "waiting_duration": 0.56}, {"pos": [26, 16], "speed": 250, "waiting_duration": 0.84}, {"pos": [26, 12], "speed": 250, "waiting_duration": 1.47}], "start_pos": [1600.0, 1472.0]}}} -------------------------------------------------------------------------------- /data/save.json: -------------------------------------------------------------------------------- 1 | { 2 | "__FarmingTool__": [ 3 | "current_tool", 4 | "current_seed" 5 | ], 6 | "tutorial_status": false, 7 | "current_tool": "hoe", 8 | "current_seed": "tomato_seed", 9 | "group": 1, 10 | "goggles_status": false, 11 | "necklace_status": null, 12 | "horn_status": false, 13 | "outgroup_skin_status": false, 14 | "inventory": { 15 | "__InventoryResource__": [ 16 | ] 17 | }, 18 | "soil_data": [] 19 | } -------------------------------------------------------------------------------- /data/textboxes/en/tutorial.json: -------------------------------------------------------------------------------- 1 | { 2 | "Basic_movement":[ 3 | ["Tutorial", "Press Up, Down, Right, Left to move"] 4 | ], 5 | "Get_hat_from_ingroup":[ 6 | ["Tutorial", "Get the hat from the ingroup"] 7 | ], 8 | "Get_necklace_from_ingroup":[ 9 | ["Tutorial", "Get the necklace from the ingroup"] 10 | ], 11 | "Farm_tile":[ 12 | ["Tutorial", "Farm with your hoe \t\t\t\t Go to your group farm \t\t\t\t Tab to switch tool \t\t\t\t I to open inventory \t\t\t\t Left Click to farm"] 13 | ], 14 | "Plant_crop":[ 15 | ["Tutorial", "Plant a crop \t\t\t\t\t Left Shift to change seed \t\t\t\t Right Click to plant"] 16 | ], 17 | "Water_crop":[ 18 | ["Tutorial", "Water the crop"] 19 | ], 20 | "Go_to_bed":[ 21 | ["Tutorial", "Go to your house, to the left above the \t\t\t farm. \t\t\t\t\t\t Stand on the green carpet \t\t\t\t\t\t and press the space bar to start a new \t\t\t day. \t\t\t\t\t\t Look how the vegetables have grown!"] 22 | ], 23 | "Go_to_forest_and_hit_tree":[ 24 | ["Tutorial", "Go to the forest and hit a tree"] 25 | ], 26 | "Interact_with_ingroup_member":[ 27 | ["Tutorial", "Interact with an ingroup member \t\t\t\t E to show or hide emojis \t\t\t\t Right and Left to change selected emoji \t\t\t\t Space to show emoji"] 28 | ], 29 | "Interact_with_outgroup_member":[ 30 | ["Tutorial", "Interact with an outgroup member"] 31 | ], 32 | "Walk_around_outgroup_farm_and_switch_to_outgroup":[ 33 | ["Tutorial", "Walk around on the outgroup farm \t\t\t and switch to the outgroup"] 34 | ], 35 | "Go_to_market_and_buy/sell_something":[ 36 | ["Tutorial", "Go to the market and buy or sell something \t\t\t\t Up and Down to select \t\t\t\t Space to sell or buy \t\t\t\t Esc to exit"] 37 | ], 38 | "Go_to_minigame_map_and_play":[ 39 | ["Tutorial", "Go to the minigame area \t\t\t and play the minigame"] 40 | ], 41 | "Tutorial_end":[ 42 | ["Tutorial", "Well done. Since you completed \t\t\t the tutorial, the real game will begin ! \t\t .\t\t\t\t\t\t Space to continue"] 43 | ] 44 | } -------------------------------------------------------------------------------- /data/tilesets/Barn structures.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Basic_Furniture.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /data/tilesets/Chest.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Darker_Grass_Hill_Tiles_Slopes_v2.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Grass_Tile_layers2.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Grass_tiles_v2.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Interaction.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/NPCs.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /data/tilesets/Paths.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Stone_Path.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Water_troughs.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Wooden_Bridge_v2.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/Wooden_House_Roof_Tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /data/tilesets/Wooden_House_Walls_Tileset_modified.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/fence_tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/grass_tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/hill_tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/house_tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/tilesets/soil_tileset.tsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /export_excel2json.sh: -------------------------------------------------------------------------------- 1 | 2 | python tools/excel_to_json.py tools/game_levels.xlsx 3 | -------------------------------------------------------------------------------- /extract_translations.sh: -------------------------------------------------------------------------------- 1 | # How to add translations to new Python file 2 | # add this import 3 | # `from src.support import get_translated_string as _` 4 | # replace strings that needs to be translated from this: 5 | # `print("This is hardcoded messages")` 6 | # to this: 7 | # `print(_("This is hardcoded messages"))` 8 | # next run this script with python file name as parameter: 9 | # `./extract_translations.sh src/screens/inventory.py` 10 | # 11 | # this script will extract new or changed strings from python file and add them to data/translations/en.txt (de.txt, etc.), 12 | # but it won't remove from data/translations/en.tx if a string is removed from original source python file. 13 | 14 | if [[ -z "$1" ]] 15 | then 16 | echo usage: $0 script.py 17 | exit 1 18 | fi 19 | 20 | echo "" 21 | python -m rich.rule "[blue]Extracting strings" 22 | 23 | # this is not the intended way of using gettext/xgettext, but it's simpler and suits the purpose 24 | xgettext -d base -o data/translations/temp_file.pot $1 25 | 26 | # cat data/translations/temp_file.pot 27 | 28 | cat data/translations/temp_file.pot | grep msgid | awk -F '"' '{print $2}' > data/translations/extracted_strings.txt 29 | 30 | # cat data/translations/extracted_strings.txt 31 | 32 | python -m tools.extract_translations "$1" 33 | 34 | # clean up 35 | rm data/translations/temp_file.pot 36 | rm data/translations/extracted_strings.txt 37 | -------------------------------------------------------------------------------- /font/LycheeSoda.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/font/LycheeSoda.ttf -------------------------------------------------------------------------------- /formatlint.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import sys 4 | 5 | # Define ANSI escape codes for colors 6 | GRAY = "\033[90m" 7 | RED = "\033[91m" 8 | GREEN = "\033[92m" 9 | RESET = "\033[0m" 10 | 11 | # Define the commands to be run 12 | commands = [ 13 | ("ruff format .", "Formatting"), 14 | ("ruff check --select I --fix .", "Sorting imports"), 15 | ("ruff check .", "Linting"), 16 | ] 17 | 18 | 19 | def run_command(command, description, index): 20 | print(f"{GRAY}┌── {description} [{command}]{RESET}") 21 | process = subprocess.Popen( 22 | command, 23 | shell=True, 24 | stdout=subprocess.PIPE, 25 | stderr=subprocess.STDOUT, 26 | bufsize=1, 27 | universal_newlines=True, 28 | ) 29 | assert process.stdout is not None 30 | 31 | while True: 32 | output = process.stdout.readline() 33 | if output == "" and process.poll() is not None: 34 | break 35 | if output: 36 | sys.stdout.write(f"{GRAY}│ >{RESET} {output}") 37 | sys.stdout.flush() 38 | 39 | # Read any remaining output after the process has completed 40 | remaining_output = process.stdout.read() 41 | if remaining_output: 42 | for line in remaining_output.splitlines(): 43 | print(f"{GRAY}│ >{RESET} " + line) 44 | 45 | return_code = process.poll() 46 | 47 | if return_code == 0: 48 | print( 49 | f"{GRAY}└── {GREEN}{description} [{command}] completed successfully.{RESET}" 50 | ) 51 | else: 52 | print( 53 | f"{GRAY}└── {RED}{description} [{command}] failed with return code {return_code}.{RESET}" 54 | ) 55 | 56 | return return_code 57 | 58 | 59 | def main(): 60 | script_dir = os.path.dirname(os.path.realpath(__file__)) 61 | os.chdir(script_dir) 62 | print(f"{GRAY}Running Scripts:{RESET}\n") 63 | 64 | for i, (command, description) in enumerate(commands): 65 | return_code = run_command(command, description, i) 66 | if i < len(commands) - 1: 67 | print() 68 | if return_code != 0: 69 | break 70 | 71 | if return_code == 0: 72 | print(f"\n{GRAY}{GREEN}Scripts run successfully.{RESET}") 73 | else: 74 | print(f"\n{GRAY}{RED}A script failed with return code {return_code}.{RESET}") 75 | 76 | 77 | if __name__ == "__main__": 78 | main() 79 | -------------------------------------------------------------------------------- /images/characters/rabbit/axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/goggles_axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/goggles_axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/goggles_hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/goggles_hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/goggles_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/goggles_idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/goggles_walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/goggles_walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/goggles_water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/goggles_water.png -------------------------------------------------------------------------------- /images/characters/rabbit/hat_axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hat_axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/hat_hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hat_hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/hat_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hat_idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/hat_walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hat_walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/hat_water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hat_water.png -------------------------------------------------------------------------------- /images/characters/rabbit/hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/horn_axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/horn_axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/horn_hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/horn_hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/horn_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/horn_idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/horn_walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/horn_walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/horn_water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/horn_water.png -------------------------------------------------------------------------------- /images/characters/rabbit/idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/necklace_axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/necklace_axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/necklace_hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/necklace_hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/necklace_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/necklace_idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/necklace_walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/necklace_walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/necklace_water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/necklace_water.png -------------------------------------------------------------------------------- /images/characters/rabbit/outgroup_axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/outgroup_axe.png -------------------------------------------------------------------------------- /images/characters/rabbit/outgroup_hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/outgroup_hoe.png -------------------------------------------------------------------------------- /images/characters/rabbit/outgroup_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/outgroup_idle.png -------------------------------------------------------------------------------- /images/characters/rabbit/outgroup_walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/outgroup_walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/outgroup_water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/outgroup_water.png -------------------------------------------------------------------------------- /images/characters/rabbit/walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/walk.png -------------------------------------------------------------------------------- /images/characters/rabbit/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/rabbit/water.png -------------------------------------------------------------------------------- /images/characters/test 1/t1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/characters/test 1/t1.png -------------------------------------------------------------------------------- /images/entities/chicken/idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/entities/chicken/idle.png -------------------------------------------------------------------------------- /images/entities/chicken/walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/entities/chicken/walk.png -------------------------------------------------------------------------------- /images/entities/cow/idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/entities/cow/idle.png -------------------------------------------------------------------------------- /images/entities/cow/walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/entities/cow/walk.png -------------------------------------------------------------------------------- /images/fast_forward/0001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0001.png -------------------------------------------------------------------------------- /images/fast_forward/0002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0002.png -------------------------------------------------------------------------------- /images/fast_forward/0003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0003.png -------------------------------------------------------------------------------- /images/fast_forward/0004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0004.png -------------------------------------------------------------------------------- /images/fast_forward/0005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0005.png -------------------------------------------------------------------------------- /images/fast_forward/0006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0006.png -------------------------------------------------------------------------------- /images/fast_forward/0007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0007.png -------------------------------------------------------------------------------- /images/fast_forward/0008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0008.png -------------------------------------------------------------------------------- /images/fast_forward/0009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0009.png -------------------------------------------------------------------------------- /images/fast_forward/0010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/fast_forward/0010.png -------------------------------------------------------------------------------- /images/misc/smoke_infinite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/misc/smoke_infinite.png -------------------------------------------------------------------------------- /images/misc/smoke_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/misc/smoke_start.png -------------------------------------------------------------------------------- /images/misc/volcano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/misc/volcano.png -------------------------------------------------------------------------------- /images/misc/volcano_exploding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/misc/volcano_exploding.png -------------------------------------------------------------------------------- /images/misc/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/misc/water.png -------------------------------------------------------------------------------- /images/objects/Piknik basket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Piknik basket.png -------------------------------------------------------------------------------- /images/objects/Piknik blanket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Piknik blanket.png -------------------------------------------------------------------------------- /images/objects/Signpost_Bathtub_Down_LSA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Bathtub_Down_LSA.png -------------------------------------------------------------------------------- /images/objects/Signpost_Bathtub_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Bathtub_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Bathtub_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Bathtub_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Emoji_New.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Emoji_New.png -------------------------------------------------------------------------------- /images/objects/Signpost_Farm_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Farm_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Farm_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Farm_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Farm_Right_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Farm_Right_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Farm_Up_RSA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Farm_Up_RSA.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forest_01_Down_RSA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forest_01_Down_RSA.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forest_02_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forest_02_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_01_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_01_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_01_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_01_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_02_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_02_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_02_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_02_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_03_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_03_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_03_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_03_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Forrest_RL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Forrest_RL.png -------------------------------------------------------------------------------- /images/objects/Signpost_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_RL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_RL.png -------------------------------------------------------------------------------- /images/objects/Signpost_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Right.png -------------------------------------------------------------------------------- /images/objects/Signpost_Village_Down_LSA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Village_Down_LSA.png -------------------------------------------------------------------------------- /images/objects/Signpost_Village_Down_RSA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Village_Down_RSA.png -------------------------------------------------------------------------------- /images/objects/Signpost_Village_Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Village_Left.png -------------------------------------------------------------------------------- /images/objects/Signpost_Village_Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Signpost_Village_Right.png -------------------------------------------------------------------------------- /images/objects/Water well.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/Water well.png -------------------------------------------------------------------------------- /images/objects/bed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bed.png -------------------------------------------------------------------------------- /images/objects/blanket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/blanket.png -------------------------------------------------------------------------------- /images/objects/boat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/boat.png -------------------------------------------------------------------------------- /images/objects/bush_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bush_medium.png -------------------------------------------------------------------------------- /images/objects/bush_medium_blackberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bush_medium_blackberry.png -------------------------------------------------------------------------------- /images/objects/bush_medium_blueberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bush_medium_blueberry.png -------------------------------------------------------------------------------- /images/objects/bush_medium_raspberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bush_medium_raspberry.png -------------------------------------------------------------------------------- /images/objects/bush_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/bush_small.png -------------------------------------------------------------------------------- /images/objects/candy_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/candy_bar.png -------------------------------------------------------------------------------- /images/objects/chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/chicken.png -------------------------------------------------------------------------------- /images/objects/coop_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/coop_blue.png -------------------------------------------------------------------------------- /images/objects/coop_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/coop_green.png -------------------------------------------------------------------------------- /images/objects/cow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/cow.png -------------------------------------------------------------------------------- /images/objects/desk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/desk.png -------------------------------------------------------------------------------- /images/objects/flower_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_0.png -------------------------------------------------------------------------------- /images/objects/flower_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_1.png -------------------------------------------------------------------------------- /images/objects/flower_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_2.png -------------------------------------------------------------------------------- /images/objects/flower_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_3.png -------------------------------------------------------------------------------- /images/objects/flower_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_4.png -------------------------------------------------------------------------------- /images/objects/flower_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_5.png -------------------------------------------------------------------------------- /images/objects/flower_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_6.png -------------------------------------------------------------------------------- /images/objects/flower_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_7.png -------------------------------------------------------------------------------- /images/objects/flower_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_8.png -------------------------------------------------------------------------------- /images/objects/flower_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/flower_9.png -------------------------------------------------------------------------------- /images/objects/items/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/apple.png -------------------------------------------------------------------------------- /images/objects/items/axe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/axe.png -------------------------------------------------------------------------------- /images/objects/items/beetroot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/beetroot.png -------------------------------------------------------------------------------- /images/objects/items/beetroot_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/beetroot_seed.png -------------------------------------------------------------------------------- /images/objects/items/blackberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blackberry.png -------------------------------------------------------------------------------- /images/objects/items/blue_cabbage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blue_cabbage.png -------------------------------------------------------------------------------- /images/objects/items/blue_cabbage_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blue_cabbage_seed.png -------------------------------------------------------------------------------- /images/objects/items/blue_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blue_star.png -------------------------------------------------------------------------------- /images/objects/items/blue_star_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blue_star_seed.png -------------------------------------------------------------------------------- /images/objects/items/blueberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/blueberry.png -------------------------------------------------------------------------------- /images/objects/items/cabbage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/cabbage.png -------------------------------------------------------------------------------- /images/objects/items/cabbage_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/cabbage_seed.png -------------------------------------------------------------------------------- /images/objects/items/carrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/carrot.png -------------------------------------------------------------------------------- /images/objects/items/carrot_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/carrot_seed.png -------------------------------------------------------------------------------- /images/objects/items/cauliflower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/cauliflower.png -------------------------------------------------------------------------------- /images/objects/items/cauliflower_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/cauliflower_seed.png -------------------------------------------------------------------------------- /images/objects/items/corn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/corn.png -------------------------------------------------------------------------------- /images/objects/items/corn_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/corn_seed.png -------------------------------------------------------------------------------- /images/objects/items/eggplant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/eggplant.png -------------------------------------------------------------------------------- /images/objects/items/eggplant_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/eggplant_seed.png -------------------------------------------------------------------------------- /images/objects/items/green_bean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/green_bean.png -------------------------------------------------------------------------------- /images/objects/items/green_bean_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/green_bean_seed.png -------------------------------------------------------------------------------- /images/objects/items/hoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/hoe.png -------------------------------------------------------------------------------- /images/objects/items/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/orange.png -------------------------------------------------------------------------------- /images/objects/items/parsnip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/parsnip.png -------------------------------------------------------------------------------- /images/objects/items/parsnip_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/parsnip_seed.png -------------------------------------------------------------------------------- /images/objects/items/peach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/peach.png -------------------------------------------------------------------------------- /images/objects/items/pear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/pear.png -------------------------------------------------------------------------------- /images/objects/items/pumpkin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/pumpkin.png -------------------------------------------------------------------------------- /images/objects/items/pumpkin_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/pumpkin_seed.png -------------------------------------------------------------------------------- /images/objects/items/raspberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/raspberry.png -------------------------------------------------------------------------------- /images/objects/items/rose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/rose.png -------------------------------------------------------------------------------- /images/objects/items/rose_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/rose_seed.png -------------------------------------------------------------------------------- /images/objects/items/tomato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/tomato.png -------------------------------------------------------------------------------- /images/objects/items/tomato_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/tomato_seed.png -------------------------------------------------------------------------------- /images/objects/items/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/water.png -------------------------------------------------------------------------------- /images/objects/items/wheat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/wheat.png -------------------------------------------------------------------------------- /images/objects/items/wheat_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/wheat_seed.png -------------------------------------------------------------------------------- /images/objects/items/wood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/items/wood.png -------------------------------------------------------------------------------- /images/objects/log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/log.png -------------------------------------------------------------------------------- /images/objects/log_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/log_medium.png -------------------------------------------------------------------------------- /images/objects/log_medium_mushroom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/log_medium_mushroom.png -------------------------------------------------------------------------------- /images/objects/mailbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/mailbox.png -------------------------------------------------------------------------------- /images/objects/merchant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/merchant.png -------------------------------------------------------------------------------- /images/objects/mushroom_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/mushroom_pink.png -------------------------------------------------------------------------------- /images/objects/mushroom_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/mushroom_red.png -------------------------------------------------------------------------------- /images/objects/mushrooms_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/mushrooms_red.png -------------------------------------------------------------------------------- /images/objects/npc_ingroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/npc_ingroup.png -------------------------------------------------------------------------------- /images/objects/npc_nogroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/npc_nogroup.png -------------------------------------------------------------------------------- /images/objects/npc_outgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/npc_outgroup.png -------------------------------------------------------------------------------- /images/objects/rabbit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/rabbit.png -------------------------------------------------------------------------------- /images/objects/rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/rock.png -------------------------------------------------------------------------------- /images/objects/rock_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/rock_large.png -------------------------------------------------------------------------------- /images/objects/rock_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/rock_small.png -------------------------------------------------------------------------------- /images/objects/rock_very_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/rock_very_large.png -------------------------------------------------------------------------------- /images/objects/seaweed_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/seaweed_0.png -------------------------------------------------------------------------------- /images/objects/seaweed_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/seaweed_1.png -------------------------------------------------------------------------------- /images/objects/sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/sign.png -------------------------------------------------------------------------------- /images/objects/stump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/stump.png -------------------------------------------------------------------------------- /images/objects/stump_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/stump_large.png -------------------------------------------------------------------------------- /images/objects/stump_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/stump_small.png -------------------------------------------------------------------------------- /images/objects/stump_very_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/stump_very_large.png -------------------------------------------------------------------------------- /images/objects/sunflower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/sunflower.png -------------------------------------------------------------------------------- /images/objects/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree.png -------------------------------------------------------------------------------- /images/objects/tree_fallen_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_fallen_medium.png -------------------------------------------------------------------------------- /images/objects/tree_fallen_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_fallen_small.png -------------------------------------------------------------------------------- /images/objects/tree_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_large.png -------------------------------------------------------------------------------- /images/objects/tree_medium_apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_medium_apple.png -------------------------------------------------------------------------------- /images/objects/tree_medium_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_medium_orange.png -------------------------------------------------------------------------------- /images/objects/tree_medium_peach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_medium_peach.png -------------------------------------------------------------------------------- /images/objects/tree_medium_pear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_medium_pear.png -------------------------------------------------------------------------------- /images/objects/tree_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/tree_small.png -------------------------------------------------------------------------------- /images/objects/water_lilies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/water_lilies.png -------------------------------------------------------------------------------- /images/objects/water_lily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/water_lily.png -------------------------------------------------------------------------------- /images/objects/water_rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/water_rock.png -------------------------------------------------------------------------------- /images/objects/water_rock_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/water_rock_small.png -------------------------------------------------------------------------------- /images/objects/weed_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/weed_0.png -------------------------------------------------------------------------------- /images/objects/weed_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/weed_1.png -------------------------------------------------------------------------------- /images/objects/weed_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/weed_2.png -------------------------------------------------------------------------------- /images/objects/weed_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/objects/weed_3.png -------------------------------------------------------------------------------- /images/rain/drops/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/drops/0.png -------------------------------------------------------------------------------- /images/rain/drops/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/drops/1.png -------------------------------------------------------------------------------- /images/rain/drops/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/drops/2.png -------------------------------------------------------------------------------- /images/rain/floor/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/floor/0.png -------------------------------------------------------------------------------- /images/rain/floor/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/floor/1.png -------------------------------------------------------------------------------- /images/rain/floor/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/rain/floor/2.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-1.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-2.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-3.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-4.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-5.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-6.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-7.png -------------------------------------------------------------------------------- /images/sam/arousal/sam-arousal-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/arousal/sam-arousal-9.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-1.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-2.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-3.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-4.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-5.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-6.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-7.png -------------------------------------------------------------------------------- /images/sam/dominance/sam-dominance-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/dominance/sam-dominance-9.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-1.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-2.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-3.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-4.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-5.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-6.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-7.png -------------------------------------------------------------------------------- /images/sam/valence/sam-valence-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/sam/valence/sam-valence-9.png -------------------------------------------------------------------------------- /images/tilesets/Barn structures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Barn structures.png -------------------------------------------------------------------------------- /images/tilesets/Basic_Furniture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Basic_Furniture.png -------------------------------------------------------------------------------- /images/tilesets/Bush_Tiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Bush_Tiles.png -------------------------------------------------------------------------------- /images/tilesets/Chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Chest.png -------------------------------------------------------------------------------- /images/tilesets/Darker_Grass_Hill_Tiles_Slopes_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Darker_Grass_Hill_Tiles_Slopes_v2.png -------------------------------------------------------------------------------- /images/tilesets/Darker_Grass_Hills_Tiles_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Darker_Grass_Hills_Tiles_v2.png -------------------------------------------------------------------------------- /images/tilesets/Darker_Grass_Tile_Layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Darker_Grass_Tile_Layers.png -------------------------------------------------------------------------------- /images/tilesets/Grass_Tile_layers2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Grass_Tile_layers2.png -------------------------------------------------------------------------------- /images/tilesets/Grass_tiles_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Grass_tiles_v2.png -------------------------------------------------------------------------------- /images/tilesets/Paths.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Paths.png -------------------------------------------------------------------------------- /images/tilesets/Stone_Path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Stone_Path.png -------------------------------------------------------------------------------- /images/tilesets/Tilled_Dirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Tilled_Dirt.png -------------------------------------------------------------------------------- /images/tilesets/Water tray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Water tray.png -------------------------------------------------------------------------------- /images/tilesets/Wooden_Bridge_v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Wooden_Bridge_v2.png -------------------------------------------------------------------------------- /images/tilesets/Wooden_House_Roof_Tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Wooden_House_Roof_Tileset.png -------------------------------------------------------------------------------- /images/tilesets/Wooden_House_Walls_Tileset_modified.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/Wooden_House_Walls_Tileset_modified.png -------------------------------------------------------------------------------- /images/tilesets/fence_tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/fence_tileset.png -------------------------------------------------------------------------------- /images/tilesets/grass_tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/grass_tileset.png -------------------------------------------------------------------------------- /images/tilesets/hill_tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/hill_tileset.png -------------------------------------------------------------------------------- /images/tilesets/house_tileset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/house_tileset.png -------------------------------------------------------------------------------- /images/tilesets/plants/beetroot/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/beetroot/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/beetroot/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/beetroot/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/beetroot/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/beetroot/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/beetroot/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/beetroot/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_cabbbage/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_cabbbage/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_cabbbage/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_cabbbage/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_cabbbage/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_cabbbage/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_cabbbage/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_cabbbage/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_star/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_star/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_star/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_star/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_star/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_star/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/blue_star/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/blue_star/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/cabbage/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cabbage/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/cabbage/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cabbage/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/cabbage/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cabbage/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/cabbage/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cabbage/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/carrot/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/carrot/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/carrot/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/carrot/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/carrot/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/carrot/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/carrot/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/carrot/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/cauliflower/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cauliflower/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/cauliflower/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cauliflower/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/cauliflower/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cauliflower/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/cauliflower/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/cauliflower/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/corn/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/corn/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/corn/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/corn/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/corn/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/corn/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/corn/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/corn/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/corn/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/corn/4.png -------------------------------------------------------------------------------- /images/tilesets/plants/eggplant/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/eggplant/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/eggplant/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/eggplant/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/eggplant/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/eggplant/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/eggplant/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/eggplant/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/green_bean/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/green_bean/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/green_bean/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/green_bean/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/green_bean/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/green_bean/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/green_bean/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/green_bean/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/parsnip/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/parsnip/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/parsnip/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/parsnip/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/parsnip/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/parsnip/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/parsnip/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/parsnip/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/pumpkin/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/pumpkin/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/pumpkin/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/pumpkin/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/pumpkin/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/pumpkin/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/pumpkin/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/pumpkin/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/rose/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/rose/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/rose/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/rose/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/rose/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/rose/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/rose/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/rose/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/tomato/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/tomato/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/tomato/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/tomato/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/tomato/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/tomato/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/tomato/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/tomato/3.png -------------------------------------------------------------------------------- /images/tilesets/plants/wheat/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/wheat/0.png -------------------------------------------------------------------------------- /images/tilesets/plants/wheat/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/wheat/1.png -------------------------------------------------------------------------------- /images/tilesets/plants/wheat/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/wheat/2.png -------------------------------------------------------------------------------- /images/tilesets/plants/wheat/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/plants/wheat/3.png -------------------------------------------------------------------------------- /images/tilesets/soil/b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/b.png -------------------------------------------------------------------------------- /images/tilesets/soil/bl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/bl.png -------------------------------------------------------------------------------- /images/tilesets/soil/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/br.png -------------------------------------------------------------------------------- /images/tilesets/soil/l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/l.png -------------------------------------------------------------------------------- /images/tilesets/soil/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/lr.png -------------------------------------------------------------------------------- /images/tilesets/soil/lrb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/lrb.png -------------------------------------------------------------------------------- /images/tilesets/soil/lrt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/lrt.png -------------------------------------------------------------------------------- /images/tilesets/soil/o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/o.png -------------------------------------------------------------------------------- /images/tilesets/soil/r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/r.png -------------------------------------------------------------------------------- /images/tilesets/soil/soil water/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/soil water/0.png -------------------------------------------------------------------------------- /images/tilesets/soil/soil water/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/soil water/1.png -------------------------------------------------------------------------------- /images/tilesets/soil/soil water/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/soil water/2.png -------------------------------------------------------------------------------- /images/tilesets/soil/t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/t.png -------------------------------------------------------------------------------- /images/tilesets/soil/tb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/tb.png -------------------------------------------------------------------------------- /images/tilesets/soil/tbl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/tbl.png -------------------------------------------------------------------------------- /images/tilesets/soil/tbr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/tbr.png -------------------------------------------------------------------------------- /images/tilesets/soil/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/tl.png -------------------------------------------------------------------------------- /images/tilesets/soil/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/tr.png -------------------------------------------------------------------------------- /images/tilesets/soil/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/tilesets/soil/x.png -------------------------------------------------------------------------------- /images/ui/Cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/Cursor.png -------------------------------------------------------------------------------- /images/ui/KeyBindUI_Placeholder-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/KeyBindUI_Placeholder-new.png -------------------------------------------------------------------------------- /images/ui/KeyBindUI_Placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/KeyBindUI_Placeholder.png -------------------------------------------------------------------------------- /images/ui/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/bg.png -------------------------------------------------------------------------------- /images/ui/checkmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/checkmark.png -------------------------------------------------------------------------------- /images/ui/cosmetics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/cosmetics.png -------------------------------------------------------------------------------- /images/ui/cursor/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/cursor/0.png -------------------------------------------------------------------------------- /images/ui/cursor/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/cursor/1.png -------------------------------------------------------------------------------- /images/ui/cursor/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/cursor/2.png -------------------------------------------------------------------------------- /images/ui/dialog_boxes/tiny_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/dialog_boxes/tiny_down.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/cheer_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/cheer_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/cool_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/cool_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/furious_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/furious_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/love_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/love_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/sad_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/sad_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/sad_sick_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/sad_sick_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/sleep_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/sleep_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/smile_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/smile_ani.png -------------------------------------------------------------------------------- /images/ui/emotes/sprout_lands/wink_ani.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/emotes/sprout_lands/wink_ani.png -------------------------------------------------------------------------------- /images/ui/health_bar/health_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/health_bar/health_bar.png -------------------------------------------------------------------------------- /images/ui/health_bar/health_cat_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/health_bar/health_cat_1.png -------------------------------------------------------------------------------- /images/ui/health_bar/health_cat_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/health_bar/health_cat_2.png -------------------------------------------------------------------------------- /images/ui/health_bar/health_cat_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/health_bar/health_cat_3.png -------------------------------------------------------------------------------- /images/ui/indicators/entity_focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/indicators/entity_focused.png -------------------------------------------------------------------------------- /images/ui/indicators/entity_focused_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/indicators/entity_focused_big.png -------------------------------------------------------------------------------- /images/ui/interaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/interaction.png -------------------------------------------------------------------------------- /images/ui/keys/E-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/E-black.png -------------------------------------------------------------------------------- /images/ui/keys/E-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/E-white.png -------------------------------------------------------------------------------- /images/ui/keys/I-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/I-black.png -------------------------------------------------------------------------------- /images/ui/keys/I-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/I-white.png -------------------------------------------------------------------------------- /images/ui/keys/alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/alt.png -------------------------------------------------------------------------------- /images/ui/keys/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/down.png -------------------------------------------------------------------------------- /images/ui/keys/generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/generic.png -------------------------------------------------------------------------------- /images/ui/keys/lclick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/lclick.png -------------------------------------------------------------------------------- /images/ui/keys/lctrl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/lctrl.png -------------------------------------------------------------------------------- /images/ui/keys/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/left.png -------------------------------------------------------------------------------- /images/ui/keys/lshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/lshift.png -------------------------------------------------------------------------------- /images/ui/keys/rclick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/rclick.png -------------------------------------------------------------------------------- /images/ui/keys/rctrl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/rctrl.png -------------------------------------------------------------------------------- /images/ui/keys/return.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/return.png -------------------------------------------------------------------------------- /images/ui/keys/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/right.png -------------------------------------------------------------------------------- /images/ui/keys/rshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/rshift.png -------------------------------------------------------------------------------- /images/ui/keys/space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/space.png -------------------------------------------------------------------------------- /images/ui/keys/tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/tab.png -------------------------------------------------------------------------------- /images/ui/keys/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/keys/up.png -------------------------------------------------------------------------------- /images/ui/textbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/images/ui/textbox.png -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | ruff~=0.5 2 | pygbag==0.9.2 3 | rich==13.9.4 4 | -------------------------------------------------------------------------------- /requirements-test.txt: -------------------------------------------------------------------------------- 1 | pytest==8.3 2 | tox==4.16 3 | pytest-cov==5.0.0 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | PyTMX==3.32 2 | pathfinding==1.0.10 3 | pygame-ce==2.5.2 4 | requests==2.32.3 5 | # Only for tools - TODO find way to not install for game. 6 | openpyxl==3.1.5 7 | -------------------------------------------------------------------------------- /run_game.sh: -------------------------------------------------------------------------------- 1 | # set game language (en or de) 2 | if [ "$1" ]; then 3 | export GAME_LANGUAGE=$1 4 | fi 5 | # redirecting stderr to dev/null to get rid of "+[IMKClient subclass]: chose IMKClient_Modern" messages 6 | export USE_SERVER=true 7 | export SERVER_URL= 8 | 9 | python main.py 10 | #2> /dev/null 11 | -------------------------------------------------------------------------------- /run_web_mode.sh: -------------------------------------------------------------------------------- 1 | # TODO: figure out how to set language in web mode 2 | # if [ "$1" ]; then 3 | # export GAME_LANGUAGE=$1 4 | # fi 5 | 6 | pygbag --no_opt . 7 | -------------------------------------------------------------------------------- /src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/src/.DS_Store -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | """Non-main script src for the game.""" 2 | 3 | 4 | # This file exists only so Python recognises the src folder as a package to be able to run the game from the main file. 5 | # If it doesn't exist, the game will not be able to import anything from the src folder as a module 6 | # because Python won't recognise it as a package. 7 | 8 | # In addition, since the src folder is a package, every file in here will need to have dots before the name of another file 9 | # in the same folder for the imports to work, like so: 10 | 11 | # from .settings import * 12 | # instead of : 13 | # from settings import * 14 | -------------------------------------------------------------------------------- /src/camera/__init__.py: -------------------------------------------------------------------------------- 1 | """Stuff related to the in-game camera.""" 2 | 3 | from .camera import Camera 4 | 5 | __all__ = ["Camera"] 6 | -------------------------------------------------------------------------------- /src/camera/camera_target.py: -------------------------------------------------------------------------------- 1 | """Camera targets for a possible cutscene in a map.""" 2 | 3 | from dataclasses import dataclass, field 4 | 5 | from src.settings import DEFAULT_ANIMATION_NAME, Coordinate 6 | 7 | 8 | @dataclass 9 | class CameraTarget: 10 | """A target the camera will move towards during cutscenes.""" 11 | 12 | _pos: Coordinate 13 | _targ_id: int 14 | _animation_name: str = field(default=DEFAULT_ANIMATION_NAME) 15 | _speed: int = field(default=200) 16 | _pause: float = field(default=0) 17 | 18 | def __post_init__(self): 19 | if self._speed <= 0: 20 | raise ValueError("speed must be stricly positive") 21 | if self._pause < 0: 22 | raise ValueError("pause duration must be positive") 23 | if not self._targ_id: 24 | # Special case: the first camera target has no speed, because the camera will start there 25 | self._speed = 0 26 | 27 | def __iter__(self): 28 | return iter(self._pos) 29 | 30 | @property 31 | def animation_name(self): 32 | """The name of particular animation sequence loaded from 'animation_name' object property in Tiled. SceneAnimation identifies different animations by grouping them by this field.""" 33 | return self._animation_name 34 | 35 | @property 36 | def speed(self): 37 | """The speed the camera will go at to reach this target.""" 38 | return self._speed 39 | 40 | @property 41 | def pause(self): 42 | """The amount of time the camera will stay on the target upon reaching it, in seconds.""" 43 | return self._pause 44 | 45 | @property 46 | def pos(self): 47 | return self._pos 48 | 49 | def targ_id(self): 50 | """The target ID. The camera will move through all targets for a cutscene 51 | in ascending order, depending on this value.""" 52 | return self._targ_id 53 | 54 | @classmethod 55 | def get_null_target(cls): 56 | """Return the null target. 57 | This constant is used when initialising 58 | SceneAnimation objects for the first time.""" 59 | return _NULL_TARGET 60 | 61 | 62 | _NULL_TARGET = CameraTarget((0, 0), 0, DEFAULT_ANIMATION_NAME, 1, 0) 63 | -------------------------------------------------------------------------------- /src/camera/quaker.py: -------------------------------------------------------------------------------- 1 | """Implementation of a quake effect.""" 2 | 3 | from types import MappingProxyType 4 | 5 | import pygame 6 | 7 | from src.camera import Camera 8 | from src.enums import Direction 9 | 10 | _DIRECTIONAL_VECTORS = MappingProxyType( 11 | { 12 | Direction.UP: pygame.Vector2(0, -8), 13 | Direction.DOWN: pygame.Vector2(0, 8), 14 | Direction.LEFT: pygame.Vector2(-8, 0), 15 | Direction.RIGHT: pygame.Vector2(8, 0), 16 | Direction.UPLEFT: pygame.Vector2(-8, -8), 17 | Direction.UPRIGHT: pygame.Vector2(8, -8), 18 | Direction.DOWNLEFT: pygame.Vector2(-8, 8), 19 | Direction.DOWNRIGHT: pygame.Vector2(8, 8), 20 | } 21 | ) 22 | 23 | 24 | _DIRSWAP_DELAY = 0.03 25 | 26 | 27 | class Quaker: 28 | def __init__(self, cam: Camera): 29 | self.camera = cam 30 | self.quaking = False 31 | self.quake_duration: float = 0 32 | self.quake_elapsed: float = 0 33 | self.swap_delay: float = 0 34 | self.direction: Direction | None = None 35 | 36 | def reset(self): 37 | self.quaking = False 38 | self.quake_duration: float = 0 39 | self.quake_elapsed: float = 0 40 | self.swap_delay: float = 0 41 | self.direction: Direction | None = None 42 | self.camera.set_quake_vec(None) 43 | 44 | def start(self, duration: float): 45 | """Set a quake duration and start the earthquake effect.""" 46 | if self.quaking: 47 | return 48 | self.reset() 49 | self.quaking = True 50 | self.quake_duration = duration 51 | self.quake_elapsed = 0 52 | self.swap_delay = 0 53 | self.direction = Direction.random() 54 | self.camera.set_quake_vec(_DIRECTIONAL_VECTORS[self.direction]) 55 | 56 | def update_quake(self, dt: float): 57 | """Update the quake effect.""" 58 | if not self.quaking: 59 | return 60 | self.quake_elapsed += dt 61 | self.swap_delay += dt 62 | if self.swap_delay >= _DIRSWAP_DELAY: 63 | self.direction = self.direction.get_opposite() 64 | self.camera.set_quake_vec(_DIRECTIONAL_VECTORS[self.direction]) 65 | self.swap_delay = 0 66 | if self.quake_elapsed >= self.quake_duration: 67 | self.quaking = False 68 | self.camera.set_quake_vec(None) 69 | -------------------------------------------------------------------------------- /src/camera/zoom_area.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | from dataclasses import dataclass, field 3 | from typing import ClassVar 4 | 5 | import pygame 6 | 7 | from src.exceptions import CameraWarning 8 | 9 | 10 | @dataclass 11 | class ZoomArea: 12 | _id: int 13 | _area: pygame.FRect 14 | _zoom_factor: float = field(default=1) 15 | _zoom_speed: float = field(default=1) 16 | _registered_ids: ClassVar[set[int]] = set() 17 | 18 | def __new__(cls, *args, **kwargs): 19 | area_id = args[0] 20 | if area_id in cls._registered_ids: 21 | raise ValueError( 22 | f"given area ID ({area_id}) is already used for another area" 23 | ) 24 | cls._registered_ids.add(area_id) 25 | return super().__new__(cls) 26 | 27 | def __del__(self): 28 | cls = type(self) 29 | cls._registered_ids.remove(self._id) 30 | 31 | def __post_init__(self): 32 | if self._zoom_factor <= 0: 33 | warnings.warn( 34 | f"given zoom factor for zoom area {self._id} was {self._zoom_factor}, check " 35 | f"the value you passed for this area in Tiled", 36 | CameraWarning, 37 | ) 38 | raise ValueError("zoom factor must be strictly positive") 39 | if self._zoom_factor <= 0: 40 | warnings.warn( 41 | f"given zoom speed for zoom area {self._id} was {self._zoom_speed}, check " 42 | f"the value you set in Tiled", 43 | CameraWarning, 44 | ) 45 | if any(1 > dim for dim in self._area) or not self._area: 46 | warnings.warn( 47 | f"rect given for the zoom area of ID {self._id} was {self._area}, " 48 | f"check the dimensions you set in Tiled", 49 | CameraWarning, 50 | ) 51 | raise ValueError("invalid zoom area") 52 | 53 | @property 54 | def id(self): 55 | return self._id 56 | 57 | @property 58 | def area(self): 59 | return self._area 60 | 61 | @property 62 | def zoom_factor(self): 63 | return self._zoom_factor 64 | 65 | @property 66 | def zoom_speed(self): 67 | return self._zoom_speed 68 | -------------------------------------------------------------------------------- /src/client.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from typing import Callable 3 | 4 | from src import xplat 5 | from src.settings import ( 6 | # API_KEY, 7 | # PORT, 8 | # SERVER_IP, 9 | SERVER_URL, 10 | USE_SERVER, 11 | ) 12 | 13 | # if USE_SERVER and sys.platform not in ("emscripten", "wasm"): 14 | # import requests # type: ignore[import-untyped] 15 | 16 | 17 | BAD_API_KEY = "9" 18 | 19 | PLAY_TOKEN = "321" 20 | BAD_PLAY_TOKEN_1 = "9" 21 | BAD_PLAY_TOKEN_2 = "zzz" 22 | 23 | DUMMY_TELEMETRY_DATA = {"self_assessment": "ok"} 24 | 25 | 26 | def authn(play_token: str, post_login_callback: Callable[[dict], None]) -> None: 27 | if USE_SERVER: 28 | url = f"{SERVER_URL}/authn" 29 | headers = {} 30 | payload = { 31 | "play_token": play_token, 32 | } 33 | # Do this all asynchronously: 34 | asyncio.create_task( 35 | xplat.post_request_with_callback( 36 | url, 37 | headers, 38 | payload, 39 | post_login_callback, 40 | ) 41 | ) 42 | else: 43 | post_login_callback( 44 | { 45 | "token": play_token, 46 | "jwt": "dummy_token", 47 | "game_version": 1, 48 | } 49 | ) 50 | 51 | 52 | def send_telemetry(encoded_jwt: str, payload: dict) -> None: 53 | """Send telemetry to the backend, asynchronously.""" 54 | # TODO: If needed, we can restructure this to do async callbacks 55 | # as well, in case we need to react to this telemetry being sent. 56 | xplat.log(f"Sending telemetry: {payload}") 57 | url = f"{SERVER_URL}/telemetry" 58 | headers = { 59 | "Authorization": f"Bearer {encoded_jwt}", 60 | } 61 | asyncio.create_task(xplat.post_request(url, headers, payload)) 62 | -------------------------------------------------------------------------------- /src/colors.py: -------------------------------------------------------------------------------- 1 | # Colors taken from the Sprout Lands color palette 2 | 3 | # row 10 4 | SL_ORANGE_BRIGHTEST = (243, 229, 194) # #f3e5c2 UI Text, Highlights, bright Background 5 | SL_ORANGE_BRIGHTER = (232, 207, 166) # #e8cfa6 Volume Slider knob 6 | SL_ORANGE_BRIGHT = (220, 185, 138) # #c49a6c UI Background, bright Border 7 | SL_ORANGE_MEDIUM = (196, 154, 108) # #b68962 UI Button 8 | SL_ORANGE_DARK = (170, 121, 89) # #aa7959 UI Border 9 | SL_ORANGE_DARKER = (144, 98, 93) # #90625d UI Border Shadow 10 | SL_ORANGE_DARKEST = (117, 76, 96) # #754c60 11 | SL_CUSTOM_WHITE = (255, 255, 255) # #754c60 12 | 13 | # row 11 14 | SL_BROWN_DARK = (140, 115, 105) # #8c7369 15 | SL_BROWN_DARKER = (123, 103, 98) # #7b6762 16 | SL_BROWN_DARKEST = (100, 85, 82) # #645552 17 | -------------------------------------------------------------------------------- /src/exceptions.py: -------------------------------------------------------------------------------- 1 | """Various exceptions and warning categories used in the game.""" 2 | 3 | 4 | class InvalidMapError(Exception): 5 | """Something is not valid in the given game map.""" 6 | 7 | 8 | class MinigameSetupError(Exception): 9 | """Something unexpected happened during minigame setup.""" 10 | 11 | 12 | class DevWarning(Warning): 13 | """Base warning class for development-related warnings. 14 | 15 | Should be favoured over UserWarning if no subclass fits for a given warning, 16 | since warnings are more likely to be caused by the dev and not the players.""" 17 | 18 | 19 | class PathfindingWarning(DevWarning): 20 | """Pathfinding-related warnings.""" 21 | 22 | 23 | class GameMapWarning(DevWarning): 24 | # NOTE: docstring acts as if we put a pass instruction here, 25 | # so pass usage is not required 26 | """Game map-related warning category.""" 27 | 28 | 29 | class CameraWarning(DevWarning): 30 | """Camera-related warning category.""" 31 | -------------------------------------------------------------------------------- /src/gui/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.gui 3 | This module groups everything related to the User Interface. 4 | 5 | Before using any UI element, be sure to call setup.setup_gui first. 6 | This ensures that every Asset related to UI elements is properly loaded. 7 | This is not (yet) required for elements of the menu submodule. 8 | """ 9 | -------------------------------------------------------------------------------- /src/gui/interface/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.gui.interface 3 | The interface submodule of gui groups everything related to the in-game 4 | user-interface. 5 | 6 | Apart from the base classes contained in emotes_base, all elements are ready 7 | for use in the game. 8 | """ 9 | -------------------------------------------------------------------------------- /src/gui/interface/indicators.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | ENTITY_FOCUSED: pygame.Surface | None = None 4 | -------------------------------------------------------------------------------- /src/gui/menu/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.gui.menu 3 | The menu submodule of gui contains the base class for the game's menus, 4 | general_menu.GeneralMenu, as well as basic components for use in such menus. 5 | """ 6 | -------------------------------------------------------------------------------- /src/gui/menu/general_menu.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | from pygame.math import Vector2 as vector 5 | from pygame.mouse import get_pressed as mouse_buttons 6 | 7 | from src.enums import GameState 8 | from src.gui.menu.abstract_menu import AbstractMenu 9 | from src.gui.menu.components import Button 10 | 11 | 12 | class GeneralMenu(AbstractMenu): 13 | def __init__( 14 | self, 15 | title: str, 16 | options: list[str], 17 | switch: Callable[[GameState], None], 18 | size: tuple[int, int], 19 | center: vector = None, 20 | ): 21 | if center is None: 22 | center = vector() 23 | 24 | super().__init__(title, size, center) 25 | 26 | self.options = options 27 | self.button_setup() 28 | 29 | # switch 30 | self.switch_screen = switch 31 | 32 | def draw(self) -> None: 33 | self.draw_title() 34 | self.draw_buttons() 35 | 36 | def button_setup(self) -> None: 37 | # button setup 38 | button_width = 400 39 | button_height = 50 40 | size = (button_width, button_height) 41 | space = 10 42 | top_margin = 20 43 | 44 | # generic button rect 45 | generic_button_rect = pygame.Rect((0, 0), size) 46 | generic_button_rect.top = self.rect.top + top_margin 47 | generic_button_rect.centerx = self.rect.centerx 48 | 49 | # create buttons 50 | for title in self.options: 51 | rect = generic_button_rect 52 | button = Button(title, rect, self.font) 53 | self.buttons.append(button) 54 | generic_button_rect = rect.move(0, button_height + space) 55 | 56 | def handle_event(self, event: pygame.event.Event) -> bool: 57 | if super().handle_event(event): 58 | return True 59 | 60 | if event.type == pygame.MOUSEBUTTONDOWN and mouse_buttons()[0]: 61 | self.pressed_button = self.get_hovered_button() 62 | 63 | return False 64 | 65 | def button_action(self, text: str) -> None: 66 | if text == "Quit": 67 | self.quit_game() 68 | 69 | def remove_button(self, button_text: str) -> None: 70 | self.buttons = [button for button in self.buttons if button.text != button_text] 71 | 72 | def draw_description(self): 73 | pass 74 | -------------------------------------------------------------------------------- /src/gui/setup.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src import support 4 | from src.gui.interface import dialog, emotes, indicators 5 | 6 | 7 | def setup_gui(): 8 | # region Dialog 9 | _tb_base = pygame.image.load( 10 | support.resource_path("images/ui/textbox.png") 11 | ).convert_alpha() 12 | tb_cname_base_surf = _tb_base.subsurface(pygame.Rect(0, 0, 212, 67)) 13 | tb_main_text_base_surf = _tb_base.subsurface(pygame.Rect(0, 74, 391, 202)) 14 | 15 | dialog.prepare_tb_image(tb_cname_base_surf, tb_main_text_base_surf) 16 | # endregion 17 | 18 | # region Emotes 19 | emote_dialog_box = pygame.image.load( 20 | support.resource_path("images/ui/dialog_boxes/tiny_down.png") 21 | ).convert_alpha() 22 | emote_dialog_box = emote_dialog_box.subsurface(pygame.Rect(8, 8, 32, 32)) 23 | emote_dialog_box = pygame.transform.scale(emote_dialog_box, (32 * 3, 32 * 3)) 24 | emotes.EmoteBox.EMOTE_DIALOG_BOX = emote_dialog_box 25 | 26 | entity_focus_indicator = pygame.image.load( 27 | support.resource_path("images/ui/indicators/entity_focused.png") 28 | ).convert_alpha() 29 | entity_focus_indicator = pygame.transform.scale( 30 | entity_focus_indicator, 31 | ( 32 | entity_focus_indicator.get_width() * 2, 33 | entity_focus_indicator.get_height() * 2, 34 | ), 35 | ) 36 | indicators.ENTITY_FOCUSED = entity_focus_indicator 37 | # endregion 38 | -------------------------------------------------------------------------------- /src/import_checks.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import warnings 3 | 4 | import pygame 5 | 6 | if not getattr(pygame, "IS_CE", False): 7 | raise ImportError( 8 | "The game requires Pygame CE to function. " 9 | "(hint: type pip uninstall pygame and then pip install pygame-ce)" 10 | ) 11 | 12 | if sys.version_info < (3, 12): 13 | warnings.warn( 14 | f"The project is currently running under Python " 15 | f"{sys.version_info.major}.{sys.version_info.minor}. " 16 | "Consider upgrading to 3.12 or the most recent version available " 17 | "before running the game further.", 18 | DeprecationWarning, 19 | ) 20 | -------------------------------------------------------------------------------- /src/map_objects.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | 3 | import pygame 4 | from pytmx import TiledMap 5 | 6 | from src.settings import SCALE_FACTOR 7 | 8 | 9 | @dataclass 10 | class MapObjectType: 11 | gid: int = None 12 | 13 | image: pygame.Surface = None 14 | hitbox: pygame.FRect = None 15 | 16 | 17 | class MapObjects: 18 | _objects: dict[int, MapObjectType] 19 | 20 | _tilemap: TiledMap 21 | 22 | def __init__(self, tilemap: TiledMap): 23 | self._tilemap = tilemap 24 | 25 | self._objects = {} 26 | for gid, hitbox_list in self._tilemap.get_tile_colliders(): 27 | map_object = MapObjectType(gid=gid) 28 | 29 | map_object.image = self._tilemap.get_tile_image_by_gid(gid) 30 | if len(hitbox_list) > 0: 31 | hitbox = hitbox_list[0] 32 | map_object.hitbox = pygame.FRect( 33 | hitbox.x * SCALE_FACTOR, # noqa 34 | hitbox.y * SCALE_FACTOR, # noqa 35 | hitbox.width * SCALE_FACTOR, # noqa 36 | hitbox.height * SCALE_FACTOR, # noqa 37 | ) 38 | else: 39 | map_object.hitbox = map_object.image.get_frect() 40 | self._objects[gid] = map_object 41 | 42 | def __getitem__(self, gid): 43 | try: 44 | return self._objects[gid] 45 | except KeyError as e: 46 | raise KeyError( 47 | f"No object with gid {gid}.\nCheck if you " 48 | f"defined a valid hitbox on the object you " 49 | f"tried to access." 50 | ) from e 51 | 52 | def get(self, gid): 53 | return self._objects.get( 54 | gid, MapObjectType(gid=gid, image=self._tilemap.get_tile_image_by_gid(gid)) 55 | ) 56 | -------------------------------------------------------------------------------- /src/npc/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.npc 3 | This module groups everything related to AI-controlled Entities. 4 | 5 | Before initialising any Entity, this module should first be set up by calling 6 | setup.AIData.setup. This ensures that all behaviour trees shared between 7 | Entities of the same type are properly initialised, and that variables 8 | necessary for AI pathfinding are created. 9 | 10 | If you need to reference any specific entity type, you are encouraged to do so 11 | using their respective base classes, located in src.npc.bases, to avoid having 12 | problems with circular imports. 13 | """ 14 | -------------------------------------------------------------------------------- /src/npc/bases/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.npc.bases 3 | The bases submodule of npc contains all base classes for AI-controlled 4 | Entities. 5 | 6 | These classes should be used when needing to reference any specific entity 7 | type, to avoid having problems with circular imports. 8 | 9 | These classes are not intended to be initialised directly and should 10 | generally only be inherited by entities of the respective type. 11 | """ 12 | -------------------------------------------------------------------------------- /src/npc/bases/animal.py: -------------------------------------------------------------------------------- 1 | from abc import ABC 2 | 3 | from src.enums import Direction 4 | from src.sprites.entities.entity import Entity 5 | 6 | 7 | class Animal(Entity, ABC): 8 | def animate(self, dt): 9 | super().animate(dt) 10 | 11 | def get_facing_direction(self): 12 | # Animals can only face left and right 13 | if self.direction.x > 0: 14 | self.facing_direction = Direction.RIGHT 15 | elif self.direction.x < 0: 16 | self.facing_direction = Direction.LEFT 17 | -------------------------------------------------------------------------------- /src/npc/bases/chicken_base.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from abc import ABC 4 | from typing import ClassVar 5 | 6 | import pygame 7 | from pathfinding.core.grid import Grid 8 | from pathfinding.finder.a_star import AStarFinder 9 | 10 | from src.npc.bases.ai_behaviour import AIBehaviour 11 | from src.npc.bases.animal import Animal 12 | from src.npc.behaviour.ai_behaviour_tree_base import ContextType 13 | from src.settings import Coordinate 14 | from src.sprites.setup import EntityAsset 15 | 16 | 17 | class ChickenBase(Animal, AIBehaviour, ABC): 18 | pf_matrix: ClassVar[list[list[int]] | None] = None 19 | pf_grid: ClassVar[Grid | None] = None 20 | pf_finder: ClassVar[AStarFinder | None] = None 21 | 22 | def __init__( 23 | self, 24 | pos: Coordinate, 25 | assets: EntityAsset, 26 | groups: tuple[pygame.sprite.Group, ...], 27 | collision_sprites: pygame.sprite.Group, 28 | behaviour_tree_context: ContextType, 29 | z: int, 30 | ): 31 | Animal.__init__( 32 | self, 33 | pos=pos, 34 | assets=assets, 35 | groups=groups, 36 | collision_sprites=collision_sprites, 37 | z=z, 38 | ) 39 | AIBehaviour.__init__(self, behaviour_tree_context=behaviour_tree_context) 40 | 41 | self.speed = 250 42 | -------------------------------------------------------------------------------- /src/npc/bases/cow_base.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from abc import ABC, abstractmethod 4 | from typing import ClassVar 5 | 6 | import pygame 7 | from pathfinding.core.grid import Grid 8 | from pathfinding.finder.a_star import AStarFinder 9 | 10 | from src.npc.bases.ai_behaviour import AIBehaviour 11 | from src.npc.bases.animal import Animal 12 | from src.npc.behaviour.ai_behaviour_tree_base import ContextType 13 | from src.settings import Coordinate 14 | from src.sprites.entities.character import Character 15 | from src.sprites.setup import EntityAsset 16 | 17 | 18 | class CowBase(Animal, AIBehaviour, ABC): 19 | pf_matrix: ClassVar[list[list[int]] | None] = None 20 | pf_grid: ClassVar[Grid | None] = None 21 | pf_finder: ClassVar[AStarFinder | None] = None 22 | 23 | fleeing: bool 24 | 25 | player: Character 26 | 27 | def __init__( 28 | self, 29 | pos: Coordinate, 30 | assets: EntityAsset, 31 | groups: tuple[pygame.sprite.Group, ...], 32 | collision_sprites: pygame.sprite.Group, 33 | behaviour_tree_context: ContextType, 34 | z: int, 35 | ): 36 | Animal.__init__( 37 | self, 38 | pos=pos, 39 | assets=assets, 40 | groups=groups, 41 | collision_sprites=collision_sprites, 42 | z=z, 43 | ) 44 | AIBehaviour.__init__(self, behaviour_tree_context=behaviour_tree_context) 45 | 46 | self.speed = 150 47 | 48 | @abstractmethod 49 | def flee_from_pos(self, pos: tuple[int, int], pf_grid: Grid = None) -> bool: 50 | pass 51 | -------------------------------------------------------------------------------- /src/npc/bases/npc_base.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from abc import ABC 4 | from collections.abc import Callable 5 | from typing import ClassVar 6 | 7 | import pygame 8 | from pathfinding.core.grid import Grid 9 | from pathfinding.finder.a_star import AStarFinder 10 | 11 | from src.enums import FarmingTool, StudyGroup 12 | from src.gui.interface.emotes import NPCEmoteManager 13 | from src.npc.bases.ai_behaviour import AIBehaviour 14 | from src.npc.behaviour.ai_behaviour_tree_base import ContextType 15 | from src.overlay.soil import SoilArea 16 | from src.settings import Coordinate 17 | from src.sprites.entities.character import Character 18 | from src.sprites.setup import EntityAsset 19 | 20 | 21 | class NPCBase(Character, AIBehaviour, ABC): 22 | pf_matrix: ClassVar[list[list[int]] | None] = None 23 | pf_grid: ClassVar[Grid | None] = None 24 | pf_finder: ClassVar[AStarFinder | None] = None 25 | 26 | soil_area: SoilArea 27 | tree_sprites: pygame.sprite.Group 28 | 29 | def __init__( 30 | self, 31 | pos: Coordinate, 32 | assets: EntityAsset, 33 | groups: tuple[pygame.sprite.Group, ...], 34 | collision_sprites: pygame.sprite.Group, 35 | study_group: StudyGroup, 36 | apply_tool: Callable[[FarmingTool, tuple[float, float], Character], None], 37 | plant_collision: Callable[[Character], None], 38 | behaviour_tree_context: ContextType, 39 | z: int, 40 | emote_manager: NPCEmoteManager, 41 | npc_id: int = 0, 42 | ): 43 | Character.__init__( 44 | self, 45 | pos=pos, 46 | assets=assets, 47 | groups=groups, 48 | collision_sprites=collision_sprites, 49 | study_group=study_group, 50 | apply_tool=apply_tool, 51 | plant_collision=plant_collision, 52 | z=z, 53 | ) 54 | AIBehaviour.__init__(self, behaviour_tree_context=behaviour_tree_context) 55 | self.emote_manager = emote_manager 56 | self.npc_id = npc_id 57 | self.speed = 250 58 | -------------------------------------------------------------------------------- /src/npc/behaviour/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | src.npc.behaviour 3 | The behaviour submodule of npc groups everything related to the behaviour of 4 | AI-controlled Entities. 5 | 6 | Aside from the parent class of all AI-controlled Entities, AIBehaviour, this 7 | module contains the behaviour trees for all different types of Entities. 8 | 9 | When running a custom behaviour tree, any state can be passed by creating a 10 | sublass of ai_behaviour_tree_base.Context. 11 | """ 12 | -------------------------------------------------------------------------------- /src/npc/behaviour/chicken_behaviour_tree.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from dataclasses import dataclass 4 | from enum import Enum 5 | 6 | from pathfinding.core.grid import Grid 7 | 8 | from src.npc.bases.chicken_base import ChickenBase 9 | from src.npc.behaviour.ai_behaviour_tree_base import ( 10 | Action, 11 | Context, 12 | NodeWrapper, 13 | Selector, 14 | ) 15 | from src.npc.utils import pf_wander 16 | 17 | 18 | @dataclass 19 | class ChickenIndividualContext(Context): 20 | chicken: ChickenBase 21 | range_grid: Grid = None 22 | 23 | 24 | def wander(context: ChickenIndividualContext) -> bool: 25 | return pf_wander(context.chicken, pf_grid=ChickenIndividualContext.range_grid) 26 | 27 | 28 | class ChickenBehaviourTree(NodeWrapper, Enum): 29 | Wander = Selector(Action(wander)) 30 | -------------------------------------------------------------------------------- /src/npc/behaviour/cow_behaviour_tree.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | from dataclasses import dataclass 4 | from enum import Enum 5 | 6 | from pathfinding.core.grid import Grid 7 | 8 | from src.npc.bases.cow_base import CowBase 9 | from src.npc.behaviour.ai_behaviour_tree_base import ( 10 | Action, 11 | Condition, 12 | Context, 13 | NodeWrapper, 14 | Selector, 15 | Sequence, 16 | ) 17 | from src.npc.setup import AIData 18 | from src.npc.utils import pf_wander 19 | from src.settings import SCALED_TILE_SIZE 20 | 21 | 22 | @dataclass 23 | class CowIndividualContext(Context): 24 | cow: CowBase 25 | range_grid: Grid = None 26 | 27 | 28 | def wander(context: CowIndividualContext) -> bool: 29 | return pf_wander(context.cow, pf_grid=CowIndividualContext.range_grid) 30 | 31 | 32 | # region flee behaviour 33 | def player_nearby(context: CowIndividualContext) -> bool: 34 | distance_threshold = 2.5 * SCALED_TILE_SIZE 35 | current_distance = ( 36 | (AIData.player.rect.center[0] - context.cow.rect.center[0]) ** 2 37 | + (AIData.player.rect.center[1] - context.cow.rect.center[1]) ** 2 38 | ) ** 0.5 39 | return current_distance < distance_threshold 40 | 41 | 42 | def flee_from_player(context: CowIndividualContext) -> bool: 43 | return context.cow.flee_from_pos( 44 | ( 45 | AIData.player.rect.centerx / SCALED_TILE_SIZE, 46 | AIData.player.rect.centery / SCALED_TILE_SIZE, 47 | ) 48 | ) 49 | 50 | 51 | # endregion 52 | 53 | 54 | class CowConditionalBehaviourTree(NodeWrapper, Enum): 55 | Wander = Selector(Action(wander)) 56 | 57 | 58 | class CowContinuousBehaviourTree(NodeWrapper, Enum): 59 | Flee = Selector(Sequence(Condition(player_nearby), Action(flee_from_player))) 60 | -------------------------------------------------------------------------------- /src/npc/chicken.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src.enums import Layer 4 | from src.npc.bases.chicken_base import ChickenBase 5 | from src.npc.behaviour.chicken_behaviour_tree import ChickenIndividualContext 6 | from src.settings import Coordinate 7 | from src.sprites.setup import EntityAsset 8 | 9 | 10 | class Chicken(ChickenBase): 11 | def __init__( 12 | self, 13 | pos: Coordinate, 14 | assets: EntityAsset, 15 | groups: tuple[pygame.sprite.Group, ...], 16 | collision_sprites: pygame.sprite.Group, 17 | ): 18 | super().__init__( 19 | pos=pos, 20 | assets=assets, 21 | groups=groups, 22 | collision_sprites=collision_sprites, 23 | behaviour_tree_context=ChickenIndividualContext(self), 24 | z=Layer.MAIN, 25 | ) 26 | -------------------------------------------------------------------------------- /src/npc/path_scripting.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | 3 | from src.enums import AIState 4 | 5 | 6 | @dataclass 7 | class Waypoint: 8 | pos: tuple[int, int] 9 | speed: int 10 | waiting_duration: float 11 | 12 | 13 | @dataclass 14 | class AIScriptedPath: 15 | waypoints: list[Waypoint] 16 | 17 | start_pos: tuple[float, float] 18 | 19 | previous_speed: int = field(default=0, init=False) 20 | 21 | running: bool = field(default=False, init=False) 22 | index: int = field(default=0, init=False) 23 | next_state: AIState = field(default=AIState.IDLE, init=False) 24 | -------------------------------------------------------------------------------- /src/npc/setup.py: -------------------------------------------------------------------------------- 1 | from pathfinding.core.diagonal_movement import DiagonalMovement 2 | from pathfinding.core.grid import Grid 3 | from pathfinding.finder.a_star import AStarFinder 4 | 5 | from src.npc.bases.chicken_base import ChickenBase 6 | from src.npc.bases.cow_base import CowBase 7 | from src.npc.bases.npc_base import NPCBase 8 | from src.sprites.entities.entity import Entity 9 | from src.sprites.entities.player import Player 10 | 11 | 12 | class AIData: 13 | Matrix: list[list[int]] = None 14 | Grid: Grid = None 15 | 16 | player: Player = None 17 | moving_collideable_objects: list[Entity] = None 18 | 19 | setup: bool = False 20 | 21 | @classmethod 22 | def update( 23 | cls, 24 | pathfinding_matrix: list[list[int]], 25 | player: Player, 26 | moving_collideable_objects: list[Entity] = None, 27 | ) -> None: 28 | if not cls.setup: 29 | NPCBase.pf_finder = AStarFinder() 30 | ChickenBase.pf_finder = AStarFinder( 31 | diagonal_movement=DiagonalMovement.only_when_no_obstacle 32 | ) 33 | CowBase.pf_finder = AStarFinder( 34 | diagonal_movement=DiagonalMovement.only_when_no_obstacle 35 | ) 36 | 37 | cls.setup = True 38 | 39 | cls.Matrix = pathfinding_matrix 40 | cls.Grid = Grid(matrix=cls.Matrix) 41 | 42 | for ai in (NPCBase, ChickenBase, CowBase): 43 | ai.pf_matrix = cls.Matrix 44 | ai.pf_grid = cls.Grid 45 | 46 | cls.player = player 47 | 48 | cls.moving_collideable_objects = moving_collideable_objects 49 | if cls.moving_collideable_objects is None: 50 | cls.moving_collideable_objects = [] 51 | cls.moving_collideable_objects.append(cls.player) 52 | -------------------------------------------------------------------------------- /src/overlay/fast_forward.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pygame 4 | 5 | from src.settings import SCREEN_WIDTH 6 | from src.support import get_translated_string 7 | 8 | 9 | class FastForward: 10 | def __init__(self) -> None: 11 | self.sprites = [] 12 | for filename in os.listdir("images/fast_forward"): 13 | if filename.endswith(".png"): 14 | img = pygame.image.load( 15 | os.path.join("images/fast_forward", filename) 16 | ).convert_alpha() 17 | self.sprites.append(img) 18 | self.current_frame = 0 19 | self.total_frame = 10 20 | self.font = pygame.font.Font("font/LycheeSoda.ttf", 30) 21 | self.text_surface = self.font.render( 22 | get_translated_string("Right Shift to Fast Forward"), 23 | True, 24 | (255, 255, 255), 25 | ) 26 | self.text_rect = self.text_surface.get_frect( 27 | midright=((SCREEN_WIDTH - 15, 600)) 28 | ) 29 | 30 | def draw_overlay(self, display_surface): 31 | display_surface.blit(self.sprites[self.current_frame], (0, 0)) 32 | self.current_frame += 1 33 | if self.current_frame >= self.total_frame: 34 | self.current_frame = 0 35 | 36 | def draw_option(self, display_surface): 37 | display_surface.blit(self.text_surface, self.text_rect) 38 | -------------------------------------------------------------------------------- /src/overlay/fps.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src.fblitter import FBLITTER 4 | from src.settings import OVERLAY_POSITIONS 5 | from src.support import import_font 6 | 7 | 8 | class FPS: 9 | def __init__(self, clock: pygame.time.Clock): 10 | # setup 11 | self.display_surface = pygame.display.get_surface() 12 | self.clock = clock 13 | 14 | # dimensions 15 | self.left = 20 16 | self.top = 20 17 | 18 | width, height = 180, 50 19 | self.font = import_font(40, "font/LycheeSoda.ttf") 20 | 21 | self.rect = pygame.Rect(self.left, self.top, width, height) 22 | 23 | self.rect.bottomright = OVERLAY_POSITIONS["FPS"] 24 | 25 | def display(self): 26 | # get FPS 27 | fps = self.clock.get_fps() 28 | 29 | # rects and surfs 30 | pad_y = 2 31 | 32 | label_surf = self.font.render("FPS:", False, "Black") 33 | label_rect = label_surf.get_frect( 34 | midleft=(self.rect.left + 20, self.rect.centery + pad_y) 35 | ) 36 | 37 | fps_surf = self.font.render(f"{fps:5.1f}", False, "Black") 38 | fps_rect = fps_surf.get_frect( 39 | midright=(self.rect.right - 20, self.rect.centery + pad_y) 40 | ) 41 | 42 | # display 43 | FBLITTER.draw_rect("white", self.rect, 0, 4) 44 | FBLITTER.draw_rect("black", self.rect, 4, 4) 45 | FBLITTER.schedule_blit(label_surf, label_rect) 46 | FBLITTER.schedule_blit(fps_surf, fps_rect) 47 | -------------------------------------------------------------------------------- /src/overlay/game_time.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src.settings import SECONDS_PER_GAME_MINUTE 4 | 5 | 6 | class GameTime: 7 | """In-game clock implementation.""" 8 | 9 | def __init__(self): 10 | self.game_hour = 12 # game starts at this hour 11 | self.game_minute = 0 # game starts at this minute 12 | 13 | # gets the creation time in ticks 14 | self.last_time = pygame.time.get_ticks() 15 | 16 | def set_time(self, hours, minutes): 17 | self.game_hour = hours 18 | self.game_minute = minutes 19 | 20 | def get_time(self): 21 | return self.game_hour, self.game_minute 22 | 23 | def update(self): 24 | # day-night cycle 25 | current_time = pygame.time.get_ticks() 26 | 27 | # if more than SECONDS_PER_GAME_MINUTE has passed, update clock 28 | if current_time - self.last_time > SECONDS_PER_GAME_MINUTE * 1000: 29 | self.last_time = current_time 30 | self.game_minute += 1 31 | 32 | # minutes cycle every 60 in game minutes 33 | if self.game_minute > 59: 34 | self.game_minute = 0 35 | self.game_hour += 1 36 | if self.game_hour > 23: # hours cycle every 24 in game hours 37 | self.game_hour = 0 38 | -------------------------------------------------------------------------------- /src/overlay/money.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src.fblitter import FBLITTER 4 | from src.settings import OVERLAY_POSITIONS 5 | from src.sprites.entities.player import Player 6 | from src.support import import_font 7 | 8 | 9 | class Money: 10 | def __init__(self, entity: Player): 11 | # setup 12 | self.display_surface = pygame.display.get_surface() 13 | self.player = entity 14 | 15 | # dimensions 16 | self.left = 20 17 | self.top = 20 18 | 19 | width, height = 100, 50 20 | self.font = import_font(40, "font/LycheeSoda.ttf") 21 | 22 | self.rect = pygame.Rect(self.left, self.top, width, height) 23 | 24 | self.rect.bottomright = OVERLAY_POSITIONS["money"] 25 | 26 | def display(self): 27 | # colors connected to player state 28 | black = "Black" 29 | gray = "Gray" 30 | foreground_color = gray if self.player.blocked else black 31 | 32 | # rects and surfs 33 | pad_y = 2 34 | 35 | money_surf = self.font.render(f"${self.player.money}", False, foreground_color) 36 | money_rect = money_surf.get_frect( 37 | midright=(self.rect.right - 20, self.rect.centery + pad_y) 38 | ) 39 | 40 | # display 41 | FBLITTER.draw_rect("white", self.rect, 0, 4) 42 | FBLITTER.draw_rect(foreground_color, self.rect, 4, 4) 43 | FBLITTER.schedule_blit(money_surf, money_rect) 44 | -------------------------------------------------------------------------------- /src/overlay/transition.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | 5 | from src import settings 6 | from src.fblitter import FBLITTER 7 | from src.support import oscilating_lerp 8 | from src.timer import Timer 9 | 10 | 11 | class Transition: 12 | def __init__( 13 | self, reset: Callable[[], None], finish_reset: Callable[[], None], dur: int 14 | ): 15 | # setup 16 | self.display_surface = pygame.display.get_surface() 17 | self.reset = reset 18 | self.peaked = True 19 | self.timer = Timer(dur, func=finish_reset) 20 | self.finish_reset = finish_reset 21 | 22 | # overlay image 23 | self.image = pygame.Surface( 24 | ( 25 | settings.SCREEN_WIDTH, 26 | settings.SCREEN_HEIGHT, 27 | ) 28 | ) 29 | 30 | # color 31 | self.start_color = pygame.Color(255, 255, 255) 32 | self.target_color = pygame.Color(0, 0, 0) 33 | self.curr_color = self.start_color 34 | 35 | def __bool__(self): 36 | return bool(self.timer) 37 | 38 | def activate(self): 39 | self.timer.activate() 40 | self.peaked = False 41 | 42 | def update(self): 43 | self.timer.update() 44 | if self.timer: 45 | t = self.timer.get_progress() 46 | # call reset 47 | if not self.peaked and t > 0.5: 48 | self.reset() 49 | self.peaked = True 50 | # interpolate colors 51 | t = oscilating_lerp(0, 1, pygame.math.smoothstep(0, 1, t)) 52 | self.curr_color = self.start_color.lerp(self.target_color, t) 53 | 54 | def draw(self): 55 | if self.timer: 56 | self.image.fill(self.curr_color) 57 | FBLITTER.blit_with_special_flags(self.image, (0, 0), pygame.BLEND_RGBA_MULT) 58 | -------------------------------------------------------------------------------- /src/savefile/__init__.py: -------------------------------------------------------------------------------- 1 | from src.savefile.savefile import SaveFile 2 | 3 | __all__ = ["SaveFile"] 4 | -------------------------------------------------------------------------------- /src/savefile/tile_info.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, field 2 | 3 | from src.enums import SeedType 4 | from src.settings import Coordinate 5 | 6 | 7 | def _none(): 8 | return None 9 | 10 | 11 | @dataclass 12 | class PlantInfo: 13 | plant_type: SeedType 14 | age: int = field(default=0) 15 | 16 | def __post_init__(self): 17 | if self.age < 0: 18 | raise ValueError("corrupt save file: plants cannot have a negative age") 19 | 20 | def __json__(self): 21 | """Return self in a JSON-serialisable format.""" 22 | return {"plant_type": self.plant_type.value, "age": self.age} 23 | 24 | 25 | @dataclass 26 | class TileInfo: 27 | watered: bool 28 | pos: Coordinate 29 | plant_info: PlantInfo | None = field(default=None) 30 | 31 | def __json__(self): 32 | """Return self in a JSON-serialisable format.""" 33 | return { 34 | "watered": self.watered, 35 | "pos": self.pos, 36 | "plant_info": getattr(self.plant_info, "__json__", _none)(), 37 | } 38 | -------------------------------------------------------------------------------- /src/screens/menu_notification.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | 5 | from src.enums import GameState 6 | from src.gui.menu.general_menu import GeneralMenu 7 | from src.settings import SCREEN_HEIGHT, SCREEN_WIDTH 8 | from src.support import get_translated_string 9 | 10 | 11 | class NotificationMenu(GeneralMenu): 12 | def __init__( 13 | self, 14 | switch_screen: Callable[[GameState], None], 15 | message: str, 16 | ): 17 | options = [get_translated_string("OK")] 18 | title = get_translated_string("Notification") 19 | size = (400, 400) 20 | self.message = message 21 | super().__init__(title, options, switch_screen, size) 22 | 23 | def button_action(self, text: str): 24 | if text == get_translated_string("OK"): 25 | self.switch_screen(GameState.PLAY) 26 | # if text == "Quit": 27 | # self.quit_game() 28 | 29 | def handle_event(self, event: pygame.event.Event) -> bool: 30 | if super().handle_event(event): 31 | return True 32 | 33 | if event.type == pygame.KEYDOWN: 34 | if event.key in [ 35 | pygame.K_ESCAPE, 36 | pygame.K_RETURN, 37 | pygame.K_SPACE, 38 | pygame.K_BACKSPACE, 39 | ]: 40 | self.switch_screen(GameState.PLAY) 41 | return True 42 | 43 | return False 44 | 45 | def draw_title(self): 46 | super().draw_title() 47 | top = SCREEN_HEIGHT / 20 + 75 48 | left = SCREEN_WIDTH // 2 49 | 50 | text_surf = self.font.render(self.message, False, "black") 51 | text_rect = text_surf.get_frect(top=top, centerx=left) 52 | 53 | bg_rect = pygame.Rect(0, 0, text_rect.width + 40, 50) 54 | bg_rect.center = text_rect.center 55 | 56 | pygame.draw.rect(self.display_surface, "white", bg_rect, 0, 4) 57 | self.display_surface.blit(text_surf, text_rect) 58 | -------------------------------------------------------------------------------- /src/screens/menu_pause.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | 5 | from src.enums import GameState 6 | from src.gui.menu.general_menu import GeneralMenu 7 | from src.support import get_translated_string 8 | 9 | 10 | class PauseMenu(GeneralMenu): 11 | def __init__( 12 | self, 13 | switch_screen: Callable[[GameState], None], 14 | ): 15 | options = [get_translated_string("Resume"), get_translated_string("Options")] 16 | title = get_translated_string("Pause Menu") 17 | size = (400, 400) 18 | super().__init__(title, options, switch_screen, size) 19 | 20 | def button_action(self, text: str): 21 | if text == get_translated_string("Resume"): 22 | self.switch_screen(GameState.PLAY) 23 | if text == get_translated_string("Options"): 24 | self.switch_screen(GameState.SETTINGS) 25 | 26 | def handle_event(self, event: pygame.event.Event) -> bool: 27 | if super().handle_event(event): 28 | return True 29 | 30 | if event.type == pygame.KEYDOWN: 31 | if event.key == pygame.K_ESCAPE: 32 | self.switch_screen(GameState.PLAY) 33 | return True 34 | 35 | return False 36 | -------------------------------------------------------------------------------- /src/screens/minigames/base.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from collections.abc import Callable 3 | from dataclasses import dataclass 4 | from typing import TypeVar 5 | 6 | import pygame 7 | 8 | 9 | @dataclass 10 | class MinigameState: 11 | pass 12 | 13 | 14 | MinigameStateType = TypeVar("MinigameStateType", bound=MinigameState) 15 | 16 | 17 | class Minigame(ABC): 18 | _state: MinigameStateType 19 | 20 | running: bool 21 | 22 | __on_start_funcs: list[Callable[[], None]] 23 | __on_finish_funcs: list[Callable[[], None]] 24 | 25 | def __init__(self, state: MinigameStateType): 26 | self._state = state 27 | 28 | self._running = False 29 | 30 | self._ctime = 0 31 | 32 | self.__on_start_funcs = [] 33 | self.__on_finish_funcs = [] 34 | 35 | @property 36 | def running(self): 37 | return self._running 38 | 39 | def on_start(self, func: Callable[[], None]): 40 | self.__on_start_funcs.append(func) 41 | 42 | def on_finish(self, func: Callable[[], None]): 43 | self.__on_finish_funcs.append(func) 44 | 45 | def start(self): 46 | self._running = True 47 | self._ctime = 0 48 | 49 | for func in self.__on_start_funcs: 50 | func() 51 | 52 | def finish(self): 53 | self._running = False 54 | 55 | for func in self.__on_finish_funcs: 56 | func() 57 | 58 | @abstractmethod 59 | def handle_event(self, event: pygame.Event): 60 | pass 61 | 62 | def update(self, dt: float): 63 | self._ctime += dt 64 | 65 | @abstractmethod 66 | def draw(self): 67 | pass 68 | -------------------------------------------------------------------------------- /src/screens/minigames/cow_herding_behaviour.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | from pathfinding.core.grid import Grid 4 | 5 | from src.npc.behaviour.ai_behaviour_tree_base import ( 6 | Action, 7 | Condition, 8 | NodeWrapper, 9 | Selector, 10 | Sequence, 11 | ) 12 | from src.npc.behaviour.cow_behaviour_tree import CowIndividualContext, player_nearby 13 | from src.npc.setup import AIData 14 | from src.npc.utils import pf_wander 15 | from src.settings import SCALED_TILE_SIZE 16 | 17 | 18 | class CowHerdingContext: 19 | barn_grid: Grid = None 20 | default_grid: Grid = None 21 | range_grid: Grid = None 22 | 23 | 24 | def wander_barn(context: CowIndividualContext) -> bool: 25 | return pf_wander(context.cow, pf_grid=CowHerdingContext.barn_grid) 26 | 27 | 28 | def wander_range(context: CowIndividualContext) -> bool: 29 | return pf_wander(context.cow, pf_grid=CowHerdingContext.range_grid) 30 | 31 | 32 | def flee_from_player(context: CowIndividualContext) -> bool: 33 | return context.cow.flee_from_pos( 34 | ( 35 | AIData.player.rect.centerx / SCALED_TILE_SIZE, 36 | AIData.player.rect.centery / SCALED_TILE_SIZE, 37 | ), 38 | pf_grid=CowHerdingContext.default_grid, 39 | ) 40 | 41 | 42 | class CowHerdingBehaviourTree(NodeWrapper, Enum): 43 | WanderBarn = Selector(Action(wander_barn)) 44 | WanderRange = Selector(Action(wander_range)) 45 | Flee = Selector(Sequence(Condition(player_nearby), Action(flee_from_player))) 46 | -------------------------------------------------------------------------------- /src/screens/switch_to_outgroup_menu.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | 5 | from src.enums import GameState, StudyGroup 6 | from src.gui.menu.general_menu import GeneralMenu 7 | from src.settings import SCREEN_HEIGHT, SCREEN_WIDTH 8 | 9 | # This menu is for when the player decides whether they will join the outgroup. 10 | 11 | 12 | class OutgroupMenu(GeneralMenu): 13 | def __init__( 14 | self, 15 | player, 16 | switch_screen: Callable[[GameState], None], 17 | ): 18 | options = ["Yes", "No"] 19 | title = "Would you like to join the outgroup?\n(Warning: You cannot go back after switching.)" 20 | size = (400, 400) 21 | 22 | self.player = player 23 | super().__init__(title, options, switch_screen, size) 24 | 25 | def button_action(self, text): 26 | if "Yes" in text: 27 | self.player.study_group = StudyGroup.OUTGROUP 28 | self.switch_screen(GameState.PLAY) 29 | elif "No" in text: 30 | self.switch_screen(GameState.PLAY) 31 | 32 | def outgroup_handle_event(self, event: pygame.event.Event) -> bool: 33 | if super().handle_event(event): 34 | return True 35 | return False 36 | 37 | def draw_title(self): 38 | text_surf = self.font.render(self.title, False, "Black") 39 | midtop = (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 20) 40 | text_rect = text_surf.get_frect(midtop=midtop) 41 | 42 | bg_rect = pygame.Rect((0, 0), (600, 100)) 43 | bg_rect.center = text_rect.center 44 | 45 | pygame.draw.rect(self.display_surface, "White", bg_rect, 0, 4) 46 | self.display_surface.blit(text_surf, text_rect) 47 | -------------------------------------------------------------------------------- /src/sprites/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/src/sprites/__init__.py -------------------------------------------------------------------------------- /src/sprites/base.py: -------------------------------------------------------------------------------- 1 | from abc import ABC 2 | from typing import Any 3 | 4 | import pygame 5 | 6 | from src.enums import Layer 7 | from src.fblitter import FBLITTER 8 | from src.map_objects import MapObjectType 9 | from src.settings import SCALE_FACTOR 10 | 11 | 12 | class Sprite(pygame.sprite.Sprite): 13 | def __init__( 14 | self, 15 | pos: tuple[int | float, int | float], 16 | surf: pygame.Surface, 17 | groups: tuple[pygame.sprite.Group, ...] | pygame.sprite.Group = None, 18 | z: int = Layer.MAIN, 19 | name: str | None = None, 20 | custom_properties: dict[str, Any] | None = None, 21 | ): 22 | if groups: 23 | super().__init__(groups) 24 | else: 25 | super().__init__() 26 | self.surf = surf 27 | self.image = surf 28 | self.rect = self.image.get_frect(topleft=pos) 29 | self.z = z 30 | self.name = name 31 | self.custom_properties: dict[str, Any] = custom_properties or {} 32 | self.hitbox_rect = self.rect.copy() 33 | 34 | def draw(self, display_surface: pygame.Surface, rect: pygame.Rect, camera): 35 | FBLITTER.reset_to_default_surf() 36 | FBLITTER.schedule_blit(self.image, rect) 37 | # display_surface.blit(self.image, rect) 38 | 39 | 40 | class CollideableSprite(Sprite, ABC): 41 | hitbox_rect: pygame.FRect 42 | 43 | 44 | class CollideableMapObject(CollideableSprite): 45 | def __init__( 46 | self, 47 | pos: tuple[int, int], 48 | object_type: MapObjectType, 49 | groups: tuple[pygame.sprite.Group, ...] | pygame.sprite.Group = None, 50 | z=Layer.MAIN, 51 | name=None, 52 | ): 53 | self.object_type = object_type 54 | 55 | surf = pygame.transform.scale_by(self.object_type.image, SCALE_FACTOR) 56 | 57 | super().__init__(pos, surf, groups, z, name) 58 | 59 | self.hitbox_rect = self.object_type.hitbox.move(self.rect.topleft) 60 | 61 | 62 | class AnimatedSprite(Sprite): 63 | def __init__(self, pos, frames, groups=None, z=Layer.MAIN): 64 | self.frames, self.frame_index = frames, 0 65 | super().__init__(pos, frames[0], groups, z) 66 | 67 | def animate(self, dt): 68 | self.frame_index += 2 * dt 69 | self.image = self.frames[int(self.frame_index) % len(self.frames)] 70 | 71 | def update(self, dt): 72 | self.animate(dt) 73 | -------------------------------------------------------------------------------- /src/sprites/entities/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/src/sprites/entities/__init__.py -------------------------------------------------------------------------------- /src/sprites/objects/plant.py: -------------------------------------------------------------------------------- 1 | from collections.abc import Callable 2 | 3 | import pygame 4 | from pygame.math import Vector2 as vector 5 | 6 | from src.enums import Layer 7 | from src.settings import GROW_SPEED, SCALE_FACTOR 8 | from src.sprites.base import Sprite 9 | 10 | 11 | class Plant(Sprite): 12 | def __init__(self, seed_type, groups, tile, frames): 13 | super().__init__(tile.rect.center, frames[0], groups, Layer.MAIN) 14 | self.tile = tile 15 | self.frames = frames 16 | 17 | self.seed_type = seed_type 18 | self.max_age = len(self.frames) - 1 19 | self.age = 0 20 | self.grow_speed = GROW_SPEED[seed_type.as_plant_name()] 21 | 22 | self._on_harvestable_funcs = [] 23 | self.harvestable = False 24 | 25 | @property 26 | def harvestable(self): 27 | return self._harvestable 28 | 29 | @harvestable.setter 30 | def harvestable(self, value): 31 | for func in self._on_harvestable_funcs: 32 | func(value) 33 | 34 | self._harvestable = value 35 | 36 | def on_harvestable(self, func: Callable[[bool], None]): 37 | self._on_harvestable_funcs.append(func) 38 | 39 | @property 40 | def age(self): 41 | return self._age 42 | 43 | @age.setter 44 | def age(self, value: float): 45 | self._age = value 46 | 47 | if self.age >= self.max_age: 48 | self._age = self.max_age 49 | self.harvestable = True 50 | 51 | self.image = self.frames[int(self.age)] 52 | self.rect = self.image.get_frect( 53 | midbottom=self.tile.rect.midbottom + vector(0, 2) 54 | ) 55 | 56 | hitbox_height = 8 * SCALE_FACTOR 57 | self.hitbox_rect = pygame.Rect( 58 | self.rect.bottomleft, (self.rect.width, hitbox_height) 59 | ).move(0, -hitbox_height) 60 | # makes the Plant get render as if it was 3px higher, so that the small dirt 61 | # patch around its root does not overlap any other Sprites 62 | self.hitbox_rect.move_ip(0, -3 * SCALE_FACTOR) 63 | 64 | def grow(self): 65 | if self.tile.watered: 66 | self.age += self.grow_speed 67 | -------------------------------------------------------------------------------- /src/sprites/particle.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | from src.enums import Layer 4 | from src.sprites.base import Sprite 5 | from src.timer import Timer 6 | 7 | 8 | class ParticleSprite(Sprite): 9 | def __init__(self, pos, surf, groups, duration=300): 10 | white_surf = pygame.mask.from_surface(surf).to_surface() 11 | white_surf.set_colorkey("black") 12 | super().__init__(pos, white_surf, groups, Layer.PARTICLES) 13 | self.timer = Timer(duration, autostart=True, func=self.kill) 14 | 15 | def update(self, dt): 16 | self.timer.update() 17 | -------------------------------------------------------------------------------- /src/sprites/water_drop.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | import pygame 4 | 5 | from src import timer 6 | from src.sprites.base import Sprite 7 | 8 | 9 | class WaterDrop(Sprite): 10 | def __init__(self, pos, surf, groups, moving, z): 11 | super().__init__(pos, surf, groups, z) 12 | self.timer = timer.Timer( 13 | random.randint(300, 500), 14 | autostart=True, 15 | func=self.kill, 16 | ) 17 | self.start_time = pygame.time.get_ticks() 18 | self.moving = moving 19 | 20 | if moving: 21 | self.direction = pygame.Vector2(-2, 4) 22 | self.speed = random.randint(200, 250) 23 | 24 | def update(self, dt): 25 | self.timer.update() 26 | if self.moving: 27 | self.rect.topleft += self.direction * self.speed * dt 28 | -------------------------------------------------------------------------------- /src/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/src/tests/__init__.py -------------------------------------------------------------------------------- /src/tests/test_support.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | from unittest import mock 4 | 5 | import src.support as support 6 | 7 | 8 | class TestLoadTranslations(unittest.TestCase): 9 | @mock.patch.dict( 10 | os.environ, 11 | {"GAME_LANGUAGE": "en"}, 12 | clear=True, 13 | ) 14 | def test_english(self): 15 | tr = support.load_translations() 16 | self.assertEqual(tr["enter_play_token"], "Please enter token:") 17 | 18 | @mock.patch.dict( 19 | os.environ, 20 | {"GAME_LANGUAGE": "de"}, 21 | clear=True, 22 | ) 23 | def test_german(self): 24 | tr = support.load_translations() 25 | self.assertEqual(tr["enter_play_token"], "Bitte Token eingeben:") 26 | -------------------------------------------------------------------------------- /src/tests/test_utils.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | import src.utils as utils 4 | 5 | 6 | class TestJSONWithCommentsDecoder(unittest.TestCase): 7 | def setUp(self): 8 | pass 9 | 10 | def test_normal_json(self): 11 | text = """ 12 | { 13 | "test":[ 14 | ["foo", "bar"], 15 | ["baz", "qux"] 16 | ] 17 | } 18 | """ 19 | expected = {"test": [["foo", "bar"], ["baz", "qux"]]} 20 | actual = utils.json_loads(text) 21 | self.assertEqual(expected, actual) 22 | 23 | def test_json_with_lines_commented_out(self): 24 | text = """ 25 | { 26 | "test":[ 27 | // ["foo", "bar"], 28 | ["baz", "qux"] 29 | ] 30 | } 31 | """ 32 | expected = {"test": [["baz", "qux"]]} 33 | actual = utils.json_loads(text) 34 | self.assertEqual(expected, actual) 35 | 36 | def test_json_with_trailing_comments(self): 37 | text = """ 38 | { // test 39 | "test":[ 40 | ["foo", "bar"], // trailing comment 41 | ["baz", "qux"] // another comment 42 | ] 43 | } 44 | """ 45 | expected = {"test": [["foo", "bar"], ["baz", "qux"]]} 46 | actual = utils.json_loads(text) 47 | self.assertEqual(expected, actual) 48 | -------------------------------------------------------------------------------- /src/timer.py: -------------------------------------------------------------------------------- 1 | import pygame 2 | 3 | 4 | class Timer: 5 | def __init__(self, duration, repeat=False, autostart=False, func=None): 6 | self.duration = duration 7 | self.start_time = 0 8 | self.active = False 9 | self.finished = False 10 | self.repeat = repeat 11 | self.func = func 12 | 13 | if autostart: 14 | self.activate() 15 | 16 | def __bool__(self): 17 | return self.active 18 | 19 | def activate(self): 20 | self.active = True 21 | self.finished = False 22 | self.start_time = pygame.time.get_ticks() 23 | 24 | def deactivate(self): 25 | self.active = False 26 | self.finished = True 27 | self.start_time = 0 28 | if self.repeat: 29 | self.activate() 30 | 31 | def get_progress(self) -> float: 32 | """returns a value between 0 and 1 that shows the timers progress 33 | 1 means duration finshed""" 34 | curr = pygame.time.get_ticks() 35 | return (curr - self.start_time) / self.duration if self.active else 0 36 | 37 | def update(self): 38 | if self.active: 39 | if pygame.time.get_ticks() - self.start_time >= self.duration: 40 | if self.func and self.start_time != 0: 41 | self.func() 42 | self.deactivate() 43 | -------------------------------------------------------------------------------- /test_formatting.sh: -------------------------------------------------------------------------------- 1 | python formatlint.py $@ 2 | -------------------------------------------------------------------------------- /tools/game_levels.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sloukit/pydew-valley-uzh/e9c15526488197eae87102f25fed59a9d251855d/tools/game_levels.xlsx -------------------------------------------------------------------------------- /tools/impl_excel_to_json/excel_helpers.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | from openpyxl.worksheet.worksheet import Worksheet 4 | 5 | 6 | def cell_value(sheet: Worksheet, cell_address: str) -> Optional[str]: 7 | """ 8 | Returns the value of a cell, even if it's part of a merged range. 9 | 10 | Args: 11 | sheet (Worksheet): The worksheet object. 12 | cell_address (str): The address of the cell (e.g., "A2"). 13 | 14 | Returns: 15 | Optional[str]: The value of the cell or the value of the master cell if it's part of a merged range. 16 | """ 17 | cell = sheet[cell_address] 18 | 19 | # Check if the cell is part of a merged range 20 | for merged_range in sheet.merged_cells.ranges: 21 | if cell.coordinate in merged_range: 22 | master_cell = merged_range.start_cell # Get the top-left (master) cell 23 | return sheet[ 24 | master_cell.coordinate 25 | ].value # Return the value of the master cell 26 | 27 | # If not merged, return the cell's own value 28 | return cell.value 29 | --------------------------------------------------------------------------------