From ce5d327ca2657179fa52776d241624a15710dea9 Mon Sep 17 00:00:00 2001 From: insects Date: Mon, 10 Mar 2025 22:25:45 +0100 Subject: [PATCH] feat: implement basic info display for anemos --- .idea/ecoffee.iml | 14 +- Gemfile | 31 +-- Gemfile.lock | 41 +--- app/assets/stylesheets/application.css | 92 ++++++- app/controllers/instance_controller.rb | 26 ++ app/controllers/page_controller.rb | 4 + app/helpers/instance_helper.rb | 2 + app/helpers/page_helper.rb | 2 + app/javascript/save_password.js | 0 app/models/instance.rb | 3 + app/views/instance/_zone_img.html.erb | 9 + app/views/instance/show.html.erb | 40 +++ app/views/layouts/application.html.erb | 3 +- app/views/page/index.html.erb | 34 +++ config/initializers/data.rb | 5 + config/routes.rb | 10 +- data/anemos.toml | 232 ++++++++++++++++++ db/migrate/20250310183139_create_instances.rb | 12 + db/migrate/20250310183556_create_pops.rb | 10 + db/migrate/20250310183912_create_fairies.rb | 12 + db/schema.rb | 46 ++++ public/earth.png | Bin 0 -> 2412 bytes public/fire.png | Bin 0 -> 2100 bytes public/gales.png | Bin 0 -> 2461 bytes public/ice.png | Bin 0 -> 1963 bytes public/icon.png | Bin 4166 -> 13674 bytes public/icon.svg | 3 - public/lightning.png | Bin 0 -> 2227 bytes public/water.png | Bin 0 -> 2004 bytes public/wind.png | Bin 0 -> 1988 bytes test/controllers/instance_controller_test.rb | 13 + test/controllers/page_controller_test.rb | 8 + test/fixtures/instances.yml | 11 + test/models/instance_test.rb | 7 + 34 files changed, 582 insertions(+), 88 deletions(-) create mode 100644 app/controllers/instance_controller.rb create mode 100644 app/controllers/page_controller.rb create mode 100644 app/helpers/instance_helper.rb create mode 100644 app/helpers/page_helper.rb create mode 100644 app/javascript/save_password.js create mode 100644 app/models/instance.rb create mode 100644 app/views/instance/_zone_img.html.erb create mode 100644 app/views/instance/show.html.erb create mode 100644 app/views/page/index.html.erb create mode 100644 config/initializers/data.rb create mode 100644 data/anemos.toml create mode 100644 db/migrate/20250310183139_create_instances.rb create mode 100644 db/migrate/20250310183556_create_pops.rb create mode 100644 db/migrate/20250310183912_create_fairies.rb create mode 100644 db/schema.rb create mode 100644 public/earth.png create mode 100644 public/fire.png create mode 100644 public/gales.png create mode 100644 public/ice.png delete mode 100644 public/icon.svg create mode 100644 public/lightning.png create mode 100644 public/water.png create mode 100644 public/wind.png create mode 100644 test/controllers/instance_controller_test.rb create mode 100644 test/controllers/page_controller_test.rb create mode 100644 test/fixtures/instances.yml create mode 100644 test/models/instance_test.rb diff --git a/.idea/ecoffee.iml b/.idea/ecoffee.iml index 7c605fa..f6f7bd0 100644 --- a/.idea/ecoffee.iml +++ b/.idea/ecoffee.iml @@ -42,23 +42,22 @@ - + + - - @@ -69,7 +68,6 @@ - @@ -80,16 +78,13 @@ + - - - - @@ -127,12 +122,13 @@ - + + diff --git a/Gemfile b/Gemfile index a4ada41..198b7d8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,63 +1,38 @@ source "https://rubygems.org" -# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 8.0.1" -# The modern asset pipeline for Rails [https://github.com/rails/propshaft] gem "propshaft" -# Use postgresql as the database for Active Record gem "pg", "~> 1.1" -# Use the Puma web server [https://github.com/puma/puma] gem "puma", ">= 5.0" -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] gem "importmap-rails" -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] gem "turbo-rails" -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] gem "stimulus-rails" -# Build JSON APIs with ease [https://github.com/rails/jbuilder] gem "jbuilder" +gem "toml-rb" +gem "nanoid" +gem "spicy-proton" -# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] -# gem "bcrypt", "~> 3.1.7" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: %i[ windows jruby ] -# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable gem "solid_cache" gem "solid_queue" gem "solid_cable" -# Reduces boot times through caching; required in config/boot.rb gem "bootsnap", require: false -# Deploy this application anywhere as a Docker container [https://kamal-deploy.org] -gem "kamal", require: false - -# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/] gem "thruster", require: false -# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] -# gem "image_processing", "~> 1.2" - group :development, :test do - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem gem "debug", platforms: %i[ mri windows ], require: "debug/prelude" - - # Static analysis for security vulnerabilities [https://brakemanscanner.org/] gem "brakeman", require: false - - # Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/] gem "rubocop-rails-omakase", require: false end group :development do - # Use console on exceptions pages [https://github.com/rails/web-console] gem "web-console" end group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] gem "capybara" gem "selenium-webdriver" end diff --git a/Gemfile.lock b/Gemfile.lock index c0a83c7..5db998e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,11 +76,9 @@ GEM public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) base64 (0.2.0) - bcrypt_pbkdf (1.1.1) - bcrypt_pbkdf (1.1.1-arm64-darwin) - bcrypt_pbkdf (1.1.1-x86_64-darwin) benchmark (0.4.0) bigdecimal (3.1.9) + bindata (2.5.0) bindex (0.8.1) bootsnap (1.18.4) msgpack (~> 1.2) @@ -96,6 +94,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + citrus (3.0.2) concurrent-ruby (1.3.5) connection_pool (2.5.0) crass (1.0.6) @@ -103,9 +102,7 @@ GEM debug (1.10.0) irb (~> 1.10) reline (>= 0.3.8) - dotenv (3.1.7) drb (2.2.1) - ed25519 (1.3.0) erubi (1.13.1) et-orbi (1.2.11) tzinfo @@ -129,17 +126,6 @@ GEM actionview (>= 5.0.0) activesupport (>= 5.0.0) json (2.10.1) - kamal (2.5.3) - activesupport (>= 7.0) - base64 (~> 0.2) - bcrypt_pbkdf (~> 1.0) - concurrent-ruby (~> 1.2) - dotenv (~> 3.1) - ed25519 (~> 1.2) - net-ssh (~> 7.3) - sshkit (>= 1.23.0, < 2.0) - thor (~> 1.3) - zeitwerk (>= 2.6.18, < 3.0) language_server-protocol (3.17.0.4) lint_roller (1.1.0) logger (1.6.6) @@ -156,6 +142,7 @@ GEM mini_mime (1.1.5) minitest (5.25.4) msgpack (1.8.0) + nanoid (2.0.0) net-imap (0.5.6) date net-protocol @@ -163,13 +150,8 @@ GEM net-protocol net-protocol (0.2.2) timeout - net-scp (4.1.0) - net-ssh (>= 2.6.5, < 8.0.0) - net-sftp (4.0.0) - net-ssh (>= 5.0.0, < 8.0.0) net-smtp (0.5.1) net-protocol - net-ssh (7.3.0) nio4r (2.7.4) nokogiri (1.18.3-aarch64-linux-gnu) racc (~> 1.4) @@ -187,7 +169,6 @@ GEM racc (~> 1.4) nokogiri (1.18.3-x86_64-linux-musl) racc (~> 1.4) - ostruct (0.6.1) parallel (1.26.3) parser (3.3.7.1) ast (~> 2.4.1) @@ -306,13 +287,8 @@ GEM fugit (~> 1.11.0) railties (>= 7.1) thor (~> 1.3.1) - sshkit (1.24.0) - base64 - logger - net-scp (>= 1.1.2) - net-sftp (>= 2.1.2) - net-ssh (>= 2.8.0) - ostruct + spicy-proton (2.1.15) + bindata (~> 2.3) stimulus-rails (1.3.4) railties (>= 6.0.0) stringio (3.1.5) @@ -323,6 +299,9 @@ GEM thruster (0.1.12-x86_64-darwin) thruster (0.1.12-x86_64-linux) timeout (0.4.3) + toml-rb (3.0.1) + citrus (~> 3.0, > 3.0) + racc (~> 1.7) turbo-rails (2.0.13) actionpack (>= 7.1.0) railties (>= 7.1.0) @@ -366,7 +345,7 @@ DEPENDENCIES debug importmap-rails jbuilder - kamal + nanoid pg (~> 1.1) propshaft puma (>= 5.0) @@ -376,8 +355,10 @@ DEPENDENCIES solid_cable solid_cache solid_queue + spicy-proton stimulus-rails thruster + toml-rb turbo-rails tzinfo-data web-console diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index fe93333..e2dc060 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,10 +1,82 @@ -/* - * This is a manifest file that'll be compiled into application.css. - * - * With Propshaft, assets are served efficiently without preprocessing steps. You can still include - * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard - * cascading order, meaning styles declared later in the document or manifest will override earlier ones, - * depending on specificity. - * - * Consider organizing styles into separate files for maintainability. - */ +body { + font-family: sans-serif; + margin: 40px; +} + +header { + display: flex; + align-items: center; + gap: 3px; + margin-bottom: 10px; +} + +header h1 { + margin: 0; +} + +header .muted { + color: #666; + font-weight: normal; +} + +.new-buttons { + display: flex; + gap: 5px; +} + +.new-button { + padding: 10px; +} + +.nm-list { + +} + +.nm-list section { + margin-bottom: 5px; + display: grid; + grid-template-columns: .05fr 1fr 1fr .5fr; + align-items: center; + padding: 0 10px; + background-color: #eee; +} + +img { + vertical-align: middle; +} + +h3.nm-info { + margin: 0; + display: inline-block; +} + +.spawn-info { + display: inline-block; + font-size: 14px; + opacity: .6; +} + +.badge { + font-size: 12px; + font-weight: bold; + border: 1px solid black; + vertical-align: middle; + padding: 1px 6px; + border-radius: 10px; + font-family: monospace; +} + +small.badge { + font-size: 10px; +} + +button.action { + width: 100%; + height: 100%; +} + +section .meta { + padding-left: 10px; + padding-top: 4px; + padding-bottom: 4px; +} diff --git a/app/controllers/instance_controller.rb b/app/controllers/instance_controller.rb new file mode 100644 index 0000000..ae7cb55 --- /dev/null +++ b/app/controllers/instance_controller.rb @@ -0,0 +1,26 @@ +class InstanceController < ApplicationController + def create + zone = create_instance_params + public_id = Nanoid.generate(size: 6) + name = Spicy::Proton.pair(" ") + password = Nanoid.generate(size: 3, alphabet: "0123456789") + instance = Instance.new(zone: zone, public_id: public_id, name: name, password: password) + if instance.save + redirect_to(show_instance_path(public_id: public_id)) + end + end + + def show + @instance = Instance.find_by(public_id: show_instance_params) + end + + private + + def create_instance_params + params.expect(:zone) + end + + def show_instance_params + params.expect(:public_id) + end +end diff --git a/app/controllers/page_controller.rb b/app/controllers/page_controller.rb new file mode 100644 index 0000000..85ca14a --- /dev/null +++ b/app/controllers/page_controller.rb @@ -0,0 +1,4 @@ +class PageController < ApplicationController + def index + end +end diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb new file mode 100644 index 0000000..212ddac --- /dev/null +++ b/app/helpers/instance_helper.rb @@ -0,0 +1,2 @@ +module InstanceHelper +end diff --git a/app/helpers/page_helper.rb b/app/helpers/page_helper.rb new file mode 100644 index 0000000..625cfe4 --- /dev/null +++ b/app/helpers/page_helper.rb @@ -0,0 +1,2 @@ +module PageHelper +end diff --git a/app/javascript/save_password.js b/app/javascript/save_password.js new file mode 100644 index 0000000..e69de29 diff --git a/app/models/instance.rb b/app/models/instance.rb new file mode 100644 index 0000000..f77247f --- /dev/null +++ b/app/models/instance.rb @@ -0,0 +1,3 @@ +class Instance < ApplicationRecord + validates :zone, inclusion: { in: %w[anemos pagos pyros hydatos] } +end diff --git a/app/views/instance/_zone_img.html.erb b/app/views/instance/_zone_img.html.erb new file mode 100644 index 0000000..6b695b2 --- /dev/null +++ b/app/views/instance/_zone_img.html.erb @@ -0,0 +1,9 @@ +<% if zone == "anemos" %> + <%= title=<%= title %> /> +<% elsif zone == "pagos" %> + <%= title=<%= title %> /> +<% elsif zone == "pyros" %> + <%= title=<%= title %> /> +<% elsif zone == "hydatos" %> + <%= title=<%= title %> /> +<% end %> diff --git a/app/views/instance/show.html.erb b/app/views/instance/show.html.erb new file mode 100644 index 0000000..8250cf9 --- /dev/null +++ b/app/views/instance/show.html.erb @@ -0,0 +1,40 @@ +
+ eureka.coffee logo +

instance <%= @instance.name %>

+ <%= render partial: "zone_img", locals: { zone: @instance.zone, alt: @instance.zone, title: @instance.zone.upcase_first } %> +
+ +
+ <% APP_DATA[@instance.zone.to_sym][:nms].each do |nm| %> +
+
+ " alt="<%= nm[:element] %>" width="30" /> +
+
+

+ LV<%= nm[:level].to_s.rjust(2, "0") %> + <%= nm[:name] %> + <% if nm[:weather] %> + + <% end %> +

+
+ « + <%= nm[:spawned_by][:name] %> + <% if nm[:spawned_by][:night_only] %> + 🌙 + <% end %> + <% if nm[:spawned_by][:weather] %> + + <% end %> + LV<%= nm[:spawned_by][:level].to_s.rjust(2, "0") %> + +
+
+
+
+ +
+
+ <% end %> +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5063f8d..bd8792a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,7 +1,7 @@ - <%= content_for(:title) || "Ecoffee" %> + <%= content_for(:title) || "eureka.coffee" %> @@ -14,7 +14,6 @@ <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %> - <%# Includes all stylesheet files in app/assets/stylesheets %> diff --git a/app/views/page/index.html.erb b/app/views/page/index.html.erb new file mode 100644 index 0000000..7751ece --- /dev/null +++ b/app/views/page/index.html.erb @@ -0,0 +1,34 @@ +
+ eureka.coffee logo +

eureka.coffee

+
+ +
+ <%= form_tag "/new?zone=anemos", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=pagos", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=pyros", method: :post do %> + + <% end %> + + <%= form_tag "/new?zone=hydatos", method: :post do %> + + <% end %> +
diff --git a/config/initializers/data.rb b/config/initializers/data.rb new file mode 100644 index 0000000..e534c94 --- /dev/null +++ b/config/initializers/data.rb @@ -0,0 +1,5 @@ +anemos_data = TomlRB.load_file("./data/anemos.toml", symbolize_keys: true) + +APP_DATA = { + anemos: anemos_data +} diff --git a/config/routes.rb b/config/routes.rb index 48254e8..8def87a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,14 +1,12 @@ Rails.application.routes.draw do - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html + root "page#index" + + post "/new", to: "instance#create", as: :new_instance + get "/:public_id", to: "instance#show", as: :show_instance - # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. - # Can be used by load balancers and uptime monitors to verify that the app is live. get "up" => "rails/health#show", as: :rails_health_check # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb) # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker - - # Defines the root path route ("/") - # root "posts#index" end diff --git a/data/anemos.toml b/data/anemos.toml new file mode 100644 index 0000000..19dfaa8 --- /dev/null +++ b/data/anemos.toml @@ -0,0 +1,232 @@ +[[nms]] +name = "Sabotender Corrido" +level = 1 +element = "wind" +x = 14 +y = 22 + +[nms.spawned_by] +name = "Flowering Sabotender" +level = 6 + +[[nms]] +name = "The Lord of Anemos" +level = 2 +element = "water" +x = 30 +y = 27 +drops = "The Prince of Anemos (minion)" + +[nms.spawned_by] +name = "Sea Bishop" +level = 7 + +[[nms]] +name = "Teles" +level = 3 +element = "wind" +x = 26 +y = 28 + +[nms.spawned_by] +name = "Anemos Harpeia" +level = 8 + +[[nms]] +name = "The Emperor of Anemos" +level = 4 +element = "wind" +x = 17 +y = 22 +drops = "Emperor Hairpin" + +[nms.spawned_by] +name = "Darner" +level = 9 + +[[nms]] +name = "Callisto" +level = 5 +element = "earth" +x = 26 +y = 22 + +[nms.spawned_by] +name = "Val Bear" +level = 10 + +[[nms]] +name = "Number" +level = 6 +element = "lightning" +x = 24 +y = 23 + +[nms.spawned_by] +name = "Pneumaflayer" +level = 11 + +[[nms]] +name = "Jahannam" +level = 7 +element = "wind" +x = 18 +y = 19 + +[nms.spawned_by] +name = "Typhoon Sprite" +level = 12 +weather = "gales" + +[[nms]] +name = "Amemet" +level = 8 +element = "fire" +x = 15 +y = 16 + +[nms.spawned_by] +name = "Abraxas" +level = 13 + +[[nms]] +name = "Caym" +level = 9 +element = "ice" +x = 14 +y = 13 + +[nms.spawned_by] +name = "Stalker Ziz" +level = 14 + +[[nms]] +name = "Bombadeel" +level = 10 +element = "earth" +x = 28 +y = 20 + +[nms.spawned_by] +name = "Traveling Gourmand" +level = 15 +night_only = true + +[[nms]] +name = "Serket" +level = 11 +element = "earth" +x = 25 +y = 18 +drops = "Scorpion Harness, Wind-up Mithra" + +[nms.spawned_by] +name = "Khor Claw" +level = 16 + +[[nms]] +name = "Judgmental Julika" +level = 12 +element = "ice" +x = 22 +y = 16 + +[nms.spawned_by] +name = "Henbane" +level = 17 + +[[nms]] +name = "The White Rider" +level = 13 +element = "lightning" +x = 20 +y = 13 + +[nms.spawned_by] +name = "Duskfall Dullahan" +level = 18 +night_only = true + +[[nms]] +name = "Polyphemus" +level = 14 +element = "ice" +x = 26 +y = 14 + +[nms.spawned_by] +name = "Monoeye" +level = 19 + +[[nms]] +name = "Simurgh's Strider" +level = 15 +element = "wind" +x = 29 +y = 13 +drops = "Strider Boots" + +[nms.spawned_by] +name = "Old World Zu" +level = 20 + +[[nms]] +name = "King Hazmat" +level = 16 +element = "fire" +x = 35 +y = 18 + +[nms.spawned_by] +name = "Anemos Anala" +level = 21 + +[[nms]] +name = "Fafnir" +level = 17 +element = "fire" +x = 36 +y = 22 +drops = "Wind-up Fafnir" + +[nms.spawned_by] +name = "Fossil Dragon" +level = 22 +night_only = true + +[[nms]] +name = "Amarok" +level = 18 +element = "ice" +x = 8 +y = 18 + +[nms.spawned_by] +name = "Voidscale" +level = 23 + +[[nms]] +name = "Lamashtu" +level = 19 +element = "wind" +x = 8 +y = 23 + +[nms.spawned_by] +name = "Val Specter" +level = 24 +night_only = true + +[[nms]] +name = "Pazuzu" +level = 20 +element = "wind" +x = 7 +y = 22 +weather = "gales" +drops = "Altar to Pazuzu, Pazuzu (card)" + +[nms.spawned_by] +name = "Shadow Wraith" +night_only = true +level = 25 diff --git a/db/migrate/20250310183139_create_instances.rb b/db/migrate/20250310183139_create_instances.rb new file mode 100644 index 0000000..883ad6c --- /dev/null +++ b/db/migrate/20250310183139_create_instances.rb @@ -0,0 +1,12 @@ +class CreateInstances < ActiveRecord::Migration[8.0] + def change + create_table :instances do |t| + t.string :public_id + t.string :name + t.string :password + t.string :zone + + t.timestamps + end + end +end diff --git a/db/migrate/20250310183556_create_pops.rb b/db/migrate/20250310183556_create_pops.rb new file mode 100644 index 0000000..5e49bce --- /dev/null +++ b/db/migrate/20250310183556_create_pops.rb @@ -0,0 +1,10 @@ +class CreatePops < ActiveRecord::Migration[8.0] + def change + create_table :pops do |t| + t.string :name + t.references :instance, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20250310183912_create_fairies.rb b/db/migrate/20250310183912_create_fairies.rb new file mode 100644 index 0000000..2898677 --- /dev/null +++ b/db/migrate/20250310183912_create_fairies.rb @@ -0,0 +1,12 @@ +class CreateFairies < ActiveRecord::Migration[8.0] + def change + create_table :fairies do |t| + t.integer :location + t.boolean :is_despawned + t.boolean :is_suggested + t.references :instance, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..daf9152 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,46 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema[8.0].define(version: 2025_03_10_183912) do + # These are extensions that must be enabled in order to support this database + enable_extension "pg_catalog.plpgsql" + + create_table "fairies", force: :cascade do |t| + t.integer "location" + t.boolean "is_despawned" + t.boolean "is_suggested" + t.bigint "instance_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["instance_id"], name: "index_fairies_on_instance_id" + end + + create_table "instances", force: :cascade do |t| + t.string "public_id" + t.string "name" + t.string "password" + t.string "zone" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "pops", force: :cascade do |t| + t.string "name" + t.bigint "instance_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["instance_id"], name: "index_pops_on_instance_id" + end + + add_foreign_key "fairies", "instances" + add_foreign_key "pops", "instances" +end diff --git a/public/earth.png b/public/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..b20afe47df9c88086636edeee30da6e2b52164b2 GIT binary patch literal 2412 zcmV-y36u7TP)<>4BJv+i+7uaoG9>tU10>pPGzX|$KMCW8<9RgL3hV;*2K#_r!Pa05+a&tvCan%6 zM|cd_$@q)mIODH|8;rjho-zJzcn7?T=jS228ShS19UGhI_b+rnbz&6Q7RDU~L+>>H zVfdqb@mcN71<#75_D8YS{VXkoFG|I-3vF3{jhKKo_tQ!A*`C?@S7w0avKiPP(Y+dm zf0H+DH;dP@6l(ehB;d%Ff|>h!(Dr9$34IR&TWFV6`W+aF!M0;busrgn?pEAU`H{qW zyigHKNnb3C%zQ6}GY_aidA$Z5r$N^a%w&2ppgl=92L~X6*CCR>mn}Li*4yop{{CKF z#Cn5Lx%?u5j!b5QI;mSD8`=(N)cOvL7$Wy_?xgKYTT5P--X1p$>K+Pk!Y>__pGf|+ z-7BE;Md&_>ndMmN%s`^n8L2-F<11HO3;#2zj`+}l}@+D_TYso9R`t(HFqzV~U=f?H0VLw(tJR3yIff3v_5rJc{!aSZm zZj-F`@^`R$c%`q;KUiS+%VNwhGyzw@l|`8jd}6NoQjqZ?*zg=|Ie~i(D?-x&uFL3f zJa^FIc}KcK-h3$Z>LTD;C&s@FYccr4EQf-b``Ejqt-AF@gVmfH5$O07Hl55PN=gUN zfb4~VA8XEkJRIw>Ao4Cix^9-t2|Gr`2d%D+eHsm zE0trxcQEvo+{xSJgnXv;@9ZtV39>p9?_S_W*i!rq<+>Px11&O0VBjw_aIR|Lg!YOz z6uG-|vV?p_<+;vyV>cZ9o^7Ci4d3Y*L%#z(jWQTQ-ZhdldFy($M7}6ra+;U&Xs8(S zEwK!qB=NrsX71gHc5jh_8GBkO8|*l`9q8$)lR*FjPZZWRjCwO?(l*7>P=O*xt%s3~ z8DLp^#jA?UXP+bdn@4c;`L=T9`IHZeAvjPiTC`WZOoOIyv%=>rd-Hd3Ii30yOXwBg z7Q9>Hv(HlAH5Wa`cbVK_A)jro{eW^!^gGa9A*t}$rc-GymrPFHTI01{lm|UaC3n&` zCKz}R_Y`mv9W0)AxK-`TvI?Nj=a9dOm8*(5qPIy#$I)i zV3sKId52lKjKYDt3a0M$7&34NH!^N+%|#C@ZP*rumvi2LPmAUr+^sd9eh0dWWkWRN z+{!Zei_u3JEOxg4s>quQA4Dyt&NiGY zkiSTs)V-l`bvw}2l`F}FgUcm<#%_KZLtvOWE-#*cXoo6)AJ1)+#rt_|tKH%M)Nn1GL{gTn|Kr~yDsabm|6;;BBAMu&(v1Tap`kb5k)JVRNB1(+@ce|A6g+riq*P`d!n6vhpP-IMD7h@K(;GEvv(UMRC1sYo+d{!h0x7 zMwbI;q4DZybd3yz+xj~)ak26o3M^nrwW=lXaq+xEI^*)3Nm~`sP#RnY!zuT8 zO^=sb6)R3(ub0mqH81mdKzRJ%K@(_xA2^8zuV`eYXn;Xa6FSQ^9m}H0=bT76*7@U{ z>ZR2w;9Q=8nhNjg<2!4^yTX-=n;D`WXf1n`eY9YoIqJ8vln#)CIT>A@-=X8OR3H-< zD&+)fTFV|*Wc*~UtCzWF5#EP#H+EZoVjDPqD*HwAXY3@7w$C)j@i{VtnS^bJ4#t7) zc@u%%bd|H?D~Uvwq@;T71yZ``NafjO`9YbGj6Tmh_1V|WE1rGu4|sk`*|6pv=nnd4 z2&pq&!%t29ZtKrdFk`no^@d`{!8kBRy-v9?>#yO{s#cvPK4*qR!V3o^=$l5A=c2j$ z(t)+ShQXk!A#B+_ZhR^S z5>6!Uhj_(u7!PJy8KV|due(5e?o0`X=WdYpswbtT^uA;{O6@!e_$H<53*8w~mvfbv z#%;2aS2Fy~fmbQC1<*EqSBvbRdcGT!UBEidpSi2kWB*ygq1ovK8G9cWS(~a)g@R|P*eouxpTKJbYHKNO&A&0B_j2qX~HHgwwAYG$n+uM?D&LVJ8jG?Gt5kbG4a5q-+{!9^_JjJ z&JEP-qK3R{#P9wcMok?Q0bhnR72P5^6Sr8yj54#lkBvt?tq!DcXtX*v&Sy3d$)=8) zrz8}dk`imvYmzr@dkZfBkjYD+V-IznZM+}(G_tW3>y}rE{C-fn=m>jD>0L1NRdJd> z5ohN|Vrza~TFdW~@}pV{8!$>O&wts^tnqB@$je+favKkEaONi(OYr;) zWbg22SoLS5o#VBx$9Vk?=>L^|EZ7e0&8&c9R1Q~fmbYgc9Y3q;cOb3*C-Do}xc@Kl e|NmC`SMxXADPZxa3OnTh0000G)2_n|D9*LwJ)} z!R${qU<7HPD0G00QpF0vG4{uaKKdsr=DZV0HLL3})&{yl2}lPF;R32+~3k=m^`D)-7Y=-aMjDAAGe5 zctJ|nPJ}u3KvyWn=QjFP4VXeUs0Gu+(xq;NFPuYhK2PY=d!O$U@SGynEF-CM#fNN8 zr~z5P^k+6;1gW7gbcS6@x6Ty%><-1ffAdqs`aCANP0KjU{SS14qK3Vpy@8~U^~qxK zVz(kTuA;cNFDdTbtDgx?JfiSLb4V;(<}QBMbf|4OH&i$9)xcC>2?e1Y*vhS2L`UDf zPO(_|dpN(~r8MyLd1ghGX`hp$*jv4PJh zHuy!7A`k8)xos;#O_F0+4rAC@9!o+H&W%m0348oD+w)KjGJ}bl2GT)QSR^%Upo?-p zM=?RqQp8t25TvL}jtTOS_J>*iBlu&isyUZ|&yL5{WAj24H4W4Sw`jkIl$fZ;9!!FGqcC98U&U+0zO^9b={uwR)y`EwkN#~@}6PGQG(eHlM~1R=H!Cc-tIOO*BoUV2kv zlx1@X`2#Q#b||wZea?j)+sSgSU?a6@5y9hzrZ<5{ys>UD4mK;}hqHK6v^Nm`!jqCB zwQBYWW0t~LxEAJo=yMJ~d%-5LRLOhn=di2xEOr65NR6$0{x$B-1rn=Pev8;lm?o4g z?!#ipB}ID!Vb9$uDWO+RlTfO}eSUM9FIv@=4LPxK10Q}RI?l!^yEjK;`5;(JBL}`` zW8?`VBKe^+5>6{SHn7@cX>Z`^bxMxBWG0*R5R8Hy@~jE5ERL0ATXrj~RSw&JkmpZ* zfaR62PO)42G1TQy6h8#V!WyY-dqQ1Gv^Nm?8Zx7zR!HynD( zdp5EMw&qY??ANUvF4N_MwrwW?`v;Ql#M&HW6ql|tPhC<5ug42(EqNDuYlkYuxh*Q%ze zfd+6%y5~k(h}O%Aoybt1H;^jc8;zncQ|#P^*Jy*<%V4FZff{f^yz4?*37uOLYUe_U zuU;D(L00IDy>w4>-KTk8Fq~&K)ih8NmWoHVl6c2Sn`_5NC{g@5>U%*BForZx6LyI6 zC$e$cIqfEXX)dj%fvnI@C{yyHuzwQ?w;Z+EvczyG)q_k>1f~eh8^*D`W+!Y(s8-2~ zzoE#krU7#(2;J~D`KZvNJqa#*NVsXQUZ+-s`uR`?df?ExEjaDcHplq`Bn<3MLcs!# z{N7OnEYvh$Xd)Lhge5|SvH|*I+eq(yTAfRWNGM(`kUxPs>F18)Ih7oDkWjs{4z+8b z8RRvrJg9y%XAJ3}3=9+sMbGj^o&JeeZ>u->Gz->zaT>|8}c(ZYWC9V?(YuK zB87Z(+m}&@$1%`Ow|^bs1b@e$Xq!SFF#pwGXiOkIl!k$5!dXA2KZUsMq7e6^>Ri}I zx~aoRC{gS(e+VoO8NuXtej_u3JkSJ|VN1T&t)59CH;yDrXT6w&@@0bg!(U6t2Nr+o zE2Rl!fHKev{?WIvdas)^nnJ7>QOKe76mnoKh1f13-GcF?Z`V}duU7^@dB_B&f5UfT zGsq5Ap*PG2YuLxx!b0c=H6SOL|7{<-jlcr3KtU)2mAJA{2(t1qMnC^U_Ye5tmH7ex e``;>m+W!O6G2GIxv~hg^00005e zaCVy6vDL(yBew2rGj?MB_OpzgyYPinr3YxS+< z7F7v=D0Y~evD4x_u}USit=DP3eUBEwSw)rNy*sZ=T=T5~{J&b>$;ha~f&L@reZ0lQ ziM*03t~NBGRBMSz%OF!*NTsl_vc6d;k;QpWH_Uz9k)$igC{dxP$m3em4a#a8sBXSR zUF$6ZWHQ#Cb!6z+Wgi>d-swL9Pwv)xbn~LUruf9jNX=EDDy||mPerC$heB|8iX5+) zSUh85h|kWUqQ2!NtE*}#sjs8{#vLjeS_zg(IqUAoDK{5PyhRvH-RaSHe6t?o-%6%k zyKbK2mhOGwEJ+j~MMy>B*aTl8Dpf&Jc0LMi5xJ!mpBQCv<=NtuYJ zjD1dL@Qss_kX=BMNFqs^g1F2al-d&FlzAlQ=_tO|NWKV*OJpQ_tt>h1atY^%C_MzEQ~YiwTpZ;Sv@@Ktc+aLL#yC z55nBj8~3ONlq3Cxmuz#^Kq3(*>7#j%9AJ9>tKPqEQ8&4p>*mx zFjbGK2OisJ$mGU#r=2(+=*J!pb51zBa^{K~mxa~d334vQMi3~=#LC|jhoAs1g-N&) z9!-!e9f=~Ju=G6q#r^KfXE5>fWRImSo6enMzm*NX@p81+noyM0a>856fMIhR^_Y6# z`2*gV{p65yAaSLY$OKfdj|-YU*yDP7wkhLk*P~iRW~5b)8d<&&hg+-4ths1a>m9ddQ3g=GSQ_zzZ{#+ zoe$c`uW7<5DTZLBNTggHfg-ED5`-Itt7V!Bp^O6m-&}pdH;%04J0usD;SwV!NNDYul!l#%<#~~8 z7o+2m2%yBmO2R~f#px=Lm(>Wa!&_JvBvTTrE)`scv8^NPHf$hVcqP3;^mCPpgrqpG zNOO5@>iWOAdTg(O6B_q92BB=ZjjXbk3xQ#n`TB7wMv7m07C{*~q*m6EEIL`Ns#xSe z0-+hXgeY=2W_pez=Zr}Z-ci(C7a1;L-PSc2+c^=PU&1N-bFA4u77ssHY@%`)Fk=4S zlB-Y0&i&=f4_R?8CIvrT8NO*5#A=EuXuQdWT?Ysin!ATb;1(J|R89dG!+bevY|OIt z^H{iamTVxXn5@Ets2B?^7szQ@9qb6B)~B9_jVNWWT-yu4aiw4W)nhOutTYPRg!%9g#GSif~0XKc(- zi1HB%3O>VxS%X=+Y&uz4IaJ?h6$zWcz)_3u8CvGwsJp&_Pgr^QMOsAzU;p%!M<0C1 z*m1A0V%0LP1O$+zD-qXVMvoiJj0I!av|}5~S1sb4l?4}ld{Id?VRWGOs)@;>i~GBOFz zruU$!&3cUgG6=LkFks}uk1az}(G;ur_>(ri`{gM`^-Xw0#xQ>3Sdw+c95FG&FFr~1 z>vXE$d>iMGa88Rvs($-12lwruwxNz^K+}TG{Z*{g>zsK3zsja>c&lO+__C|dJ;dqcuw1Q zKj5XTV&bY3-w8Y$z3g8#?7cQ+?Z%K0=|&Cpk+= ztXxiMV;zsb`hx5S%q(Y6~V=|1Q*rfQ&5RRvW5fBaV$FM_|uRvOMk^c|Lc!1Q$)?5 z?%1Wjbl~uL4a25ydOT+So-fAC-~EODe&F!=4f=2THTt!`?g;bS4{f6jO@67K4fmse b>!Iy0czr{py->4O00000NkvXXu0mjf*%Z>b literal 0 HcmV?d00001 diff --git a/public/ice.png b/public/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..a05e2f9659586f01e911542f7662e21179904003 GIT binary patch literal 1963 zcmV;c2UPfpP)We0n7wW`5-Dj#dq*UOni^e5Dh-g$A7&6qTw4PL;=)9bF@Hh z6haacEc&|?z=bam4<#_5exQPe9M|o+7j$p_Mcp5MLbsa+>p+H$8b*6r6Y?uWeVYM% z@DYAPZgefYLqXea>d{R}R{pu8C#81l5Pf^20RF@$@Oje#T=)`6P@BTnO+Kr;7oIEZ zh9pm}yinL2_Dt#B+RnBOkrH3S^(F%N;A8xbeCS_0Ko`$F*Nf|tym5&jO@eieF$SXm zem7(LysiK)vr;KhKkqiJAAL%9C_e0(BquHsV(K~FEwV$K7_%;t;!C)k2k?BX7r@Y_ zA-Z-|(yMZoMW_>~OYS|2yk;)5Hyi}8IM$P*Zq6-QKmEM!U6OS96+1(S(WiAM|8}io zu6jrTb8grS5TWA-hyh>ZL_d!8D-NJ=2S3p)%)&^5a*01hY5( zJwOzEh6JdRb+ZHj=1m_0Zu0kX9!a37s%LUBfO2r;u!?v}M7+=6;C%`92 zgcgahPqJv%SS8^gl`bV7XO!5Y)%mHkijoO9z0+qXwDd}=3vFDef>p-ZR26n0jU zw}yoWXo2651*=S(*G`8?W6$a)W7I%QI{^}4z-dWmtSRWRo>{gTCO~V%LY@-4wbxVs z9ryIqQ#-^sgOJcpfRvbdN|GfM-Kk4%Yj5eXRr~mJx@QidgeX!!SVyh;9pr@VeN4CL zb8hiiI5S^C}i7oE}f>IRuRAi zOo_q`LKGNrj9P)Z!k-UAQ6xroOd8DMSj-Ct0gg(FY*6^>pEJd!$6tt#!WdMCmEOeh zyzZ`UnUD#Psnr3^V|xugElx%)LM^1iA7=YfSe|pME?CS92LTRCva+1jt;r7)ea51S z=^r0yQ4!4uI@*iMXcl211Q|%d`<%Fmt@Bhg47PuNw(>RtoR8Z z!G$P>%LIvw%6YbFaeoT;r*K>II0+Cc$s5b>=ysQ5>TjO1q9O9V)tBY>D&P1^+OwC! zy&B(1fM7}9n08f{Y6Pjdc`&hh*8Lpm`<&96EnJDb8sABPKuLCt>K#N3ty*+3AF^EnBySCW-66kd3jj+??uAUWbA3+m_Fq5dN-YMD8qe?{CDhtwLA z`0rLIZi2)!+cd-?+HbBSh~>Oa0_>3#Sx@srW(rA(KamU-Fu6HJY~ci*cSm>KVUP&f z8t&Ipw%25CA997?KD0K)|Akm6f`vKwA+wkl4g&0!6xn8qW0KS6kuMeUqDNUj9i7GH z)bx}4zs+SeC5qMzR!GD#I)vZA%|vCSHseem$W5TtyznYO8qC`%$;t>0A@j5~l+|3{ zoxKvd&&==uy-k1;)wsoo+-D)T9A)cTm zR&dN(wfB#3JB>osf_22SS@v}wI@1a5X->wOh-7vG{DoF??&`@_NmkZz7+AI$UCjdx z{zlH6+qB)ZIT~;2BRylB4*1(nfUl4<&vwn9$-B%glDyT$JW}FUWWoxoerqZG-^QAM zUr&qd)@t*H;u|{wqQMshd7C`C!2#V^`dH65NwTYRc!0jk$PxYet5#7wZ zSyRlV_g6%>6TpPfcSwg;1$HW6HY>3~k{zAG1NfT|lX1?p*|LaptLPpbV!MvWgdbtP zDcFBA7X_an7D{E>q^V5~>*ms@dcIzgClfg#-60|}Z5}P*HA-u~D`eZEx#rm-9zI1B z$L~f>@*j{9?F;YL!TFq2>mm+N(WABbUACKFl{WY0Jbm(`M-m~u}~xWtB-H*Xou zo{sjqztFhw3I0YYLQHFWQnwd!)mSCTjwR0(*7=O?=GdkM<~}MeK7;E`ej|$-;oNA= zO70qTRS#E6@?`W)JuPiKF5hBtlU%MK26B`k*;VASu2@w0G@8w-2J@OZXxd x5*V=&6JMD=KCj_Jw{x$c7{~tm+bVC{{{h?9ORG(s4l)1$002ovPDHLkV1f~}vA+NS literal 0 HcmV?d00001 diff --git a/public/icon.png b/public/icon.png index c4c9dbfbbd2f7c1421ffd5727188146213abbcef..cccd216f80944683d9a49b35aab5b27b321aea18 100644 GIT binary patch literal 13674 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

9^_1 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 R%)$Q$NQ%md)Cd^_{XacDn{5C9 literal 4166 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 diff --git a/public/icon.svg b/public/icon.svg deleted file mode 100644 index 04b34bf..0000000 --- a/public/icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/lightning.png b/public/lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..5e827d22d5d6866d31bd2020e60dfd703eefd3b8 GIT binary patch literal 2227 zcmV;k2u$~hP)|fGC`Y+wdBiWxOG$Z?B}n z6T{CAroJE_V|T^dxWnF!hzqb^>v#e`IWE=U+zxUpPx7Tm%0Dvi#^9Oz?^15(!;kyZ zrEGT8aivx;S4});pBrHoU^mpcNW?989c|M}X^(f4~FS?cByTFn*l*L{ha>#0MUEfvj|9GA$= z@j)1x_M)U5z_+htfy>YdYiM7R)0RxjQ5_AO539&zhx72QC39V5ja3y-;xfd9Q^19I z0=1bWqj;HEJWw#sT7=7N@w@2dX=vwWk^S&C{z$o%b7hYyey)|R$5*I`cJBWdS#Z1* zmG*-2XxkXi;Nox!xEa5=epjwPRg%jvTt7+VZBZ5H~kGssK)OulPkZE zwaET>6|Z9$$7FJL$y&@mPzpb$+@?K@NfsJyd*bnM3U~pNlr9BRG}9Vz8s0@&v~$<6 z^YqGAUK^$G4ZE_zw=IzIUHrao|8bN?UD}g{M!P9^F`NRDFiWXYDDLVdi+mcdV@lEV zK<3*bamn3mZrn=Y-&|SzrmymQS$&7&O}vJFxvfLbN1NFw6;1)AFk30o(Qwx}%A8zx zp_=mn`AnvQ;nt*mP!46#(^K2->-yfxo0D8M0wQZz+MeMDVo`xtJ< zw@7w2!=?;9zu59!!3S_>G^nY0C9RC?Fp_=nSuK>@p@BXNBrkq^Ze zC~dwE<~TXvTVq|nv&_}z89ae1ya_sUn;tUWmzrwMqnq#*k_!gexe-ADJEQ~oR!PqL zB(ip>glF*`uie?XP3(3>y}p>pN>~?3(BNDr-?;l>^8ZLtv2)Uohh&)TBkjuV&4k8op+YR37<*U02NTm z?9itCj&?g+Bn51i4wT>C8e}0}$E|oHx4u$LF3;brJP%cIH>|&C_8%%bbQ~7C*8Jtm z;Wad&Ah&mhX?K`N3fL$e%Jqdr)&$R?JSXz#q7i}2JI%WJ%IEkWxE)VqzM+u^_ILjp zxEsZfcnHs9`xc8f!9-HPdg)NUMG{w$EVIZYRN4Q#$(7%x{2PzaNaAA>8rxQR^N%H zUlLlme-v3Lkrc2(3MK6c$y_R5#B?@D24yJE) z88hg7w3&&da0+-D!~9F6qsePx4LkyGpfY-Rs@QqjlPWN~l!Wgnc(ZqUAS)hiT}~Hs z{1cQ#v#gJT&qY2G&xBLJJ*ZdMgN}=iF6%>U@a8CoPgvB#!ajk_JJs5yb@nc)R{G0! zU(a7w-`=M9w=p@d@!@k64J)~P-xp2+SK#&iH){o57+^tY-YJsv9=XiZ=yIs#ywlF} z8kOwQ+xQssJ%8GH`b$<`-(=k#7l<+Kyr`d)a+4O3y^E{DDIgxVSSMGM24|F$ibpWm zyxFI1j+i7clr$1s+DZ%X^(HJ0O_ z;dUe(y#Tw2Yf%byldsX9!d^@`Cpgb<)*_wA$a-J$POvk67P~?&ksa1IzqQ0)p6`L* zi-$=3TY0;A*_6i(uojQ7pUg$$Lfnt9_Qh&!<|~qSB$LcKvaI)5M5`lbh24T>w&LNE z>r-Vq&etIGZ{~+^F`^@WHfk!r9_7$D97^(c$_Tt>I${+$I*4lTc-lzf#O=8;Mz+=ztJ^(kcxF2?=%7+upIlhgBaV4;N_ z(Vm|hOS~^A{TXGMXGLG)AzX^sGvRaMI9!D%@Cp8n4(MZaLM?obr*RG9&$JJ^qmY2h zaSQIpqs9Zc6<3%xQ77$#?ns=d#YEzN|6ApB`!D1}?pHPVAJ+f?002ovPDHLkV1i5K BadH3v literal 0 HcmV?d00001 diff --git a/public/water.png b/public/water.png new file mode 100644 index 0000000000000000000000000000000000000000..9b85e4a2ea96eb08f9bf7c1d9d078dfb1582861b GIT binary patch literal 2004 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