Repository: Demonmasterlqx/MoonBit-Code-JAM-2024 Branch: main Commit: 8df47befa853 Files: 46 Total size: 233.5 KB Directory structure: gitextract_8j9h2k2k/ ├── .github/ │ └── workflows/ │ └── publish.yml ├── .gitignore ├── .nvmrc ├── README.md ├── dev/ │ └── data.json ├── package.json ├── src/ │ └── build.mts ├── teams/ │ ├── .gitkeep │ ├── CS赏金猎手/ │ │ ├── README.md │ │ ├── control │ │ ├── game.wasm │ │ └── title │ ├── MoonBit官方样例1/ │ │ └── game.wasm │ ├── MoonBit官方样例2/ │ │ ├── README.md │ │ ├── control │ │ ├── game.wasm │ │ └── title │ ├── MoonBit官方样例3/ │ │ ├── README.md │ │ ├── control │ │ ├── game.wasm │ │ └── title │ ├── 一个队伍/ │ │ ├── README.md │ │ └── game.wasm │ ├── 天地一!屋!大爱盟/ │ │ ├── README.md │ │ ├── control │ │ ├── game.html │ │ ├── game.wasm │ │ ├── src/ │ │ │ ├── antity/ │ │ │ │ ├── antity_memory.mbt │ │ │ │ ├── moon.pkg.json │ │ │ │ ├── struct.mbt │ │ │ │ └── struct_trait.mbt │ │ │ ├── bitset/ │ │ │ │ ├── bitset.mbt │ │ │ │ └── moon.pkg.json │ │ │ ├── interface/ │ │ │ │ ├── gaming.mbt │ │ │ │ ├── interface_control.mbt │ │ │ │ └── moon.pkg.json │ │ │ ├── moon.pkg.json │ │ │ ├── time_cnt/ │ │ │ │ ├── moon.pkg.json │ │ │ │ └── timer.mbt │ │ │ └── top.mbt │ │ └── title │ └── 极品杏鲍菇/ │ ├── README.md │ ├── control │ ├── game.wasm │ └── title └── vite.config.mjs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/publish.yml ================================================ # Simple workflow for deploying static content to GitHub Pages name: Deploy static content to Pages on: # Runs on pushes targeting the default branch push: branches: ['main'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: 'pages' cancel-in-progress: false jobs: # Single deploy job since we're just deploying deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Pages uses: actions/configure-pages@v5 - name: Setup Node uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - name: build pages run: | npm i npm run build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: 'dist' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 ================================================ FILE: .gitignore ================================================ /dist node_modules meta.json test.mts .DS_Store ================================================ FILE: .nvmrc ================================================ v22.1.0 ================================================ FILE: README.md ================================================ # 飞机大战 1.游戏玩法与实现:经典的飞机大战,你一看封面就知道这是啥,一进去就知道怎么玩。后端全部采用wasm4。 2.技术亮点:{ 在wasm4特殊的渲染机制下,使用单个优先队列实现多音效多线程的效果; 项目结构清晰,各部分机制实现明朗易读; 手动实现了 $bitset$ 以减少内存开销; } 3.玩法创意性:我们准备了从boss战到多人游戏的创意玩法,但暂未完全实现。 4.美观设计:从游戏图像到游戏音乐全部自主设计。 ================================================ FILE: dev/data.json ================================================ { "url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2", "id": 2076113813, "node_id": "PR_kwDOMpbPP857vvuV", "html_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024/pull/2", "diff_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024/pull/2.diff", "patch_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024/pull/2.patch", "issue_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/2", "number": 2, "state": "closed", "locked": false, "title": "Test", "user": { "login": "bzy-debug", "id": 71200607, "node_id": "MDQ6VXNlcjcxMjAwNjA3", "avatar_url": "https://avatars.githubusercontent.com/u/71200607?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bzy-debug", "html_url": "https://github.com/bzy-debug", "followers_url": "https://api.github.com/users/bzy-debug/followers", "following_url": "https://api.github.com/users/bzy-debug/following{/other_user}", "gists_url": "https://api.github.com/users/bzy-debug/gists{/gist_id}", "starred_url": "https://api.github.com/users/bzy-debug/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bzy-debug/subscriptions", "organizations_url": "https://api.github.com/users/bzy-debug/orgs", "repos_url": "https://api.github.com/users/bzy-debug/repos", "events_url": "https://api.github.com/users/bzy-debug/events{/privacy}", "received_events_url": "https://api.github.com/users/bzy-debug/received_events", "type": "User", "site_admin": false }, "body": null, "created_at": "2024-09-17T10:52:12Z", "updated_at": "2024-09-17T10:52:33Z", "closed_at": "2024-09-17T10:52:24Z", "merged_at": "2024-09-17T10:52:24Z", "merge_commit_sha": "919103f926faea6f18b052c49269c9f59843a639", "assignee": null, "assignees": [], "requested_reviewers": [], "requested_teams": [], "labels": [], "milestone": null, "draft": false, "commits_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2/commits", "review_comments_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2/comments", "review_comment_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/comments{/number}", "comments_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/2/comments", "statuses_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/statuses/d2241e6f5fd061efdae22cb084b912ec92f30b16", "head": { "label": "bzy-debug:snake", "ref": "snake", "sha": "d2241e6f5fd061efdae22cb084b912ec92f30b16", "user": { "login": "bzy-debug", "id": 71200607, "node_id": "MDQ6VXNlcjcxMjAwNjA3", "avatar_url": "https://avatars.githubusercontent.com/u/71200607?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bzy-debug", "html_url": "https://github.com/bzy-debug", "followers_url": "https://api.github.com/users/bzy-debug/followers", "following_url": "https://api.github.com/users/bzy-debug/following{/other_user}", "gists_url": "https://api.github.com/users/bzy-debug/gists{/gist_id}", "starred_url": "https://api.github.com/users/bzy-debug/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bzy-debug/subscriptions", "organizations_url": "https://api.github.com/users/bzy-debug/orgs", "repos_url": "https://api.github.com/users/bzy-debug/repos", "events_url": "https://api.github.com/users/bzy-debug/events{/privacy}", "received_events_url": "https://api.github.com/users/bzy-debug/received_events", "type": "User", "site_admin": false }, "repo": { "id": 857290467, "node_id": "R_kgDOMxk24w", "name": "MoonBit-Code-JAM-2024", "full_name": "bzy-debug/MoonBit-Code-JAM-2024", "private": false, "owner": { "login": "bzy-debug", "id": 71200607, "node_id": "MDQ6VXNlcjcxMjAwNjA3", "avatar_url": "https://avatars.githubusercontent.com/u/71200607?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bzy-debug", "html_url": "https://github.com/bzy-debug", "followers_url": "https://api.github.com/users/bzy-debug/followers", "following_url": "https://api.github.com/users/bzy-debug/following{/other_user}", "gists_url": "https://api.github.com/users/bzy-debug/gists{/gist_id}", "starred_url": "https://api.github.com/users/bzy-debug/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bzy-debug/subscriptions", "organizations_url": "https://api.github.com/users/bzy-debug/orgs", "repos_url": "https://api.github.com/users/bzy-debug/repos", "events_url": "https://api.github.com/users/bzy-debug/events{/privacy}", "received_events_url": "https://api.github.com/users/bzy-debug/received_events", "type": "User", "site_admin": false }, "html_url": "https://github.com/bzy-debug/MoonBit-Code-JAM-2024", "description": null, "fork": true, "url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024", "forks_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/forks", "keys_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/teams", "hooks_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/hooks", "issue_events_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/issues/events{/number}", "events_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/events", "assignees_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/assignees{/user}", "branches_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/branches{/branch}", "tags_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/tags", "blobs_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/git/refs{/sha}", "trees_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/statuses/{sha}", "languages_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/languages", "stargazers_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/stargazers", "contributors_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/contributors", "subscribers_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/subscribers", "subscription_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/subscription", "commits_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/commits{/sha}", "git_commits_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/git/commits{/sha}", "comments_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/comments{/number}", "issue_comment_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/issues/comments{/number}", "contents_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/contents/{+path}", "compare_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/merges", "archive_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/downloads", "issues_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/issues{/number}", "pulls_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/pulls{/number}", "milestones_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/milestones{/number}", "notifications_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/labels{/name}", "releases_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/releases{/id}", "deployments_url": "https://api.github.com/repos/bzy-debug/MoonBit-Code-JAM-2024/deployments", "created_at": "2024-09-14T09:00:06Z", "updated_at": "2024-09-18T07:43:34Z", "pushed_at": "2024-09-18T07:56:45Z", "git_url": "git://github.com/bzy-debug/MoonBit-Code-JAM-2024.git", "ssh_url": "git@github.com:bzy-debug/MoonBit-Code-JAM-2024.git", "clone_url": "https://github.com/bzy-debug/MoonBit-Code-JAM-2024.git", "svn_url": "https://github.com/bzy-debug/MoonBit-Code-JAM-2024", "homepage": "https://moonbitlang.github.io/MoonBit-Code-JAM-2024/", "size": 206, "stargazers_count": 0, "watchers_count": 0, "language": "TypeScript", "has_issues": false, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "has_discussions": false, "forks_count": 0, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 0, "license": null, "allow_forking": true, "is_template": false, "web_commit_signoff_required": false, "topics": [], "visibility": "public", "forks": 0, "open_issues": 0, "watchers": 0, "default_branch": "main" } }, "base": { "label": "moonbitlang:main", "ref": "main", "sha": "51c97c99945168dfc596946594306feeca4fb294", "user": { "login": "moonbitlang", "id": 124848646, "node_id": "O_kgDOB3EKBg", "avatar_url": "https://avatars.githubusercontent.com/u/124848646?v=4", "gravatar_id": "", "url": "https://api.github.com/users/moonbitlang", "html_url": "https://github.com/moonbitlang", "followers_url": "https://api.github.com/users/moonbitlang/followers", "following_url": "https://api.github.com/users/moonbitlang/following{/other_user}", "gists_url": "https://api.github.com/users/moonbitlang/gists{/gist_id}", "starred_url": "https://api.github.com/users/moonbitlang/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/moonbitlang/subscriptions", "organizations_url": "https://api.github.com/users/moonbitlang/orgs", "repos_url": "https://api.github.com/users/moonbitlang/repos", "events_url": "https://api.github.com/users/moonbitlang/events{/privacy}", "received_events_url": "https://api.github.com/users/moonbitlang/received_events", "type": "Organization", "site_admin": false }, "repo": { "id": 848744255, "node_id": "R_kgDOMpbPPw", "name": "MoonBit-Code-JAM-2024", "full_name": "moonbitlang/MoonBit-Code-JAM-2024", "private": false, "owner": { "login": "moonbitlang", "id": 124848646, "node_id": "O_kgDOB3EKBg", "avatar_url": "https://avatars.githubusercontent.com/u/124848646?v=4", "gravatar_id": "", "url": "https://api.github.com/users/moonbitlang", "html_url": "https://github.com/moonbitlang", "followers_url": "https://api.github.com/users/moonbitlang/followers", "following_url": "https://api.github.com/users/moonbitlang/following{/other_user}", "gists_url": "https://api.github.com/users/moonbitlang/gists{/gist_id}", "starred_url": "https://api.github.com/users/moonbitlang/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/moonbitlang/subscriptions", "organizations_url": "https://api.github.com/users/moonbitlang/orgs", "repos_url": "https://api.github.com/users/moonbitlang/repos", "events_url": "https://api.github.com/users/moonbitlang/events{/privacy}", "received_events_url": "https://api.github.com/users/moonbitlang/received_events", "type": "Organization", "site_admin": false }, "html_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024", "description": null, "fork": false, "url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024", "forks_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/forks", "keys_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/teams", "hooks_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/hooks", "issue_events_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/events{/number}", "events_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/events", "assignees_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/assignees{/user}", "branches_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/branches{/branch}", "tags_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/tags", "blobs_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/git/refs{/sha}", "trees_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/statuses/{sha}", "languages_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/languages", "stargazers_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/stargazers", "contributors_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/contributors", "subscribers_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/subscribers", "subscription_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/subscription", "commits_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/commits{/sha}", "git_commits_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/git/commits{/sha}", "comments_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/comments{/number}", "issue_comment_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/comments{/number}", "contents_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/contents/{+path}", "compare_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/merges", "archive_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/downloads", "issues_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues{/number}", "pulls_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls{/number}", "milestones_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/milestones{/number}", "notifications_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/labels{/name}", "releases_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/releases{/id}", "deployments_url": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/deployments", "created_at": "2024-08-28T10:27:34Z", "updated_at": "2024-09-18T07:57:03Z", "pushed_at": "2024-09-18T07:57:00Z", "git_url": "git://github.com/moonbitlang/MoonBit-Code-JAM-2024.git", "ssh_url": "git@github.com:moonbitlang/MoonBit-Code-JAM-2024.git", "clone_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024.git", "svn_url": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024", "homepage": "https://moonbitlang.github.io/MoonBit-Code-JAM-2024/", "size": 204, "stargazers_count": 5, "watchers_count": 5, "language": "TypeScript", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": true, "has_discussions": false, "forks_count": 4, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 0, "license": null, "allow_forking": true, "is_template": false, "web_commit_signoff_required": false, "topics": [], "visibility": "public", "forks": 4, "open_issues": 0, "watchers": 5, "default_branch": "main" } }, "_links": { "self": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2" }, "html": { "href": "https://github.com/moonbitlang/MoonBit-Code-JAM-2024/pull/2" }, "issue": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/2" }, "comments": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/issues/2/comments" }, "review_comments": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2/comments" }, "review_comment": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/comments{/number}" }, "commits": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/pulls/2/commits" }, "statuses": { "href": "https://api.github.com/repos/moonbitlang/MoonBit-Code-JAM-2024/statuses/d2241e6f5fd061efdae22cb084b912ec92f30b16" } }, "author_association": "MEMBER", "auto_merge": null, "active_lock_reason": null, "merged": true, "mergeable": null, "rebaseable": null, "mergeable_state": "unknown", "merged_by": { "login": "bzy-debug", "id": 71200607, "node_id": "MDQ6VXNlcjcxMjAwNjA3", "avatar_url": "https://avatars.githubusercontent.com/u/71200607?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bzy-debug", "html_url": "https://github.com/bzy-debug", "followers_url": "https://api.github.com/users/bzy-debug/followers", "following_url": "https://api.github.com/users/bzy-debug/following{/other_user}", "gists_url": "https://api.github.com/users/bzy-debug/gists{/gist_id}", "starred_url": "https://api.github.com/users/bzy-debug/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bzy-debug/subscriptions", "organizations_url": "https://api.github.com/users/bzy-debug/orgs", "repos_url": "https://api.github.com/users/bzy-debug/repos", "events_url": "https://api.github.com/users/bzy-debug/events{/privacy}", "received_events_url": "https://api.github.com/users/bzy-debug/received_events", "type": "User", "site_admin": false }, "comments": 1, "review_comments": 0, "maintainer_can_modify": false, "commits": 1, "additions": 14, "deletions": 0, "changed_files": 2 } ================================================ FILE: package.json ================================================ { "type": "module", "scripts": { "dev": "DEV=true vite", "build": "tsx ./src/build.mts" }, "devDependencies": { "@types/markdown-it": "^14.1.2", "@types/node": "^22.5.5", "chokidar": "^4.0.0", "markdown-it": "^14.1.0", "octokit": "^4.0.2", "tsx": "^4.19.1", "vite": "^5.4.6", "wasm4": "^2.7.0" } } ================================================ FILE: src/build.mts ================================================ import fs from 'node:fs' import cp from 'node:child_process' import querystring from 'node:querystring' import markdownit from 'markdown-it' import * as octokit from 'octokit' const ghClient = new octokit.Octokit({ auth: process.env.GITHUB_TOKEN, }) const md = markdownit({ html: true, linkify: true, typographer: true, }) function githubBtn( authorName: string, repoName: string, option: { large: boolean }, ): string { const { large } = option return `` } fs.rmSync('dist', { recursive: true, force: true }) fs.mkdirSync('dist') async function getPRInfo(teamName: string) { const prNumber = getPrNumber(teamName) const res = await ghClient.request( 'GET /repos/{owner}/{repo}/pulls/{pull_number}', { owner: 'moonbitlang', repo: 'MoonBit-Code-JAM-2024', pull_number: prNumber, headers: { 'X-GitHub-Api-Version': '2022-11-28', }, }, ) return res.data } type MetaInfo = { teamName: string title?: string control?: string readme?: string cover: boolean prInfo: Awaited> } function $(strings: TemplateStringsArray, ...args: string[]): string { const command = strings.reduce( (prev, current, i) => prev + args[i - 1] + current, ) return cp.execSync(command).toString().trim() } function getPrNumber(teamName: string): number { const files = fs .readdirSync(`teams/${teamName}`, { withFileTypes: true }) .filter(d => d.isFile()) .map(d => d.name) const latestFile = files.sort((a, b) => { const aTime = fs.statSync(`teams/${teamName}/${a}`).ctimeMs const bTime = fs.statSync(`teams/${teamName}/${b}`).ctimeMs return bTime - aTime })[0] const commit = $`git log --format=%H teams/${teamName}/${latestFile}`.split( '\n', )[0] const oldestMergeCommit = $`git rev-list --reverse --merges ${commit}^..HEAD`.split('\n')[0] const mergeCommitMessage = $`git log --format=%B -n 1 ${oldestMergeCommit}` const title = mergeCommitMessage.split('\n')[0] const prNumber = title.match(/Merge pull request #(\d+)/)?.[1] if (prNumber === undefined) { throw new Error('No PR number found') } return Number(prNumber) } async function collectMetaInfo(teamName: string): Promise { const prInfo = process.env.DEV ? JSON.parse(fs.readFileSync('dev/data.json', 'utf8')) : await getPRInfo(teamName) const metaInfo: MetaInfo = { teamName, cover: false, prInfo, } const files = fs .readdirSync(`teams/${teamName}`, { withFileTypes: true }) .filter(d => d.isFile()) .map(d => d.name) for (const file of files) { const read = (file: string): string => fs.readFileSync(`teams/${teamName}/${file}`, 'utf8') switch (file) { case 'cover.png': { metaInfo.cover = true continue } case 'README.md': { metaInfo.readme = read(file) continue } case 'title': { metaInfo.title = read(file) continue } case 'control': { metaInfo.control = read(file) continue } } } return metaInfo } const teamNames = fs .readdirSync('teams', { withFileTypes: true }) .filter(d => d.isDirectory()) .map(d => d.name) const metaInfos = await Promise.all(teamNames.map(collectMetaInfo)) function renderGameCard(metaInfo: MetaInfo): string { const coverPath = metaInfo.cover ? `${querystring.escape(metaInfo.teamName)}/cover.png` : 'default-cover.png' const teamPath = querystring.escape(metaInfo.teamName) const authorName = metaInfo.prInfo.head.user.login const repoName = metaInfo.prInfo.head.repo?.name if (repoName === undefined) { throw new Error(`renderGameCard: repoName is undefined`) } const footer = metaInfo.title ? `

${metaInfo.title}

${metaInfo.teamName}

` : `

${metaInfo.teamName}

` return /*html*/ ` `.trim() } function indexHtml(metaInfos: MetaInfo[]): string { const gameCards = metaInfos.map(renderGameCard).join('\n') return /*html*/ ` MoonBit Code JAM 2024

MoonBit Code JAM 2024

选手提交作品展示

${gameCards}
` } function gameIndexHtml(metaInfo: MetaInfo): string { const title = metaInfo.title ?? metaInfo.teamName const control = metaInfo.control ?? '' const readme = metaInfo.readme ? md.render(metaInfo.readme) : '' const authorName = metaInfo.prInfo.head.user.login const repoName = metaInfo.prInfo.head.repo?.name const authorUrl = metaInfo.prInfo.head.user.html_url const avatarUrl = metaInfo.prInfo.head.user.avatar_url const updateTime = metaInfo.prInfo.merged_at if (repoName === undefined || updateTime === null) { throw new Error( JSON.stringify( { title, control, readme, avatarUrl, updateTime, }, null, 2, ), ) } const updateDate = new Date(updateTime).toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', }) const avatar = /*html*/ `

${updateDate}

` return /*html*/ ` ${title}

${control}

${title}

Star 仓库,为 ta 投票 ${githubBtn(authorName, repoName, { large: true })}

${avatar}
${readme}
` } function copyWasm4(dist: string) { const wasm4Files = fs.readdirSync('node_modules/wasm4/assets/runtime/slim') for (const file of wasm4Files) { fs.copyFileSync( `node_modules/wasm4/assets/runtime/slim/${file}`, `dist/${dist}/${file === 'index.html' ? 'game.html' : file}`, ) } } fs.writeFileSync('dist/index.html', indexHtml(metaInfos)) fs.copyFileSync('assets/default-cover.png', 'dist/default-cover.png') for (const metaInfo of metaInfos) { const gameIndex = gameIndexHtml(metaInfo) fs.mkdirSync(`dist/${metaInfo.teamName}`) copyWasm4(metaInfo.teamName) for (const file of fs.readdirSync(`teams/${metaInfo.teamName}`)) { fs.copyFileSync( `teams/${metaInfo.teamName}/${file}`, `dist/${metaInfo.teamName}/${file === 'game.wasm' ? 'cart.wasm' : file}`, ) } fs.writeFileSync(`dist/${metaInfo.teamName}/index.html`, gameIndex) } ================================================ FILE: teams/.gitkeep ================================================ ================================================ FILE: teams/CS赏金猎手/README.md ================================================ # 九宫棋(Tic-Tac-Toe) ## 介绍 九宫棋(井字棋),也被称为Tic-Tac-Toe,是一个简单但富有挑战性的经典策略游戏。游戏的目标是在一个3×3的网格上,通过放置棋子来形成一条直线,无论是水平的、垂直的还是对角线,率先完成的玩家即为胜者。 ## 玩家回合: 1. 按`空格键`开始 2. 按`上下左右`选择棋格 3. 按`空格键`落子 ================================================ FILE: teams/CS赏金猎手/control ================================================ 1.按`空格键`开始 2.按`上下左右`选择棋格 3.按`空格键`落子 ================================================ FILE: teams/CS赏金猎手/title ================================================ 九宫棋(Tic-Tac-Toe) ================================================ FILE: teams/MoonBit官方样例2/README.md ================================================ # MoonBit 官方提交样例 ================================================ FILE: teams/MoonBit官方样例2/control ================================================ P1 controls: Arrows ================================================ FILE: teams/MoonBit官方样例2/title ================================================ PingPong ================================================ FILE: teams/MoonBit官方样例3/README.md ================================================ # Tankle Credit to [@Milky2018](https://github.com/Milky2018) Checkout source code at https://github.com/Milky2018/tankle-mbt ================================================ FILE: teams/MoonBit官方样例3/control ================================================ 方向键移动,空格攻击 ================================================ FILE: teams/MoonBit官方样例3/title ================================================ Tankle ================================================ FILE: teams/一个队伍/README.md ================================================ ## 操作 `e` `d` `s` `f`移动 ## 玩法 收集30个部件通关。移动到部件上自动收集, 提升等级并重置地图。
吃掉♥可以回满血量。
处在房子格不会受到攻击。
战胜怪物会获得经验自动升级, 向怪物移动自动发起攻击。
怪物会缓慢向玩家地点靠近。
怪物之间也会相互吞噬,并获得经验升级。
每隔一段时间地图会自动重置。
================================================ FILE: teams/天地一!屋!大爱盟/README.md ================================================ # 飞机大战 ## 游戏玩法 ### 自机 有一百的生命值,初始发射普通子弹 ### 敌机 1. 中型机 会发射普通子弹,发射方向为自机方向 2. 小型机 可以理解为FPV自杀式无人机 ### 弹药箱 1. 回复生命箱 回复$50$点生命 2. 双发弹 拾取后会发射一段时间的双发弹 3. 高爆弹 拾取后发射一段时间的高伤害高爆弹 ## 游戏有很多其他的“特性”建议自行游玩查看QWQ ## 宣传链接 [Moonbit初体验——大一小白游戏创作 - Daster的文章 - 知乎](https://zhuanlan.zhihu.com/p/6863463180) [天地一!屋!大爱盟——飞机大战 at moonbit 开发心得 - 轩Demonmaster - 博客园](https://www.cnblogs.com/LQX-OI/p/18540898) ================================================ FILE: teams/天地一!屋!大爱盟/control ================================================ 上下左右控制飞机移动,子弹自动垂直向上发射 ================================================ FILE: teams/天地一!屋!大爱盟/game.html ================================================ WASM-4 Game ================================================ FILE: teams/天地一!屋!大爱盟/src/antity/antity_memory.mbt ================================================ let low_y:Int=150 //底部状态栏 //HP显示 // pub fn hp()->Frame_effects_{ // {begin:0, // xlen:12, // ylen:10, // sprite:[ // @bitset.Bitset::new@bitset.Bitset::new(2,"101000101000101010100000101000101000101010101010101000101000101000001010101000101000101000001010101010101000101010101010101010101000101010101000101000101000101000000000101000101000101000000000101000101000101000000000101000101000101000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"001001000011001001000000001001000000001001000000000001000000000001000001001001001111001001001111001001001111001001001111") // ]} // } // pub fn num0()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000001010000000101010100010100000101010100000101010100000101010100000101010100000101000101010100000001010000000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"110011100001000000000000000000000000000000100001110011111111") // ]} // } // pub fn num1()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000001010000000101010000010101010000010001010000000001010000000001010000000001010000010101010101010101010101000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"110011100011000011010011110011110011110011000000000000111111") // ]} // } // pub fn num2()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000001010000000101010100010100000101010100000101000000010100000001010000000101000000010101010101010101010101000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"110011100001001100001100111001110011100111000000000000111111") // ]} // } // pub fn num3()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000101010000010101010100010000000101000000000101000101010100000000000101000000000101010101010101000101010100000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"100011000001011100111100100001111100111100000000100001111111") // ]} // } // pub fn num4()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000000010100000001010100000100010100000100010100010000010100010000010101010101010101000000010100000000010100000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"111001110001100001100001000001000000000000111001111001111111") // ]} // } // pub fn num5()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"010101010101010101010101010000000000010101000000000101010100000000010101000000000101000000000101010101010100000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"000000000000011111000111100001111000111100111100000001111111") // ]} // } // pub fn num6()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000001010100000101010100010100000000010100000000010101010101010100000101010100000101010101010101000101010100000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"110001100001001111001111000000000000000000000000100001111111") // ]} // } // pub fn num7()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"010101010100010101010100000000010100000000010100000000010100000000010100000001010000000101000000010100000000000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"000001000001111001111001111001111001110011100111001111111111") // ]} // } // pub fn num8()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000101010100000100000100010000000001010000000001000100000100000101010100010000000001010000000001000101010100000000000000") // ], // back_ground:[ // @bitset.Bitset::new(1,"100001100001000000000000100001100001000000000000100001111111") // ]} // } // pub fn num9()->Frame_effects_{ // {begin:0, // xlen:6, // ylen:10, // sprite:[ // @bitset.Bitset::new(2,"000001010101000101010101010100000101010100000101010100000101010101010101000101000101000000000101000000000101000000000101") // ], // back_ground:[ // @bitset.Bitset::new(1,"110011100011000011010011110011110011110011000000000000111111") // ]} // } //特效 pub fn player_Plane_effect()->Frame_effects_{ {begin:0, xlen:20, ylen:20, sprite:[ @bitset.Bitset::new(2,"00000000000000000011000000000000000000000000000000000000001100000000000000000000000000000000000000110000000000000000000000000000000000000011000000000000000000000000000000000000111111000000000000000000000000000000000011101100000000000000000000000000000000001100110000000000000000000000000000000011101010000000000000000000000000000011111000100001001100000000000000000000000000000101000000101111000000000000000000000100010000000100101011000000000000001110100110100100011111111111000000000011111111111000010111000000001100000000001100000000011000001011000000000000000000000000001110100000111100000000000000000000000000111111000001111100000000000000000000001111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), @bitset.Bitset::new(2,"00000000000000000011000000000000000000000000000000000000001100000000000000000000000000000000000000110000000100000000000000000000000000000011000000000000000000000000000000010000111111000000000000000000000000000000000111100101000100000000000000000000000000011100110000000000000000000000000000010100000010110100000100000000000000000000000001000001000101000000000000010000000101011010000101000000000000000000000000111110010100010010111100000000000000011110010001010001100110101100000000000011111111110100000110111111111100000000001101000100110001011100010000110000000000000000001110000010101101000000000000000000010101111101001111110000000000000000000000001101010000000111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), @bitset.Bitset::new(2,"00000000000000000011000000000000000000000000000000000000001100000000000000000000000000000000000000110100000001000000000000000000000000000111000000000000000000000000000000000000111111000000000000000000000000000001000011011101000000010000000000000000000000001100110001000000000000000000000000000011101010000100000000010000000000000011111000100001001100000000000000000000010000000101000000101101000000000000000000000101010000000100100111000000000000001110100110100100010111011111000000000011110111111000010101110000001100000000001101000001011000001111000000000000000000000000000110100000110100000000000000000000000001111111000001111100000000000000000000011111010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), @bitset.Bitset::new(2,"00000000000000001100000000000000000000000100000000000000110000000000000000000000000000000000001100000000000000000000010000000000000000110000000100000000000000000000000101001111011100000000000000000000000000000000011011101011000000010000000000000100000011000010000001000000000000010000000000000010001010000000000000000000000100000000000000000100101111000100000000000000111100100000000000100111010000000000111101011110000100001111111111000000000011110111001110110000000000001100010000000000000101101010000000000000000000000001000000000100001100001101000000000100000000001111010000110000110001000000000001000011011100000000000011010000000000000000000000000000000001000000000000000000000001010001000000000000000000010000000001000000000000000000000000000000000001000000000000000000000000000000000000000000") ], back_ground:[ @bitset.Bitset::new(1,"1111111110111111111111111111101111111111111111111011111111111111111110111111111111111111000111111111111111110001111111111111111100011111111111111110000111111111111110000010101111111111111100111000111111111101011100000111111100000001000000111110000000000111101111101111001100111111111111100011001111111111111000110001111111111100011111111111111111111111111111111111111111111111111111111111111111111111"), @bitset.Bitset::new(1,"1111111110111111111111111111101111111111111111111011101111111111111110111111111111111011000111111111111111100000101111111111111001011111111111111001110001101111111111110110000111111011100000100111111111111000001000001111111000000010000001111110000001100000001111100100010000011011111111100110000111111111000000100011111111111100011100011111111111111111111111111111111111111111111111111111111111111111"), @bitset.Bitset::new(1,"1111111110111111111111111111101111111111111111111001110111111111111100111111111111111111000111111111111110110000111011111111111100000111111111111110000001111011111110000000001111111111011100000000111111111100000000000111111100000000000000111110000000000011101111100110001100111111111111100011001111111111110000110001111111111000011110111111111111111111111111111111111111111111111111111111111111111111"), @bitset.Bitset::new(1,"1111111101111111111101111111011111111111111111101111111111011111111011101111111111100100001111111111111111000000111011111101110110110111111011111110100111111111101111111101000101111111001011111000011111000000101100000111110000000011111101011111100000111111111110111101101100111101111100011011000111110110001111110011111111111111110111111111110010111111111011110111111111111111110111111111111111111111") ]} } // 玩家飞机正常一般形态 pub fn get_fram_entity(num:Int)->Frame_effects{ if(num==1) {return bullet1_()} if(num==9) {return bullet9_()} if(num==2) {return high_explosive_my_()} if(num==11) {return high_explosive_en_()} if(num==3) {return player_Plane_1_frame()} if(num==4) {return small_plane_()} if(num==5) {return middle_plane_()} if(num==6) {return high_explosive_cartridge_()} if(num==7) {return double_cartridge_()} if(num==8) {return hp_recovery_pack_()} return double_cartridge_() } // type_ 分配规则 // 普通子弹_敌人 1 // 普通子弹_自己 9 // 高爆子弹_自己 2 // 高爆子弹_敌人 11 // 自机 3 // 敌机小型机 4 // 敌机中型机_普通子弹版 5 // 高爆子弹包 6 // 双倍子弹包 7 // 血量恢复包 8 // 激光子弹包 10 pub fn player_Plane_1_frame()-> Frame_effects{ { xlen:13, ylen:15, sprite:@bitset.Bitset::new(2,"000000000000110000000000000000000000001100000000000000000000000011000000000000000000000000110000000000000000000000111111000000000000000000001110110000000000000000000011001100000000000000000011101010110000000000001111100010001011110000001110100010101000101011001111111111100010111111111111000000001110110000000011000000001110101011000000000000000011111111110000000000000011110100011111000000"), back_ground:@bitset.Bitset::new(1,"111111011111111111101111111111110111111111111011111111111000111111111100011111111110001111111110000011111100000000011100000000000100000000000000111100011110111100000111111110000011111110001000111") } } pub fn small_plane_()->Frame_effects{ { xlen:7, ylen:9, sprite:@bitset.Bitset::new(2,"000001000100000010110011100000001011100000000010111000001011001100111000101100111000000010001000000000101110000000000010000000"), back_ground:@bitset.Bitset::new(1,"110101110000011100001110000100000001000001110000111000011110111") } } pub fn middle_plane_()->Frame_effects{ { xlen:11, ylen:17, sprite:@bitset.Bitset::new(2,"00000001000000010000000000000100000001000000000001010000000101000000101110000000101110000000101110001011100000000010111110111110000000000010101110100000001000001011001110000010100010110000001110001011101110001100101110111011101000000010101110001011101000101011100000001011000000111000000000001011001110000000000000101100111000000000000000101110000000000000000000100000000000"), back_ground:@bitset.Bitset::new(1,"1110111011111100000001110000000011000000000111000000001110000000011110000000101100000000010000000000000000000000000000000100000000011100000000111100000001111000000011111000000111111011111") } } pub fn small_plane()->Aircraft{{ type_:4, pos:Location::new(x=0,y=0,4), bullet_exit_point:[], speed:1.3666666666666667, dir:90, // frame:small_plane_(), hp:10} } pub fn middle_plane()->Aircraft{{ type_:5, pos:Location::new(x=0,y=0,5), bullet_exit_point:[Bullet_exit_point::new(4,17,1,95,50)], speed:0.6666666666666667, dir:90, // frame:middle_plane_(), hp:60} } pub fn middle_plane_high_explode()->Aircraft{{ type_:5, pos:Location::new(x=0,y=0,5), bullet_exit_point:[Bullet_exit_point::new(4,17,11,95,60)], speed:0.6666666666666667, dir:90, // frame:middle_plane_(), hp:60} } pub fn player_Plane()->Aircraft{{ type_:3, pos:Location::new(x=73,y=120,3), bullet_exit_point:[Bullet_exit_point::new(5,5,9,0,10)], speed:1.3666666666666667, dir:180, // frame:player_Plane_1_frame(), hp:100 } } pub fn bullet9_()->Frame_effects{{ xlen:3, ylen:3, sprite:@bitset.Bitset::new(2,"010101010101010101"), back_ground:@bitset.Bitset::new(1,"000000000")} } pub fn bullet1_()->Frame_effects{{ xlen:3, ylen:3, sprite:@bitset.Bitset::new(2,"111111111111111111"), back_ground:@bitset.Bitset::new(1,"000000000") } } pub fn bullet1()->Bullet{{ type_:9, harm:8, pos:Location::new(9), dir:270, speed:1, // frame:bullet1_() } } pub fn bullet2()->Bullet{{ type_:1, harm:8, pos:Location::new(1), dir:90, speed:1, // frame:bullet2_() } } pub fn high_explosive_en_()->Frame_effects{{ xlen:3, ylen:3, sprite:@bitset.Bitset::new(2,"101110110111101110"), back_ground:@bitset.Bitset::new(1,"000000000")} } pub fn high_explosive_my_()->Frame_effects{{ xlen:3, ylen:3, sprite:@bitset.Bitset::new(2,"111011100110111011"), back_ground:@bitset.Bitset::new(1,"000000000")} } pub fn high_explosive_my()->Bullet{{ type_:2, harm:25, pos:Location::new(2), dir:270, speed:1, // frame:high_explosive_my_() } } pub fn high_explosive_en()->Bullet{{ type_:11, harm:30, pos:Location::new(11), dir:90, speed:1, // frame:high_explosive_en_() } } pub fn high_explosive_cartridge_()->Frame_effects{{ xlen:8, ylen:8, sprite:@bitset.Bitset::new(2,"10100000000010101010111111111010101000010100101010100001010010101010000101001010101000010100101010101111111110101010000000001010"), back_ground:@bitset.Bitset::new(1,"0011110000000000000000000000000000000000000000000000000000111100")} } pub fn high_explosive_cartridge()->Cartridge{{ type_:6, pos:Location::new(6), speed:0.5, dir:90, effect:0, // frame:high_explosive_cartridge_() } } pub fn hp_recovery_pack()->Cartridge{{ type_:8, pos:Location::new(8), speed:0.5, dir:90, effect:50, // frame:hp_recovery_pack_() } } pub fn hp_recovery_pack_()->Frame_effects{{ xlen:8, ylen:8, sprite:@bitset.Bitset::new(2,"00111100001111001110101111101011111001101001101111011001011001110011101010101100001101101001110000001101011100000000001111000000"), back_ground:@bitset.Bitset::new(1,"1001100100000000000000000000000010000001100000011100001111100111") }} pub fn double_cartridge()->Cartridge{{ type_:7, pos:Location::new(7), speed:0.5, dir:90, effect:0, // frame:double_cartridge_() } } pub fn double_cartridge_()->Frame_effects{{ xlen:8, ylen:8, sprite:@bitset.Bitset::new(2,"10100000000010101010010101011010101011101011101010101110101110101010111010111010101011101011101010100101010110101010000000001010"), back_ground:@bitset.Bitset::new(1,"0011110000000000000000000000000000000000000000000000000000111100")} } // pub let bullet:Map[Int,Bullet]={9:bullet1,1:bullet2,2:high_explosive_my,11:high_explosive_en} // pub let plans:Map[Int,Aircraft]={3:player_Plane,4:small_plane,5:middle_plane} // pub let cartridge:Map[Int,Cartridge]={6:high_explosive_cartridge,8:hp_recovery_pack,7:double_cartridge} // pub let cart_bullet:Map[Int,Int]={ // 6:2 // } // pub let default_bullet:Map[Int,Array[Bullet_exit_point]]={ // 3:[Bullet_exit_point::new(5,5,9,0,10)], // 5:[Bullet_exit_point::new(4,17,1,0,90)], // 6:[Bullet_exit_point::new(5,5,2,0,10,limit=20)], // 7:[Bullet_exit_point::new(2,8,9,0,10,limit=30),Bullet_exit_point::new(9,8,9,0,10,limit=30)], // 4:[] // } pub fn bullet(n:Int)->Bullet{ match n{ 9=>bullet1() 1=>bullet2() 2=>high_explosive_my() 11=>high_explosive_en() _=>bullet1() } } pub fn plans(n:Int)->Aircraft{ match n{ 3=>player_Plane() 4=>small_plane() 5=>middle_plane() 12=>middle_plane_high_explode() _=>small_plane() } } pub fn cartridge(n:Int)->Cartridge{ match n{ 6=>high_explosive_cartridge() 8=>hp_recovery_pack() 7=>double_cartridge() _=>double_cartridge() } } pub fn default_bullet(n:Int)->FixedArray[Bullet_exit_point]{ match n{ 3 => return [Bullet_exit_point::new(5,5,9,0,10)] 5 => return [Bullet_exit_point::new(4,17,1,0,90)] 6 => [Bullet_exit_point::new(5,5,2,0,10,limit=20)] 7 => [Bullet_exit_point::new(2,8,9,0,10,limit=30),Bullet_exit_point::new(9,8,9,0,10,limit=30)] 12 => [Bullet_exit_point::new(4,17,11,0,90)] _=> [Bullet_exit_point::new(5,5,9,0,10)] } } pub fn get_score(n:Int)->Int{ match n{ 4 => return 10 5 => return 50 6 => 30 7 => 25 _ => 0 } } //pub var of music //音乐用途tones数组 ================================================ FILE: teams/天地一!屋!大爱盟/src/antity/moon.pkg.json ================================================ { "import": [ "moonbitlang/wasm4", "GAME/time_cnt", "GAME/bitset" ] } ================================================ FILE: teams/天地一!屋!大爱盟/src/antity/struct.mbt ================================================ pub struct Location{ mut x:Double mut y:Double // mut newx:Double // mut newy:Double type_:UInt //用于记录实体的位置 } // struct Sprite_parameter{ // x:UInt // y:UInt // //相对于基准像素的偏移量 // color:UInt // } // pub struct Frame{ // mut x:Int // mut y:Int // //代表左上角的基准像素 // sprite:Array[Sprite_parameter] // //这个代表一帧!! // } pub struct Frame_time_config{ mut begin:Int mut end:Int } pub struct Frame_effects{ xlen:UInt ylen:UInt sprite:@bitset.Bitset back_ground:@bitset.Bitset } pub struct Frame_effects_{ mut begin:UInt xlen:UInt ylen:UInt sprite:Array[@bitset.Bitset] back_ground:Array[@bitset.Bitset] } // pub struct Frame_effects_{ // mut begin_time:UInt64 // mut end_time:UInt64 // mut x:UInt // mut y:UInt // sprite:Array[Frame] // time_management:Array[Frame_time_config] // //time_management与sprite的长度一致,time_management用于控制sprite的每一帧显示时间 // } pub struct ToneParams { frequency: (UInt, UInt) adsr: @wasm4.ADSR volume: @wasm4.ADSRVolume channel: @wasm4.ToneFlag } pub struct Sound_effects{ //具体实现待研究QWQ effects:Array[ToneParams] } pub struct ToneForPub { tone:ToneParams startfps:UInt } // pub struct Effects{ // frame:Frame_effects_ // sound:Array[ToneParams] // } pub struct Bullet{ type_:Int harm:Double pos:Location dir:Double speed:Double // frame:Frame_effects } // pub struct Laser{ // type_:UInt // pos:Location // //表示激光最顶点的位置 // dir:UInt // //激光方向 // harm:UInt // // warming:Frame_effects // } //激光应当还有一个方向改变函数!!! pub struct Bullet_exit_point{ x:Int y:Int type_:Int mut last_shoot:Int shoot_speed:Int mut limit:Int } pub struct Aircraft{ type_:Int pos:Location mut speed:Double mut dir:Double // frame:Frame_effects mut hp:Double bullet_exit_point:Array[Bullet_exit_point] } //方向先不管,是个角度,0度方向与x轴正方向平行,顺时针转 //weapon 1是单发 2是双发 //speed 是每帧速度 pub struct Cartridge{ type_:Int pos:Location mut speed:Double dir:Double effect:Double // frame:Frame_effects } // type_ 分配规则 // 普通子弹_敌人 1 // 普通子弹_自己 9 // 高爆子弹_自己 2 // 高爆子弹_敌人 11 // 自机 3 // 敌机小型机 4 // 敌机中型机_普通子弹版 5 // 敌机中型机_高爆子弹版 12 // 高爆子弹包 6 // 双倍子弹包 7 // 血量恢复包 8 // 激光子弹包 10 ================================================ FILE: teams/天地一!屋!大爱盟/src/antity/struct_trait.mbt ================================================ // pub trait Strike{ // is_strike(Self,Self)->Bool // } // pub trait Updata_pos{ // updata_pos(Self)->Unit // } // pub trait Get_new_pos{ // get_new_pos(Self)->Unit // } // pub trait Setmusic{ // setup_tone_params() -> Array[ToneParams] // } pub let scores:Ref[Int]=Ref::new(0); pub fn get_index(x:UInt,y:UInt)->UInt{ y*160+x } //造成伤害####################################################################################################################################### //造成伤害####################################################################################################################################### //展示函数############################################# pub fn show(self:Frame_effects,x:Int,y:Int)->Unit{ let mut index=0 let mut posx=x let mut posy=y for i=0U;i=160||posx<0||posy<0||posy>low_y).not()){ @wasm4.set_frame_buffer(get_index(posx.reinterpret_as_uint(),posy.reinterpret_as_uint()),self.sprite[index]+1) } index=index+1 posx=posx+1 } posx=x posy=posy+1 } } pub fn showp(self:Frame_effects_,x:Int,y:Int,t:Int)->Unit{ let mut index=0 let mut posx=x let mut posy=y for i=0U;i=160||posx<0||posy<0||posy>low_y).not()){ @wasm4.set_frame_buffer(get_index(posx.reinterpret_as_uint(),posy.reinterpret_as_uint()),self.sprite[t][index]+1) } index=index+1 posx=posx+1 } posx=x posy=posy+1 } } pub fn print(self:Aircraft)->Unit{ get_fram_entity(self.type_).show(self.pos.x.to_int(),self.pos.y.to_int()) } pub fn print(self:Bullet)->Unit{ get_fram_entity(self.type_).show(self.pos.x.to_int(),self.pos.y.to_int()) } // pub fn print(self:Laser)->Unit{ // // get_fram_entity(self.type_).show(self.pos.x.to_int(),self.pos.y.to_int()) // } pub fn print(self:Cartridge)->Unit{ get_fram_entity(self.type_).show(self.pos.x.to_int(),self.pos.y.to_int()) } //展示函数############################################# //构造函数############################################# pub fn Location::new(~x:Double=0,~y:Double=0,type_:UInt)->Location{ {x,y,type_} } pub fn Bullet_exit_point::new(x:Int,y:Int,type_:Int,last_shoot:Int,shoot_speed:Int,~limit:Int=-1)->Bullet_exit_point{ {x,y,type_,last_shoot,shoot_speed,limit} } //构造函数############################################# //更新位置############################################# // let eps:Double=0.000000001 pub fn Aircraft::update_pos(self:Aircraft)->Unit{ let x=self.pos.x let y=self.pos.y self.pos.x=self.pos.x+self.speed*@math.cos(self.dir/180*@math.PI) self.pos.y=self.pos.y+self.speed*@math.sin(self.dir/180*@math.PI) if self.type_==3{ if(self.is_out_partly()){ self.pos.x=x self.pos.y=y } } } pub fn Bullet::update_pos(self:Bullet)->Unit{ self.pos.x=self.pos.x+self.speed*@math.cos(self.dir/180*@math.PI) self.pos.y=self.pos.y+self.speed*@math.sin(self.dir/180*@math.PI) } pub fn Cartridge::update_pos(self:Cartridge)->Unit{ self.pos.x=self.pos.x+self.speed*@math.cos(self.dir/180*@math.PI) self.pos.y=self.pos.y+self.speed*@math.sin(self.dir/180*@math.PI) } //更新位置############################################# //检测是否出界######################################### pub fn Aircraft::is_out_partly(self:Aircraft)->Bool{ let xl=self.pos.x.to_int()+get_fram_entity(self.type_).xlen.reinterpret_as_int()-1 let yl=self.pos.y.to_int()+get_fram_entity(self.type_).ylen.reinterpret_as_int()-1 let x=self.pos.x let y=self.pos.y if(((x<160&&xl>=160)||(y>low_y.to_double()&&yl>=low_y)||(x<0&&xl>=0)||(y<0&&yl>=0))||self.is_out_all()) {true} else {false} } pub fn Aircraft::is_out_all(self:Aircraft)->Bool{ let xl=self.pos.x.to_int()+get_fram_entity(self.type_).xlen.reinterpret_as_int()-1 let yl=self.pos.y.to_int()+get_fram_entity(self.type_).ylen.reinterpret_as_int()-1 let x=self.pos.x.to_int() let y=self.pos.y.to_int() if((x>=160||xl<0)||(y<0||yl>=low_y)) {true} else {false} } pub fn Bullet::is_out_all(self:Bullet)->Bool{ let xl=self.pos.x.to_int()+get_fram_entity(self.type_).xlen.reinterpret_as_int()-1 let yl=self.pos.y.to_int()+get_fram_entity(self.type_).ylen.reinterpret_as_int()-1 let x=self.pos.x.to_int() let y=self.pos.y.to_int() if((x>=160||xl<0)||(y<0||yl>=low_y)) {true} else {false} } pub fn Cartridge::is_out_all(self:Cartridge)->Bool{ let xl=self.pos.x.to_int()+get_fram_entity(self.type_).xlen.reinterpret_as_int()-1 let yl=self.pos.y.to_int()+get_fram_entity(self.type_).ylen.reinterpret_as_int()-1 let x=self.pos.x.to_int() let y=self.pos.y.to_int() if((x>=160||xl<0)||(y<0||yl>=low_y)) {true} else {false} } pub fn Cartridge::is_out_partly(self:Cartridge)->Bool{ let xl=self.pos.x.to_int()+get_fram_entity(self.type_).xlen.reinterpret_as_int()-1 let yl=self.pos.y.to_int()+get_fram_entity(self.type_).ylen.reinterpret_as_int()-1 let x=self.pos.x let y=self.pos.y if(((x<160&&xl>=160)||(y>low_y.to_double()&&yl>=low_y)||(x<0&&xl>=0)||(y<0&&yl>=0))||self.is_out_all()) {true} else {false} } //检测是否出界######################################### //判断死亡######################################################################################## pub fn die(self:Aircraft)->Bool{ self.hp<0.0000001 } //判断死亡######################################################################################## //检测撞击################################################################################# pub fn get_ratio_en()->Double{ return (1.0+scores.val.to_double()*0.0008) } pub fn get_ratio_my()->Double{ return (1.0+scores.val.to_double()*0.0004) } pub fn crash(self:Bullet,obj:Aircraft)->Bool{ let mut xs:Int=0 let mut ys:Int=0 let mut xo:Int=0 let mut yo:Int=0 let mut ans=false let selff=get_fram_entity(self.type_) let objj=get_fram_entity(obj.type_) for i=selff.sprite.length()-1;i>=0&&ans.not();i=i-1{ xs=i%selff.xlen.reinterpret_as_int()+self.pos.x.to_int() ys=i/selff.xlen.reinterpret_as_int()+self.pos.y.to_int() for j=objj.sprite.length()-1;j>=0&&ans.not();j=j-1{ xo=j%objj.xlen.reinterpret_as_int()+obj.pos.x.to_int() yo=j%objj.ylen.reinterpret_as_int()+obj.pos.y.to_int() if(xs==xo&&yo==ys) {ans=true} } } if(ans){ if(self.type_==1||self.type_==11){ obj.hp=obj.hp-self.harm*get_ratio_en(); } else if(self.type_==2||self.type_==9){obj.hp=obj.hp-self.harm*get_ratio_my()} } ans } pub fn crash(self:Aircraft,obj:Aircraft)->Bool{ let mut xs:Int=0 let mut ys:Int=0 let mut xo:Int=0 let mut yo:Int=0 let mut ans=false let selff=get_fram_entity(self.type_) let objj=get_fram_entity(obj.type_) for i=selff.sprite.length()-1;i>=0&&ans.not();i=i-1{ xs=i%selff.xlen.reinterpret_as_int()+self.pos.x.to_int() ys=i/selff.xlen.reinterpret_as_int()+self.pos.y.to_int() for j=objj.sprite.length()-1;j>=0&&ans.not();j=j-1{ xo=j%objj.xlen.reinterpret_as_int()+obj.pos.x.to_int() yo=j%objj.ylen.reinterpret_as_int()+obj.pos.y.to_int() if(xs==xo&&yo==ys) {ans=true} } } if(ans){ obj.hp=0 } ans } pub fn crash(self:Cartridge,obj:Aircraft)->Bool{ let mut xs:Int=0 let mut ys:Int=0 let mut xo:Int=0 let mut yo:Int=0 let mut ans=false let selff=get_fram_entity(self.type_) let objj=get_fram_entity(obj.type_) for i=selff.sprite.length()-1;i>=0&&ans.not();i=i-1{ xs=i%selff.xlen.reinterpret_as_int()+self.pos.x.to_int() ys=i/selff.xlen.reinterpret_as_int()+self.pos.y.to_int() for j=objj.sprite.length()-1;j>=0&&ans.not();j=j-1{ xo=j%objj.xlen.reinterpret_as_int()+obj.pos.x.to_int() yo=j%objj.ylen.reinterpret_as_int()+obj.pos.y.to_int() if(xs==xo&&yo==ys) {ans=true} } } if(ans){ self.take_effect(obj) } ans } //检测撞击################################################################################# //弹药箱生效函数###################################################################################### fn take_effect(self:Cartridge,obj:Aircraft)->Unit{ if(self.type_==8){ obj.hp=obj.hp+self.effect } else if(self.type_==7||self.type_==6){ obj.bullet_exit_point.clear(); let len=default_bullet(self.type_).length() for i=len-1;i>=0;i=i-1{ obj.bullet_exit_point.push(default_bullet(self.type_)[i]) } } } //弹药箱生效函数###################################################################################### //function of music //play_tone的用法如下: //let toneExample = { // frequency: (261, 523),//frequency可以自己定义,其他有需求再定义 // adsr: adsrSTD, // volume: volumeSTD, // channel: channelSTD //};//这里的adsrSTD,volumeSTD,channelSTD是在antity_memory.mbt中定义的标准量 //play_tone(toneExample) ================================================ FILE: teams/天地一!屋!大爱盟/src/bitset/bitset.mbt ================================================ let up_bit:Int=32; pub struct Bitset{ priv mut bits:FixedArray[UInt] priv mut top:Int//表示存了多少个pre_size per_size:Int } pub fn Bitset::length(self:Bitset)->Int{ self.top } pub fn Bitset::new(per_size:Int,string:String)->Bitset{ let ans:Bitset={bits:[],top:0,per_size} let mut block=-1 let mut move=up_bit ans.top=string.length()/per_size ans.bits=FixedArray::make(ans.top,0) for i in string{ if(move>=up_bit){ block=block+1; move=0; } ans.bits[block]=ans.bits[block]|((i.to_int()-'0'.to_int()).reinterpret_as_uint()<UInt{ let indexx=index*self.per_size let mut block=indexx/up_bit let mut move=indexx-block*up_bit let mut ans:UInt=0; for i=0;i=up_bit){ block=block+1; move=0; } ans=ans|(((self.bits[block]>>move)&1)<Unit{ // // println("Push \{input}") // let indexx=self.top*self.per_size // let mut block=indexx/up_bit // let mut move=indexx-block*up_bit // // println("\{indexx} \{block} \{move}") // if(move==0) {self.bits.push(0)} // for i=0;i=up_bit){ // block=block+1; // self.bits.push(0) // move=0; // } // self.bits[block]=(self.bits[block]|(((input>>i)&1)<>i)&1)<Unit{ // let indexx=index*self.per_size // let mut block=indexx/up_bit // let mut move=indexx-block*up_bit // for i=0;i=up_bit){ // block=block+1; // move=0; // } // if ((self.bits[block]>>move)&1)==1 {self.bits[block]=self.bits[block]&(-1).reinterpret_as_uint()^(1U<>i)&1)<Unit{ gaming_logic() // @antity.player_Plane_1.print() } let random:@random.Rand=@random.Rand::new() let aircraft:Array[@antity.Aircraft]=[] let bullet:Array[@antity.Bullet]=[] let bullet_my:Array[@antity.Bullet]=[] // let laser:Array[@antity.Laser]= // let a:FixedArray[@antity.Laser]=FixedArray::new(200,) let cartridge:Array[@antity.Cartridge]=[] let player_plane:@antity.Aircraft=@antity.player_Plane() let died:Ref[Bool]=Ref::new(false) let updated:Ref[Bool]=Ref::new(false) let player_Plane_effect:@antity.Frame_effects_=@antity.player_Plane_effect() let score:Ref[Int]=Ref::new(0) let ttime:Ref[Int]=Ref::new(0) // let playerHP:String=player_plane.hp.to_string() // let hpWord:String="HP: " // let time_gone:Int= @time_cnt.get_time().to_int()/60 // let time_trans:Double=time_gone.to_double()/60.0 fn get_rand()->Double{ (random.uint(limit =160)).to_float().to_double() } fn gaming_logic()->Unit{ if(died.val){ //@wasm4.tone((200,201),@wasm4.ADSR::new(100),@wasm4.ADSRVolume::new(100),@wasm4.ToneFlag::new(channel=Noise,mode=Duty_1_2,pan=Center)); if(updated.val.not()){ player_Plane_effect.begin=@time_cnt.get_time()+1 updated.val=true } else if(((@time_cnt.get_time()-player_Plane_effect.begin)/16).reinterpret_as_int()<4){ @antity.showp(player_Plane_effect,(player_plane.pos.x-3).to_int(),(player_plane.pos.y).to_int(),((@time_cnt.get_time()-player_Plane_effect.begin)/16).reinterpret_as_int()); } else{ game_over() return; //Game Over } } else{ @antity.scores.val=score.val // @wasm4.trace(@antity.get_ratio().to_string()) ttime.val=@time_cnt.get_time().reinterpret_as_int() //get_next_pos################################################################################################################ //self_plane_update_pos if (button_state.val.button_down||button_state.val.button_up||button_state.val.button_left||button_state.val.button_right)&&(button_state.val.button_down&&button_state.val.button_up&&button_state.val.button_left&&button_state.val.button_right).not()&&((button_state.val.button_down&&button_state.val.button_up)&&button_state.val.button_left.not()&&button_state.val.button_right.not()).not()&&(button_state.val.button_down.not()&&button_state.val.button_up.not()&&(button_state.val.button_left&&button_state.val.button_right)).not(){ update_self() } for i=aircraft.length()-1;i>=0;i=i-1{ aircraft[i].update_pos() } for i=bullet_my.length()-1;i>=0;i=i-1{ bullet_my[i].update_pos() } for i=bullet.length()-1;i>=0;i=i-1{ bullet[i].update_pos() } for i=cartridge.length()-1;i>=0;i=i-1{ cartridge[i].update_pos() } // for i=laser.length();i>=0;i=i-1{ // //waiting // } // //判断碰撞#################################################################################################################### // for i=0;i=0;i=i-1{ if(bullet[i].crash(player_plane)){ bullet_crashed.push(i) @wasm4.tone((200,401),@wasm4.ADSR::new(10),@wasm4.ADSRVolume::new(100),@wasm4.ToneFlag::new(channel=Noise,mode=Duty_1_2,pan=Center)); } } for i=bullet_my.length()-1;i>=0;i=i-1{ for j=aircraft.length()-1;j>=0;j=j-1{ if(bullet_my[i].crash(aircraft[j])){ bullet_crashed_my.push(i) @wasm4.tone((200,401),@wasm4.ADSR::new(10),@wasm4.ADSRVolume::new(100),@wasm4.ToneFlag::new(channel=Noise,mode=Duty_1_2,pan=Center)); } } } for i=aircraft.length()-1;i>=0;i=i-1{ if(aircraft[i].crash(player_plane)){ died.val=true aircraft.remove(i) |> ignore } } for i=cartridge.length()-1;i>=0;i=i-1{ if(cartridge[i].crash(player_plane)){ score.val=score.val+@antity.get_score(cartridge[i].type_) cartridge.remove(i)|> ignore } } // for i=0;i=0;i=i-1{ bullet_my.remove(bullet_crashed_my[i]) |> ignore //加入子弹爆炸特效 } for i=bullet_crashed.length()-1;i>=0;i=i-1{ bullet.remove(bullet_crashed[i]) |> ignore //加入子弹爆炸特效 } for i=aircraft.length()-1;i>=0;i=i-1{ if(aircraft[i].is_out_all()){ aircraft.remove(i)|> ignore } else if(aircraft[i].die()){ score.val=score.val+@antity.get_score(aircraft[i].type_) aircraft.remove(i)|> ignore //特效 } } for i=bullet.length()-1;i>=0;i=i-1{ if(bullet[i].is_out_all()){ bullet.remove(i)|> ignore } } for i=bullet_my.length()-1;i>=0;i=i-1{ if(bullet_my[i].is_out_all()){ bullet_my.remove(i)|> ignore } } for i=cartridge.length()-1;i>=0;i=i-1{ if(cartridge[i].is_out_all()){ cartridge.remove(i)|> ignore } } // for i=laser.length()-1;i>=0;i=i-1{ // //waiting // } //生成############################################################################################################## generate_plane() if(random.uint(limit =1000)<=3){ generate_cartridge() } for i=aircraft.length()-1;i>=0;i=i-1{ shoot(aircraft[i]) } shoot(player_plane) //子弹袋生成!!! //临时参数显示 // @wasm4.text(bullet_my.length().to_string(),0,0) // @wasm4.text(bullet.length().to_string(),0,8) // @wasm4.text(aircraft.length().to_string(),0,16) // @wasm4.text(player_plane.hp.to_string(),0,24) // @wasm4.text(bullet_crashed_my.length().to_string(),0,32) // @wasm4.text(bullet_crashed.length().to_string(),0,40) // @wasm4.text(ttime.val.to_string(),0,0) } //打印############################################################################################################## for i=bullet.length()-1;i>=0;i=i-1{ bullet[i].print() } for i=bullet_my.length()-1;i>=0;i=i-1{ bullet_my[i].print() } if(died.val.not()){player_plane.print()} for i=aircraft.length()-1;i>=0;i=i-1{ aircraft[i].print() } // for i=laser.length()-1;i>=0;i=i-1{ // laser[i].print() // } for i=cartridge.length()-1;i>=0;i=i-1{ cartridge[i].print() } died.val=died.val||player_plane.die() //状态栏###################################################################################################### // column() @wasm4.text(score.val.to_string(),0,10) @wasm4.text("Score",0,0) @wasm4.text("HP: ",0,150) @wasm4.text((((player_plane.hp*100).to_int().to_double())/100.0).to_string(),20,150) // @wasm4.text(ttime.val.to_string(),90,150) // @wasm4.text("Frames",120,150) @wasm4.text((((ttime.val.to_double()/60.0*100).to_int()).to_double()/100).to_string()+"s",110,150) } //生成################################################################################################################################################ // let generate_planelist: FixedArray[Int]=[5,4,12] fn generate_plane()->Unit{ let mut type_:Int=0; if(random.uint(limit=1000)>=20) {return} if(random.uint(limit=100)<=60) {type_=4} else { if(random.uint(limit=100)>=30){ type_=5 } else {type_=12} } let x={ ..@antity.plans(type_), pos:@antity.Location::new( x=get_rand(), y=0,type_.reinterpret_as_uint() ), } while(x.is_out_partly()) { x.pos.x=get_rand() } aircraft.push(x) } fn shoot(plane:@antity.Aircraft)->Unit{ for i=plane.bullet_exit_point.length()-1;i>=0;i=i-1{ if(plane.bullet_exit_point[i].last_shoot>=plane.bullet_exit_point[i].shoot_speed) { if(plane.type_==3) { bullet_my.push({ ..@antity.bullet(plane.bullet_exit_point[i].type_), pos:@antity.Location::new( x=plane.bullet_exit_point[i].x.to_double()+plane.pos.x, y=plane.bullet_exit_point[i].y.to_double()+plane.pos.y, plane.bullet_exit_point[i].type_.reinterpret_as_uint()) })} else { let mut omg:Double=@math.atan((plane.bullet_exit_point[i].y.to_double()+plane.pos.y-player_plane.pos.y)/(plane.bullet_exit_point[i].x.to_double()+plane.pos.x-player_plane.pos.x))*57.30 if(plane.pos.x>=player_plane.pos.x){ omg=omg+180} bullet.push({ ..@antity.bullet(plane.bullet_exit_point[i].type_), pos:@antity.Location::new( x=plane.bullet_exit_point[i].x.to_double()+plane.pos.x, y=plane.bullet_exit_point[i].y.to_double()+plane.pos.y, plane.bullet_exit_point[i].type_.reinterpret_as_uint()), dir:omg})} plane.bullet_exit_point[i].last_shoot=plane.bullet_exit_point[i].last_shoot%plane.bullet_exit_point[i].shoot_speed update_shoot(plane) } else {plane.bullet_exit_point[i].last_shoot=plane.bullet_exit_point[i].last_shoot+1} } } fn update_shoot(plane:@antity.Aircraft)->Unit{ if(plane.type_==4) {return} for i=plane.bullet_exit_point.length()-1;i>=0;i=i-1{ if(plane.bullet_exit_point[i].limit==0){ plane.bullet_exit_point.remove(i) |> ignore continue; } if(plane.bullet_exit_point[i].limit==-1) {continue;} plane.bullet_exit_point[i].limit=plane.bullet_exit_point[i].limit-1; } if(plane.bullet_exit_point.length()==0){ let lin=@antity.default_bullet(plane.type_) plane.bullet_exit_point.resize(lin.length(),@antity.Bullet_exit_point::new(1,1,1,1,1)) for i=plane.bullet_exit_point.length()-1;i>=0;i=i-1{ plane.bullet_exit_point[i]={..@antity.default_bullet(plane.type_)[i]} } } } fn generate_cartridge()->Unit{ if(random.uint(limit =100)<=20){ let x={ ..@antity.cartridge(8), pos:@antity.Location::new( x=get_rand(), y=0, 8 ) } while(x.is_out_partly()) { x.pos.x=get_rand() } cartridge.push(x) return } if(random.uint(limit =100)<=20){ let x={ ..@antity.cartridge(6), pos:@antity.Location::new( x=get_rand(), y=0, 6 ) } while(x.is_out_partly()) { x.pos.x=get_rand() } cartridge.push(x) return } if(random.uint(limit =100)<=20){ let x={ ..@antity.cartridge(7), pos:@antity.Location::new( x=get_rand(), y=0, 7 ) } while(x.is_out_partly()) { x.pos.x=get_rand() } cartridge.push(x) return } } //生成################################################################################################################################################ //自身飞机操作控制######################################################################################################################################## fn update_self()->Unit{ let mut dir:Double=0; if (button_state.val.button_down&&button_state.val.button_up).not()&&(button_state.val.button_down||button_state.val.button_up){ if button_state.val.button_down { if (button_state.val.button_right||button_state.val.button_left).not()||(button_state.val.button_right&&button_state.val.button_left) {dir=90} else if(button_state.val.button_right){ dir=45; } else if button_state.val.button_left {dir=135.0;} } else{ if (button_state.val.button_right||button_state.val.button_left).not()||(button_state.val.button_right&&button_state.val.button_left) {dir=270} else if(button_state.val.button_right){ dir=360.0-45; } else if button_state.val.button_left {dir=225;} } } else{ if button_state.val.button_right {dir=0} else if button_state.val.button_left {dir=180} } player_plane.dir=dir player_plane.update_pos() } //自身飞机操作控制######################################################################################################################################## //Game Over######################################################################################################################################################################### fn game_over()->Unit{ @wasm4.text("Score:"+score.val.to_string(),2,55) @wasm4.text("Time:"+(((ttime.val.to_double()/60.0*100).to_int()).to_double()/100).to_string()+"s",2,68) @wasm4.text("Press R to restart.",2,82) @wasm4.text("U DIED",50,30) @wasm4.text("If u get a crush",8,120) @wasm4.text("Kill more enemies.",10,130) } //Game Over######################################################################################################################################################################### ================================================ FILE: teams/天地一!屋!大爱盟/src/interface/interface_control.mbt ================================================ pub let interface_type:Ref[Int]=Ref::new(1); let button_state:Ref[@wasm4.GamePad]=Ref::new(@wasm4.GamePad::default()) // pub let pubsound_effects:@immut/priority_queue.T[@antity.ToneForPub]=@immut/priority_queue.new(); pub let low_y=150 let interface_gaming1:Int=1 pub fn interface()->Unit{ button_state.val=@wasm4.get_gamepad() if interface_type.val==interface_gaming1 {gaming1()} } ================================================ FILE: teams/天地一!屋!大爱盟/src/interface/moon.pkg.json ================================================ { "import": [ "moonbitlang/wasm4", {"path": "GAME/antity","alias": "antity"}, "GAME/time_cnt" ] } ================================================ FILE: teams/天地一!屋!大爱盟/src/moon.pkg.json ================================================ { "import": [ "moonbitlang/wasm4", "GAME/interface", "GAME/time_cnt" ], "link": { "wasm": { "exports": [ "start", "update" ], "import-memory": { "module": "env", "name": "memory" }, "heap-start-address": 6560 } } } ================================================ FILE: teams/天地一!屋!大爱盟/src/time_cnt/moon.pkg.json ================================================ { "import": [ "moonbitlang/wasm4" ] } ================================================ FILE: teams/天地一!屋!大爱盟/src/time_cnt/timer.mbt ================================================ let frame_cnt:Ref[UInt]=Ref::new(0) pub fn update_time()->Unit{ frame_cnt.val=frame_cnt.val+1; } pub fn get_time()->UInt{ frame_cnt.val } ================================================ FILE: teams/天地一!屋!大爱盟/src/top.mbt ================================================ pub fn start() -> Unit { @wasm4.set_palette(1,@wasm4.rgb(1377129)) @wasm4.set_palette(4,@wasm4.rgb(11221214)) @wasm4.set_palette(3,@wasm4.rgb(16754473)) @wasm4.set_palette(2,@wasm4.rgb(5224703)) //初始化调色板,之后调色板禁止更改!! } pub fn update() -> Unit { // @wasm4.trace("312312") @time_cnt.update_time(); // @antity.player_Plane_1_frame.print() @interface.interface() // @antity.player_Plane.print() } ================================================ FILE: teams/天地一!屋!大爱盟/title ================================================ 飞机大战 ================================================ FILE: teams/极品杏鲍菇/README.md ================================================ # 极品杏鲍菇 ## 游戏操控 玩家回合: 1. 消耗行动点(左下角展示)可以进行左右移动(左右方向键) 2.上下方向键可以调整射击角度 3.按住X可以进行蓄力,松开后进行射击 4.注意横风对弹道的影响 ================================================ FILE: teams/极品杏鲍菇/control ================================================ 左右键移动,上下键调整射击角度,X键按住蓄力,松开射击。注意风向的影响 ================================================ FILE: teams/极品杏鲍菇/title ================================================ 极品杏鲍菇 ================================================ FILE: vite.config.mjs ================================================ import { defineConfig } from 'vite' import chokidar from 'chokidar' import cp from 'node:child_process' /** * @type {import('vite').Plugin} */ const plugin = { buildStart() { cp.execSync('tsx src/build.mts', { stdio: 'inherit' }) chokidar.watch(['src', 'teams']).on('all', (event, path) => { cp.execSync('tsx src/build.mts', { stdio: 'inherit' }) }) }, } export default defineConfig({ root: 'dist', plugins: [plugin], })