A relaxing, loop-based gardening game where players claim plots, plant seeds, grow crops, and harvest them to earn rewards. This interactive social experience allows players to visit each other's gardens, decorate their plots, and create a thriving community of gardeners.
- Plot Management: Claim and manage your own 4x4 garden plot in the world.
- Seed Variety: Access a diverse collection of seeds with different growth times, rewards, and rarity levels.
- Real-time Growth: Plants grow in real-time with multiple visual growth stages.
- Watering System: Water your plants to keep them healthy and growing.
- Harvest Rewards: Harvest mature crops to earn coins based on plant type and rarity.
- In-game Economy: Use earned coins to purchase new seeds and decorative items.
- Garden Visiting: Visit other players' gardens to see their designs and progress.
- Plot Teleportation: Quickly teleport to your plot from anywhere in the world.
- Owner Recognition: Each plot and plant shows the owner's name for recognition.
- Decorative Items: Purchase and place a variety of decorative items to personalize your garden.
- Item Categories: Various decoration types including animals, garden accessories, and more.
- Rarity Levels: Common, Uncommon, and Rare items with corresponding coin costs.
- Plot Management: Admins can clear individual plots or all plots in a world.
The app uses the following unique name patterns for managing dropped assets:
| Unique Name Pattern | Description |
|---|---|
GrowTogether_plot |
View/Open Garden sign assets (key assets) |
GrowTogether_crop_{profileId} |
Crop assets planted by users |
GrowTogether_decoration_{profileId} |
Decoration assets placed by users |
GrowTogether_ownerText_{profileId} |
Owner name text displayed on plots |
The app uses a combination of data objects, dropped assets, and interactive elements to create a persistent garden experience.
We use data objects to store information about each implementation of the app per world.
The data object attached to the world stores ownership information about all plots in the world.
{
plots: {
[plotAssetId: string]: string | null; // profileId of owner or null if unclaimed
};
};The data objects attached to the dropped plot assets store information related to each specific plot.
{
ownerId?: string; // profileId of the owner
ownerName?: string; // displayName of the owner
claimedDate?: string; // ISO date string when the plot was claimed
};The data objects attached to the dropped crop assets store information related to each specific crop.
{
ownerId: string; // profileId of the owner
ownerName: string; // displayName of the owner
dateDropped: string; // When the crop was planted
lastWatered: string; // When the crop was last watered
seedId: string; // ID of the seed that was planted
growLevel: number; // Current growth level (0-10)
squareId: number; // Which square in the plot (0-15)
}The data objects attached to the dropped decoration assets.
{
decorationId: string; // ID of the decoration
ownerId?: string; // profileId of the owner
ownerName?: string; // displayName of the owner
dateDropped: string; // When the decoration was placed
squareId: number; // Which square in the plot (0-15)
}The data object attached to the visitor stores ecosystem information for each visitor as well as plot ownership information per world keyed by urlSlug.
{
lastDateCoinsEarned: string; // ISO date string when coins were last earned
totalCoinsEarned: number; // Lifetime coins earned (for unlocks)
worlds: {
plotAssetId: string | null;
claimedDate: string;
plotSquares: {
[squareId: number]: string | null; // droppedAssetId of crop or null if empty
};
crops: {
[droppedAssetId: string]: CropDataObjectType;
};
decorations: {
[droppedAssetId: string]: PlacedDecorationDataObjectType;
};
};
};The application exposes the following API endpoints:
GET /game-state- Get the current game state for a visitor
POST /admin/clear-plot- Clear a specific plot (admin only)POST /admin/clear-all-plots- Clear all plots in the world (admin only)
POST /plot/claim- Claim ownership of a plotPOST /plot/teleport- Teleport to a plotPOST /plot/view- Open plot iframe viewPOST /square/view- Open plot square iframe viewGET /square- Get information about a specific plot square
POST /seed/purchase- Purchase a seedPOST /crop/drop- Plant a seed in a plot squarePOST /crop/water- Water a growing cropPOST /crop/harvest- Harvest a fully grown cropPOST /crop/remove- Remove a crop from a plot
POST /decoration/purchase- Purchase a decorationPOST /decoration/drop- Place a decoration in a plot squarePOST /decoration/remove- Remove a decoration from a plot
Create a .env file in the root directory. See .env-example for a template.
| Variable | Description | Required |
|---|---|---|
NODE_ENV |
Node environment | No |
SKIP_PREFLIGHT_CHECK |
Skip CRA preflight check | No |
INSTANCE_DOMAIN |
Topia API domain (api.topia.io for production, api-stage.topia.io for staging) |
Yes |
INTERACTIVE_KEY |
Topia interactive app key | Yes |
INTERACTIVE_SECRET |
Topia interactive app secret | Yes |
- Clone the repository and install dependencies
git clone https://github.com/metaversecloud-com/sdk-grow-together.git
cd sdk-bounty-builder
npm install- Install server dependencies
cd server
npm install
cd ..- Install client dependencies
cd client
npm install
cd ..-
Configure environment variables
See Environment Variables above.