Game description

In Paddlers, a player is in control of ducks living in Paddland

. The goal is to make all ducks happy and live in harmony. Starting with a single follower, that task is not very difficult. But soon, there are visitors coming to the player's village and they are in a particularly bad mood and need someone to cheer them up.

In order to keep all visitors satisfied, more and more resources are required, hence the player will need to build up the infrastructure in the village. But as the quality of life inside of the village grows, the deeper is the depression of visitors. The only way to make everyone happy seems to be to unite all of Paddland in a single community. But will players cooperate with each other? Or will they fight for the leadership in this community?

Demo

A live-demo of the current state is online now! Usually, the latest tagged commit is deployed. However, it's only semi-automated deployment at this point, therefore the deployed version may diverge from the master branch.

Currently deployed version: 0.2.1

If you experience problems with the live-demo, I would appreciate a short bug report that explains what you see and what kind of device and browser you are using. Firefox on a laptop with Ubuntu 20.04 is what I test the most but the goal is that it works on all (major) platforms.

Game characteristics

Paddlers can be categorized as an MMORTS browser game (massively multiplayer online real-time strategy) with a peaceful-looking theme around ducks and religions.

It can be played on any device with a browser, although right now it is optimally played on a laptop or desktop PC. Players create an account for themselves and then join global server where all players share a universe. All changes made by the players are permanent and the account keeps going even while the player is not logged in.

Real-time (the RT in MMORTS) for Paddlers means that the clock is always ticking and that it matters when players do something. (As opposed to round-based games.) However, Paddlers is nothing like Starcraft or similar RTS games which require good players to perform several actions per second.

Status & Goal

As of April 2021, there is no active work going on in this crate. But the project is not dead, yet. Just a pause from gamedev and some other programming experiments which may or may not be integrated in Paddlers a few months down the line.

The demo currently shows an alpha version which can be played by everyone who signs up. (No email verification required, fake addresses are okay. And please note that the chosen user name will be displayed publicly on a scoreboard.) When a new version is updated, the account usually are still saved but the player state will be reset.

The game itself sadly is not complete enough to provide a good experience. I firmly believe the game could be fun if the right kind of people put in enough effort to polish it. (I can try the best on my own but I a painfully aware of my lack of expertise in many topics around creating a game.) But right now I have no plans to actively bring those people in. Therefore, I expect this to remain an amateur game that works on paper but is not really fun to play.

At the core, Paddlers is a developer's playground. I started this project in 2019 to learn more about WASM in my free time, building on my experience with Rust from many other projects before that. Working on Paddlers has been good fun, I like the creative process it involves. And it has proven to be a good platform to try many different things and learn more about numerous topics.

Moving forward, I want to retain the freedom to try out new and experimental things but also start to iron out a few things. It would be really awesome to draw some conclusions from the learning process, remove experiments that did not turn out well, and double-down on those which did. Ideally, this would lead to some contributions also useful to other projects.

Roadmap for 2021 (in no particular order)

  • Improve and separate Paddle the framework enough from Paddlers the game such that it could be useful to others.
  • Make the game mobile friendly with support for as many platforms as possible
  • Experimentation as I see fit! (For example, multi-threaded WASM execution, or a better client / server model)
  • ...

Commercial aspiration?

I see no commercial path for Paddlers. Even the support for an active player base would require a commitment I'm currently not willing to make.

Blog articles

Some of the game development process is documented in this blog series:

  • Gamedev #0: Creating a new universe (Story introduction)
  • Gamedev #1: Game mechanics
  • Gamedev #2: Multiplayer and procedural map generation
  • Gamedev #3: Fun with Rust and distributed systems (Technical overview)
  • Gamedev #4: Benefits of full-stack Rust
  • Gamedev #5: Version 0.2 Released
  • Gamedev #6: New features in 0.2.1

Videos

I also released a few videos about Paddlers on the Paddlers YouTube channel.

  • First teaser(31.05.2020)
  • Feature overview version 0.2.1 (06.03.2021)

Website

Paddlers Website with News and full text changelog

Compiling and running the project

To build and run the complete project locally with all servers, you can use docker. If everything is set up properly (by me), a simple make in the root directory of the repository should give you a locally running game server hosted at localhost:80. It will take some time for the first compilation (~30 minutes) but later builds should be much faster.

Local builds without docker are also possible using a recent nightly Rust and cargo web for the frontend.

Contributing

If you are interested in joining the project (for fun or learning purposes, I'd guess) then feel free to contact me at [email protected] or comment on some issue you are interested in! :)

I use the github issues to keep track of long-term goals and also to give outsiders a hint on what I am working on. However, most of my notes are still offline and I usually do not bother to create an issue before implementing a new feature. Therefore, potential contributors are encouraged to just tell me what area they might be interested in and then we can have a discussion on possibilities.

Even if you are not a developer, there are also plenty of other interesting tasks to do (game-design, story telling, art, balancing, translations, ... you name it!) and more contributors = more content. Also, I want to add that any contributor can greatly influence the direction the game goes, as it is still only a prototype and it is moving forward with the slow pace of your typical hobby-project.

If you have programming experience, just not with Rust, you are very welcome as well. Hobby projects are the best way to learn new skills!

License

MIT / Apache-2.0

Issues

Collection of the latest Issues

jakmeier

jakmeier

frontend
0

The frames per second are unbearable on mobile phones when entering the skill tree view. On my desktop, it renders smoothly.

To resolve this issue:

  • Find out why it is so slow (e.g. fragment shader)
  • Implement a solution that allows smooth rendering on (older) mobile phones, too
jakmeier

jakmeier

game design
0

This issue tracks the general idea of civilization perks and how they are used to shape each player's civilizations

Civilization perks are an option for the players to guide their Paddler's religion. At several stages in the game, the player will have to chose one of several offered perks. Each perk grants an ability or bonus. They become available over the course of the game. The order in which they appear and against which others they are presented for selection depends on previous choices. For example, if a player takes many architecture specializations, more architecture perks will become available sooner. On the technical side, the story line progression determines how they become available.

Perks are displayed similar to a skill-tree with all locked and unlocked perks being displayed. But there is no obvious connection between them and players are oblivious on how to get the a specific perk. If a perk is not chosen once, it may or may not become available again later.

There are three general directions in which a civilization can develop. Perks should fall in one of these categories. Each of them incentivises a different play-style.

  • Architecture and village enhancements (City-builder, high follower numbers)
  • Humanism (Collaborative with other players, focused on high happiness of Paddlers in and out of the players town )
  • Individualism (A few highly productive Paddler heroes and additional workers)
jakmeier

jakmeier

feature
0

Idea and Motivation

Right now, no negative impact is observed when visitors go through unhappy. Some kind of bonus could be granted when all visitors were happy for the last day (week / ...).

Dependencies

#26 is a prerequisite.

Open questions

  • What is the bonus?
  • Where to display the counter for how long all visitors were happy?
jakmeier

jakmeier

game-master
0

Implement a counter / timestamp per village that takes note of the last time a hobo left the town unhappy. This counter should be accessible on the GraphQL interface.

jakmeier

jakmeier

feature
0

Idea

Hobos (= non-working Paddlers that can be invited by others) should have their own personalities which players can explore and adapt their strategies accordingly. Players should think carefully about which hobos to invite and feel inclined to look around many villages before deciding.

Implementation ideas

  • When looking at hobos, they will display some information about themselves.
  • Hobos have attributes / preferences which can affect:
    • the effectiveness of decoration and other means to impress visitors
    • the reward granted when they leave happily
    • (more ideas bound to appear in the future)

Dependencies

This feature would heavily benefit from #24 being completed. Otherwise there is no choice necessary and players will just invite every hobo they see without studying their personalities.

jakmeier

jakmeier

good first issue
0

Description

Add a button to the rewards view that collects all available rewards at once, instead of going though them one-by-one.

Implementation

The API structure already allows to collect multiple reports at once. To avoid changes in the backend, we should just reuse the same API call with an explicit list of report ids.

The button should be somewhere on the Mailbox view and maybe also linked to a hotkey binding but this is completely up to the implementer.

jakmeier

jakmeier

game design
0

In v0.1.3, there is a large number of visitors being generated even when the player is offline. This has two main disadvantages

  • Being online and active has not much of an impact on the player's score
  • A huge number of rewards is pilled up when a player is inactive

To solve this, some balancing should be put in place and tested in future releases.

jakmeier

jakmeier

frontend
0

Description

Many UI elements are still in the first prototype version, which have been the least-effort implementation to display something on the screen. The goal of this issue is to make the UI look better.

This is an umbrella issue to track the general state of Paddlers's UI. Where necessary, sub-issues should be created to track the individual improvements.

List of poor UI visuals

  • Table UI buttons
  • Tab selection in visitor view
  • Thank you letters
  • Text scaling to smaller resolutions
  • (more to be added)

Image samples

  • Table UI buttons 83968047-45694180-a8be-11ea-942a-028cfa4cbb69.png

  • Tab selection in visitor view 83968109-cb858800-a8be-11ea-9f45-c6e977f68b32.png

  • Thank you letters 83968115-d9d3a400-a8be-11ea-9dfd-3376164b33c9.png

  • Text scaling to smaller resolutions 83968150-0d163300-a8bf-11ea-958d-373c6bf00ef3.png

  • (more to be added)

jakmeier

jakmeier

help wanted
0

At some point, we would need a Paddlers wiki to give an overview of the increasingly complex game features.

The content could be shared in parts with in-game help texts (#15) and maybe some tables can be generated, such as what building becomes available under which conditions.

Before anything else, we must decide on a platform for hosting the wiki.

jakmeier

jakmeier

frontend
0

This issue is part of #13 which tries to help new players getting started.

Goals

There should be an easy and obvious way for players to get more information about the objects they see. For example, they should be able to read about Ambiance and its effect. Or they should find an explanation about what trees are useful for. Basically, everything that has a sprite should be considered a candidate.

Implementation Steps

  • Write texts to be displayed
  • Create a struct (probably a SPECS component) which holds helper information and can be drawn on screen
  • Introduce a way to open the helper text on any object (Possible ideas: a global ? button followed by object selection, hover-info after few seconds of hovering, key-bindings, ...)

These steps can be done out-of-order.

jakmeier

jakmeier

frontend
0

This issue is part of #13 and tracks the implementation of tutorial stages for features available in version 0.1.3. Other features which are added after version 0.1.3 should be tracked in a different issue.

There are many steps left through which a new player should be guided. Right now, the most important steps which are missing are:

  • Collect rewards from letters
  • Building construction
    • Flowers
    • Trees
    • Economy buildings
  • Observing other villages
  • Sending invitations to Paddlers in other villages
  • Level up the hero
jakmeier

jakmeier

frontend
0

Current Situation

An enum called StoryState tracks the general progress of each player. This is already used to guide a player to build a temple and then welcome the first visitor.

Other than that, there is not much of tutorial for new players.

Goal

Eventually, a new player should be guided through all game features one-by-one. Furthermore, resources to help the player learn about aspects of the game should be available, ideally inside the game with different help-texts right next to the features, as well as outside the game through an external wiki.

Implementation

This is a big task and will require several sub-issues to be implemented.

  • #14
  • #15
  • #16
  • #17
jakmeier

jakmeier

frontend
0

Current situation

Several places in the game display text to the user, most importantly the dialogue section. The texts are already read from a MO file which is generated from a PO file. However, there is currently no way of selecting another language other than the default (English).

Goal

There should be a way for the user to select a language. This could be done either when logging in (Keycloak already has a language selection and many translations for the login screen) or later in the game.

jakmeier

jakmeier

help wanted
0

Context

After a visitor group leaves a town, it will send a thank you letter and that includes a reward which can be collected. These letters are usually called reports in the code. At the moment, the texts for the letters are picked in the frontend, based on the report id, from a static list of possible texts.

Screenshot_2020-05-19 Paddlers Mails

Goal

The letter texts should be more diverse and generally more interesting for the players to read. Probably, we will want to eventually generate a new text for each report, store it in the database and display that instead of a static text. But before implementing any of that, there should be a model for how the texts are generated.

Possible ideas to make texts more interesting:

  • Use information of village, such as what kind of flowers there are, and integrate it in generated text. (E.g. "Lovely how the blue flowers are blooming!")
  • Include time information ("Nice to meet you this morning")
  • Add some unexpected comments in the letters every now and then to keep it interesting to read. ("Smells weird in your town", "We have a worm dinner tonight, are you coming as well?")
  • ...

Implementation Advice

This could be done in different ways and it will probably be a bit of an experiment to see what works best.

It should be kept in mind that the game is available in multiple languages and that it should be possible to generate the texts in all of them. But having it just in one language would be a great start. We can worry about other languages later.

My first idea was to use a list of keywords that are selected based on the specific visitor and town. (E.g. "blue flower", "morning", "happy") Using those keywords, a full sentence could be generated either using some simple concatenation or even with some natural language processing utility. Since the sentences will most likely be formed on the server anyway, the options are quite large.

Relevant Code Sections

Letter text selection in the frontend: reports.rs

jakmeier

jakmeier

good first issue
0

Current Situation

AI villages have some buildings generated when they are created, starting with version 0.1.3. With the first PoC implemented in aa7610b010ab09488b3584f97368c2f007916f44, some trees are generated with some nests.

Goal

There are several options how the generated villages could become more interesting. There could certainly be more diverse buildings and there is also room for improvement when it comes to placing them aesthetically. Your creativity is very much welcome!

Relevant Code Sections

village_creation.rs::{add_anarchists_village, add_random_forest_to_village}

Screenshots

Example of generated trees Screenshot_2020-05-19 Paddlers Example of generated nests Screenshot_2020-05-20 Paddlers

jakmeier

jakmeier

help wanted
0

A fundamental principle of Paddlers is that the game should favor cooperative and constructive strategies over selfish and destructive play-styles. The common good should be important to players not only for moral reasons but also because they can personally profit from it.

This can be in contrast to other strategy games where players can "raid" each other to gain some resources. In other games, the destruction of other players base is often the highest goal. Because Paddlers follows a different theme, these kind of mechanics cannot be applied directly.

As an example, instead of enabling exploitation of weak players, strong players should be incentivized to help weaker players to improve their situation. As another example, anti-social behavior should never give players an advantage in the long-run.

Open game design questions

There are a couple of open questions how this game design can reasonably be implemented.

  1. How can be ensured that a cooperative strategy works better than selfish ones?
  2. Should there be competition between players? What kind of competition?
  3. What is the final goal of a player? Is there a win condition?
  4. How can players learn quickly that the cooperative strategy is the best?

Possible answers

  1. TODO: Create game-theoretical model
  2. General progress and score can be a kind of peaceful competition between players.
  3. TODO
  4. Add features that allow players to punish other players when they don't cooperate.

Features

Implemented

nothing yet :(

Not implemented

  • Players can invite Paddlers from other players' towns. Depending on the development of the Paddler's origin town, the rewards will be greater. (Promotes helping other players grow)
  • A player can block other players from inviting Paddlers from his/her town. (Allows punishing anti-social behavior)
  • Define a few regional development indexes, such as air quality, economic status, and preservation of nature. Depending on those indexes, the player should have some benefits. Each town in the region influences these indexes. (Promotes helping neighbors) To maximize the indexes, different players should focus on different aspects. (Promotes cooperation)

...more to be added

jakmeier

jakmeier

game design
0

Right now, there is not a lot a player can do per play session. Besides a general lack of content, this is also due to the slow pace of the game, which is designed to be played out over many weeks.

When adding new features, it should be a priority to make sure there is more fun and impactful actions a player can do per session. A good milestone would be to have 10 min high-impact playtime per day that can be done in a single session. Beyond that, there should be more secondary things to do with a smaller impact on the game. (To keep the game accessible for people without much time)

This issue tracks the features which directly increase the playtime per session.

List of implemented features supporting this

  • Mana and abilities on hero units: Each hero has a self-regenerating mana pool. This can be used to execute the welcome-ability which makes a single visitor feel better. Using this ability on the right visitors can have a big impact and increases the playtime per day depending on the flexible mana regeneration rate.
  • Reports and reward collection: When a visitor grants a reward, it sends a letter to the player who needs to open the letter and collect the reward. This is a very blunt time-killer from a game mechanical point of view but reward collection always feels satisfying and the theme with the letters has great potential.

List of ideas to implement

  • Look at other players towns
  • Invite Paddlers from other towns
  • Diplomacy with other players
  • More hero abilities
jakmeier

jakmeier

game-master
0

Moving to actix-web 2.. and actix 0.9.* would be nice.

This would probably require to update the futures dependency, too, which is on the road-map anyway. Updating actix is probably the first step towards a cleaner API utilizing async and await.

Current dependencies:

jakmeier

jakmeier

game-master
0

When the game-master processes a new task for a Paddler-worker, or when the satisfaction level of a visitor is computed, the entire village state with all buildings needs to be loaded from the database. More use cases are likely to come up over time.

Current Situation

The function load_village defined in town_view.rs loads all buildings at once. This function is called from different places in the code, simply once in each function that requires this state.

Performance Considerations

Loading all the per-village data causes a series of SQL queries to the game database. This is likely to be performance relevant if there is a sizable number of players registered.

This is not a critical issue right now but it should be kept in mind. If server costs start to increase in the future, this might be one of the points to investigate.

Options for Improvement

It might be useful to have a dedicated actor which handles processing that requires the full village state. The actor could then keep some village states cached in memory. This would allow to process some requests without hitting the DB quite as many times. It is especially promising if players trigger multiple requests within a short period of time.

Different instances of the actors could handle different village ids, which would allow scaling the approach efficiently if necessary.

Status

This issue currently has no priority. No investigation has been done so far and it remains unclear how much performance could be gained, if any.

Information - Updated May 13, 2022

Stars: 50
Forks: 4
Issues: 22

maomi: A rust wasm framework for building pages with components

maomi is a MVVM-like framework for web development

maomi: A rust wasm framework for building pages with components

Rust / Wasm client web app framework

Pull requests which improve test coverage are also very welcome

Rust / Wasm client web app framework

A Rust/WASM Library to interact with Bitcoin SV

npm i bsv-wasm-bundler --save

A Rust/WASM Library to interact with Bitcoin SV

WASM / Rust / D3 example

Fetch data with Rust + WASM and show it with JS + D3

WASM / Rust / D3 example

@texhno-rust-wasm-game-of-life

A template for kick starting a Rust and WebAssembly project using Tutorial

@texhno-rust-wasm-game-of-life

rust wasm worker hello world

Built using the template at which

rust wasm worker hello world

👷‍♀️🦀🕸️ rustwasm-worker-template

A template for kick starting a Cloudflare worker project using

👷‍♀️🦀🕸️ rustwasm-worker-template

Build tool for deploying Rust WASM repositories to Screeps game servers

Build tool for deploying Rust WASM repositories to cargo-web, adding the ability to trim node

Build tool for deploying Rust WASM repositories to Screeps game servers

Rust WASM Web Worker Examples

This repository contains four different examples of using web workers in conjunction with WASM in

Rust WASM Web Worker Examples
Facebook Instagram Twitter GitHub Dribbble
Privacy