Repository: Kyome22/RunCat365 Branch: main Commit: 8fa6fffa19c3 Files: 58 Total size: 287.6 KB Directory structure: gitextract_oo1ijy8f/ ├── .claude/ │ └── skills/ │ ├── add-localization/ │ │ └── SKILL.md │ └── create-pr/ │ └── SKILL.md ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── feature_request.yml │ ├── how_to_release.md │ └── pull_request_template.md ├── .gitignore ├── CLAUDE.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── RunCat365/ │ ├── App.config │ ├── App.manifest │ ├── BalloonTipType.cs │ ├── BitmapExtension.cs │ ├── ByteFormatter.cs │ ├── CPURepository.cs │ ├── Cat.cs │ ├── ContextMenuManager.cs │ ├── ContextMenuRenderer.cs │ ├── CustomToolStripMenuItem.cs │ ├── EndlessGameForm.cs │ ├── EndlessGameForm.resx │ ├── FPSMaxLimit.cs │ ├── GPURepository.cs │ ├── GameStatus.cs │ ├── LaunchAtStartupManager.cs │ ├── MemoryRepository.cs │ ├── NetworkRepository.cs │ ├── Program.cs │ ├── Properties/ │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Strings.Designer.cs │ │ ├── Strings.de.resx │ │ ├── Strings.es.resx │ │ ├── Strings.fr.resx │ │ ├── Strings.ja.resx │ │ ├── Strings.resx │ │ ├── Strings.zh-CN.resx │ │ ├── Strings.zh-TW.resx │ │ ├── UserSettings.Designer.cs │ │ └── UserSettings.settings │ ├── Road.cs │ ├── RunCat365.csproj │ ├── Runner.cs │ ├── SpeedSource.cs │ ├── StorageRepository.cs │ ├── SupportedLanguage.cs │ ├── Theme.cs │ └── TreeFormatter.cs ├── RunCat365.sln ├── WapForStore/ │ ├── AppPackages/ │ │ └── rm-wap-for-store.sh │ ├── Package.StoreAssociation.xml │ ├── Package.appxmanifest │ └── WapForStore.wapproj └── docs/ ├── index.html ├── privacy_policy.html └── style.css ================================================ FILE CONTENTS ================================================ ================================================ FILE: .claude/skills/add-localization/SKILL.md ================================================ --- name: add-localization description: Adds a new language locale to RunCat365. Use when adding a new language, translating the UI, creating a .resx resource file, or updating SupportedLanguage.cs with a new language code. argument-hint: --- # Add a New Localization to RunCat365 Modify 3 files to add support for `$ARGUMENTS`. French (`fr`) is used as an example. ## Steps ### 1. Create `RunCat365/Properties/Strings.{lc}.resx` Read `RunCat365/Properties/Strings.resx` for all keys and their English values. Use `Strings.es.resx` as the structural template. - File name: `Strings.{lc}.resx` (e.g. `Strings.fr.resx`) - Copy the XML header, schema, and `` blocks verbatim from `Strings.es.resx` - Include every key from `Strings.resx` — no more, no less — with each `` translated - Keep all attribute names, XML structure, and `` content in English; translate only `` text - Verify every key from `Strings.resx` is present in the new file ### 2. Edit `RunCat365/SupportedLanguage.cs` Add the language to the `SupportedLanguage` enum: ```csharp enum SupportedLanguage { English, Japanese, Spanish, French, } ``` Add the ISO code to `GetCurrentLanguage()`: ```csharp return culture.TwoLetterISOLanguageName switch { "ja" => SupportedLanguage.Japanese, "es" => SupportedLanguage.Spanish, "fr" => SupportedLanguage.French, _ => SupportedLanguage.English, }; ``` Add the culture to `GetDefaultCultureInfo()`: ```csharp return language switch { SupportedLanguage.Japanese => new CultureInfo("ja-JP"), SupportedLanguage.Spanish => new CultureInfo("es-ES"), SupportedLanguage.French => new CultureInfo("fr-FR"), _ => new CultureInfo("en-US"), }; ``` Add the font to `GetFontName()` — use `"Consolas"` for Latin-script languages: ```csharp return language switch { SupportedLanguage.Japanese => "Noto Sans JP", SupportedLanguage.Spanish => "Consolas", SupportedLanguage.French => "Consolas", _ => "Consolas", }; ``` Add the full-width flag to `IsFullWidth()` — use `false` for Latin-script languages: ```csharp return language switch { SupportedLanguage.Japanese => true, SupportedLanguage.Spanish => false, SupportedLanguage.French => false, _ => false, }; ``` ### 3. Update `CLAUDE.md` Update the Localization notes to include the new language: ``` **Localization notes:** - Add new strings to all four `.resx` files simultaneously - Japanese uses "Noto Sans JP" font; English/Spanish/French use "Consolas" ``` ## Checklist - [ ] Created `Strings.{lc}.resx` with all keys translated - [ ] Added language to the `SupportedLanguage` enum - [ ] Added ISO code to `GetCurrentLanguage()` - [ ] Added culture to `GetDefaultCultureInfo()` - [ ] Added font to `GetFontName()` - [ ] Added full-width flag to `IsFullWidth()` - [ ] Updated Localization notes in `CLAUDE.md` - [ ] Built in Visual Studio and verified UI with OS language set to the target language ================================================ FILE: .claude/skills/create-pr/SKILL.md ================================================ --- name: create-pr description: Creates a GitHub Pull Request for RunCat365 following the project's PR template. Use this skill whenever the user wants to open, submit, or create a PR, pull request, or wants to propose changes to the main branch. --- # Create a Pull Request for RunCat365 Follow these steps to create a PR that conforms to the `.github/pull_request_template.md`. ## Step 1: Gather branch information Run these commands in parallel to understand the changes: ```bash git log main..HEAD --oneline git diff main..HEAD --stat git diff main..HEAD ``` Also check the current branch name: ```bash git branch --show-current ``` ## Step 2: Determine the PR type Based on the diff, classify the change as exactly one of: | Type | When to use | | --------------- | ---------------------------------------------------------------- | | **Bug Fix** | Corrects incorrect behavior without adding new functionality | | **Refactoring** | Improves code structure or readability without changing behavior | | **New Feature** | Adds new user-visible functionality | | **Others** | Documentation, CI changes, build config, etc. | If unsure, ask the user before proceeding. ## Step 3: Draft the PR body **IMPORTANT: The entire PR body must be written in English, regardless of the language the user is communicating in.** Fill in the template below. Every section must be present — do not omit any. ```markdown ## Context of Contribution - [x] Bug Fix ← check only the one that applies - [ ] Refactoring - [ ] New Feature - [ ] Others ## Summary of the Proposal ## Reason for the new feature ## Checklist - [x] This PR does not contain commits of multiple contexts. - [x] Code follows proper indentation and naming conventions. - [x] Implemented using only APIs that can be submitted to the Microsoft Store. - [x] Works correctly in both dark theme and light theme. - [x] Works correctly on any device. ``` **Checklist rules:** - All checklist items default to `[x]` (checked). - If you have reason to believe an item may **not** hold (e.g., the change is UI-only so dark/light theme was not verifiable), leave it as `[ ]` and note the concern in the Summary. - The "multiple contexts" item is `[x]` only if all commits on this branch belong to a single topic. If they don't, warn the user before creating the PR. ## Step 4: Generate a concise PR title - Under 70 characters - Imperative form, e.g. "Add French localization" or "Fix CPU usage spike on wake" - Do not prefix with a tag like `feat:` or `fix:` — this repo does not use Conventional Commits ## Step 5: Confirm with the user Show the user: - The proposed **title** - The full **body** (rendered as markdown if possible) Ask: "Does this look right? Any changes before I create the PR?" Make requested edits, then proceed only after the user confirms. ## Step 6: Create the PR ```bash gh pr create \ --title "" \ --body "$(cat <<'EOF' <body> EOF )" \ --base main ``` Return the PR URL to the user. ## Notes - Always target `main` as the base branch unless the user specifies otherwise. - Do not push the branch yourself — assume it is already pushed. If `gh pr create` fails because the branch has no upstream, run `git push -u origin HEAD` first and inform the user. - If the branch already has an open PR, use `gh pr edit` to update it instead of creating a duplicate. ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: Bug Report description: File a bug report. title: "[Bug]: " labels: ["bug"] body: - type: markdown attributes: value: | We do not accept issues in languages other than English. - type: input id: version attributes: label: "App version" validations: required: true - type: textarea id: bug-description attributes: label: "Describe the bug" description: "A clear and concise description of what the bug is." validations: required: true - type: textarea id: steps-to-reproduce attributes: label: "How to reproduce" description: "Steps to reproduce the bug." value: | 1. 2. 3. ... validations: required: true - type: textarea id: expected-behavior attributes: label: "Expected behavior" description: "A description of what you expected to happen." validations: required: true - type: textarea id: screenshots attributes: label: "Screenshots" description: "If possible, attach screenshots." validations: required: false - type: checkboxes id: checklist attributes: label: "Check List" options: - label: "Uninstalled App." required: true - label: "Re-launched your computer." required: true - label: "Checked that no similar issues already exist." required: true ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: Feature Request description: File a feature request. title: "[Idea]: " labels: ["enhancement"] body: - type: markdown attributes: value: | We do not accept requests in languages other than English. - type: textarea id: overview attributes: label: "Overview of the requested feature" description: "Please provide a brief summary of the feature you're requesting." validations: required: true - type: textarea id: reason attributes: label: "Reason for the request" description: "Explain why this feature is needed and what motivated your request." validations: required: true - type: textarea id: related-issues attributes: label: "Related Issues" description: "Link to related issues, if applicable." validations: required: false - type: checkboxes id: checklist attributes: label: "Check List" options: - label: "The proposed feature is beneficial to a wide range of users and not just a personal preference." required: true - label: "Checked that no similar requests already exist." required: true ================================================ FILE: .github/how_to_release.md ================================================ # How to Release a New Version to Microsoft Store This document is for code owners. ## 1. Update Version Numbers Version numbers must be updated in **two** locations: 1. **RunCat365/RunCat365.csproj** - Update `<Version>X.Y.Z</Version>` (3-digit format) 2. **WapForStore/Package.appxmanifest** - Update `Version="X.Y.Z.0"` in the `<Identity>` element (4-digit format) ## 2. Build the App 1. Open the solution in Visual Studio 2. Verify the build succeeds in Release configuration ## 3. Create the Package 1. In Visual Studio, right-click on the **WapForStore** project 2. Select **Publish** > **Create App Packages** 3. Choose **Microsoft Store as MSIX package** and sign in with your Microsoft account 4. Select the existing app "RunCat 365" 5. Configure package settings (x64, arm64, etc.) 6. Generate the `.msixupload` file ## 4. Submit to Partner Center 1. Sign in to [Partner Center](https://partner.microsoft.com/dashboard) 2. Navigate to **Apps and games** > **RunCat 365** 3. Click **Start a new submission** 4. Update the following sections: - **Packages**: Upload the generated `.msixupload` file - **Store listings**: Update description/screenshots if needed - **Release notes**: Describe changes in this version 5. Click **Submit to the Store** ## 5. Wait for Certification - Certification typically takes 1-3 business days - If issues are found, fix them and resubmit ================================================ FILE: .github/pull_request_template.md ================================================ ## Context of Contribution <!-- Each pull request should fix only one issue or propose one feature. --> <!-- Do not mix unrelated changes in a single PR. --> - [ ] Bug Fix - [ ] Refactoring - [ ] New Feature - [ ] Others ## Summary of the Proposal <!-- Provide a concise summary of what this pull request proposes. --> ## Reason for the new feature <!-- If it's a new feature, explain why this feature is necessary. --> <!-- Explain how important this feature is to many users. --> <!-- Explain if the benefits of the new feature outweigh the maintenance cost. --> ## Checklist - [ ] This PR does not contain commits of multiple contexts. - [ ] Code follows proper indentation and naming conventions. - [ ] Implemented using only APIs that can be submitted to the Microsoft Store. - [ ] Works correctly in both dark theme and light theme. - [ ] Works correctly on any device. ================================================ FILE: .gitignore ================================================ # Visual Studio .vs/ bin/ obj/ [Ll]og/ [Ll]ogs/ .DS_Store TestResults /WapForStore/AppPackages/** !/WapForStore/AppPackages/rm-wap-for-store.sh BundleArtifacts/ # User-specific files *.suo *.user *.userosscache *.sln.docstates # Wap WapForStore/**/*.assets.cache ================================================ FILE: CLAUDE.md ================================================ # CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## You Must - Please respond in Japanese. - Commit to Git only when instructed. - If multiple requirements are given in a single instruction, divide the commits into appropriate sizes/granularities. ## Build & Development This is a Windows Forms application (.NET 9.0 / C#) for Microsoft Store distribution. **Solution structure:** - `RunCat365.sln` - Main solution file - `RunCat365/` - Main application project - `WapForStore/` - Windows Application Packaging project for Microsoft Store **Build:** - Open `RunCat365.sln` in Visual Studio - Supported platforms: x64, x86, ARM64 - Target framework: .NET 9.0 (Windows 10.0.26100.0) **Version numbers** must be updated in two places when releasing: 1. `RunCat365/RunCat365.csproj` - `<Version>X.Y.Z</Version>` (3-digit) 2. `WapForStore/Package.appxmanifest` - `Version="X.Y.Z.0"` in `<Identity>` element (4-digit) ## Architecture **Entry point:** `Program.cs` contains `RunCat365ApplicationContext` which manages the application lifecycle as a system tray application. **Core components:** - `ContextMenuManager` - Manages the system tray icon, context menu, and notification icon animation; uses `iconLock` for thread-safe icon updates - `Runner` - Enum for animation types (Cat, Parrot, Horse) with frame counts - `EndlessGameForm` - Mini-game featuring the running cat - `LaunchAtStartupManager` - Startup registration via Windows App Runtime **System information repositories (Repository pattern):** - `CPURepository` - CPU usage via PerformanceCounter - `GPURepository` - GPU usage monitoring - `MemoryRepository` - Memory usage - `StorageRepository` - Disk usage - `NetworkRepository` - Network statistics **Animation flow:** 1. `fetchTimer` (1s interval) updates system info into `*Info` structs (CPUInfo, GPUInfo, etc.) 2. `animateTimer` advances frames based on the selected `SpeedSource` (CPU/GPU/Memory) 3. `BitmapExtension` handles theme-aware icon recoloring and conversion **EndlessGame components:** - `Cat` - Running/Jumping state and collision frame data - `Road` - Obstacle types (Flat/Hill/Crater/Sprout) - `GameStatus` - Game state (NewGame/Playing/GameOver) **Utilities:** - `ByteFormatter` - Formats byte values to human-readable strings (B/KB/MB/GB/TB) - `TreeFormatter` - Formats system info for context menu display (language-aware) **Settings:** - `Properties/UserSettings.settings` - User preferences (Runner, Theme, SpeedSource, FPSMaxLimit) - `Properties/Resources.resx` - Embedded images and icons - `Properties/Strings.resx` - Localized strings (English default); - `Strings.zh-CN.resx` (Chinese (simplified)) - `Strings.zh-TW.resx` (Chinese (traditional)) - `Strings.fr.resx` (French) - `Strings.de.resx` (German) - `Strings.ja.resx` (Japanese) - `Strings.es.resx` (Spanish) **Localization notes:** - Add new strings to all seven `.resx` files simultaneously - English/Spanish/French/German use "Consolas" - Japanese uses "Noto Sans JP" font - Chinese (simplified) uses "Microsoft YaHei" font - Chinese (traditional) uses "Microsoft JhengHei" font ## Coding Rules - Do not write comments within the source code. - Use naming conventions that clearly indicate the purpose of the code, even without comments. - In C# code: - Abbreviations such as URL or ID should be written in all lowercase or all uppercase (do not use Upper Camel Case for these prefixes). - Do not use abbreviations such as `img` for `image` or `cnt` for `count`. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to RunCat365 Thank you for your interest in contributing to **RunCat365** 🐈 RunCat365 is a Windows system monitoring application represented as a running cat animation. All kinds of contributions are welcome: bug reports, feature requests, and code contributions. This document describes the rules, steps, and expectations for contributing to this project. --- ## Before Getting Started - **Only contributions in English are accepted.** Any contribution in another language may be closed. - **This project is Windows-only.** Issues or requests related to Linux, macOS, or other platforms will not be accepted. - Always use the provided **Issue** and **Pull Request** templates. Submissions that do not follow the templates may be closed. - Be respectful, constructive, and professional in all interactions. --- ## Table of Contents - [Before Getting Started](#before-getting-started) - [Issues](#issues) - [Bug Reports](#bug-reports) - [Feature Requests](#feature-requests) - [Other Issues](#other-issues) - [Pull Requests](#pull-requests) - [Before Opening a Pull Request](#before-opening-a-pull-request) - [Cloning and Working on the Repository](#cloning-and-working-on-the-repository) - [Submitting a Pull Request](#submitting-a-pull-request) - [Code Style Guidelines](#code-style-guidelines) - [Review Process](#review-process) - [Thank You](#thank-you) --- ## Issues ### Bug Reports To report a bug: 1. Make sure there is no existing issue reporting the same bug. If one exists, add any additional relevant information as a comment instead of creating a new issue. 2. Click `New issue` and select the `Bug Report` template. 3. Follow all checklist steps and confirm that the bug still occurs. 4. Provide clear and complete information. More details help maintainers resolve the issue faster. 5. Submit the issue and stay attentive, as maintainers may request additional information. --- ### Feature Requests To suggest a new feature: 1. Check if a similar feature request already exists. If so, please contribute to the existing discussion instead of opening a new one. 2. Ensure your suggestion benefits a broad range of users and is not only a personal preference. 3. Click `New issue` and select the `Feature Request` template. 4. Fill out the template as clearly and completely as possible. 5. Submit the issue and remain available for follow-up questions. --- ### Other Issues > [!IMPORTANT] > This option is only for issues that do not fit into the categories above. > Issues that do not use the appropriate template will be closed without notice. 1. Click `New issue` and select `Blank issue`. 2. Describe your request clearly and in detail. 3. Submit the issue and stay attentive to maintainer feedback. --- ## Pull Requests ### Before Opening a Pull Request - **.NET 9.0** is required. - All code must be written in **English**. Use the localization system for user-facing text in other languages. - Use the **[Allman indentation style](https://en.wikipedia.org/wiki/Indentation_style#Allman_style)**. - Use `var` when the type is obvious from the assignment. - Follow the existing formatting and conventions used in the codebase. - Keep each pull request focused on **a single change or context**. For multiple unrelated changes, create separate pull requests. - Keep code clean, readable, and easy to understand. - This repository is licensed under **Apache-2.0**. --- ### Cloning and Working on the Repository 1. Fork the `main` branch. 2. Make sure Git is installed. 3. Clone your fork locally: ```bash git clone https://github.com/your-username/RunCat365.git cd RunCat365 ``` 4. Create a new branch: ```bash git switch -c branch-name ``` Use a short, descriptive branch name. 5. Make your changes using your preferred IDE (Visual Studio is recommended). 6. Keep functions within their respective classes. 7. Verify that the project builds and runs without errors. 8. Ensure no unnecessary or accidental changes were made. 9. Stage your changes: ```bash git add . ``` 10. Commit your changes: ```bash git commit -m "Clear and descriptive commit message" ``` 11. Push the branch: ```bash git push origin branch-name ``` --- ### Submitting a Pull Request 1. Click **New pull request**. 2. Select the branch you worked on. 3. Choose the type of contribution. 4. Fill in all requested information clearly and completely. 5. Ensure all checklist items are satisfied. 6. Submit the pull request. --- ## Code Style Guidelines * Follow existing project conventions. * Use the [Allman indentation style](https://en.wikipedia.org/wiki/Indentation_style#Allman_style). * Use meaningful and descriptive names. * Avoid unnecessary complexity. * Prefer readable and self-explanatory code over clever solutions. --- ## Review Process * Pull requests are reviewed as time permits. * Not all contributions are guaranteed to be accepted. * Maintainers may request changes before merging. * Inactive or non-responsive pull requests may be closed. --- ## Thank You Thank you again for contributing to **RunCat365**. Your time and effort help make this project better for everyone 😸 ================================================ FILE: LICENSE ================================================ 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 ================================================ FILE: README.md ================================================ # RunCat 365 **A cute running cat animation on your Windows Taskbar.** > [!CAUTION] > > - This project is for Windows, so we do not accept inquiries about macOS version. > - We do not accept issues or pull requests in languages other than English. > - Issues that do not follow the Issue Template will be closed without question. [![Github issues](https://img.shields.io/github/issues/Kyome22/RunCat365)](https://github.com/Kyome22/RunCat365/issues) [![Github forks](https://img.shields.io/github/forks/Kyome22/RunCat365)](https://github.com/Kyome22/RunCat365/network/members) [![Github stars](https://img.shields.io/github/stars/Kyome22/RunCat365)](https://github.com/Kyome22/RunCat365/stargazers) [![Top language](https://img.shields.io/github/languages/top/Kyome22/RunCat365)](https://github.com/Kyome22/RunCat365/) [![Release](https://img.shields.io/github/v/release/Kyome22/RunCat365)]() [![Github license](https://img.shields.io/github/license/Kyome22/RunCat365)](https://github.com/Kyome22/RunCat365/) `C#` `Win32` `.NET 9.0` `Visual Studio` `RunCat` ## Demo <img src="./docs/images/demo.gif" width="600" height="200" alt="demo" /> <br/> <img src="./docs/images/overview.png" width="600" height="343" alt="overview" /> <br/> <img src="./docs/images/endless_game.png" width="600" height="343" alt="endless game" /> ## Installation RunCat 365 is available for installation on the Microsoft Store. - Requirement: Windows 10 version 19041.0 or higher - Microsoft Store: https://apps.microsoft.com/detail/9nw5lpnvwfwj - Language: - Chinese (simplified) - Chinese (traditional) - English (default) - French - German - Japanese - Spanish ## RunCat Developers' Community This is a space for RunCat contributors to communicate closely regarding development and operations. We welcome anyone interested in contributing to RunCat. However, please note that this is a place for discussing features, not for submitting requests. For requests, please create an Issue according to the template. Discord: https://discord.gg/zRk9E24s ## Contributors <a href="https://github.com/Kyome22/RunCat365/graphs/contributors"> <img src="https://contrib.rocks/image?repo=Kyome22/RunCat365" /> </a> ================================================ FILE: RunCat365/App.config ================================================ <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="RunCat365.Properties.UserSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> </configSections> <userSettings> <RunCat365.Properties.UserSettings> <setting name="Runner" serializeAs="String"> <value>Cat</value> </setting> <setting name="Theme" serializeAs="String"> <value /> </setting> <setting name="FPSMaxLimit" serializeAs="String"> <value>FPS40</value> </setting> <setting name="FirstLaunch" serializeAs="String"> <value>True</value> </setting> <setting name="HighScore" serializeAs="String"> <value>0</value> </setting> <setting name="SpeedSource" serializeAs="String"> <value>CPU</value> </setting> </RunCat365.Properties.UserSettings> </userSettings> </configuration> ================================================ FILE: RunCat365/App.manifest ================================================ <?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> </application> </compatibility> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware> </windowsSettings> </application> </assembly> ================================================ FILE: RunCat365/BalloonTipType.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; namespace RunCat365 { internal readonly struct BalloonTipInfo(string title, string text, ToolTipIcon icon) { internal string Title { get; } = title; internal string Text { get; } = text; internal ToolTipIcon Icon { get; } = icon; } internal enum BalloonTipType { AppLaunched, CPUInfoUnavailable, } internal static class BalloonTipTypeExtension { internal static BalloonTipInfo GetInfo(this BalloonTipType balloonTipType) { return balloonTipType switch { BalloonTipType.AppLaunched => new("RunCat 365", Strings.Message_AppLaunched, ToolTipIcon.Info), BalloonTipType.CPUInfoUnavailable => new(Strings.Message_Warning, Strings.Message_CPUUsageUnavailable, ToolTipIcon.Warning), _ => new("RunCat 365", string.Empty, ToolTipIcon.None), }; } } } ================================================ FILE: RunCat365/BitmapExtension.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using System.Drawing.Imaging; namespace RunCat365 { internal readonly ref struct BitmapLock { private readonly Bitmap _bitmap; internal BitmapData Data { get; } internal BitmapLock(Bitmap bitmap, ImageLockMode mode) { _bitmap = bitmap; Data = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), mode, PixelFormat.Format32bppArgb ); } internal void Dispose() { _bitmap.UnlockBits(Data); } } internal static class BitmapExtension { internal static Bitmap Recolor(this Bitmap bitmap, Color color) { var newBitmap = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format32bppArgb); using var srcLock = new BitmapLock(bitmap, ImageLockMode.ReadOnly); using var dstLock = new BitmapLock(newBitmap, ImageLockMode.WriteOnly); unsafe { byte* srcPtr = (byte*)srcLock.Data.Scan0; byte* dstPtr = (byte*)dstLock.Data.Scan0; for (int y = 0; y < bitmap.Height; y++) { byte* srcRow = srcPtr + (y * srcLock.Data.Stride); byte* dstRow = dstPtr + (y * dstLock.Data.Stride); for (int x = 0; x < bitmap.Width; x++) { byte* srcPixel = srcRow + (x * 4); byte* dstPixel = dstRow + (x * 4); dstPixel[0] = color.B; dstPixel[1] = color.G; dstPixel[2] = color.R; dstPixel[3] = srcPixel[3]; } } } return newBitmap; } internal static Icon ToIcon(this Bitmap bitmap) { using var pngStream = new MemoryStream(); bitmap.Save(pngStream, ImageFormat.Png); var pngData = pngStream.ToArray(); using var icoStream = new MemoryStream(); using var bw = new BinaryWriter(icoStream); bw.Write((short)0); bw.Write((short)1); bw.Write((short)1); bw.Write((byte)(bitmap.Width >= 256 ? 0 : bitmap.Width)); bw.Write((byte)(bitmap.Height >= 256 ? 0 : bitmap.Height)); bw.Write((byte)0); bw.Write((byte)0); bw.Write((short)1); bw.Write((short)32); bw.Write(pngData.Length); bw.Write(22); bw.Write(pngData); icoStream.Position = 0; return new Icon(icoStream); } } } ================================================ FILE: RunCat365/ByteFormatter.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal static class ByteFormatter { internal static string ToByteFormatted(this long bytes) { string[] units = ["B", "KB", "MB", "GB", "TB"]; int i = 0; double doubleBytes = bytes; while (1024 <= doubleBytes && i < units.Length - 1) { doubleBytes /= 1024; i++; } return string.Format("{0:0.##} {1}", doubleBytes, units[i]); } } } ================================================ FILE: RunCat365/CPURepository.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.Diagnostics; namespace RunCat365 { struct CPUInfo { internal float Total { get; set; } internal float User { get; set; } internal float Kernel { get; set; } internal float Idle { get; set; } } internal static class CPUInfoExtension { internal static string GetDescription(this CPUInfo cpuInfo) { return $"{Strings.SystemInfo_CPU}: {cpuInfo.Total:f1}%"; } internal static List<string> GenerateIndicator(this CPUInfo cpuInfo) { var resultLines = new List<string> { TreeFormatter.CreateRoot($"{Strings.SystemInfo_CPU}: {cpuInfo.Total:f1}%"), TreeFormatter.CreateNode($"{Strings.SystemInfo_User}: {cpuInfo.User:f1}%", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Kernel}: {cpuInfo.Kernel:f1}%", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Available}: {cpuInfo.Idle:f1}%", true) }; return resultLines; } } internal class CPUPerformanceCounters { internal PerformanceCounter Total { get; } internal PerformanceCounter User { get; } internal PerformanceCounter Kernel { get; } internal PerformanceCounter Idle { get; } private CPUPerformanceCounters() { Total = new PerformanceCounter("Processor", "% Processor Time", "_Total"); User = new PerformanceCounter("Processor", "% User Time", "_Total"); Kernel = new PerformanceCounter("Processor", "% Privileged Time", "_Total"); Idle = new PerformanceCounter("Processor", "% Idle Time", "_Total"); // Discards first return value _ = Total.NextValue(); _ = User.NextValue(); _ = Kernel.NextValue(); _ = Idle.NextValue(); } internal static CPUPerformanceCounters? TryCreate() { try { return new CPUPerformanceCounters(); } catch { return null; } } internal void Close() { Total.Close(); User.Close(); Kernel.Close(); Idle.Close(); } } internal class CPURepository { private readonly CPUPerformanceCounters? counters; private readonly List<CPUInfo> cpuInfoList = []; private const int CPU_INFO_LIST_LIMIT_SIZE = 5; internal bool IsAvailable => counters is not null; internal CPURepository() { counters = CPUPerformanceCounters.TryCreate(); } internal void Update() { if (counters is null) return; var cpuInfo = new CPUInfo { Total = Math.Min(100, counters.Total.NextValue()), User = Math.Min(100, counters.User.NextValue()), Kernel = Math.Min(100, counters.Kernel.NextValue()), Idle = Math.Min(100, counters.Idle.NextValue()), }; cpuInfoList.Add(cpuInfo); if (CPU_INFO_LIST_LIMIT_SIZE < cpuInfoList.Count) { cpuInfoList.RemoveAt(0); } } internal CPUInfo Get() { if (cpuInfoList.Count == 0) return new CPUInfo(); return new CPUInfo { Total = cpuInfoList.Average(x => x.Total), User = cpuInfoList.Average(x => x.User), Kernel = cpuInfoList.Average(x => x.Kernel), Idle = cpuInfoList.Average(x => x.Idle) }; } internal void Close() { counters?.Close(); } } } ================================================ FILE: RunCat365/Cat.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal abstract class Cat { internal abstract List<int> ViolationIndices(); internal abstract Cat Next(); internal abstract string GetString(); internal class Running : Cat { internal Frame CurrentFrame { get; } internal Running(Frame frame) { CurrentFrame = frame; } internal override List<int> ViolationIndices() { return CurrentFrame switch { Frame.Frame0 => [5, 6, 7], Frame.Frame1 => [5, 6], Frame.Frame2 => [5, 6], Frame.Frame3 => [5], Frame.Frame4 => [5, 7], _ => [], }; } internal override Cat Next() { var nextFrame = (Frame)(((int)CurrentFrame + 1) % Enum.GetValues<Frame>().Length); return new Running(nextFrame); } internal override string GetString() { return $"running_{(int)CurrentFrame}"; } internal enum Frame { Frame0, Frame1, Frame2, Frame3, Frame4 } } internal class Jumping : Cat { internal Frame CurrentFrame { get; } internal Jumping(Frame frame) { CurrentFrame = frame; } internal override List<int> ViolationIndices() { return CurrentFrame switch { Frame.Frame0 => [5, 6, 7], Frame.Frame1 => [5, 6], Frame.Frame2 => [5, 6], Frame.Frame3 => [5, 6], Frame.Frame4 => [5, 6], Frame.Frame5 => [5], Frame.Frame6 => [], Frame.Frame7 => [], Frame.Frame8 => [], Frame.Frame9 => [7], _ => [], }; } internal override Cat Next() { var nextFrame = (Frame)(((int)CurrentFrame + 1) % Enum.GetValues<Frame>().Length); return new Jumping(nextFrame); } internal override string GetString() { return $"jumping_{(int)CurrentFrame}"; } internal enum Frame { Frame0, Frame1, Frame2, Frame3, Frame4, Frame5, Frame6, Frame7, Frame8, Frame9 } } } } ================================================ FILE: RunCat365/ContextMenuManager.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.ComponentModel; namespace RunCat365 { internal class ContextMenuManager : IDisposable { private readonly CustomToolStripMenuItem systemInfoMenu = new(); private readonly NotifyIcon notifyIcon = new(); private readonly List<Icon> icons = []; private readonly Lock iconLock = new(); private int current = 0; private EndlessGameForm? endlessGameForm; internal ContextMenuManager( Func<Runner> getRunner, Action<Runner> setRunner, Func<Theme> getSystemTheme, Func<Theme> getManualTheme, Action<Theme> setManualTheme, Func<SpeedSource> getSpeedSource, Action<SpeedSource> setSpeedSource, Func<SpeedSource, bool> isSpeedSourceAvailable, Func<FPSMaxLimit> getFPSMaxLimit, Action<FPSMaxLimit> setFPSMaxLimit, Func<bool> getLaunchAtStartup, Func<bool, bool> toggleLaunchAtStartup, Action openRepository, Action onExit ) { systemInfoMenu.Text = "-\n-\n-\n-\n-"; systemInfoMenu.Enabled = false; var runnersMenu = new CustomToolStripMenuItem(Strings.Menu_Runner); runnersMenu.SetupSubMenusFromEnum<Runner>( r => r.GetLocalizedString(), (parent, sender, e) => { HandleMenuItemSelection<Runner>( parent, sender, (string? s, out Runner r) => Enum.TryParse(s, out r), r => setRunner(r) ); SetIcons(getSystemTheme(), getManualTheme(), getRunner()); }, r => getRunner() == r, r => GetRunnerThumbnailBitmap(getSystemTheme(), r) ); var themeMenu = new CustomToolStripMenuItem(Strings.Menu_Theme); themeMenu.SetupSubMenusFromEnum<Theme>( t => t.GetLocalizedString(), (parent, sender, e) => { HandleMenuItemSelection<Theme>( parent, sender, (string? s, out Theme t) => Enum.TryParse(s, out t), t => setManualTheme(t) ); SetIcons(getSystemTheme(), getManualTheme(), getRunner()); }, t => getManualTheme() == t, _ => null ); var speedSourceMenu = new CustomToolStripMenuItem(Strings.Menu_SpeedSource); speedSourceMenu.SetupSubMenusFromEnum<SpeedSource>( s => s.GetLocalizedString(), (parent, sender, e) => { HandleMenuItemSelection<SpeedSource>( parent, sender, (string? s, out SpeedSource ss) => Enum.TryParse(s, out ss), s => setSpeedSource(s) ); }, s => getSpeedSource() == s, _ => null, isSpeedSourceAvailable ); var fpsMaxLimitMenu = new CustomToolStripMenuItem(Strings.Menu_FPSMaxLimit); fpsMaxLimitMenu.SetupSubMenusFromEnum<FPSMaxLimit>( f => f.GetString(), (parent, sender, e) => { HandleMenuItemSelection<FPSMaxLimit>( parent, sender, (string? s, out FPSMaxLimit f) => FPSMaxLimitExtension.TryParse(s, out f), f => setFPSMaxLimit(f) ); }, f => getFPSMaxLimit() == f, _ => null ); var launchAtStartupMenu = new CustomToolStripMenuItem(Strings.Menu_LaunchAtStartup) { Checked = getLaunchAtStartup() }; launchAtStartupMenu.Click += (sender, e) => HandleStartupMenuClick(sender, toggleLaunchAtStartup); var settingsMenu = new CustomToolStripMenuItem(Strings.Menu_Settings); settingsMenu.DropDownItems.AddRange( themeMenu, speedSourceMenu, fpsMaxLimitMenu, launchAtStartupMenu ); var endlessGameMenu = new CustomToolStripMenuItem(Strings.Menu_EndlessGame); endlessGameMenu.Click += (sender, e) => ShowOrActivateGameWindow(getSystemTheme); var appVersionMenu = new CustomToolStripMenuItem( $"{Application.ProductName} v{Application.ProductVersion}" ) { Enabled = false }; var repositoryMenu = new CustomToolStripMenuItem(Strings.Menu_OpenRepository); repositoryMenu.Click += (sender, e) => openRepository(); var informationMenu = new CustomToolStripMenuItem(Strings.Menu_Information); informationMenu.DropDownItems.AddRange( appVersionMenu, repositoryMenu ); var exitMenu = new CustomToolStripMenuItem(Strings.Menu_Exit); exitMenu.Click += (sender, e) => onExit(); var contextMenuStrip = new ContextMenuStrip(new Container()); contextMenuStrip.Items.AddRange( systemInfoMenu, new ToolStripSeparator(), runnersMenu, new ToolStripSeparator(), settingsMenu, informationMenu, endlessGameMenu, new ToolStripSeparator(), exitMenu ); contextMenuStrip.Renderer = new ContextMenuRenderer(); SetIcons(getSystemTheme(), getManualTheme(), getRunner()); notifyIcon.Visible = true; notifyIcon.ContextMenuStrip = contextMenuStrip; } private static void HandleMenuItemSelection<T>( ToolStripMenuItem parentMenu, object? sender, CustomTryParseDelegate<T> tryParseMethod, Action<T> assignValueAction ) { if (sender is null) return; var item = (ToolStripMenuItem)sender; foreach (ToolStripMenuItem childItem in parentMenu.DropDownItems) { childItem.Checked = false; } item.Checked = true; if (item.Tag is T tagValue) { assignValueAction(tagValue); } else if (tryParseMethod(item.Text, out T parsedValue)) { assignValueAction(parsedValue); } } private static Bitmap? GetRunnerThumbnailBitmap(Theme systemTheme, Runner runner) { var color = systemTheme.GetContrastColor(); var iconName = $"{runner.GetString()}_0".ToLower(); var obj = Resources.ResourceManager.GetObject(iconName); if (obj is not Bitmap bitmap) return null; return systemTheme == Theme.Light ? bitmap : bitmap.Recolor(color); } internal void SetIcons(Theme systemTheme, Theme manualTheme, Runner runner) { var theme = manualTheme == Theme.System ? systemTheme : manualTheme; var color = theme.GetContrastColor(); var runnerName = runner.GetString(); var rm = Resources.ResourceManager; var capacity = runner.GetFrameNumber(); var list = new List<Icon>(capacity); for (int i = 0; i < capacity; i++) { var iconName = $"{runnerName}_{i}".ToLower(); if (rm.GetObject(iconName) is not Bitmap bitmap) continue; if (theme == Theme.Light) { list.Add(bitmap.ToIcon()); } else { using var recolored = bitmap.Recolor(color); list.Add(recolored.ToIcon()); } } lock (iconLock) { icons.Clear(); icons.AddRange(list); current = 0; } } private static void HandleStartupMenuClick(object? sender, Func<bool, bool> toggleLaunchAtStartup) { if (sender is null) return; var item = (ToolStripMenuItem)sender; try { if (toggleLaunchAtStartup(item.Checked)) { item.Checked = !item.Checked; } } catch (InvalidOperationException ex) { MessageBox.Show(ex.Message, Strings.Message_Warning, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void ShowOrActivateGameWindow(Func<Theme> getSystemTheme) { if (endlessGameForm is null) { endlessGameForm = new EndlessGameForm(getSystemTheme()); endlessGameForm.FormClosed += (sender, e) => { endlessGameForm = null; }; endlessGameForm.Show(); } else { endlessGameForm.Activate(); } } internal void ShowBalloonTip(BalloonTipType balloonTipType) { var info = balloonTipType.GetInfo(); notifyIcon.ShowBalloonTip(5000, info.Title, info.Text, info.Icon); } internal void AdvanceFrame() { lock (iconLock) { if (icons.Count == 0) return; if (icons.Count <= current) current = 0; notifyIcon.Icon = icons[current]; current = (current + 1) % icons.Count; } } internal void SetSystemInfoMenuText(string text) { systemInfoMenu.Text = text; } internal void SetNotifyIconText(string text) { notifyIcon.Text = text; } internal void HideNotifyIcon() { notifyIcon.Visible = false; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { lock (iconLock) { icons.Clear(); } if (notifyIcon is not null) { notifyIcon.ContextMenuStrip?.Dispose(); notifyIcon.Dispose(); } endlessGameForm?.Dispose(); } } private delegate bool CustomTryParseDelegate<T>(string? value, out T result); } } ================================================ FILE: RunCat365/ContextMenuRenderer.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal class ContextMenuRenderer : ToolStripProfessionalRenderer { protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { if (!string.IsNullOrEmpty(e.Text) && e.Item is CustomToolStripMenuItem item) { var textRectangle = e.TextRectangle; textRectangle.Height = item.Bounds.Height; TextRenderer.DrawText( e.Graphics, e.Text, e.TextFont, textRectangle, item.ForeColor, item.Flags() ); } else { base.OnRenderItemText(e); } } } } ================================================ FILE: RunCat365/CustomToolStripMenuItem.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal class CustomToolStripMenuItem : ToolStripMenuItem { private static readonly Font MenuFont = new( SupportedLanguageExtension.GetCurrentLanguage().GetFontName(), 9F, FontStyle.Regular ); internal CustomToolStripMenuItem() : base() { Font = MenuFont; } internal CustomToolStripMenuItem(string? text) : base(text) { Font = MenuFont; } private CustomToolStripMenuItem(string? text, Image? image, object? tag, bool isChecked, EventHandler? onClick) : base(text, image, onClick) { Tag = tag; Checked = isChecked; Font = MenuFont; } private readonly TextFormatFlags multiLineTextFlags = TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl; private readonly TextFormatFlags singleLineTextFlags = TextFormatFlags.LeftAndRightPadding | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis; public override Size GetPreferredSize(Size constrainingSize) { Size baseSize = base.GetPreferredSize(constrainingSize); if (string.IsNullOrEmpty(Text)) { return new Size(baseSize.Width, 22); } var textRenderWidth = Math.Max(constrainingSize.Width - 20, 1); SizeF measuredSize = TextRenderer.MeasureText( Text, Font, new Size(textRenderWidth, int.MaxValue), Flags() ); var calculatedHeight = (int)Math.Ceiling(measuredSize.Height) + 4; var height = IsSingleLine() ? calculatedHeight : Math.Max(baseSize.Height, calculatedHeight); return new Size(baseSize.Width, height); } internal bool IsSingleLine() { return string.IsNullOrEmpty(Text) || !Text.Contains('\n'); } internal TextFormatFlags Flags() { return IsSingleLine() ? singleLineTextFlags : multiLineTextFlags; } internal void SetupSubMenusFromEnum<T>( Func<T, string> getTitle, Action<CustomToolStripMenuItem, object?, EventArgs> onClick, Func<T, bool> isChecked, Func<Runner, Bitmap?> getRunnerThumbnailBitmap, Func<T, bool>? isVisible = null ) where T : Enum { isVisible ??= _ => true; var items = new List<CustomToolStripMenuItem>(); foreach (T value in Enum.GetValues(typeof(T))) { if (!isVisible(value)) continue; var entityName = getTitle(value); var iconImage = value is Runner runner ? getRunnerThumbnailBitmap(runner) : null; var item = new CustomToolStripMenuItem( entityName, iconImage, value, isChecked(value), (sender, e) => onClick(this, sender, e) ); items.Add(item); } DropDownItems.AddRange([.. items]); } } } ================================================ FILE: RunCat365/EndlessGameForm.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.Collections; using System.Globalization; using System.Text.RegularExpressions; using FormsTimer = System.Windows.Forms.Timer; namespace RunCat365 { internal class EndlessGameForm : Form { private const int JUMP_THREDHOLD = 17; private readonly FormsTimer timer; private readonly Theme systemTheme; private GameStatus status = GameStatus.NewGame; private Cat cat = new Cat.Running(Cat.Running.Frame.Frame0); private readonly List<Road> roads = []; private readonly Dictionary<string, Bitmap> catIcons = []; private readonly Dictionary<string, Bitmap> roadIcons = []; private int counter = 0; private int limit = 5; private int score = 0; private int highScore = UserSettings.Default.HighScore; private bool isJumpRequested = false; private readonly bool isAutoPlay = false; internal EndlessGameForm(Theme systemTheme) { this.systemTheme = systemTheme; DoubleBuffered = true; ClientSize = new Size(600, 250); FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; StartPosition = FormStartPosition.CenterScreen; Text = Strings.Window_EndlessGame; Icon = Resources.AppIcon; BackColor = systemTheme == Theme.Light ? Color.Gainsboro : Color.Gray; var rm = Resources.ResourceManager; var rs = rm.GetResourceSet(CultureInfo.CurrentUICulture, true, true); if (rs is not null) { var catRegex = new Regex(@"^cat_.*_.*$"); var color = systemTheme.GetContrastColor(); foreach (DictionaryEntry entry in rs) { var key = entry.Key.ToString(); if (string.IsNullOrEmpty(key)) continue; if (catRegex.IsMatch(key)) { if (entry.Value is Bitmap icon) { catIcons.Add(key, systemTheme == Theme.Light ? new Bitmap(icon) : icon.Recolor(color)); } } else if (key.StartsWith("road")) { if (entry.Value is Bitmap icon) { roadIcons.Add(key, systemTheme == Theme.Light ? new Bitmap(icon) : icon.Recolor(color)); } } } } Paint += RenderScene; KeyDown += HandleKeyDown; timer = new FormsTimer { Interval = 100 }; timer.Tick += GameTick; Initialize(); timer.Start(); } protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); timer.Stop(); timer.Dispose(); foreach (var bitmap in catIcons.Values) bitmap.Dispose(); foreach (var bitmap in roadIcons.Values) bitmap.Dispose(); catIcons.Clear(); roadIcons.Clear(); } private void Initialize() { counter = JUMP_THREDHOLD; isJumpRequested = false; score = 0; cat = new Cat.Running(Cat.Running.Frame.Frame0); roads.RemoveAll(r => r == Road.Sprout); Enumerable.Range(0, 20 - roads.Count).ToList().ForEach( _ => roads.Add((Road)(new Random().Next(0, 3))) ); } private bool Judge() { if (status != GameStatus.Playing) return false; var sproutIndices = roads .Select((road, index) => { return road == Road.Sprout ? index : (int?)null; }) .OfType<int>() .ToList(); if (cat.ViolationIndices().HasCommonElements(sproutIndices)) { status = GameStatus.GameOver; return false; } else { return true; } } private void UpdateRoads() { var firstRoad = roads.First(); roads.RemoveAt(0); if (firstRoad == Road.Sprout) { score = Math.Min(score + 1, 999); highScore = Math.Max(score, highScore); } counter = counter > 0 ? counter - 1 : limit - 1; if (counter == 0) { var randomValue = new Random().Next(0, 27); var subRoads = new List<Road>(); if (randomValue % 3 == 0) { subRoads.Add(Road.Sprout); } if (randomValue % 9 == 0) { subRoads.Add(Road.Sprout); } if (randomValue % 27 == 0) { subRoads.Add(Road.Sprout); } roads.AddRange(subRoads); limit = subRoads.Count == 0 ? 5 : 10; } if (roads.Count < 20) { roads.Add((Road)(new Random().Next(0, 3))); } } private void UpdateCat() { if (cat is Cat.Running runningCat) { if (runningCat.CurrentFrame == Cat.Running.Frame.Frame4 && isJumpRequested) { cat = new Cat.Jumping(Cat.Jumping.Frame.Frame0); isJumpRequested = false; return; } } else if (cat is Cat.Jumping jumpingCat) { if (jumpingCat.CurrentFrame == Cat.Jumping.Frame.Frame9) { if (isJumpRequested) { cat = cat.Next(); isJumpRequested = false; return; } else { cat = new Cat.Running(Cat.Running.Frame.Frame0); return; } } } cat = cat.Next(); } private void AutoJump() { if (isAutoPlay && roads[JUMP_THREDHOLD - 1] == Road.Sprout) { isJumpRequested = true; } } private void GameTick(object? sender, EventArgs e) { if (Judge()) { UpdateRoads(); UpdateCat(); AutoJump(); } Invalidate(); } private void HandleKeyDown(object? sender, KeyEventArgs e) { if (e.KeyCode == Keys.Space) { switch (status) { case GameStatus.NewGame: case GameStatus.GameOver: Initialize(); status = GameStatus.Playing; break; case GameStatus.Playing when !isAutoPlay: isJumpRequested = true; break; default: break; } } } private void RenderScene(object? sender, PaintEventArgs e) { var rm = Resources.ResourceManager; var textColor = systemTheme.GetContrastColor(); var g = e.Graphics; using (Font font15 = new("Consolas", 15)) using (Brush brush = new SolidBrush(textColor)) { var stringFormat = new StringFormat { Alignment = StringAlignment.Far, LineAlignment = StringAlignment.Center }; var scoreText = status == GameStatus.GameOver ? $"HI {highScore:D3} {score:D3}" : $"{score:D3}"; g.DrawString(scoreText, font15, brush, new Rectangle(20, 0, 560, 50), stringFormat); } roads.Take(20).Select((road, index) => new { road, index }).ToList().ForEach( item => { var fileName = $"road_{item.road.GetString()}".ToLower(); if (!roadIcons.TryGetValue(fileName, out Bitmap? image)) return; g.DrawImage(image, new Rectangle(item.index * 30, 200, 30, 50)); } ); var fileName = $"cat_{cat.GetString()}".ToLower(); if (!catIcons.TryGetValue(fileName, out Bitmap? image)) return; g.DrawImage(image, new Rectangle(120, 130, 120, 100)); if (status != GameStatus.Playing) { using Brush fillBrush = new SolidBrush(Color.FromArgb(77, 0, 0, 0)); g.FillRectangle(fillBrush, new Rectangle(0, 0, 600, 250)); using Font font18 = new("Segoe UI", 16, FontStyle.Bold); using Brush brush = new SolidBrush(textColor); var message = Strings.Game_PressSpaceToPlay; if (status == GameStatus.GameOver) { if (score >= highScore) { SaveRecord(score); message = $"{Strings.Game_NewRecord}!!\n{message}"; } else { message = $"{Strings.Game_GameOver}\n{message}"; } } var stringFormat = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.DrawString(message, font18, brush, new Rectangle(0, 0, 600, 250), stringFormat); } } private void SaveRecord(int score) { UserSettings.Default.HighScore = score; UserSettings.Default.Save(); } } internal static class ListExtension { internal static bool HasCommonElements(this List<int> list1, List<int> list2) { return list1.Intersect(list2).Any(); } } } ================================================ FILE: RunCat365/EndlessGameForm.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> </root> ================================================ FILE: RunCat365/FPSMaxLimit.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using System.Diagnostics.CodeAnalysis; namespace RunCat365 { enum FPSMaxLimit { FPS40, FPS30, FPS20, FPS10, } internal static class FPSMaxLimitExtension { internal static string GetString(this FPSMaxLimit fpsMaxLimit) { return fpsMaxLimit switch { FPSMaxLimit.FPS40 => "40fps", FPSMaxLimit.FPS30 => "30fps", FPSMaxLimit.FPS20 => "20fps", FPSMaxLimit.FPS10 => "10fps", _ => "", }; } internal static float GetRate(this FPSMaxLimit fPSMaxLimit) { return fPSMaxLimit switch { FPSMaxLimit.FPS40 => 1f, FPSMaxLimit.FPS30 => 0.75f, FPSMaxLimit.FPS20 => 0.5f, FPSMaxLimit.FPS10 => 0.25f, _ => 1f, }; } internal static bool TryParse([NotNullWhen(true)] string? value, out FPSMaxLimit result) { FPSMaxLimit? nullableResult = value switch { "40fps" => FPSMaxLimit.FPS40, "30fps" => FPSMaxLimit.FPS30, "20fps" => FPSMaxLimit.FPS20, "10fps" => FPSMaxLimit.FPS10, _ => null, }; if (nullableResult is FPSMaxLimit nonNullableResult) { result = nonNullableResult; return true; } else { result = FPSMaxLimit.FPS40; return false; } } } } ================================================ FILE: RunCat365/GPURepository.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using System.Diagnostics; using RunCat365.Properties; namespace RunCat365 { struct GPUInfo { internal float Average { get; set; } internal float Maximum { get; set; } } internal static class GPUInfoExtension { internal static string GetDescription(this GPUInfo gpuInfo) { return $"{Strings.SystemInfo_GPU}: {gpuInfo.Maximum:f1}%"; } internal static List<string> GenerateIndicator(this GPUInfo gpuInfo) { var resultLines = new List<string> { TreeFormatter.CreateRoot($"{Strings.SystemInfo_GPU}:"), TreeFormatter.CreateNode($"{Strings.SystemInfo_Average}: {gpuInfo.Average:f1}%", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Maximum}: {gpuInfo.Maximum:f1}%", true) }; return resultLines; } } internal class GPURepository { private readonly List<PerformanceCounter> gpuCounters = []; private readonly List<GPUInfo> gpuInfoList = []; private const int GPU_INFO_LIST_LIMIT_SIZE = 5; internal bool IsAvailable { get; private set; } = true; internal GPURepository() { try { var category = new PerformanceCounterCategory("GPU Engine"); var instanceNames = category.GetInstanceNames(); var instances = instanceNames.Where(n => n.Contains("engtype_3D")).ToList(); if (instances.Count > 0) { foreach (var instance in instances) { var counter = new PerformanceCounter("GPU Engine", "Utilization Percentage", instance); gpuCounters.Add(counter); // Discards first return value _ = counter.NextValue(); } } else { IsAvailable = false; } } catch { IsAvailable = false; } } internal void Update() { if (!IsAvailable || gpuCounters.Count == 0) return; try { var values = gpuCounters.Select(counter => counter.NextValue()).ToList(); var average = values.Count > 0 ? values.Average() : 0f; var maximum = values.Count > 0 ? values.Max() : 0f; var gpuInfo = new GPUInfo { Average = Math.Min(100, average), Maximum = Math.Min(100, maximum) }; gpuInfoList.Add(gpuInfo); if (GPU_INFO_LIST_LIMIT_SIZE < gpuInfoList.Count) { gpuInfoList.RemoveAt(0); } } catch { IsAvailable = false; } } internal GPUInfo? Get() { if (!IsAvailable || gpuInfoList.Count == 0) return null; return new GPUInfo { Average = gpuInfoList.Average(x => x.Average), Maximum = gpuInfoList.Max(x => x.Maximum) }; } internal void Close() { foreach (var counter in gpuCounters) { counter.Close(); } } } } ================================================ FILE: RunCat365/GameStatus.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal enum GameStatus { NewGame, Playing, GameOver } } ================================================ FILE: RunCat365/LaunchAtStartupManager.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using Microsoft.Win32; using Windows.ApplicationModel; namespace RunCat365 { internal interface ILaunchAtStartupManager { bool GetEnabled(); bool SetEnabled(bool enabled); } internal sealed class PackagedLaunchAtStartupManager : ILaunchAtStartupManager { private static StartupTask? startupTask; public bool GetEnabled() { startupTask ??= Task.Run(async () => await StartupTask.GetAsync("RunCatStartup")).Result; if (startupTask is null) return false; if (startupTask.State == StartupTaskState.Enabled) return true; return false; } public bool SetEnabled(bool enabled) { startupTask ??= Task.Run(async () => await StartupTask.GetAsync("RunCatStartup")).Result; if (enabled) { if (startupTask.State == StartupTaskState.Enabled) startupTask.Disable(); return true; } else { switch (startupTask.State) { case StartupTaskState.Enabled: return true; case StartupTaskState.Disabled: var newStartupState = Task.Run(async () => await startupTask.RequestEnableAsync()).Result; if (newStartupState == StartupTaskState.Enabled) { return true; } else { throw new InvalidOperationException("Launch at Startup could not be activated."); } case StartupTaskState.DisabledByUser: throw new InvalidOperationException("Launch at startup was disabled by the user, enable it in Task Manager > Startup, search RunCat 365 and enable it."); case StartupTaskState.DisabledByPolicy: throw new InvalidOperationException("Launch at startup was disabled by policy."); default: return false; } } } } internal sealed class UnpackagedLaunchAtStartupManager : ILaunchAtStartupManager { public bool GetEnabled() { var keyName = @"Software\Microsoft\Windows\CurrentVersion\Run"; using var rKey = Registry.CurrentUser.OpenSubKey(keyName); if (rKey is null) return false; var value = (rKey.GetValue(Application.ProductName) is not null); rKey.Close(); return value; } public bool SetEnabled(bool enabled) { var productName = Application.ProductName; if (productName is null) return false; var keyName = @"Software\Microsoft\Windows\CurrentVersion\Run"; using var rKey = Registry.CurrentUser.OpenSubKey(keyName, true); if (rKey is null) return false; if (enabled) { rKey.DeleteValue(productName, false); } else { var fileName = Environment.ProcessPath; if (fileName is not null) { rKey.SetValue(productName, fileName); } } rKey.Close(); return true; } } internal class LaunchAtStartupManager { private readonly ILaunchAtStartupManager _launchAtStartupManager; public LaunchAtStartupManager() { _launchAtStartupManager = IsRunningAsPackaged() ? new PackagedLaunchAtStartupManager() : new UnpackagedLaunchAtStartupManager(); } public bool GetStartup() => _launchAtStartupManager.GetEnabled(); public bool SetStartup(bool enabled) => _launchAtStartupManager.SetEnabled(enabled); private static bool IsRunningAsPackaged() { try { _ = Package.Current; return true; } catch (InvalidOperationException) { return false; } } } } ================================================ FILE: RunCat365/MemoryRepository.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.Runtime.InteropServices; namespace RunCat365 { struct MemoryInfo { internal uint MemoryLoad { get; set; } internal long TotalMemory { get; set; } internal long AvailableMemory { get; set; } internal long UsedMemory { get; set; } } internal static class MemoryInfoExtension { internal static string GetDescription(this MemoryInfo memoryInfo) { return $"{Strings.SystemInfo_Memory}: {memoryInfo.MemoryLoad}%"; } internal static List<string> GenerateIndicator(this MemoryInfo memoryInfo) { var resultLines = new List<string> { TreeFormatter.CreateRoot($"{Strings.SystemInfo_Memory}: {memoryInfo.MemoryLoad}%"), TreeFormatter.CreateNode($"{Strings.SystemInfo_Total}: {memoryInfo.TotalMemory.ToByteFormatted()}", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Used}: {memoryInfo.UsedMemory.ToByteFormatted()}", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Available}: {memoryInfo.AvailableMemory.ToByteFormatted()}", true) }; return resultLines; } } internal partial class MemoryRepository { private MemoryInfo memoryInfo; internal MemoryRepository() { memoryInfo = new MemoryInfo(); } internal void Update() { var memStatus = new MemoryStatusEx(); memStatus.dwLength = (uint)Marshal.SizeOf(memStatus); if (GlobalMemoryStatusEx(ref memStatus)) { memoryInfo.MemoryLoad = memStatus.dwMemoryLoad; memoryInfo.TotalMemory = (long)memStatus.ullTotalPhys; memoryInfo.AvailableMemory = (long)memStatus.ullAvailPhys; memoryInfo.UsedMemory = (long)(memStatus.ullTotalPhys - memStatus.ullAvailPhys); } } internal MemoryInfo Get() { Update(); return memoryInfo; } [StructLayout(LayoutKind.Sequential)] internal struct MemoryStatusEx { public uint dwLength; public uint dwMemoryLoad; public ulong ullTotalPhys; public ulong ullAvailPhys; public ulong ullTotalPageFile; public ulong ullAvailPageFile; public ulong ullTotalVirtual; public ulong ullAvailVirtual; public ulong ullAvailExtendedVirtual; } [LibraryImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static partial bool GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer); } } ================================================ FILE: RunCat365/NetworkRepository.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.Net.NetworkInformation; namespace RunCat365 { struct NetworkInfo { internal float SentSpeed { get; set; } internal float ReceivedSpeed { get; set; } } internal static class NetworkInfoExtension { internal static List<string> GenerateIndicator(this NetworkInfo networkInfo) { return [ TreeFormatter.CreateRoot($"{Strings.SystemInfo_Network}:"), TreeFormatter.CreateNode($"{Strings.SystemInfo_Sent}: {FormatSpeed(networkInfo.SentSpeed)}", false), TreeFormatter.CreateNode($"{Strings.SystemInfo_Received}: {FormatSpeed(networkInfo.ReceivedSpeed)}", true) ]; } private static string FormatSpeed(float speedBytes) { return ((long)speedBytes).ToByteFormatted() + "/s"; } } internal class NetworkRepository { private readonly NetworkInterface networkInterface; private long lastSent; private long lastReceived; private DateTime lastUpdate; private NetworkInfo networkInfo; internal NetworkRepository() { networkInterface = GetActiveNetworkInterface() ?? throw new InvalidOperationException("No valid network interface found."); var stats = networkInterface.GetIPStatistics(); lastSent = stats.BytesSent; lastReceived = stats.BytesReceived; lastUpdate = DateTime.UtcNow; } private static NetworkInterface? GetActiveNetworkInterface() { var interfaces = NetworkInterface.GetAllNetworkInterfaces(); return interfaces.FirstOrDefault(IsValidNetworkInterface); } private static bool IsValidNetworkInterface(NetworkInterface networkInterface) { if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Loopback) return false; if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Tunnel) return false; if (networkInterface.OperationalStatus != OperationalStatus.Up) return false; var description = networkInterface.Description.ToLower(); if (description.Contains("vpn")) return false; if (description.Contains("tap")) return false; if (description.Contains("virtual")) return false; if (description.Contains("tun")) return false; return true; } internal void Update() { var stats = networkInterface.GetIPStatistics(); var now = DateTime.UtcNow; var elapsedSec = (now - lastUpdate).TotalSeconds; if (elapsedSec > 0) { networkInfo.SentSpeed = (float)((stats.BytesSent - lastSent) / elapsedSec); networkInfo.ReceivedSpeed = (float)((stats.BytesReceived - lastReceived) / elapsedSec); } lastSent = stats.BytesSent; lastReceived = stats.BytesReceived; lastUpdate = now; } internal NetworkInfo Get() { Update(); return networkInfo; } } } ================================================ FILE: RunCat365/Program.cs ================================================ // Copyright 2020 Takuto Nakamura // // 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. using Microsoft.Win32; using RunCat365.Properties; using System.Diagnostics; using System.Globalization; using FormsTimer = System.Windows.Forms.Timer; namespace RunCat365 { internal static class Program { [STAThread] static void Main() { #if DEBUG var defaultCultureInfo = SupportedLanguage.English.GetDefaultCultureInfo(); #else var defaultCultureInfo = SupportedLanguageExtension.GetCurrentLanguage().GetDefaultCultureInfo(); #endif CultureInfo.CurrentUICulture = defaultCultureInfo; CultureInfo.CurrentCulture = defaultCultureInfo; // Terminate RunCat365 if there's any existing instance. using var procMutex = new Mutex(true, "_RUNCAT_MUTEX", out var result); if (!result) return; try { ApplicationConfiguration.Initialize(); Application.SetColorMode(SystemColorMode.System); Application.Run(new RunCat365ApplicationContext()); } finally { procMutex?.ReleaseMutex(); } } } internal class RunCat365ApplicationContext : ApplicationContext { private const int FETCH_TIMER_DEFAULT_INTERVAL = 1000; private const int FETCH_COUNTER_SIZE = 5; private const int ANIMATE_TIMER_DEFAULT_INTERVAL = 200; private readonly CPURepository cpuRepository; private readonly GPURepository gpuRepository; private readonly MemoryRepository memoryRepository; private readonly StorageRepository storageRepository; private readonly NetworkRepository networkRepository; private readonly LaunchAtStartupManager launchAtStartupManager; private readonly ContextMenuManager contextMenuManager; private readonly FormsTimer fetchTimer; private readonly FormsTimer animateTimer; private Runner runner = Runner.Cat; private Theme manualTheme = Theme.System; private FPSMaxLimit fpsMaxLimit = FPSMaxLimit.FPS40; private SpeedSource speedSource = SpeedSource.CPU; private int fetchCounter = 5; public RunCat365ApplicationContext() { UserSettings.Default.Reload(); _ = Enum.TryParse(UserSettings.Default.Runner, out runner); _ = Enum.TryParse(UserSettings.Default.Theme, out manualTheme); _ = Enum.TryParse(UserSettings.Default.FPSMaxLimit, out fpsMaxLimit); _ = Enum.TryParse(UserSettings.Default.SpeedSource, out speedSource); SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(UserPreferenceChanged); cpuRepository = new CPURepository(); gpuRepository = new GPURepository(); memoryRepository = new MemoryRepository(); storageRepository = new StorageRepository(); networkRepository = new NetworkRepository(); launchAtStartupManager = new LaunchAtStartupManager(); ResolveSpeedSource(); contextMenuManager = new ContextMenuManager( () => runner, r => ChangeRunner(r), () => GetSystemTheme(), () => manualTheme, t => ChangeManualTheme(t), () => speedSource, s => ChangeSpeedSource(s), s => IsSpeedSourceAvailable(s), () => fpsMaxLimit, f => ChangeFPSMaxLimit(f), () => launchAtStartupManager.GetStartup(), s => launchAtStartupManager.SetStartup(s), () => OpenRepository(), () => Application.Exit() ); animateTimer = new FormsTimer { Interval = ANIMATE_TIMER_DEFAULT_INTERVAL }; animateTimer.Tick += new EventHandler(AnimationTick); animateTimer.Start(); fetchTimer = new FormsTimer { Interval = FETCH_TIMER_DEFAULT_INTERVAL }; fetchTimer.Tick += new EventHandler(FetchTick); fetchTimer.Start(); ShowBalloonTipIfNeeded(); } private static Theme GetSystemTheme() { var keyName = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; using var rKey = Registry.CurrentUser.OpenSubKey(keyName); if (rKey is null) return Theme.Light; var value = rKey.GetValue("SystemUsesLightTheme"); if (value is null) return Theme.Light; return (int)value == 0 ? Theme.Dark : Theme.Light; } private bool IsSpeedSourceAvailable(SpeedSource speedSource) { return speedSource switch { SpeedSource.CPU => true, SpeedSource.GPU => gpuRepository.IsAvailable, SpeedSource.Memory => true, _ => false, }; } private void ResolveSpeedSource() { if (!IsSpeedSourceAvailable(speedSource)) { ChangeSpeedSource(SpeedSource.CPU); } } private void ShowBalloonTipIfNeeded() { if (!cpuRepository.IsAvailable) { contextMenuManager.ShowBalloonTip(BalloonTipType.CPUInfoUnavailable); } else if (UserSettings.Default.FirstLaunch) { contextMenuManager.ShowBalloonTip(BalloonTipType.AppLaunched); UserSettings.Default.FirstLaunch = false; UserSettings.Default.Save(); } } private void UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) { if (e.Category == UserPreferenceCategory.General) { var systemTheme = GetSystemTheme(); contextMenuManager.SetIcons(systemTheme, manualTheme, runner); } } private static void OpenRepository() { try { Process.Start(new ProcessStartInfo() { FileName = "https://github.com/Kyome22/RunCat365.git", UseShellExecute = true }); } catch (Exception e) { Console.WriteLine($"Error: {e.Message}"); } } private void ChangeRunner(Runner r) { runner = r; UserSettings.Default.Runner = runner.ToString(); UserSettings.Default.Save(); } private void ChangeManualTheme(Theme t) { manualTheme = t; UserSettings.Default.Theme = manualTheme.ToString(); UserSettings.Default.Save(); } private void ChangeSpeedSource(SpeedSource s) { speedSource = s; UserSettings.Default.SpeedSource = speedSource.ToString(); UserSettings.Default.Save(); } private void ChangeFPSMaxLimit(FPSMaxLimit f) { fpsMaxLimit = f; UserSettings.Default.FPSMaxLimit = fpsMaxLimit.ToString(); UserSettings.Default.Save(); } private void AnimationTick(object? sender, EventArgs e) { contextMenuManager.AdvanceFrame(); } private string GetInfoDescription(CPUInfo cpuInfo, GPUInfo? gpuInfo, MemoryInfo memoryInfo) { return speedSource switch { SpeedSource.CPU => cpuInfo.GetDescription(), SpeedSource.GPU => gpuInfo?.GetDescription() ?? "", SpeedSource.Memory => memoryInfo.GetDescription(), _ => "", }; } private int CalculateInterval(CPUInfo cpuInfo, GPUInfo? gpuInfo, MemoryInfo memoryInfo) { var load = speedSource switch { SpeedSource.CPU => cpuInfo.Total, SpeedSource.GPU => gpuInfo?.Maximum ?? 0f, SpeedSource.Memory => memoryInfo.MemoryLoad, _ => 0f, }; var speed = (float)Math.Max(1.0f, (load / 5.0f) * fpsMaxLimit.GetRate()); return (int)(500.0f / speed); } private int FetchSystemInfo() { var cpuInfo = cpuRepository.Get(); var gpuInfo = gpuRepository.Get(); var memoryInfo = memoryRepository.Get(); var storageInfo = storageRepository.Get(); var networkInfo = networkRepository.Get(); contextMenuManager.SetNotifyIconText(GetInfoDescription(cpuInfo, gpuInfo, memoryInfo)); var systemInfoValues = new List<string>(); systemInfoValues.AddRange(cpuInfo.GenerateIndicator()); if (gpuInfo.HasValue) { systemInfoValues.AddRange(gpuInfo.Value.GenerateIndicator()); } systemInfoValues.AddRange(memoryInfo.GenerateIndicator()); systemInfoValues.AddRange(storageInfo.GenerateIndicator()); systemInfoValues.AddRange(networkInfo.GenerateIndicator()); contextMenuManager.SetSystemInfoMenuText(string.Join("\n", [.. systemInfoValues])); return CalculateInterval(cpuInfo, gpuInfo, memoryInfo); } private void FetchTick(object? state, EventArgs e) { cpuRepository.Update(); gpuRepository.Update(); fetchCounter += 1; if (fetchCounter < FETCH_COUNTER_SIZE) return; fetchCounter = 0; var interval = FetchSystemInfo(); animateTimer.Stop(); animateTimer.Interval = interval; animateTimer.Start(); } protected override void Dispose(bool disposing) { if (disposing) { SystemEvents.UserPreferenceChanged -= UserPreferenceChanged; animateTimer?.Stop(); animateTimer?.Dispose(); fetchTimer?.Stop(); fetchTimer?.Dispose(); cpuRepository?.Close(); contextMenuManager?.HideNotifyIcon(); contextMenuManager?.Dispose(); } base.Dispose(disposing); } } } ================================================ FILE: RunCat365/Properties/Resources.Designer.cs ================================================ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace RunCat365.Properties { using System; /// <summary> /// A strongly-typed resource class, for looking up localized strings, etc. /// </summary> // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// <summary> /// Returns the cached ResourceManager instance used by this class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RunCat365.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// <summary> /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// <summary> /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// </summary> internal static System.Drawing.Icon AppIcon { get { object obj = ResourceManager.GetObject("AppIcon", resourceCulture); return ((System.Drawing.Icon)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_0 { get { object obj = ResourceManager.GetObject("cat_0", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_1 { get { object obj = ResourceManager.GetObject("cat_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_2 { get { object obj = ResourceManager.GetObject("cat_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_3 { get { object obj = ResourceManager.GetObject("cat_3", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_4 { get { object obj = ResourceManager.GetObject("cat_4", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_0 { get { object obj = ResourceManager.GetObject("cat_jumping_0", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_1 { get { object obj = ResourceManager.GetObject("cat_jumping_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_2 { get { object obj = ResourceManager.GetObject("cat_jumping_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_3 { get { object obj = ResourceManager.GetObject("cat_jumping_3", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_4 { get { object obj = ResourceManager.GetObject("cat_jumping_4", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_5 { get { object obj = ResourceManager.GetObject("cat_jumping_5", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_6 { get { object obj = ResourceManager.GetObject("cat_jumping_6", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_7 { get { object obj = ResourceManager.GetObject("cat_jumping_7", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_8 { get { object obj = ResourceManager.GetObject("cat_jumping_8", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_jumping_9 { get { object obj = ResourceManager.GetObject("cat_jumping_9", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_running_0 { get { object obj = ResourceManager.GetObject("cat_running_0", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_running_1 { get { object obj = ResourceManager.GetObject("cat_running_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_running_2 { get { object obj = ResourceManager.GetObject("cat_running_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_running_3 { get { object obj = ResourceManager.GetObject("cat_running_3", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap cat_running_4 { get { object obj = ResourceManager.GetObject("cat_running_4", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap horse_0 { get { object obj = ResourceManager.GetObject("horse_0", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap horse_1 { get { object obj = ResourceManager.GetObject("horse_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap horse_2 { get { object obj = ResourceManager.GetObject("horse_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap horse_3 { get { object obj = ResourceManager.GetObject("horse_3", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap horse_4 { get { object obj = ResourceManager.GetObject("horse_4", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_0 { get { object obj = ResourceManager.GetObject("parrot_0", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_1 { get { object obj = ResourceManager.GetObject("parrot_1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_2 { get { object obj = ResourceManager.GetObject("parrot_2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_3 { get { object obj = ResourceManager.GetObject("parrot_3", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_4 { get { object obj = ResourceManager.GetObject("parrot_4", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_5 { get { object obj = ResourceManager.GetObject("parrot_5", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_6 { get { object obj = ResourceManager.GetObject("parrot_6", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_7 { get { object obj = ResourceManager.GetObject("parrot_7", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_8 { get { object obj = ResourceManager.GetObject("parrot_8", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap parrot_9 { get { object obj = ResourceManager.GetObject("parrot_9", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap road_crater { get { object obj = ResourceManager.GetObject("road_crater", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap road_flat { get { object obj = ResourceManager.GetObject("road_flat", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap road_hill { get { object obj = ResourceManager.GetObject("road_hill", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> internal static System.Drawing.Bitmap road_sprout { get { object obj = ResourceManager.GetObject("road_sprout", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } } } ================================================ FILE: RunCat365/Properties/Resources.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <data name="AppIcon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\app_icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_1" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_5" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_5.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_6" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_6.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_7" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_7.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_8" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_jumping_9" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_jumping_9.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_running_0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_running_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_running_1" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_running_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_running_2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_running_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_running_3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_running_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_running_4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\cat_running_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="road_crater" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\road_crater.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="road_flat" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\road_flat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="road_hill" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\road_hill.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="road_sprout" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\game\road_sprout.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\cat\cat_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_1" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\cat\cat_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\cat\cat_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\cat\cat_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="cat_4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\cat\cat_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="horse_0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\horse\horse_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="horse_1" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\horse\horse_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="horse_2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\horse\horse_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="horse_3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\horse\horse_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="horse_4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\horse\horse_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_0" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_1" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_2" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_3" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_4" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_4.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_5" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_5.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_6" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_6.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_7" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_7.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_8" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_8.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="parrot_9" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\resources\runners\parrot\parrot_9.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.Designer.cs ================================================ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace RunCat365.Properties { using System; /// <summary> /// A strongly-typed resource class, for looking up localized strings, etc. /// </summary> [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Strings { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Strings() { } /// <summary> /// Returns the cached ResourceManager instance used by this class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RunCat365.Properties.Strings", typeof(Strings).Assembly); resourceMan = temp; } return resourceMan; } } /// <summary> /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// </summary> [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// <summary> /// Looks up a localized string similar to GAME OVER. /// </summary> internal static string Game_GameOver { get { return ResourceManager.GetString("Game_GameOver", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Press space to play.. /// </summary> internal static string Game_PressSpaceToPlay { get { return ResourceManager.GetString("Game_PressSpaceToPlay", resourceCulture); } } /// <summary> /// Looks up a localized string similar to New Record. /// </summary> internal static string Game_NewRecord { get { return ResourceManager.GetString("Game_NewRecord", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Endless Game. /// </summary> internal static string Menu_EndlessGame { get { return ResourceManager.GetString("Menu_EndlessGame", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Exit. /// </summary> internal static string Menu_Exit { get { return ResourceManager.GetString("Menu_Exit", resourceCulture); } } /// <summary> /// Looks up a localized string similar to FPS Max Limit. /// </summary> internal static string Menu_FPSMaxLimit { get { return ResourceManager.GetString("Menu_FPSMaxLimit", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Information. /// </summary> internal static string Menu_Information { get { return ResourceManager.GetString("Menu_Information", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Launch at startup. /// </summary> internal static string Menu_LaunchAtStartup { get { return ResourceManager.GetString("Menu_LaunchAtStartup", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Open Repository. /// </summary> internal static string Menu_OpenRepository { get { return ResourceManager.GetString("Menu_OpenRepository", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Runner. /// </summary> internal static string Menu_Runner { get { return ResourceManager.GetString("Menu_Runner", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Settings. /// </summary> internal static string Menu_Settings { get { return ResourceManager.GetString("Menu_Settings", resourceCulture); } } internal static string Menu_SpeedSource { get { return ResourceManager.GetString("Menu_SpeedSource", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Theme. /// </summary> internal static string Menu_Theme { get { return ResourceManager.GetString("Menu_Theme", resourceCulture); } } /// <summary> /// Looks up a localized string similar to App has launched. If the icon is not on the taskbar, it has been omitted, so please move it manually and pin it.. /// </summary> internal static string Message_AppLaunched { get { return ResourceManager.GetString("Message_AppLaunched", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Failed to get CPU usage. Unable to update running speed.. /// </summary> internal static string Message_CPUUsageUnavailable { get { return ResourceManager.GetString("Message_CPUUsageUnavailable", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Warning. /// </summary> internal static string Message_Warning { get { return ResourceManager.GetString("Message_Warning", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Cat. /// </summary> internal static string Runner_Cat { get { return ResourceManager.GetString("Runner_Cat", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Horse. /// </summary> internal static string Runner_Horse { get { return ResourceManager.GetString("Runner_Horse", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Parrot. /// </summary> internal static string Runner_Parrot { get { return ResourceManager.GetString("Runner_Parrot", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Dark. /// </summary> internal static string Theme_Dark { get { return ResourceManager.GetString("Theme_Dark", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Light. /// </summary> internal static string Theme_Light { get { return ResourceManager.GetString("Theme_Light", resourceCulture); } } /// <summary> /// Looks up a localized string similar to System. /// </summary> internal static string Theme_System { get { return ResourceManager.GetString("Theme_System", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Endless Game. /// </summary> internal static string Window_EndlessGame { get { return ResourceManager.GetString("Window_EndlessGame", resourceCulture); } } /// <summary> /// Looks up a localized string similar to CPU. /// </summary> internal static string SystemInfo_CPU { get { return ResourceManager.GetString("SystemInfo_CPU", resourceCulture); } } /// <summary> /// Looks up a localized string similar to User. /// </summary> internal static string SystemInfo_User { get { return ResourceManager.GetString("SystemInfo_User", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Kernel. /// </summary> internal static string SystemInfo_Kernel { get { return ResourceManager.GetString("SystemInfo_Kernel", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Available. /// </summary> internal static string SystemInfo_Available { get { return ResourceManager.GetString("SystemInfo_Available", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Memory. /// </summary> internal static string SystemInfo_Memory { get { return ResourceManager.GetString("SystemInfo_Memory", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Total. /// </summary> internal static string SystemInfo_Total { get { return ResourceManager.GetString("SystemInfo_Total", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Used. /// </summary> internal static string SystemInfo_Used { get { return ResourceManager.GetString("SystemInfo_Used", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Storage. /// </summary> internal static string SystemInfo_Storage { get { return ResourceManager.GetString("SystemInfo_Storage", resourceCulture); } } /// <summary> /// Looks up a localized string similar to C Drive. /// </summary> internal static string SystemInfo_DriveC { get { return ResourceManager.GetString("SystemInfo_DriveC", resourceCulture); } } /// <summary> /// Looks up a localized string similar to D Drive. /// </summary> internal static string SystemInfo_DriveD { get { return ResourceManager.GetString("SystemInfo_DriveD", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Network. /// </summary> internal static string SystemInfo_Network { get { return ResourceManager.GetString("SystemInfo_Network", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Sent. /// </summary> internal static string SystemInfo_Sent { get { return ResourceManager.GetString("SystemInfo_Sent", resourceCulture); } } /// <summary> /// Looks up a localized string similar to Received. /// </summary> internal static string SystemInfo_Received { get { return ResourceManager.GetString("SystemInfo_Received", resourceCulture); } } internal static string SystemInfo_GPU { get { return ResourceManager.GetString("SystemInfo_GPU", resourceCulture); } } internal static string SystemInfo_Average { get { return ResourceManager.GetString("SystemInfo_Average", resourceCulture); } } internal static string SystemInfo_Maximum { get { return ResourceManager.GetString("SystemInfo_Maximum", resourceCulture); } } } } ================================================ FILE: RunCat365/Properties/Strings.de.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>Läufer</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>Design</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>FPS-Maximallimit</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>Beim Start ausführen</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>Einstellungen</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>Endlosspiel</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>Information</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>Repository öffnen</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>Beenden</value> </data> <data name="Theme_System" xml:space="preserve"> <value>System</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>Hell</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>Dunkel</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>Katze</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>Papagei</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>Pferd</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>Die App wurde gestartet. Wenn das Symbol nicht in der Taskleiste angezeigt wird, wurde es ausgeblendet. Bitte verschieben Sie es manuell und heften Sie es an.</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>Warnung</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>Endlosspiel</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>Leertaste drücken zum Spielen.</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>SPIEL VORBEI</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>Benutzer</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>Kernel</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>Verfügbar</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>Durchschnitt</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>Maximum</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>Arbeitsspeicher</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>Gesamt</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>Verwendet</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>Speicher</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>Laufwerk C</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>Laufwerk D</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>Netzwerk</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>Gesendet</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>Empfangen</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>CPU-Auslastung konnte nicht abgerufen werden. Die Laufgeschwindigkeit kann nicht aktualisiert werden.</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>Geschwindigkeit basierend auf</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>Neuer Rekord</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.es.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>Corredor</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>Tema</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>Límite Máximo de FPS</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>Ejecutar al inicio</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>Ajustes</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>Juego Sin Fin</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>Información</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>Abrir Repositorio</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>Salir</value> </data> <data name="Theme_System" xml:space="preserve"> <value>Sistema</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>Claro</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>Oscuro</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>Gato</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>Loro</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>Caballo</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>La aplicación se ha iniciado. Si el ícono no aparece en la barra de tareas, puede estar oculto; por favor muévelo manualmente y fíjalo.</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>Advertencia</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>Juego Sin Fin</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>Presiona espacio para jugar.</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>FIN DEL JUEGO</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>Usuario</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>Núcleo</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>Disponible</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>Promedio</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>Máximo</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>Memoria</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>Total</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>Usado</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>Almacenamiento</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>Disco C</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>Disco D</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>Red</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>Enviado</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>Recibido</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>No se pudo obtener el uso de la CPU. No es posible actualizar la velocidad del corredor.</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>Velocidad basada en</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>Nuevo Récord</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.fr.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>Coureur</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>Thème</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>Limite FPS maximale</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>Lancer au démarrage</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>Paramètres</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>Jeu sans fin</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>Informations</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>Ouvrir le dépôt</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>Quitter</value> </data> <data name="Theme_System" xml:space="preserve"> <value>Système</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>Clair</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>Sombre</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>Chat</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>Perroquet</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>Cheval</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>L'application a démarré. Si l'icône n'apparaît pas dans la barre des tâches, elle a peut-être été masquée ; veuillez la déplacer manuellement et l'épingler.</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>Avertissement</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>Jeu sans fin</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>Appuyez sur espace pour jouer.</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>GAME OVER</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>Utilisateur</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>Noyau</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>Disponible</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>Moyenne</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>Maximum</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>Mémoire</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>Total</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>Utilisé</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>Stockage</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>Disque C</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>Disque D</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>Réseau</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>Envoyé</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>Reçu</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>Impossible d'obtenir l'utilisation du CPU. Impossible de mettre à jour la vitesse du coureur.</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>Vitesse basée sur</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>Nouveau record</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.ja.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>ランナー</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>テーマ</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>FPSの上限</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>スタートアップ時に起動</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>設定</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>エンドレスゲーム</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>情報</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>リポジトリを開く</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>終了</value> </data> <data name="Theme_System" xml:space="preserve"> <value>システム</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>ライト</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>ダーク</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>ネコ</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>オウム</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>早馬</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>アプリが起動しました。タスクバーにアイコンが表示されていない場合は、省略されているので手動で移動してピン留めしてください。</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>警告</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>エンドレスゲーム</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>スペースキーでスタート</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>ゲームオーバー</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>ユーザー</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>カーネル</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>使用可能</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>平均</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>最大</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>メモリ</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>合計</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>使用中</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>ストレージ</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>Cドライブ</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>Dドライブ</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>ネットワーク</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>送信</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>受信</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>CPU使用率の取得ができません。走る速度を更新できません。</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>速度の基準</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>新記録</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>Runner</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>Theme</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>FPS Max Limit</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>Launch at startup</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>Settings</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>Endless Game</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>Information</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>Open Repository</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>Exit</value> </data> <data name="Theme_System" xml:space="preserve"> <value>System</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>Light</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>Dark</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>Cat</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>Parrot</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>Horse</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>App has launched. If the icon is not on the taskbar, it has been omitted, so please move it manually and pin it.</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>Warning</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>Endless Game</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>Press space to play.</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>GAME OVER</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>User</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>Kernel</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>Available</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>Average</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>Maximum</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>Memory</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>Total</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>Used</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>Storage</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>C Drive</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>D Drive</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>Network</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>Sent</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>Received</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>Failed to get CPU usage. Unable to update running speed.</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>Speed based on</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>New Record</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.zh-CN.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>跑步者</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>主题</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>FPS 最大限制</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>跟随 Windows 启动</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>设置</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>无尽游戏</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>信息</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>打开存储库</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>退出</value> </data> <data name="Theme_System" xml:space="preserve"> <value>系统</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>浅色</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>深色</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>猫咪</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>鹦鹉</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>马</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>应用已启动。如果图标不在任务栏上,则表示该应用已被省略,请手动移动并将其固定。</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>警告</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>无尽游戏</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>按空格键开始。</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>游戏结束</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>用户</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>内核</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>可用</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>平均</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>最大</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>内存</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>总计</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>已使用</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>存储</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>C 盘</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>D 盘</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>网络</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>发送</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>已接收</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>获取 CPU 使用率失败。无法更新运行速度。</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>速度来源</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>新纪录</value> </data> </root> ================================================ FILE: RunCat365/Properties/Strings.zh-TW.resx ================================================ <?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name="Menu_Runner" xml:space="preserve"> <value>跑步者</value> </data> <data name="Menu_Theme" xml:space="preserve"> <value>主題</value> </data> <data name="Menu_FPSMaxLimit" xml:space="preserve"> <value>FPS 最大限制</value> </data> <data name="Menu_LaunchAtStartup" xml:space="preserve"> <value>跟隨 Windows 啟動</value> </data> <data name="Menu_Settings" xml:space="preserve"> <value>設定</value> </data> <data name="Menu_EndlessGame" xml:space="preserve"> <value>無盡遊戲</value> </data> <data name="Menu_Information" xml:space="preserve"> <value>資訊</value> </data> <data name="Menu_OpenRepository" xml:space="preserve"> <value>開啟存儲庫</value> </data> <data name="Menu_Exit" xml:space="preserve"> <value>結束</value> </data> <data name="Theme_System" xml:space="preserve"> <value>系統</value> </data> <data name="Theme_Light" xml:space="preserve"> <value>淺色</value> </data> <data name="Theme_Dark" xml:space="preserve"> <value>深色</value> </data> <data name="Runner_Cat" xml:space="preserve"> <value>貓咪</value> </data> <data name="Runner_Parrot" xml:space="preserve"> <value>鸚鵡</value> </data> <data name="Runner_Horse" xml:space="preserve"> <value>馬</value> </data> <data name="Message_AppLaunched" xml:space="preserve"> <value>應用程式已啟動。如果圖示不在工作列上,表示已被省略,請手動移動並固定它。</value> </data> <data name="Message_Warning" xml:space="preserve"> <value>警告</value> </data> <data name="Window_EndlessGame" xml:space="preserve"> <value>無盡遊戲</value> </data> <data name="Game_PressSpaceToPlay" xml:space="preserve"> <value>按空白鍵開始。</value> </data> <data name="Game_GameOver" xml:space="preserve"> <value>遊戲結束</value> </data> <data name="SystemInfo_CPU" xml:space="preserve"> <value>CPU</value> </data> <data name="SystemInfo_User" xml:space="preserve"> <value>使用者</value> </data> <data name="SystemInfo_Kernel" xml:space="preserve"> <value>核心</value> </data> <data name="SystemInfo_Available" xml:space="preserve"> <value>可用</value> </data> <data name="SystemInfo_GPU" xml:space="preserve"> <value>GPU</value> </data> <data name="SystemInfo_Average" xml:space="preserve"> <value>平均</value> </data> <data name="SystemInfo_Maximum" xml:space="preserve"> <value>最大</value> </data> <data name="SystemInfo_Memory" xml:space="preserve"> <value>記憶體</value> </data> <data name="SystemInfo_Total" xml:space="preserve"> <value>總計</value> </data> <data name="SystemInfo_Used" xml:space="preserve"> <value>已使用</value> </data> <data name="SystemInfo_Storage" xml:space="preserve"> <value>儲存</value> </data> <data name="SystemInfo_DriveC" xml:space="preserve"> <value>C 槽</value> </data> <data name="SystemInfo_DriveD" xml:space="preserve"> <value>D 槽</value> </data> <data name="SystemInfo_Network" xml:space="preserve"> <value>網路</value> </data> <data name="SystemInfo_Sent" xml:space="preserve"> <value>傳送</value> </data> <data name="SystemInfo_Received" xml:space="preserve"> <value>已接收</value> </data> <data name="Message_CPUUsageUnavailable" xml:space="preserve"> <value>取得 CPU 使用率失敗。無法更新執行速度。</value> </data> <data name="Menu_SpeedSource" xml:space="preserve"> <value>速度來源</value> </data> <data name="Game_NewRecord" xml:space="preserve"> <value>新紀錄</value> </data> </root> ================================================ FILE: RunCat365/Properties/UserSettings.Designer.cs ================================================ //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace RunCat365.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")] internal sealed partial class UserSettings : global::System.Configuration.ApplicationSettingsBase { private static UserSettings defaultInstance = ((UserSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new UserSettings()))); public static UserSettings Default { get { return defaultInstance; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("Cat")] public string Runner { get { return ((string)(this["Runner"])); } set { this["Runner"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string Theme { get { return ((string)(this["Theme"])); } set { this["Theme"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("FPS40")] public string FPSMaxLimit { get { return ((string)(this["FPSMaxLimit"])); } set { this["FPSMaxLimit"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool FirstLaunch { get { return ((bool)(this["FirstLaunch"])); } set { this["FirstLaunch"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] public int HighScore { get { return ((int)(this["HighScore"])); } set { this["HighScore"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("CPU")] public string SpeedSource { get { return ((string)(this["SpeedSource"])); } set { this["SpeedSource"] = value; } } } } ================================================ FILE: RunCat365/Properties/UserSettings.settings ================================================ <?xml version='1.0' encoding='utf-8'?> <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="RunCat365.Properties" GeneratedClassName="UserSettings"> <Profiles /> <Settings> <Setting Name="Runner" Type="System.String" Scope="User"> <Value Profile="(Default)">Cat</Value> </Setting> <Setting Name="Theme" Type="System.String" Scope="User"> <Value Profile="(Default)" /> </Setting> <Setting Name="FPSMaxLimit" Type="System.String" Scope="User"> <Value Profile="(Default)">FPS40</Value> </Setting> <Setting Name="FirstLaunch" Type="System.Boolean" Scope="User"> <Value Profile="(Default)">True</Value> </Setting> <Setting Name="HighScore" Type="System.Int32" Scope="User"> <Value Profile="(Default)">0</Value> </Setting> <Setting Name="SpeedSource" Type="System.String" Scope="User"> <Value Profile="(Default)">CPU</Value> </Setting> </Settings> </SettingsFile> ================================================ FILE: RunCat365/Road.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal enum Road { Flat, Hill, Crater, Sprout } internal static class RoadExtension { internal static string GetString(this Road road) { return road switch { Road.Flat => "Flat", Road.Hill => "Hill", Road.Crater => "Crater", Road.Sprout => "Sprout", _ => "", }; } } } ================================================ FILE: RunCat365/RunCat365.csproj ================================================ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net9.0-windows10.0.26100.0</TargetFramework> <Nullable>enable</Nullable> <UseWindowsForms>true</UseWindowsForms> <ImplicitUsings>enable</ImplicitUsings> <SupportedOSPlatformVersion>10.0.19041.0</SupportedOSPlatformVersion> <AssemblyName>RunCat 365</AssemblyName> <ApplicationIcon>resources\app_icon.ico</ApplicationIcon> <Authors>Takuto Nakamura</Authors> <Company>Studio Kyome</Company> <Description>A cute running cat animation on your taskbar.</Description> <Copyright>© 2022 Takuto Nakamura</Copyright> <PackageProjectUrl>https://kyome22.github.io/RunCat365/</PackageProjectUrl> <RepositoryUrl>https://github.com/Kyome22/RunCat365</RepositoryUrl> <PackageTags>cpu;cat;taskbar</PackageTags> <PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageIcon>app_icon.png</PackageIcon> <Version>3.4.0</Version> <PackageReadmeFile>README.md</PackageReadmeFile> <StartupObject>RunCat365.Program</StartupObject> <IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion> <Platforms>x64;x86;ARM64</Platforms> <ApplicationManifest>App.manifest</ApplicationManifest> <NoWarn>$(NoWarn);WFO5001</NoWarn> <AllowUnsafeBlocks>true</AllowUnsafeBlocks> </PropertyGroup> <ItemGroup> <Content Include="resources\app_icon.ico" /> </ItemGroup> <ItemGroup> <None Include="..\docs\images\app_icon.png"> <Pack>True</Pack> <PackagePath>\</PackagePath> </None> <None Include="..\LICENSE"> <Pack>True</Pack> <PackagePath>\</PackagePath> </None> <None Include="..\README.md"> <Pack>True</Pack> <PackagePath>\</PackagePath> </None> </ItemGroup> <ItemGroup> <Compile Update="Properties\Resources.Designer.cs"> <DesignTime>True</DesignTime> <AutoGen>True</AutoGen> <DependentUpon>Resources.resx</DependentUpon> </Compile> <Compile Update="Properties\UserSettings.Designer.cs"> <DesignTimeSharedInput>True</DesignTimeSharedInput> <AutoGen>True</AutoGen> <DependentUpon>UserSettings.settings</DependentUpon> </Compile> </ItemGroup> <ItemGroup> <EmbeddedResource Update="Properties\Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> </EmbeddedResource> </ItemGroup> <ItemGroup> <None Update="Properties\UserSettings.settings"> <Generator>SettingsSingleFileGenerator</Generator> <LastGenOutput>UserSettings.Designer.cs</LastGenOutput> </None> </ItemGroup> </Project> ================================================ FILE: RunCat365/Runner.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; namespace RunCat365 { enum Runner { Cat, Parrot, Horse, } internal static class RunnerExtension { internal static string GetString(this Runner runner) { return runner switch { Runner.Cat => "Cat", Runner.Parrot => "Parrot", Runner.Horse => "Horse", _ => "", }; } internal static string GetLocalizedString(this Runner runner) { return runner switch { Runner.Cat => Strings.Runner_Cat, Runner.Parrot => Strings.Runner_Parrot, Runner.Horse => Strings.Runner_Horse, _ => "", }; } internal static int GetFrameNumber(this Runner runner) { return runner switch { Runner.Cat => 5, Runner.Parrot => 10, Runner.Horse => 14, _ => 0, }; } } } ================================================ FILE: RunCat365/SpeedSource.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; using System.Diagnostics.CodeAnalysis; namespace RunCat365 { enum SpeedSource { CPU, GPU, Memory, } internal static class SpeedSourceExtension { internal static string GetLocalizedString(this SpeedSource speedSource) { return speedSource switch { SpeedSource.CPU => Strings.SystemInfo_CPU, SpeedSource.GPU => Strings.SystemInfo_GPU, SpeedSource.Memory => Strings.SystemInfo_Memory, _ => "", }; } internal static bool TryParse([NotNullWhen(true)] string? value, out SpeedSource result) { SpeedSource? nullableResult = value switch { "CPU" => SpeedSource.CPU, "GPU" => SpeedSource.GPU, "Memory" => SpeedSource.Memory, _ => null, }; if (nullableResult is SpeedSource nonNullableResult) { result = nonNullableResult; return true; } else { result = SpeedSource.CPU; return false; } } } } ================================================ FILE: RunCat365/StorageRepository.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; namespace RunCat365 { enum Drive { C, D } internal static class DriveExtension { internal static string GetString(this Drive drive) { return drive switch { Drive.C => "C Drive", Drive.D => "D Drive", _ => "", }; } internal static string GetLocalizedString(this Drive drive) { return drive switch { Drive.C => Strings.SystemInfo_DriveC, Drive.D => Strings.SystemInfo_DriveD, _ => "", }; } internal static Drive? CreateFromString(string? value) { return value switch { "C:\\" => Drive.C, "D:\\" => Drive.D, _ => null, }; } } struct StorageInfo { internal Drive Drive { get; set; } internal long TotalSize { get; set; } internal long AvailableSpaceSize { get; set; } internal long UsedSpaceSize { get; set; } } internal static class StorageInfoExtension { internal static List<string> GenerateIndicator(this List<StorageInfo> storageInfoList) { var resultLines = new List<string> { TreeFormatter.CreateRoot($"{Strings.SystemInfo_Storage}:") }; if (storageInfoList.Count == 0) return resultLines; for (int i = 0; i < storageInfoList.Count; i++) { var info = storageInfoList[i]; var isLastItem = (i == storageInfoList.Count - 1); var percentage = ((double)info.UsedSpaceSize / info.TotalSize) * 100.0; resultLines.Add(TreeFormatter.CreateNode($"{info.Drive.GetLocalizedString()}: {percentage:f1}%", isLastItem)); resultLines.Add(TreeFormatter.CreateNestedNode($"{Strings.SystemInfo_Used}: {info.UsedSpaceSize.ToByteFormatted()}", isLastItem, false)); resultLines.Add(TreeFormatter.CreateNestedNode($"{Strings.SystemInfo_Available}: {info.AvailableSpaceSize.ToByteFormatted()}", isLastItem, true)); } return resultLines; } } internal class StorageRepository { private readonly List<StorageInfo> storageInfoList = []; internal StorageRepository() { } internal void Update() { storageInfoList.Clear(); var allDrives = DriveInfo.GetDrives(); foreach (var driveInfo in allDrives) { if (driveInfo.IsReady && DriveExtension.CreateFromString(driveInfo.Name) is Drive drive) { try { var storageInfo = new StorageInfo { Drive = drive, TotalSize = driveInfo.TotalSize, AvailableSpaceSize = driveInfo.AvailableFreeSpace, UsedSpaceSize = driveInfo.TotalSize - driveInfo.AvailableFreeSpace }; storageInfoList.Add(storageInfo); } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } } } } internal List<StorageInfo> Get() { Update(); return storageInfoList; } } } ================================================ FILE: RunCat365/SupportedLanguage.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using System.Globalization; namespace RunCat365 { enum SupportedLanguage { ChineseSimplified, ChineseTraditional, English, French, German, Japanese, Spanish, } internal static class SupportedLanguageExtension { private static SupportedLanguage DetectChineseVariant(CultureInfo culture) { return culture.Name.Contains("Hant") || culture.Name is "zh-TW" or "zh-HK" or "zh-MO" ? SupportedLanguage.ChineseTraditional : SupportedLanguage.ChineseSimplified; } internal static SupportedLanguage GetCurrentLanguage() { var culture = CultureInfo.CurrentUICulture; return culture.TwoLetterISOLanguageName switch { "zh" => DetectChineseVariant(culture), "fr" => SupportedLanguage.French, "de" => SupportedLanguage.German, "ja" => SupportedLanguage.Japanese, "es" => SupportedLanguage.Spanish, _ => SupportedLanguage.English, }; } internal static CultureInfo GetDefaultCultureInfo(this SupportedLanguage language) { return language switch { SupportedLanguage.ChineseSimplified => new CultureInfo("zh-CN"), SupportedLanguage.ChineseTraditional => new CultureInfo("zh-TW"), SupportedLanguage.French => new CultureInfo("fr-FR"), SupportedLanguage.German => new CultureInfo("de-DE"), SupportedLanguage.Japanese => new CultureInfo("ja-JP"), SupportedLanguage.Spanish => new CultureInfo("es-ES"), _ => new CultureInfo("en-US"), }; } internal static string GetFontName(this SupportedLanguage language) { return language switch { SupportedLanguage.ChineseSimplified => "Microsoft YaHei", SupportedLanguage.ChineseTraditional => "Microsoft JhengHei", SupportedLanguage.French => "Consolas", SupportedLanguage.German => "Consolas", SupportedLanguage.Japanese => "Noto Sans JP", SupportedLanguage.Spanish => "Consolas", _ => "Consolas", }; } internal static bool IsFullWidth(this SupportedLanguage language) { return language switch { SupportedLanguage.ChineseSimplified => true, SupportedLanguage.ChineseTraditional => true, SupportedLanguage.French => false, SupportedLanguage.German => false, SupportedLanguage.Japanese => true, SupportedLanguage.Spanish => false, _ => false, }; } } } ================================================ FILE: RunCat365/Theme.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. using RunCat365.Properties; namespace RunCat365 { enum Theme { System, Light, Dark, } internal static class ThemeExtension { internal static string GetString(this Theme theme) { return theme switch { Theme.System => "System", Theme.Light => "Light", Theme.Dark => "Dark", _ => "", }; } internal static string GetLocalizedString(this Theme theme) { return theme switch { Theme.System => Strings.Theme_System, Theme.Light => Strings.Theme_Light, Theme.Dark => Strings.Theme_Dark, _ => "", }; } internal static Color GetContrastColor(this Theme theme) { return theme switch { Theme.Dark => Color.White, Theme.Light => Color.Black, _ => Color.Gray, }; } } } ================================================ FILE: RunCat365/TreeFormatter.cs ================================================ // Copyright 2025 Takuto Nakamura // // 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. namespace RunCat365 { internal static class TreeFormatter { private static readonly bool isFullWidth = SupportedLanguageExtension.GetCurrentLanguage().IsFullWidth(); private static string BranchMiddle => isFullWidth ? "├─" : "├─ "; private static string BranchLast => isFullWidth ? "└─" : "└─ "; private static string IndentContinue => isFullWidth ? "│ " : "│ "; private static string IndentLast => isFullWidth ? "  " : " "; internal static string CreateRoot(string content) { return content; } internal static string CreateNode(string content, bool isLast) { var prefix = isLast ? BranchLast : BranchMiddle; return $"{prefix}{content}"; } internal static string CreateNestedNode(string content, bool parentIsLast, bool isLast) { var indent = parentIsLast ? IndentLast : IndentContinue; var prefix = isLast ? BranchLast : BranchMiddle; return $"{indent}{prefix}{content}"; } } } ================================================ FILE: RunCat365.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.14.36301.6 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RunCat365", "RunCat365\RunCat365.csproj", "{CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}" EndProject Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "WapForStore", "WapForStore\WapForStore.wapproj", "{5B865D12-1A70-4311-8EBA-010E117FE616}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|ARM64.ActiveCfg = Debug|ARM64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|ARM64.Build.0 = Debug|ARM64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|x64.ActiveCfg = Debug|x64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|x64.Build.0 = Debug|x64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|x86.ActiveCfg = Debug|x86 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Debug|x86.Build.0 = Debug|x86 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|ARM64.ActiveCfg = Release|ARM64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|ARM64.Build.0 = Release|ARM64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|x64.ActiveCfg = Release|x64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|x64.Build.0 = Release|x64 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|x86.ActiveCfg = Release|x86 {CE0ABB30-977D-4DBC-8B69-EC9D6BD72000}.Release|x86.Build.0 = Release|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|ARM64.Build.0 = Debug|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|ARM64.Deploy.0 = Debug|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x64.ActiveCfg = Debug|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x64.Build.0 = Debug|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x64.Deploy.0 = Debug|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x86.ActiveCfg = Debug|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x86.Build.0 = Debug|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Debug|x86.Deploy.0 = Debug|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|ARM64.ActiveCfg = Release|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|ARM64.Build.0 = Release|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|ARM64.Deploy.0 = Release|ARM64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x64.ActiveCfg = Release|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x64.Build.0 = Release|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x64.Deploy.0 = Release|x64 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x86.ActiveCfg = Release|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x86.Build.0 = Release|x86 {5B865D12-1A70-4311-8EBA-010E117FE616}.Release|x86.Deploy.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {04BCEA3C-C8B1-4028-A4AD-6C50E8210E5B} EndGlobalSection EndGlobal ================================================ FILE: WapForStore/AppPackages/rm-wap-for-store.sh ================================================ #!/usr/bin/env sh # Usage: ./rm-wap-for-store.sh x.y.z.w [ "$#" -eq 1 ] || { echo "Usage: $0 x.y.z.w" >&2; exit 2; } v="$1" rm -rf -- "WapForStore_${v}_Test" rm -f -- "WapForStore_${v}_x86_x64_arm64_bundle.msixupload" ================================================ FILE: WapForStore/Package.StoreAssociation.xml ================================================ <?xml version="1.0" encoding="utf-8"?> <StoreAssociation xmlns="http://schemas.microsoft.com/appx/2010/storeassociation"> <Publisher>CN=B2C5F2BD-A1AB-42BE-A228-02E6F800BE2A</Publisher> <PublisherDisplayName>Studio Kyome</PublisherDisplayName> <DeveloperAccountType>MSA</DeveloperAccountType> <GeneratePackageHash>http://www.w3.org/2001/04/xmlenc#sha256</GeneratePackageHash> <SupportedLocales> <Language Code="af" InMinimumRequirementSet="true" /> <Language Code="af-za" InMinimumRequirementSet="true" /> <Language Code="am" InMinimumRequirementSet="true" /> <Language Code="am-et" InMinimumRequirementSet="true" /> <Language Code="ar" InMinimumRequirementSet="true" /> <Language Code="ar-ae" InMinimumRequirementSet="true" /> <Language Code="ar-bh" InMinimumRequirementSet="true" /> <Language Code="ar-dz" InMinimumRequirementSet="true" /> <Language Code="ar-eg" InMinimumRequirementSet="true" /> <Language Code="ar-iq" InMinimumRequirementSet="true" /> <Language Code="ar-jo" InMinimumRequirementSet="true" /> <Language Code="ar-kw" InMinimumRequirementSet="true" /> <Language Code="ar-lb" InMinimumRequirementSet="true" /> <Language Code="ar-ly" InMinimumRequirementSet="true" /> <Language Code="ar-ma" InMinimumRequirementSet="true" /> <Language Code="ar-om" InMinimumRequirementSet="true" /> <Language Code="ar-qa" InMinimumRequirementSet="true" /> <Language Code="ar-sa" InMinimumRequirementSet="true" /> <Language Code="ar-sy" InMinimumRequirementSet="true" /> <Language Code="ar-tn" InMinimumRequirementSet="true" /> <Language Code="ar-ye" InMinimumRequirementSet="true" /> <Language Code="as" InMinimumRequirementSet="true" /> <Language Code="as-in" InMinimumRequirementSet="true" /> <Language Code="az" InMinimumRequirementSet="true" /> <Language Code="az-arab" InMinimumRequirementSet="true" /> <Language Code="az-arab-az" InMinimumRequirementSet="true" /> <Language Code="az-cyrl" InMinimumRequirementSet="true" /> <Language Code="az-cyrl-az" InMinimumRequirementSet="true" /> <Language Code="az-latn" InMinimumRequirementSet="true" /> <Language Code="az-latn-az" InMinimumRequirementSet="true" /> <Language Code="be" InMinimumRequirementSet="true" /> <Language Code="be-by" InMinimumRequirementSet="true" /> <Language Code="bg" InMinimumRequirementSet="true" /> <Language Code="bg-bg" InMinimumRequirementSet="true" /> <Language Code="bn" InMinimumRequirementSet="true" /> <Language Code="bn-bd" InMinimumRequirementSet="true" /> <Language Code="bn-in" InMinimumRequirementSet="true" /> <Language Code="bs" InMinimumRequirementSet="true" /> <Language Code="bs-cyrl" InMinimumRequirementSet="true" /> <Language Code="bs-cyrl-ba" InMinimumRequirementSet="true" /> <Language Code="bs-latn" InMinimumRequirementSet="true" /> <Language Code="bs-latn-ba" InMinimumRequirementSet="true" /> <Language Code="ca" InMinimumRequirementSet="true" /> <Language Code="ca-es" InMinimumRequirementSet="true" /> <Language Code="ca-es-valencia" InMinimumRequirementSet="true" /> <Language Code="chr-cher" InMinimumRequirementSet="true" /> <Language Code="chr-cher-us" InMinimumRequirementSet="true" /> <Language Code="chr-latn" InMinimumRequirementSet="true" /> <Language Code="cs" InMinimumRequirementSet="true" /> <Language Code="cs-cz" InMinimumRequirementSet="true" /> <Language Code="cy" InMinimumRequirementSet="true" /> <Language Code="cy-gb" InMinimumRequirementSet="true" /> <Language Code="da" InMinimumRequirementSet="true" /> <Language Code="da-dk" InMinimumRequirementSet="true" /> <Language Code="de" InMinimumRequirementSet="true" /> <Language Code="de-at" InMinimumRequirementSet="true" /> <Language Code="de-ch" InMinimumRequirementSet="true" /> <Language Code="de-de" InMinimumRequirementSet="true" /> <Language Code="de-li" InMinimumRequirementSet="true" /> <Language Code="de-lu" InMinimumRequirementSet="true" /> <Language Code="el" InMinimumRequirementSet="true" /> <Language Code="el-gr" InMinimumRequirementSet="true" /> <Language Code="en" InMinimumRequirementSet="true" /> <Language Code="en-011" InMinimumRequirementSet="true" /> <Language Code="en-014" InMinimumRequirementSet="true" /> <Language Code="en-018" InMinimumRequirementSet="true" /> <Language Code="en-021" InMinimumRequirementSet="true" /> <Language Code="en-029" InMinimumRequirementSet="true" /> <Language Code="en-053" InMinimumRequirementSet="true" /> <Language Code="en-au" InMinimumRequirementSet="true" /> <Language Code="en-bz" InMinimumRequirementSet="true" /> <Language Code="en-ca" InMinimumRequirementSet="true" /> <Language Code="en-gb" InMinimumRequirementSet="true" /> <Language Code="en-hk" InMinimumRequirementSet="true" /> <Language Code="en-id" InMinimumRequirementSet="true" /> <Language Code="en-ie" InMinimumRequirementSet="true" /> <Language Code="en-in" InMinimumRequirementSet="true" /> <Language Code="en-jm" InMinimumRequirementSet="true" /> <Language Code="en-kz" InMinimumRequirementSet="true" /> <Language Code="en-mt" InMinimumRequirementSet="true" /> <Language Code="en-my" InMinimumRequirementSet="true" /> <Language Code="en-nz" InMinimumRequirementSet="true" /> <Language Code="en-ph" InMinimumRequirementSet="true" /> <Language Code="en-pk" InMinimumRequirementSet="true" /> <Language Code="en-sg" InMinimumRequirementSet="true" /> <Language Code="en-tt" InMinimumRequirementSet="true" /> <Language Code="en-us" InMinimumRequirementSet="true" /> <Language Code="en-vn" InMinimumRequirementSet="true" /> <Language Code="en-za" InMinimumRequirementSet="true" /> <Language Code="en-zw" InMinimumRequirementSet="true" /> <Language Code="es" InMinimumRequirementSet="true" /> <Language Code="es-019" InMinimumRequirementSet="true" /> <Language Code="es-419" InMinimumRequirementSet="true" /> <Language Code="es-ar" InMinimumRequirementSet="true" /> <Language Code="es-bo" InMinimumRequirementSet="true" /> <Language Code="es-cl" InMinimumRequirementSet="true" /> <Language Code="es-co" InMinimumRequirementSet="true" /> <Language Code="es-cr" InMinimumRequirementSet="true" /> <Language Code="es-do" InMinimumRequirementSet="true" /> <Language Code="es-ec" InMinimumRequirementSet="true" /> <Language Code="es-es" InMinimumRequirementSet="true" /> <Language Code="es-gt" InMinimumRequirementSet="true" /> <Language Code="es-hn" InMinimumRequirementSet="true" /> <Language Code="es-mx" InMinimumRequirementSet="true" /> <Language Code="es-ni" InMinimumRequirementSet="true" /> <Language Code="es-pa" InMinimumRequirementSet="true" /> <Language Code="es-pe" InMinimumRequirementSet="true" /> <Language Code="es-pr" InMinimumRequirementSet="true" /> <Language Code="es-py" InMinimumRequirementSet="true" /> <Language Code="es-sv" InMinimumRequirementSet="true" /> <Language Code="es-us" InMinimumRequirementSet="true" /> <Language Code="es-uy" InMinimumRequirementSet="true" /> <Language Code="es-ve" InMinimumRequirementSet="true" /> <Language Code="et" InMinimumRequirementSet="true" /> <Language Code="et-ee" InMinimumRequirementSet="true" /> <Language Code="eu" InMinimumRequirementSet="true" /> <Language Code="eu-es" InMinimumRequirementSet="true" /> <Language Code="fa" InMinimumRequirementSet="true" /> <Language Code="fa-ir" InMinimumRequirementSet="true" /> <Language Code="fi" InMinimumRequirementSet="true" /> <Language Code="fi-fi" InMinimumRequirementSet="true" /> <Language Code="fil" InMinimumRequirementSet="true" /> <Language Code="fil-latn" InMinimumRequirementSet="true" /> <Language Code="fil-ph" InMinimumRequirementSet="true" /> <Language Code="fr" InMinimumRequirementSet="true" /> <Language Code="fr-011" InMinimumRequirementSet="true" /> <Language Code="fr-015" InMinimumRequirementSet="true" /> <Language Code="fr-021" InMinimumRequirementSet="true" /> <Language Code="fr-029" InMinimumRequirementSet="true" /> <Language Code="fr-155" InMinimumRequirementSet="true" /> <Language Code="fr-be" InMinimumRequirementSet="true" /> <Language Code="fr-ca" InMinimumRequirementSet="true" /> <Language Code="fr-cd" InMinimumRequirementSet="true" /> <Language Code="fr-ch" InMinimumRequirementSet="true" /> <Language Code="fr-ci" InMinimumRequirementSet="true" /> <Language Code="fr-cm" InMinimumRequirementSet="true" /> <Language Code="fr-fr" InMinimumRequirementSet="true" /> <Language Code="fr-ht" InMinimumRequirementSet="true" /> <Language Code="fr-lu" InMinimumRequirementSet="true" /> <Language Code="fr-ma" InMinimumRequirementSet="true" /> <Language Code="fr-mc" InMinimumRequirementSet="true" /> <Language Code="fr-ml" InMinimumRequirementSet="true" /> <Language Code="fr-re" InMinimumRequirementSet="true" /> <Language Code="frc-latn" InMinimumRequirementSet="true" /> <Language Code="frp-latn" InMinimumRequirementSet="true" /> <Language Code="ga" InMinimumRequirementSet="true" /> <Language Code="ga-ie" InMinimumRequirementSet="true" /> <Language Code="gd-gb" InMinimumRequirementSet="true" /> <Language Code="gd-latn" InMinimumRequirementSet="true" /> <Language Code="gl" InMinimumRequirementSet="true" /> <Language Code="gl-es" InMinimumRequirementSet="true" /> <Language Code="gu" InMinimumRequirementSet="true" /> <Language Code="gu-in" InMinimumRequirementSet="true" /> <Language Code="ha" InMinimumRequirementSet="true" /> <Language Code="ha-latn" InMinimumRequirementSet="true" /> <Language Code="ha-latn-ng" InMinimumRequirementSet="true" /> <Language Code="he" InMinimumRequirementSet="true" /> <Language Code="he-il" InMinimumRequirementSet="true" /> <Language Code="hi" InMinimumRequirementSet="true" /> <Language Code="hi-in" InMinimumRequirementSet="true" /> <Language Code="hr" InMinimumRequirementSet="true" /> <Language Code="hr-ba" InMinimumRequirementSet="true" /> <Language Code="hr-hr" InMinimumRequirementSet="true" /> <Language Code="hu" InMinimumRequirementSet="true" /> <Language Code="hu-hu" InMinimumRequirementSet="true" /> <Language Code="hy" InMinimumRequirementSet="true" /> <Language Code="hy-am" InMinimumRequirementSet="true" /> <Language Code="id" InMinimumRequirementSet="true" /> <Language Code="id-id" InMinimumRequirementSet="true" /> <Language Code="ig-latn" InMinimumRequirementSet="true" /> <Language Code="ig-ng" InMinimumRequirementSet="true" /> <Language Code="is" InMinimumRequirementSet="true" /> <Language Code="is-is" InMinimumRequirementSet="true" /> <Language Code="it" InMinimumRequirementSet="true" /> <Language Code="it-ch" InMinimumRequirementSet="true" /> <Language Code="it-it" InMinimumRequirementSet="true" /> <Language Code="iu-cans" InMinimumRequirementSet="true" /> <Language Code="iu-latn" InMinimumRequirementSet="true" /> <Language Code="iu-latn-ca" InMinimumRequirementSet="true" /> <Language Code="ja" InMinimumRequirementSet="true" /> <Language Code="ja-jp" InMinimumRequirementSet="true" /> <Language Code="ka" InMinimumRequirementSet="true" /> <Language Code="ka-ge" InMinimumRequirementSet="true" /> <Language Code="kk" InMinimumRequirementSet="true" /> <Language Code="kk-kz" InMinimumRequirementSet="true" /> <Language Code="km" InMinimumRequirementSet="true" /> <Language Code="km-kh" InMinimumRequirementSet="true" /> <Language Code="kn" InMinimumRequirementSet="true" /> <Language Code="kn-in" InMinimumRequirementSet="true" /> <Language Code="ko" InMinimumRequirementSet="true" /> <Language Code="ko-kr" InMinimumRequirementSet="true" /> <Language Code="kok" InMinimumRequirementSet="true" /> <Language Code="kok-in" InMinimumRequirementSet="true" /> <Language Code="ku-arab" InMinimumRequirementSet="true" /> <Language Code="ku-arab-iq" InMinimumRequirementSet="true" /> <Language Code="ky-cyrl" InMinimumRequirementSet="true" /> <Language Code="ky-kg" InMinimumRequirementSet="true" /> <Language Code="lb" InMinimumRequirementSet="true" /> <Language Code="lb-lu" InMinimumRequirementSet="true" /> <Language Code="lo" InMinimumRequirementSet="true" /> <Language Code="lo-la" InMinimumRequirementSet="true" /> <Language Code="lt" InMinimumRequirementSet="true" /> <Language Code="lt-lt" InMinimumRequirementSet="true" /> <Language Code="lv" InMinimumRequirementSet="true" /> <Language Code="lv-lv" InMinimumRequirementSet="true" /> <Language Code="mi" InMinimumRequirementSet="true" /> <Language Code="mi-latn" InMinimumRequirementSet="true" /> <Language Code="mi-nz" InMinimumRequirementSet="true" /> <Language Code="mk" InMinimumRequirementSet="true" /> <Language Code="mk-mk" InMinimumRequirementSet="true" /> <Language Code="ml" InMinimumRequirementSet="true" /> <Language Code="ml-in" InMinimumRequirementSet="true" /> <Language Code="mn-cyrl" InMinimumRequirementSet="true" /> <Language Code="mn-mn" InMinimumRequirementSet="true" /> <Language Code="mn-mong" InMinimumRequirementSet="true" /> <Language Code="mn-phag" InMinimumRequirementSet="true" /> <Language Code="mr" InMinimumRequirementSet="true" /> <Language Code="mr-in" InMinimumRequirementSet="true" /> <Language Code="ms" InMinimumRequirementSet="true" /> <Language Code="ms-bn" InMinimumRequirementSet="true" /> <Language Code="ms-my" InMinimumRequirementSet="true" /> <Language Code="mt" InMinimumRequirementSet="true" /> <Language Code="mt-mt" InMinimumRequirementSet="true" /> <Language Code="nb" InMinimumRequirementSet="true" /> <Language Code="nb-no" InMinimumRequirementSet="true" /> <Language Code="ne" InMinimumRequirementSet="true" /> <Language Code="ne-np" InMinimumRequirementSet="true" /> <Language Code="nl" InMinimumRequirementSet="true" /> <Language Code="nl-be" InMinimumRequirementSet="true" /> <Language Code="nl-nl" InMinimumRequirementSet="true" /> <Language Code="nn" InMinimumRequirementSet="true" /> <Language Code="nn-no" InMinimumRequirementSet="true" /> <Language Code="no" InMinimumRequirementSet="true" /> <Language Code="no-no" InMinimumRequirementSet="true" /> <Language Code="nso" InMinimumRequirementSet="true" /> <Language Code="nso-za" InMinimumRequirementSet="true" /> <Language Code="om" InMinimumRequirementSet="false" /> <Language Code="om-et" InMinimumRequirementSet="false" /> <Language Code="or" InMinimumRequirementSet="true" /> <Language Code="or-in" InMinimumRequirementSet="true" /> <Language Code="pa" InMinimumRequirementSet="true" /> <Language Code="pa-arab" InMinimumRequirementSet="true" /> <Language Code="pa-arab-pk" InMinimumRequirementSet="true" /> <Language Code="pa-deva" InMinimumRequirementSet="true" /> <Language Code="pa-in" InMinimumRequirementSet="true" /> <Language Code="pl" InMinimumRequirementSet="true" /> <Language Code="pl-pl" InMinimumRequirementSet="true" /> <Language Code="prs" InMinimumRequirementSet="true" /> <Language Code="prs-af" InMinimumRequirementSet="true" /> <Language Code="prs-arab" InMinimumRequirementSet="true" /> <Language Code="pt" InMinimumRequirementSet="true" /> <Language Code="pt-br" InMinimumRequirementSet="true" /> <Language Code="pt-pt" InMinimumRequirementSet="true" /> <Language Code="quc-latn" InMinimumRequirementSet="true" /> <Language Code="qut-gt" InMinimumRequirementSet="true" /> <Language Code="qut-latn" InMinimumRequirementSet="true" /> <Language Code="quz" InMinimumRequirementSet="true" /> <Language Code="quz-bo" InMinimumRequirementSet="true" /> <Language Code="quz-ec" InMinimumRequirementSet="true" /> <Language Code="quz-pe" InMinimumRequirementSet="true" /> <Language Code="ro" InMinimumRequirementSet="true" /> <Language Code="ro-ro" InMinimumRequirementSet="true" /> <Language Code="ru" InMinimumRequirementSet="true" /> <Language Code="ru-ru" InMinimumRequirementSet="true" /> <Language Code="rw" InMinimumRequirementSet="true" /> <Language Code="rw-rw" InMinimumRequirementSet="true" /> <Language Code="sd-arab" InMinimumRequirementSet="true" /> <Language Code="sd-arab-pk" InMinimumRequirementSet="true" /> <Language Code="sd-deva" InMinimumRequirementSet="true" /> <Language Code="si" InMinimumRequirementSet="true" /> <Language Code="si-lk" InMinimumRequirementSet="true" /> <Language Code="sk" InMinimumRequirementSet="true" /> <Language Code="sk-sk" InMinimumRequirementSet="true" /> <Language Code="sl" InMinimumRequirementSet="true" /> <Language Code="sl-si" InMinimumRequirementSet="true" /> <Language Code="sq" InMinimumRequirementSet="true" /> <Language Code="sq-al" InMinimumRequirementSet="true" /> <Language Code="sr" InMinimumRequirementSet="true" /> <Language Code="sr-cyrl" InMinimumRequirementSet="true" /> <Language Code="sr-cyrl-ba" InMinimumRequirementSet="true" /> <Language Code="sr-cyrl-cs" InMinimumRequirementSet="true" /> <Language Code="sr-cyrl-me" InMinimumRequirementSet="true" /> <Language Code="sr-cyrl-rs" InMinimumRequirementSet="true" /> <Language Code="sr-latn" InMinimumRequirementSet="true" /> <Language Code="sr-latn-ba" InMinimumRequirementSet="true" /> <Language Code="sr-latn-cs" InMinimumRequirementSet="true" /> <Language Code="sr-latn-me" InMinimumRequirementSet="true" /> <Language Code="sr-latn-rs" InMinimumRequirementSet="true" /> <Language Code="sv" InMinimumRequirementSet="true" /> <Language Code="sv-fi" InMinimumRequirementSet="true" /> <Language Code="sv-se" InMinimumRequirementSet="true" /> <Language Code="sw" InMinimumRequirementSet="true" /> <Language Code="sw-ke" InMinimumRequirementSet="true" /> <Language Code="ta" InMinimumRequirementSet="true" /> <Language Code="ta-in" InMinimumRequirementSet="true" /> <Language Code="te" InMinimumRequirementSet="true" /> <Language Code="te-in" InMinimumRequirementSet="true" /> <Language Code="tg-arab" InMinimumRequirementSet="true" /> <Language Code="tg-cyrl" InMinimumRequirementSet="true" /> <Language Code="tg-cyrl-tj" InMinimumRequirementSet="true" /> <Language Code="tg-latn" InMinimumRequirementSet="true" /> <Language Code="th" InMinimumRequirementSet="true" /> <Language Code="th-th" InMinimumRequirementSet="true" /> <Language Code="ti" InMinimumRequirementSet="true" /> <Language Code="ti-et" InMinimumRequirementSet="true" /> <Language Code="tk-cyrl" InMinimumRequirementSet="true" /> <Language Code="tk-cyrl-tr" InMinimumRequirementSet="true" /> <Language Code="tk-latn" InMinimumRequirementSet="true" /> <Language Code="tk-latn-tr" InMinimumRequirementSet="true" /> <Language Code="tk-tm" InMinimumRequirementSet="true" /> <Language Code="tn" InMinimumRequirementSet="true" /> <Language Code="tn-bw" InMinimumRequirementSet="true" /> <Language Code="tn-za" InMinimumRequirementSet="true" /> <Language Code="tr" InMinimumRequirementSet="true" /> <Language Code="tr-tr" InMinimumRequirementSet="true" /> <Language Code="tt-arab" InMinimumRequirementSet="true" /> <Language Code="tt-cyrl" InMinimumRequirementSet="true" /> <Language Code="tt-latn" InMinimumRequirementSet="true" /> <Language Code="tt-ru" InMinimumRequirementSet="true" /> <Language Code="ug-arab" InMinimumRequirementSet="true" /> <Language Code="ug-cn" InMinimumRequirementSet="true" /> <Language Code="ug-cyrl" InMinimumRequirementSet="true" /> <Language Code="ug-latn" InMinimumRequirementSet="true" /> <Language Code="uk" InMinimumRequirementSet="true" /> <Language Code="uk-ua" InMinimumRequirementSet="true" /> <Language Code="ur" InMinimumRequirementSet="true" /> <Language Code="ur-pk" InMinimumRequirementSet="true" /> <Language Code="uz" InMinimumRequirementSet="true" /> <Language Code="uz-cyrl" InMinimumRequirementSet="true" /> <Language Code="uz-latn" InMinimumRequirementSet="true" /> <Language Code="uz-latn-uz" InMinimumRequirementSet="true" /> <Language Code="vi" InMinimumRequirementSet="true" /> <Language Code="vi-vn" InMinimumRequirementSet="true" /> <Language Code="wo" InMinimumRequirementSet="true" /> <Language Code="wo-sn" InMinimumRequirementSet="true" /> <Language Code="xh" InMinimumRequirementSet="true" /> <Language Code="xh-za" InMinimumRequirementSet="true" /> <Language Code="yo-latn" InMinimumRequirementSet="true" /> <Language Code="yo-ng" InMinimumRequirementSet="true" /> <Language Code="zh" InMinimumRequirementSet="true" /> <Language Code="zh-cn" InMinimumRequirementSet="true" /> <Language Code="zh-hans" InMinimumRequirementSet="true" /> <Language Code="zh-hans-cn" InMinimumRequirementSet="true" /> <Language Code="zh-hans-sg" InMinimumRequirementSet="true" /> <Language Code="zh-hant" InMinimumRequirementSet="true" /> <Language Code="zh-hant-hk" InMinimumRequirementSet="true" /> <Language Code="zh-hant-mo" InMinimumRequirementSet="true" /> <Language Code="zh-hant-tw" InMinimumRequirementSet="true" /> <Language Code="zh-hk" InMinimumRequirementSet="true" /> <Language Code="zh-mo" InMinimumRequirementSet="true" /> <Language Code="zh-sg" InMinimumRequirementSet="true" /> <Language Code="zh-tw" InMinimumRequirementSet="true" /> <Language Code="zu" InMinimumRequirementSet="true" /> <Language Code="zu-za" InMinimumRequirementSet="true" /> </SupportedLocales> <ProductReservedInfo> <MainPackageIdentityName>StudioKyome.RunCat</MainPackageIdentityName> <ReservedNames> <ReservedName>RunCat 365</ReservedName> </ReservedNames> </ProductReservedInfo> <AccountPackageIdentityNames /> <PackageInfoList LandingUrl="https://devcenterapi.dce.mp.microsoft.com/dashboard/Application?appId=9NW5LPNVWFWJ" /> </StoreAssociation> ================================================ FILE: WapForStore/Package.appxmanifest ================================================ <?xml version="1.0" encoding="utf-8"?> <Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap uap5 desktop rescap"> <Identity Name="StudioKyome.RunCat" Publisher="CN=B2C5F2BD-A1AB-42BE-A228-02E6F800BE2A" Version="3.4.0.0" /> <Properties> <DisplayName>RunCat 365</DisplayName> <PublisherDisplayName>Studio Kyome</PublisherDisplayName> <Logo>Images\StoreLogo.png</Logo> </Properties> <Dependencies> <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" /> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" /> </Dependencies> <Resources> <Resource Language="x-generate"/> </Resources> <Applications> <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$"> <uap:VisualElements DisplayName="RunCat 365" Description="A cute running cat animation on your taskbar. The cat tells you the CPU usage by running speed." BackgroundColor="transparent" Square150x150Logo="Images\Square150x150Logo.png" Square44x44Logo="Images\Square44x44Logo.png"> <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/> <uap:SplashScreen Image="Images\SplashScreen.png" /> </uap:VisualElements> <Extensions> <uap5:Extension Category="windows.startupTask"> <uap5:StartupTask TaskId="RunCatStartup" DisplayName="RunCat 365"/> </uap5:Extension> <desktop:Extension Category="windows.fullTrustProcess" /> </Extensions> </Application> </Applications> <Capabilities> <rescap:Capability Name="runFullTrust" /> <Capability Name="internetClient"/> </Capabilities> </Package> ================================================ FILE: WapForStore/WapForStore.wapproj ================================================ <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '15.0'"> <VisualStudioVersion>15.0</VisualStudioVersion> </PropertyGroup> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|x86"> <Configuration>Debug</Configuration> <Platform>x86</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|x86"> <Configuration>Release</Configuration> <Platform>x86</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Debug|x64"> <Configuration>Debug</Configuration> <Platform>x64</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|x64"> <Configuration>Release</Configuration> <Platform>x64</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Debug|ARM64"> <Configuration>Debug</Configuration> <Platform>ARM64</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|ARM64"> <Configuration>Release</Configuration> <Platform>ARM64</Platform> </ProjectConfiguration> </ItemGroup> <PropertyGroup> <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath> </PropertyGroup> <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" /> <PropertyGroup> <ProjectGuid>5b865d12-1a70-4311-8eba-010e117fe616</ProjectGuid> <TargetPlatformVersion>10.0.26100.0</TargetPlatformVersion> <TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion> <DefaultLanguage>ja-JP</DefaultLanguage> <AppxPackageSigningEnabled>false</AppxPackageSigningEnabled> <NoWarn>$(NoWarn);NU1702</NoWarn> <EntryPointProjectUniqueName>..\RunCat365\RunCat365.csproj</EntryPointProjectUniqueName> <GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate> <GenerateAppInstallerFile>False</GenerateAppInstallerFile> <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm> <AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision> <GenerateTestArtifacts>True</GenerateTestArtifacts> <AppxBundlePlatforms>x86|x64|arm64</AppxBundlePlatforms> <HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <DefaultLanguage>en-US</DefaultLanguage> <AppxBundle>Always</AppxBundle> </PropertyGroup> <ItemGroup> <AppxManifest Include="Package.appxmanifest"> <SubType>Designer</SubType> </AppxManifest> </ItemGroup> <ItemGroup> <Content Include="Images\LargeTile.scale-100.png" /> <Content Include="Images\LargeTile.scale-125.png" /> <Content Include="Images\LargeTile.scale-150.png" /> <Content Include="Images\LargeTile.scale-200.png" /> <Content Include="Images\LargeTile.scale-400.png" /> <Content Include="Images\SmallTile.scale-100.png" /> <Content Include="Images\SmallTile.scale-125.png" /> <Content Include="Images\SmallTile.scale-150.png" /> <Content Include="Images\SmallTile.scale-200.png" /> <Content Include="Images\SmallTile.scale-400.png" /> <Content Include="Images\SplashScreen.scale-100.png" /> <Content Include="Images\SplashScreen.scale-125.png" /> <Content Include="Images\SplashScreen.scale-150.png" /> <Content Include="Images\SplashScreen.scale-200.png" /> <Content Include="Images\LockScreenLogo.scale-200.png" /> <Content Include="Images\SplashScreen.scale-400.png" /> <Content Include="Images\Square150x150Logo.scale-100.png" /> <Content Include="Images\Square150x150Logo.scale-125.png" /> <Content Include="Images\Square150x150Logo.scale-150.png" /> <Content Include="Images\Square150x150Logo.scale-200.png" /> <Content Include="Images\Square150x150Logo.scale-400.png" /> <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-16.png" /> <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-24.png" /> <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-256.png" /> <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-32.png" /> <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-48.png" /> <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" /> <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" /> <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" /> <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" /> <Content Include="Images\Square44x44Logo.scale-100.png" /> <Content Include="Images\Square44x44Logo.scale-125.png" /> <Content Include="Images\Square44x44Logo.scale-150.png" /> <Content Include="Images\Square44x44Logo.scale-200.png" /> <Content Include="Images\Square44x44Logo.scale-400.png" /> <Content Include="Images\Square44x44Logo.targetsize-16.png" /> <Content Include="Images\Square44x44Logo.targetsize-24.png" /> <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" /> <Content Include="Images\Square44x44Logo.targetsize-256.png" /> <Content Include="Images\Square44x44Logo.targetsize-32.png" /> <Content Include="Images\Square44x44Logo.targetsize-48.png" /> <Content Include="Images\StoreLogo.scale-100.png" /> <Content Include="Images\StoreLogo.scale-125.png" /> <Content Include="Images\StoreLogo.scale-150.png" /> <Content Include="Images\StoreLogo.scale-200.png" /> <Content Include="Images\StoreLogo.scale-400.png" /> <Content Include="Images\Wide310x150Logo.scale-100.png" /> <Content Include="Images\Wide310x150Logo.scale-125.png" /> <Content Include="Images\Wide310x150Logo.scale-150.png" /> <Content Include="Images\Wide310x150Logo.scale-200.png" /> <Content Include="Images\Wide310x150Logo.scale-400.png" /> <None Include="Package.StoreAssociation.xml" /> </ItemGroup> <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" /> <ItemGroup> <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" PrivateAssets="all" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\RunCat365\RunCat365.csproj" /> </ItemGroup> </Project> ================================================ FILE: docs/index.html ================================================ <!DOCTYPE html> <html lang="en"> <head> <title>RunCat 365

RunCat 365

Cat living in the taskbar.

The cat tells you the CPU usage of the device by running speed.

demo

Go to Microsoft Store

You can check information on CPU usage,
memory performance, and storage capacity.

overview

In addition, you can play a simple game
that can be played using only the space bar.

endless game

================================================ FILE: docs/privacy_policy.html ================================================ RunCat 365

RunCat 365 Privacy Policy

Takuto Nakamura (hereinafter referred to as the developer) takes the privacy of his customers and users seriously. The developer recognizes that privacy is an important issue, so he designs and operates my services with the protection of your privacy in mind. This privacy policy explains what kind of information the developer collects, uses, and the security of your information in RunCat 365. By using RunCat 365, you consent to this privacy policy.

1. General rules


1.1. Scope of this privacy policy


This privacy policy applies to all services provided in all versions of RunCat 365. The developer may separately set a privacy policy or terms of use (individual contracts) for each service, and in the case of specifying the handling of information separately in the individual contracts, the provision of the individual contracts will prevail.

Please note that this privacy policy does not apply to the handling of information at the link destination when moving from a link displayed on RunCat to an external website or the like.

1.2. Personal information


Personal information includes your name, physical address, social numbers, email address and geographic location information.

2. How the developer deal with the user's information


2.1. Information necessary for settlement


Some purchase services, such as the purchase of additional functions may use credit card information of the user for settlement. This settlement information is stored on the side of the settlement platform managed by a third party, and the developer will not acquire payment information.

2.2. Other information


The developer does not collect and use any other personal information through RunCat 365. Please use RunCat 365 with confidence.

3. Changes to this privacy policy


This privacy policy may change from time to time. If the developer decides to change this privacy policy, he will provide you additional forms of notice of modifications or updates as appropriate under the circumstances. Your continued use of RunCat 365 following the posting of changes will mean you accept those changes.

4. How to contact the developer


If you have any questions, comments, or other inquiries regarding this Privacy Policy or RunCat 365, please submit them to the developer via GitHub Issues.

================================================ FILE: docs/style.css ================================================ body { margin: 0 auto; font-family: "Exo 2", sans-serif; background-color: #f5f5f5; text-align: center; min-height: 100vh; min-width: 640px; display: flex; flex-direction: column; } header div { display: flex; background-color: #606060; padding: 8px 16px; color: #f5f5f5; } header a.title { margin-right: auto; text-decoration: none; font-style: italic; font-size: 24px; line-height: 24px; color: #f5f5f5; } header a.title:hover { color: cadetblue; } header svg.github-icon { width: 24px; height: 24px; } header svg.github-icon path { fill: #f5f5f5; } header svg.github-icon:hover path { fill: cadetblue; } div.main { flex: 1; } div.summary { margin: 40px auto; } div.detail { margin: 40px auto; max-width: 600px; } p.title { font-style: italic; font-size: 80px; line-height: 80px; margin: 20px auto; } p.catchcopy { font-weight: bold; } p.feature { font-size: 1em; } img.demo { width: 600px; height: 200px; } p.microsoft-store-banner img { height: 78px; } p.microsoft-store-banner img:active { opacity: 0.7; transform: translateY(2px); } img.screenshot { width: 600px; height: 343px; } footer { padding-top: 1em; color: #606060; } nav a { text-decoration: none; color: #404040; } nav a:hover { color: darkcyan; } div.privacy-policy { flex: 1; font-family: sans-serif; } div.privacy-policy div.block { margin: 0 auto; padding: 5px 20px; max-width: 800px; text-align: left; } div.privacy-policy h1 { text-align: center; } div.privacy-policy p.explain { text-indent: 1em; text-align: justify; hyphens: auto; }