├── .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 |
--------------------------------------------------------------------------------