Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ardent Andromedas #1

Open
wants to merge 79 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
20218fb
Initial commit
Stovoy Jul 16, 2024
f9a6c97
Basic visualization prototype.
Stovoy Jul 20, 2024
5dfff0b
Add basic frog.
Stovoy Jul 20, 2024
03538c4
Add controls.
Stovoy Jul 20, 2024
ecfedc0
Add snake.
Stovoy Jul 20, 2024
f251510
Add adorable birds
Stovoy Jul 20, 2024
3550d28
Add gif generation and Poetry
Stovoy Jul 20, 2024
2ab025c
Make the frogs smile
Stovoy Jul 20, 2024
17d54b6
discord.py integration template
Jaavv Jul 20, 2024
eba1452
Properly set up poetry & ruff.
Stovoy Jul 20, 2024
cc63f8b
Properly set up poetry & ruff.
Stovoy Jul 20, 2024
e36296c
discord.py integration template
Jaavv Jul 20, 2024
062c870
Small refactor.
Stovoy Jul 20, 2024
6667612
Merge branch 'discordpy-integration'
Stovoy Jul 20, 2024
64fbf08
dirname fix; added reaction and message event tamplate
Jaavv Jul 20, 2024
1e96b53
Merge remote-tracking branch 'origin/discordpy-integration' into disc…
Jaavv Jul 20, 2024
82e8894
Merge branch 'discordpy-integration'
Stovoy Jul 20, 2024
ee25ba7
Remove unneeded context menu command.
Stovoy Jul 20, 2024
0d4763f
Discord GIF integration
Stovoy Jul 20, 2024
e60d10d
Optimize and fix GIF generation. Use Carousel approach to deal with d…
Stovoy Jul 21, 2024
743421f
added typing event method
Jaavv Jul 22, 2024
cbdf828
Fix print (f-string)
Stovoy Jul 22, 2024
a2d2ec2
Add annotations throughout the codebase.
Stovoy Jul 22, 2024
d72ed39
Add better dev scripts.
Stovoy Jul 22, 2024
9112ba7
Rename discord test to test.
Stovoy Jul 22, 2024
bf5316d
Move SharedNumpyArray to a separate file.
Stovoy Jul 22, 2024
bcd0cb5
Fix gif generation mode.
Stovoy Jul 22, 2024
316c7d2
Fix test bot.
Stovoy Jul 22, 2024
cd95af6
Fix cleanup, discord event, ProcessEvent call.
Stovoy Jul 22, 2024
71911f1
Link discord events to ecosystem.
Stovoy Jul 22, 2024
6b3bcfb
added token_array
Walkercito Jul 22, 2024
d02e664
Add annotations to data gen.
Stovoy Jul 22, 2024
becb87f
Add docstrings everywhere.
Stovoy Jul 22, 2024
332f307
Added pydantic package
Jaavv Jul 23, 2024
f5cd693
Threads (WIP)
Stovoy Jul 24, 2024
1c09f61
Get threads mostly working.
Stovoy Jul 24, 2024
a3e8992
Add ground gradient.
Stovoy Jul 24, 2024
8568c00
Added aiosqlite package
Jaavv Jul 24, 2024
73e171f
Fix lint issues.
Stovoy Jul 25, 2024
b99b6a9
Merge branch 'stovoy/threads'
Stovoy Jul 25, 2024
1a8fa3e
jumping critter implementation
Jaavv Jul 22, 2024
0ffd2d1
ecosystem critter fixes
Jaavv Jul 22, 2024
d5b0314
Added optional Message Object attributes
Jaavv Jul 25, 2024
176d637
Initial SQLite implementation with a basic insert event query
Jaavv Jul 25, 2024
8a50c99
Initial DB implementation to app client
Jaavv Jul 25, 2024
5c92455
naming refactor
Jaavv Jul 25, 2024
0138a23
Fix merge issues.
Stovoy Jul 25, 2024
c62619e
SQL Query fixes
Jaavv Jul 25, 2024
fa33e6b
DB initialization fix
Jaavv Jul 25, 2024
69c0bf8
Use abstract critter class.
Stovoy Jul 26, 2024
e037b92
Add clouds assets.
Stovoy Jul 26, 2024
5e74fb6
Fix clouds in thread mode.
Stovoy Jul 26, 2024
8e334e5
DB Path added
Jaavv Jul 26, 2024
65080ce
test DB Path added
Jaavv Jul 26, 2024
d150b95
Merge branch 'db-implementation'
Stovoy Jul 26, 2024
f14173e
Fix lint.
Stovoy Jul 27, 2024
20d58a3
Fix run commands.
Stovoy Jul 27, 2024
6d3fbff
Configuration basics / multi-guild support.
Stovoy Jul 27, 2024
0ba5231
Move models into storage.
Stovoy Jul 27, 2024
6ab1986
Implement persistent storage of guild configuration
Stovoy Jul 27, 2024
4adbf28
Refactor bot configuration and improve ecosystem management
Stovoy Jul 27, 2024
da7c3bc
Add word cloud feature and improve ecosystem management
Stovoy Jul 28, 2024
0561685
Add speech bubbles and simulate random messages
Stovoy Jul 28, 2024
30e2d52
Simplify speech bubble design and rendering
Stovoy Jul 28, 2024
c5272dc
Fix scripts.
Stovoy Jul 28, 2024
ce59d0a
Filter out self-events.
Stovoy Jul 28, 2024
7385cef
Add UserInfo
Stovoy Jul 28, 2024
8b87aa0
Embed avatar images.
Stovoy Jul 28, 2024
7b553f9
Reenable other critters.
Stovoy Jul 28, 2024
70a07c6
Set real history for word cloud.
Stovoy Jul 28, 2024
504131f
Fix a couple issues.
Stovoy Jul 28, 2024
a057a8e
Remove unused DB code
Stovoy Jul 28, 2024
bf7d234
Add support for custom emojis in reactions.
Stovoy Jul 28, 2024
4a34748
Add journal file to gitignore.
Stovoy Jul 28, 2024
9d7c668
Remove online members code for now.
Stovoy Jul 28, 2024
52eeabb
Add presentation README.
Stovoy Aug 1, 2024
7a0e990
Add future roadmap.
Stovoy Aug 1, 2024
aa38b25
Small README fix.
Stovoy Aug 1, 2024
3e355d5
Add 'ardent-andromedas/' from commit 'aa38b25d806d6b33aea972f2ccbc452…
janine9vn Aug 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions ardent-andromedas/.github/workflows/lint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# GitHub Action workflow enforcing our code style.

name: Lint

# Trigger the workflow on both push (to the main repository, on the main branch)
# and pull requests (against the main repository, but from any repo, from any branch).
on:
push:
branches:
- main
pull_request:

# Brand new concurrency setting! This ensures that not more than one run can be triggered for the same commit.
# It is useful for pull requests coming from the main repository since both triggers will match.
concurrency: lint-${{ github.sha }}

jobs:
lint:
runs-on: ubuntu-latest

env:
# The Python version your project uses. Feel free to change this if required.
PYTHON_VERSION: "3.12"

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Run pre-commit hooks
uses: pre-commit/[email protected]
39 changes: 39 additions & 0 deletions ardent-andromedas/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Files generated by the interpreter
__pycache__/
*.py[cod]

# Environment specific
.venv
venv
.env
env

# Unittest reports
.coverage*

# Logs
*.log

# PyEnv version selector
.python-version

# Built objects
*.so
dist/
build/

# IDEs
# PyCharm
.idea/
# VSCode
.vscode/
# MacOS
.DS_Store

ecosystem_gifs/

# Temporary gitignore for DB testing
src/bot/db/test

*.sqlite3
*.sqlite3-journal
18 changes: 18 additions & 0 deletions ardent-andromedas/.pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Pre-commit configuration.
# See https://github.com/python-discord/code-jam-template/tree/main#pre-commit-run-linting-before-committing

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: check-toml
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md]

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.5.0
hooks:
- id: ruff
- id: ruff-format
7 changes: 7 additions & 0 deletions ardent-andromedas/LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Copyright 2021 Python Discord

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
292 changes: 292 additions & 0 deletions ardent-andromedas/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,292 @@
# EcoCord: A Discord Ecosystem Simulator

![EcoCord Logo](assets/readme/logo.png)

Welcome to EcoCord, an innovative Discord bot that transforms your server's activity into a living, breathing ecosystem! Created for the Python Code Jam 2024 with the theme of "Information Overload," EcoCord turns the constant stream of messages, reactions, and user interactions into a vibrant, visual representation of your community's digital life.

## What is EcoCord?

EcoCord is a unique Discord bot that creates a dynamic ecosystem based on your server's activity. It visualizes user interactions as various creatures in a simulated environment, bringing your community to life in a whole new way!

![EcoCord in Action](assets/readme/demo.gif)

### Key Features:

- **Real-time Ecosystem Visualization**: Watch as your server's activity is transformed into a lively ecosystem with birds, snakes, and frogs representing active users.
- **Activity-based Interactions**: The more active your server, the more vibrant and diverse the ecosystem becomes!
- **User Avatars**: See your community members represented as cute critters with their own avatars.
- **Word Clouds**: Popular topics and frequently used words appear as dynamic word clouds in the sky.
- **Reaction Emojis**: Watch as reaction emojis float across the screen, adding extra flair to your ecosystem.
- **GIF Generation**: Automatically generate and share GIFs of your server's ecosystem in action.

## How It Works

EcoCord listens to various events in your Discord server:

1. **Messages**: Each message spawns or activates a critter in the ecosystem.
2. **Reactions**: Emojis used in reactions appear and animate in the environment.
3. **Typing**: Users typing are represented by their critters becoming more active.

As these events occur, the ecosystem evolves:

- Critters move around, interact, and respond to the overall activity level.
- Word clouds form and dissipate based on message content.

### Critter Types

EcoCord features three main types of critters, each with unique behaviors and representations:

1. **Birds**:
- Fly smoothly across the sky
- Change direction randomly
- Flap their wings as they move

2. **Snakes**:
- Slither along the ground
- Move in a sinusoidal pattern
- Grow longer as they become more active

3. **Frogs**:
- Hop around the lower part of the ecosystem
- Have distinct rest and jump states
- Scale in size based on their vertical position

Each critter type is designed to represent different aspects of user activity and add variety to the ecosystem visualization.

## Technical Challenges

EcoCord overcomes several technical challenges to create a seamless and engaging experience:

1. **GIF Generation and Multithreading**:
- Utilizes a separate process for GIF generation to avoid blocking the main application
- Implements a shared memory approach using `multiprocessing.Array` for efficient frame sharing between processes
- Manages concurrent access to shared resources with locks and queues
- Generates GIFs in under 1s on typical hardware

2. **SQLite Database Integration**:
- Uses `aiosqlite` for asynchronous database operations
- Stores and retrieves guild configurations and user information

3. **Efficient Rendering with Pygame**:
- Optimizes drawing operations to handle multiple moving entities
- Implements custom drawing algorithms for each critter type
- Manages transparency and layering for complex visual effects
- Parallax scrolling of background clouds to add depth to the ecosystem

4. **Discord API Integration**:
- Handles real-time events from Discord using `discord.py`
- Manages rate limits and connection issues gracefully
- Implements command handling and permission checks for bot configuration

5. **Dynamic Word Cloud Generation**:
- Processes message content in real-time to extract relevant words
- Generates and updates word clouds based on frequently used terms
- Integrates word clouds seamlessly into the ecosystem visualization with masking

6. **Avatar Integration and Image Processing**:
- Fetches and processes user avatars from Discord
- Applies masks and transformations to integrate avatars with critter designs
- Handles various image formats and sizes efficiently

These technical solutions work together to create a responsive, visually appealing, and interactive ecosystem that accurately represents the activity in your Discord server.

## Connection to the Theme: Information Overload

EcoCord tackles the theme of "Information Overload" by:

1. **Visualizing Data**: Transforming the overwhelming stream of Discord messages and events into a visually appealing and easily digestible format.
2. **Aggregating Information**: Combining multiple data points (messages, reactions, user activity) into a single, coherent representation.
3. **Dynamic Adaptation**: The ecosystem evolves based on the volume and type of information, providing a real-time view of server activity.
4. **Filtering and Focusing**: By representing users as critters and popular topics as word clouds, EcoCord helps users focus on key information amidst the noise.

## Innovation Spotlight

EcoCord stands out in addressing "Information Overload" through its unique approach:

1. **Dynamic Visualization**: We transform raw data into an engaging, living ecosystem.
2. **Intelligent Aggregation**: Our algorithm combines multiple data points to create meaningful representations.
3. **Scalability**: EcoCord efficiently handles high-volume servers without performance degradation.

### Key Innovation: Efficient GIF Generation

Our multithreaded GIF generation process is a standout feature:

```python
@staticmethod
async def _gif_generation_process(
shared_frames: SharedNumpyArray,
current_frame_index: multiprocessing.Value,
frame_count_queue: multiprocessing.Queue,
gif_info_queue: multiprocessing.Queue,
fps: int,
) -> None:
frames = shared_frames.get_array()

with ThreadPoolExecutor() as executor:
while True:
frame_count = frame_count_queue.get()
if frame_count is None:
break

start_index = current_frame_index.value
ordered_frames = np.roll(frames, -start_index, axis=0)

frames = list(executor.map(Image.fromarray, ordered_frames))

duration = int(1000 / fps)

with io.BytesIO() as gif_buffer:
optimized_frames[0].save(
gif_buffer,
format="GIF",
save_all=True,
append_images=frames[1:],
optimize=False,
duration=[duration] * (len(frames)),
loop=0,
)

gif_data = gif_buffer.getvalue()

gif_info_queue.put((gif_data, time.time()))
```

This approach allows us to generate high-quality GIFs efficiently, even for servers with thousands of messages per minute. Key features include:

1. Asynchronous processing using `asyncio`
2. Shared memory for frame data using `SharedNumpyArray`
3. Multithreading for frame optimization
4. Efficient frame ordering and GIF creation

## Getting Started

### Prerequisites

- Python 3.12
- Poetry (for dependency management)
- A Discord Bot Token

### Installation

1. Clone the repository:
```
git clone https://github.com/ardent-andromedas/python-code-jam-2024.git
cd ecocord
```

2. Install dependencies using Poetry:
```
poetry install
```

3. Set up your environment variables:
Create a `.env` file in the project root and add your Discord bot token:
```
BOT_TOKEN=<YOUR BOT TOKEN>
```

### Running EcoCord

1. Start the bot:
```
poetry run run
```

2. Invite the bot to your Discord server using the OAuth2 URL generated for your bot in the Discord Developer Portal.

The bot should be configured for a Guild Install, with the `applications.commands` and `bot` scopes, and `Attach Files`, `Create Public Threads`, `Embed Links`, `Read Message History`, `Send Messages`, `Send Messages in Threads`, `Use Slash Commands`, and `View Channels` permissions.

3. Use the `/configure` command in your server to set up the channels where EcoCord will operate.


## Configuration

To set up EcoCord in your server, use the `/configure` command. This command allows you to specify which channels the bot should monitor and where it should post ecosystem GIFs.

![Configure Command](assets/readme/configure.png)

The configuration options include:

- **Ecosystem Channel**: The channel where EcoCord will monitor activity and generate the ecosystem.
- **GIF Channel**: The channel where EcoCord will post generated GIFs of the ecosystem.

After running the `/configure` command, follow the prompts to select the appropriate channels. EcoCord will then start monitoring the specified ecosystem channel and post GIFs in the designated GIF channel.


## Usage

Once EcoCord is running in your server, it will automatically start creating and updating the ecosystem based on server activity. Here are some key commands and features:

- `/configure`: Set up the channels where EcoCord will operate and where GIFs will be posted.
- Activity Visualization: Watch the ecosystem change in real-time as your server becomes more or less active.
- GIF Generation: Periodically, EcoCord will generate and post GIFs of the ecosystem in threads in the designated channel.

## Contributing

We welcome contributions to EcoCord! If you have ideas for new features, improvements, or bug fixes, please feel free to:

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request

## Acknowledgments

- Thanks to the Python Discord community for organizing the Python Code Jam 2024
- Shoutout to all the contributors who helped bring EcoCord to life
- Special thanks to the creators of the wonderful libraries used in this project, including Discord.py, Pygame, and Pillow

### Our team

All team members contributed to the initial project planning and ideation. Special thanks to:

[Stovoy](https://github.com/Stovoy)
* Project lead and primary developer
* Conceived the ecosystem concept and implemented the core functionality
* Contributed the majority of the codebase

[Jaavv](https://github.com/Jaavv)
* Contributed to early development stages
* Implemented initial versions of the Discord bot and SQLite integration

[Walkercito](https://github.com/Walkercito)
* Provided valuable testing support
* Sourced the cloud assets used in the background from [Free Sky with Clouds Background Pixel Art Set](https://free-game-assets.itch.io/free-sky-with-clouds-background-pixel-art-set)

[ShadowDogger](https://github.com/ShadowDogger) and [Tinoy](https://github.com/tinoy-t)
* Participated in brainstorming sessions
* Offered insights and suggestions during the planning phase

While some initially planned features like backfilling, timelapses, and snapshotting were ultimately not implemented, the team's collaborative efforts in the early stages helped shape the project's direction and scope.

## Future Roadmap

While EcoCord already offers a unique and engaging experience, we have exciting plans for future enhancements:

1. **Historical Data and Timelapses**
- Implement backfilling of past activity data
- Add a user interaction to request timelapses of past server activity

2. **Enhanced Ecosystem Visuals**
- Introduce terrain deformation for a more dynamic environment
- Implement advanced procedural generation techniques
- Add more diverse critter types to represent different user behaviors
- Create multiple biomes and environments to reflect server themes or moods

3. **Increased Customization**
- Allow users to customize their critter appearances and behaviors
- Implement server-wide visual themes and customization options

4. **Activity-Based Evolution**
- Develop a more sophisticated system for ecosystem growth based on overall server activity levels
- Introduce ecosystem "events" triggered by specific server milestones or activities

5. **Expanded Event Reactions**
- Increase the range of Discord events that influence the ecosystem
- Add special items or phenomena that appear in response to unique server events

6. **Performance Optimizations**
- Continually improve rendering and processing efficiency to support larger, more active servers

We're excited to bring these features to life and further enhance the EcoCord experience.
Binary file added ardent-andromedas/assets/clouds/Clouds 1/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 1/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 1/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 1/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 2/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 2/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 2/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 2/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 3/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 3/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 3/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 3/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 4/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 4/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 4/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 4/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 5/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 5/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 5/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 5/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 5/5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 6/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 6/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 6/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 6/4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ardent-andromedas/assets/clouds/Clouds 6/5.png
Binary file added ardent-andromedas/assets/clouds/Clouds 6/6.png
Binary file added ardent-andromedas/assets/clouds/Clouds 7/1.png
Binary file added ardent-andromedas/assets/clouds/Clouds 7/2.png
Binary file added ardent-andromedas/assets/clouds/Clouds 7/3.png
Binary file added ardent-andromedas/assets/clouds/Clouds 7/4.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/1.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/2.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/3.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/4.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/5.png
Binary file added ardent-andromedas/assets/clouds/Clouds 8/6.png
Loading