Showing preview only (304K chars total). Download the full file or copy to clipboard to get everything.
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: <language name or BCP 47 code>
---
# 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 `<resheader>` blocks verbatim from `Strings.es.resx`
- Include every key from `Strings.resx` — no more, no less — with each `<value>` translated
- Keep all attribute names, XML structure, and `<comment>` content in English; translate only `<value>` 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
<concise summary of what this PR proposes — 1–3 sentences>
## Reason for the new feature
<If Bug Fix / Refactoring / Others: write "N/A">
<If New Feature: explain why the feature is necessary, how many users it benefits,
and why benefits outweigh maintenance cost>
## 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 "<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.
[](https://github.com/Kyome22/RunCat365/issues)
[](https://github.com/Kyome22/RunCat365/network/members)
[](https://github.com/Kyome22/RunCat365/stargazers)
[](https://github.com/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>テー
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
SYMBOL INDEX (193 symbols across 26 files)
FILE: RunCat365/BalloonTipType.cs
type BalloonTipInfo (line 19) | internal readonly struct BalloonTipInfo(string title, string text, ToolT...
type BalloonTipType (line 26) | internal enum BalloonTipType
class BalloonTipTypeExtension (line 32) | internal static class BalloonTipTypeExtension
method GetInfo (line 34) | internal static BalloonTipInfo GetInfo(this BalloonTipType balloonTipT...
FILE: RunCat365/BitmapExtension.cs
type BitmapLock (line 19) | internal readonly ref struct BitmapLock
method BitmapLock (line 24) | internal BitmapLock(Bitmap bitmap, ImageLockMode mode)
method Dispose (line 34) | internal void Dispose()
class BitmapExtension (line 40) | internal static class BitmapExtension
method Recolor (line 42) | internal static Bitmap Recolor(this Bitmap bitmap, Color color)
method ToIcon (line 75) | internal static Icon ToIcon(this Bitmap bitmap)
FILE: RunCat365/ByteFormatter.cs
class ByteFormatter (line 17) | internal static class ByteFormatter
method ToByteFormatted (line 19) | internal static string ToByteFormatted(this long bytes)
FILE: RunCat365/CPURepository.cs
type CPUInfo (line 20) | struct CPUInfo
class CPUInfoExtension (line 28) | internal static class CPUInfoExtension
method GetDescription (line 30) | internal static string GetDescription(this CPUInfo cpuInfo)
method GenerateIndicator (line 35) | internal static List<string> GenerateIndicator(this CPUInfo cpuInfo)
class CPUPerformanceCounters (line 48) | internal class CPUPerformanceCounters
method CPUPerformanceCounters (line 55) | private CPUPerformanceCounters()
method TryCreate (line 69) | internal static CPUPerformanceCounters? TryCreate()
method Close (line 81) | internal void Close()
class CPURepository (line 90) | internal class CPURepository
method CPURepository (line 98) | internal CPURepository()
method Update (line 103) | internal void Update()
method Get (line 122) | internal CPUInfo Get()
method Close (line 135) | internal void Close()
FILE: RunCat365/Cat.cs
class Cat (line 17) | internal abstract class Cat
method ViolationIndices (line 19) | internal abstract List<int> ViolationIndices();
method Next (line 20) | internal abstract Cat Next();
method GetString (line 21) | internal abstract string GetString();
class Running (line 23) | internal class Running : Cat
method Running (line 27) | internal Running(Frame frame)
method ViolationIndices (line 32) | internal override List<int> ViolationIndices()
method Next (line 45) | internal override Cat Next()
method GetString (line 51) | internal override string GetString()
type Frame (line 56) | internal enum Frame
class Jumping (line 66) | internal class Jumping : Cat
method Jumping (line 70) | internal Jumping(Frame frame)
method ViolationIndices (line 75) | internal override List<int> ViolationIndices()
method Next (line 93) | internal override Cat Next()
method GetString (line 99) | internal override string GetString()
type Frame (line 104) | internal enum Frame
FILE: RunCat365/ContextMenuManager.cs
class ContextMenuManager (line 20) | internal class ContextMenuManager : IDisposable
method ContextMenuManager (line 29) | internal ContextMenuManager(
method HandleMenuItemSelection (line 172) | private static void HandleMenuItemSelection<T>(
method GetRunnerThumbnailBitmap (line 197) | private static Bitmap? GetRunnerThumbnailBitmap(Theme systemTheme, Run...
method SetIcons (line 206) | internal void SetIcons(Theme systemTheme, Theme manualTheme, Runner ru...
method HandleStartupMenuClick (line 237) | private static void HandleStartupMenuClick(object? sender, Func<bool, ...
method ShowOrActivateGameWindow (line 255) | private void ShowOrActivateGameWindow(Func<Theme> getSystemTheme)
method ShowBalloonTip (line 272) | internal void ShowBalloonTip(BalloonTipType balloonTipType)
method AdvanceFrame (line 278) | internal void AdvanceFrame()
method SetSystemInfoMenuText (line 289) | internal void SetSystemInfoMenuText(string text)
method SetNotifyIconText (line 294) | internal void SetNotifyIconText(string text)
method HideNotifyIcon (line 299) | internal void HideNotifyIcon()
method Dispose (line 304) | public void Dispose()
method Dispose (line 310) | protected virtual void Dispose(bool disposing)
FILE: RunCat365/ContextMenuRenderer.cs
class ContextMenuRenderer (line 17) | internal class ContextMenuRenderer : ToolStripProfessionalRenderer
method OnRenderItemText (line 19) | protected override void OnRenderItemText(ToolStripItemTextRenderEventA...
FILE: RunCat365/CustomToolStripMenuItem.cs
class CustomToolStripMenuItem (line 17) | internal class CustomToolStripMenuItem : ToolStripMenuItem
method CustomToolStripMenuItem (line 25) | internal CustomToolStripMenuItem() : base()
method CustomToolStripMenuItem (line 30) | internal CustomToolStripMenuItem(string? text) : base(text)
method CustomToolStripMenuItem (line 35) | private CustomToolStripMenuItem(string? text, Image? image, object? ta...
method GetPreferredSize (line 53) | public override Size GetPreferredSize(Size constrainingSize)
method IsSingleLine (line 73) | internal bool IsSingleLine()
method Flags (line 78) | internal TextFormatFlags Flags()
method SetupSubMenusFromEnum (line 83) | internal void SetupSubMenusFromEnum<T>(
FILE: RunCat365/EndlessGameForm.cs
class EndlessGameForm (line 23) | internal class EndlessGameForm : Form
method EndlessGameForm (line 40) | internal EndlessGameForm(Theme systemTheme)
method OnFormClosing (line 96) | protected override void OnFormClosing(FormClosingEventArgs e)
method Initialize (line 108) | private void Initialize()
method Judge (line 120) | private bool Judge()
method UpdateRoads (line 138) | private void UpdateRoads()
method UpdateCat (line 173) | private void UpdateCat()
method AutoJump (line 204) | private void AutoJump()
method GameTick (line 212) | private void GameTick(object? sender, EventArgs e)
method HandleKeyDown (line 223) | private void HandleKeyDown(object? sender, KeyEventArgs e)
method RenderScene (line 243) | private void RenderScene(object? sender, PaintEventArgs e)
method SaveRecord (line 304) | private void SaveRecord(int score)
class ListExtension (line 311) | internal static class ListExtension
method HasCommonElements (line 313) | internal static bool HasCommonElements(this List<int> list1, List<int>...
FILE: RunCat365/FPSMaxLimit.cs
type FPSMaxLimit (line 19) | enum FPSMaxLimit
class FPSMaxLimitExtension (line 27) | internal static class FPSMaxLimitExtension
method GetString (line 29) | internal static string GetString(this FPSMaxLimit fpsMaxLimit)
method GetRate (line 41) | internal static float GetRate(this FPSMaxLimit fPSMaxLimit)
method TryParse (line 53) | internal static bool TryParse([NotNullWhen(true)] string? value, out F...
FILE: RunCat365/GPURepository.cs
type GPUInfo (line 20) | struct GPUInfo
class GPUInfoExtension (line 26) | internal static class GPUInfoExtension
method GetDescription (line 28) | internal static string GetDescription(this GPUInfo gpuInfo)
method GenerateIndicator (line 33) | internal static List<string> GenerateIndicator(this GPUInfo gpuInfo)
class GPURepository (line 45) | internal class GPURepository
method GPURepository (line 53) | internal GPURepository()
method Update (line 82) | internal void Update()
method Get (line 109) | internal GPUInfo? Get()
method Close (line 120) | internal void Close()
FILE: RunCat365/GameStatus.cs
type GameStatus (line 17) | internal enum GameStatus
FILE: RunCat365/LaunchAtStartupManager.cs
type ILaunchAtStartupManager (line 20) | internal interface ILaunchAtStartupManager
method GetEnabled (line 22) | bool GetEnabled();
method SetEnabled (line 23) | bool SetEnabled(bool enabled);
class PackagedLaunchAtStartupManager (line 26) | internal sealed class PackagedLaunchAtStartupManager : ILaunchAtStartupM...
method GetEnabled (line 30) | public bool GetEnabled()
method SetEnabled (line 38) | public bool SetEnabled(bool enabled)
class UnpackagedLaunchAtStartupManager (line 73) | internal sealed class UnpackagedLaunchAtStartupManager : ILaunchAtStartu...
method GetEnabled (line 75) | public bool GetEnabled()
method SetEnabled (line 85) | public bool SetEnabled(bool enabled)
class LaunchAtStartupManager (line 109) | internal class LaunchAtStartupManager
method LaunchAtStartupManager (line 113) | public LaunchAtStartupManager()
method GetStartup (line 120) | public bool GetStartup() => _launchAtStartupManager.GetEnabled();
method SetStartup (line 122) | public bool SetStartup(bool enabled) => _launchAtStartupManager.SetEna...
method IsRunningAsPackaged (line 124) | private static bool IsRunningAsPackaged()
FILE: RunCat365/MemoryRepository.cs
type MemoryInfo (line 20) | struct MemoryInfo
class MemoryInfoExtension (line 28) | internal static class MemoryInfoExtension
method GetDescription (line 30) | internal static string GetDescription(this MemoryInfo memoryInfo)
method GenerateIndicator (line 35) | internal static List<string> GenerateIndicator(this MemoryInfo memoryI...
class MemoryRepository (line 48) | internal partial class MemoryRepository
method MemoryRepository (line 52) | internal MemoryRepository()
method Update (line 57) | internal void Update()
method Get (line 71) | internal MemoryInfo Get()
type MemoryStatusEx (line 77) | [StructLayout(LayoutKind.Sequential)]
method GlobalMemoryStatusEx (line 91) | [LibraryImport("kernel32.dll", SetLastError = true)]
FILE: RunCat365/NetworkRepository.cs
type NetworkInfo (line 20) | struct NetworkInfo
class NetworkInfoExtension (line 26) | internal static class NetworkInfoExtension
method GenerateIndicator (line 28) | internal static List<string> GenerateIndicator(this NetworkInfo networ...
method FormatSpeed (line 37) | private static string FormatSpeed(float speedBytes)
class NetworkRepository (line 43) | internal class NetworkRepository
method NetworkRepository (line 51) | internal NetworkRepository()
method GetActiveNetworkInterface (line 61) | private static NetworkInterface? GetActiveNetworkInterface()
method IsValidNetworkInterface (line 67) | private static bool IsValidNetworkInterface(NetworkInterface networkIn...
method Update (line 82) | internal void Update()
method Get (line 97) | internal NetworkInfo Get()
FILE: RunCat365/Program.cs
class Program (line 23) | internal static class Program
method Main (line 25) | [STAThread]
class RunCat365ApplicationContext (line 53) | internal class RunCat365ApplicationContext : ApplicationContext
method RunCat365ApplicationContext (line 73) | public RunCat365ApplicationContext()
method GetSystemTheme (line 126) | private static Theme GetSystemTheme()
method IsSpeedSourceAvailable (line 136) | private bool IsSpeedSourceAvailable(SpeedSource speedSource)
method ResolveSpeedSource (line 147) | private void ResolveSpeedSource()
method ShowBalloonTipIfNeeded (line 155) | private void ShowBalloonTipIfNeeded()
method UserPreferenceChanged (line 169) | private void UserPreferenceChanged(object sender, UserPreferenceChange...
method OpenRepository (line 178) | private static void OpenRepository()
method ChangeRunner (line 194) | private void ChangeRunner(Runner r)
method ChangeManualTheme (line 201) | private void ChangeManualTheme(Theme t)
method ChangeSpeedSource (line 208) | private void ChangeSpeedSource(SpeedSource s)
method ChangeFPSMaxLimit (line 215) | private void ChangeFPSMaxLimit(FPSMaxLimit f)
method AnimationTick (line 222) | private void AnimationTick(object? sender, EventArgs e)
method GetInfoDescription (line 227) | private string GetInfoDescription(CPUInfo cpuInfo, GPUInfo? gpuInfo, M...
method CalculateInterval (line 238) | private int CalculateInterval(CPUInfo cpuInfo, GPUInfo? gpuInfo, Memor...
method FetchSystemInfo (line 251) | private int FetchSystemInfo()
method FetchTick (line 275) | private void FetchTick(object? state, EventArgs e)
method Dispose (line 288) | protected override void Dispose(bool disposing)
FILE: RunCat365/Properties/Resources.Designer.cs
class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: RunCat365/Properties/Strings.Designer.cs
class Strings (line 18) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Strings (line 27) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: RunCat365/Properties/UserSettings.Designer.cs
class UserSettings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
FILE: RunCat365/Road.cs
type Road (line 17) | internal enum Road
class RoadExtension (line 25) | internal static class RoadExtension
method GetString (line 27) | internal static string GetString(this Road road)
FILE: RunCat365/Runner.cs
type Runner (line 19) | enum Runner
class RunnerExtension (line 26) | internal static class RunnerExtension
method GetString (line 28) | internal static string GetString(this Runner runner)
method GetLocalizedString (line 39) | internal static string GetLocalizedString(this Runner runner)
method GetFrameNumber (line 50) | internal static int GetFrameNumber(this Runner runner)
FILE: RunCat365/SpeedSource.cs
type SpeedSource (line 20) | enum SpeedSource
class SpeedSourceExtension (line 27) | internal static class SpeedSourceExtension
method GetLocalizedString (line 29) | internal static string GetLocalizedString(this SpeedSource speedSource)
method TryParse (line 40) | internal static bool TryParse([NotNullWhen(true)] string? value, out S...
FILE: RunCat365/StorageRepository.cs
type Drive (line 19) | enum Drive
class DriveExtension (line 25) | internal static class DriveExtension
method GetString (line 27) | internal static string GetString(this Drive drive)
method GetLocalizedString (line 37) | internal static string GetLocalizedString(this Drive drive)
method CreateFromString (line 47) | internal static Drive? CreateFromString(string? value)
type StorageInfo (line 58) | struct StorageInfo
class StorageInfoExtension (line 66) | internal static class StorageInfoExtension
method GenerateIndicator (line 68) | internal static List<string> GenerateIndicator(this List<StorageInfo> ...
class StorageRepository (line 91) | internal class StorageRepository
method StorageRepository (line 95) | internal StorageRepository() { }
method Update (line 97) | internal void Update()
method Get (line 124) | internal List<StorageInfo> Get()
FILE: RunCat365/SupportedLanguage.cs
type SupportedLanguage (line 19) | enum SupportedLanguage
class SupportedLanguageExtension (line 30) | internal static class SupportedLanguageExtension
method DetectChineseVariant (line 32) | private static SupportedLanguage DetectChineseVariant(CultureInfo cult...
method GetCurrentLanguage (line 39) | internal static SupportedLanguage GetCurrentLanguage()
method GetDefaultCultureInfo (line 53) | internal static CultureInfo GetDefaultCultureInfo(this SupportedLangua...
method GetFontName (line 67) | internal static string GetFontName(this SupportedLanguage language)
method IsFullWidth (line 81) | internal static bool IsFullWidth(this SupportedLanguage language)
FILE: RunCat365/Theme.cs
type Theme (line 19) | enum Theme
class ThemeExtension (line 26) | internal static class ThemeExtension
method GetString (line 28) | internal static string GetString(this Theme theme)
method GetLocalizedString (line 39) | internal static string GetLocalizedString(this Theme theme)
method GetContrastColor (line 50) | internal static Color GetContrastColor(this Theme theme)
FILE: RunCat365/TreeFormatter.cs
class TreeFormatter (line 17) | internal static class TreeFormatter
method CreateRoot (line 26) | internal static string CreateRoot(string content)
method CreateNode (line 31) | internal static string CreateNode(string content, bool isLast)
method CreateNestedNode (line 37) | internal static string CreateNestedNode(string content, bool parentIsL...
Condensed preview — 58 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (311K chars).
[
{
"path": ".claude/skills/add-localization/SKILL.md",
"chars": 3012,
"preview": "---\nname: add-localization\ndescription: Adds a new language locale to RunCat365. Use when adding a new language, transla"
},
{
"path": ".claude/skills/create-pr/SKILL.md",
"chars": 3735,
"preview": "---\nname: create-pr\ndescription: Creates a GitHub Pull Request for RunCat365 following the project's PR template. Use th"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1457,
"preview": "name: Bug Report\ndescription: File a bug report.\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n - type: markdown\n attribute"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1183,
"preview": "name: Feature Request\ndescription: File a feature request.\ntitle: \"[Idea]: \"\nlabels: [\"enhancement\"]\nbody:\n - type: mar"
},
{
"path": ".github/how_to_release.md",
"chars": 1408,
"preview": "# How to Release a New Version to Microsoft Store\n\nThis document is for code owners.\n\n## 1. Update Version Numbers\n\nVers"
},
{
"path": ".github/pull_request_template.md",
"chars": 884,
"preview": "## Context of Contribution\n\n<!-- Each pull request should fix only one issue or propose one feature. -->\n<!-- Do not mix"
},
{
"path": ".gitignore",
"chars": 266,
"preview": "# Visual Studio\n.vs/\nbin/\nobj/\n[Ll]og/\n[Ll]ogs/\n.DS_Store\nTestResults\n\n/WapForStore/AppPackages/**\n!/WapForStore/AppPack"
},
{
"path": "CLAUDE.md",
"chars": 3573,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CONTRIBUTING.md",
"chars": 5232,
"preview": "# Contributing to RunCat365\n\nThank you for your interest in contributing to **RunCat365** 🐈 \nRunCat365 is a Windows sys"
},
{
"path": "LICENSE",
"chars": 10173,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 2208,
"preview": "# RunCat 365\n\n**A cute running cat animation on your Windows Taskbar.**\n\n> [!CAUTION]\n>\n> - This project is for Windows,"
},
{
"path": "RunCat365/App.config",
"chars": 1388,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n <configSections>\n <sectionGroup name=\"userSettings\" "
},
{
"path": "RunCat365/App.manifest",
"chars": 1006,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n <ass"
},
{
"path": "RunCat365/BalloonTipType.cs",
"chars": 1575,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may"
},
{
"path": "RunCat365/BitmapExtension.cs",
"chars": 3340,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/ByteFormatter.cs",
"chars": 1127,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/CPURepository.cs",
"chars": 4448,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/Cat.cs",
"chars": 3478,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/ContextMenuManager.cs",
"chars": 11657,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/ContextMenuRenderer.cs",
"chars": 1403,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/CustomToolStripMenuItem.cs",
"chars": 3961,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/EndlessGameForm.cs",
"chars": 11032,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/EndlessGameForm.resx",
"chars": 5696,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "RunCat365/FPSMaxLimit.cs",
"chars": 2257,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/GPURepository.cs",
"chars": 4086,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may"
},
{
"path": "RunCat365/GameStatus.cs",
"chars": 737,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/LaunchAtStartupManager.cs",
"chars": 4878,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/MemoryRepository.cs",
"chars": 3393,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/NetworkRepository.cs",
"chars": 3828,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/Program.cs",
"chars": 11018,
"preview": "// Copyright 2020 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/Properties/Resources.Designer.cs",
"chars": 17638,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "RunCat365/Properties/Resources.resx",
"chars": 16053,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "RunCat365/Properties/Strings.Designer.cs",
"chars": 13400,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code wa"
},
{
"path": "RunCat365/Properties/Strings.de.resx",
"chars": 9587,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/Strings.es.resx",
"chars": 9517,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/Strings.fr.resx",
"chars": 9548,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/Strings.ja.resx",
"chars": 9200,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/Strings.resx",
"chars": 9410,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/Strings.zh-CN.resx",
"chars": 9368,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n <!-- \r\n Microsoft ResX Schema \r\n \r\n Version 2.0\r\n \r\n T"
},
{
"path": "RunCat365/Properties/Strings.zh-TW.resx",
"chars": 9130,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "RunCat365/Properties/UserSettings.Designer.cs",
"chars": 3620,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// This code w"
},
{
"path": "RunCat365/Properties/UserSettings.settings",
"chars": 1028,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\""
},
{
"path": "RunCat365/Road.cs",
"chars": 1110,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/RunCat365.csproj",
"chars": 2722,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <TargetFramework>net9.0-wi"
},
{
"path": "RunCat365/Runner.cs",
"chars": 1704,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/SpeedSource.cs",
"chars": 1867,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may"
},
{
"path": "RunCat365/StorageRepository.cs",
"chars": 4233,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/SupportedLanguage.cs",
"chars": 3524,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may"
},
{
"path": "RunCat365/Theme.cs",
"chars": 1683,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you ma"
},
{
"path": "RunCat365/TreeFormatter.cs",
"chars": 1702,
"preview": "// Copyright 2025 Takuto Nakamura\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may"
},
{
"path": "RunCat365.sln",
"chars": 3287,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.14.363"
},
{
"path": "WapForStore/AppPackages/rm-wap-for-store.sh",
"chars": 219,
"preview": "#!/usr/bin/env sh\n# Usage: ./rm-wap-for-store.sh x.y.z.w\n[ \"$#\" -eq 1 ] || { echo \"Usage: $0 x.y.z.w\" >&2; exit 2; }\nv=\""
},
{
"path": "WapForStore/Package.StoreAssociation.xml",
"chars": 22413,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<StoreAssociation xmlns=\"http://schemas.microsoft.com/appx/2010/storeassociation"
},
{
"path": "WapForStore/Package.appxmanifest",
"chars": 2248,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows"
},
{
"path": "WapForStore/WapForStore.wapproj",
"chars": 7454,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
},
{
"path": "docs/index.html",
"chars": 3095,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>RunCat 365</title>\n <meta http-equiv=\"Content-Type\" content=\"tex"
},
{
"path": "docs/privacy_policy.html",
"chars": 4653,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <title>RunCat 365</title>\n <link href=\"https://fonts.googleapis.com/css"
},
{
"path": "docs/style.css",
"chars": 1641,
"preview": "body {\n margin: 0 auto;\n font-family: \"Exo 2\", sans-serif;\n background-color: #f5f5f5;\n text-align: center;\n min-he"
}
]
About this extraction
This page contains the full source code of the Kyome22/RunCat365 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 58 files (287.6 KB), approximately 72.4k tokens, and a symbol index with 193 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.