diff --git a/fun-shit/turnips/.github/FUNDING.yml b/fun-shit/turnips/.github/FUNDING.yml
deleted file mode 100644
index b125e30..0000000
--- a/fun-shit/turnips/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-github:
-- mikebryant
-- theRTC204
diff --git a/fun-shit/turnips/.github/ISSUE_TEMPLATE/bug_report.md b/fun-shit/turnips/.github/ISSUE_TEMPLATE/bug_report.md
deleted file mode 100644
index 72c88ef..0000000
--- a/fun-shit/turnips/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-name: Bug report
-about: Create a report to help us improve
-title: ''
-labels: bug
-assignees: ''
-
----
-
-**Things to check**
-- Have you forced a refresh in your browser (e.g. ctrl+F5 in Chrome/Firefox)?
- - yes/no
-- Have you made sure the first time buyer option is correct? If you're unsure, try it both ways
- - yes/no
-- Have you time-travelled this week? Travelling backwards resets the prices, and therefore you must not put prices in from both before & after the time-travel
- - yes/no
-
-**Describe the bug**
-A clear and concise description of what the bug is.
-
-**To Reproduce**
-Steps to reproduce the behavior:
-1. Go to '...'
-2. Click on '....'
-3. Scroll down to '....'
-4. See error
-
-**Permalink to your prices**
-Please click the `Copy Permalink` button and paste it here
-
-**Expected behavior**
-A clear and concise description of what you expected to happen.
-
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
-
-**Desktop (please complete the following information):**
- - OS: [e.g. iOS]
- - Browser [e.g. chrome, safari]
- - Version [e.g. 22]
-
-**Smartphone (please complete the following information):**
- - Device: [e.g. iPhone6]
- - OS: [e.g. iOS8.1]
- - Browser [e.g. stock browser, safari]
- - Version [e.g. 22]
-
-**Additional context**
-Add any other context about the problem here.
diff --git a/fun-shit/turnips/.github/ISSUE_TEMPLATE/feature_request.md b/fun-shit/turnips/.github/ISSUE_TEMPLATE/feature_request.md
deleted file mode 100644
index 11fc491..0000000
--- a/fun-shit/turnips/.github/ISSUE_TEMPLATE/feature_request.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Feature request
-about: Suggest an idea for this project
-title: ''
-labels: enhancement
-assignees: ''
-
----
-
-**Is your feature request related to a problem? Please describe.**
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-
-**Describe the solution you'd like**
-A clear and concise description of what you want to happen.
-
-**Describe alternatives you've considered**
-A clear and concise description of any alternative solutions or features you've considered.
-
-**Additional context**
-Add any other context or screenshots about the feature request here.
diff --git a/fun-shit/turnips/.github/no-response.yml b/fun-shit/turnips/.github/no-response.yml
deleted file mode 100644
index ab52138..0000000
--- a/fun-shit/turnips/.github/no-response.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-# Configuration for probot-no-response - https://github.com/probot/no-response
-
-daysUntilClose: 7
-responseRequiredLabel: more information required
-closeComment: >
- This issue has been automatically closed because there has been no response
- to our request for more information from the original author. With only the
- information that is currently in the issue, we don't have enough information
- to take action. Please reach out if you have or find the answers we need so
- that we can investigate further.
diff --git a/fun-shit/turnips/CNAME b/fun-shit/turnips/CNAME
deleted file mode 100644
index 1028e81..0000000
--- a/fun-shit/turnips/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-turnipprophet.io
\ No newline at end of file
diff --git a/fun-shit/turnips/COPYRIGHT b/fun-shit/turnips/COPYRIGHT
deleted file mode 100644
index 9e5c3ef..0000000
--- a/fun-shit/turnips/COPYRIGHT
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2020 Mike Bryant
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not files from this repository except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/fun-shit/turnips/LICENSE b/fun-shit/turnips/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/fun-shit/turnips/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/fun-shit/turnips/NOTICE b/fun-shit/turnips/NOTICE
deleted file mode 100644
index f01ec2a..0000000
--- a/fun-shit/turnips/NOTICE
+++ /dev/null
@@ -1,3 +0,0 @@
-Originally developed by Mike Bryant, with great thanks to Ninji
-
-Original project location: https://github.com/mikebryant/ac-nh-turnip-prices
diff --git a/fun-shit/turnips/README.md b/fun-shit/turnips/README.md
deleted file mode 100644
index d1140ce..0000000
--- a/fun-shit/turnips/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# Animal Crossing New Horizons: Turnip Prophet
-[![discord](https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=for-the-badge)](https://discord.gg/bRh74X8)
-[![issues](https://img.shields.io/github/issues/mikebryant/ac-nh-turnip-prices?style=for-the-badge)](https://github.com/mikebryant/ac-nh-turnip-prices/issues)
-[![pull requests](https://img.shields.io/github/issues-pr/mikebryant/ac-nh-turnip-prices?style=for-the-badge)](https://github.com/mikebryant/ac-nh-turnip-prices/pulls)
-[![contributors](https://img.shields.io/github/contributors/mikebryant/ac-nh-turnip-prices?style=for-the-badge)](https://github.com/mikebryant/ac-nh-turnip-prices/graphs/contributors)
-
-Turnip Prophet is a price calculator/price predictor for Animal Crossing: New Horizons turnip prices.
-
-## Support
-
-If you have any questions, feel free to join our [Discord server](https://discord.gg/bRh74X8) to ask or [open a new issue](https://github.com/mikebryant/ac-nh-turnip-prices/issues).
-
-If you have a prediction issue, please open an issue describing your problem and give the permalink to your prediction. Otherwise, please search the issues before opening a new one to make sure you are not opening a duplicate issue.
-
-Please create issues in English language only.
-
-## What about feature X?
-
-At first please have a look at our current project scope:
-
-| Turnip Prophet is | Turnip Prophet is not |
-|----|----|
-| A predictor for future prices that week | A calculator for how much money you'll make |
-| Able to calculate probabilities for different futures | A way to count your turnips |
-| Able to show data from a query string | A way to store multiple people's islands |
-| A single page web-based app | Something with a backend |
-
-If your idea, suggestion or improvement is anything out of the above named, feel free to [open a new issue](https://github.com/mikebryant/ac-nh-turnip-prices/issues) or contribute by a [new pull request](https://github.com/mikebryant/ac-nh-turnip-prices/pulls).
-
-## How to run the project locally?
-
-To run the project locally you will have to clone it and then, from the folder you just cloned, you will have to execute a command. There are multiple options, listed below:
-
-### Using Python
-
-For Python 2.7:
-
-```python -m SimpleHTTPServer```
-
-For Python 3:
-
-```python3 -m http.server```
-
-### Using Node.js
-
-```npx serve```
-
-### Using Chrome
-
-```google-chrome --allow-file-access-from-files```
-
-
-## Adding a new language
-
-Turnip Prophet is already available in some languages. If your local language is not listed you may go on to create a JSON file corresponding to your language in the folder [locales](https://github.com/mikebryant/ac-nh-turnip-prices/tree/master/locales). You may copy the [English localisation](https://github.com/mikebryant/ac-nh-turnip-prices/blob/master/locales/en.json) and translate it.
-
-Please make sure **not to translate** "Turnip Prophet" and include the new language in the selector inside [js/translations.js](https://github.com/mikebryant/ac-nh-turnip-prices/blob/master/js/translations.js).
-
-If you have any remaining questions, feel free to stop by the Discord server and ask.
-
-
-## Final statement
-
-A special thanks to all who [contribute](https://github.com/mikebryant/ac-nh-turnip-prices/graphs/contributors) to this project, helping to improve it and spend their time.
-
-Stay awesome guys.
diff --git a/fun-shit/turnips/css/styles.css b/fun-shit/turnips/css/styles.css
deleted file mode 100644
index e6f6716..0000000
--- a/fun-shit/turnips/css/styles.css
+++ /dev/null
@@ -1,670 +0,0 @@
-@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@800&family=Varela+Round&display=swap');
-
-/* - Variables - */
-
-:root {
- --color-blue: #0AB5CD;
- --color-light-blue: #5ECEDB;
-
- --bg-color: #DEF2D9;
- --bg-dot-color: #FFF;
-
- --shadow-3: rgba(0, 0, 0, 0.03);
- --shadow-5: rgba(0, 0, 0, 0.05);
- --shadow-6: rgba(0, 0, 0, 0.06);
- --shadow-8: rgba(0, 0, 0, 0.08);
- --shadow-9: rgba(0, 0, 0, 0.09);
- --shadow-10: rgba(0, 0, 0, 0.10);
- --shadow-15: rgba(0, 0, 0, 0.16);
- --shadow-16: rgba(0, 0, 0, 0.16);
- --shadow-20: rgba(0, 0, 0, 0.20);
-
- --center-bg-color: #FFF;
-
- --wave-1: rgba(255, 255, 255, 0);
- --wave-2: rgba(255, 255, 255, 0.2);
- --wave-3: rgba(255, 255, 255, 0.4);
- --wave-4: rgba(255, 255, 255, 0.6);
-
- --nook-phone-bg-color: #F5F8FF;
- --nook-phone-text-color: #686868;
-
- --dialog-bg-color: #FFFAE5;
- --dialog-text-color: #837865;
-
- --dialog-name-bg-color: #FF9A40;
- --dialog-name-text-color: #BA3B1F;
-
- --chart-fill-color: var(--bg-color);
- --chart-line-color: rgba(0, 0, 0, 0.1);
- --chart-point-color: rgba(0, 0, 0, 0.1);
-
- --select-text-color: var(--dialog-text-color);
- --select-border-color: var(--bg-color);
- --select-bg-color-hover: #EBFEFD;
-
- --italic-color: #AAA;
-
- --form-h6-text-color: #845E44;
-
- --radio-hover-bg-color: var(--nook-phone-bg-color);
- --radio-checked-text-color: #FFF;
-
- --input-bg-color: #F3F3F3;
- --input-focus-bg-color: white;
- --input-focus-text-color: var(--color-blue);
-
- --input-now-bg-color: var(--dialog-name-bg-color);
- --input-now-text-color: var(--dialog-name-text-color);
-
- --button-text-color: var(--nook-phone-text-color);
- --button-reset-text-color: #E45B5B;
-
- --table-range0: hsl(140, 80%, 85%);
- --table-range1: hsl(90, 80%, 85%);
- --table-range2: hsl(60, 80%, 85%);
- --table-range3: hsl(30, 80%, 85%);
- --table-range4: hsl(0, 80%, 85%);
-}
-
-[data-theme="dark"] {
- --bg-color: #1A1A1A;
- --bg-dot-color: #222;
-
- --shadow-3: rgba(255, 255, 255, 0.03);
- --shadow-15: rgba(255, 255, 255, 0.03);
-
- --center-bg-color: #101010;
-
- --wave-1: rgba(16, 16, 16, 0);
- --wave-2: rgba(16, 16, 16, 0.2);
- --wave-3: rgba(16, 16, 16, 0.4);
- --wave-4: rgba(16, 16, 16, 0.6);
-
- --nook-phone-bg-color: #000F33;
- --nook-phone-text-color: #CCC;
-
- --dialog-bg-color: #252422;
- --dialog-text-color: #BCB5A9;
-
- --dialog-name-bg-color: #BA3B1F;
- --dialog-name-text-color: #FF9A40;
-
- --chart-fill-color: #2D5F21;
- --chart-line-color: rgba(200, 200, 200, 0.4);
- --chart-point-color: rgba(200, 200, 200, 0.6);
-
- --select-text-color: #837865;
- --select-border-color: var(--bg-color);
- --select-bg-color-hover: #EBFEFD;
-
- --italic-color: #666;
-
- --form-h6-text-color: #E18B51;
-
- --radio-hover-bg-color: #00174D;
- --radio-checked-text-color: #FFF;
-
- --input-bg-color: #333;
- --input-focus-bg-color: #999;
- --input-focus-text-color: var(--radio-hover-bg-color);
-
- --button-text-color: var(--nook-phone-text-color);
- --button-reset-text-color: #E45B5B;
-
- --table-range0: hsl(140, 80%, 27%);
- --table-range1: hsl(90, 80%, 20%);
- --table-range2: hsl(60, 80%, 20%);
- --table-range3: hsl(30, 80%, 20%);
- --table-range4: hsl(0, 80%, 22%);
-}
-
-/* - Global Styles - */
-
-html {
- font-size: 14px;
- background: var(--bg-color);
- background-image:
- radial-gradient(var(--bg-dot-color) 20%, transparent 0),
- radial-gradient(var(--bg-dot-color) 20%, transparent 0);
- background-size: 30px 30px;
- background-position: 0 0, 15px 15px;
-}
-
-body {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-family: 'Varela Round', sans-serif;
-}
-
-h1 {
- text-align: center;
- font-size: 1.8rem;
-}
-
-h2 {
- text-align: center;
- font-size: 1.6rem;
-}
-
-.nook-phone {
- width: 100%;
- max-width: 1400px;
- box-sizing: border-box;
- margin: 16px auto;
- border-radius: 40px;
- padding: 16px 0px;
- padding-bottom: 16px;
- background: var(--nook-phone-bg-color);
- color: var(--nook-phone-text-color);
- overflow: hidden;
- box-shadow: 0 1px 3px var(--shadow-6), 0 1px 2px var(--shadow-8);
-}
-
-.nook-phone-center {
- background: var(--center-bg-color);
- display: flex;
- flex-direction: column;
- align-items: center;
-}
-
-.dialog-box {
- background: var(--dialog-bg-color);
- box-sizing: border-box;
- padding: 16px 24px;
- margin: 32px auto;
- position: relative;
- border-radius: 40px;
- max-width: 800px;
- box-shadow: 0 1px 3px var(--shadow-6), 0 1px 2px var(--shadow-8);
-}
-
-.dialog-box-option {
- text-align: center;
-}
-
-.dialog-box-option p,
-.dialog-box-option select {
- display: inline;
-}
-
-.dialog-box-option select {
- font-size: 1rem;
- padding: 4px;
- font-weight: bold;
- border-radius: 4px;
- border-color: var(--select-border-color);
- color: var(--select-text-color);
- cursor: pointer;
- transition: 0.2s all;
-}
-
-.dialog-box-option select:hover {
- background-color: var(--select-bg-color-hover);
- border-color: var(--color-light-blue);
- box-shadow: 0 2px 4px var(--shadow-16);
-}
-
-.dialog-box-option select:focus {
- outline: none;
-}
-
-.dialog-box p,
-.dialog-box label {
- font-family: 'Raleway', sans-serif;
- font-weight: 800;
- font-size: 1rem;
- color: var(--dialog-text-color);
- letter-spacing: 0.2px;
- line-height: 1.8rem;
-}
-
-.dialog-box b,
-.dialog-box a {
- color: var(--color-blue);
- transition: 0.2s all;
-}
-
-.dialog-box i {
- font-style: normal;
- color: var(--italic-color);
-}
-
-.dialog-box a:hover {
- color: var(--color-light-blue);
-}
-
-.dialog-box .dialog-box__name {
- position: absolute;
- left: 16px;
- top: -28px;
- font-size: 1rem;
- color: var(--dialog-name-text-color);
- padding: 4px 16px;
- background: var(--dialog-name-bg-color);
- border-radius: 40px;
-}
-
-.dialog-box.error {
- display: none;
-}
-
-.input__form {
- background: var(--center-bg-color);
- display: flex;
- flex-direction: column;
- padding: 16px;
- align-items: center;
-}
-
-.form__row {
- display: flex;
- flex-wrap: wrap;
- margin-bottom: 16px;
- justify-content: center;
- align-items: center;
-}
-
-.form__row h6 {
- width: 100%;
- display: block;
- font-weight: 800;
- font-size: 1.25rem;
- margin: 8px auto;
- color: var(--form-h6-text-color);
- text-align: center;
-}
-
-.form__flex-wrap {
- margin-top: 8px;
- display: flex;
- flex-wrap: wrap;
- width: 100%;
- max-width: 1080px;
- justify-content: center;
-}
-
-.input__group {
- display: flex;
- flex-direction: column;
- margin: 8px;
- align-items: center;
-}
-
-.input__group label {
- font-size: 1rem;
- font-weight: bold;
- margin-bottom: 8px;
- opacity: 0.7;
- text-align: center;
-}
-
-.form__flex-wrap .input__group label {
- margin-left: 0px;
- margin-bottom: 8px;
-}
-
-.input__form i {
- text-align: center;
- display: block;
- font-style: normal;
- color: var(--italic-color);
- font-size: 0.9rem;
- margin: 8px auto;
-}
-
-.input__form>.form__row input {
- margin: 0px auto;
-}
-
-input {
- border: 0px solid white;
- border-radius: 40px;
- padding: 8px 16px;
- font-size: 1.25rem;
- font-family: inherit;
- color: inherit;
- font-weight: bold;
- transition: 0.2s all;
- margin: 8px 0px;
-}
-
-input[type=number]:placeholder-shown {
- background: var(--input-bg-color);
-}
-
-input[type=number]:not(:placeholder-shown) {
- background: transparent;
- color: var(--color-blue);
-}
-
-input[type=number]:placeholder-shown:hover {
- cursor: pointer;
- background: var(--radio-hover-bg-color);
- transform: scale(1.1);
- box-shadow: 0 1px 6px var(--shadow-5), 0 3px 6px var(--shadow-9);
-}
-
-input[type=number]:focus {
- outline: none;
- transform: scale(1.1);
- color: var(--input-focus-text-color);
- background: var(--input-focus-bg-color);
- box-shadow: 0 1px 6px var(--shadow-5), 0 3px 6px var(--shadow-9);
-}
-
-input[type=number]:focus::placeholder {
- opacity: 0;
-}
-
-input[type=number] {
- width: 60px;
- text-align: center;
-}
-
-input[type=number]:disabled {
- background: inherit;
-}
-
-input[type=number]:disabled:hover {
- box-shadow: none;
- transform: none;
- cursor: default;
-}
-
-input::-webkit-outer-spin-button,
-input::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-
-input[type=number] {
- -moz-appearance: textfield;
-}
-
-.input__radio-buttons {
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- margin-top: 8px;
-}
-
-.input__radio-buttons input[type=radio] {
- display: none;
-}
-
-.input__radio-buttons input[type="radio"]+label {
- opacity: 1;
- border: none;
- border-radius: 40px;
- background: var(--input-bg-color);
- padding: 8px 16px;
- font-size: 1.25rem;
- font-family: inherit;
- font-weight: bold;
- transition: 0.2s all;
- margin: 8px;
-}
-
-.input__radio-buttons input[type="radio"]:not(:checked)+label:hover {
- cursor: pointer;
- background: var(--radio-hover-bg-color);
- transform: scale(1.1);
- box-shadow: 0 1px 6px var(--shadow-5), 0 3px 6px var(--shadow-9);
-}
-
-.input__radio-buttons input[type="radio"]:checked+label {
- background: var(--color-blue);
- color: var(--radio-checked-text-color);
-}
-
-input[class=now]:placeholder-shown {
- background: var(--input-now-bg-color);
-}
-
-input[class=now]:placeholder-shown::placeholder {
- color: var(--input-now-text-color);
-}
-
-.button {
- color: var(--button-text-color);
- font-family: inherit;
- font-weight: bold;
- padding: 8px 16px;
- border-width: 0px;
- border-radius: 40px;
- background: var(--input-bg-color);
- font-size: 1.2rem;
- transition: 0.2s all;
- position: relative;
- margin: 16px auto;
-}
-
-.button:hover {
- transform: scale(1.1);
- cursor: pointer;
- background: var(--radio-hover-bg-color);
- opacity: 1;
- box-shadow: 0 1px 6px var(--shadow-5), 0 3px 6px var(--shadow-9);
-}
-
-.button.button--reset {
- color: var(--button-reset-text-color);
-}
-
-.table-wrapper {
- display: inline-block;
- max-width: 98%;
- padding: 16px;
- margin: 0px auto;
- box-sizing: border-box;
- overflow-x: auto;
- scrollbar-width: thin;
-}
-
-@media only screen and (max-width: 1440px) and (pointer: fine) {
- .table-wrapper {
- max-height: calc(75vh - 40px);
- }
-}
-
-.table-wrapper::-webkit-scrollbar {
- height: 8px;
- width: 5px;
-}
-
-.table-wrapper::-webkit-scrollbar-track {
- height: 8px;
- width: 5px;
- box-shadow: inset 0 0 6px var(--shadow-20);
- -webkit-box-shadow: inset 0 0 6px var(--shadow-20);
-}
-
-.table-wrapper::-webkit-scrollbar-thumb {
- height: 8px;
- width: 5px;
- background: var(--shadow-20);
- box-shadow: inset 0 0 6px var(--shadow-20);
- -webkit-box-shadow: inset 0 0 6px var(--shadow-10);
-}
-
-.table-wrapper::-webkit-scrollbar-thumb:window-inactive {
- height: 8px;
- width: 5px;
- background: var(--shadow-20);
-}
-
-#turnipTable {
- border-collapse: collapse;
-}
-
-#turnipTable th div:nth-of-type(1) {
- margin-bottom: 2px;
-}
-
-#turnipTable th div:nth-of-type(2) {
- display: flex;
- justify-content: space-around;
- opacity: 0.4;
-}
-
-#turnipTable td {
- white-space: nowrap;
- max-width: 150px;
- padding: 6px 4px;
- text-align: center;
- border-right: 1px solid var(--shadow-3);
- border-bottom: 1px solid var(--shadow-15);
-}
-
-#turnipTable tbody tr {
- opacity: 0.8;
-}
-
-#turnipTable tbody tr:hover {
- cursor: default;
- opacity: 1;
-}
-
-#turnipTable .table-pattern {
- white-space: nowrap;
-}
-
-#turnipTable td.range4 {
- background-color: var(--table-range4);
-}
-
-#turnipTable td.range3{
- background-color: var(--table-range3);
-}
-
-#turnipTable td.range2 {
- background-color: var(--table-range2);
-}
-
-#turnipTable td.range1 {
- background-color: var(--table-range1);
-}
-
-#turnipTable td.range0 {
- background-color: var(--table-range0);
-}
-
-.chart-wrapper {
- margin-top: 8px;
- display: flex;
- flex-wrap: wrap;
- height: 400px;
- width: 100%;
- max-width: 1080px;
- justify-content: center;
-}
-
-.waves {
- position: relative;
- width: 100%;
- height: 5vh;
- margin-bottom: -7px;
- /*Fix for safari gap*/
- max-height: 150px;
-}
-
-#permalink-input {
- display: none;
- position: fixed;
-}
-
-.permalink {
- display: none;
- white-space: nowrap;
- font-size: 18px;
- user-select: none;
- cursor: pointer;
-}
-
-.permalink .fa-copy {
- margin: 0 8px;
- height: 20px;
- color: var(--color-blue);
-}
-
-/* The snackbar - position it at the bottom and in the middle of the screen */
-#snackbar {
- visibility: hidden; /* Hidden by default. Visible on click */
- min-width: 250px; /* Set a default minimum width */
- background-color: var(--dialog-bg-color); /* Black background color */
- font-family: 'Raleway', sans-serif;
- font-weight: 800;
- font-size: 1rem;
- color: var(--dialog-text-color);
- letter-spacing: 0.2px;
- line-height: 1.8rem;
- text-align: center; /* Centered text */
- border-radius: 40px; /* Rounded borders */
- padding: 16px 24px; /* Padding */
- position: fixed; /* Sit on top of the screen */
- z-index: 1; /* Add a z-index if needed */
- bottom: 30px; /* 30px from the bottom */
- box-shadow: 0 1px 3px var(--shadow-6), 0 1px 2px var(--shadow-8);
-}
-
-/* Show the snackbar when clicking on a button (class added with JavaScript) */
-#snackbar.show {
- visibility: visible; /* Show the snackbar */
- /* Add animation: Take 0.5 seconds to fade in and out the snackbar.
- However, delay the fade out process for 2.5 seconds */
- -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
- animation: fadein 0.5s, fadeout 0.5s 2.5s;
-}
-
-/* Animations to fade the snackbar in and out */
-@-webkit-keyframes fadein {
- from {bottom: 0; opacity: 0;}
- to {bottom: 30px; opacity: 1;}
-}
-
-@keyframes fadein {
- from {bottom: 0; opacity: 0;}
- to {bottom: 30px; opacity: 1;}
-}
-
-@-webkit-keyframes fadeout {
- from {bottom: 30px; opacity: 1;}
- to {bottom: 0; opacity: 0;}
-}
-
-@keyframes fadeout {
- from {bottom: 30px; opacity: 1;}
- to {bottom: 0; opacity: 0;}
-}
-
-/* Cloud SVG placement */
-.parallax>use:nth-child(1) {
- transform: translate3d(-30px, 0, 0);
- fill: var(--wave-4);
-}
-
-.parallax>use:nth-child(2) {
- transform: translate3d(-90px, 0, 0);
- fill: var(--wave-3);
-}
-
-.parallax>use:nth-child(3) {
- transform: translate3d(45px, 0, 0);
- fill: var(--wave-2);
-}
-
-.parallax>use:nth-child(4) {
- transform: translate3d(20px, 0, 0);
- fill: var(--wave-1);
-}
-
-/*Shrinking for mobile*/
-@media (max-width: 768px) {
- .waves {
- height: 40px;
- min-height: 40px;
- }
-}
diff --git a/fun-shit/turnips/favicon.ico b/fun-shit/turnips/favicon.ico
deleted file mode 100644
index b06b446..0000000
Binary files a/fun-shit/turnips/favicon.ico and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-128.png b/fun-shit/turnips/img/favicon-128.png
deleted file mode 100644
index 08a2116..0000000
Binary files a/fun-shit/turnips/img/favicon-128.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-152.png b/fun-shit/turnips/img/favicon-152.png
deleted file mode 100644
index 4137fda..0000000
Binary files a/fun-shit/turnips/img/favicon-152.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-167.png b/fun-shit/turnips/img/favicon-167.png
deleted file mode 100644
index cee09d8..0000000
Binary files a/fun-shit/turnips/img/favicon-167.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-180.png b/fun-shit/turnips/img/favicon-180.png
deleted file mode 100644
index 47147bc..0000000
Binary files a/fun-shit/turnips/img/favicon-180.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-192.png b/fun-shit/turnips/img/favicon-192.png
deleted file mode 100644
index 876941d..0000000
Binary files a/fun-shit/turnips/img/favicon-192.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-196.png b/fun-shit/turnips/img/favicon-196.png
deleted file mode 100644
index 1d27fa5..0000000
Binary files a/fun-shit/turnips/img/favicon-196.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-32.png b/fun-shit/turnips/img/favicon-32.png
deleted file mode 100644
index 764bb36..0000000
Binary files a/fun-shit/turnips/img/favicon-32.png and /dev/null differ
diff --git a/fun-shit/turnips/img/favicon-512.png b/fun-shit/turnips/img/favicon-512.png
deleted file mode 100644
index 124adf7..0000000
Binary files a/fun-shit/turnips/img/favicon-512.png and /dev/null differ
diff --git a/fun-shit/turnips/index.html b/fun-shit/turnips/index.html
deleted file mode 100644
index dcaf2e8..0000000
--- a/fun-shit/turnips/index.html
+++ /dev/null
@@ -1,361 +0,0 @@
-
-
-
-
-
-
-
- Animal Crossing - Turnip Prophet
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Turnip Prophet
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Some text some message...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/fun-shit/turnips/js/chart.js b/fun-shit/turnips/js/chart.js
deleted file mode 100644
index 70c2dad..0000000
--- a/fun-shit/turnips/js/chart.js
+++ /dev/null
@@ -1,69 +0,0 @@
-let chart_instance = null;
-
-Chart.defaults.global.defaultFontFamily = "'Varela Round', sans-serif";
-
-const chart_options = {
- elements: {
- line: {
- get backgroundColor() {
- return getComputedStyle(document.documentElement).getPropertyValue('--chart-fill-color');
- },
- get borderColor() {
- return getComputedStyle(document.documentElement).getPropertyValue('--chart-line-color');
- },
- cubicInterpolationMode: "monotone",
- },
- },
- maintainAspectRatio: false,
- tooltips: {
- intersect: false,
- mode: "index",
- },
-};
-
-function update_chart(input_data, possibilities) {
- let ctx = $("#chart"),
- datasets = [{
- label: i18next.t("output.chart.input"),
- get pointBorderColor() {
- return getComputedStyle(document.documentElement).getPropertyValue('--chart-point-color');
- },
- data: input_data.slice(1),
- fill: false,
- }, {
- label: i18next.t("output.chart.minimum"),
- get pointBorderColor() {
- return getComputedStyle(document.documentElement).getPropertyValue('--chart-point-color');
- },
- data: possibilities[0].prices.slice(1).map(day => day.min),
- fill: false,
- }, {
- label: i18next.t("output.chart.maximum"),
- get pointBorderColor() {
- return getComputedStyle(document.documentElement).getPropertyValue('--chart-point-color');
- },
- data: possibilities[0].prices.slice(1).map(day => day.max),
- fill: "-1",
- },
- ],
- labels = [i18next.t("weekdays.sunday")].concat(...[i18next.t("weekdays.abr.monday"), i18next.t("weekdays.abr.tuesday"), i18next.t("weekdays.abr.wednesday"), i18next.t("weekdays.abr.thursday"), i18next.t("weekdays.abr.friday"), i18next.t("weekdays.abr.saturday")].map(
- day => [i18next.t("times.morning"),
- i18next.t("times.afternoon")].map(
- time => `${day} ${time}`)));
-
- if (chart_instance) {
- chart_instance.data.datasets = datasets;
- chart_instance.data.labels = labels;
- chart_instance.options = chart_options;
- chart_instance.update();
- } else {
- chart_instance = new Chart(ctx, {
- data: {
- datasets: datasets,
- labels: labels
- },
- options: chart_options,
- type: "line",
- });
- }
-}
diff --git a/fun-shit/turnips/js/contributors.js b/fun-shit/turnips/js/contributors.js
deleted file mode 100644
index 8961f1e..0000000
--- a/fun-shit/turnips/js/contributors.js
+++ /dev/null
@@ -1,26 +0,0 @@
-function getContributors(page) {
- const PER_PAGE = 100
- if (window.jQuery) {
- const container = $('#contributors');
- jQuery.ajax(`https://api.github.com/repos/mikebryant/ac-nh-turnip-prices/contributors?page=${page}&per_page=${PER_PAGE}`, {})
- .done(function (data) {
- const contributorList = [];
- data.forEach((contributor, idx) => {
- if (idx === 0 && page > 1) {
- contributorList.push(', ');
- }
-
- contributorList.push(`${contributor.login} `);
- if (idx < data.length - 1) {
- contributorList.push(', ');
- }
- });
- container.append(contributorList.join(''));
- // If the length of the data is < PER_PAGE, we know we are processing the last page of data.
- if (data.length < PER_PAGE) return;
- getContributors(page + 1);
- });
- }
-}
-
-$(document).ready(getContributors(1));
diff --git a/fun-shit/turnips/js/predictions.js b/fun-shit/turnips/js/predictions.js
deleted file mode 100644
index eb680b4..0000000
--- a/fun-shit/turnips/js/predictions.js
+++ /dev/null
@@ -1,999 +0,0 @@
-const PATTERN = {
- FLUCTUATING: 0,
- LARGE_SPIKE: 1,
- DECREASING: 2,
- SMALL_SPIKE: 3,
-};
-
-const PROBABILITY_MATRIX = {
- [PATTERN.FLUCTUATING]: {
- [PATTERN.FLUCTUATING]: 0.20,
- [PATTERN.LARGE_SPIKE]: 0.30,
- [PATTERN.DECREASING]: 0.15,
- [PATTERN.SMALL_SPIKE]: 0.35,
- },
- [PATTERN.LARGE_SPIKE]: {
- [PATTERN.FLUCTUATING]: 0.50,
- [PATTERN.LARGE_SPIKE]: 0.05,
- [PATTERN.DECREASING]: 0.20,
- [PATTERN.SMALL_SPIKE]: 0.25,
- },
- [PATTERN.DECREASING]: {
- [PATTERN.FLUCTUATING]: 0.25,
- [PATTERN.LARGE_SPIKE]: 0.45,
- [PATTERN.DECREASING]: 0.05,
- [PATTERN.SMALL_SPIKE]: 0.25,
- },
- [PATTERN.SMALL_SPIKE]: {
- [PATTERN.FLUCTUATING]: 0.45,
- [PATTERN.LARGE_SPIKE]: 0.25,
- [PATTERN.DECREASING]: 0.15,
- [PATTERN.SMALL_SPIKE]: 0.15,
- },
-};
-
-const RATE_MULTIPLIER = 10000;
-
-function range_length(range) {
- return range[1] - range[0];
-}
-
-function clamp(x, min, max) {
- return Math.min(Math.max(x, min), max);
-}
-
-function range_intersect(range1, range2) {
- if (range1[0] > range2[1] || range1[1] < range2[0]) {
- return null;
- }
- return [Math.max(range1[0], range2[0]), Math.min(range1[1], range2[1])];
-}
-
-function range_intersect_length(range1, range2) {
- if (range1[0] > range2[1] || range1[1] < range2[0]) {
- return 0;
- }
- return range_length(range_intersect(range1, range2));
-}
-
-/**
- * Accurately sums a list of floating point numbers.
- * See https://en.wikipedia.org/wiki/Kahan_summation_algorithm#Further_enhancements
- * for more information.
- * @param {number[]} input
- * @returns {number} The sum of the input.
- */
-function float_sum(input) {
- // Uses the improved Kahan–Babuska algorithm introduced by Neumaier.
- let sum = 0;
- // The "lost bits" of sum.
- let c = 0;
- for (let i = 0; i < input.length; i++) {
- const cur = input[i];
- const t = sum + cur;
- if (Math.abs(sum) >= Math.abs(cur)) {
- c += (sum - t) + cur;
- } else {
- c += (cur - t) + sum;
- }
- sum = t;
- }
- return sum + c;
-}
-
-/**
- * Accurately returns the prefix sum of a list of floating point numbers.
- * See https://en.wikipedia.org/wiki/Kahan_summation_algorithm#Further_enhancements
- * for more information.
- * @param {number[]} input
- * @returns {[number, number][]} The prefix sum of the input, such that
- * output[i] = [sum of first i integers, error of the sum].
- * The "true" prefix sum is equal to the sum of the pair of numbers, but it is
- * explicitly returned as a pair of numbers to ensure that the error portion
- * isn't lost when subtracting prefix sums.
- */
-function prefix_float_sum(input) {
- const prefix_sum = [[0, 0]];
- let sum = 0;
- let c = 0;
- for (let i = 0; i < input.length; i++) {
- const cur = input[i];
- const t = sum + cur;
- if (Math.abs(sum) >= Math.abs(cur)) {
- c += (sum - t) + cur;
- } else {
- c += (cur - t) + sum;
- }
- sum = t;
- prefix_sum.push([sum, c]);
- }
- return prefix_sum;
-}
-
-/*
- * Probability Density Function of rates.
- * Since the PDF is continuous*, we approximate it by a discrete probability function:
- * the value in range [x, x + 1) has a uniform probability
- * prob[x - value_start];
- *
- * Note that we operate all rate on the (* RATE_MULTIPLIER) scale.
- *
- * (*): Well not really since it only takes values that "float" can represent in some form, but the
- * space is too large to compute directly in JS.
- */
-class PDF {
- /**
- * Initialize a PDF in range [a, b], a and b can be non-integer.
- * if uniform is true, then initialize the probability to be uniform, else initialize to a
- * all-zero (invalid) PDF.
- * @param {number} a - Left end-point.
- * @param {number} b - Right end-point end-point.
- * @param {boolean} uniform - If true, initialise with the uniform distribution.
- */
- constructor(a, b, uniform = true) {
- // We need to ensure that [a, b] is fully contained in [value_start, value_end].
- /** @type {number} */
- this.value_start = Math.floor(a);
- /** @type {number} */
- this.value_end = Math.ceil(b);
- const range = [a, b];
- const total_length = range_length(range);
- /** @type {number[]} */
- this.prob = Array(this.value_end - this.value_start);
- if (uniform) {
- for (let i = 0; i < this.prob.length; i++) {
- this.prob[i] =
- range_intersect_length(this.range_of(i), range) / total_length;
- }
- }
- }
-
- /**
- * Calculates the interval represented by this.prob[idx]
- * @param {number} idx - The index of this.prob
- * @returns {[number, number]} The interval representing this.prob[idx].
- */
- range_of(idx) {
- // We intentionally include the right end-point of the range.
- // The probability of getting exactly an endpoint is zero, so we can assume
- // the "probability ranges" are "touching".
- return [this.value_start + idx, this.value_start + idx + 1];
- }
-
- min_value() {
- return this.value_start;
- }
-
- max_value() {
- return this.value_end;
- }
-
- /**
- * @returns {number} The sum of probabilities before normalisation.
- */
- normalize() {
- const total_probability = float_sum(this.prob);
- for (let i = 0; i < this.prob.length; i++) {
- this.prob[i] /= total_probability;
- }
- return total_probability;
- }
-
- /*
- * Limit the values to be in the range, and return the probability that the value was in this
- * range.
- */
- range_limit(range) {
- let [start, end] = range;
- start = Math.max(start, this.min_value());
- end = Math.min(end, this.max_value());
- if (start >= end) {
- // Set this to invalid values
- this.value_start = this.value_end = 0;
- this.prob = [];
- return 0;
- }
- start = Math.floor(start);
- end = Math.ceil(end);
-
- const start_idx = start - this.value_start;
- const end_idx = end - this.value_start;
- for (let i = start_idx; i < end_idx; i++) {
- this.prob[i] *= range_intersect_length(this.range_of(i), range);
- }
-
- this.prob = this.prob.slice(start_idx, end_idx);
- this.value_start = start;
- this.value_end = end;
-
- // The probability that the value was in this range is equal to the total
- // sum of "un-normalised" values in the range.
- return this.normalize();
- }
-
- /**
- * Subtract the PDF by a uniform distribution in [rate_decay_min, rate_decay_max]
- *
- * For simplicity, we assume that rate_decay_min and rate_decay_max are both integers.
- * @param {number} rate_decay_min
- * @param {number} rate_decay_max
- * @returns {void}
- */
- decay(rate_decay_min, rate_decay_max) {
- // In case the arguments aren't integers, round them to the nearest integer.
- rate_decay_min = Math.round(rate_decay_min);
- rate_decay_max = Math.round(rate_decay_max);
- // The sum of this distribution with a uniform distribution.
- // Let's assume that both distributions start at 0 and X = this dist,
- // Y = uniform dist, and Z = X + Y.
- // Let's also assume that X is a "piecewise uniform" distribution, so
- // x(i) = this.prob[Math.floor(i)] - which matches our implementation.
- // We also know that y(i) = 1 / max(Y) - as we assume that min(Y) = 0.
- // In the end, we're interested in:
- // Pr(i <= Z < i+1) where i is an integer
- // = int. x(val) * Pr(i-val <= Y < i-val+1) dval from 0 to max(X)
- // = int. x(floor(val)) * Pr(i-val <= Y < i-val+1) dval from 0 to max(X)
- // = sum val from 0 to max(X)-1
- // x(val) * f_i(val) / max(Y)
- // where f_i(val) =
- // 0.5 if i-val = 0 or max(Y), so val = i-max(Y) or i
- // 1.0 if 0 < i-val < max(Y), so i-max(Y) < val < i
- // as x(val) is "constant" for each integer step, so we can consider the
- // integral in integer steps.
- // = sum val from max(0, i-max(Y)) to min(max(X)-1, i)
- // x(val) * f_i(val) / max(Y)
- // for example, max(X)=1, max(Y)=10, i=5
- // = sum val from max(0, 5-10)=0 to min(1-1, 5)=0
- // x(val) * f_i(val) / max(Y)
- // = x(0) * 1 / 10
-
- // Get a prefix sum / CDF of this so we can calculate sums in O(1).
- const prefix = prefix_float_sum(this.prob);
- const max_X = this.prob.length;
- const max_Y = rate_decay_max - rate_decay_min;
- const newProb = Array(this.prob.length + max_Y);
- for (let i = 0; i < newProb.length; i++) {
- // Note that left and right here are INCLUSIVE.
- const left = Math.max(0, i - max_Y);
- const right = Math.min(max_X - 1, i);
- // We want to sum, in total, prefix[right+1], -prefix[left], and subtract
- // the 0.5s if necessary.
- // This may involve numbers of differing magnitudes, so use the float sum
- // algorithm to sum these up.
- const numbers_to_sum = [
- prefix[right + 1][0], prefix[right + 1][1],
- -prefix[left][0], -prefix[left][1],
- ];
- if (left === i-max_Y) {
- // Need to halve the left endpoint.
- numbers_to_sum.push(-this.prob[left] / 2);
- }
- if (right === i) {
- // Need to halve the right endpoint.
- // It's guaranteed that we won't accidentally "halve" twice,
- // as that would require i-max_Y = i, so max_Y = 0 - which is
- // impossible.
- numbers_to_sum.push(-this.prob[right] / 2);
- }
- newProb[i] = float_sum(numbers_to_sum) / max_Y;
- }
-
- this.prob = newProb;
- this.value_start -= rate_decay_max;
- this.value_end -= rate_decay_min;
- // No need to normalise, as it is guaranteed that the sum of this.prob is 1.
- }
-}
-
-class Predictor {
-
- constructor(prices, first_buy, previous_pattern) {
- // The reverse-engineered code is not perfectly accurate, especially as it's not
- // 32-bit ARM floating point. So, be tolerant of slightly unexpected inputs
- this.fudge_factor = 0;
- this.prices = prices;
- this.first_buy = first_buy;
- this.previous_pattern = previous_pattern;
- }
-
- intceil(val) {
- return Math.trunc(val + 0.99999);
- }
-
- minimum_rate_from_given_and_base(given_price, buy_price) {
- return RATE_MULTIPLIER * (given_price - 0.99999) / buy_price;
- }
-
- maximum_rate_from_given_and_base(given_price, buy_price) {
- return RATE_MULTIPLIER * (given_price + 0.00001) / buy_price;
- }
-
- rate_range_from_given_and_base(given_price, buy_price) {
- return [
- this.minimum_rate_from_given_and_base(given_price, buy_price),
- this.maximum_rate_from_given_and_base(given_price, buy_price)
- ];
- }
-
- get_price(rate, basePrice) {
- return this.intceil(rate * basePrice / RATE_MULTIPLIER);
- }
-
- * multiply_generator_probability(generator, probability) {
- for (const it of generator) {
- yield {...it, probability: it.probability * probability};
- }
- }
-
- /*
- * This corresponds to the code:
- * for (int i = start; i < start + length; i++)
- * {
- * sellPrices[work++] =
- * intceil(randfloat(rate_min / RATE_MULTIPLIER, rate_max / RATE_MULTIPLIER) * basePrice);
- * }
- *
- * Would return the conditional probability given the given_prices, and modify
- * the predicted_prices array.
- * If the given_prices won't match, returns 0.
- */
- generate_individual_random_price(
- given_prices, predicted_prices, start, length, rate_min, rate_max) {
- rate_min *= RATE_MULTIPLIER;
- rate_max *= RATE_MULTIPLIER;
-
- const buy_price = given_prices[0];
- const rate_range = [rate_min, rate_max];
- let prob = 1;
-
- for (let i = start; i < start + length; i++) {
- let min_pred = this.get_price(rate_min, buy_price);
- let max_pred = this.get_price(rate_max, buy_price);
- if (!isNaN(given_prices[i])) {
- if (given_prices[i] < min_pred - this.fudge_factor || given_prices[i] > max_pred + this.fudge_factor) {
- // Given price is out of predicted range, so this is the wrong pattern
- return 0;
- }
- // TODO: How to deal with probability when there's fudge factor?
- // Clamp the value to be in range now so the probability won't be totally biased to fudged values.
- const real_rate_range =
- this.rate_range_from_given_and_base(clamp(given_prices[i], min_pred, max_pred), buy_price);
- prob *= range_intersect_length(rate_range, real_rate_range) /
- range_length(rate_range);
- min_pred = given_prices[i];
- max_pred = given_prices[i];
- }
-
- predicted_prices.push({
- min: min_pred,
- max: max_pred,
- });
- }
- return prob;
- }
-
- /*
- * This corresponds to the code:
- * rate = randfloat(start_rate_min, start_rate_max);
- * for (int i = start; i < start + length; i++)
- * {
- * sellPrices[work++] = intceil(rate * basePrice);
- * rate -= randfloat(rate_decay_min, rate_decay_max);
- * }
- *
- * Would return the conditional probability given the given_prices, and modify
- * the predicted_prices array.
- * If the given_prices won't match, returns 0.
- */
- generate_decreasing_random_price(
- given_prices, predicted_prices, start, length, start_rate_min,
- start_rate_max, rate_decay_min, rate_decay_max) {
- start_rate_min *= RATE_MULTIPLIER;
- start_rate_max *= RATE_MULTIPLIER;
- rate_decay_min *= RATE_MULTIPLIER;
- rate_decay_max *= RATE_MULTIPLIER;
-
- const buy_price = given_prices[0];
- let rate_pdf = new PDF(start_rate_min, start_rate_max);
- let prob = 1;
-
- for (let i = start; i < start + length; i++) {
- let min_pred = this.get_price(rate_pdf.min_value(), buy_price);
- let max_pred = this.get_price(rate_pdf.max_value(), buy_price);
- if (!isNaN(given_prices[i])) {
- if (given_prices[i] < min_pred - this.fudge_factor || given_prices[i] > max_pred + this.fudge_factor) {
- // Given price is out of predicted range, so this is the wrong pattern
- return 0;
- }
- // TODO: How to deal with probability when there's fudge factor?
- // Clamp the value to be in range now so the probability won't be totally biased to fudged values.
- const real_rate_range =
- this.rate_range_from_given_and_base(clamp(given_prices[i], min_pred, max_pred), buy_price);
- prob *= rate_pdf.range_limit(real_rate_range);
- if (prob == 0) {
- return 0;
- }
- min_pred = given_prices[i];
- max_pred = given_prices[i];
- }
-
- predicted_prices.push({
- min: min_pred,
- max: max_pred,
- });
-
- rate_pdf.decay(rate_decay_min, rate_decay_max);
- }
- return prob;
- }
-
-
- /*
- * This corresponds to the code:
- * rate = randfloat(rate_min, rate_max);
- * sellPrices[work++] = intceil(randfloat(rate_min, rate) * basePrice) - 1;
- * sellPrices[work++] = intceil(rate * basePrice);
- * sellPrices[work++] = intceil(randfloat(rate_min, rate) * basePrice) - 1;
- *
- * Would return the conditional probability given the given_prices, and modify
- * the predicted_prices array.
- * If the given_prices won't match, returns 0.
- */
- generate_peak_price(
- given_prices, predicted_prices, start, rate_min, rate_max) {
- rate_min *= RATE_MULTIPLIER;
- rate_max *= RATE_MULTIPLIER;
-
- const buy_price = given_prices[0];
- let prob = 1;
- let rate_range = [rate_min, rate_max];
-
- // * Calculate the probability first.
- // Prob(middle_price)
- const middle_price = given_prices[start + 1];
- if (!isNaN(middle_price)) {
- const min_pred = this.get_price(rate_min, buy_price);
- const max_pred = this.get_price(rate_max, buy_price);
- if (middle_price < min_pred - this.fudge_factor || middle_price > max_pred + this.fudge_factor) {
- // Given price is out of predicted range, so this is the wrong pattern
- return 0;
- }
- // TODO: How to deal with probability when there's fudge factor?
- // Clamp the value to be in range now so the probability won't be totally biased to fudged values.
- const real_rate_range =
- this.rate_range_from_given_and_base(clamp(middle_price, min_pred, max_pred), buy_price);
- prob *= range_intersect_length(rate_range, real_rate_range) /
- range_length(rate_range);
- if (prob == 0) {
- return 0;
- }
-
- rate_range = range_intersect(rate_range, real_rate_range);
- }
-
- const left_price = given_prices[start];
- const right_price = given_prices[start + 2];
- // Prob(left_price | middle_price), Prob(right_price | middle_price)
- //
- // A = rate_range[0], B = rate_range[1], C = rate_min, X = rate, Y = randfloat(rate_min, rate)
- // rate = randfloat(A, B); sellPrices[work++] = intceil(randfloat(C, rate) * basePrice) - 1;
- //
- // => X->U(A,B), Y->U(C,X), Y-C->U(0,X-C), Y-C->U(0,1)*(X-C), Y-C->U(0,1)*U(A-C,B-C),
- // let Z=Y-C, Z1=A-C, Z2=B-C, Z->U(0,1)*U(Z1,Z2)
- // Prob(Z<=t) = integral_{x=0}^{1} [min(t/x,Z2)-min(t/x,Z1)]/ (Z2-Z1)
- // let F(t, ZZ) = integral_{x=0}^{1} min(t/x, ZZ)
- // 1. if ZZ < t, then min(t/x, ZZ) = ZZ -> F(t, ZZ) = ZZ
- // 2. if ZZ >= t, then F(t, ZZ) = integral_{x=0}^{t/ZZ} ZZ + integral_{x=t/ZZ}^{1} t/x
- // = t - t log(t/ZZ)
- // Prob(Z<=t) = (F(t, Z2) - F(t, Z1)) / (Z2 - Z1)
- // Prob(Y<=t) = Prob(Z>=t-C)
- for (const price of [left_price, right_price]) {
- if (isNaN(price)) {
- continue;
- }
- const min_pred = this.get_price(rate_min, buy_price) - 1;
- const max_pred = this.get_price(rate_range[1], buy_price) - 1;
- if (price < min_pred - this.fudge_factor || price > max_pred + this.fudge_factor) {
- // Given price is out of predicted range, so this is the wrong pattern
- return 0;
- }
- // TODO: How to deal with probability when there's fudge factor?
- // Clamp the value to be in range now so the probability won't be totally biased to fudged values.
- const rate2_range = this.rate_range_from_given_and_base(clamp(price, min_pred, max_pred)+ 1, buy_price);
- const F = (t, ZZ) => {
- if (t <= 0) {
- return 0;
- }
- return ZZ < t ? ZZ : t - t * (Math.log(t) - Math.log(ZZ));
- };
- const [A, B] = rate_range;
- const C = rate_min;
- const Z1 = A - C;
- const Z2 = B - C;
- const PY = (t) => (F(t - C, Z2) - F(t - C, Z1)) / (Z2 - Z1);
- prob *= PY(rate2_range[1]) - PY(rate2_range[0]);
- if (prob == 0) {
- return 0;
- }
- }
-
- // * Then generate the real predicted range.
- // We're doing things in different order then how we calculate probability,
- // since forward prediction is more useful here.
- //
- // Main spike 1
- let min_pred = this.get_price(rate_min, buy_price) - 1;
- let max_pred = this.get_price(rate_max, buy_price) - 1;
- if (!isNaN(given_prices[start])) {
- min_pred = given_prices[start];
- max_pred = given_prices[start];
- }
- predicted_prices.push({
- min: min_pred,
- max: max_pred,
- });
-
- // Main spike 2
- min_pred = predicted_prices[start].min;
- max_pred = this.get_price(rate_max, buy_price);
- if (!isNaN(given_prices[start + 1])) {
- min_pred = given_prices[start + 1];
- max_pred = given_prices[start + 1];
- }
- predicted_prices.push({
- min: min_pred,
- max: max_pred,
- });
-
- // Main spike 3
- min_pred = this.get_price(rate_min, buy_price) - 1;
- max_pred = predicted_prices[start + 1].max - 1;
- if (!isNaN(given_prices[start + 2])) {
- min_pred = given_prices[start + 2];
- max_pred = given_prices[start + 2];
- }
- predicted_prices.push({
- min: min_pred,
- max: max_pred,
- });
-
- return prob;
- }
-
- * generate_pattern_0_with_lengths(
- given_prices, high_phase_1_len, dec_phase_1_len, high_phase_2_len,
- dec_phase_2_len, high_phase_3_len) {
- /*
- // PATTERN 0: high, decreasing, high, decreasing, high
- work = 2;
- // high phase 1
- for (int i = 0; i < hiPhaseLen1; i++)
- {
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- }
- // decreasing phase 1
- rate = randfloat(0.8, 0.6);
- for (int i = 0; i < decPhaseLen1; i++)
- {
- sellPrices[work++] = intceil(rate * basePrice);
- rate -= 0.04;
- rate -= randfloat(0, 0.06);
- }
- // high phase 2
- for (int i = 0; i < (hiPhaseLen2and3 - hiPhaseLen3); i++)
- {
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- }
- // decreasing phase 2
- rate = randfloat(0.8, 0.6);
- for (int i = 0; i < decPhaseLen2; i++)
- {
- sellPrices[work++] = intceil(rate * basePrice);
- rate -= 0.04;
- rate -= randfloat(0, 0.06);
- }
- // high phase 3
- for (int i = 0; i < hiPhaseLen3; i++)
- {
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- }
- */
-
- const buy_price = given_prices[0];
- const predicted_prices = [
- {
- min: buy_price,
- max: buy_price,
- },
- {
- min: buy_price,
- max: buy_price,
- },
- ];
- let probability = 1;
-
- // High Phase 1
- probability *= this.generate_individual_random_price(
- given_prices, predicted_prices, 2, high_phase_1_len, 0.9, 1.4);
- if (probability == 0) {
- return;
- }
-
- // Dec Phase 1
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices, 2 + high_phase_1_len, dec_phase_1_len,
- 0.6, 0.8, 0.04, 0.1);
- if (probability == 0) {
- return;
- }
-
- // High Phase 2
- probability *= this.generate_individual_random_price(given_prices, predicted_prices,
- 2 + high_phase_1_len + dec_phase_1_len, high_phase_2_len, 0.9, 1.4);
- if (probability == 0) {
- return;
- }
-
- // Dec Phase 2
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices,
- 2 + high_phase_1_len + dec_phase_1_len + high_phase_2_len,
- dec_phase_2_len, 0.6, 0.8, 0.04, 0.1);
- if (probability == 0) {
- return;
- }
-
- // High Phase 3
- if (2 + high_phase_1_len + dec_phase_1_len + high_phase_2_len + dec_phase_2_len + high_phase_3_len != 14) {
- throw new Error("Phase lengths don't add up");
- }
-
- const prev_length = 2 + high_phase_1_len + dec_phase_1_len +
- high_phase_2_len + dec_phase_2_len;
- probability *= this.generate_individual_random_price(
- given_prices, predicted_prices, prev_length, 14 - prev_length, 0.9, 1.4);
- if (probability == 0) {
- return;
- }
-
- yield {
- pattern_number: 0,
- prices: predicted_prices,
- probability,
- };
- }
-
- * generate_pattern_0(given_prices) {
- /*
- decPhaseLen1 = randbool() ? 3 : 2;
- decPhaseLen2 = 5 - decPhaseLen1;
- hiPhaseLen1 = randint(0, 6);
- hiPhaseLen2and3 = 7 - hiPhaseLen1;
- hiPhaseLen3 = randint(0, hiPhaseLen2and3 - 1);
- */
- for (var dec_phase_1_len = 2; dec_phase_1_len < 4; dec_phase_1_len++) {
- for (var high_phase_1_len = 0; high_phase_1_len < 7; high_phase_1_len++) {
- for (var high_phase_3_len = 0; high_phase_3_len < (7 - high_phase_1_len - 1 + 1); high_phase_3_len++) {
- yield* this.multiply_generator_probability(
- this.generate_pattern_0_with_lengths(given_prices, high_phase_1_len, dec_phase_1_len, 7 - high_phase_1_len - high_phase_3_len, 5 - dec_phase_1_len, high_phase_3_len),
- 1 / (4 - 2) / 7 / (7 - high_phase_1_len));
- }
- }
- }
- }
-
- * generate_pattern_1_with_peak(given_prices, peak_start) {
- /*
- // PATTERN 1: decreasing middle, high spike, random low
- peakStart = randint(3, 9);
- rate = randfloat(0.9, 0.85);
- for (work = 2; work < peakStart; work++)
- {
- sellPrices[work] = intceil(rate * basePrice);
- rate -= 0.03;
- rate -= randfloat(0, 0.02);
- }
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- sellPrices[work++] = intceil(randfloat(1.4, 2.0) * basePrice);
- sellPrices[work++] = intceil(randfloat(2.0, 6.0) * basePrice);
- sellPrices[work++] = intceil(randfloat(1.4, 2.0) * basePrice);
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- for (; work < 14; work++)
- {
- sellPrices[work] = intceil(randfloat(0.4, 0.9) * basePrice);
- }
- */
-
- const buy_price = given_prices[0];
- const predicted_prices = [
- {
- min: buy_price,
- max: buy_price,
- },
- {
- min: buy_price,
- max: buy_price,
- },
- ];
- let probability = 1;
-
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices, 2, peak_start - 2, 0.85, 0.9, 0.03, 0.05);
- if (probability == 0) {
- return;
- }
-
- // Now each day is independent of next
- let min_randoms = [0.9, 1.4, 2.0, 1.4, 0.9, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4];
- let max_randoms = [1.4, 2.0, 6.0, 2.0, 1.4, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9];
- for (let i = peak_start; i < 14; i++) {
- probability *= this.generate_individual_random_price(
- given_prices, predicted_prices, i, 1, min_randoms[i - peak_start],
- max_randoms[i - peak_start]);
- if (probability == 0) {
- return;
- }
- }
- yield {
- pattern_number: 1,
- prices: predicted_prices,
- probability,
- };
- }
-
- * generate_pattern_1(given_prices) {
- for (var peak_start = 3; peak_start < 10; peak_start++) {
- yield* this.multiply_generator_probability(this.generate_pattern_1_with_peak(given_prices, peak_start), 1 / (10 - 3));
- }
- }
-
- * generate_pattern_2(given_prices) {
- /*
- // PATTERN 2: consistently decreasing
- rate = 0.9;
- rate -= randfloat(0, 0.05);
- for (work = 2; work < 14; work++)
- {
- sellPrices[work] = intceil(rate * basePrice);
- rate -= 0.03;
- rate -= randfloat(0, 0.02);
- }
- break;
- */
-
- const buy_price = given_prices[0];
- const predicted_prices = [
- {
- min: buy_price,
- max: buy_price,
- },
- {
- min: buy_price,
- max: buy_price,
- },
- ];
- let probability = 1;
-
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices, 2, 14 - 2, 0.85, 0.9, 0.03, 0.05);
- if (probability == 0) {
- return;
- }
-
- yield {
- pattern_number: 2,
- prices: predicted_prices,
- probability,
- };
- }
-
- * generate_pattern_3_with_peak(given_prices, peak_start) {
-
- /*
- // PATTERN 3: decreasing, spike, decreasing
- peakStart = randint(2, 9);
- // decreasing phase before the peak
- rate = randfloat(0.9, 0.4);
- for (work = 2; work < peakStart; work++)
- {
- sellPrices[work] = intceil(rate * basePrice);
- rate -= 0.03;
- rate -= randfloat(0, 0.02);
- }
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * (float)basePrice);
- sellPrices[work++] = intceil(randfloat(0.9, 1.4) * basePrice);
- rate = randfloat(1.4, 2.0);
- sellPrices[work++] = intceil(randfloat(1.4, rate) * basePrice) - 1;
- sellPrices[work++] = intceil(rate * basePrice);
- sellPrices[work++] = intceil(randfloat(1.4, rate) * basePrice) - 1;
- // decreasing phase after the peak
- if (work < 14)
- {
- rate = randfloat(0.9, 0.4);
- for (; work < 14; work++)
- {
- sellPrices[work] = intceil(rate * basePrice);
- rate -= 0.03;
- rate -= randfloat(0, 0.02);
- }
- }
- */
-
- const buy_price = given_prices[0];
- const predicted_prices = [
- {
- min: buy_price,
- max: buy_price,
- },
- {
- min: buy_price,
- max: buy_price,
- },
- ];
- let probability = 1;
-
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices, 2, peak_start - 2, 0.4, 0.9, 0.03, 0.05);
- if (probability == 0) {
- return;
- }
-
- // The peak
- probability *= this.generate_individual_random_price(
- given_prices, predicted_prices, peak_start, 2, 0.9, 1.4);
- if (probability == 0) {
- return;
- }
-
- probability *= this.generate_peak_price(
- given_prices, predicted_prices, peak_start + 2, 1.4, 2.0);
- if (probability == 0) {
- return;
- }
-
- if (peak_start + 5 < 14) {
- probability *= this.generate_decreasing_random_price(
- given_prices, predicted_prices, peak_start + 5, 14 - (peak_start + 5),
- 0.4, 0.9, 0.03, 0.05);
- if (probability == 0) {
- return;
- }
- }
-
- yield {
- pattern_number: 3,
- prices: predicted_prices,
- probability,
- };
- }
-
- * generate_pattern_3(given_prices) {
- for (let peak_start = 2; peak_start < 10; peak_start++) {
- yield* this.multiply_generator_probability(this.generate_pattern_3_with_peak(given_prices, peak_start), 1 / (10 - 2));
- }
- }
-
- get_transition_probability(previous_pattern) {
- if (typeof previous_pattern === 'undefined' || Number.isNaN(previous_pattern) || previous_pattern === null || previous_pattern < 0 || previous_pattern > 3) {
- // Use the steady state probabilities of PROBABILITY_MATRIX if we don't
- // know what the previous pattern was.
- // See https://github.com/mikebryant/ac-nh-turnip-prices/issues/68
- // and https://github.com/mikebryant/ac-nh-turnip-prices/pull/90
- // for more information.
- return [4530/13082, 3236/13082, 1931/13082, 3385/13082];
- }
-
- return PROBABILITY_MATRIX[previous_pattern];
- }
-
- * generate_all_patterns(sell_prices, previous_pattern) {
- const generate_pattern_fns = [this.generate_pattern_0, this.generate_pattern_1, this.generate_pattern_2, this.generate_pattern_3];
- const transition_probability = this.get_transition_probability(previous_pattern);
-
- for (let i = 0; i < 4; i++) {
- yield* this.multiply_generator_probability(generate_pattern_fns[i].bind(this)(sell_prices), transition_probability[i]);
- }
- }
-
- * generate_possibilities(sell_prices, first_buy, previous_pattern) {
- if (first_buy || isNaN(sell_prices[0])) {
- for (var buy_price = 90; buy_price <= 110; buy_price++) {
- const temp_sell_prices = sell_prices.slice();
- temp_sell_prices[0] = temp_sell_prices[1] = buy_price;
- if (first_buy) {
- yield* this.generate_pattern_3(temp_sell_prices);
- } else {
- // All buy prices are equal probability and we're at the outmost layer,
- // so don't need to multiply_generator_probability here.
- yield* this.generate_all_patterns(temp_sell_prices, previous_pattern);
- }
- }
- } else {
- yield* this.generate_all_patterns(sell_prices, previous_pattern);
- }
- }
-
- analyze_possibilities() {
- const sell_prices = this.prices;
- const first_buy = this.first_buy;
- const previous_pattern = this.previous_pattern;
- let generated_possibilities = [];
- for (let i = 0; i < 6; i++) {
- this.fudge_factor = i;
- generated_possibilities = Array.from(this.generate_possibilities(sell_prices, first_buy, previous_pattern));
- if (generated_possibilities.length > 0) {
- console.log("Generated possibilities using fudge factor %d: ", i, generated_possibilities);
- break;
- }
- }
-
- const total_probability = generated_possibilities.reduce((acc, it) => acc + it.probability, 0);
- for (const it of generated_possibilities) {
- it.probability /= total_probability;
- }
-
- for (let poss of generated_possibilities) {
- var weekMins = [];
- var weekMaxes = [];
- for (let day of poss.prices.slice(2)) {
- // Check for a future date by checking for a range of prices
- if(day.min !== day.max){
- weekMins.push(day.min);
- weekMaxes.push(day.max);
- } else {
- // If we find a set price after one or more ranged prices, the user has missed a day. Discard that data and start again.
- weekMins = [];
- weekMaxes = [];
- }
- }
- if (!weekMins.length && !weekMaxes.length) {
- weekMins.push(poss.prices[poss.prices.length -1].min);
- weekMaxes.push(poss.prices[poss.prices.length -1].max);
- }
- poss.weekGuaranteedMinimum = Math.max(...weekMins);
- poss.weekMax = Math.max(...weekMaxes);
- }
-
- let category_totals = {};
- for (let i of [0, 1, 2, 3]) {
- category_totals[i] = generated_possibilities
- .filter(value => value.pattern_number == i)
- .map(value => value.probability)
- .reduce((previous, current) => previous + current, 0);
- }
-
- for (let pos of generated_possibilities) {
- pos.category_total_probability = category_totals[pos.pattern_number];
- }
-
- generated_possibilities.sort((a, b) => {
- return b.category_total_probability - a.category_total_probability || b.probability - a.probability;
- });
-
- let global_min_max = [];
- for (let day = 0; day < 14; day++) {
- const prices = {
- min: 999,
- max: 0,
- };
- for (let poss of generated_possibilities) {
- if (poss.prices[day].min < prices.min) {
- prices.min = poss.prices[day].min;
- }
- if (poss.prices[day].max > prices.max) {
- prices.max = poss.prices[day].max;
- }
- }
- global_min_max.push(prices);
- }
-
- generated_possibilities.unshift({
- pattern_number: 4,
- prices: global_min_max,
- weekGuaranteedMinimum: Math.min(...generated_possibilities.map(poss => poss.weekGuaranteedMinimum)),
- weekMax: Math.max(...generated_possibilities.map(poss => poss.weekMax))
- });
-
- return generated_possibilities;
- }
-}
diff --git a/fun-shit/turnips/js/scripts.js b/fun-shit/turnips/js/scripts.js
deleted file mode 100644
index 01f6e19..0000000
--- a/fun-shit/turnips/js/scripts.js
+++ /dev/null
@@ -1,418 +0,0 @@
-//Reusable Fields
-const getSellFields = function () {
- let fields = [];
- var now = new Date();
- for (var i = 2; i < 14; i++) {
- fields.push($("#sell_" + i)[0]);
- if (i == now.getDay() * 2 + (now.getHours() >= 12 ? 1 : 0)) {
- fields[fields.length - 1].classList.add("now");
- }
- }
- if (now.getDay() == 0) {
- buy_input[0].classList.add("now");
- }
- return fields;
-};
-
-const getFirstBuyRadios = function () {
- return [
- $("#first-time-radio-no")[0],
- $("#first-time-radio-yes")[0]
- ];
-};
-
-const getPreviousPatternRadios = function () {
- return [
- $("#pattern-radio-unknown")[0],
- $("#pattern-radio-fluctuating")[0],
- $("#pattern-radio-small-spike")[0],
- $("#pattern-radio-large-spike")[0],
- $("#pattern-radio-decreasing")[0]
- ];
-};
-
-const getCheckedRadio = function (radio_array) {
- return radio_array.find(radio => radio.checked === true).value;
-};
-
-const checkRadioByValue = function (radio_array, value) {
- if (value === null) {
- return;
- }
- value = value.toString();
- radio_array.find(radio => radio.value == value).checked = true;
-};
-
-const state = {
- initialized: false,
-};
-
-const buy_input = $("#buy");
-const sell_inputs = getSellFields();
-const first_buy_radios = getFirstBuyRadios();
-const previous_pattern_radios = getPreviousPatternRadios();
-const permalink_input = $('#permalink-input');
-const permalink_button = $('#permalink-btn');
-const snackbar = $('#snackbar');
-
-//Functions
-const fillFields = function (prices, first_buy, previous_pattern) {
- checkRadioByValue(first_buy_radios, first_buy);
- checkRadioByValue(previous_pattern_radios, previous_pattern);
-
- buy_input.focus();
- buy_input.val(prices[0] || '');
- buy_input.blur();
- const sell_prices = prices.slice(2);
-
- sell_prices.forEach((price, index) => {
- if (!price) {
- return;
- } else {
- const element = $("#sell_" + (index + 2));
- element.focus();
- element.val(price);
- element.blur();
- }
- });
-};
-
-const initialize = function () {
- try {
- const previous = getPrevious();
- const first_buy = previous[0];
- const previous_pattern = previous[1];
- const prices = previous[2];
- if (prices === null) {
- fillFields([], first_buy, previous_pattern);
- } else {
- fillFields(prices, first_buy, previous_pattern);
- }
- } catch (e) {
- console.error(e);
- }
-
- $(document).trigger("input");
-
- $("#permalink-btn").on("click", copyPermalink);
-
- $("#reset").on("click", function () {
- if (window.confirm(i18next.t("prices.reset-warning"))) {
- sell_inputs.forEach(input => input.value = '');
- fillFields([], false, -1);
- update();
- }
- });
-
- console.log('finished initializing');
- state.initialized = true;
-};
-
-const updateLocalStorage = function (prices, first_buy, previous_pattern) {
- try {
- if (prices.length !== 14) throw "The data array needs exactly 14 elements to be valid";
- localStorage.setItem("sell_prices", JSON.stringify(prices));
- localStorage.setItem("first_buy", JSON.stringify(first_buy));
- localStorage.setItem("previous_pattern", JSON.stringify(previous_pattern));
- } catch (e) {
- console.error(e);
- }
-};
-
-const isEmpty = function (arr) {
- const filtered = arr.filter(value => value !== null && value !== '' && !isNaN(value));
- return filtered.length == 0;
-};
-
-const getFirstBuyStateFromQuery = function (param) {
- try {
- const params = new URLSearchParams(window.location.search.substr(1));
- const firstbuy_str = params.get(param);
-
- if (firstbuy_str == null) {
- return null;
- }
-
- firstbuy = null;
- if (firstbuy_str == "1" || firstbuy_str == "yes" || firstbuy_str == "true") {
- firstbuy = true;
- } else if (firstbuy_str == "0" || firstbuy_str == "no" || firstbuy_str == "false") {
- firstbuy = false;
- }
-
- return firstbuy;
-
- } catch (e) {
- return null;
- }
-};
-
-const getFirstBuyStateFromLocalstorage = function () {
- return JSON.parse(localStorage.getItem('first_buy'));
-};
-
-const getPreviousPatternStateFromLocalstorage = function () {
- return JSON.parse(localStorage.getItem('previous_pattern'));
-};
-
-const getPreviousPatternStateFromQuery = function (param) {
- try {
- const params = new URLSearchParams(window.location.search.substr(1));
- const pattern_str = params.get(param);
-
- if (pattern_str == null) {
- return null;
- }
-
- if (pattern_str == "0" || pattern_str == "fluctuating") {
- pattern = 0;
- } else if (pattern_str == "1" || pattern_str == "large-spike") {
- pattern = 1;
- } else if (pattern_str == "2" || pattern_str == "decreasing") {
- pattern = 2;
- } else if (pattern_str == "3" || pattern_str == "small-spike") {
- pattern = 3;
- } else {
- pattern = -1;
- }
-
- return pattern;
-
- } catch (e) {
- return null;
- }
-};
-
-const getPricesFromLocalstorage = function () {
- try {
- const sell_prices = JSON.parse(localStorage.getItem("sell_prices"));
-
- if (!Array.isArray(sell_prices) || sell_prices.length !== 14) {
- return null;
- }
-
- return sell_prices;
- } catch (e) {
- return null;
- }
-};
-
-const getPricesFromQuery = function (param) {
- try {
- const params = new URLSearchParams(window.location.search.substr(1));
- const sell_prices = params.get(param).split(".").map((x) => parseInt(x, 10));
-
- if (!Array.isArray(sell_prices)) {
- return null;
- }
-
- // Parse the array which is formatted like: [price, M-AM, M-PM, T-AM, T-PM, W-AM, W-PM, Th-AM, Th-PM, F-AM, F-PM, S-AM, S-PM, Su-AM, Su-PM]
- // due to the format of local storage we need to double up the price at the start of the array.
- sell_prices.unshift(sell_prices[0]);
-
- // This allows us to fill out the missing fields at the end of the array
- for (let i = sell_prices.length; i < 14; i++) {
- sell_prices.push(0);
- }
-
- return sell_prices;
- } catch (e) {
- return null;
- }
-};
-
-const getPreviousFromQuery = function () {
- /* Check if valid prices are entered. Exit immediately if not. */
- const prices = getPricesFromQuery("prices");
- if (prices == null) {
- return null;
- }
-
- console.log("Using data from query.");
- window.populated_from_query = true;
- return [
- getFirstBuyStateFromQuery("first"),
- getPreviousPatternStateFromQuery("pattern"),
- prices
- ];
-};
-
-const getPreviousFromLocalstorage = function () {
- return [
- getFirstBuyStateFromLocalstorage(),
- getPreviousPatternStateFromLocalstorage(),
- getPricesFromLocalstorage()
- ];
-};
-
-
-/**
- * Gets previous values. First tries to parse parameters,
- * if none of them match then it looks in local storage.
- * @return {[first time, previous pattern, prices]}
- */
-const getPrevious = function () {
- return getPreviousFromQuery() || getPreviousFromLocalstorage();
-};
-
-const getSellPrices = function () {
- //Checks all sell inputs and returns an array with their values
- return res = sell_inputs.map(function (input) {
- return parseInt(input.value || '');
- });
-};
-
-const getPriceClass = function(buy_price, max) {
- const priceBrackets = [200, 30, 0, -30, -99];
- let diff = max - buy_price;
- for(var i=0; i= priceBrackets[i]) {
- return "range" + i;
- }
- }
- return "";
-};
-
-const displayPercentage = function(fraction) {
- if (Number.isFinite(fraction)) {
- let percent = fraction * 100;
- if (percent >= 1) {
- return percent.toPrecision(3) + '%';
- } else if (percent >= 0.01) {
- return percent.toFixed(2) + '%';
- } else {
- return '<0.01%';
- }
- } else {
- return '—';
- }
-};
-
-const hideChart = function() {
- $("#output").html("");
- $(".chart-wrapper").hide()
-}
-
-const calculateOutput = function (data, first_buy, previous_pattern) {
- if (isEmpty(data)) {
- hideChart()
- return;
- }
- let pat_desc = {0:"fluctuating", 1:"large-spike", 2:"decreasing", 3:"small-spike", 4:"all"};
- let output_possibilities = "";
- let predictor = new Predictor(data, first_buy, previous_pattern);
- let analyzed_possibilities = predictor.analyze_possibilities();
- if (analyzed_possibilities[0].weekGuaranteedMinimum === Number.POSITIVE_INFINITY) {
- hideChart()
- $(".error:hidden").show()
- return;
- }
- $(".error:visible").hide()
- $(".chart-wrapper:hidden").show()
- let buy_price = parseInt(buy_input.val());
- previous_pattern_number = "";
- for (let poss of analyzed_possibilities) {
- var out_line = "" + i18next.t("patterns." + pat_desc[poss.pattern_number]) + " ";
- const style_price = buy_price || poss.prices[0].min;
- if (previous_pattern_number != poss.pattern_number) {
- previous_pattern_number = poss.pattern_number;
- pattern_count = analyzed_possibilities
- .filter(val => val.pattern_number == poss.pattern_number)
- .length;
- out_line += `${displayPercentage(poss.category_total_probability)} `;
- }
- out_line += `${displayPercentage(poss.probability)} `;
- for (let day of poss.prices.slice(2)) {
- let price_class = getPriceClass(style_price, day.max);
- if (day.min !== day.max) {
- out_line += `${day.min} ${i18next.t("output.to")} ${day.max} `;
- } else {
- out_line += `${day.min} `;
- }
- }
-
- var min_class = getPriceClass(style_price, poss.weekGuaranteedMinimum);
- var max_class = getPriceClass(style_price, poss.weekMax);
- out_line += `${poss.weekGuaranteedMinimum} ${poss.weekMax} `;
- output_possibilities += out_line;
- }
-
- $("#output").html(output_possibilities);
-
- update_chart(data, analyzed_possibilities);
-};
-
-const generatePermalink = function (buy_price, sell_prices, first_buy, previous_pattern) {
- let searchParams = new URLSearchParams();
- let pricesParam = buy_price ? buy_price.toString() : '';
-
- if (!isEmpty(sell_prices)) {
- const filtered = sell_prices.map(price => isNaN(price) ? '' : price).join('.');
- pricesParam = pricesParam.concat('.', filtered);
- }
-
- if (pricesParam) {
- searchParams.append('prices', pricesParam);
- }
-
- if (first_buy) {
- searchParams.append('first', true);
- }
-
- if (previous_pattern !== -1) {
- searchParams.append('pattern', previous_pattern);
- }
-
- return searchParams.toString() && window.location.origin.concat('?', searchParams.toString());
-};
-
-const copyPermalink = function () {
- let text = permalink_input[0];
-
- permalink_input.show();
- text.select();
- text.setSelectionRange(0, 99999); /* for mobile devices */
-
- document.execCommand('copy');
- permalink_input.hide();
-
- flashMessage(i18next.t("prices.permalink-copied"));
-};
-
-const flashMessage = function(message) {
- snackbar.text(message);
- snackbar.addClass('show');
-
- setTimeout(function () {
- snackbar.removeClass('show');
- snackbar.text('');
- }, 3000);
-};
-
-const update = function () {
- if(!state.initialized){
- console.log('update function called before initial data load');
- // calls to update before the previous data has been initialized / loaded will reset the data.
- return;
- }
- const sell_prices = getSellPrices();
- const buy_price = parseInt(buy_input.val());
- const first_buy = getCheckedRadio(first_buy_radios) == 'true';
- const previous_pattern = parseInt(getCheckedRadio(previous_pattern_radios));
-
- const permalink = generatePermalink(buy_price, sell_prices, first_buy, previous_pattern);
- if (permalink) {
- permalink_button.show();
- } else {
- permalink_button.hide();
- }
- permalink_input.val(permalink);
-
- const prices = [buy_price, buy_price, ...sell_prices];
-
- if (!window.populated_from_query) {
- updateLocalStorage(prices, first_buy, previous_pattern);
- }
-
- calculateOutput(prices, first_buy, previous_pattern);
-};
diff --git a/fun-shit/turnips/js/themes.js b/fun-shit/turnips/js/themes.js
deleted file mode 100644
index 6f1b45a..0000000
--- a/fun-shit/turnips/js/themes.js
+++ /dev/null
@@ -1,58 +0,0 @@
-function updateTheme(theme) {
- if (theme == "auto") {
- theme = (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) ? "dark" : "light";
- }
-
- if (theme != "light") {
- document.documentElement.setAttribute("data-theme", theme);
- } else {
- document.documentElement.removeAttribute("data-theme");
- }
-
- if (chart_instance && chart_options) {
- chart_instance.options = chart_options;
- chart_instance.update();
- }
-}
-
-function setupTheming() {
- const themeSelector = $("#theme");
- const supportsAutoTheming = (window.matchMedia && window.matchMedia("(prefers-color-scheme)").matches);
- let preferredTheme = localStorage.getItem("theme");
- let selectorVal = preferredTheme ? preferredTheme :
- supportsAutoTheming ? "auto" : "light";
-
- // Build theme option menu.
- if (supportsAutoTheming) {
- themeSelector.append(`${i18next.t('textbox.theme.auto')} `);
- }
- themeSelector.append(`${i18next.t('textbox.theme.light')} `);
- themeSelector.append(`${i18next.t('textbox.theme.dark')} `);
-
- themeSelector.val(selectorVal);
-
- // Listen to system changes in theme
- window.matchMedia("(prefers-color-scheme: dark)").addListener(() => {
- if (preferredTheme && preferredTheme != "auto") { return; }
- updateTheme("auto");
- });
-
- // Preference listener
- themeSelector.on('change', function () {
- preferredTheme = this.value;
- updateTheme(preferredTheme);
-
- if ((preferredTheme != "light" && !supportsAutoTheming) ||
- (preferredTheme != "auto" && supportsAutoTheming)) {
- localStorage.setItem("theme", preferredTheme);
- } else {
- localStorage.removeItem("theme");
- }
- });
-}
-
-$(document).ready(function() {
- i18next.init((err, t) => {
- setupTheming();
- });
-});
\ No newline at end of file
diff --git a/fun-shit/turnips/js/translations.js b/fun-shit/turnips/js/translations.js
deleted file mode 100644
index 2b2c635..0000000
--- a/fun-shit/turnips/js/translations.js
+++ /dev/null
@@ -1,75 +0,0 @@
-function updateContent() {
- update();
- $('body').localize();
-}
-const defaultLanguage = 'en';
-const LANGUAGES = {
- 'ca': 'Català',
- 'cs': 'Česky',
- 'de': 'Deutsch',
- 'en': 'English',
- 'es': 'Español',
- 'fr': 'Français',
- 'gl': 'Galego',
- 'hu': 'magyar',
- 'id': 'Bahasa Indonesia',
- 'it': 'Italiano',
- 'ja': '日本語',
- 'ko': '한국어',
- 'nl': 'Nederlands',
- 'ph': 'Filipino',
- 'pl': 'Polski',
- 'pt-BR': 'Português',
- 'ru': 'Русский',
- 'ua': 'Українська',
- 'th': 'ไทย',
- 'zh-CN': '简体中文',
- 'zh-TW': '繁體中文'
-};
-i18next
-.use(i18nextXHRBackend)
-.use(i18nextBrowserLanguageDetector)
-.init({
- fallbackLng: defaultLanguage,
- debug: true,
- backend: {
- loadPath: 'locales/{{lng}}.json',
- },
-}, (err, t) => {
- languageSelector = $('#language');
- for (let [code, name] of Object.entries(LANGUAGES)) {
- languageSelector.append(`${name} `);
- }
- for (let code of i18next.languages) {
- if (code in LANGUAGES) {
- languageSelector.val(code);
- $('html').attr('lang', code);
- break;
- }
- }
- languageSelector.on('change', function () {
- if (this.value == i18next.language)
- return;
- i18next.changeLanguage(this.value);
- $('html').attr('lang', this.value);
- });
- jqueryI18next.init(i18next, $);
- i18next.on('languageChanged', lng => {
- updateContent();
- });
- // init set content
- $(document).ready(initialize);
-
- let delayTimer;
- $(document).on('input', function(event) {
- //prevent radio input from updating content twice per input change
- if(event.target.type === 'radio'){ return }
- // adding short delay after input to help mitigate potential lag after keystrokes
- clearTimeout(delayTimer);
- delayTimer = setTimeout(function() {
- updateContent();
- }, 500);
- });
-
- $('input[type = radio]').on('change', updateContent);
-});
diff --git a/fun-shit/turnips/locales/ca.json b/fun-shit/turnips/locales/ca.json
deleted file mode 100644
index 9dc3d41..0000000
--- a/fun-shit/turnips/locales/ca.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Juliana"
- },
- "welcome": {
- "salutation": "Hola! Et donem la benvinguda a l'app Turnip Prophet pel teu Nookòfon.",
- "description": "Aquesta app et permet predir els preus dels naps a la teva illa, però hauràs d'introduir-hi tu els preus passats!",
- "conclusion": "Fet això, l'app Turnip Prophet endevinarà els preus que tindràs durant la resta de la setmana."
- },
- "first-time": {
- "title": "Primer cop que compres",
- "description": "És la primera vegada que li compres naps a la Juliana a la teva illa?(Afecta al patró de preus) ",
- "yes": "Sí",
- "no": "No"
- },
- "patterns": {
- "title": "Patró anterior",
- "description": "Quin patró tenien els teus preus la setmana passada?(Afecta al patró actual) ",
- "pattern": "Patró",
- "all": "Tots els patrons",
- "decreasing": "Decreixent",
- "fluctuating": "Fluctuant",
- "unknown": "No ho sé",
- "large-spike": "Pic gran",
- "small-spike": "Pic petit"
- },
- "prices": {
- "description": "Quin ha sigut el preu de compra de naps a la teva illa aquesta setmana?",
- "open": {
- "am": "AM - De les 8:00 am a les 11:59 am",
- "pm": "PM - De les 12:00 pm a les 10:00 pm"
- },
- "copy-permalink": "Copiar permalink",
- "permalink-copied": "Permalink copiat!",
- "reset": "Reiniciar Turnip Prophet",
- "reset-warning": "Segur que vols reiniciar tots els camps?\n\nNo pots desfer aquesta acció!"
- },
- "weekdays": {
- "monday": "Dilluns",
- "tuesday": "Dimarts",
- "wednesday": "Dimecres",
- "thursday": "Dijous",
- "friday": "Divendres",
- "saturday" : "Dissabte",
- "sunday": "Diumenge",
- "abr": {
- "monday": "Dl",
- "tuesday": "Dm",
- "wednesday": "Dc",
- "thursday": "Dj",
- "friday": "Dv",
- "saturday" : "Ds"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Resultat",
- "chance": "Probabilitat (%)",
- "to": "a",
- "minimum": "Mínim garantit",
- "maximum": "Màxim potencial",
- "chart": {
- "input": "Preu d'entrada",
- "minimum": "Mínim garantit",
- "maximum": "Màxim potencial"
- }
- },
- "textbox": {
- "description": "Quan hagis posat els preus dels naps, el Turnip Prophet farà comptes i et mostrarà els possibles patrons que puguin haver a la teva illa.",
- "development": "L'app encara està en desenvolupament, però l'anirem millorant!",
- "thanks": "Aquest projecte ha estat possible gràcies a en Ninji , que va descobrir com calculen en Tendo i en Nendo els preus dels naps.",
- "support": "A GitHub hi trobaràs suport, comentaris, i contribucions.",
- "sponsor": "Vols patrocinar als desenvolupadors del projecte? Ves a GitHub i clica damunt de '❤ Sponsor'",
- "contributors-text": "Ah! I no ens oblidem dels que ja han ajudat amb les seves contribucions!",
- "contributors": "Contribuidors",
- "language": "Llenguatge",
- "theme": {
- "title": "Tema",
- "auto": "Automàtic",
- "light": "Clar",
- "dark": "Fosc"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/cs.json b/fun-shit/turnips/locales/cs.json
deleted file mode 100644
index 61aef80..0000000
--- a/fun-shit/turnips/locales/cs.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Ahoj, vítej v aplikaci Turnip Prophet tvého Nook Phone.",
- "description": "Tahle aplikace by ti měla pomoct sledovat vývoj cen tuřínů na tvém ostrově. Musíš si ale sám zadávat ceny, které už znáš!",
- "conclusion": "Po zadání Turnip Prophet kouzelným způsobem předpoví, jak by se ceny měly vyvíjet v průběhu týdne."
- },
- "first-time": {
- "title": "Poprvé kupující",
- "description": "Je to poprvé, co kupuješ tuříny od Daisy na vlastním ostrově?(Ovlivňuje model vývoje cen) ",
- "yes": "Ano",
- "no": "Ne"
- },
- "patterns": {
- "title": "Předchozí model",
- "description": "Jaký byl model vývoje cen tuřínů na tvém ostrově minulý týden?(Ovlivňuje model vývoje cen) ",
- "pattern": "Model",
- "all": "Všechny modely",
- "decreasing": "Klesající",
- "fluctuating": "Kolísavý",
- "unknown": "Nevím",
- "large-spike": "S velkou špicí",
- "small-spike": "S malou špicí"
- },
- "prices": {
- "description": "Jaké byly ceny tuřínů v průběhu tohoto týdne?",
- "open": {
- "am": "dop. - od 8:00 do 11:59",
- "pm": "odp. - od 12:00 do 22:00"
- },
- "copy-permalink": "Kopírovat permalink",
- "permalink-copied": "Permalink zkopírován!",
- "reset": "Resetovat Turnip Prophet",
- "reset-warning": "Opravdu chceš resetovat všechny pole?\n\nNejde to vrátit zpět!"
- },
- "weekdays": {
- "monday": "Pondělí",
- "tuesday": "Úterý",
- "wednesday": "Středa",
- "thursday": "Čtvrtek",
- "friday": "Pátek",
- "saturday" : "Sobota",
- "sunday": "Neděle",
- "abr": {
- "monday": "Po",
- "tuesday": "Út",
- "wednesday": "St",
- "thursday": "Čt",
- "friday": "Pá",
- "saturday" : "So"
- }
- },
- "times": {
- "morning": "dop.",
- "afternoon": "odp."
- },
- "output": {
- "title": "Výstup",
- "chance": "Šance %",
- "to": "až",
- "minimum": "Jisté Minimum",
- "maximum": "Možné Maximum",
- "chart": {
- "input": "Vstupní cena",
- "minimum": "Jisté Minimum",
- "maximum": "Možné Maximum"
- }
- },
- "textbox": {
- "description": "Po zadání několika cen tuřínů, Turnip Prophet provede nějaké výpočty a zobrazí všechny možné modely vývoje cen, které mohou na tvém ostrově nastat.",
- "development": "Aplikace je pořád ve vývoji, časem se stále zlepšuje!",
- "thanks": "Nic z toho by nebylo možné bez Ninjiho výzkumu , jak vlastně Timmy a Tommy hodnotí cenu tuřínů.",
- "support": "Podpora, komentáře a příspěvky jsou možné přes GitHub ",
- "sponsor": "Chceš podpořit vývojáře stojící za tímto projektem? Jdi na GitHub a klikni na tlačítko '❤ Sponsor'",
- "contributors-text": "Jo! A nesmíme zapomínat poděkovat těm, kteří se na vývoji tohoto projektu zatím podíleli!",
- "contributors": "Na projektu se podílí",
- "language": "Jazyk",
- "theme": {
- "title": "Barevné schéma",
- "auto": "Automaticky",
- "light": "Světlé",
- "dark": "Tmavé"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/de.json b/fun-shit/turnips/locales/de.json
deleted file mode 100644
index 2e9831a..0000000
--- a/fun-shit/turnips/locales/de.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Jorna"
- },
- "welcome": {
- "salutation": "Hallo, und Willkommen bei der Turnip Prophet App auf deinem Nook Phone.",
- "description": "Mit dieser App kannst du die Rübenpreise deiner Insel täglich verfolgen, aber du musst die Preise selbst eingeben!",
- "conclusion": "Danach wird die Turnip Prophet App magisch deine Rübenpreise vorhersagen, welche du den Rest der Woche haben wirst."
- },
- "first-time": {
- "title": "Erstmaliger Einkäufer",
- "description": "Kaufst du zum ersten Mal Rüben von Jorna auf deiner Insel? (Dies beeinflusst dein Verkaufsmuster) ",
- "yes": "Ja",
- "no": "Nein"
- },
- "patterns": {
- "title": "Vorheriges Verkaufsmuster",
- "description": "Wie war das Verkaufsmuster der letzten Woche? (Dies beeinflusst dein Verkaufsmuster) ",
- "pattern": "Verkaufsmuster",
- "all": "Alle Verkaufsmuster",
- "decreasing": "Absteigend",
- "fluctuating": "Schwankend",
- "unknown": "Ich weiß nicht",
- "large-spike": "Stark Ansteigend",
- "small-spike": "Leicht Ansteigend"
- },
- "prices": {
- "description": "Wie hoch war der Preis für Rüben diese Woche auf deiner Insel?",
- "open": {
- "am": "Vorm. (Vormittag) - 8:00 Uhr bis 11:59 Uhr",
- "pm": "Nachm. (Nachmittag) - 12:00 Uhr bis 22:00 Uhr"
- },
- "copy-permalink": "Seite teilen",
- "permalink-copied": "Seitenlink kopiert!",
- "reset": "Eingegebene Daten zurücksetzen",
- "reset-warning": "Bist du sicher, dass du deine eingegebenen Daten zurücksetzen möchtest?\n\nDies kann nicht rückgängig gemacht werden!"
- },
- "weekdays": {
- "monday": "Montag",
- "tuesday": "Dienstag",
- "wednesday": "Mittwoch",
- "thursday": "Donnerstag",
- "friday": "Freitag",
- "saturday" : "Samstag",
- "sunday": "Sonntag",
- "abr": {
- "monday": "Mo",
- "tuesday": "Di",
- "wednesday": "Mi",
- "thursday": "Do",
- "friday": "Fr",
- "saturday" : "Sa"
- }
- },
- "times": {
- "morning": "Vorm.",
- "afternoon": "Nachm."
- },
- "output": {
- "title": "Berechnung",
- "chance": "% Chance",
- "to": "bis",
- "minimum": "Garantiertes Minimum",
- "maximum": "Potentielles Maximum",
- "chart": {
- "input": "Eingegebener Preis",
- "minimum": "Garantiertes Minimum",
- "maximum": "Potentielles Maximum"
- }
- },
- "textbox": {
- "description": "Nachdem du einige Rübenpreise eingegeben hast, macht der Turnip Prophet etwas Magie und zeigt dir die verschiedenen möglichen Verkaufsmuster an, die auf deiner Insel auftreten können.",
- "development": "Diese App befindet sich noch in der Entwicklung, wird sich aber mit der Zeit verbessern!",
- "thanks": "Nichts von all dem wäre möglich gewesen, ohne das Ninji herausgefunden hätte, wie Nepp und Schlepp ihre Rübenpreise kalkulieren.",
- "support": "Hilfe, Kommentare und Beiträge sind auffindbar über GitHub.com (nur in Englisch).",
- "sponsor": "Möchtest du die Entwickler hinter diesem Projekt unterstützen? Gehe zu GitHub.com und klicke auf den '❤ Sponsor' Button für mehr Informationen.",
- "contributors-text": "Oh! Und vergessen wir nicht, denen zu danken, die bis jetzt dazu beigetragen haben!",
- "contributors": "Mitwirkende",
- "language": "Sprache"
- }
-}
diff --git a/fun-shit/turnips/locales/en.json b/fun-shit/turnips/locales/en.json
deleted file mode 100644
index a7706fe..0000000
--- a/fun-shit/turnips/locales/en.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Hello, and welcome to the Turnip Prophet app on your Nook Phone.",
- "description": "This app lets you track your island's turnip prices daily, but you'll have to put the prices in yourself!",
- "conclusion": "After that, the Turnip Prophet app will magically predict the turnip prices you'll have for the rest of the week."
- },
- "first-time": {
- "title": "First-Time Buyer",
- "description": "Is this the first time a resident is buying turnips from Daisy Mae on your own island?(This affects your pattern) ",
- "yes": "Yes",
- "no": "No"
- },
- "patterns": {
- "title": "Previous Pattern",
- "description": "What was last week's turnip price pattern?(This affects your pattern) ",
- "pattern": "Pattern",
- "all": "All patterns",
- "decreasing": "Decreasing",
- "fluctuating": "Fluctuating",
- "unknown": "I don't know",
- "large-spike": "Large Spike",
- "small-spike": "Small Spike"
- },
- "prices": {
- "description": "What was the price of turnips this week on your island?",
- "open": {
- "am": "AM - 8:00 am to 11:59 am",
- "pm": "PM - 12:00 pm to 10:00 pm"
- },
- "copy-permalink": "Copy permalink",
- "permalink-copied": "Permalink copied!",
- "reset": "Reset Turnip Prophet",
- "reset-warning": "Are you sure you want to reset all fields?\n\nThis cannot be undone!"
- },
- "weekdays": {
- "monday": "Monday",
- "tuesday": "Tuesday",
- "wednesday": "Wednesday",
- "thursday": "Thursday",
- "friday": "Friday",
- "saturday" : "Saturday",
- "sunday": "Sunday",
- "abr": {
- "monday": "Mon",
- "tuesday": "Tue",
- "wednesday": "Wed",
- "thursday": "Thu",
- "friday": "Fri",
- "saturday" : "Sat"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Output",
- "chance": "% Chance",
- "to": "to",
- "minimum": "Guaranteed Minimum",
- "maximum": "Potential Maximum",
- "chart": {
- "input": "Input Price",
- "minimum": "Guaranteed Minimum",
- "maximum": "Potential Maximum"
- }
- },
- "textbox": {
- "description": "After you've listed some turnip prices, the Turnip Prophet will run some numbers and display the different possible patterns that your island may experience.",
- "development": "This app is still in development, but will improve over time!",
- "thanks": "None of this would have been possible without Ninji's work figuring out just how Timmy and Tommy value their turnips.",
- "support": "Support, comments and contributions are available through GitHub ",
- "sponsor": "Want to sponsor the developers behind this project? Go to the GitHub page and click '❤ Sponsor'",
- "contributors-text": "Oh! And let's not forget to thank those who have contributed so far!",
- "contributors": "Contributors",
- "language": "Language",
- "theme": {
- "title": "Theme",
- "auto": "Automatic",
- "light": "Light",
- "dark": "Dark"
- }
- },
- "errors": {
- "impossible-values": "Oops! There seems to be an error with your turnip predictions. Please check your inputs.",
- "github": "If your turnip prices are correct and you have not time traveled, please submit a report. "
- }
-}
diff --git a/fun-shit/turnips/locales/es.json b/fun-shit/turnips/locales/es.json
deleted file mode 100644
index 6b102fd..0000000
--- a/fun-shit/turnips/locales/es.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "general": {
- "daisy-mae": "Juliana"
- },
- "welcome": {
- "salutation": "¡Hola! Te damos la bienvenida a la aplicación Turnip Prophet para tu Nookófono.",
- "description": "Esta aplicación te permite monitorizar la fluctuación del precio de los nabos en tu isla, ¡pero tendrás que introducir tú manualmente los precios diarios!",
- "conclusion": "Una vez hecho, la aplicación Turnip Prophet predecirá mágicamente el precio que tendrán los nabos el resto de la semana."
- },
- "first-time": {
- "title": "Comprador(a) primerizo(a)",
- "description": "¿Ha sido esta la primera vez que compras nabos?(Esta información afectará a tu patrón) ",
- "yes": "Sí",
- "no": "No"
- },
- "patterns": {
- "title": "Patrón anterior",
- "description": "¿Qué patrón describió el precio de los nabos la semana pasada?(Esta información afectará a tu patrón) ",
- "pattern": "Patrón",
- "all": "Todos los patrones",
- "decreasing": "Decreciente",
- "fluctuating": "Fluctuante",
- "unknown": "No lo sé",
- "large-spike": "Pico alto",
- "small-spike": "Pico moderado"
- },
- "prices": {
- "description": "¿Cuál fue el precio de los nabos en tu isla esta semana?",
- "open": {
- "am": "AM - De 8:00 a 11:59",
- "pm": "PM - De 12:00 a 22:00"
- },
- "copy-permalink": "Copiar permalink",
- "permalink-copied": "¡Permalink copiado!",
- "reset": "Reiniciar Turnip Prophet",
- "reset-warning": "¿Seguro que quieres reiniciar todos los campos?\n\n¡Esto no se puede deshacer!"
- },
- "weekdays": {
- "monday": "Lunes",
- "tuesday": "Martes",
- "wednesday": "Miércoles",
- "thursday": "Jueves",
- "friday": "Viernes",
- "saturday" : "Sábado",
- "sunday": "Domingo",
- "abr": {
- "monday": "LU",
- "tuesday": "MA",
- "wednesday": "MI",
- "thursday": "JU",
- "friday": "VI",
- "saturday" : "SA"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Predicción",
- "chance": "Probabilidad (%)",
- "to": "a",
- "minimum": "Mínimo garantizado",
- "maximum": "Máximo potencial",
- "chart": {
- "input": "Precio de entrada",
- "minimum": "Mínimo garantizado",
- "maximum": "Máximo potencial"
- }
- },
- "textbox": {
- "description": "Cuando introduzcas algunos precios, Turnip Prophet empezará a hacer sus cálculos y te mostrará algunos posibles patrones para el precio de los nabos en tu isla.",
- "development": "Esta aplicación está aún en desarrollo, ¡pero la seguiremos mejorando!",
- "thanks": "Nada de esto habría sido posible sin el trabajo de Ninji para averiguar cómo Tendo y Nendo valoran los nabos.",
- "support": "Para asistencia, comentarios y contribuciones, no dudes en pasarte por GitHub .",
- "contributors-text": "¡Ah! ¡Y no nos olvidemos de todos los que han puesto su granito de arena hasta ahora!",
- "contributors": "Contribuidores",
- "language": "Idioma"
- }
-}
diff --git a/fun-shit/turnips/locales/fr.json b/fun-shit/turnips/locales/fr.json
deleted file mode 100644
index f2ac6bf..0000000
--- a/fun-shit/turnips/locales/fr.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Porcelette"
- },
- "welcome": {
- "salutation": "Bonjour et bienvenue sur l'application du Turnip Prophet de ton Nook Phone.",
- "description": "Cette appli te permet de garder un œil quotidien sur le cours du navet de ton île, en le renseignant ici par toi-même !",
- "conclusion": "Une fois les prix renseignés, l'appli du Turnip Prophet va magiquement prédire le cours du navet de ton île pour le reste de la semaine."
- },
- "first-time": {
- "title": "Premier Achat",
- "description": "Est-ce la toute première fois que t'achètes des navets à Porcelette sur ton île ?(Cela influencera le type de ta courbe actuelle) ",
- "yes": "Oui",
- "no": "Non"
- },
- "patterns": {
- "title": "Courbe du cours précédent",
- "description": "De quel type était la courbe de ton cours du navet la semaine dernière ?(Cela influencera le type de ta courbe actuelle) ",
- "pattern": "Type de Courbe",
- "all": "Tous les types",
- "decreasing": "Décroissante",
- "fluctuating": "Variable",
- "unknown": "Je ne sais pas",
- "large-spike": "Grand Pic",
- "small-spike": "Petit Pic"
- },
- "prices": {
- "description": "À quel prix Porcelette vendait ses navets sur ton île cette semaine ?",
- "open": {
- "am": "Matin (AM) - de 8:00 à 11:59",
- "pm": "Après-midi (PM) - de 12:00 à 22:00"
- },
- "copy-permalink": "Copier le permalien",
- "permalink-copied": "Permalien copié !",
- "reset": "Réinitialiser les données",
- "reset-warning": "Es-tu sûr·e de vouloir réinitialiser tous les champs ?\n\nCe choix est définitif !"
- },
- "weekdays": {
- "monday": "Lundi",
- "tuesday": "Mardi",
- "wednesday": "Mercredi",
- "thursday": "Jeudi",
- "friday": "Vendredi",
- "saturday" : "Samedi",
- "sunday": "Dimanche",
- "abr": {
- "monday": "Lun",
- "tuesday": "Mar",
- "wednesday": "Mer",
- "thursday": "Jeu",
- "friday": "Ven",
- "saturday" : "Sam"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Résultats",
- "chance": "% Chance",
- "to": "à",
- "minimum": "Minimum Garanti",
- "maximum": "Maximum Potentiel",
- "chart": {
- "input": "Prix renseigné",
- "minimum": "Minimum Garanti",
- "maximum": "Maximum Potentiel"
- }
- },
- "textbox": {
- "description": "Après avoir renseigné quelques prix, le Turnip Prophet fera des calculs et affichera les différents types possibles pour les courbes que ton île pourrait avoir.",
- "development": "Cette appli est en développement, mais elle s'améliore jour après jour !",
- "thanks": "Rien de tout ça n'aurait pu être possible sans le travail de Ninji et son analyse sur comment Méli et Mélo déterminent la valeur des Navets.",
- "support": "Aide, commentaires et contributions sont disponibles via GitHub ",
- "sponsor": "T'aimerais sponsoriser les développeurs derrière ce projet ? Alors va sur la page GitHub du projet et clique sur '❤ Sponsor'",
- "contributors-text": "Oh ! Et n'oublions pas de remercier toutes les personnes ayant contribué jusqu'à maintenant !",
- "contributors": "Contributeurs",
- "language": "Langue",
- "theme": {
- "title": "Thème",
- "auto": "Automatique",
- "light": "Clair",
- "dark": "Sombre"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/gl.json b/fun-shit/turnips/locales/gl.json
deleted file mode 100644
index 9d8ea8c..0000000
--- a/fun-shit/turnips/locales/gl.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "general": {
- "daisy-mae": "Juliana"
- },
- "welcome": {
- "salutation": "Ola, estás no aplicativo Turnip Prophet no teu Nookófono.",
- "description": "Este aplicativo permíteche facer un seguemento do prezo dos nabos na túa illa. Porén, tes que introducir os prezos manualmente.",
- "conclusion": "Depois, o aplicativo predirá maxicamente os prezos dos nabos na túa illa para o resto da semana."
- },
- "first-time": {
- "title": "Primeira compra",
- "description": "É a primeira vez que compras nabos a Juliana na túa illa? (Isto afecta aos prezos) ",
- "yes": "Si",
- "no": "Non"
- },
- "patterns": {
- "title": "Tendencia anterior",
- "description": "Cal foi a tendencia de prezos na túa illa a semana pasada? (Isto afecta aos prezos) ",
- "pattern": "Tendencia",
- "all": "Todas as tendencias",
- "decreasing": "Decrecente",
- "fluctuating": "Fluctuante",
- "unknown": "Descoñecido",
- "large-spike": "Pico grande",
- "small-spike": "Pico pequeno"
- },
- "prices": {
- "description": "Que prezos tiveron os nabos esta semana na túa illa?",
- "open": {
- "am": "Mañá - 8:00 a 11:59",
- "pm": "Tarde - 12:00 a 22:00"
- },
- "copy-permalink": "Copiar ligazón permanente",
- "permalink-copied": "Ligazón permanente copiada!",
- "reset": "Restablecer Turnip Prophet",
- "reset-warning": "Seguro que desexas restablecer todos os campos?\n\nIsto non se pode desfacer!"
- },
- "weekdays": {
- "monday": "Luns",
- "tuesday": "Martes",
- "wednesday": "Mércores",
- "thursday": "Xoves",
- "friday": "Venres",
- "saturday" : "Sábado",
- "sunday": "Domingo",
- "abr": {
- "monday": "Lun",
- "tuesday": "Mar",
- "wednesday": "Mér",
- "thursday": "Xov",
- "friday": "Venr",
- "saturday" : "Sáb"
- }
- },
- "times": {
- "morning": "Mañá",
- "afternoon": "Tarde"
- },
- "output": {
- "title": "Resultado",
- "chance": "% Probabilidade",
- "to": "a",
- "minimum": "Mínimo garantido",
- "maximum": "Máximo potencial",
- "chart": {
- "input": "Prezo introducido",
- "minimum": "Mínimo garantido",
- "maximum": "Máximo potencial"
- }
- },
- "textbox": {
- "description": "Despois de introducir algúns prezos, o Turnip Prophet calculará que prezos poden ter no futuro.",
- "development": "Este aplicativo aínda está en desenvolvemento, mais mellorará co tempo!",
- "thanks": "Nada disto sería posible sen o traballo de Ninji achando como se calculan os prezos.",
- "support": "Soporte, comentarios e contribucións están dispoñibles en GitHub ",
- "contributors-text": "Oh! E non esqueceremos dar as grazas aos que xa contribuíron.",
- "contributors": "Contribuidores",
- "language": "Lingua"
- }
-}
diff --git a/fun-shit/turnips/locales/hu.json b/fun-shit/turnips/locales/hu.json
deleted file mode 100644
index 99d2296..0000000
--- a/fun-shit/turnips/locales/hu.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Üdvözöllek a Nookfonod Turnip Prophet alkalmazásában!",
- "description": "Ezzel az alkalmazással követheted a szigeted naponta változó retekárait, viszont az árakat Neked kell megadnod!",
- "conclusion": "Az árak megadása után a Turnip Prophet varázslatosan megjósolja a hét elkövetkezendő árait."
- },
- "first-time": {
- "title": "Első vásárlás",
- "description": "Most vásárol valaki először retket Daisy Mae-től a Te szigeteden ?(Ez hatással van a mintádra) ",
- "yes": "Igen",
- "no": "Nem"
- },
- "patterns": {
- "title": "Előző minta",
- "description": "Milyen volt az előző hét mintája?(Ez hatással van a mintádra) ",
- "pattern": "Minta",
- "all": "Minden minta",
- "decreasing": "Csökkenő",
- "fluctuating": "Ingadozó",
- "unknown": "Nem tudom",
- "large-spike": "Nagy kiugrás",
- "small-spike": "Kis kiugrás"
- },
- "prices": {
- "description": "Mennyiért vettél ezen a héten retket?",
- "open": {
- "am": "Délelőtt - 08:00-tól 11:59-ig",
- "pm": "Délután - 12:00-től 22:00-ig"
- },
- "copy-permalink": "Árak megosztása",
- "permalink-copied": "Hivatkozás kimásolva!",
- "reset": "Mezők kiürítése",
- "reset-warning": "Biztosan ki akarsz üríteni minden mezőt?\n\nEz a művelet nem vonható vissza!"
- },
- "weekdays": {
- "monday": "Hétfő",
- "tuesday": "Kedd",
- "wednesday": "Szerda",
- "thursday": "Csütörtök",
- "friday": "Péntek",
- "saturday" : "Szombat",
- "sunday": "Vasárnap",
- "abr": {
- "monday": "H",
- "tuesday": "K",
- "wednesday": "Sze",
- "thursday": "Cs",
- "friday": "P",
- "saturday" : "Szo"
- }
- },
- "times": {
- "morning": "de.",
- "afternoon": "du."
- },
- "output": {
- "title": "Eredmény",
- "chance": "% Esély",
- "to": "-",
- "minimum": "Garantált minimum",
- "maximum": "Lehetséges maximum",
- "chart": {
- "input": "Megadott ár",
- "minimum": "Garantált minimum",
- "maximum": "Lehetséges maximum"
- }
- },
- "textbox": {
- "description": "Miután megadtál néhány árat, a Turnip Prophet kiszámolja és megjeleníti az összes lehetséges mintát ami a héten megjelenhet.",
- "development": "Ez az alkalmazás fejlesztés alatt áll, de idővel javulni fog!",
- "thanks": "Ez nem lett volna lehetséges Ninji munkája nélkül, aki megfejtette, hogy Timmy és Tommy hogyan árazzák a retket.",
- "support": "Minden hibajelentést, megjegyzést és hozzájárulást a GitHub-on várunk.",
- "sponsor": "Szeretnéd szponzorálni a projekt fejlesztőit? Menj a GitHub oldalra és nyomd meg a „❤ Sponsor” gombot!",
- "contributors-text": "Ó, és ne felejtsünk el köszönetet mondani az eddigi hozzájárulóknak!",
- "contributors": "Hozzájárulók",
- "language": "Nyelv",
- "theme": {
- "title": "Téma",
- "auto": "Automatikus",
- "light": "Világos",
- "dark": "Sötét"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/id.json b/fun-shit/turnips/locales/id.json
deleted file mode 100644
index eb7863b..0000000
--- a/fun-shit/turnips/locales/id.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Halo, dan selamat datang di aplikasi Turnip Prophet pada Nook Phone kalian.",
- "description": "Aplikasi ini dapat digunakan untuk mencatat harga turnip harian di pulau kalian, tapi kalian harus memasukkan harganya sendiri!",
- "conclusion": "Setelah itu, aplikasi Turnip Prophet akan secara ajaib memprediksi harga turnip kalian selama satu minggu ke depan."
- },
- "first-time": {
- "title": "Pertama Kali Beli",
- "description": "Apakah ini pertama kalinya seorang penduduk membeli turnip dari Daisy Mae di pulau kalian sendiri ?(Akan memengaruhi pola harga) ",
- "yes": "Iya",
- "no": "Tidak"
- },
- "patterns": {
- "title": "Pola Sebelumnya",
- "description": "Bagaimana bentuk pola harga turnip pada minggu sebelumnya?(Akan memengaruhi pola harga) ",
- "pattern": "Pola",
- "all": "Semua pola",
- "decreasing": "Menurun",
- "fluctuating": "Fluktuatif",
- "unknown": "Tidak tahu",
- "large-spike": "Peningkatan Tajam",
- "small-spike": "Peningkatan Kecil"
- },
- "prices": {
- "description": "Berapa harga turnip di pulau kalian minggu ini?",
- "open": {
- "am": "AM - 8.00 pagi sampai 11:59 siang",
- "pm": "PM - 12.00 siang sampai 22.00 malam"
- },
- "copy-permalink": "Salin tautan",
- "permalink-copied": "Tautan telah disalin!",
- "reset": "Reset Turnip Prophet",
- "reset-warning": "Apakah kamu yakin ingin me-reset semua kolom?\n\nSetelah di-reset, tidak dapat dikembalikan lagi!"
- },
- "weekdays": {
- "monday": "Senin",
- "tuesday": "Selasa",
- "wednesday": "Rabu",
- "thursday": "Kamis",
- "friday": "Jumat",
- "saturday" : "Sabtu",
- "sunday": "Minggu",
- "abr": {
- "monday": "Sen",
- "tuesday": "Sel",
- "wednesday": "Rab",
- "thursday": "Kam",
- "friday": "Jum",
- "saturday" : "Sab"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Output",
- "chance": "% Peluang",
- "to": "-",
- "minimum": "Jaminan Minimal",
- "maximum": "Potensi Maksimal",
- "chart": {
- "input": "Input Harga",
- "minimum": "Jaminan Minimal",
- "maximum": "Potensi Maksimal"
- }
- },
- "textbox": {
- "description": "Setelah kalian mendaftarkan harga turnip-nya, Turnip Prophet akan melakukan perhitungan dan menampilkan beberapa kemungkinan dengan pola yang berbeda yang mungkin terjadi di pulau kalian.",
- "development": "Aplikasi ini masih dalam tahap pengembangan, tapi akan selalu bertambah baik seiring dengan berjalannya waktu!",
- "thanks": "Aplikasi ini tidak akan terwujud tanpa adanya hasil kerja Ninji yang menemukan cara bagaimana Timmy dan Tommy menentukan harga turnip.",
- "support": "Dukungan, komentar, dan kontribusi dapat dilakukan melalui GitHub ",
- "sponsor": "Ingin mensponsori pengembang di balik proyek ini? Silakan menuju halaman GitHub dan klik '❤ Sponsor'",
- "contributors-text": "Oh! Jangan lupa juga untuk berterima kasih pada semuanya yang telah berkontribusi sejauh ini!",
- "contributors": "Kontributor",
- "language": "Bahasa"
- }
-}
diff --git a/fun-shit/turnips/locales/it.json b/fun-shit/turnips/locales/it.json
deleted file mode 100644
index 9fd4283..0000000
--- a/fun-shit/turnips/locales/it.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "general": {
- "name": "Turnip Prophet",
- "daisy-mae": "Brunella"
- },
- "welcome": {
- "salutation": "Ciao e benvenuto nell'app Turnip Prophet del tuo Nook Phone.",
- "description": "Questa applicazione ti permetterà di tenere traccia del prezzo giornaliero delle rape. Ma dovrai inserire i prezzi da te!",
- "conclusion": "Se lo fai Turnip Prophet predirrà magicamente i prezzi delle rape che avrai per il resto della settimana."
- },
- "first-time": {
- "title": "Primo Acquisto",
- "description": "È la prima volta che acquisti sulla tua isola le rape da Brunella?(influisce sul comportamento dei prezzi) ",
- "yes": "Sì",
- "no": "No"
- },
- "patterns": {
- "title": "Comportamento Precedente",
- "description": "Qual è stato il comportamento dei prezzi delle rape nella scorsa settimana?(influisce sul comportamento dei prezzi) ",
- "pattern": "Comportamento",
- "all": "Tutti i comportamenti",
- "decreasing": "Decrescente",
- "fluctuating": "Oscillante",
- "unknown": "Non lo so!",
- "large-spike": "Grande picco",
- "small-spike": "Piccolo picco"
- },
- "prices": {
- "description": "Qual era il prezzo di acquisto delle rape sulla tua isola questa settimana?",
- "open": {
- "am": "Mattina - dalle 8:00 alle 11:59",
- "pm": "Pomeriggio - dalle 12:00 alle 22:00"
- },
- "copy-permalink": "Copia permalink",
- "permalink-copied": "Permalink copiato!",
- "reset": "Resetta Turnip Prophet",
- "reset-warning": "Sei sicuro di voler resettare tutti i campi?\n\nNon può essere annullato!"
- },
- "weekdays": {
- "monday": "Lunedì",
- "tuesday": "Martedì",
- "wednesday": "Mercoledì",
- "thursday": "Giovedì",
- "friday": "Venerdì",
- "saturday": "Sabato",
- "sunday": "Domenica",
- "abr": {
- "monday": "Lun",
- "tuesday": "Mar",
- "wednesday": "Mer",
- "thursday": "Gio",
- "friday": "Ven",
- "saturday": "Sab"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Risultati",
- "chance": "Probabilità %",
- "to": "a",
- "minimum": "Minimo Garantito",
- "maximum": "Massimo Potenziale",
- "chart": {
- "input": "Prezzo Iniziale",
- "minimum": "Minimo Garantito",
- "maximum": "Massimo Potenziale"
- }
- },
- "textbox": {
- "description": "Dopo aver inserito alcuni prezzi, Turnip Prophet calcolerà e mostrerà i possibili comportamenti del prezzo delle rape nella tua isola.",
- "development": "Quest'applicazione è in ancora in sviluppo ma migliorerà col tempo!",
- "thanks": "Niente di questo sarebbe possibile senza il lavoro di Ninji nello scoprire come Mirko e Marco valutano le rape.",
- "support": "Chiedi supporto o lascia commenti e contributi su GitHub ",
- "sponsor": "Vuoi sponsorizzare gli sviluppatori di questo progetto? Vai nella pagina GitHub e clicca '❤ Sponsor'",
- "contributors-text": "Oh! Non dimentichiamoci di ringraziare chi ha contribuito fin'ora!",
- "contributors": "Collaboratori",
- "language": "Lingua"
- }
-}
diff --git a/fun-shit/turnips/locales/ja.json b/fun-shit/turnips/locales/ja.json
deleted file mode 100644
index e36c891..0000000
--- a/fun-shit/turnips/locales/ja.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "ウリ"
- },
- "welcome": {
- "salutation": "こんにちは!タヌキ開発特製スマホの最新アプリ Turnip Prophet へようこそ。",
- "description": "このアプリは、無人島のカブ価を毎日予測することができます。そのためには、まず自分でデータを入力することが必要です!",
- "conclusion": "そうすれば、Turnip Prophetは魔法 のように、あなたのこの一週間のカブ価を予測します。"
- },
- "first-time": {
- "title": "はじめての購入",
- "description": "あなたが自分の島でカブを購入したのは今回が初めてですか?(答えによってパターンが変化します) ",
- "yes": "はい",
- "no": "いいえ"
- },
- "patterns": {
- "title": "先週のパターン",
- "description": "先週のカブ価変化パターンを選んでください。(答えによってパターンが変化します) ",
- "pattern": "パターン",
- "all": "全てのパターン",
- "decreasing": "ジリ貧型",
- "fluctuating": "波型",
- "unknown": "わかりません",
- "large-spike": "跳ね大型(3期型)",
- "small-spike": "跳ね小型(4期型)"
- },
- "prices": {
- "description": "今週のカブ価は?",
- "open": {
- "am": "午前 - AM 8:00 ~ AM 11:59",
- "pm": "午後 - PM 12:00 ~ PM 10:00"
- },
- "copy-permalink": "パーマリンクをコピー",
- "permalink-copied": "パーマリンクがコピーされました!",
- "reset": "Turnip Prophetをリセット",
- "reset-warning": "本当に全てをリセットしますか?\n\nリセットしたら後戻りはできませんよ!"
- },
- "weekdays": {
- "monday": "月曜日",
- "tuesday": "火曜日",
- "wednesday": "水曜日",
- "thursday": "木曜日",
- "friday": "金曜日",
- "saturday" : "土曜日",
- "sunday": "日曜日",
- "abr": {
- "monday": "月",
- "tuesday": "火",
- "wednesday": "水",
- "thursday": "木",
- "friday": "金",
- "saturday" : "土"
- }
- },
- "times": {
- "morning": "午前",
- "afternoon": "午後"
- },
- "output": {
- "title": "結果",
- "chance": "% 確率",
- "to": "~",
- "minimum": "保証される最小の収入",
- "maximum": "予測される限界の収入",
- "chart": {
- "input": "カブ価",
- "minimum": "保証される最小の収入",
- "maximum": "予測される限界の収入"
- }
- },
- "textbox": {
- "description": "複数のカブ価を入力すると、Turnip Prophetはそれをもとに、可能性のある変動パターンを計算して表示します。",
- "development": "このアプリはまだ開発中ですが、より良いデータを提供できるようにがんばっています!",
- "thanks": "このアプリが作成できたのは、タヌキ商店のカブ価パターンを解析したNinji氏の成果 のおかげです。ありがとうございます!",
- "support": "疑問·コメント·提案などは、GitHub までお願いします。",
- "sponsor": "このプロジェクトに関わったソフトウェア開発者をスポンサーしたい場合、GitHub のページで「❤ Sponsor」をクリックしてください!",
- "contributors-text": "そして、このアプリの作成を手伝っていただいた方々に感謝します!",
- "contributors": "貢献者",
- "language": "言語",
- "theme": {
- "title": "テーマ",
- "auto": "自動",
- "light": "ライト",
- "dark": "ダーク"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/ko.json b/fun-shit/turnips/locales/ko.json
deleted file mode 100644
index 57bb6b3..0000000
--- a/fun-shit/turnips/locales/ko.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "general": {
- "daisy-mae": "무파니"
- },
- "welcome": {
- "salutation": "안녕하세요, Nook Inc. 스마트폰의 Turnip Prophet 앱을 사용해주셔서 감사합니다.",
- "description": "이 앱은 당신의 섬의 매일의 무 가격을 추적 할 수 있게 도와줍니다. 하지만 가격은 직접 입력해야 합니다!",
- "conclusion": "가격을 입력하고 나면, 이번 주 동안의 무 가격을 마법처럼 예측해줍니다."
- },
- "first-time": {
- "title": "첫 구매",
- "description": "당신의 섬에 방문한 무파니에게서 처음으로 무를 샀습니까?(패턴에 영향을 끼칩니다) ",
- "yes": "예",
- "no": "아니오"
- },
- "patterns": {
- "title": "이전 패턴",
- "description": "저번 주의 무 가격 패턴이 어떻게 됩니까?(패턴에 영향을 끼칩니다) ",
- "pattern": "패턴",
- "all": "모든 패턴",
- "decreasing": "감소",
- "fluctuating": "파동형",
- "unknown": "모름",
- "large-spike": "큰 급등",
- "small-spike": "작은 급등"
- },
- "prices": {
- "description": "이번 주에 당신의 섬에서 무를 샀을 때의 가격이 어떻게 됩니까?",
- "open": {
- "am": "오전 - 오전 8:00 ~ 오전 11:59",
- "pm": "오후 - 오후 12:00 ~ 오후 10:00"
- },
- "copy-permalink": "고유주소 복사",
- "permalink-copied": "고유주소가 복사되었습니다!",
- "reset": "Turnip Prophet 초기화",
- "reset-warning": "정말로 모든 입력한 값을 지우겠습니까?\n\n되돌릴 수 없습니다!"
- },
- "weekdays": {
- "monday": "월요일",
- "tuesday": "화요일",
- "wednesday": "수요일",
- "thursday": "목요일",
- "friday": "금요일",
- "saturday" : "토요일",
- "sunday": "일요일",
- "abr": {
- "monday": "월",
- "tuesday": "화",
- "wednesday": "수",
- "thursday": "목",
- "friday": "금",
- "saturday" : "토"
- }
- },
- "times": {
- "morning": "오전",
- "afternoon": "오후"
- },
- "output": {
- "title": "결과",
- "chance": "% 확률",
- "to": "~",
- "minimum": "최저 보장 가격",
- "maximum": "가능한 최고 가격",
- "chart": {
- "input": "입력된 가격",
- "minimum": "최저 보장 가격",
- "maximum": "가능한 최고 가격"
- }
- },
- "textbox": {
- "description": "지금까지의 무 가격을 입력하고 나면, Turnip Prophet이 당신의 섬에서 일어날 수 있는 가격 패턴을 보여줍니다.",
- "development": "이 앱은 아직 개발 중입니다. 앞으로도 계속해서 개선될 겁니다!",
- "thanks": "콩돌이와 밤돌이가 무 가격을 어떻게 결정하는지 알아낸 Ninji의 연구 가 있었기에 이 앱이 만들어질 수 있었습니다.",
- "support": "GitHub 을 통해서 문의, 의견 제시, 기여가 가능합니다",
- "contributors-text": "그리고 기여를 해주신 분들에게 감사를 표합니다!",
- "contributors": "기여해 주신 분들",
- "language": "언어"
- }
-}
diff --git a/fun-shit/turnips/locales/nl.json b/fun-shit/turnips/locales/nl.json
deleted file mode 100644
index b1f3fb9..0000000
--- a/fun-shit/turnips/locales/nl.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Hallo, en welkom bij de Turnip Prophet app op je Nook Phone.",
- "description": "Deze app laat je toe de knol-prijzen op je eiland dagelijks bij te houden, maar je moet ze zelf ingeven!",
- "conclusion": "Daarna zal de Turnip Prophet app op magische wijze de knol-prijzen berekenen die je de rest van de week zal krijgen."
- },
- "first-time": {
- "title": "Beginnende Koper",
- "description": "Is dit de eerste keer dat je knollen koopt van Daisy Mae op je eiland?(Dit beïnvloedt je patroon) ",
- "yes": "Ja",
- "no": "Nee"
- },
- "patterns": {
- "title": "Vorige Patroon",
- "description": "Wat was het patroon van je knol-prijzen vorige week?(Dit beïnvloedt je patroon) ",
- "pattern": "Patroon",
- "all": "Alle patronen",
- "decreasing": "Dalend",
- "fluctuating": "Schommelend",
- "unknown": "Ik weet het niet",
- "large-spike": "Grote Piek",
- "small-spike": "Kleine Piek"
- },
- "prices": {
- "description": "Wat was de prijs van knollen op je eiland deze week?",
- "open": {
- "am": "Voormiddag - 8:00 tot 11:59",
- "pm": "Namiddag - 12:00 tot 22:00"
- },
- "copy-permalink": "Kopieer deelbare link",
- "permalink-copied": "Deelbare link gekopieerd!",
- "reset": "Maak Turnip Prophet leeg",
- "reset-warning": "Ben je zeker dat je alle velden wil leegmaken?\n\nDit kan niet ongedaan gemaakt worden!"
- },
- "weekdays": {
- "monday": "Maandag",
- "tuesday": "Dinsdag",
- "wednesday": "Woensdag",
- "thursday": "Donderdag",
- "friday": "Vrijdag",
- "saturday" : "Zaterdag",
- "sunday": "Zondag",
- "abr": {
- "monday": "Ma",
- "tuesday": "Di",
- "wednesday": "Woe",
- "thursday": "Do",
- "friday": "Vr",
- "saturday" : "Za"
- }
- },
- "times": {
- "morning": "VM",
- "afternoon": "NM"
- },
- "output": {
- "title": "Resultaat",
- "chance": "% Kans",
- "to": "tot",
- "minimum": "Gegarandeerd Minimum",
- "maximum": "Potentieel Maximum",
- "chart": {
- "input": "Ingevoerde prijs",
- "minimum": "Gegarandeerd Minimum",
- "maximum": "Potentieel Maximum"
- }
- },
- "textbox": {
- "description": "Nadat je wat knol-prijzen hebt ingevoerd, zal de Turnip Prophet wat berekeningen doen en de verschillende mogelijke patronen voorstellen die je eiland kan vertonen.",
- "development": "Deze applicatie is nog in ontwikkeling, en zal met de tijd beter worden!",
- "thanks": "Dit alles zou niet mogelijk zijn zonder het werk van Ninji om uit te zoeken hoe Timmy en Tommy de waarde van knollen bepalen.",
- "support": "Ondersteuning, feedback en bijdrages zijn mogelijk via GitHub ",
- "sponsor": "Wil je de ontwikkelaars van dit project sponsoren? Ga naar de GitHub pagina en klik op '❤ Sponsor'",
- "contributors-text": "Oh! En laten we degenen die tot nu toe bijgedragen hebben niet vergeten te bedanken!",
- "contributors": "Bijdragers",
- "language": "Taal"
- }
-}
diff --git a/fun-shit/turnips/locales/ph.json b/fun-shit/turnips/locales/ph.json
deleted file mode 100644
index 7392ae6..0000000
--- a/fun-shit/turnips/locales/ph.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Kumusta, at maligayang pagdating sa Turnip Prophet app sa iyong Nook Phone.",
- "description": "Sa pamamagitan ng app na ito, puwede mo na subaybayan ang mga presyo ng turnip ng iyong isla araw-araw, ngunit kailangan mong ilagay ang mga presyo sa iyong sarili!",
- "conclusion": "Pagkatapos nito, ang Turnip Prophet app ay huhulaan ang magiging presyo ng singil sa iyo para sa natitirang linggo, sa pamamagitan ng mahika !"
- },
- "first-time": {
- "title": "Unang beses na Mamimili",
- "description": "Ito ba ang unang pagkakataon na ang isang residente ay namimili ng mga turnip mula kay Daisy Mae sa iyong sariling isla?(Nakakaapekto ito sa iyong pattern) ",
- "yes": "Oo",
- "no": "Hindi"
- },
- "patterns": {
- "title": "Nakaraang Pattern",
- "description": "Ano ang pattern ng presyo ng turnip noong nakaraang linggo?(Nakakaapekto ito sa iyong pattern) ",
- "pattern": "Pattern",
- "all": "Lahat ng mga pattern",
- "decreasing": "Pababa",
- "fluctuating": "Taas-Baba",
- "unknown": "Hindi ko alam",
- "large-spike": "Malaki na Pag-taas",
- "small-spike": "Maliit na Pag-taas"
- },
- "prices": {
- "description": "Ano ang presyo ng mga turnip sa linggong ito sa iyong isla?",
- "open": {
- "am": "AM - 8:00 am - 11:59 am",
- "pm": "PM - 12:00 pm - 10:00 pm"
- },
- "copy-permalink": "Kopyahin ang permalink",
- "permalink-copied": "Nakopya ang permalink!",
- "reset": "I-reset ang Turnip Prophet",
- "reset-warning": "Sigurado ka bang nais mong i-reset ang lahat ng mga patlang?\n\nHindi na ito maibabalik sa dati!"
- },
- "weekdays": {
- "monday": "Lunes",
- "tuesday": "Martes",
- "wednesday": "Miyerkules",
- "thursday": "Huwebes",
- "friday": "Biyernes",
- "saturday" : "Sabado",
- "sunday": "Linggo",
- "abr": {
- "monday": "Lunes",
- "tuesday": "Martes",
- "wednesday": "Miyerkules",
- "thursday": "Huwebes",
- "friday": "Biyernes",
- "saturday" : "Sabado"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Resulta",
- "chance": "% ng Tiyansa",
- "to": "-",
- "minimum": "Garantisadong Minimum",
- "maximum": "Potensyal na Maximum",
- "chart": {
- "input": "Na-input na Presyo",
- "minimum": "Garantisadong Minimum",
- "maximum": "Potensyal na Maximum"
- }
- },
- "textbox": {
- "description": "Pagkatapos mong mailista ang ilang mga presyo ng turnip, kakalkulahin ng Turnip Prophet ang mga numero at lilitaw ang iba't ibang mga posibleng pattern na maaaring maranasan ng iyong isla.",
- "development": "Ang app na ito ay nasa pag-unlad pa rin, ngunit mapapabuti sa paglipas ng panahon!",
- "thanks": "Lahat nang ito ay hindi posible kung wala ang tulong ni Ninji sa pag-alam kung paano pinepresyuhan ni Timmy at Tommy ang kanilang mga turnip.",
- "support": "Pumunta lamang sa GitHub para sa suporta, puna, at kontribusyon.",
- "sponsor": "Nais mo ba i-sponsor ang mga developer sa likod ng proyektong ito? Pumunta lamang sa GitHub page at i-click ang '❤ Sponsor'",
- "contributors-text": "Siya nga pala! Huwag din natin kalimutan na pasalamatan ang mga nag-bigay ng kanilang kontribusyon sa ngayon!",
- "contributors": "Contributors",
- "language": "Wika",
- "theme": {
- "title": "Tema",
- "auto": "Automatic",
- "light": "Light",
- "dark": "Dark"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/pl.json b/fun-shit/turnips/locales/pl.json
deleted file mode 100644
index d79c11b..0000000
--- a/fun-shit/turnips/locales/pl.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Cześć, witaj w aplikacji Turnip Prophet na Twoim Nook Phone.",
- "description": "Ta aplikacja pozwoli Ci codziennie śledzić ceny rzep na twojej wyspie, jednak będziesz musiał uzupełniać je samodzielnie.",
- "conclusion": "Następnie aplikacja Turnip Prophet w magiczny sposób przewidzi jakie ceny rzep będziesz mieć przez resztę tygodnia"
- },
- "first-time": {
- "title": "Kupujący po raz pierwszy",
- "description": "Czy jest to pierwszy raz gdy kupujesz rzepy od Daisy Mae na własnej wyspie?(Ta opcja wpłynie na Twój schemat) ",
- "yes": "Tak",
- "no": "Nie"
- },
- "patterns": {
- "title": "Poprzedni schemat",
- "description": "Jaka była tendencja cen rzep w poprzednim tygodniu?(Ta opcja wpłynie na Twój wzór) ",
- "pattern": "Wzór",
- "all": "Wszystkie wzory",
- "decreasing": "Malejąca",
- "fluctuating": "Zmienna",
- "unknown": "Nie pamiętam",
- "large-spike": "Duży wzrost",
- "small-spike": "Mały wzrost"
- },
- "prices": {
- "description": "Jakie ceny za rzepy były w tym tygodniu na Twojej wyspie?",
- "open": {
- "am": "Przed południem - 8:00 do 11:59 ",
- "pm": "Po południu - 12:00 do 22:00 "
- },
- "copy-permalink": "Skopiuj permalink",
- "permalink-copied": "Permalink skopiowany!",
- "reset": "Wyzeruj Turnip Prophet",
- "reset-warning": "Czy jesteś pewien, że chcesz wyzerować wszystkie pola?\n\nTej opcji nie można cofnąć!"
- },
- "weekdays": {
- "monday": "Poniedziałek",
- "tuesday": "Wtorek",
- "wednesday": "Środa",
- "thursday": "Czwartek",
- "friday": "Piątek",
- "saturday" : "Sobota",
- "sunday": "Niedziela",
- "abr": {
- "monday": "Pon",
- "tuesday": "Wt",
- "wednesday": "Śr",
- "thursday": "Czw",
- "friday": "Pt",
- "saturday" : "Sob"
- }
- },
- "times": {
- "morning": "Rano",
- "afternoon": "Popołudnie"
- },
- "output": {
- "title": "Wyniki",
- "chance": "Szansa %",
- "to": "do",
- "minimum": "Gwarantowana cena minimalna",
- "maximum": "Potencjalna najwyższa cena",
- "chart": {
- "input": "Cena wejściowa",
- "minimum": "Gwarantowana cena minimalna",
- "maximum": "Potencjalna najwyższa cena"
- }
- },
- "textbox": {
- "description": "Po tym jak wprowadzisz kilka cen rzep, Turnip Prophet dokona obliczeń i wyświetli różne prawdopodobne szablony cen, których może doświadczyć Twoja wyspa",
- "development": "Ta aplikacja wciąż jest w produkcji, lecz z czasem zostanie poprawiona!",
- "thanks": "Nie udałoby nam się to bez pracy Ninji , który dowiedział się jak Timmy and Tommy wyceniają rzepy.",
- "support": "Wsparcie, komentarze i wpłaty są możliwe pod adresem GitHub ",
- "sponsor": "Chcesz wesprzeć twórców tego projektu? Wejdź na stronę GitHub i wciśnij '❤ Sponsor'",
- "contributors-text": "Aha! I nie zapominajmy o tych, którzy dotychczas nas wspierali!",
- "contributors": "Współautorzy",
- "language": "Język"
- }
-}
diff --git a/fun-shit/turnips/locales/pt-BR.json b/fun-shit/turnips/locales/pt-BR.json
deleted file mode 100644
index e1187c0..0000000
--- a/fun-shit/turnips/locales/pt-BR.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "Olá, e bem-vindo ao aplicativo Turnip Prophet em seu Nook Phone.",
- "description": "Este aplicativo lhe permite acompanhar os preços diários de nabo em sua ilha, porém você terá que colocar os preços você mesmo!",
- "conclusion": "Depois disso, o aplicativo Turnip Prophet irá magicamente prever os preços dos nabos que você terá pelo resto da semana."
- },
- "first-time": {
- "title": "Comprador de primeira viagem",
- "description": "Esta é a primeira vez que você compra nabos de Daisy Mae em sua ilha? (Isso afeta seu padrão) ",
- "yes": "Sim",
- "no": "Não"
- },
- "patterns": {
- "title": "Padrão Anterior",
- "description": "Qual foi o padrão de preços de nabo da semana passada? (Isso afeta seu padrão) ",
- "pattern": "Padrão",
- "all": "Todos padrões",
- "decreasing": "Diminuindo",
- "fluctuating": "Flutuante",
- "unknown": "Eu não sei",
- "large-spike": "Grande Pico",
- "small-spike": "Pequeno Pico"
- },
- "prices": {
- "description": "Qual foi o preço dos nabos esta semana em sua ilha?",
- "open": {
- "am": "AM - 8:00 am até 11:59 am",
- "pm": "PM - 12:00 pm até 10:00 pm"
- },
- "copy-permalink": "Copiar permalink",
- "permalink-copied": "Permalink copiado!",
- "reset": "Redefinir Turnip Prophet",
- "reset-warning": "Tem certeza de que deseja redefinir todos os campos?\n\nIsso não pode ser desfeito!"
- },
- "weekdays": {
- "monday": "Segunda-feira",
- "tuesday": "Terça-feira",
- "wednesday": "Quarta-feira",
- "thursday": "Quinta-feira",
- "friday": "Sexta-feira",
- "saturday" : "Sábado",
- "sunday": "Domingo",
- "abr": {
- "monday": "Seg",
- "tuesday": "Ter",
- "wednesday": "Qua",
- "thursday": "Qui",
- "friday": "Sex",
- "saturday" : "Sab"
- }
- },
- "times": {
- "morning": "AM",
- "afternoon": "PM"
- },
- "output": {
- "title": "Resultado",
- "chance": "% Chance",
- "to": "to",
- "minimum": "Mínimo Garantido",
- "maximum": "Potencial Máximo",
- "chart": {
- "input": "Preço de entrada",
- "minimum": "Mínimo Garantido",
- "maximum": "Potencial Máximo"
- }
- },
- "textbox": {
- "description": "Depois de listar alguns preços de nabo, o Turnip Prophet irá calcular alguns números e exibirá os diferentes padrões possíveis que sua ilha pode experienciar.",
- "development": "Este aplicativo ainda está em desenvolvimento, mas melhorará com o tempo!",
- "thanks": "Nada disso seria possível sem o trabalho de Ninji's descobrindo como Timmy e Tommy valorizam seus nabos.",
- "support": "Suporte, comentários e contribuições estão disponíveis através do GitHub ",
- "contributors-text": "Oh! E não vamos nos esquecer de agradecer àqueles que contribuíram até agora!",
- "contributors": "Contribuidores",
- "language": "Linguagem"
- }
-}
diff --git a/fun-shit/turnips/locales/ru.json b/fun-shit/turnips/locales/ru.json
deleted file mode 100644
index 81799ff..0000000
--- a/fun-shit/turnips/locales/ru.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Дейзи Мэй"
- },
- "welcome": {
- "salutation": "Добрый день! Добро пожаловать в приложение Препсказатель на Вашем Нукофоне.",
- "description": "Это приложение позволяет Вам ежедневно отслеживать стоимость репы на Вашем острове. Будьте внимательны, Вам придется вводить ее вручную!",
- "conclusion": "После этого Препсказатель как по волшебству предскажет стоимость репы в Вашем магазине на этой неделе."
- },
- "first-time": {
- "title": "Новичок рынка репы",
- "description": "Вы впервые приобретаете репу у Дейзи Мэй на своем острове?(Это влияет на модель стоимости) ",
- "yes": "Да",
- "no": "Нет"
- },
- "patterns": {
- "title": "Предыдущая модель",
- "description": "Какая модель стоимости репы была у Вас на прошлой неделе?(Это влияет на модель стоимости) ",
- "pattern": "Модель",
- "all": "Все модели",
- "decreasing": "Постоянное снижение",
- "fluctuating": "Колебание стоимости",
- "unknown": "Не могу сказать точно",
- "large-spike": "Большой скачок",
- "small-spike": "Малый скачок"
- },
- "prices": {
- "description": "Какова была стоимость репы у Дейзи Мэй на Вашем острове на этой неделе?",
- "open": {
- "am": "Утро - 8:00 - 11:59",
- "pm": "День - 12:00 - 22:00"
- },
- "copy-permalink": "Скопировать постоянную ссылку",
- "permalink-copied": "Постоянная ссылка скопирована!",
- "reset": "Перезагрузить Препсказателя",
- "reset-warning": "Вы уверены, что хотите обнулить все поля?\n\nДанное действие необратимо!"
- },
- "weekdays": {
- "monday": "Понедельник",
- "tuesday": "Вторник",
- "wednesday": "Среда",
- "thursday": "Четверг",
- "friday": "Пятница",
- "saturday" : "Суббота",
- "sunday": "Воскресенье",
- "abr": {
- "monday": "Пн",
- "tuesday": "Вт",
- "wednesday": "Ср",
- "thursday": "Чт",
- "friday": "Пт",
- "saturday" : "Сб"
- }
- },
- "times": {
- "morning": "Утро",
- "afternoon": "День"
- },
- "output": {
- "title": "Вывод модели",
- "chance": "Вероятность в %",
- "to": "-",
- "minimum": "Гарантированный минимум",
- "maximum": "Возможный максимум",
- "chart": {
- "input": "Введенная стоимость",
- "minimum": "Гарантированный минимум",
- "maximum": "Возможный максимум"
- }
- },
- "textbox": {
- "description": "После того, как Вы введете уже известную Вам стоимость репы, Препсказатель посчитает и покажет различные вероятные для Вашего острова модели стоимости репы.",
- "development": "Это приложение пока еще в разработке, но со временем обязательно станет лучше!",
- "thanks": "Если бы Ninji не смог разузнать, как Тимми и Томми определяют стоимость репы, данного приложения могло бы и не быть!",
- "support": "Поддержать нас, прокомментировать, а также внести свой вклад Вы можете на GitHub ",
- "sponsor": "Хотели бы поддержать разработчиков проекта? Для этого Вы можете перейти на GitHub и нажать '❤ Sponsor'",
- "contributors-text": "Точно! Нельзя забывать тех, кто уже помог проекту!",
- "contributors": "Вклад внесли",
- "language": "Язык"
- }
-}
diff --git a/fun-shit/turnips/locales/th.json b/fun-shit/turnips/locales/th.json
deleted file mode 100644
index da44cee..0000000
--- a/fun-shit/turnips/locales/th.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "general": {
- "daisy-mae": "Daisy Mae"
- },
- "welcome": {
- "salutation": "สวัสดีจ้า ยินดีต้อนรับสู่โปรแกรม Turnip Prophet บน Nook Phone ของคุณ",
- "description": "โปรแกรมนี้จะช่วยให้คุณสามารถจดบันทึกราคาหัวผักกาดรายวันบนเกาะของคุณ แต่ต้องจดเองนะ!",
- "conclusion": "หลังจากนั้น Turnip Prophet จะทำการพยากรณ์ ราคาหัวผักกาดตลอดทั้งสัปดาห์ที่เป็นไปได้ให้คุณ"
- },
- "first-time": {
- "title": "ซื้อครั้งแรก",
- "description": "นี่เป็นครั้งแรกที่คุณซื้อหัวผักกาดจากน้องหมูอู๊ดๆ Daisy Mae บนเกาะของคุณรีเปล่า ?(มีผลกับการคำนวณรูปแบบราคา) ",
- "yes": "ใช่",
- "no": "ไม่"
- },
- "patterns": {
- "title": "รูปแบบก่อนหน้า",
- "description": "รูปแบบของราคาสัปดาห์ที่แล้ว?(มีผลกับการคำนวณรูปแบบราคา) ",
- "pattern": "รูปแบบ",
- "all": "รูปแบบทั้งหมด",
- "decreasing": "ลดลง",
- "fluctuating": "ผันผวน",
- "unknown": "ไม่รู้สิ!",
- "large-spike": "พุ่งขึ้นสูงมาก",
- "small-spike": "พุ่งขึ้นเล็กน้อย"
- },
- "prices": {
- "description": "ราคาหัวผักกาดบนเกาะของคุณสัปดาห์นี้?",
- "open": {
- "am": "เช้า - 08.00 นาฬิกา ถึง 11.59 นาฬิกา",
- "pm": "บ่าย - 12:00 นาฬิกา to 22:00 นาฬิกา"
- },
- "copy-permalink": "คัดลอก Permalink",
- "permalink-copied": "Permalink คัดลอกแล้วจ้า!",
- "reset": "รีเซ็ต Turnip Prophet",
- "reset-warning": "แน่ใจนะว่าจะล้างข้อมูลทั้งหมด?\n\nแก้ไขอีกไม่ได้แล้วนา!"
- },
- "weekdays": {
- "monday": "วันจันทร์",
- "tuesday": "วันอังคาร",
- "wednesday": "วันพุธ",
- "thursday": "วันพฤหัสบดี",
- "friday": "วันศุกร์",
- "saturday" : "วันเสาร์",
- "sunday": "วันอาทิตย์",
- "abr": {
- "monday": "จันทร์",
- "tuesday": "อังคาร",
- "wednesday": "พุธ",
- "thursday": "พฤหัส",
- "friday": "ศุกร์",
- "saturday" : "เสาร์"
- }
- },
- "times": {
- "morning": "เช้า",
- "afternoon": "บ่าย"
- },
- "output": {
- "title": "ผลลัพธ์",
- "chance": "โอกาส %",
- "to": "ถึง",
- "minimum": "การันตีต่ำสุด",
- "maximum": "เป็นไปได้สูงสุด",
- "chart": {
- "input": "ราคา",
- "minimum": "การันตีต่ำสุด",
- "maximum": "เป็นไปได้สูงสุด"
- }
- },
- "textbox": {
- "description": "หลังจากใส่ราคาหัวผักกาดไปได้บางส่วน โปรแกรม Turnip Prophet จะทำการแสดงตัวเลขราคาและความเป็นไปได้ของรูปแบบต่าง ๆ ที่เกาะของคุณจะเจอ",
- "development": "โปรแกรมนี้ยังอยู่ในขั้นตอนพัฒนา แต่จะค่อยๆปรับปรุงขึ้นเรื่อยๆ!",
- "thanks": "ทั้งหมดนี้ไม่อาจเกิดขึ้นได้เลยถ้าปราศจากผลงานของ Ninji ที่ค้นพบวิธีการให้ราคาหัวผักกาดของทานุกิน้อย Timmy และ Tommy",
- "support": "สนับสนุน, แสดงความเห็นและช่วยพัฒนาได้ที่ GitHub ",
- "sponsor": "ต้องการเป็นสปอนเซอร์แก่นักพัฒนา? ไปที่ GitHub และเลือก '❤ Sponsor'",
- "contributors-text": "อ้อ! และต้องไม่ลืมที่จะขอบคุณผู้ที่ช่วยร่วมพัฒนามาจนถึงตอนนี้!",
- "contributors": "ผู้ร่วมพัฒนา",
- "language": "ภาษา"
- }
- }
diff --git a/fun-shit/turnips/locales/ua.json b/fun-shit/turnips/locales/ua.json
deleted file mode 100644
index 2f5239d..0000000
--- a/fun-shit/turnips/locales/ua.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "Дейзі Мей"
- },
- "welcome": {
- "salutation": "Добрий день! Вітаємо в додатку Turnip Prophet на Вашому Нукофоні.",
- "description": "Цей додаток дозволяє Вам відслідковувати ціни ріпи на Вашому острові щоденно, але Вам доведеться вписати ціни власноруч!",
- "conclusion": "Після цього, додаток Turnip Prophet магічним способом передбачить ціни ріпи на Вашому острові на решту тижня."
- },
- "first-time": {
- "title": "Перша покупка ріпи",
- "description": "Ви купуєте ріпу від Дейзі Мей на своєму острові вперше?(Це має вплив на модель ціни) ",
- "yes": "Так",
- "no": "Ні"
- },
- "patterns": {
- "title": "Попередня модель ціни",
- "description": "Яка модель ціни була попереднього тижня?(Це має вплив на модель ціни) ",
- "pattern": "Модель",
- "all": "Всі моделі",
- "decreasing": "Спадаюча",
- "fluctuating": "Нестабільна",
- "unknown": "Не знаю",
- "large-spike": "Великий скачок",
- "small-spike": "Малий скачок"
- },
- "prices": {
- "description": "Які ціни ріпи були на Вашому острові цього тижня?",
- "open": {
- "am": "Перед обідом - від 8:00 до 11:59",
- "pm": "Після обіду - від 12:00 до 22:00"
- },
- "copy-permalink": "Копіювати посилання",
- "permalink-copied": "Посилання скопійоване!",
- "reset": "Перезапустити Turnip Prophet",
- "reset-warning": "Ви впевнені що хочете стерти всі поля?\n\nВтрачені дані неможливо повернути!"
- },
- "weekdays": {
- "monday": "Понеділок",
- "tuesday": "Вівторок",
- "wednesday": "Середа",
- "thursday": "Четвер",
- "friday": "П'ятниця",
- "saturday" : "Субота",
- "sunday": "Неділя",
- "abr": {
- "monday": "Пон.",
- "tuesday": "Вівт.",
- "wednesday": "Сер.",
- "thursday": "Четв.",
- "friday": "П'ятн.",
- "saturday" : "Суб."
- }
- },
- "times": {
- "morning": "Перед обідом",
- "afternoon": "Після обіду"
- },
- "output": {
- "title": "Результат",
- "chance": "% Шансу",
- "to": "до",
- "minimum": "Гарантований мінімум",
- "maximum": "Можливий максимум",
- "chart": {
- "input": "Вхідна ціна",
- "minimum": "Гарантований мінімум",
- "maximum": "Можливий максимум"
- }
- },
- "textbox": {
- "description": "Після того, як Ви запишете делілька цін на ріпу, додаток Turnip Prophet підрахує і покаже різні можливі моделі цін на Вашому острові.",
- "development": "Цей додаток ще в розробці, але напевно з часом покращиться!",
- "thanks": "Цей додаток не був би можливий без праці Ninji , котрий дізнався як саме Тіммі і Томмі оцінюють їх ріпу.",
- "support": "Ви можете підтримати, зробити коментар, або внесок до проекту на сторінці GitHub ",
- "sponsor": "Хочете заспонсорувати розробників проекту? Відвідайте сторінку GitHub і натисніть '❤ Sponsor'",
- "contributors-text": "До речі! Не забудьмо подякувати людям, які зробили внесок до проекту!",
- "contributors": "Зробили внесок",
- "language": "Мова",
- "theme": {
- "title": "Тема",
- "auto": "Автоматична",
- "light": "Світла",
- "dark": "Темна"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/zh-CN.json b/fun-shit/turnips/locales/zh-CN.json
deleted file mode 100644
index 0e2088c..0000000
--- a/fun-shit/turnips/locales/zh-CN.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "曹卖"
- },
- "welcome": {
- "salutation": "大家好,欢迎使用Nook手机上的大头菜预测工具 。",
- "description": "这个APP可以让你每天跟踪自己岛上大头菜的价格,但你得自己把价格填写进去!",
- "conclusion": "之后,大头菜预测工具会神奇地 预测出本周剩余时间的大头菜价格。"
- },
- "first-time": {
- "title": "首次购买",
- "description": "你是第一次在自己岛上购买大头菜吗?(将影响预测趋势) ",
- "yes": "是",
- "no": "否"
- },
- "patterns": {
- "title": "上周趋势",
- "description": "上周大头菜的价格趋势是?(将影响预测趋势) ",
- "pattern": "趋势",
- "all": "所有趋势",
- "decreasing": "递减型",
- "fluctuating": "波动型",
- "unknown": "不知道",
- "large-spike": "大幅上涨(三期型)",
- "small-spike": "小幅上涨(四期型)"
- },
- "prices": {
- "description": "本周你的岛上大头菜的购买价格是多少?",
- "open": {
- "am": "上午 - 8:00 ~ 11:59",
- "pm": "下午 - 12:00 ~ 22:00"
- },
- "copy-permalink": "复制价格分享链接",
- "permalink-copied": "链接已复制!",
- "reset": "重置大头菜预测工具",
- "reset-warning": "你确定要重置所有字段吗?\n\n此操作不可撤销!"
- },
- "weekdays": {
- "monday": "周一",
- "tuesday": "周二",
- "wednesday": "周三",
- "thursday": "周四",
- "friday": "周五",
- "saturday" : "周六",
- "sunday": "周日",
- "abr": {
- "monday": "周一",
- "tuesday": "周二",
- "wednesday": "周三",
- "thursday": "周四",
- "friday": "周五",
- "saturday" : "周六"
- }
- },
- "times": {
- "morning": "上午",
- "afternoon": "下午"
- },
- "output": {
- "title": "结果",
- "chance": "几率(%)",
- "to": "~",
- "minimum": "保底价格",
- "maximum": "最高价格",
- "chart": {
- "input": "输入价格",
- "minimum": "保底价格",
- "maximum": "最高价格"
- }
- },
- "textbox": {
- "description": "在填写一些大头菜价格后,大头菜预测工具将预测大头菜的价格并显示本周可能的趋势。",
- "development": "APP仍在开发中,但会随着时间的推移不断完善!",
- "thanks": "如果不是 Ninji 发现豆狸和粒狸如何给大头菜定价的,这一切将不可能实现。",
- "support": "可以在 GitHub 获得支持,或讨论和贡献",
- "sponsor": "想要赞助这个项目的开发者?进入 GitHub 并点击 ❤ Sponsor",
- "contributors-text": "哦!别忘记感谢那些至今为止做出过贡献的人。",
- "contributors": "贡献者",
- "language": "语言",
- "theme": {
- "title": "主题",
- "auto": "自动",
- "light": "亮色",
- "dark": "暗色"
- }
- }
-}
diff --git a/fun-shit/turnips/locales/zh-TW.json b/fun-shit/turnips/locales/zh-TW.json
deleted file mode 100644
index 249fa62..0000000
--- a/fun-shit/turnips/locales/zh-TW.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "general": {
- "daisy-mae": "曹賣"
- },
- "welcome": {
- "salutation": "你好,歡迎使用 Nook 手機上的 Turnip Prophet 。",
- "description": "這個工具可以讓你每天追蹤自己島上的大頭菜價格,但你必須自己輸入價格!",
- "conclusion": "接下來,Turnip Prophet 將 神奇地 預測本週剩餘時間的大頭菜價格。"
- },
- "first-time": {
- "title": "首次購買",
- "description": "這是你第一次從自己島上和曹賣購買大頭菜嗎?(將影響這次的模型) ",
- "yes": "是",
- "no": "否"
- },
- "patterns": {
- "title": "上次的模型",
- "description": "上週大頭菜的價格模型是什麼?(將影響這次的模型) ",
- "pattern": "模型",
- "all": "所有模型",
- "decreasing": "遞減型",
- "fluctuating": "波型",
- "unknown": "不知道",
- "large-spike": "三期型",
- "small-spike": "四期型"
- },
- "prices": {
- "description": "本週自己島上的大頭菜買價?",
- "open": {
- "am": "上午 - 08:00 到 11:59",
- "pm": "下午 - 12:00 到 22:00"
- },
- "copy-permalink": "複製價格分享網址",
- "permalink-copied": "網址已複製!",
- "reset": "清除資料",
- "reset-warning": "是否確定要清除所有資料?\n\n此動作無法復原!"
- },
- "weekdays": {
- "monday": "星期一",
- "tuesday": "星期二",
- "wednesday": "星期三",
- "thursday": "星期四",
- "friday": "星期五",
- "saturday" : "星期六",
- "sunday": "星期日",
- "abr": {
- "monday": "週一",
- "tuesday": "週二",
- "wednesday": "週三",
- "thursday": "週四",
- "friday": "週五",
- "saturday" : "週六"
- }
- },
- "times": {
- "morning": "上午",
- "afternoon": "下午"
- },
- "output": {
- "title": "結果",
- "chance": "機率(%)",
- "to": "~",
- "minimum": "保底價格",
- "maximum": "最高價格",
- "chart": {
- "input": "輸入價格",
- "minimum": "保底價格",
- "maximum": "最高價格"
- }
- },
- "textbox": {
- "description": "在你記錄了一些大頭菜價格後,Turnip Prophet 會預測,並顯示自己島上可能出現的不同模型。",
- "development": "此工具仍在開發中,但會隨著時間的推移而改善!",
- "thanks": "要不是 Ninji 協助釐清豆狸和粒狸的大頭菜估價方式,這一切都不可能實現。",
- "support": "可於 GitHub 取得支援、討論及貢獻。",
- "sponsor": "想要贊助這個專案的開發者?進入 GitHub 並按下 ❤ Sponsor",
- "contributors-text": "嘿!別忘了感謝那些迄今為止作出貢獻的人!",
- "contributors": "貢獻者",
- "language": "語言",
- "theme": {
- "title": "主題",
- "auto": "自動",
- "light": "亮色",
- "dark": "暗色"
- }
- }
-}
diff --git a/fun-shit/turnips/manifest.json b/fun-shit/turnips/manifest.json
deleted file mode 100644
index b6763ed..0000000
--- a/fun-shit/turnips/manifest.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "Turnip Prophet - ACNH Turnip Tracker",
- "short_name": "Turnip Prophet",
- "description": "An app to track your Animal Crossing: New Horizons turnip prices daily!",
- "start_url": "index.html",
- "display": "standalone",
- "background_color": "#def2d9",
- "theme_color": "#def2d9",
- "icons": [
- {
- "src": "/img/favicon-192.png",
- "sizes": "192x192"
- },
- {
- "src": "/img/favicon-512.png",
- "sizes": "512x512"
- }
- ]
-}
diff --git a/fun-shit/turnips/service-worker.js b/fun-shit/turnips/service-worker.js
deleted file mode 100644
index 499d0ca..0000000
--- a/fun-shit/turnips/service-worker.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// PWA Code adapted from https://github.com/pwa-builder/PWABuilder
-const CACHE = "pwa-precache-v1";
-const precacheFiles = [
- "/index.html",
- "/js/predictions.js",
- "/js/scripts.js",
- "/css/styles.css",
- "https://code.jquery.com/jquery-3.4.1.min.js",
-];
-
-self.addEventListener("install", function (event) {
- console.log("[PWA] Install Event processing");
-
- console.log("[PWA] Skip waiting on install");
- self.skipWaiting();
-
- event.waitUntil(
- caches.open(CACHE).then(function (cache) {
- console.log("[PWA] Caching pages during install");
- return cache.addAll(precacheFiles);
- })
- );
-});
-
-// Allow sw to control of current page
-self.addEventListener("activate", function (event) {
- console.log("[PWA] Claiming clients for current page");
- event.waitUntil(self.clients.claim());
-});
-
-// If any fetch fails, it will look for the request in the cache and serve it from there first
-self.addEventListener("fetch", function (event) {
- if (event.request.method !== "GET") return;
-
- event.respondWith(
- (async () => {
- let response;
- try {
- // Fetch from network first.
- response = await fetch(event.request);
- event.waitUntil(updateCache(event.request, response.clone()));
- } catch (error) {
- try {
- // Try if there's locally cached version.
- response = await fromCache(event.request);
- } catch (error) {
- console.log("[PWA] Network request failed and no cache." + error);
- throw error;
- }
- }
- return response;
- })()
- );
-});
-
-function fromCache(request) {
- // Check to see if you have it in the cache
- // Return response
- // If not in the cache, then return
- return caches.open(CACHE).then(function (cache) {
- return cache.match(request).then(function (matching) {
- if (!matching || matching.status === 404) {
- return Promise.reject("no-match");
- }
-
- return matching;
- });
- });
-}
-
-function updateCache(request, response) {
- return caches.open(CACHE).then(function (cache) {
- return cache.put(request, response);
- });
-}