Merge remote-tracking branch 'misskey-original/develop' into develop

This commit is contained in:
mattyatea 2024-01-21 13:44:29 +09:00
commit 6390977653
29 changed files with 1057 additions and 560 deletions

View file

@ -38,6 +38,7 @@
- Enhance: 絵文字ピッカー・オートコンプリートで、完全一致した絵文字を優先的に表示するように - Enhance: 絵文字ピッカー・オートコンプリートで、完全一致した絵文字を優先的に表示するように
- Enhance: Playの説明欄にMFMを使えるように - Enhance: Playの説明欄にMFMを使えるように
- Enhance: チャンネルノートの場合は詳細ページからその前後のノートを見れるように - Enhance: チャンネルノートの場合は詳細ページからその前後のノートを見れるように
- Enhance: ノート作成画面のファイル添付メニューから直接ファイルを削除できるように
- Enhance: MFMの属性でオートコンプリートが使用できるように #12735 - Enhance: MFMの属性でオートコンプリートが使用できるように #12735
- Fix: ネイティブモードの絵文字がモノクロにならないように - Fix: ネイティブモードの絵文字がモノクロにならないように
- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正 - Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正
@ -57,6 +58,9 @@
- Fix: ipv4とipv6の両方が利用可能な環境でallowedPrivateNetworksが設定されていた場合プライベートipの検証ができていなかった問題を修正 - Fix: ipv4とipv6の両方が利用可能な環境でallowedPrivateNetworksが設定されていた場合プライベートipの検証ができていなかった問題を修正
- Fix: properly handle cc followers - Fix: properly handle cc followers
### Service Worker
- Enhance: オフライン表示のデザインを改善・多言語対応
## 2023.12.2 ## 2023.12.2
### General ### General

View file

@ -24,6 +24,8 @@ COPY --link ["packages/backend/package.json", "./packages/backend/"]
COPY --link ["packages/frontend/package.json", "./packages/frontend/"] COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
COPY --link ["packages/sw/package.json", "./packages/sw/"] COPY --link ["packages/sw/package.json", "./packages/sw/"]
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"] COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm i --frozen-lockfile --aggregate-output pnpm i --frozen-lockfile --aggregate-output
@ -52,6 +54,8 @@ COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
COPY --link ["scripts", "./scripts"] COPY --link ["scripts", "./scripts"]
COPY --link ["packages/backend/package.json", "./packages/backend/"] COPY --link ["packages/backend/package.json", "./packages/backend/"]
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"] COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm i --frozen-lockfile --aggregate-output pnpm i --frozen-lockfile --aggregate-output
@ -79,8 +83,12 @@ WORKDIR /misskey
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/built ./packages/misskey-js/built COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/built ./packages/misskey-js/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
COPY --chown=misskey:misskey . ./ COPY --chown=misskey:misskey . ./

26
locales/index.d.ts vendored
View file

@ -580,6 +580,10 @@ export interface Locale extends ILocale {
* *
*/ */
"attachCancel": string; "attachCancel": string;
/**
*
*/
"deleteFile": string;
/** /**
* *
*/ */
@ -9777,6 +9781,10 @@ export interface Locale extends ILocale {
* *
*/ */
"surrendered": string; "surrendered": string;
/**
*
*/
"timeout": string;
/** /**
* *
*/ */
@ -9829,6 +9837,10 @@ export interface Locale extends ILocale {
* *
*/ */
"canPutEverywhere": string; "canPutEverywhere": string;
/**
* 1
*/
"timeLimitForEachTurn": string;
/** /**
* *
*/ */
@ -9837,6 +9849,20 @@ export interface Locale extends ILocale {
* *
*/ */
"lookingForPlayer": string; "lookingForPlayer": string;
/**
*
*/
"gameCanceled": string;
};
"_offlineScreen": {
/**
* -
*/
"title": string;
/**
*
*/
"header": string;
}; };
} }
declare const locales: { declare const locales: {

View file

@ -141,6 +141,7 @@ overwriteFromPinnedEmojis: "全般設定から上書きする"
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。" reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
rememberNoteVisibility: "公開範囲を記憶する" rememberNoteVisibility: "公開範囲を記憶する"
attachCancel: "添付取り消し" attachCancel: "添付取り消し"
deleteFile: "ファイルを削除"
markAsSensitive: "センシティブとして設定" markAsSensitive: "センシティブとして設定"
unmarkAsSensitive: "センシティブを解除する" unmarkAsSensitive: "センシティブを解除する"
enterFileName: "ファイル名を入力" enterFileName: "ファイル名を入力"
@ -2603,6 +2604,7 @@ _reversi:
pastTurnOf: "{name}のターン" pastTurnOf: "{name}のターン"
surrender: "投了" surrender: "投了"
surrendered: "投了により" surrendered: "投了により"
timeout: "時間切れ"
drawn: "引き分け" drawn: "引き分け"
won: "{name}の勝ち" won: "{name}の勝ち"
black: "黒" black: "黒"
@ -2616,5 +2618,11 @@ _reversi:
isLlotheo: "石の少ない方が勝ち(ロセオ)" isLlotheo: "石の少ない方が勝ち(ロセオ)"
loopedMap: "ループマップ" loopedMap: "ループマップ"
canPutEverywhere: "どこでも置けるモード" canPutEverywhere: "どこでも置けるモード"
timeLimitForEachTurn: "1ターンの時間制限"
freeMatch: "フリーマッチ" freeMatch: "フリーマッチ"
lookingForPlayer: "対戦相手を探しています" lookingForPlayer: "対戦相手を探しています"
gameCanceled: "対局がキャンセルされました"
_offlineScreen:
title: "オフライン - サーバーに接続できません"
header: "サーバーに接続できません"

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi31705793785675 {
name = 'Reversi31705793785675'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "surrendered" TO "surrenderedUserId"`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "timeoutUserId" character varying(32)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "timeoutUserId"`);
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "surrenderedUserId" TO "surrendered"`);
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi41705794768153 {
name = 'Reversi41705794768153'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "endedAt" TIMESTAMP WITH TIME ZONE`);
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."endedAt" IS 'The ended date of the ReversiGame.'`);
}
async down(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."endedAt" IS 'The ended date of the ReversiGame.'`);
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "endedAt"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi51705798904141 {
name = 'Reversi51705798904141'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "timeLimitForEachTurn" smallint NOT NULL DEFAULT '90'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "timeLimitForEachTurn"`);
}
}

View file

@ -181,9 +181,6 @@ export interface ReversiGameEventTypes {
value: any; value: any;
}; };
log: Reversi.Serializer.Log & { id: string | null }; log: Reversi.Serializer.Log & { id: string | null };
syncState: {
crc32: string;
};
started: { started: {
game: Packed<'ReversiGameDetailed'>; game: Packed<'ReversiGameDetailed'>;
}; };
@ -191,6 +188,9 @@ export interface ReversiGameEventTypes {
winnerId: MiUser['id'] | null; winnerId: MiUser['id'] | null;
game: Packed<'ReversiGameDetailed'>; game: Packed<'ReversiGameDetailed'>;
}; };
canceled: {
userId: MiUser['id'];
};
} }
//#endregion //#endregion

View file

@ -25,6 +25,7 @@ import { GlobalEventService } from '@/core/GlobalEventService.js';
import { IdService } from '@/core/IdService.js'; import { IdService } from '@/core/IdService.js';
import type { Packed } from '@/misc/json-schema.js'; import type { Packed } from '@/misc/json-schema.js';
import { NotificationService } from '@/core/NotificationService.js'; import { NotificationService } from '@/core/NotificationService.js';
import { Serialized } from '@/types.js';
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js'; import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common'; import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
@ -55,6 +56,16 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
this.notificationService = this.moduleRef.get(NotificationService.name); this.notificationService = this.moduleRef.get(NotificationService.name);
} }
@bindThis
private async cacheGame(game: MiReversiGame) {
await this.redisClient.setex(`reversi:game:cache:${game.id}`, 60 * 3, JSON.stringify(game));
}
@bindThis
private async deleteGameCache(gameId: MiReversiGame['id']) {
await this.redisClient.del(`reversi:game:cache:${gameId}`);
}
@bindThis @bindThis
public async matchSpecificUser(me: MiUser, targetUser: MiUser): Promise<MiReversiGame | null> { public async matchSpecificUser(me: MiUser, targetUser: MiUser): Promise<MiReversiGame | null> {
if (targetUser.id === me.id) { if (targetUser.id === me.id) {
@ -83,6 +94,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
bw: 'random', bw: 'random',
isLlotheo: false, isLlotheo: false,
}).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0])); }).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0]));
this.cacheGame(game);
const packed = await this.reversiGameEntityService.packDetail(game, { id: targetUser.id }); const packed = await this.reversiGameEntityService.packDetail(game, { id: targetUser.id });
this.globalEventService.publishReversiStream(targetUser.id, 'matched', { game: packed }); this.globalEventService.publishReversiStream(targetUser.id, 'matched', { game: packed });
@ -125,6 +137,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
bw: 'random', bw: 'random',
isLlotheo: false, isLlotheo: false,
}).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0])); }).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0]));
this.cacheGame(game);
const packed = await this.reversiGameEntityService.packDetail(game, { id: invitorId }); const packed = await this.reversiGameEntityService.packDetail(game, { id: invitorId });
this.globalEventService.publishReversiStream(invitorId, 'matched', { game: packed }); this.globalEventService.publishReversiStream(invitorId, 'matched', { game: packed });
@ -160,6 +173,7 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
bw: 'random', bw: 'random',
isLlotheo: false, isLlotheo: false,
}).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0])); }).then(x => this.reversiGamesRepository.findOneByOrFail(x.identifiers[0]));
this.cacheGame(game);
const packed = await this.reversiGameEntityService.packDetail(game, { id: matchedUserId }); const packed = await this.reversiGameEntityService.packDetail(game, { id: matchedUserId });
this.globalEventService.publishReversiStream(matchedUserId, 'matched', { game: packed }); this.globalEventService.publishReversiStream(matchedUserId, 'matched', { game: packed });
@ -182,33 +196,47 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
} }
@bindThis @bindThis
public async gameReady(game: MiReversiGame, user: MiUser, ready: boolean) { public async gameReady(gameId: MiReversiGame['id'], user: MiUser, ready: boolean) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return; if (game.isStarted) return;
let isBothReady = false; let isBothReady = false;
if (game.user1Id === user.id) { if (game.user1Id === user.id) {
await this.reversiGamesRepository.update(game.id, { const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
user1Ready: ready, .set({
}); user1Ready: ready,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', { this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', {
user1: ready, user1: ready,
user2: game.user2Ready, user2: updatedGame.user2Ready,
}); });
if (ready && game.user2Ready) isBothReady = true; if (ready && updatedGame.user2Ready) isBothReady = true;
} else if (game.user2Id === user.id) { } else if (game.user2Id === user.id) {
await this.reversiGamesRepository.update(game.id, { const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
user2Ready: ready, .set({
}); user2Ready: ready,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', { this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', {
user1: game.user1Ready, user1: updatedGame.user1Ready,
user2: ready, user2: ready,
}); });
if (ready && game.user1Ready) isBothReady = true; if (ready && updatedGame.user1Ready) isBothReady = true;
} else { } else {
return; return;
} }
@ -216,71 +244,93 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
if (isBothReady) { if (isBothReady) {
// 3秒後、両者readyならゲーム開始 // 3秒後、両者readyならゲーム開始
setTimeout(async () => { setTimeout(async () => {
const freshGame = await this.reversiGamesRepository.findOneBy({ id: game.id }); const freshGame = await this.get(game.id);
if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return; if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return;
if (!freshGame.user1Ready || !freshGame.user2Ready) return; if (!freshGame.user1Ready || !freshGame.user2Ready) return;
let bw: number; this.startGame(freshGame);
if (freshGame.bw === 'random') {
bw = Math.random() > 0.5 ? 1 : 2;
} else {
bw = parseInt(freshGame.bw, 10);
}
function getRandomMap() {
const mapCount = Object.entries(Reversi.maps).length;
const rnd = Math.floor(Math.random() * mapCount);
return Object.values(Reversi.maps)[rnd].data;
}
const map = freshGame.map != null ? freshGame.map : getRandomMap();
const crc32 = CRC32.str(JSON.stringify(freshGame.logs)).toString();
await this.reversiGamesRepository.update(game.id, {
startedAt: new Date(),
isStarted: true,
black: bw,
map: map,
crc32,
});
//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
const o = new Reversi.Game(map, {
isLlotheo: freshGame.isLlotheo,
canPutEverywhere: freshGame.canPutEverywhere,
loopedBoard: freshGame.loopedBoard,
});
if (o.isEnded) {
let winner;
if (o.winner === true) {
winner = freshGame.black === 1 ? freshGame.user1Id : freshGame.user2Id;
} else if (o.winner === false) {
winner = freshGame.black === 1 ? freshGame.user2Id : freshGame.user1Id;
} else {
winner = null;
}
await this.reversiGamesRepository.update(game.id, {
isEnded: true,
winnerId: winner,
});
this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winner,
game: await this.reversiGameEntityService.packDetail(game.id, user),
});
}
//#endregion
this.globalEventService.publishReversiGameStream(game.id, 'started', {
game: await this.reversiGameEntityService.packDetail(game.id, user),
});
}, 3000); }, 3000);
} }
} }
@bindThis
private async startGame(game: MiReversiGame) {
let bw: number;
if (game.bw === 'random') {
bw = Math.random() > 0.5 ? 1 : 2;
} else {
bw = parseInt(game.bw, 10);
}
function getRandomMap() {
const mapCount = Object.entries(Reversi.maps).length;
const rnd = Math.floor(Math.random() * mapCount);
return Object.values(Reversi.maps)[rnd].data;
}
const map = game.map != null ? game.map : getRandomMap();
const crc32 = CRC32.str(JSON.stringify(game.logs)).toString();
const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
startedAt: new Date(),
isStarted: true,
black: bw,
map: map,
crc32,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
const engine = new Reversi.Game(map, {
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
});
if (engine.isEnded) {
let winner;
if (engine.winner === true) {
winner = bw === 1 ? game.user1Id : game.user2Id;
} else if (engine.winner === false) {
winner = bw === 1 ? game.user2Id : game.user1Id;
} else {
winner = null;
}
const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
isEnded: true,
endedAt: new Date(),
winnerId: winner,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winner,
game: await this.reversiGameEntityService.packDetail(game.id),
});
return;
}
//#endregion
this.redisClient.setex(`reversi:game:turnTimer:${game.id}:1`, updatedGame.timeLimitForEachTurn, '');
this.globalEventService.publishReversiGameStream(game.id, 'started', {
game: await this.reversiGameEntityService.packDetail(game.id),
});
}
@bindThis @bindThis
public async getInvitations(user: MiUser): Promise<MiUser['id'][]> { public async getInvitations(user: MiUser): Promise<MiUser['id'][]> {
const invitations = await this.redisClient.zrange( const invitations = await this.redisClient.zrange(
@ -292,17 +342,27 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
} }
@bindThis @bindThis
public async updateSettings(game: MiReversiGame, user: MiUser, key: string, value: any) { public async updateSettings(gameId: MiReversiGame['id'], user: MiUser, key: string, value: any) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return; if (game.isStarted) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return; if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
if ((game.user1Id === user.id) && game.user1Ready) return; if ((game.user1Id === user.id) && game.user1Ready) return;
if ((game.user2Id === user.id) && game.user2Ready) return; if ((game.user2Id === user.id) && game.user2Ready) return;
if (!['map', 'bw', 'isLlotheo', 'canPutEverywhere', 'loopedBoard'].includes(key)) return; if (!['map', 'bw', 'isLlotheo', 'canPutEverywhere', 'loopedBoard', 'timeLimitForEachTurn'].includes(key)) return;
await this.reversiGamesRepository.update(game.id, { // TODO: より厳格なバリデーション
[key]: value,
}); const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
[key]: value,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'updateSettings', { this.globalEventService.publishReversiGameStream(game.id, 'updateSettings', {
userId: user.id, userId: user.id,
@ -312,7 +372,9 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
} }
@bindThis @bindThis
public async putStoneToGame(game: MiReversiGame, user: MiUser, pos: number, id?: string | null) { public async putStoneToGame(gameId: MiReversiGame['id'], user: MiUser, pos: number, id?: string | null) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (!game.isStarted) return; if (!game.isStarted) return;
if (game.isEnded) return; if (game.isEnded) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return; if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
@ -361,12 +423,18 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
const crc32 = CRC32.str(JSON.stringify(serializeLogs)).toString(); const crc32 = CRC32.str(JSON.stringify(serializeLogs)).toString();
await this.reversiGamesRepository.update(game.id, { const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
crc32, .set({
isEnded: engine.isEnded, crc32,
winnerId: winner, isEnded: engine.isEnded,
logs: serializeLogs, winnerId: winner,
}); logs: serializeLogs,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'log', { this.globalEventService.publishReversiGameStream(game.id, 'log', {
...log, ...log,
@ -376,33 +444,127 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
if (engine.isEnded) { if (engine.isEnded) {
this.globalEventService.publishReversiGameStream(game.id, 'ended', { this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winner ?? null, winnerId: winner ?? null,
game: await this.reversiGameEntityService.packDetail(game.id, user), game: await this.reversiGameEntityService.packDetail(game.id),
}); });
} else {
this.redisClient.setex(`reversi:game:turnTimer:${game.id}:${engine.turn ? '1' : '0'}`, updatedGame.timeLimitForEachTurn, '');
} }
} }
@bindThis @bindThis
public async surrender(game: MiReversiGame, user: MiUser) { public async surrender(gameId: MiReversiGame['id'], user: MiUser) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isEnded) return; if (game.isEnded) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return; if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
const winnerId = game.user1Id === user.id ? game.user2Id : game.user1Id; const winnerId = game.user1Id === user.id ? game.user2Id : game.user1Id;
await this.reversiGamesRepository.update(game.id, { const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
surrendered: user.id, .set({
isEnded: true, isEnded: true,
winnerId: winnerId, endedAt: new Date(),
}); winnerId: winnerId,
surrenderedUserId: user.id,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'ended', { this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winnerId, winnerId: winnerId,
game: await this.reversiGameEntityService.packDetail(game.id, user), game: await this.reversiGameEntityService.packDetail(game.id),
}); });
} }
@bindThis @bindThis
public async get(id: MiReversiGame['id']) { public async checkTimeout(gameId: MiReversiGame['id']) {
return this.reversiGamesRepository.findOneBy({ id }); const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isEnded) return;
const engine = Reversi.Serializer.restoreGame({
map: game.map,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
logs: game.logs,
});
if (engine.turn == null) return;
const timer = await this.redisClient.exists(`reversi:game:turnTimer:${game.id}:${engine.turn ? '1' : '0'}`);
if (timer === 0) {
const winnerId = engine.turn ? (game.black === 1 ? game.user2Id : game.user1Id) : (game.black === 1 ? game.user1Id : game.user2Id);
const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
isEnded: true,
endedAt: new Date(),
winnerId: winnerId,
timeoutUserId: engine.turn ? (game.black === 1 ? game.user1Id : game.user2Id) : (game.black === 1 ? game.user2Id : game.user1Id),
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winnerId,
game: await this.reversiGameEntityService.packDetail(game.id),
});
}
}
@bindThis
public async cancelGame(gameId: MiReversiGame['id'], user: MiUser) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
await this.reversiGamesRepository.delete(game.id);
this.deleteGameCache(game.id);
this.globalEventService.publishReversiGameStream(game.id, 'canceled', {
userId: user.id,
});
}
@bindThis
public async get(id: MiReversiGame['id']): Promise<MiReversiGame | null> {
const cached = await this.redisClient.get(`reversi:game:cache:${id}`);
if (cached != null) {
const parsed = JSON.parse(cached) as Serialized<MiReversiGame>;
return {
...parsed,
startedAt: parsed.startedAt != null ? new Date(parsed.startedAt) : null,
endedAt: parsed.endedAt != null ? new Date(parsed.endedAt) : null,
};
} else {
const game = await this.reversiGamesRepository.findOneBy({ id });
if (game == null) return null;
this.cacheGame(game);
return game;
}
}
@bindThis
public async checkCrc(gameId: MiReversiGame['id'], crc32: string | number) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (crc32.toString() !== game.crc32) {
return await this.reversiGameEntityService.packDetail(game);
} else {
return null;
}
} }
@bindThis @bindThis

View file

@ -37,6 +37,7 @@ export class ReversiGameEntityService {
id: game.id, id: game.id,
createdAt: this.idService.parse(game.id).date.toISOString(), createdAt: this.idService.parse(game.id).date.toISOString(),
startedAt: game.startedAt && game.startedAt.toISOString(), startedAt: game.startedAt && game.startedAt.toISOString(),
endedAt: game.endedAt && game.endedAt.toISOString(),
isStarted: game.isStarted, isStarted: game.isStarted,
isEnded: game.isEnded, isEnded: game.isEnded,
form1: game.form1, form1: game.form1,
@ -49,12 +50,14 @@ export class ReversiGameEntityService {
user2: this.userEntityService.pack(game.user2Id, me), user2: this.userEntityService.pack(game.user2Id, me),
winnerId: game.winnerId, winnerId: game.winnerId,
winner: game.winnerId ? this.userEntityService.pack(game.winnerId, me) : null, winner: game.winnerId ? this.userEntityService.pack(game.winnerId, me) : null,
surrendered: game.surrendered, surrenderedUserId: game.surrenderedUserId,
timeoutUserId: game.timeoutUserId,
black: game.black, black: game.black,
bw: game.bw, bw: game.bw,
isLlotheo: game.isLlotheo, isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere, canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard, loopedBoard: game.loopedBoard,
timeLimitForEachTurn: game.timeLimitForEachTurn,
logs: game.logs, logs: game.logs,
map: game.map, map: game.map,
}); });
@ -79,6 +82,7 @@ export class ReversiGameEntityService {
id: game.id, id: game.id,
createdAt: this.idService.parse(game.id).date.toISOString(), createdAt: this.idService.parse(game.id).date.toISOString(),
startedAt: game.startedAt && game.startedAt.toISOString(), startedAt: game.startedAt && game.startedAt.toISOString(),
endedAt: game.endedAt && game.endedAt.toISOString(),
isStarted: game.isStarted, isStarted: game.isStarted,
isEnded: game.isEnded, isEnded: game.isEnded,
form1: game.form1, form1: game.form1,
@ -91,12 +95,14 @@ export class ReversiGameEntityService {
user2: this.userEntityService.pack(game.user2Id, me), user2: this.userEntityService.pack(game.user2Id, me),
winnerId: game.winnerId, winnerId: game.winnerId,
winner: game.winnerId ? this.userEntityService.pack(game.winnerId, me) : null, winner: game.winnerId ? this.userEntityService.pack(game.winnerId, me) : null,
surrendered: game.surrendered, surrenderedUserId: game.surrenderedUserId,
timeoutUserId: game.timeoutUserId,
black: game.black, black: game.black,
bw: game.bw, bw: game.bw,
isLlotheo: game.isLlotheo, isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere, canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard, loopedBoard: game.loopedBoard,
timeLimitForEachTurn: game.timeLimitForEachTurn,
}); });
} }

View file

@ -13,6 +13,12 @@ export class MiReversiGame {
}) })
public startedAt: Date | null; public startedAt: Date | null;
@Column('timestamp with time zone', {
nullable: true,
comment: 'The ended date of the ReversiGame.',
})
public endedAt: Date | null;
@Column(id()) @Column(id())
public user1Id: MiUser['id']; public user1Id: MiUser['id'];
@ -71,7 +77,19 @@ export class MiReversiGame {
...id(), ...id(),
nullable: true, nullable: true,
}) })
public surrendered: MiUser['id'] | null; public surrenderedUserId: MiUser['id'] | null;
@Column({
...id(),
nullable: true,
})
public timeoutUserId: MiUser['id'] | null;
// in sec
@Column('smallint', {
default: 90,
})
public timeLimitForEachTurn: number;
@Column('jsonb', { @Column('jsonb', {
default: [], default: [],

View file

@ -21,6 +21,11 @@ export const packedReversiGameLiteSchema = {
optional: false, nullable: true, optional: false, nullable: true,
format: 'date-time', format: 'date-time',
}, },
endedAt: {
type: 'string',
optional: false, nullable: true,
format: 'date-time',
},
isStarted: { isStarted: {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
@ -75,7 +80,12 @@ export const packedReversiGameLiteSchema = {
optional: false, nullable: true, optional: false, nullable: true,
ref: 'User', ref: 'User',
}, },
surrendered: { surrenderedUserId: {
type: 'string',
optional: false, nullable: true,
format: 'id',
},
timeoutUserId: {
type: 'string', type: 'string',
optional: false, nullable: true, optional: false, nullable: true,
format: 'id', format: 'id',
@ -100,6 +110,10 @@ export const packedReversiGameLiteSchema = {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
}, },
timeLimitForEachTurn: {
type: 'number',
optional: false, nullable: false,
},
}, },
} as const; } as const;
@ -121,6 +135,11 @@ export const packedReversiGameDetailedSchema = {
optional: false, nullable: true, optional: false, nullable: true,
format: 'date-time', format: 'date-time',
}, },
endedAt: {
type: 'string',
optional: false, nullable: true,
format: 'date-time',
},
isStarted: { isStarted: {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
@ -175,7 +194,12 @@ export const packedReversiGameDetailedSchema = {
optional: false, nullable: true, optional: false, nullable: true,
ref: 'User', ref: 'User',
}, },
surrendered: { surrenderedUserId: {
type: 'string',
optional: false, nullable: true,
format: 'id',
},
timeoutUserId: {
type: 'string', type: 'string',
optional: false, nullable: true, optional: false, nullable: true,
format: 'id', format: 'id',
@ -200,6 +224,10 @@ export const packedReversiGameDetailedSchema = {
type: 'boolean', type: 'boolean',
optional: false, nullable: false, optional: false, nullable: false,
}, },
timeLimitForEachTurn: {
type: 'number',
optional: false, nullable: false,
},
logs: { logs: {
type: 'array', type: 'array',
optional: false, nullable: false, optional: false, nullable: false,

View file

@ -62,7 +62,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.accessDenied); throw new ApiError(meta.errors.accessDenied);
} }
await this.reversiService.surrender(game, me); await this.reversiService.surrender(game.id, me);
}); });
} }
} }

View file

@ -32,11 +32,6 @@ class ReversiGameChannel extends Channel {
public async init(params: any) { public async init(params: any) {
this.gameId = params.gameId as string; this.gameId = params.gameId as string;
const game = await this.reversiGamesRepository.findOneBy({
id: this.gameId,
});
if (game == null) return;
this.subscriber.on(`reversiGameStream:${this.gameId}`, this.send); this.subscriber.on(`reversiGameStream:${this.gameId}`, this.send);
} }
@ -45,8 +40,10 @@ class ReversiGameChannel extends Channel {
switch (type) { switch (type) {
case 'ready': this.ready(body); break; case 'ready': this.ready(body); break;
case 'updateSettings': this.updateSettings(body.key, body.value); break; case 'updateSettings': this.updateSettings(body.key, body.value); break;
case 'cancel': this.cancelGame(); break;
case 'putStone': this.putStone(body.pos, body.id); break; case 'putStone': this.putStone(body.pos, body.id); break;
case 'syncState': this.syncState(body.crc32); break; case 'checkState': this.checkState(body.crc32); break;
case 'claimTimeIsUp': this.claimTimeIsUp(); break;
} }
} }
@ -54,47 +51,47 @@ class ReversiGameChannel extends Channel {
private async updateSettings(key: string, value: any) { private async updateSettings(key: string, value: any) {
if (this.user == null) return; if (this.user == null) return;
// TODO: キャッシュしたい this.reversiService.updateSettings(this.gameId!, this.user, key, value);
const game = await this.reversiGamesRepository.findOneBy({ id: this.gameId! });
if (game == null) throw new Error('game not found');
this.reversiService.updateSettings(game, this.user, key, value);
} }
@bindThis @bindThis
private async ready(ready: boolean) { private async ready(ready: boolean) {
if (this.user == null) return; if (this.user == null) return;
const game = await this.reversiGamesRepository.findOneBy({ id: this.gameId! }); this.reversiService.gameReady(this.gameId!, this.user, ready);
if (game == null) throw new Error('game not found'); }
this.reversiService.gameReady(game, this.user, ready); @bindThis
private async cancelGame() {
if (this.user == null) return;
this.reversiService.cancelGame(this.gameId!, this.user);
} }
@bindThis @bindThis
private async putStone(pos: number, id: string) { private async putStone(pos: number, id: string) {
if (this.user == null) return; if (this.user == null) return;
// TODO: キャッシュしたい this.reversiService.putStoneToGame(this.gameId!, this.user, pos, id);
const game = await this.reversiGamesRepository.findOneBy({ id: this.gameId! });
if (game == null) throw new Error('game not found');
this.reversiService.putStoneToGame(game, this.user, pos, id);
} }
@bindThis @bindThis
private async syncState(crc32: string | number) { private async checkState(crc32: string | number) {
// TODO: キャッシュしたい if (crc32 != null) return;
const game = await this.reversiGamesRepository.findOneBy({ id: this.gameId! });
if (game == null) throw new Error('game not found');
if (!game.isStarted) return; const game = await this.reversiService.checkCrc(this.gameId!, crc32);
if (game) {
if (crc32.toString() !== game.crc32) { this.send('rescue', game);
this.send('rescue', await this.reversiGameEntityService.packDetail(game, this.user));
} }
} }
@bindThis
private async claimTimeIsUp() {
if (this.user == null) return;
this.reversiService.checkTimeout(this.gameId!);
}
@bindThis @bindThis
public dispose() { public dispose() {
// Unsubscribe events // Unsubscribe events

Binary file not shown.

View file

@ -56,6 +56,23 @@ function detachMedia(id: string) {
} }
} }
async function detachAndDeleteMedia(file: Misskey.entities.DriveFile) {
if (mock) return;
detachMedia(file.id);
const { canceled } = await os.confirm({
type: 'warning',
text: i18n.t('driveFileDeleteConfirm', { name: file.name }),
});
if (canceled) return;
os.apiWithDialog('drive/files/delete', {
fileId: file.id,
});
}
function toggleSensitive(file) { function toggleSensitive(file) {
if (mock) { if (mock) {
emit('changeSensitive', file, !file.isSensitive); emit('changeSensitive', file, !file.isSensitive);
@ -138,6 +155,13 @@ function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent): void {
text: i18n.ts.attachCancel, text: i18n.ts.attachCancel,
icon: 'ti ti-circle-x', icon: 'ti ti-circle-x',
action: () => { detachMedia(file.id); }, action: () => { detachMedia(file.id); },
}, {
type: 'divider',
}, {
text: i18n.ts.deleteFile,
icon: 'ti ti-trash',
danger: true,
action: () => { detachAndDeleteMedia(file); },
}], ev.currentTarget ?? ev.target).then(() => menuShowing = false); }], ev.currentTarget ?? ev.target).then(() => menuShowing = false);
menuShowing = true; menuShowing = true;
} }

View file

@ -15,19 +15,20 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
<div style="overflow: clip; line-height: 28px;"> <div style="overflow: clip; line-height: 28px;">
<div v-if="!iAmPlayer && !game.isEnded && turnUser" class="turn"> <div v-if="!iAmPlayer && !game.isEnded && turnUser">
<Mfm :key="'turn:' + turnUser.id" :text="i18n.tsx._reversi.turnOf({ name: turnUser.name ?? turnUser.username })" :plain="true" :customEmojis="turnUser.emojis"/> <Mfm :key="'turn:' + turnUser.id" :text="i18n.tsx._reversi.turnOf({ name: turnUser.name ?? turnUser.username })" :plain="true" :customEmojis="turnUser.emojis"/>
<MkEllipsis/> <MkEllipsis/>
</div> </div>
<div v-if="(logPos !== game.logs.length) && turnUser" class="turn"> <div v-if="(logPos !== game.logs.length) && turnUser">
<Mfm :key="'past-turn-of:' + turnUser.id" :text="i18n.tsx._reversi.pastTurnOf({ name: turnUser.name ?? turnUser.username })" :plain="true" :customEmojis="turnUser.emojis"/> <Mfm :key="'past-turn-of:' + turnUser.id" :text="i18n.tsx._reversi.pastTurnOf({ name: turnUser.name ?? turnUser.username })" :plain="true" :customEmojis="turnUser.emojis"/>
</div> </div>
<div v-if="iAmPlayer && !game.isEnded && !isMyTurn" class="turn1">{{ i18n.ts._reversi.opponentTurn }}<MkEllipsis/></div> <div v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ i18n.ts._reversi.opponentTurn }}<MkEllipsis/><span style="margin-left: 1em; opacity: 0.7;">({{ i18n.tsx.remainingN({ n: opTurnTimerRmain }) }})</span></div>
<div v-if="iAmPlayer && !game.isEnded && isMyTurn" class="turn2" style="animation: tada 1s linear infinite both;">{{ i18n.ts._reversi.myTurn }}</div> <div v-if="iAmPlayer && !game.isEnded && isMyTurn"><span style="display: inline-block; font-weight: bold; animation: tada 1s linear infinite both;">{{ i18n.ts._reversi.myTurn }}</span><span style="margin-left: 1em; opacity: 0.7;">({{ i18n.tsx.remainingN({ n: myTurnTimerRmain }) }})</span></div>
<div v-if="game.isEnded && logPos == game.logs.length" class="result"> <div v-if="game.isEnded && logPos == game.logs.length">
<template v-if="game.winner"> <template v-if="game.winner">
<Mfm :key="'won'" :text="i18n.tsx._reversi.won({ name: game.winner.name ?? game.winner.username })" :plain="true" :customEmojis="game.winner.emojis"/> <Mfm :key="'won'" :text="i18n.tsx._reversi.won({ name: game.winner.name ?? game.winner.username })" :plain="true" :customEmojis="game.winner.emojis"/>
<span v-if="game.surrendered != null"> ({{ i18n.ts._reversi.surrendered }})</span> <span v-if="game.surrenderedUserId != null"> ({{ i18n.ts._reversi.surrendered }})</span>
<span v-if="game.timeoutUserId != null"> ({{ i18n.ts._reversi.timeout }})</span>
</template> </template>
<template v-else>{{ i18n.ts._reversi.drawn }}</template> <template v-else>{{ i18n.ts._reversi.drawn }}</template>
</div> </div>
@ -44,6 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.boardCells" :style="cellsStyle"> <div :class="$style.boardCells" :style="cellsStyle">
<div <div
v-for="(stone, i) in engine.board" v-for="(stone, i) in engine.board"
:key="i"
v-tooltip="`${String.fromCharCode(65 + engine.posToXy(i)[0])}${engine.posToXy(i)[1] + 1}`" v-tooltip="`${String.fromCharCode(65 + engine.posToXy(i)[0])}${engine.posToXy(i)[1] + 1}`"
:class="[$style.boardCell, { :class="[$style.boardCell, {
[$style.boardCell_empty]: stone == null, [$style.boardCell_empty]: stone == null,
@ -55,14 +57,22 @@ SPDX-License-Identifier: AGPL-3.0-only
}]" }]"
@click="putStone(i)" @click="putStone(i)"
> >
<template v-if="useAvatarAsStone"> <Transition
<img v-if="stone === true" :class="$style.boardCellStone" :src="blackUser.avatarUrl"/> :enterActiveClass="$style.transition_flip_enterActive"
<img v-if="stone === false" :class="$style.boardCellStone" :src="whiteUser.avatarUrl"/> :leaveActiveClass="$style.transition_flip_leaveActive"
</template> :enterFromClass="$style.transition_flip_enterFrom"
<template v-else> :leaveToClass="$style.transition_flip_leaveTo"
<img v-if="stone === true" :class="$style.boardCellStone" src="/client-assets/reversi/stone_b.png"/> mode="default"
<img v-if="stone === false" :class="$style.boardCellStone" src="/client-assets/reversi/stone_w.png"/> >
</template> <template v-if="useAvatarAsStone">
<img v-if="stone === true" :class="$style.boardCellStone" :src="blackUser.avatarUrl"/>
<img v-else-if="stone === false" :class="$style.boardCellStone" :src="whiteUser.avatarUrl"/>
</template>
<template v-else>
<img v-if="stone === true" :class="$style.boardCellStone" src="/client-assets/reversi/stone_b.png"/>
<img v-else-if="stone === false" :class="$style.boardCellStone" src="/client-assets/reversi/stone_w.png"/>
</template>
</Transition>
</div> </div>
</div> </div>
<div v-if="showBoardLabels" :class="$style.labelsY"> <div v-if="showBoardLabels" :class="$style.labelsY">
@ -74,6 +84,17 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
</div> </div>
<div v-if="game.isEnded" class="_panel _gaps_s" style="padding: 16px;">
<div>{{ logPos }} / {{ game.logs.length }}</div>
<div v-if="!autoplaying" class="_buttonsCenter">
<MkButton :disabled="logPos === 0" @click="logPos = 0"><i class="ti ti-chevrons-left"></i></MkButton>
<MkButton :disabled="logPos === 0" @click="logPos--"><i class="ti ti-chevron-left"></i></MkButton>
<MkButton :disabled="logPos === game.logs.length" @click="logPos++"><i class="ti ti-chevron-right"></i></MkButton>
<MkButton :disabled="logPos === game.logs.length" @click="logPos = game.logs.length"><i class="ti ti-chevrons-right"></i></MkButton>
</div>
<MkButton style="margin: auto;" :disabled="autoplaying" @click="autoplay()"><i class="ti ti-player-play"></i></MkButton>
</div>
<div class="_panel" style="padding: 16px;"> <div class="_panel" style="padding: 16px;">
<div> <div>
<b>{{ i18n.tsx._reversi.turnCount({ count: logPos }) }}</b> {{ i18n.ts._reversi.black }}:{{ engine.blackCount }} {{ i18n.ts._reversi.white }}:{{ engine.whiteCount }} {{ i18n.ts._reversi.total }}:{{ engine.blackCount + engine.whiteCount }} <b>{{ i18n.tsx._reversi.turnCount({ count: logPos }) }}</b> {{ i18n.ts._reversi.black }}:{{ engine.blackCount }} {{ i18n.ts._reversi.white }}:{{ engine.whiteCount }} {{ i18n.ts._reversi.total }}:{{ engine.blackCount + engine.whiteCount }}
@ -111,17 +132,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkButton @click="share">{{ i18n.ts.share }}</MkButton> <MkButton @click="share">{{ i18n.ts.share }}</MkButton>
</div> </div>
<div v-if="game.isEnded" class="_panel _gaps_s" style="padding: 16px;">
<div>{{ logPos }} / {{ game.logs.length }}</div>
<div v-if="!autoplaying" class="_buttonsCenter">
<MkButton :disabled="logPos === 0" @click="logPos = 0"><i class="ti ti-chevrons-left"></i></MkButton>
<MkButton :disabled="logPos === 0" @click="logPos--"><i class="ti ti-chevron-left"></i></MkButton>
<MkButton :disabled="logPos === game.logs.length" @click="logPos++"><i class="ti ti-chevron-right"></i></MkButton>
<MkButton :disabled="logPos === game.logs.length" @click="logPos = game.logs.length"><i class="ti ti-chevrons-right"></i></MkButton>
</div>
<MkButton style="margin: auto;" :disabled="autoplaying" @click="autoplay()"><i class="ti ti-player-play"></i></MkButton>
</div>
<MkA v-if="game.isEnded" :to="`/reversi`"> <MkA v-if="game.isEnded" :to="`/reversi`">
<img src="/client-assets/reversi/logo.png" style="display: block; max-width: 100%; width: 200px; margin: auto;"/> <img src="/client-assets/reversi/logo.png" style="display: block; max-width: 100%; width: 200px; margin: auto;"/>
</MkA> </MkA>
@ -130,7 +140,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, onUnmounted, ref, shallowRef, triggerRef, watch } from 'vue'; import { computed, onActivated, onDeactivated, onMounted, onUnmounted, ref, shallowRef, triggerRef, watch } from 'vue';
import * as CRC32 from 'crc-32'; import * as CRC32 from 'crc-32';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import * as Reversi from 'misskey-reversi'; import * as Reversi from 'misskey-reversi';
@ -230,7 +240,7 @@ if (game.value.isStarted && !game.value.isEnded) {
if (game.value.isEnded) return; if (game.value.isEnded) return;
const crc32 = CRC32.str(JSON.stringify(game.value.logs)).toString(); const crc32 = CRC32.str(JSON.stringify(game.value.logs)).toString();
if (_DEV_) console.log('crc32', crc32); if (_DEV_) console.log('crc32', crc32);
props.connection.send('syncState', { props.connection.send('checkState', {
crc32: crc32, crc32: crc32,
}); });
}, 10000, { immediate: false, afterMounted: true }); }, 10000, { immediate: false, afterMounted: true });
@ -260,9 +270,31 @@ function putStone(pos) {
}); });
appliedOps.push(id); appliedOps.push(id);
myTurnTimerRmain.value = game.value.timeLimitForEachTurn;
opTurnTimerRmain.value = game.value.timeLimitForEachTurn;
checkEnd(); checkEnd();
} }
const myTurnTimerRmain = ref<number>(game.value.timeLimitForEachTurn);
const opTurnTimerRmain = ref<number>(game.value.timeLimitForEachTurn);
const TIMER_INTERVAL_SEC = 3;
useInterval(() => {
if (myTurnTimerRmain.value > 0) {
myTurnTimerRmain.value = Math.max(0, myTurnTimerRmain.value - TIMER_INTERVAL_SEC);
}
if (opTurnTimerRmain.value > 0) {
opTurnTimerRmain.value = Math.max(0, opTurnTimerRmain.value - TIMER_INTERVAL_SEC);
}
if (iAmPlayer.value) {
if ((isMyTurn.value && myTurnTimerRmain.value === 0) || (!isMyTurn.value && opTurnTimerRmain.value === 0)) {
props.connection.send('claimTimeIsUp', {});
}
}
}, TIMER_INTERVAL_SEC * 1000, { immediate: false, afterMounted: true });
function onStreamLog(log: Reversi.Serializer.Log & { id: string | null }) { function onStreamLog(log: Reversi.Serializer.Log & { id: string | null }) {
game.value.logs = Reversi.Serializer.serializeLogs([ game.value.logs = Reversi.Serializer.serializeLogs([
...Reversi.Serializer.deserializeLogs(game.value.logs), ...Reversi.Serializer.deserializeLogs(game.value.logs),
@ -277,6 +309,9 @@ function onStreamLog(log: Reversi.Serializer.Log & { id: string | null }) {
engine.value.putStone(log.pos); engine.value.putStone(log.pos);
triggerRef(engine); triggerRef(engine);
myTurnTimerRmain.value = game.value.timeLimitForEachTurn;
opTurnTimerRmain.value = game.value.timeLimitForEachTurn;
sound.playUrl('/client-assets/reversi/put.mp3', { sound.playUrl('/client-assets/reversi/put.mp3', {
volume: 1, volume: 1,
playbackRate: 1, playbackRate: 1,
@ -385,6 +420,18 @@ onMounted(() => {
props.connection.on('ended', onStreamEnded); props.connection.on('ended', onStreamEnded);
}); });
onActivated(() => {
props.connection.on('log', onStreamLog);
props.connection.on('rescue', onStreamRescue);
props.connection.on('ended', onStreamEnded);
});
onDeactivated(() => {
props.connection.off('log', onStreamLog);
props.connection.off('rescue', onStreamRescue);
props.connection.off('ended', onStreamEnded);
});
onUnmounted(() => { onUnmounted(() => {
props.connection.off('log', onStreamLog); props.connection.off('log', onStreamLog);
props.connection.off('rescue', onStreamRescue); props.connection.off('rescue', onStreamRescue);
@ -395,6 +442,20 @@ onUnmounted(() => {
<style lang="scss" module> <style lang="scss" module>
@use "sass:math"; @use "sass:math";
.transition_flip_enterActive,
.transition_flip_leaveActive {
backface-visibility: hidden;
transition: opacity 0.5s ease, transform 0.5s ease;
}
.transition_flip_enterFrom {
transform: rotateY(-180deg);
opacity: 0;
}
.transition_flip_leaveTo {
transform: rotateY(180deg);
opacity: 0;
}
$label-size: 16px; $label-size: 16px;
$gap: 4px; $gap: 4px;
@ -460,9 +521,11 @@ $gap: 4px;
.boardCell { .boardCell {
background: transparent; background: transparent;
border-radius: 6px; border-radius: 100%;
overflow: clip;
aspect-ratio: 1; aspect-ratio: 1;
transform-style: preserve-3d;
perspective: 150px;
transition: border 0.25s ease, opacity 0.25s ease;
&.boardCell_empty { &.boardCell_empty {
border: solid 2px var(--divider); border: solid 2px var(--divider);
@ -501,10 +564,14 @@ $gap: 4px;
} }
.boardCellStone { .boardCellStone {
position: absolute;
top: 0;
left: 0;
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
border-radius: 100%;
} }
</style> </style>

View file

@ -49,6 +49,22 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkRadios> </MkRadios>
</MkFolder> </MkFolder>
<MkFolder :defaultOpen="true">
<template #label>{{ i18n.ts._reversi.timeLimitForEachTurn }}</template>
<template #suffix>{{ game.timeLimitForEachTurn }}{{ i18n.ts._time.second }}</template>
<MkRadios v-model="game.timeLimitForEachTurn">
<option :value="5">5{{ i18n.ts._time.second }}</option>
<option :value="10">10{{ i18n.ts._time.second }}</option>
<option :value="30">30{{ i18n.ts._time.second }}</option>
<option :value="60">60{{ i18n.ts._time.second }}</option>
<option :value="90">90{{ i18n.ts._time.second }}</option>
<option :value="120">120{{ i18n.ts._time.second }}</option>
<option :value="180">180{{ i18n.ts._time.second }}</option>
<option :value="3600">3600{{ i18n.ts._time.second }}</option>
</MkRadios>
</MkFolder>
<MkFolder :defaultOpen="true"> <MkFolder :defaultOpen="true">
<template #label>{{ i18n.ts._reversi.rules }}</template> <template #label>{{ i18n.ts._reversi.rules }}</template>
@ -70,7 +86,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template v-if="!isReady && !isOpReady">{{ i18n.ts._reversi.waitingBoth }}<MkEllipsis/></template> <template v-if="!isReady && !isOpReady">{{ i18n.ts._reversi.waitingBoth }}<MkEllipsis/></template>
</div> </div>
<div class="_buttonsCenter"> <div class="_buttonsCenter">
<MkButton rounded danger @click="exit">{{ i18n.ts.cancel }}</MkButton> <MkButton rounded danger @click="cancel">{{ i18n.ts.cancel }}</MkButton>
<MkButton v-if="!isReady" rounded primary @click="ready">{{ i18n.ts._reversi.ready }}</MkButton> <MkButton v-if="!isReady" rounded primary @click="ready">{{ i18n.ts._reversi.ready }}</MkButton>
<MkButton v-if="isReady" rounded @click="unready">{{ i18n.ts._reversi.cancelReady }}</MkButton> <MkButton v-if="isReady" rounded @click="unready">{{ i18n.ts._reversi.cancelReady }}</MkButton>
</div> </div>
@ -93,9 +109,12 @@ import MkSwitch from '@/components/MkSwitch.vue';
import MkFolder from '@/components/MkFolder.vue'; import MkFolder from '@/components/MkFolder.vue';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { MenuItem } from '@/types/menu.js'; import { MenuItem } from '@/types/menu.js';
import { useRouter } from '@/global/router/supplier.js';
const $i = signinRequired(); const $i = signinRequired();
const router = useRouter();
const mapCategories = Array.from(new Set(Object.values(Reversi.maps).map(x => x.category))); const mapCategories = Array.from(new Set(Object.values(Reversi.maps).map(x => x.category)));
const props = defineProps<{ const props = defineProps<{
@ -125,6 +144,10 @@ watch(() => game.value.bw, () => {
updateSettings('bw'); updateSettings('bw');
}); });
watch(() => game.value.timeLimitForEachTurn, () => {
updateSettings('timeLimitForEachTurn');
});
function chooseMap(ev: MouseEvent) { function chooseMap(ev: MouseEvent) {
const menu: MenuItem[] = []; const menu: MenuItem[] = [];
@ -151,8 +174,16 @@ function chooseMap(ev: MouseEvent) {
os.popupMenu(menu, ev.currentTarget ?? ev.target); os.popupMenu(menu, ev.currentTarget ?? ev.target);
} }
function exit() { async function cancel() {
props.connection.send('exit', {}); const { canceled } = await os.confirm({
type: 'warning',
text: i18n.ts.areYouSure,
});
if (canceled) return;
props.connection.send('cancel', {});
router.push('/reversi');
} }
function ready() { function ready() {

View file

@ -17,6 +17,14 @@ import GameBoard from './game.board.vue';
import { misskeyApi } from '@/scripts/misskey-api.js'; import { misskeyApi } from '@/scripts/misskey-api.js';
import { definePageMetadata } from '@/scripts/page-metadata.js'; import { definePageMetadata } from '@/scripts/page-metadata.js';
import { useStream } from '@/stream.js'; import { useStream } from '@/stream.js';
import { signinRequired } from '@/account.js';
import { useRouter } from '@/global/router/supplier.js';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
const $i = signinRequired();
const router = useRouter();
const props = defineProps<{ const props = defineProps<{
gameId: string; gameId: string;
@ -45,6 +53,17 @@ async function fetchGame() {
connection.value.on('started', x => { connection.value.on('started', x => {
game.value = x.game; game.value = x.game;
}); });
connection.value.on('canceled', x => {
connection.value?.dispose();
if (x.userId !== $i.id) {
os.alert({
type: 'warning',
text: i18n.ts._reversi.gameCanceled,
});
router.push('/reversi');
}
});
} }
onMounted(() => { onMounted(() => {

View file

@ -10,11 +10,12 @@ SPDX-License-Identifier: AGPL-3.0-only
<img src="/client-assets/reversi/logo.png" style="display: block; max-width: 100%; max-height: 200px; margin: auto;"/> <img src="/client-assets/reversi/logo.png" style="display: block; max-width: 100%; max-height: 200px; margin: auto;"/>
</div> </div>
<div class="_panel" style="padding: 16px;"> <div class="_panel _gaps" style="padding: 16px;">
<div class="_buttonsCenter"> <div class="_buttonsCenter">
<MkButton primary gradate rounded @click="matchAny">{{ i18n.ts._reversi.freeMatch }}</MkButton> <MkButton primary gradate rounded @click="matchAny">{{ i18n.ts._reversi.freeMatch }}</MkButton>
<MkButton primary gradate rounded @click="matchUser">{{ i18n.ts.invite }}</MkButton> <MkButton primary gradate rounded @click="matchUser">{{ i18n.ts.invite }}</MkButton>
</div> </div>
<div style="font-size: 90%; opacity: 0.7; text-align: center;"><i class="ti ti-music"></i> {{ i18n.ts.soundWillBePlayed }}</div>
</div> </div>
<MkFolder v-if="invitations.length > 0" :defaultOpen="true"> <MkFolder v-if="invitations.length > 0" :defaultOpen="true">
@ -88,7 +89,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, onUnmounted, ref } from 'vue'; import { computed, onDeactivated, onMounted, onUnmounted, ref } from 'vue';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import { misskeyApi } from '@/scripts/misskey-api.js'; import { misskeyApi } from '@/scripts/misskey-api.js';
import { definePageMetadata } from '@/scripts/page-metadata.js'; import { definePageMetadata } from '@/scripts/page-metadata.js';
@ -101,6 +102,7 @@ import MkPagination from '@/components/MkPagination.vue';
import { useRouter } from '@/global/router/supplier.js'; import { useRouter } from '@/global/router/supplier.js';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { useInterval } from '@/scripts/use-interval.js'; import { useInterval } from '@/scripts/use-interval.js';
import * as sound from '@/scripts/sound.js';
const myGamesPagination = { const myGamesPagination = {
endpoint: 'reversi/games' as const, endpoint: 'reversi/games' as const,
@ -141,6 +143,12 @@ const matchingAny = ref<boolean>(false);
function startGame(game: Misskey.entities.ReversiGameDetailed) { function startGame(game: Misskey.entities.ReversiGameDetailed) {
matchingUser.value = null; matchingUser.value = null;
matchingAny.value = false; matchingAny.value = false;
sound.playUrl('/client-assets/reversi/matched.mp3', {
volume: 1,
playbackRate: 1,
});
router.push(`/reversi/g/${game.id}`); router.push(`/reversi/g/${game.id}`);
} }
@ -206,6 +214,14 @@ onMounted(() => {
}); });
}); });
onDeactivated(() => {
cancelMatching();
});
onUnmounted(() => {
cancelMatching();
});
definePageMetadata(computed(() => ({ definePageMetadata(computed(() => ({
title: 'Reversi', title: 'Reversi',
icon: 'ti ti-device-gamepad', icon: 'ti ti-device-gamepad',

View file

@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { onMounted, onUnmounted } from 'vue'; import { onActivated, onDeactivated, onMounted, onUnmounted } from 'vue';
export function useInterval(fn: () => void, interval: number, options: { export function useInterval(fn: () => void, interval: number, options: {
immediate: boolean; immediate: boolean;
@ -28,6 +28,16 @@ export function useInterval(fn: () => void, interval: number, options: {
intervalId = null; intervalId = null;
}; };
onActivated(() => {
if (intervalId) return;
if (options.immediate) fn();
intervalId = window.setInterval(fn, interval);
});
onDeactivated(() => {
clear();
});
onUnmounted(() => { onUnmounted(() => {
clear(); clear();
}); });

View file

@ -61,7 +61,7 @@
"😔":["悲しげな顔","がっかり","顔","悲しい"], "😔":["悲しげな顔","がっかり","顔","悲しい"],
"😕":["困った顔","困った","こまった","顔"], "😕":["困った顔","困った","こまった","顔"],
"🙁":["ご機嫌斜め","顔","しかめっ面","しかめっつら","悲しい","不幸"], "🙁":["ご機嫌斜め","顔","しかめっ面","しかめっつら","悲しい","不幸"],
"☹":["しかめっつら","顔","しかめっ面","悲しい","不幸"], "☹":["しかめっつら","顔","しかめっ面","悲しい","不幸"],
"😬":["しかめっ面","顔","しかめっつら"], "😬":["しかめっ面","顔","しかめっつら"],
"🥺":["訴えかける顔","顔","物乞い","慈悲","子犬の目"], "🥺":["訴えかける顔","顔","物乞い","慈悲","子犬の目"],
"😣":["我慢している顔","顔","がんばる","頑張る"], "😣":["我慢している顔","顔","がんばる","頑張る"],
@ -111,7 +111,7 @@
"💩":["うんち","マンガ","漫画","フン","顔","モンスター"], "💩":["うんち","マンガ","漫画","フン","顔","モンスター"],
"👻":["お化け","妖怪","顔","おとぎ話","ファンタジー","幽霊","モンスター","ハロウィーン"], "👻":["お化け","妖怪","顔","おとぎ話","ファンタジー","幽霊","モンスター","ハロウィーン"],
"💀":["ドクロ","体","死","顔","おとぎ話","モンスター","骸骨","ハロウィーン"], "💀":["ドクロ","体","死","顔","おとぎ話","モンスター","骸骨","ハロウィーン"],
"☠":["ドクロマーク","体","交差した骨","死","顔","モンスター","骸骨","ハロウィーン"], "☠":["ドクロマーク","体","交差した骨","死","顔","モンスター","骸骨","ハロウィーン"],
"👽":["宇宙人","怪獣","異星人","顔","おとぎ話","ファンタジー","モンスター","宇宙","UFO"], "👽":["宇宙人","怪獣","異星人","顔","おとぎ話","ファンタジー","モンスター","宇宙","UFO"],
"🤖":["ロボットの顔","顔","モンスター","ロボット"], "🤖":["ロボットの顔","顔","モンスター","ロボット"],
"🎃":["ジャック・オ・ランタン","イベント","お祝い","エンタメ","ハロウィン","ジャックオランタン","ランタン","かぼちゃ"], "🎃":["ジャック・オ・ランタン","イベント","お祝い","エンタメ","ハロウィン","ジャックオランタン","ランタン","かぼちゃ"],
@ -138,7 +138,7 @@
"🤛":["左向きのこぶし","体","拳","左向き"], "🤛":["左向きのこぶし","体","拳","左向き"],
"🤜":["右向きのこぶし","体","拳","右向き"], "🤜":["右向きのこぶし","体","拳","右向き"],
"🤞":["交差させた指","体","交差","指","手","幸運"], "🤞":["交差させた指","体","交差","指","手","幸運"],
"✌":["Vサイン","体","手","V","ブイ","勝つ","勝利","ピース"], "✌":["Vサイン","体","手","V","ブイ","勝つ","勝利","ピース"],
"🫰":["人差し指と親指を交差した手","高い","ハート","愛","お金","スナップ"], "🫰":["人差し指と親指を交差した手","高い","ハート","愛","お金","スナップ"],
"🤘":["コルナ","体","指","手","角","最高"], "🤘":["コルナ","体","指","手","角","最高"],
"🤟":["愛してるのジェスチャー","体","愛してる","好き","手"], "🤟":["愛してるのジェスチャー","体","愛してる","好き","手"],
@ -151,10 +151,10 @@
"👉":["指差し","手の甲","体","指","手","人差し指","指さす"], "👉":["指差し","手の甲","体","指","手","人差し指","指さす"],
"👆":["指差し","手の甲","体","指","手","人差し指","指さす","上"], "👆":["指差し","手の甲","体","指","手","人差し指","指さす","上"],
"👇":["指差し","手の甲","体","下","指","手","人差し指","指さす"], "👇":["指差し","手の甲","体","下","指","手","人差し指","指さす"],
"☝":["指差し","体","指","手","人差し指","指さす","上"], "☝":["指差し","体","指","手","人差し指","指さす","上"],
"✋":["挙手","体","手"], "✋":["挙手","体","手"],
"🤚":["手の甲","体","挙げる"], "🤚":["手の甲","体","挙げる"],
"🖐":["広げた手のひら","体","指","手","広げる"], "🖐":["広げた手のひら","体","指","手","広げる"],
"🖖":["長寿と繁栄を","体","指","手","スポック","バルカン"], "🖖":["長寿と繁栄を","体","指","手","スポック","バルカン"],
"👋":["バイバイ","体","手","振る","やっほー","ヤッホー","こんにちは"], "👋":["バイバイ","体","手","振る","やっほー","ヤッホー","こんにちは"],
"🤙":["電話の形の手","体","電話","手"], "🤙":["電話の形の手","体","電話","手"],
@ -166,7 +166,7 @@
"🦾":["メカニカルアーム","アクセシビリティ","義手","人口装具","体"], "🦾":["メカニカルアーム","アクセシビリティ","義手","人口装具","体"],
"🖕":["中指を立てた手","体","指","手","中指"], "🖕":["中指を立てた手","体","指","手","中指"],
"🫵":["見ている人を指している人差し指","指す","あなた","指"], "🫵":["見ている人を指している人差し指","指す","あなた","指"],
"✍":["書いている手","体","手","書く"], "✍":["書いている手","体","手","書く"],
"🤳":["自撮り","カメラ","携帯","腕"], "🤳":["自撮り","カメラ","携帯","腕"],
"💅":["マニキュア","体","ケア","化粧品","コスメ","爪","ネイル"], "💅":["マニキュア","体","ケア","化粧品","コスメ","爪","ネイル"],
"🦵":["脚","体","キック","手足"], "🦵":["脚","体","キック","手足"],
@ -179,7 +179,7 @@
"👂":["耳","体","鼻"], "👂":["耳","体","鼻"],
"🦻":["補聴器を付けている耳","アクセシビリティ","補聴器","聞く","体","耳"], "🦻":["補聴器を付けている耳","アクセシビリティ","補聴器","聞く","体","耳"],
"👃":["鼻","体"], "👃":["鼻","体"],
"👁":["目","体"], "👁":["目","体"],
"👀":["目","体","顔"], "👀":["目","体","顔"],
"🧠":["脳","体","臓器","知的","賢い"], "🧠":["脳","体","臓器","知的","賢い"],
"🫀":["解剖学的な心臓","解剖学","心臓学","心臓","臓器","脈"], "🫀":["解剖学的な心臓","解剖学","心臓学","心臓","臓器","脈"],
@ -187,7 +187,7 @@
"🦴":["骨","体","骨格"], "🦴":["骨","体","骨格"],
"👤":["上半身のシルエット","上半身","シルエット"], "👤":["上半身のシルエット","上半身","シルエット"],
"👥":["上半身のシルエット","上半身","シルエット"], "👥":["上半身のシルエット","上半身","シルエット"],
"🗣":["喋る頭のシルエット","顔","頭","シルエット","しゃべる","話す"], "🗣":["喋る頭のシルエット","顔","頭","シルエット","しゃべる","話す"],
"🫂":["ハグしている人たち","さようなら","こんにちは","ハグ","ありがとう"], "🫂":["ハグしている人たち","さようなら","こんにちは","ハグ","ありがとう"],
"👶":["赤ちゃん"], "👶":["赤ちゃん"],
"👧":["女の子","少女","処女","おとめ座","星座","子供"], "👧":["女の子","少女","処女","おとめ座","星座","子供"],
@ -281,7 +281,7 @@
"💂‍♂️":["男性警備員","警備員","警備","男","おとこ","男性"], "💂‍♂️":["男性警備員","警備員","警備","男","おとこ","男性"],
"🥷":["忍者","戦士","隠された","ステルス"], "🥷":["忍者","戦士","隠された","ステルス"],
"🕵️‍♀️":["女性の探偵","探偵","刑事","スパイ","女性","女","おんな"], "🕵️‍♀️":["女性の探偵","探偵","刑事","スパイ","女性","女","おんな"],
"🕵":["探偵","刑事","スパイ"], "🕵":["探偵","刑事","スパイ"],
"🕵️‍♂️":["男性の探偵","探偵","刑事","スパイ","男","おとこ","男性"], "🕵️‍♂️":["男性の探偵","探偵","刑事","スパイ","男","おとこ","男性"],
"🤶":["ミセス・クロース","イベント","お祝い","クリスマス","母","サンタ","クロース","女性","女","おんな"], "🤶":["ミセス・クロース","イベント","お祝い","クリスマス","母","サンタ","クロース","女性","女","おんな"],
"🧑‍🎄":["ミクスクロース","アクティビティ","お祝い","クリスマス","サンタ","クロース"], "🧑‍🎄":["ミクスクロース","アクティビティ","お祝い","クリスマス","サンタ","クロース"],
@ -300,7 +300,7 @@
"🩵":["ライトブルーのハート","シアン","ハート","ライトブルー","コガモ"], "🩵":["ライトブルーのハート","シアン","ハート","ライトブルー","コガモ"],
"🩶":["グレーのハート","グレー","ハート","シルバー","スレート"], "🩶":["グレーのハート","グレー","ハート","シルバー","スレート"],
"🕴️‍♀️":["宙に浮いたスーツの女性","ビジネス","スーツ","女性","女","おんな"], "🕴️‍♀️":["宙に浮いたスーツの女性","ビジネス","スーツ","女性","女","おんな"],
"🕴":["宙に浮いたスーツの人","ビジネス","スーツ"], "🕴":["宙に浮いたスーツの人","ビジネス","スーツ"],
"🕴️‍♂️":["宙に浮いたスーツの男性","ビジネス","スーツ","男","おとこ","男性"], "🕴️‍♂️":["宙に浮いたスーツの男性","ビジネス","スーツ","男","おとこ","男性"],
"🦸‍♀️":["女性のスーパーヒーロー","空想","善","ヒロイン","超大国","女性","女","おんな"], "🦸‍♀️":["女性のスーパーヒーロー","空想","善","ヒロイン","超大国","女性","女","おんな"],
"🦸":["スーパーヒーロー","空想","善","ヒーロー","ヒロイン","超大国"], "🦸":["スーパーヒーロー","空想","善","ヒーロー","ヒロイン","超大国"],
@ -468,7 +468,7 @@
"🎩":["シルクハット","アクティビティ","服","エンターテインメント","娯楽","帽子","トップス"], "🎩":["シルクハット","アクティビティ","服","エンターテインメント","娯楽","帽子","トップス"],
"🎓":["卒業式の角帽","アクティビティ","帽子","お祝い","服","卒業","ハット"], "🎓":["卒業式の角帽","アクティビティ","帽子","お祝い","服","卒業","ハット"],
"👑":["冠","服","王冠","王","女王"], "👑":["冠","服","王冠","王","女王"],
"⛑":["白十字のヘルメット","救助","十字","顔","帽子","ヘルメット"], "⛑":["白十字のヘルメット","救助","十字","顔","帽子","ヘルメット"],
"🪖":["軍隊のヘルメット","軍","ヘルメット","軍隊","軍人","兵士"], "🪖":["軍隊のヘルメット","軍","ヘルメット","軍隊","軍人","兵士"],
"🎒":["ランドセル","アクティビティ","鞄","バッグ","学生鞄","学校"], "🎒":["ランドセル","アクティビティ","鞄","バッグ","学生鞄","学校"],
"👝":["ポーチ","鞄","バッグ","服"], "👝":["ポーチ","鞄","バッグ","服"],
@ -476,13 +476,13 @@
"👜":["ハンドバッグ","鞄","バッグ","服"], "👜":["ハンドバッグ","鞄","バッグ","服"],
"💼":["ブリーフケース"], "💼":["ブリーフケース"],
"👓":["眼鏡","服","目","メガネ","アイウェア"], "👓":["眼鏡","服","目","メガネ","アイウェア"],
"🕶":["サングラス","暗い","目","眼鏡","メガネ"], "🕶":["サングラス","暗い","目","眼鏡","メガネ"],
"🥽":["ゴーグル","服","目の保護","水泳","溶接"], "🥽":["ゴーグル","服","目の保護","水泳","溶接"],
"🧣":["スカーフ","服","首"], "🧣":["スカーフ","服","首"],
"🧤":["手袋","服","手"], "🧤":["手袋","服","手"],
"💍":["指輪","ダイヤモンド","恋愛","ロマンス"], "💍":["指輪","ダイヤモンド","恋愛","ロマンス"],
"🌂":["閉じた傘","服","雨","傘","天気"], "🌂":["閉じた傘","服","雨","傘","天気"],
"☂":["傘","服","雨","天気"], "☂":["傘","服","雨","天気"],
"🐶":["イヌの顔","犬","イヌ","顔","ペット"], "🐶":["イヌの顔","犬","イヌ","顔","ペット"],
"🐱":["ネコの顔","猫","ネコ","顔","ペット"], "🐱":["ネコの顔","猫","ネコ","顔","ペット"],
"🐭":["ネズミの顔","顔","ネズミ"], "🐭":["ネズミの顔","顔","ネズミ"],
@ -536,8 +536,8 @@
"🐜":["アリ","蟻","昆虫"], "🐜":["アリ","蟻","昆虫"],
"🦗":["クリケット","コオロギ","バッタ目","昆虫"], "🦗":["クリケット","コオロギ","バッタ目","昆虫"],
"🪳":["ゴキブリ","昆虫","害虫"], "🪳":["ゴキブリ","昆虫","害虫"],
"🕷":["クモ","昆虫","蜘蛛"], "🕷":["クモ","昆虫","蜘蛛"],
"🕸":["クモの巣","クモ","巣"], "🕸":["クモの巣","クモ","巣"],
"🦂":["サソリ","さそり座","さそり","星座"], "🦂":["サソリ","さそり座","さそり","星座"],
"🦟":["蚊","病気","熱","昆虫","マラリア","ウイルス"], "🦟":["蚊","病気","熱","昆虫","マラリア","ウイルス"],
"🪰":["ハエ","害虫","昆虫","蛆虫"], "🪰":["ハエ","害虫","昆虫","蛆虫"],
@ -584,7 +584,7 @@
"🦇":["コウモリ","吸血鬼"], "🦇":["コウモリ","吸血鬼"],
"🐓":["おんどり"], "🐓":["おんどり"],
"🦃":["七面鳥(鳥)","七面鳥","鳥"], "🦃":["七面鳥(鳥)","七面鳥","鳥"],
"🕊":["平和の鳩","鳥","鳩","飛行","平和"], "🕊":["平和の鳩","鳥","鳩","飛行","平和"],
"🦅":["ワシ","鳥"], "🦅":["ワシ","鳥"],
"🦆":["アヒル","鳥"], "🦆":["アヒル","鳥"],
"🪿":["ガチョウ","鳥","家禽","警笛の音"], "🪿":["ガチョウ","鳥","家禽","警笛の音"],
@ -605,7 +605,7 @@
"🐇":["ウサギ","バニー","ペット"], "🐇":["ウサギ","バニー","ペット"],
"🐀":["ネズミ"], "🐀":["ネズミ"],
"🐁":["ネズミ"], "🐁":["ネズミ"],
"🐿":["シマリス"], "🐿":["シマリス"],
"🦨":["スカンク","悪臭","臭う"], "🦨":["スカンク","悪臭","臭う"],
"🦡":["アナグマ","ラーテル","ねだる"], "🦡":["アナグマ","ラーテル","ねだる"],
"🦔":["ハリネズミ","顔"], "🦔":["ハリネズミ","顔"],
@ -622,7 +622,7 @@
"🪴":["鉢植え","植物","観葉植物"], "🪴":["鉢植え","植物","観葉植物"],
"🌱":["苗木","植物","若い"], "🌱":["苗木","植物","若い"],
"🌿":["ハーブ","葉","植物"], "🌿":["ハーブ","葉","植物"],
"☘":["クローバー","植物"], "☘":["クローバー","植物"],
"🍀":["四つ葉のクローバー","4","クローバー","四","葉","植物"], "🍀":["四つ葉のクローバー","4","クローバー","四","葉","植物"],
"🎍":["門松","アクティビティ","竹","お祝い","日本","松","植物"], "🎍":["門松","アクティビティ","竹","お祝い","日本","松","植物"],
"🎋":["七夕","アクティビティ","旗","お祝い","エンターテイメント","日本","木"], "🎋":["七夕","アクティビティ","旗","お祝い","エンターテイメント","日本","木"],
@ -661,35 +661,35 @@
"🌝":["顔つき満月","明るい","顔","満ちた","月","宇宙","天気"], "🌝":["顔つき満月","明るい","顔","満ちた","月","宇宙","天気"],
"🌛":["顔つき上弦の月","顔","月","弦","宇宙","天気"], "🌛":["顔つき上弦の月","顔","月","弦","宇宙","天気"],
"🌜":["顔がある下弦の月","顔","月","弦","宇宙","天気"], "🌜":["顔がある下弦の月","顔","月","弦","宇宙","天気"],
"⭐":["中くらいの星","星"], "⭐":["中くらいの星","星"],
"🌟":["光る星","きらめき","赤い光","輝く","輝き","星"], "🌟":["光る星","きらめき","赤い光","輝く","輝き","星"],
"💫":["くらくら","漫画","めまい","星"], "💫":["くらくら","漫画","めまい","星"],
"✨":["キラキラ","エンターテイメント","輝き","星"], "✨":["キラキラ","エンターテイメント","輝き","星"],
"☄":["彗星","宇宙"], "☄":["彗星","宇宙"],
"🪐":["環のある惑星","宇宙","惑星","土星"], "🪐":["環のある惑星","宇宙","惑星","土星"],
"🌞":["顔つき太陽","明るい","顔","宇宙","太陽","天気"], "🌞":["顔つき太陽","明るい","顔","宇宙","太陽","天気"],
"☀️":["太陽の光","明るい","光線","宇宙","太陽","晴天","天気"], "☀️":["太陽の光","明るい","光線","宇宙","太陽","晴天","天気"],
"🌤":["太陽と小さな雲","雲","太陽","天気"], "🌤":["太陽と小さな雲","雲","太陽","天気"],
"⛅":["晴れ時々曇り","雲","太陽","天気"], "⛅":["晴れ時々曇り","雲","太陽","天気"],
"🌥":["晴れのち曇り","雲","太陽","天気"], "🌥":["晴れのち曇り","雲","太陽","天気"],
"🌦":["晴れのち曇り時々雨","雲","雨","太陽","天気"], "🌦":["晴れのち曇り時々雨","雲","雨","太陽","天気"],
"☁️":["雲","天気"], "☁️":["雲","天気"],
"🌧":["雨雲","雲","雨","天気"], "🌧":["雨雲","雲","雨","天気"],
"⛈":["雷雨","雲","雨","雷","天気"], "⛈":["雷雨","雲","雨","雷","天気"],
"🌩":["雷雲","雲","雷","天気"], "🌩":["雷雲","雲","雷","天気"],
"⚡":["高電圧記号","危険","電気","雷","電圧","ビリビリ"], "⚡":["高電圧記号","危険","電気","雷","電圧","ビリビリ"],
"🔥":["炎","火","道具"], "🔥":["炎","火","道具"],
"💥":["衝突マーク","どかーん","衝突","漫画"], "💥":["衝突マーク","どかーん","衝突","漫画"],
"❄️":["雪の結晶","冷たい","雪","天気"], "❄️":["雪の結晶","冷たい","雪","天気"],
"🌨":["雪雲","雲","冷","雪","天気"], "🌨":["雪雲","雲","冷","雪","天気"],
"☃":["雪だるま","冷","雪","天気"], "☃":["雪だるま","冷","雪","天気"],
"⛄":["雪だるま","冷","雪","天気"], "⛄":["雪だるま","冷","雪","天気"],
"🌬":["風が吹いている","風が吹く","雲","顔","天気","風"], "🌬":["風が吹いている","風が吹く","雲","顔","天気","風"],
"💨":["ダッシュ","漫画","走る"], "💨":["ダッシュ","漫画","走る"],
"🌪":["竜巻雲","雲","竜巻","天気","旋風"], "🌪":["竜巻雲","雲","竜巻","天気","旋風"],
"🌫":["霧","雲","天気"], "🌫":["霧","雲","天気"],
"🌈":["虹","雨","レインボー","天気","プライド","lgbt"], "🌈":["虹","雨","レインボー","天気","プライド","lgbt"],
"☔":["雨と傘","衣類","しずく","雨","傘","天気"], "☔":["雨と傘","衣類","しずく","雨","傘","天気"],
"💧":["雫","ぞっとする","漫画","したたり","汗","天気"], "💧":["雫","ぞっとする","漫画","したたり","汗","天気"],
"💦":["汗マーク","漫画","濡れている","汗"], "💦":["汗マーク","漫画","濡れている","汗"],
"🌊":["波","海","水","天気"], "🌊":["波","海","水","天気"],
@ -714,7 +714,7 @@
"🥑":["アボカド","フルーツ","果物"], "🥑":["アボカド","フルーツ","果物"],
"🫒":["オリーブ","フルーツ"], "🫒":["オリーブ","フルーツ"],
"🍆":["ナス","茄子","植物","野菜"], "🍆":["ナス","茄子","植物","野菜"],
"🌶":["トウガラシ","辛い","コショウ","植物"], "🌶":["トウガラシ","辛い","コショウ","植物"],
"🫑":["ピーマン","唐辛子","コショウ","植物","野菜"], "🫑":["ピーマン","唐辛子","コショウ","植物","野菜"],
"🥒":["キュウリ","ピクルス","野菜"], "🥒":["キュウリ","ピクルス","野菜"],
"🥬":["葉っぱの緑","チンゲン菜","キャベツ","ケール","レタス"], "🥬":["葉っぱの緑","チンゲン菜","キャベツ","ケール","レタス"],
@ -793,7 +793,7 @@
"🍪":["クッキー","デザート","甘い"], "🍪":["クッキー","デザート","甘い"],
"🥠":["おみくじ入りクッキー","フォーチュンクッキー"], "🥠":["おみくじ入りクッキー","フォーチュンクッキー"],
"🥮":["月餅","秋","祭"], "🥮":["月餅","秋","祭"],
"☕":["ホットドリンク","飲料","コーヒー","飲み物","温かい","蒸気","お茶"], "☕":["ホットドリンク","飲料","コーヒー","飲み物","温かい","蒸気","お茶"],
"🍵":["湯のみ","飲料","カップ","飲み物","お茶","湯飲み"], "🍵":["湯のみ","飲料","カップ","飲み物","お茶","湯飲み"],
"🫖":["ティーポット","ドリンク","ポット","ティー","ケトル"], "🫖":["ティーポット","ドリンク","ポット","ティー","ケトル"],
"🥣":["ボウルとスプーン","朝食","シリアル","お粥","オートミール","ポリッジ","食器"], "🥣":["ボウルとスプーン","朝食","シリアル","お粥","オートミール","ポリッジ","食器"],
@ -816,13 +816,13 @@
"🧊":["角氷","氷","立方体","冷たい","氷山"], "🧊":["角氷","氷","立方体","冷たい","氷山"],
"🥄":["スプーン","食器"], "🥄":["スプーン","食器"],
"🍴":["フォークとナイフ","調理","フォーク","ナイフ","食器"], "🍴":["フォークとナイフ","調理","フォーク","ナイフ","食器"],
"🍽":["フォークとナイフとプレート","調理","フォーク","ナイフ","プレート","食器"], "🍽":["フォークとナイフとプレート","調理","フォーク","ナイフ","プレート","食器"],
"🥢":["箸","はし"], "🥢":["箸","はし"],
"🥡":["テイクアウトボックス","テイクアウト","容器","お持ち帰り"], "🥡":["テイクアウトボックス","テイクアウト","容器","お持ち帰り"],
"⚽":["サッカーボール","ボール","サッカー"], "⚽":["サッカーボール","ボール","サッカー"],
"🏀":["バスケットボール","ボール","バスケットリング"], "🏀":["バスケットボール","ボール","バスケットリング"],
"🏈":["アメリカンフットボール","アメリカン","ボール","フットボール"], "🏈":["アメリカンフットボール","アメリカン","ボール","フットボール"],
"⚾":["野球","ボール"], "⚾":["野球","ボール"],
"🥎":["ソフトボール","ボール","試合","スポーツ"], "🥎":["ソフトボール","ボール","試合","スポーツ"],
"🎾":["テニスボール","ボール","ラケット","テニス"], "🎾":["テニスボール","ボール","ラケット","テニス"],
"🏐":["バレーボール","ボール","試合"], "🏐":["バレーボール","ボール","試合"],
@ -838,19 +838,19 @@
"🏏":["クリケットのバットとボール","ボール","フィールド","クリケット","試合"], "🏏":["クリケットのバットとボール","ボール","フィールド","クリケット","試合"],
"🥍":["ラクロス","ボール","スティック","試合","スポーツ"], "🥍":["ラクロス","ボール","スティック","試合","スポーツ"],
"🥌":["カーリングストーン","カーリング","ストーン"], "🥌":["カーリングストーン","カーリング","ストーン"],
"⛳":["ゴルフのカップ","ピンフラッグ","ゴルフ","ホール"], "⛳":["ゴルフのカップ","ピンフラッグ","ゴルフ","ホール"],
"🏹":["弓矢","射手","矢","弓","射手座","道具","星座"], "🏹":["弓矢","射手","矢","弓","射手座","道具","星座"],
"🎣":["釣竿と魚","エンターテイメント","魚","棒"], "🎣":["釣竿と魚","エンターテイメント","魚","棒"],
"🤿":["ダイビングマスク","ダイビング","スキューバ","シュノーケル"], "🤿":["ダイビングマスク","ダイビング","スキューバ","シュノーケル"],
"🥊":["ボクシンググローブ","ボクシング","グローブ"], "🥊":["ボクシンググローブ","ボクシング","グローブ"],
"🥋":["道着","柔道","空手","武道","テコンドー","ユニフォーム"], "🥋":["道着","柔道","空手","武道","テコンドー","ユニフォーム"],
"⛸":["アイススケート","氷"], "⛸":["アイススケート","氷"],
"🎿":["スキーとスキーブーツ","スキー","雪"], "🎿":["スキーとスキーブーツ","スキー","雪"],
"🛷":["そり","ソリ","ルージュ","トボガン"], "🛷":["そり","ソリ","ルージュ","トボガン"],
"⛷":["スキー","雪"], "⛷":["スキー","雪"],
"🏂":["スノーボーダー","スキー","雪","スノーボード"], "🏂":["スノーボーダー","スキー","雪","スノーボード"],
"🏋️‍♀️":["ウエイトを持ち上げる女性","挙げ","重量","女性","女","おんな"], "🏋️‍♀️":["ウエイトを持ち上げる女性","挙げ","重量","女性","女","おんな"],
"🏋":["ウエイトを持ち上げる人","挙げ","重量"], "🏋":["ウエイトを持ち上げる人","挙げ","重量"],
"🏋️‍♂️":["ウエイトを持ち上げる男性","挙げ","重量","男","おとこ","男性"], "🏋️‍♂️":["ウエイトを持ち上げる男性","挙げ","重量","男","おとこ","男性"],
"🤺":["フェンシングをする人","剣士","剣術","剣"], "🤺":["フェンシングをする人","剣士","剣術","剣"],
"🤼‍♀️":["レスリングをする女性","レスリング","レスリング選手","女性","女","おんな"], "🤼‍♀️":["レスリングをする女性","レスリング","レスリング選手","女性","女","おんな"],
@ -860,7 +860,7 @@
"🤸":["側転をする人","側方転回","体操"], "🤸":["側転をする人","側方転回","体操"],
"🤸‍♂️":["側転をする男性","側方転回","体操","男","おとこ","男性"], "🤸‍♂️":["側転をする男性","側方転回","体操","男","おとこ","男性"],
"⛹️‍♀️":["ボールをバウンドさせる女性","ボール","女性","女","おんな"], "⛹️‍♀️":["ボールをバウンドさせる女性","ボール","女性","女","おんな"],
"⛹":["ボールをバウンドさせる人","ボール"], "⛹":["ボールをバウンドさせる人","ボール"],
"⛹️‍♂️":["ボールをバウンドさせる男性","ボール","男","おとこ","男性"], "⛹️‍♂️":["ボールをバウンドさせる男性","ボール","男","おとこ","男性"],
"🤾‍♀️":["ハンドボールをする女性","ボール","ハンドボール","女性","女","おんな"], "🤾‍♀️":["ハンドボールをする女性","ボール","ハンドボール","女性","女","おんな"],
"🤾":["ハンドボールをする人","ボール","ハンドボール"], "🤾":["ハンドボールをする人","ボール","ハンドボール"],
@ -869,7 +869,7 @@
"🧗":["クライミングしている人","クライミング","ロック"], "🧗":["クライミングしている人","クライミング","ロック"],
"🧗‍♂️":["クライミングしている男性","クライミング","ロック","男性","男","おとこ"], "🧗‍♂️":["クライミングしている男性","クライミング","ロック","男性","男","おとこ"],
"🏌️‍♀️":["ゴルフをする女性","ボール","ゴルフ","ゴルファー","ゴルフする","女性","女","おんな"], "🏌️‍♀️":["ゴルフをする女性","ボール","ゴルフ","ゴルファー","ゴルフする","女性","女","おんな"],
"🏌":["ゴルフをする人","ボール","ゴルフ","ゴルファー","ゴルフする"], "🏌":["ゴルフをする人","ボール","ゴルフ","ゴルファー","ゴルフする"],
"🏌️‍♂️":["ゴルフをする男性","ボール","ゴルフ","ゴルファー","ゴルフする","男","おとこ","男性"], "🏌️‍♂️":["ゴルフをする男性","ボール","ゴルフ","ゴルファー","ゴルフする","男","おとこ","男性"],
"🧘‍♀️":["蓮華座の女性","瞑想","ヨガ","静穏","女性","女","おんな"], "🧘‍♀️":["蓮華座の女性","瞑想","ヨガ","静穏","女性","女","おんな"],
"🧘":["蓮華座の人","瞑想","ヨガ","静穏"], "🧘":["蓮華座の人","瞑想","ヨガ","静穏"],
@ -897,16 +897,16 @@
"🚵":["マウンテンバイクに乗る人","マウンテンバイクライダー","クロスバイク","自転車","自転車乗り","自転車に乗る人","山"], "🚵":["マウンテンバイクに乗る人","マウンテンバイクライダー","クロスバイク","自転車","自転車乗り","自転車に乗る人","山"],
"🚵‍♂️":["マウンテンバイクに乗る男性","マウンテンバイクライダー","クロスバイク","自転車","自転車乗り","自転車に乗る人","サイクリスト","山","男","おとこ","男性"], "🚵‍♂️":["マウンテンバイクに乗る男性","マウンテンバイクライダー","クロスバイク","自転車","自転車乗り","自転車に乗る人","サイクリスト","山","男","おとこ","男性"],
"🎽":["ランニングシャツと襷","ランニング","襷","シャツ"], "🎽":["ランニングシャツと襷","ランニング","襷","シャツ"],
"🎖":["勲章","お祝い","メダル","軍事"], "🎖":["勲章","お祝い","メダル","軍事"],
"🏅":["スポーツのメダル","メダル"], "🏅":["スポーツのメダル","メダル"],
"🥇":["金メダル","1位","金","メダル","1","第1位"], "🥇":["金メダル","1位","金","メダル","1","第1位"],
"🥈":["銀メダル","メダル","2位","銀","2","第2位"], "🥈":["銀メダル","メダル","2位","銀","2","第2位"],
"🥉":["銅メダル","銅","メダル","3位","3","第3位"], "🥉":["銅メダル","銅","メダル","3位","3","第3位"],
"🏆":["トロフィー","賞"], "🏆":["トロフィー","賞"],
"🏵":["バラ飾り","植物"], "🏵":["バラ飾り","植物"],
"🎗":["リマインダーリボン","お祝い","リマインダー","リボン"], "🎗":["リマインダーリボン","お祝い","リマインダー","リボン"],
"🎫":["きっぷ","アクティビティ","入場料","エンターテイメント","チケット"], "🎫":["きっぷ","アクティビティ","入場料","エンターテイメント","チケット"],
"🎟":["入場券","入場料","エンターテイメント","チケット"], "🎟":["入場券","入場料","エンターテイメント","チケット"],
"🎪":["サーカス小屋","アクティビティ","サーカス","エンターテイメント","テント"], "🎪":["サーカス小屋","アクティビティ","サーカス","エンターテイメント","テント"],
"🤹‍♀️":["ジャグリングをする女性","天秤","ジャグリング","女性","女","おんな"], "🤹‍♀️":["ジャグリングをする女性","天秤","ジャグリング","女性","女","おんな"],
"🤹":["ジャグリングをする人","バランス","ジャグリング"], "🤹":["ジャグリングをする人","バランス","ジャグリング"],
@ -945,7 +945,7 @@
"🛺":["オートリキシャ","人力車","トゥクトゥク"], "🛺":["オートリキシャ","人力車","トゥクトゥク"],
"🚌":["バス","乗り物"], "🚌":["バス","乗り物"],
"🚎":["トロリーバス","バス","路面電車","市街電車","乗り物"], "🚎":["トロリーバス","バス","路面電車","市街電車","乗り物"],
"🏎":["レーシングカー","車","競争"], "🏎":["レーシングカー","車","競争"],
"🚓":["パトカー","車","パトロール","警察","乗り物"], "🚓":["パトカー","車","パトロール","警察","乗り物"],
"🚑":["救急車","乗り物"], "🚑":["救急車","乗り物"],
"🚒":["消防車","エンジン","炎","トラック","乗り物"], "🚒":["消防車","エンジン","炎","トラック","乗り物"],
@ -954,7 +954,7 @@
"🚚":["配達用トラック","配達","トラック","乗り物"], "🚚":["配達用トラック","配達","トラック","乗り物"],
"🚛":["トレーラー","大型トラック","セミ","トラック","乗り物"], "🚛":["トレーラー","大型トラック","セミ","トラック","乗り物"],
"🚜":["トラクター","乗り物"], "🚜":["トラクター","乗り物"],
"🏍":["レースバイク","オートバイ","レース"], "🏍":["レースバイク","オートバイ","レース"],
"🛵":["スクーター","モーター"], "🛵":["スクーター","モーター"],
"🚲":["自転車","バイク","乗り物"], "🚲":["自転車","バイク","乗り物"],
"🦼":["電動車いす","アクセシビリティ","車いす"], "🦼":["電動車いす","アクセシビリティ","車いす"],
@ -984,25 +984,25 @@
"🚊":["路面電車","トロリーバス","乗り物"], "🚊":["路面電車","トロリーバス","乗り物"],
"🚉":["駅","線路","電車","乗り物"], "🚉":["駅","線路","電車","乗り物"],
"🚁":["ヘリコプター","乗り物"], "🚁":["ヘリコプター","乗り物"],
"🛩":["小型航空機","飛行機","乗り物"], "🛩":["小型航空機","飛行機","乗り物"],
"✈️":["飛行機","乗り物"], "✈️":["飛行機","乗り物"],
"🛫":["飛行機の離陸","飛行機","チェックイン","出発","乗り物"], "🛫":["飛行機の離陸","飛行機","チェックイン","出発","乗り物"],
"🛬":["飛行機の着陸","飛行機","到着","着陸","乗り物"], "🛬":["飛行機の着陸","飛行機","到着","着陸","乗り物"],
"🪂":["パラシュート","パラセール","スカイダイブ","ハンググライダー"], "🪂":["パラシュート","パラセール","スカイダイブ","ハンググライダー"],
"💺":["座席","椅子"], "💺":["座席","椅子"],
"🛰":["サテライト","衛星","宇宙","乗り物"], "🛰":["サテライト","衛星","宇宙","乗り物"],
"🚀":["ロケット","宇宙","乗り物"], "🚀":["ロケット","宇宙","乗り物"],
"🛸":["空飛ぶ円盤","UFO","宇宙人","異星人","宇宙","空想"], "🛸":["空飛ぶ円盤","UFO","宇宙人","異星人","宇宙","空想"],
"🛶":["カヌー","ボート"], "🛶":["カヌー","ボート"],
"⛵":["ヨット","ボート","リゾート","海","乗り物"], "⛵":["ヨット","ボート","リゾート","海","乗り物"],
"🛥":["モーターボート","ボート","乗り物"], "🛥":["モーターボート","ボート","乗り物"],
"🚤":["スピードボート","ボート","乗り物"], "🚤":["スピードボート","ボート","乗り物"],
"⛴":["フェリー","ボート"], "⛴":["フェリー","ボート"],
"🛳":["旅客船","旅客","船","乗り物"], "🛳":["旅客船","旅客","船","乗り物"],
"🚢":["船","乗り物"], "🚢":["船","乗り物"],
"🛟":["救命浮き輪","浮き輪","ライフジャケット","ライフセーバー","救助","安全"], "🛟":["救命浮き輪","浮き輪","ライフジャケット","ライフセーバー","救助","安全"],
"⚓":["いかり","船","ツール"], "⚓":["いかり","船","ツール"],
"⛽":["ガソリンスタンド","燃料","ガソリン","給油機","サービスステーション"], "⛽":["ガソリンスタンド","燃料","ガソリン","給油機","サービスステーション"],
"🚧":["工事中","工事用フェンス","建設工事"], "🚧":["工事中","工事用フェンス","建設工事"],
"🚏":["バス停","バス","停止"], "🚏":["バス停","バス","停止"],
"🚦":["縦向きの信号機","信号機","信号","交通"], "🚦":["縦向きの信号機","信号機","信号","交通"],
@ -1011,30 +1011,30 @@
"🎡":["観覧車","アクティビティ","遊園地","エンターテイメント","フェリス"], "🎡":["観覧車","アクティビティ","遊園地","エンターテイメント","フェリス"],
"🎢":["ジェットコースター","アクティビティ","遊園地","コースター","エンターテイメント","ローラー"], "🎢":["ジェットコースター","アクティビティ","遊園地","コースター","エンターテイメント","ローラー"],
"🎠":["メリーゴーランド","アクティビティ","メリーゴーラウンド","エンターテイメント","馬"], "🎠":["メリーゴーランド","アクティビティ","メリーゴーラウンド","エンターテイメント","馬"],
"🏗":["建設中","建物","建設"], "🏗":["建設中","建物","建設"],
"🌁":["霧","天気"], "🌁":["霧","天気"],
"🗼":["東京タワー","東京","タワー"], "🗼":["東京タワー","東京","タワー"],
"🏭":["工場","建物"], "🏭":["工場","建物"],
"⛲":["噴水"], "⛲":["噴水"],
"🎑":["お月見","アクティビティ","お祝い","授賞式","エンターテイメント","月"], "🎑":["お月見","アクティビティ","お祝い","授賞式","エンターテイメント","月"],
"⛰":["山"], "⛰":["山"],
"🏔":["雪山","寒い","山","雪"], "🏔":["雪山","寒い","山","雪"],
"🗻":["富士山","山"], "🗻":["富士山","山"],
"🌋":["火山","噴火","山","気象"], "🌋":["火山","噴火","山","気象"],
"🗾":["日本列島","日本","地図"], "🗾":["日本列島","日本","地図"],
"🏕":["キャンプ"], "🏕":["キャンプ"],
"⛺":["テント","キャンプ"], "⛺":["テント","キャンプ"],
"🏞":["国立公園","公園"], "🏞":["国立公園","公園"],
"🛣":["高速道路","ハイウェイ","道路"], "🛣":["高速道路","ハイウェイ","道路"],
"🛤":["線路","鉄道","電車"], "🛤":["線路","鉄道","電車"],
"🌅":["日の出","朝","太陽","天候"], "🌅":["日の出","朝","太陽","天候"],
"🌄":["山からの日の出","朝","山","太陽","日の出","天候"], "🌄":["山からの日の出","朝","山","太陽","日の出","天候"],
"🏜":["砂漠"], "🏜":["砂漠"],
"🏖":["ビーチと傘","ビーチ","傘","パラソル"], "🏖":["ビーチと傘","ビーチ","傘","パラソル"],
"🏝":["無人島","砂漠","島"], "🏝":["無人島","砂漠","島"],
"🌇":["ビルに沈む夕陽","建物","夕暮れ","太陽","夕日","天気"], "🌇":["ビルに沈む夕陽","建物","夕暮れ","太陽","夕日","天気"],
"🌆":["夕暮れの街並み","建物","街","夕暮れ","日暮れ","風景","太陽","夕日","天気"], "🌆":["夕暮れの街並み","建物","街","夕暮れ","日暮れ","風景","太陽","夕日","天気"],
"🏙":["街並み","建物","街"], "🏙":["街並み","建物","街"],
"🌃":["星空","夜","星","天気"], "🌃":["星空","夜","星","天気"],
"🌉":["夜の橋","橋","夜","天気"], "🌉":["夜の橋","橋","夜","天気"],
"🌌":["天の川","宇宙","天気"], "🌌":["天の川","宇宙","天気"],
@ -1042,14 +1042,14 @@
"🎇":["線香花火","アクティビティ","お祝い","エンターテイメント","花火","キラキラ"], "🎇":["線香花火","アクティビティ","お祝い","エンターテイメント","花火","キラキラ"],
"🎆":["花火","アクティビティ","お祝い","エンターテイメント"], "🎆":["花火","アクティビティ","お祝い","エンターテイメント"],
"🛖":["小屋","家","扇形庫","パオ"], "🛖":["小屋","家","扇形庫","パオ"],
"🏘":["家","建物"], "🏘":["家","建物"],
"🏰":["西洋の城","建物","城","ヨーロッパ"], "🏰":["西洋の城","建物","城","ヨーロッパ"],
"🏯":["日本の城","建物","城","日本"], "🏯":["日本の城","建物","城","日本"],
"🏟":["スタジアム"], "🏟":["スタジアム"],
"🗽":["自由の女神","自由","像"], "🗽":["自由の女神","自由","像"],
"🏠":["家","建物","自宅"], "🏠":["家","建物","自宅"],
"🏡":["庭付きの家","建物","庭","自宅","家"], "🏡":["庭付きの家","建物","庭","自宅","家"],
"🏚":["廃墟","建物","廃屋","家"], "🏚":["廃墟","建物","廃屋","家"],
"🏢":["オフィスビル","建物"], "🏢":["オフィスビル","建物"],
"🏬":["デパート","建物","店"], "🏬":["デパート","建物","店"],
"🏣":["日本の郵便局","建物","日本","ポスト"], "🏣":["日本の郵便局","建物","日本","ポスト"],
@ -1061,24 +1061,24 @@
"🏫":["学校","建物"], "🏫":["学校","建物"],
"🏩":["ラブホテル","建物","ホテル","ラブ"], "🏩":["ラブホテル","建物","ホテル","ラブ"],
"💒":["結婚式","アクティビティ","チャペル","ロマンス"], "💒":["結婚式","アクティビティ","チャペル","ロマンス"],
"🏛":["歴史的な建物","建物","歴史的な"], "🏛":["歴史的な建物","建物","歴史的な"],
"⛪":["教会","建物","クリスチャン","十字架","宗教"], "⛪":["教会","建物","クリスチャン","十字架","宗教"],
"🕌":["モスク","イスラム","ムスリム","宗教"], "🕌":["モスク","イスラム","ムスリム","宗教"],
"🛕":["ヒンドゥー教寺院","ヒンドゥー教","寺院","宗教"], "🛕":["ヒンドゥー教寺院","ヒンドゥー教","寺院","宗教"],
"🕍":["シナゴーグ","ユダヤ人","ユダヤ教","宗教","会堂"], "🕍":["シナゴーグ","ユダヤ人","ユダヤ教","宗教","会堂"],
"🕋":["カアバ","イスラム","ムスリム","宗教"], "🕋":["カアバ","イスラム","ムスリム","宗教"],
"⛩":["神社","宗教","神道"], "⛩":["神社","宗教","神道"],
"⌚":["腕時計","時計"], "⌚":["腕時計","時計"],
"📱":["携帯電話","携帯","コミュニケーション","モバイル","電話"], "📱":["携帯電話","携帯","コミュニケーション","モバイル","電話"],
"📲":["着信中","矢印","通話","携帯","コミュニケーション","モバイル","携帯電話","受信","電話"], "📲":["着信中","矢印","通話","携帯","コミュニケーション","モバイル","携帯電話","受信","電話"],
"💻":["パソコン","ノートパソコン","コンピューター","パーソナル"], "💻":["パソコン","ノートパソコン","コンピューター","パーソナル"],
"⌨":["キーボード","コンピューター"], "⌨":["キーボード","コンピューター"],
"🖥":["デスクトップパソコン","コンピューター","デスクトップ"], "🖥":["デスクトップパソコン","コンピューター","デスクトップ"],
"🖨":["プリンター","コンピューター"], "🖨":["プリンター","コンピューター"],
"🖱":["3ボタンマウス","3","ボタン","コンピューター","マウス","三"], "🖱":["3ボタンマウス","3","ボタン","コンピューター","マウス","三"],
"🖲":["トラックボール","コンピューター"], "🖲":["トラックボール","コンピューター"],
"🕹":["ジョイスティック","エンターテイメント","ゲーム","ビデオゲーム"], "🕹":["ジョイスティック","エンターテイメント","ゲーム","ビデオゲーム"],
"🗜":["圧縮","ツール","欠陥"], "🗜":["圧縮","ツール","欠陥"],
"💽":["MD","パソコン","光ディスク","エンターテイメント","ミニディスク","光学"], "💽":["MD","パソコン","光ディスク","エンターテイメント","ミニディスク","光学"],
"💾":["フロッピーディスク","コンピューター","ディスク","フロッピー"], "💾":["フロッピーディスク","コンピューター","ディスク","フロッピー"],
"💿":["CDディスク","ブルーレイ","CD","コンピューター","ディスク","DVD","光学"], "💿":["CDディスク","ブルーレイ","CD","コンピューター","ディスク","DVD","光学"],
@ -1088,23 +1088,23 @@
"📸":["フラッシュを焚いたカメラ","カメラ","フラッシュ","ビデオ"], "📸":["フラッシュを焚いたカメラ","カメラ","フラッシュ","ビデオ"],
"📹":["ビデオカメラ","カメラ","エンターテイメント","ビデオ"], "📹":["ビデオカメラ","カメラ","エンターテイメント","ビデオ"],
"🎥":["ビデオカメラ","アクティビティ","カメラ","シネマ","エンターテイメント","映画"], "🎥":["ビデオカメラ","アクティビティ","カメラ","シネマ","エンターテイメント","映画"],
"📽":["映写機","シネマ","娯楽","フィルム","映画","プロジェクター","ビデオ"], "📽":["映写機","シネマ","娯楽","フィルム","映画","プロジェクター","ビデオ"],
"🎞":["フィルムのフレーム","シネマ","エンターテイメント","フィルム","フレーム","映画"], "🎞":["フィルムのフレーム","シネマ","エンターテイメント","フィルム","フレーム","映画"],
"📞":["受話器","コミュニケーション","電話","受信機"], "📞":["受話器","コミュニケーション","電話","受信機"],
"☎️":["電話","携帯電話"], "☎️":["電話","携帯電話"],
"📟":["ポケットベル","コミュニケーション","ポケベル"], "📟":["ポケットベル","コミュニケーション","ポケベル"],
"📠":["FAX","コミュニケーション; fAX"], "📠":["FAX","コミュニケーション; fAX"],
"📺":["テレビ","エンターテイメント","TV","ビデオ"], "📺":["テレビ","エンターテイメント","TV","ビデオ"],
"📻":["ラジオ","エンターテイメント","ビデオ"], "📻":["ラジオ","エンターテイメント","ビデオ"],
"🎙":["スタジオマイク","マイク","音楽","スタジオ"], "🎙":["スタジオマイク","マイク","音楽","スタジオ"],
"🎚":["調節バー","調節","音楽","バー"], "🎚":["調節バー","調節","音楽","バー"],
"🎛":["コントロールノブ","コントロール","つまみ","音楽"], "🎛":["コントロールノブ","コントロール","つまみ","音楽"],
"⏱":["ストップウォッチ","時計"], "⏱":["ストップウォッチ","時計"],
"⏲":["タイマー時計","時計","タイマー"], "⏲":["タイマー時計","時計","タイマー"],
"⏰":["目覚まし時計","アラーム","時計"], "⏰":["目覚まし時計","アラーム","時計"],
"🕰":["置き時計","時計"], "🕰":["置き時計","時計"],
"⏳":["砂時計","砂","タイマー"], "⏳":["砂時計","砂","タイマー"],
"⌛":["砂時計","砂","タイマー"], "⌛":["砂時計","砂","タイマー"],
"🧮":["そろばん","計算","カウント","集計表","数学"], "🧮":["そろばん","計算","カウント","集計表","数学"],
"📡":["衛星アンテナ","アンテナ","コミュニケーション","パラボラアンテナ","衛星"], "📡":["衛星アンテナ","アンテナ","コミュニケーション","パラボラアンテナ","衛星"],
"🔋":["電池","バッテリー","電子","高エネルギー"], "🔋":["電池","バッテリー","電子","高エネルギー"],
@ -1112,10 +1112,10 @@
"🔌":["コンセント","電気","プラグ"], "🔌":["コンセント","電気","プラグ"],
"💡":["電球","漫画","電気","ひらめき","光"], "💡":["電球","漫画","電気","ひらめき","光"],
"🔦":["懐中電灯","電気","光","道具","たいまつ"], "🔦":["懐中電灯","電気","光","道具","たいまつ"],
"🕯":["ろうそく","光"], "🕯":["ろうそく","光"],
"🧯":["消火器","消火","火","消す"], "🧯":["消火器","消火","火","消す"],
"🗑":["ごみ箱","ゴミ箱","ごみ","ゴミ","缶","ビン"], "🗑":["ごみ箱","ゴミ箱","ごみ","ゴミ","缶","ビン"],
"🛢":["ドラム缶","ドラム","オイル"], "🛢":["ドラム缶","ドラム","オイル"],
"🛒":["ショッピングカート","カート","ショッピング","トロリー"], "🛒":["ショッピングカート","カート","ショッピング","トロリー"],
"💸":["羽の生えたお札","銀行","紙幣","請求書","ドル","飛ぶ","お金","羽"], "💸":["羽の生えたお札","銀行","紙幣","請求書","ドル","飛ぶ","お金","羽"],
"💵":["ドル札","銀行","紙幣","お札","通貨","ドル","お金"], "💵":["ドル札","銀行","紙幣","お札","通貨","ドル","お金"],
@ -1128,20 +1128,20 @@
"🪪":["身分証明書","資格情報","ID","ライセンス","セキュリティ"], "🪪":["身分証明書","資格情報","ID","ライセンス","セキュリティ"],
"🧾":["領収書","会計","簿記","証拠","証明"], "🧾":["領収書","会計","簿記","証拠","証明"],
"💎":["宝石","ダイアモンド","ジュエル","ロマンス"], "💎":["宝石","ダイアモンド","ジュエル","ロマンス"],
"⚖":["はかり","天秤","公正","てんびん座","物差し","道具","重量","星座"], "⚖":["はかり","天秤","公正","てんびん座","物差し","道具","重量","星座"],
"🦯":["白杖","アクセシビリティ","目が不自由"], "🦯":["白杖","アクセシビリティ","目が不自由"],
"🧰":["道具箱","胸","整備士","工具"], "🧰":["道具箱","胸","整備士","工具"],
"🔧":["レンチ","道具"], "🔧":["レンチ","道具"],
"🪛":["ドライバー","ねじ","工具"], "🪛":["ドライバー","ねじ","工具"],
"🔨":["ハンマー","道具"], "🔨":["ハンマー","道具"],
"⚒":["ハンマーとつるはし","ハンマー","つるはし","道具"], "⚒":["ハンマーとつるはし","ハンマー","つるはし","道具"],
"🛠":["ハンマーとレンチ","ハンマー","道具","レンチ"], "🛠":["ハンマーとレンチ","ハンマー","道具","レンチ"],
"⛏":["つるはし","採掘","道具"], "⛏":["つるはし","採掘","道具"],
"🪓":["斧","たたき切り","手斧","割る","木材","工具"], "🪓":["斧","たたき切り","手斧","割る","木材","工具"],
"🪚":["木工用のこぎり","大工","材木","のこぎり","工具"], "🪚":["木工用のこぎり","大工","材木","のこぎり","工具"],
"🔩":["ナットとボルト","ボルト","ナット","道具"], "🔩":["ナットとボルト","ボルト","ナット","道具"],
"⚙":["歯車","ギア","道具"], "⚙":["歯車","ギア","道具"],
"⛓":["鎖"], "⛓":["鎖"],
"🪝":["フック","わな","いかさま","ペテン","誘惑","フィッシング","ツール"], "🪝":["フック","わな","いかさま","ペテン","誘惑","フィッシング","ツール"],
"🪜":["はしご","登る","横木","段","工具"], "🪜":["はしご","登る","横木","段","工具"],
"🧱":["れんが","粘土","建設","モルタル","壁"], "🧱":["れんが","粘土","建設","モルタル","壁"],
@ -1151,13 +1151,13 @@
"🧨":["爆竹","ダイナマイト","火薬","花火"], "🧨":["爆竹","ダイナマイト","火薬","花火"],
"💣":["爆弾"], "💣":["爆弾"],
"🔪":["包丁","キッチンナイフ","調理","ナイフ"], "🔪":["包丁","キッチンナイフ","調理","ナイフ"],
"🗡":["短剣","ナイフ"], "🗡":["短剣","ナイフ"],
"⚔":["交差した剣","交差","剣"], "⚔":["交差した剣","交差","剣"],
"🛡":["盾"], "🛡":["盾"],
"🚬":["喫煙マーク","アクティビティ","喫煙"], "🚬":["喫煙マーク","アクティビティ","喫煙"],
"⚰":["棺","死"], "⚰":["棺","死"],
"🪦":["墓石","墓地","死","墓","墓場","ハロウィーン"], "🪦":["墓石","墓地","死","墓","墓場","ハロウィーン"],
"⚱":["骨壷","死","葬儀"], "⚱":["骨壷","死","葬儀"],
"🏺":["アンフォラ","みずがめ座","料理","飲み物","水差し","道具","星座"], "🏺":["アンフォラ","みずがめ座","料理","飲み物","水差し","道具","星座"],
"🔮":["水晶玉","玉","水晶","おとぎ話","ファンタジー","占い","道具"], "🔮":["水晶玉","玉","水晶","おとぎ話","ファンタジー","占い","道具"],
"🪄":["魔法の杖","魔法","棒","魔女","魔法使い"], "🪄":["魔法の杖","魔法","棒","魔女","魔法使い"],
@ -1166,22 +1166,22 @@
"🪬":["ハムサ","お守り","ファティマ","手","メアリー","ミリアム","保護"], "🪬":["ハムサ","お守り","ファティマ","手","メアリー","ミリアム","保護"],
"💈":["理髪店の看板柱","理髪店","床屋","散髪","看板柱"], "💈":["理髪店の看板柱","理髪店","床屋","散髪","看板柱"],
"🧲":["磁石","アトラクション","馬蹄"], "🧲":["磁石","アトラクション","馬蹄"],
"⚗":["蒸留器","化学","実験","道具"], "⚗":["蒸留器","化学","実験","道具"],
"🧪":["試験管","化学者","化学","実験","実験室","科学"], "🧪":["試験管","化学者","化学","実験","実験室","科学"],
"🧫":["ペトリ皿","バクテリア","生物学者","生物学","文化","実験室"], "🧫":["ペトリ皿","バクテリア","生物学者","生物学","文化","実験室"],
"🧬":["DNA","生物学者","進化","遺伝子","遺伝子学","生命"], "🧬":["DNA","生物学者","進化","遺伝子","遺伝子学","生命"],
"🔭":["望遠鏡","ツール"], "🔭":["望遠鏡","ツール"],
"🔬":["顕微鏡","ツール"], "🔬":["顕微鏡","ツール"],
"🕳":["穴"], "🕳":["穴"],
"🩻":["X線","骨","医師","医療","骨格"], "🩻":["X線","骨","医師","医療","骨格"],
"💊":["薬","医師","ピル","病気"], "💊":["薬","医師","ピル","病気"],
"💉":["注射器","医師","薬","注射針","注射","病気","道具","ワクチン"], "💉":["注射器","医師","薬","注射針","注射","病気","道具","ワクチン"],
"🩸":["血1滴","医師","薬","血液","生理"], "🩸":["血1滴","医師","薬","血液","生理"],
"🩹":["ガーゼ付きばんそうこう","医師","薬","バンドエイド","包帯","ばんそうこう"], "🩹":["ガーゼ付きばんそうこう","医師","薬","バンドエイド","包帯","ばんそうこう"],
"🩺":["聴診器","医師","薬","心臓"], "🩺":["聴診器","医師","薬","心臓"],
"🌡":["温度計","天気","温度"], "🌡":["温度計","天気","温度"],
"🩼":["松葉杖","杖","障碍","怪我","移動補助","棒"], "🩼":["松葉杖","杖","障碍","怪我","移動補助","棒"],
"🏷":["ラベル","荷札"], "🏷":["ラベル","荷札"],
"🔖":["ブックマーク","しおり","印"], "🔖":["ブックマーク","しおり","印"],
"🚽":["トイレ"], "🚽":["トイレ"],
"🪠":["プランジャー","フォースカップ","配管工","吸引","トイレ"], "🪠":["プランジャー","フォースカップ","配管工","吸引","トイレ"],
@ -1200,24 +1200,24 @@
"🧺":["バスケット","農業","ランドリー","ピクニック"], "🧺":["バスケット","農業","ランドリー","ピクニック"],
"🪣":["バケツ","たる","手桶","大だる"], "🪣":["バケツ","たる","手桶","大だる"],
"🔑":["鍵","錠","パスワード"], "🔑":["鍵","錠","パスワード"],
"🗝":["古い鍵","かぎ","鍵","錠","古い"], "🗝":["古い鍵","かぎ","鍵","錠","古い"],
"🪤":["ネズミ捕り器","餌","ネズミ","齧歯動物","輪なわ","わな"], "🪤":["ネズミ捕り器","餌","ネズミ","齧歯動物","輪なわ","わな"],
"🛋":["ソファーとランプ","ソファー","ホテル","ランプ"], "🛋":["ソファーとランプ","ソファー","ホテル","ランプ"],
"🪑":["椅子","座席","座る"], "🪑":["椅子","座席","座る"],
"🛌":["宿泊施設","寝る","ホテル","睡眠","ベッド"], "🛌":["宿泊施設","寝る","ホテル","睡眠","ベッド"],
"🛏":["ベッド","ホテル","睡眠"], "🛏":["ベッド","ホテル","睡眠"],
"🚪":["ドア","扉"], "🚪":["ドア","扉"],
"🪞":["鏡","反射","反射体","反射鏡"], "🪞":["鏡","反射","反射体","反射鏡"],
"🪟":["窓","枠","新鮮な空気","ガラス","開口部","透明","視界"], "🪟":["窓","枠","新鮮な空気","ガラス","開口部","透明","視界"],
"🧳":["手荷物","パッキング","旅行","スーツケース"], "🧳":["手荷物","パッキング","旅行","スーツケース"],
"🛎":["卓上ベル","ベル","ホテル"], "🛎":["卓上ベル","ベル","ホテル"],
"🖼":["額に入った写真","アート","額縁","美術館","絵画","写真"], "🖼":["額に入った写真","アート","額縁","美術館","絵画","写真"],
"🧭":["コンパス","磁石","ナビゲーション","オリエンテーリング"], "🧭":["コンパス","磁石","ナビゲーション","オリエンテーリング"],
"🗺":["世界地図","地図","世界"], "🗺":["世界地図","地図","世界"],
"⛱":["立てられたパラソル","雨","晴れ","傘","天気"], "⛱":["立てられたパラソル","雨","晴れ","傘","天気"],
"🪭":["折り畳み扇子","冷却","遠慮がち","ダンス","ファン","フラッター","熱","熱い","内気","広がる"], "🪭":["折り畳み扇子","冷却","遠慮がち","ダンス","ファン","フラッター","熱","熱い","内気","広がる"],
"🗿":["モヤイ像","モアイ像","顔","像"], "🗿":["モヤイ像","モアイ像","顔","像"],
"🛍":["買い物袋","鞄","ホテル","買い物"], "🛍":["買い物袋","鞄","ホテル","買い物"],
"🎈":["風船","アクティビティ","お祝い","エンターテイメント"], "🎈":["風船","アクティビティ","お祝い","エンターテイメント"],
"🎏":["こいのぼり","アクティビティ","鯉","お祝い","エンターテイメント","旗","吹流し"], "🎏":["こいのぼり","アクティビティ","鯉","お祝い","エンターテイメント","旗","吹流し"],
"🎀":["リボン","お祝い"], "🎀":["リボン","お祝い"],
@ -1255,17 +1255,17 @@
"📄":["文書","ページ"], "📄":["文書","ページ"],
"📅":["カレンダー","日付"], "📅":["カレンダー","日付"],
"📆":["日めくりカレンダー","カレンダー"], "📆":["日めくりカレンダー","カレンダー"],
"🗓":["リングカレンダー","カレンダー","パッド","らせん状"], "🗓":["リングカレンダー","カレンダー","パッド","らせん状"],
"📇":["名刺フォルダ","カード","索引","ローラデックス"], "📇":["名刺フォルダ","カード","索引","ローラデックス"],
"🗃":["カードファイル","箱","カード","ファイル"], "🗃":["カードファイル","箱","カード","ファイル"],
"🗳":["投票用紙と投票箱","投票用紙","箱","票","投票"], "🗳":["投票用紙と投票箱","投票用紙","箱","票","投票"],
"🗄":["ファイル収納庫","収納","ファイル"], "🗄":["ファイル収納庫","収納","ファイル"],
"📋":["クリップボード"], "📋":["クリップボード"],
"🗒":["リングノート","ノート","パッド","らせん状"], "🗒":["リングノート","ノート","パッド","らせん状"],
"📁":["フォルダ","ファイル"], "📁":["フォルダ","ファイル"],
"📂":["開いたフォルダ","ファイル","フォルダ","開いた"], "📂":["開いたフォルダ","ファイル","フォルダ","開いた"],
"🗂":["仕切りカード","カード","仕切り","索引"], "🗂":["仕切りカード","カード","仕切り","索引"],
"🗞":["丸めた新聞","ニュース","新聞","紙","丸めた"], "🗞":["丸めた新聞","ニュース","新聞","紙","丸めた"],
"📰":["新聞","コミュニケーション","ニュース","紙"], "📰":["新聞","コミュニケーション","ニュース","紙"],
"🪧":["プラカード","デモ","柵","抗議","看板"], "🪧":["プラカード","デモ","柵","抗議","看板"],
"📓":["ノート"], "📓":["ノート"],
@ -1279,7 +1279,7 @@
"📖":["開いた本","本","開いた"], "📖":["開いた本","本","開いた"],
"🔗":["リンク"], "🔗":["リンク"],
"📎":["クリップ","ペーパークリップ"], "📎":["クリップ","ペーパークリップ"],
"🖇":["繋がったペーパークリップ","コミュニケーション","リンク","ペーパークリップ"], "🖇":["繋がったペーパークリップ","コミュニケーション","リンク","ペーパークリップ"],
"✂️":["ハサミ","はさみ","道具"], "✂️":["ハサミ","はさみ","道具"],
"📐":["三角定規","定規","配置","三角"], "📐":["三角定規","定規","配置","三角"],
"📏":["定規","直定規"], "📏":["定規","直定規"],
@ -1294,13 +1294,13 @@
"🔒":["鍵","閉じられた","施錠"], "🔒":["鍵","閉じられた","施錠"],
"🔓":["解錠","施錠","開ける"], "🔓":["解錠","施錠","開ける"],
"🔏":["錠前とペン","インク","錠","ペン先","ペン","プライバシー"], "🔏":["錠前とペン","インク","錠","ペン先","ペン","プライバシー"],
"🖊":["左下向きのボールペン","ボールペン","コミュニケーション","ペン"], "🖊":["左下向きのボールペン","ボールペン","コミュニケーション","ペン"],
"🖋":["左下向きの万年筆","コミュニケーション","万年筆","ペン"], "🖋":["左下向きの万年筆","コミュニケーション","万年筆","ペン"],
"✒️":["ペン先","ペン"], "✒️":["ペン先","ペン"],
"📝":["メモ","コミュニケーション","鉛筆"], "📝":["メモ","コミュニケーション","鉛筆"],
"✏️":["鉛筆"], "✏️":["鉛筆"],
"🖍":["左下向きのクレヨン","コミュニケーション","クレヨン"], "🖍":["左下向きのクレヨン","コミュニケーション","クレヨン"],
"🖌":["左下向きのブラシ","コミュニケーション","ペイントブラシ","絵"], "🖌":["左下向きのブラシ","コミュニケーション","ペイントブラシ","絵"],
"🔍":["左向き虫眼鏡","眼鏡","拡大","検索","ツール"], "🔍":["左向き虫眼鏡","眼鏡","拡大","検索","ツール"],
"🔎":["右向き虫眼鏡","眼鏡","拡大","検索","ツール"], "🔎":["右向き虫眼鏡","眼鏡","拡大","検索","ツール"],
"❤️":["赤色のハート","ハート"], "❤️":["赤色のハート","ハート"],
@ -1313,7 +1313,7 @@
"🖤":["黒いハート","ハート","黒","悪","悪者"], "🖤":["黒いハート","ハート","黒","悪","悪者"],
"🤍":["白のハート","ハート","白"], "🤍":["白のハート","ハート","白"],
"💔":["割れたハート","ハート","壊れる","破局"], "💔":["割れたハート","ハート","壊れる","破局"],
"❣":["ハートのビックリマーク","ハート","ビックリマーク","記号"], "❣":["ハートのビックリマーク","ハート","ビックリマーク","記号"],
"💕":["2つのハート","ハート","愛"], "💕":["2つのハート","ハート","愛"],
"💞":["回転するハート","ハート","回転"], "💞":["回転するハート","ハート","回転"],
"💓":["鼓動するハート","ハート","鼓動","ドキドキ"], "💓":["鼓動するハート","ハート","鼓動","ドキドキ"],
@ -1324,40 +1324,40 @@
"❤️‍🔥":["燃えているハート","ハート","火","燃える","愛","熱情","神聖なハート"], "❤️‍🔥":["燃えているハート","ハート","火","燃える","愛","熱情","神聖なハート"],
"❤️‍🩹":["手当しているハート","ハート","健康になる","改善している","手当している","回復している","病み上がり","元気"], "❤️‍🩹":["手当しているハート","ハート","健康になる","改善している","手当している","回復している","病み上がり","元気"],
"💟":["ハートのデコレーション","ハート"], "💟":["ハートのデコレーション","ハート"],
"☮":["ピースマーク","平和"], "☮":["ピースマーク","平和"],
"✝":["ラテン十字","クリスチャン","十字架","宗教"], "✝":["ラテン十字","クリスチャン","十字架","宗教"],
"☪":["星と三日月","イスラム","ムスリム","宗教"], "☪":["星と三日月","イスラム","ムスリム","宗教"],
"🕉":["オームマーク","ヒンドゥー教","オーム","宗教"], "🕉":["オームマーク","ヒンドゥー教","オーム","宗教"],
"☸":["法輪","仏教徒","ダーマ","宗教"], "☸":["法輪","仏教徒","ダーマ","宗教"],
"✡":["ダビデの星","ダビデ","ユダヤ人","ユダヤ教","宗教","星"], "✡":["ダビデの星","ダビデ","ユダヤ人","ユダヤ教","宗教","星"],
"🔯":["六芒星","占い","星"], "🔯":["六芒星","占い","星"],
"🕎":["ハヌッキーヤー","燭台","メノーラー","宗教"], "🕎":["ハヌッキーヤー","燭台","メノーラー","宗教"],
"☯":["陰陽","宗教","道","道家","陽","陰"], "☯":["陰陽","宗教","道","道家","陽","陰"],
"☦":["八端十字架","クリスチャン","十字架","宗教"], "☦":["八端十字架","クリスチャン","十字架","宗教"],
"🪯":["カンダ","宗教","シーク教徒"], "🪯":["カンダ","宗教","シーク教徒"],
"🛐":["礼拝所","宗教","礼拝"], "🛐":["礼拝所","宗教","礼拝"],
"⛎":["へびつかい座","運搬人","蛇","ヘビ","星座"], "⛎":["へびつかい座","運搬人","蛇","ヘビ","星座"],
"♈":["おひつじ座","仔羊","星座"], "♈":["おひつじ座","仔羊","星座"],
"♉":["おうし座","牡牛","雄牛","星座"], "♉":["おうし座","牡牛","雄牛","星座"],
"♊":["ふたご座","ふたご","星座"], "♊":["ふたご座","ふたご","星座"],
"♋":["ガン","かに座","カニ","蟹","星座"], "♋":["ガン","かに座","カニ","蟹","星座"],
"♌":["しし座","ライオン","星座"], "♌":["しし座","ライオン","星座"],
"♍":["おとめ座","乙女","処女","星座"], "♍":["おとめ座","乙女","処女","星座"],
"♎":["てんびん座","天秤","公正","はかり","星座"], "♎":["てんびん座","天秤","公正","はかり","星座"],
"♏":["さそり座","さそり","サソリ","星座"], "♏":["さそり座","さそり","サソリ","星座"],
"♐":["いて座","射手","射手座","星座"], "♐":["いて座","射手","射手座","星座"],
"♑":["やぎ座","ヤギ","星座"], "♑":["やぎ座","ヤギ","星座"],
"♒":["みずがめ座","運搬人","水","星座"], "♒":["みずがめ座","運搬人","水","星座"],
"♓":["うお座","魚","星座"], "♓":["うお座","魚","星座"],
"🆔":["四角囲みID","ID","識別"], "🆔":["四角囲みID","ID","識別"],
"⚛":["元素記号","無神論者","原子"], "⚛":["元素記号","無神論者","原子"],
"⚕️":["アスクレピオスの杖","健康","世話","医師","薬","杖","ヘビ"], "⚕️":["アスクレピオスの杖","健康","世話","医師","薬","杖","ヘビ"],
"☢":["放射能標識","放射能"], "☢":["放射能標識","放射能"],
"☣":["バイオハザード標識","生物災害"], "☣":["バイオハザード標識","生物災害"],
"📴":["携帯電話電源オフ","携帯","コミュニケーション","モバイル","オフ","携帯電話","電話"], "📴":["携帯電話電源オフ","携帯","コミュニケーション","モバイル","オフ","携帯電話","電話"],
"📳":["マナーモード","携帯","コミュニケーション","モバイル","モード","携帯電話","電話","バイブレーション"], "📳":["マナーモード","携帯","コミュニケーション","モバイル","モード","携帯電話","電話","バイブレーション"],
"🈶":["四角囲み有","日本語","あり"], "🈶":["四角囲み有","日本語","あり"],
"🈚":["四角囲み無","四角囲み否","日本語","なし"], "🈚":["四角囲み無","四角囲み否","日本語","なし"],
"🈸":["四角囲み申","四角囲み適","中国語","申請"], "🈸":["四角囲み申","四角囲み適","中国語","申請"],
"🈺":["四角囲み営","中国語","営業"], "🈺":["四角囲み営","中国語","営業"],
"🈷️":["四角囲み月","日本語","月極"], "🈷️":["四角囲み月","日本語","月極"],
@ -1378,11 +1378,11 @@
"🆑":["四角囲みCL","CL"], "🆑":["四角囲みCL","CL"],
"🅾️":["黒四角囲みO","血液型","O"], "🅾️":["黒四角囲みO","血液型","O"],
"🆘":["四角囲みSOS","ヘルプ","SOS"], "🆘":["四角囲みSOS","ヘルプ","SOS"],
"⛔":["立入禁止","立ち入り","禁止","だめ","できない","禁じる","交通"], "⛔":["立入禁止","立ち入り","禁止","だめ","できない","禁じる","交通"],
"📛":["名札","バッジ","名前"], "📛":["名札","バッジ","名前"],
"🚫":["進入禁止","立ち入り","禁止","だめ","できない","禁じる"], "🚫":["進入禁止","立ち入り","禁止","だめ","できない","禁じる"],
"❌":["バツ印","キャンセル","記号","掛け算","乗算","x"], "❌":["バツ印","キャンセル","記号","掛け算","乗算","x"],
"⭕":["太い大きな丸","丸","O"], "⭕":["太い大きな丸","丸","O"],
"💢":["怒りマーク","怒り","漫画","激怒"], "💢":["怒りマーク","怒り","漫画","激怒"],
"♨️":["温泉","温かい","湧き出る","蒸気"], "♨️":["温泉","温かい","湧き出る","蒸気"],
"🚷":["歩行者立入禁止","禁止","だめ","ない","歩行者","禁じる"], "🚷":["歩行者立入禁止","禁止","だめ","ない","歩行者","禁じる"],
@ -1392,7 +1392,7 @@
"🔞":["18歳未満禁止","18","年齢制限","十八","禁止","だめ","ない","禁止した","未成年者"], "🔞":["18歳未満禁止","18","年齢制限","十八","禁止","だめ","ない","禁止した","未成年者"],
"📵":["携帯電話禁止","携帯","通信","禁止","モバイル","だめ","できない","携帯電話","禁止されている","電話"], "📵":["携帯電話禁止","携帯","通信","禁止","モバイル","だめ","できない","携帯電話","禁止されている","電話"],
"🚭":["禁煙","禁止","だめ","できない","禁止されている","喫煙"], "🚭":["禁煙","禁止","だめ","できない","禁止されている","喫煙"],
"❗":["赤いビックリマーク","ビックリ","マーク","記号"], "❗":["赤いビックリマーク","ビックリ","マーク","記号"],
"❕":["白いビックリマーク","ビックリ","マーク","囲み","記号"], "❕":["白いビックリマーク","ビックリ","マーク","囲み","記号"],
"❓":["赤いはてなマーク","マーク","記号","はてな"], "❓":["赤いはてなマーク","マーク","記号","はてな"],
"❔":["白いはてなマーク","マーク","囲み","記号","はてな"], "❔":["白いはてなマーク","マーク","囲み","記号","はてな"],
@ -1402,13 +1402,13 @@
"🔅":["低輝度","明るさ","薄暗い","低"], "🔅":["低輝度","明るさ","薄暗い","低"],
"🔆":["高輝度","明るい","明るさ"], "🔆":["高輝度","明るい","明るさ"],
"🔱":["トライデント","いかり","エンブレム","船","工具"], "🔱":["トライデント","いかり","エンブレム","船","工具"],
"⚜":["ユリの紋章"], "⚜":["ユリの紋章"],
"〽️":["庵点","印","部分"], "〽️":["庵点","印","部分"],
"⚠️":["警告"], "⚠️":["警告"],
"🚸":["交差点を渡る子供たち","子供","交差点","歩行者","交通"], "🚸":["交差点を渡る子供たち","子供","交差点","歩行者","交通"],
"🔰":["初心者マーク","初心者","マーク","緑","日本","若葉","道具","黄"], "🔰":["初心者マーク","初心者","マーク","緑","日本","若葉","道具","黄"],
"♻️":["リサイクルマーク","リサイクル"], "♻️":["リサイクルマーク","リサイクル"],
"🈯":["四角囲み指","日本語"], "🈯":["四角囲み指","日本語"],
"💹":["上昇トレンドのチャートと円記号","上昇中円チャート","銀行","チャート","通貨","グラフ","成長","市場","お金","上昇","トレンド","上向き","円"], "💹":["上昇トレンドのチャートと円記号","上昇中円チャート","銀行","チャート","通貨","グラフ","成長","市場","お金","上昇","トレンド","上向き","円"],
"❇️":["キラキラ"], "❇️":["キラキラ"],
"✳️":["アスタリスク (8本構成)","アスタリスク"], "✳️":["アスタリスク (8本構成)","アスタリスク"],
@ -1422,7 +1422,7 @@
"Ⓜ️":["丸囲みM","円","M"], "Ⓜ️":["丸囲みM","円","M"],
"🏧":["ATM","ATM記号","自動","銀行","出納"], "🏧":["ATM","ATM記号","自動","銀行","出納"],
"🚾":["トイレ","化粧室","お手洗い","水","WC"], "🚾":["トイレ","化粧室","お手洗い","水","WC"],
"♿":["車いす","アクセス","車椅子"], "♿":["車いす","アクセス","車椅子"],
"🅿️":["黒四角囲みP","駐車場"], "🅿️":["黒四角囲みP","駐車場"],
"🈳":["四角囲み空","四角囲みの空","中国語","空室","空き","空車"], "🈳":["四角囲み空","四角囲みの空","中国語","空室","空き","空車"],
"🈂️":["四角囲みサ","日本人","サービス"], "🈂️":["四角囲みサ","日本人","サービス"],
@ -1450,26 +1450,26 @@
"🆒":["COOL","かっこいい","クール"], "🆒":["COOL","かっこいい","クール"],
"🆕":["四角囲みnew","新"], "🆕":["四角囲みnew","新"],
"🆓":["四角囲みFREE","フリー","無料"], "🆓":["四角囲みFREE","フリー","無料"],
"0⃣":["0キー","0","キー","ゼロ"], "0⃣":["0キー","0","キー","ゼロ"],
"1⃣":["1キー","","キー","一"], "1⃣":["1キー","","キー","一"],
"2⃣":["2キー","2","キー","ニ"], "2⃣":["2キー","2","キー","ニ"],
"3⃣":["3キー","3","キー","三"], "3⃣":["3キー","3","キー","三"],
"4⃣":["4キー","4","四","キー"], "4⃣":["4キー","4","四","キー"],
"5⃣":["5キー","5","五","キー"], "5⃣":["5キー","5","五","キー"],
"6⃣":["6キー","6","キー","六"], "6⃣":["6キー","6","キー","六"],
"7⃣":["7キー","7","キー","七"], "7⃣":["7キー","7","キー","七"],
"8⃣":["8キー","8","八","キー"], "8⃣":["8キー","8","八","キー"],
"9⃣":["9キー","9","キー","九"], "9⃣":["9キー","9","キー","九"],
"🔟":["10キー","10","キー","十"], "🔟":["10キー","10","キー","十"],
"🔢":["番号の入力記号","1234","入力","数字"], "🔢":["番号の入力記号","1234","入力","数字"],
"▶️":["右向き三角","再生ボタン","矢印","再生","右","三角形"], "▶️":["右向き三角","再生ボタン","矢印","再生","右","三角形"],
"⏸":["2本の垂直バー","一時停止ボタン","バー","2倍","一時停止","垂直"], "⏸":["2本の垂直バー","一時停止ボタン","バー","2倍","一時停止","垂直"],
"⏯":["右向きの三角形と二重垂直棒","再生または一時停止ボタン","矢印","一時停止","再生","右","三角形"], "⏯":["右向きの三角形と二重垂直棒","再生または一時停止ボタン","矢印","一時停止","再生","右","三角形"],
"⏹":["停止","停止ボタン","四角"], "⏹":["停止","停止ボタン","四角"],
"⏺":["録画","録画ボタン","丸"], "⏺":["録画","録画ボタン","丸"],
"⏏️":["取り出しマーク","取り出しボタン"], "⏏️":["取り出しマーク","取り出しボタン"],
"⏭":["右向きの二重三角形と垂直棒","「次の曲」ボタン","矢印","次の場面","次の曲","三角形"], "⏭":["右向きの二重三角形と垂直棒","「次の曲」ボタン","矢印","次の場面","次の曲","三角形"],
"⏮":["左向きの二重三角形と垂直棒","「前の曲」ボタン","矢印","前の場面","前の曲","三角形"], "⏮":["左向きの二重三角形と垂直棒","「前の曲」ボタン","矢印","前の場面","前の曲","三角形"],
"⏩":["右向きの二重三角形","早送りボタン","矢印","2倍","高速","進む"], "⏩":["右向きの二重三角形","早送りボタン","矢印","2倍","高速","進む"],
"⏪":["左向きの二重三角形","早戻しボタン","矢印","2倍","巻き戻し"], "⏪":["左向きの二重三角形","早戻しボタン","矢印","2倍","巻き戻し"],
"🔀":["ねじり右向き矢印の絵文字","シャッフル","矢印","交差"], "🔀":["ねじり右向き矢印の絵文字","シャッフル","矢印","交差"],
@ -1496,7 +1496,7 @@
"🔃":["ループ矢印","時計の針","矢印","時計回り","リロード"], "🔃":["ループ矢印","時計の針","矢印","時計回り","リロード"],
"⤴️":["右上へカーブする矢印","上へカーブする右矢印","矢印"], "⤴️":["右上へカーブする矢印","上へカーブする右矢印","矢印"],
"⤵️":["右下へカーブする矢印","下にカーブする右矢印","矢印","下"], "⤵️":["右下へカーブする矢印","下にカーブする右矢印","矢印","下"],
"#⃣":["#キー","ハッシュ","キー","ポンド"], "#⃣":["#キー","ハッシュ","キー","ポンド"],
"*⃣":["アスタリスクキー","アスタリスク","キー","星"], "*⃣":["アスタリスクキー","アスタリスク","キー","星"],
"":["情報源","i","インフォメーション"], "":["情報源","i","インフォメーション"],
"🔤":["アルファベット入力","abc","アルファベット","入力","ラテン","文字"], "🔤":["アルファベット入力","abc","アルファベット","入力","ラテン","文字"],
@ -1532,8 +1532,8 @@
"🔵":["青丸","青","円","幾何学"], "🔵":["青丸","青","円","幾何学"],
"🟣":["紫の丸","円","幾何学","紫"], "🟣":["紫の丸","円","幾何学","紫"],
"🟤":["茶色の丸","円","幾何学","茶色"], "🟤":["茶色の丸","円","幾何学","茶色"],
"⚫":["黒丸","円","幾何学"], "⚫":["黒丸","円","幾何学"],
"⚪":["白丸","円","幾何学"], "⚪":["白丸","円","幾何学"],
"🟥":["赤の正方形","正方形","幾何学","赤"], "🟥":["赤の正方形","正方形","幾何学","赤"],
"🟧":["オレンジ色の正方形","正方形","幾何学","オレンジ"], "🟧":["オレンジ色の正方形","正方形","幾何学","オレンジ"],
"🟨":["黄色の正方形","正方形","幾何学","黄色"], "🟨":["黄色の正方形","正方形","幾何学","黄色"],
@ -1541,12 +1541,12 @@
"🟦":["青の正方形","正方形","幾何学","青"], "🟦":["青の正方形","正方形","幾何学","青"],
"🟪":["紫の正方形","正方形","幾何学","紫"], "🟪":["紫の正方形","正方形","幾何学","紫"],
"🟫":["茶色の正方形","正方形","幾何学","茶色"], "🟫":["茶色の正方形","正方形","幾何学","茶色"],
"⬛":["黒い大きな四角","幾何学","正方形"], "⬛":["黒い大きな四角","幾何学","正方形"],
"⬜":["白い大きな四角","幾何学","正方形"], "⬜":["白い大きな四角","幾何学","正方形"],
"◼️":["黒い中くらいの四角","幾何学","正方形"], "◼️":["黒い中くらいの四角","幾何学","正方形"],
"◻️":["白くて中くらいの四角","幾何学","正方形"], "◻️":["白くて中くらいの四角","幾何学","正方形"],
"◾":["黒くて中くらいの小さい四角","幾何学","正方形"], "◾":["黒くて中くらいの小さい四角","幾何学","正方形"],
"◽":["白い中くらいの小さな四角","幾何学","正方形"], "◽":["白い中くらいの小さな四角","幾何学","正方形"],
"▪️":["黒い小さな四角","幾何学","正方形"], "▪️":["黒い小さな四角","幾何学","正方形"],
"▫️":["白い小さな四角","幾何学","正方形"], "▫️":["白い小さな四角","幾何学","正方形"],
"🔸":["小さいオレンジのダイヤモンド","ダイヤモンド","幾何学","オレンジ"], "🔸":["小さいオレンジのダイヤモンド","ダイヤモンド","幾何学","オレンジ"],
@ -1566,16 +1566,16 @@
"🔔":["ベル"], "🔔":["ベル"],
"🔕":["ミュート","スラッシュベル","鐘","禁じられた","だめ","ない","禁止","静か"], "🔕":["ミュート","スラッシュベル","鐘","禁じられた","だめ","ない","禁止","静か"],
"🃏":["トランプのジョーカー","カード","エンターテイメント","ゲーム","ジョーカー","プレイ"], "🃏":["トランプのジョーカー","カード","エンターテイメント","ゲーム","ジョーカー","プレイ"],
"🀄":["麻雀牌の中","ゲーム","麻雀","赤"], "🀄":["麻雀牌の中","ゲーム","麻雀","赤"],
"♠️":["トランプのスペード","カード","ゲーム","スペード","スーツ"], "♠️":["トランプのスペード","カード","ゲーム","スペード","スーツ"],
"♣️":["トランプのクラブ","カード","クラブ","ゲーム","スーツ"], "♣️":["トランプのクラブ","カード","クラブ","ゲーム","スーツ"],
"♥️":["トランプのハート","カード","ゲーム","ハート","スーツ"], "♥️":["トランプのハート","カード","ゲーム","ハート","スーツ"],
"♦️":["トランプのダイヤ","カード","ダイヤ","ダイヤモンド","ゲーム","スーツ"], "♦️":["トランプのダイヤ","カード","ダイヤ","ダイヤモンド","ゲーム","スーツ"],
"🎴":["花札","アクティビティ","カード","エンターテイメント","花","ゲーム","日本","プレイ"], "🎴":["花札","アクティビティ","カード","エンターテイメント","花","ゲーム","日本","プレイ"],
"👁‍🗨":["吹き出しの目","吹き出し","目","スピーチ","証人"], "👁‍🗨":["吹き出しの目","吹き出し","目","スピーチ","証人"],
"🗨":["左向きの吹き出し","セリフ","スピーチ"], "🗨":["左向きの吹き出し","セリフ","スピーチ"],
"💭":["考え吹き出し","吹き出し","泡","漫画","考え"], "💭":["考え吹き出し","吹き出し","泡","漫画","考え"],
"🗯":["右向きの怒りの吹き出し","怒り","吹き出し","泡","激怒"], "🗯":["右向きの怒りの吹き出し","怒り","吹き出し","泡","激怒"],
"💬":["吹き出し","泡","漫画","セリフ","スピーチ"], "💬":["吹き出し","泡","漫画","セリフ","スピーチ"],
"🕐":["1時","0分","1","時計","時","一"], "🕐":["1時","0分","1","時計","時","一"],
"🕑":["2時","0分","2","時計","時","二"], "🕑":["2時","0分","2","時計","時","二"],
@ -1601,7 +1601,7 @@
"🕥":["10時半","10時","半","時刻","十","30"], "🕥":["10時半","10時","半","時刻","十","30"],
"🕦":["11時半","11時","半","時刻","十一","30"], "🕦":["11時半","11時","半","時刻","十一","30"],
"🕧":["12時半","12時","半","時刻","30","十二"], "🕧":["12時半","12時","半","時刻","30","十二"],
"🏳":["なびく白旗","旗","なびく"], "🏳":["なびく白旗","旗","なびく"],
"🏴":["なびく黒旗","旗","なびく"], "🏴":["なびく黒旗","旗","なびく"],
"🏁":["チェッカーフラッグ","市松模様","旗","レース"], "🏁":["チェッカーフラッグ","市松模様","旗","レース"],
"🚩":["三角旗","旗","ポスト"], "🚩":["三角旗","旗","ポスト"],
@ -1861,5 +1861,6 @@
"🇾🇹":["マヨットの旗","国旗","マヨット"], "🇾🇹":["マヨットの旗","国旗","マヨット"],
"🇿🇦":["南アフリカ国旗","国旗","南","南アフリカ"], "🇿🇦":["南アフリカ国旗","国旗","南","南アフリカ"],
"🇿🇲":["ザンビア国旗","国旗","ザンビア"], "🇿🇲":["ザンビア国旗","国旗","ザンビア"],
"🇿🇼":["ジンバブエ国旗","国旗","ジンバブエ"] "🇿🇼":["ジンバブエ国旗","国旗","ジンバブエ"],
"": ["渋谷109", "SHIBUYA109", "109"]
} }

View file

@ -61,7 +61,7 @@
"😔": ["かなしげなかお","がっかり","かお","かなしい"], "😔": ["かなしげなかお","がっかり","かお","かなしい"],
"😕": ["こまったかお","こまった","かお"], "😕": ["こまったかお","こまった","かお"],
"🙁": ["ごきげんななめ","かお","しかめっつら","かなしい","ふこう"], "🙁": ["ごきげんななめ","かお","しかめっつら","かなしい","ふこう"],
"☹": ["しかめっつら","かお","かなしい","ふこう"], "☹": ["しかめっつら","かお","かなしい","ふこう"],
"😬": ["しかめっつら","かお"], "😬": ["しかめっつら","かお"],
"🥺": ["うったえかけるかお","かお","ものごい","じひ","こいぬのめ"], "🥺": ["うったえかけるかお","かお","ものごい","じひ","こいぬのめ"],
"😣": ["がまんしているかお","かお","がんばる"], "😣": ["がまんしているかお","かお","がんばる"],
@ -111,7 +111,7 @@
"💩": ["うんち","まんが","ふん","かお","もんすたー"], "💩": ["うんち","まんが","ふん","かお","もんすたー"],
"👻": ["おばけ","ようかい","かお","おとぎばなし","ふぁんたじー","ゆうれい","もんすたー","はろうぃーん"], "👻": ["おばけ","ようかい","かお","おとぎばなし","ふぁんたじー","ゆうれい","もんすたー","はろうぃーん"],
"💀": ["どくろ","からだ","し","かお","おとぎばなし","もんすたー","がいこつ","はろうぃーん"], "💀": ["どくろ","からだ","し","かお","おとぎばなし","もんすたー","がいこつ","はろうぃーん"],
"☠": ["どくろまーく","からだ","こうさしたほね","し","かお","もんすたー","がいこつ","はろうぃーん"], "☠": ["どくろまーく","からだ","こうさしたほね","し","かお","もんすたー","がいこつ","はろうぃーん"],
"👽": ["うちゅうじん","かいじゅう","いせいじん","かお","おとぎばなし","ふぁんたじー","もんすたー","うちゅう","UFO"], "👽": ["うちゅうじん","かいじゅう","いせいじん","かお","おとぎばなし","ふぁんたじー","もんすたー","うちゅう","UFO"],
"🤖": ["ろぼっとのかお","かお","もんすたー","ろぼっと"], "🤖": ["ろぼっとのかお","かお","もんすたー","ろぼっと"],
"🎃": ["じゃっく・お・らんたん","いべんと","おいわい","えんため","はろうぃん","じゃっくおらんたん","らんたん","かぼちゃ"], "🎃": ["じゃっく・お・らんたん","いべんと","おいわい","えんため","はろうぃん","じゃっくおらんたん","らんたん","かぼちゃ"],
@ -138,7 +138,7 @@
"🤛": ["ひだりむきのこぶし","からだ","こぶし","ひだりむき"], "🤛": ["ひだりむきのこぶし","からだ","こぶし","ひだりむき"],
"🤜": ["みぎむきのこぶし","からだ","こぶし","みぎむき"], "🤜": ["みぎむきのこぶし","からだ","こぶし","みぎむき"],
"🤞": ["こうささせたゆび","からだ","こうさ","ゆび","て","こううん"], "🤞": ["こうささせたゆび","からだ","こうさ","ゆび","て","こううん"],
"✌": ["Vさいん","からだ","て","V","ぶい","かつ","しょうり","ぴーす"], "✌": ["Vさいん","からだ","て","V","ぶい","かつ","しょうり","ぴーす"],
"🫰": ["ひとさしゆびとおやゆびをこうさしたて","たかい","はーと","あい","おかね","すなっぷ"], "🫰": ["ひとさしゆびとおやゆびをこうさしたて","たかい","はーと","あい","おかね","すなっぷ"],
"🤘": ["こるな","からだ","ゆび","て","つの","さいこう"], "🤘": ["こるな","からだ","ゆび","て","つの","さいこう"],
"🤟": ["あいしてるのじぇすちゃー","からだ","あいしてる","すき","て"], "🤟": ["あいしてるのじぇすちゃー","からだ","あいしてる","すき","て"],
@ -151,10 +151,10 @@
"👉": ["ゆびさし","てのこう","からだ","ゆび","て","ひとさしゆび","ゆびさす"], "👉": ["ゆびさし","てのこう","からだ","ゆび","て","ひとさしゆび","ゆびさす"],
"👆": ["ゆびさし","てのこう","からだ","ゆび","て","ひとさしゆび","ゆびさす","うえ"], "👆": ["ゆびさし","てのこう","からだ","ゆび","て","ひとさしゆび","ゆびさす","うえ"],
"👇": ["ゆびさし","てのこう","からだ","した","ゆび","て","ひとさしゆび","ゆびさす"], "👇": ["ゆびさし","てのこう","からだ","した","ゆび","て","ひとさしゆび","ゆびさす"],
"☝": ["ゆびさし","からだ","ゆび","て","ひとさしゆび","ゆびさす","うえ"], "☝": ["ゆびさし","からだ","ゆび","て","ひとさしゆび","ゆびさす","うえ"],
"✋": ["きょしゅ","からだ","て"], "✋": ["きょしゅ","からだ","て"],
"🤚": ["てのこう","からだ","あげる"], "🤚": ["てのこう","からだ","あげる"],
"🖐": ["ひろげたてのひら","からだ","ゆび","て","ひろげる"], "🖐": ["ひろげたてのひら","からだ","ゆび","て","ひろげる"],
"🖖": ["ちょうじゅとはんえいを","からだ","ゆび","て","すぽっく","ばるかん"], "🖖": ["ちょうじゅとはんえいを","からだ","ゆび","て","すぽっく","ばるかん"],
"👋": ["ばいばい","からだ","て","ふる","やっほー","こんにちは"], "👋": ["ばいばい","からだ","て","ふる","やっほー","こんにちは"],
"🤙": ["でんわのかたちのて","からだ","でんわ","て"], "🤙": ["でんわのかたちのて","からだ","でんわ","て"],
@ -166,7 +166,7 @@
"🦾": ["めかにかるあーむ","あくせしびりてぃ","ぎしゅ","じんこうそうぐ","からだ"], "🦾": ["めかにかるあーむ","あくせしびりてぃ","ぎしゅ","じんこうそうぐ","からだ"],
"🖕": ["なかゆびをたてたて","からだ","ゆび","て","なかゆび"], "🖕": ["なかゆびをたてたて","からだ","ゆび","て","なかゆび"],
"🫵": ["みているひとをさしているひとさしゆび","さす","あなた","ゆび"], "🫵": ["みているひとをさしているひとさしゆび","さす","あなた","ゆび"],
"✍": ["かいているて","からだ","て","かく"], "✍": ["かいているて","からだ","て","かく"],
"🤳": ["じどり","かめら","けいたい","うで"], "🤳": ["じどり","かめら","けいたい","うで"],
"💅": ["まにきゅあ","からだ","けあ","けしょうひん","こすめ","つめ","ねいる"], "💅": ["まにきゅあ","からだ","けあ","けしょうひん","こすめ","つめ","ねいる"],
"🦵": ["あし","からだ","きっく","てあし"], "🦵": ["あし","からだ","きっく","てあし"],
@ -179,7 +179,7 @@
"👂": ["みみ","からだ","はな"], "👂": ["みみ","からだ","はな"],
"🦻": ["ほちょうきをつけているみみ","あくせしびりてぃ","ほちょうき","きく","からだ","みみ"], "🦻": ["ほちょうきをつけているみみ","あくせしびりてぃ","ほちょうき","きく","からだ","みみ"],
"👃": ["はな","からだ"], "👃": ["はな","からだ"],
"👁": ["め","からだ"], "👁": ["め","からだ"],
"👀": ["め","からだ","かお"], "👀": ["め","からだ","かお"],
"🧠": ["のう","からだ","ぞうき","ちてき","かしこい"], "🧠": ["のう","からだ","ぞうき","ちてき","かしこい"],
"🫀": ["かいぼうがくてきなしんぞう","かいぼうがく","しんぞうがく","しんぞう","ぞうき","みゃく"], "🫀": ["かいぼうがくてきなしんぞう","かいぼうがく","しんぞうがく","しんぞう","ぞうき","みゃく"],
@ -187,7 +187,7 @@
"🦴": ["ほね","からだ","こっかく"], "🦴": ["ほね","からだ","こっかく"],
"👤": ["じょうはんしんのしるえっと","じょうはんしん","しるえっと"], "👤": ["じょうはんしんのしるえっと","じょうはんしん","しるえっと"],
"👥": ["じょうはんしんのしるえっと","じょうはんしん","しるえっと"], "👥": ["じょうはんしんのしるえっと","じょうはんしん","しるえっと"],
"🗣": ["しゃべるあたまのしるえっと","かお","あたま","しるえっと","しゃべる","はなす"], "🗣": ["しゃべるあたまのしるえっと","かお","あたま","しるえっと","しゃべる","はなす"],
"🫂": ["はぐしているひとたち","さようなら","こんにちは","はぐ","ありがとう"], "🫂": ["はぐしているひとたち","さようなら","こんにちは","はぐ","ありがとう"],
"👶": ["あかちゃん"], "👶": ["あかちゃん"],
"👧": ["おんなのこ","しょうじょ","しょじょ","おとめざ","せいざ","こども"], "👧": ["おんなのこ","しょうじょ","しょじょ","おとめざ","せいざ","こども"],
@ -281,7 +281,7 @@
"💂‍♂️": ["だんせいけいびいん","けいびいん","けいび","おとこ","だんせい"], "💂‍♂️": ["だんせいけいびいん","けいびいん","けいび","おとこ","だんせい"],
"🥷": ["にんじゃ","せんし","かくされた","すてるす"], "🥷": ["にんじゃ","せんし","かくされた","すてるす"],
"🕵️‍♀️": ["じょせいのたんてい","たんてい","けいじ","すぱい","じょせい","おんな"], "🕵️‍♀️": ["じょせいのたんてい","たんてい","けいじ","すぱい","じょせい","おんな"],
"🕵": ["たんてい","けいじ","すぱい"], "🕵": ["たんてい","けいじ","すぱい"],
"🕵️‍♂️": ["だんせいのたんてい","たんてい","けいじ","すぱい","おとこ","だんせい"], "🕵️‍♂️": ["だんせいのたんてい","たんてい","けいじ","すぱい","おとこ","だんせい"],
"🤶": ["みせす・くろーす","いべんと","おいわい","くりすます","はは","さんた","くろーす","じょせい","おんな"], "🤶": ["みせす・くろーす","いべんと","おいわい","くりすます","はは","さんた","くろーす","じょせい","おんな"],
"🧑‍🎄": ["みくすくろーす","あくてぃびてぃ","おいわい","くりすます","さんた","くろーす"], "🧑‍🎄": ["みくすくろーす","あくてぃびてぃ","おいわい","くりすます","さんた","くろーす"],
@ -300,7 +300,7 @@
"🩵": ["らいとぶるーのはーと","しあん","はーと","らいとぶるー","こがも"], "🩵": ["らいとぶるーのはーと","しあん","はーと","らいとぶるー","こがも"],
"🩶": ["ぐれーのはーと","ぐれー","はーと","しるばー","すれーと"], "🩶": ["ぐれーのはーと","ぐれー","はーと","しるばー","すれーと"],
"🕴️‍♀️": ["ちゅうにういたすーつのじょせい","びじねす","すーつ","じょせい","おんな"], "🕴️‍♀️": ["ちゅうにういたすーつのじょせい","びじねす","すーつ","じょせい","おんな"],
"🕴": ["ちゅうにういたすーつのひと","びじねす","すーつ"], "🕴": ["ちゅうにういたすーつのひと","びじねす","すーつ"],
"🕴️‍♂️": ["ちゅうにういたすーつのだんせい","びじねす","すーつ","おとこ","だんせい"], "🕴️‍♂️": ["ちゅうにういたすーつのだんせい","びじねす","すーつ","おとこ","だんせい"],
"🦸‍♀️": ["じょせいのすーぱーひーろー","くうそう","ぜん","ひろいん","ちょうたいこく","じょせい","おんな"], "🦸‍♀️": ["じょせいのすーぱーひーろー","くうそう","ぜん","ひろいん","ちょうたいこく","じょせい","おんな"],
"🦸": ["すーぱーひーろー","くうそう","ぜん","ひーろー","ひろいん","ちょうたいこく"], "🦸": ["すーぱーひーろー","くうそう","ぜん","ひーろー","ひろいん","ちょうたいこく"],
@ -468,7 +468,7 @@
"🎩": ["しるくはっと","あくてぃびてぃ","ふく","えんたーていんめんと","ごらく","ぼうし","とっぷす"], "🎩": ["しるくはっと","あくてぃびてぃ","ふく","えんたーていんめんと","ごらく","ぼうし","とっぷす"],
"🎓": ["そつぎょうしきのかくぼう","あくてぃびてぃ","ぼうし","おいわい","ふく","そつぎょう","はっと"], "🎓": ["そつぎょうしきのかくぼう","あくてぃびてぃ","ぼうし","おいわい","ふく","そつぎょう","はっと"],
"👑": ["かんむり","ふく","おうかん","おう","じょおう"], "👑": ["かんむり","ふく","おうかん","おう","じょおう"],
"⛑": ["しろじゅうじのへるめっと","きゅうじょ","じゅうじ","かお","ぼうし","へるめっと"], "⛑": ["しろじゅうじのへるめっと","きゅうじょ","じゅうじ","かお","ぼうし","へるめっと"],
"🪖": ["ぐんたいのへるめっと","ぐん","へるめっと","ぐんたい","ぐんじん","へいし"], "🪖": ["ぐんたいのへるめっと","ぐん","へるめっと","ぐんたい","ぐんじん","へいし"],
"🎒": ["らんどせる","あくてぃびてぃ","かばん","ばっぐ","がくせいかばん","がっこう"], "🎒": ["らんどせる","あくてぃびてぃ","かばん","ばっぐ","がくせいかばん","がっこう"],
"👝": ["ぽーち","かばん","ばっぐ","ふく"], "👝": ["ぽーち","かばん","ばっぐ","ふく"],
@ -476,13 +476,13 @@
"👜": ["はんどばっぐ","かばん","ばっぐ","ふく"], "👜": ["はんどばっぐ","かばん","ばっぐ","ふく"],
"💼": ["ぶりーふけーす"], "💼": ["ぶりーふけーす"],
"👓": ["めがね","ふく","め","あいうぇあ"], "👓": ["めがね","ふく","め","あいうぇあ"],
"🕶": ["さんぐらす","くらい","め","めがね"], "🕶": ["さんぐらす","くらい","め","めがね"],
"🥽": ["ごーぐる","ふく","めのほご","すいえい","ようせつ"], "🥽": ["ごーぐる","ふく","めのほご","すいえい","ようせつ"],
"🧣": ["すかーふ","ふく","くび"], "🧣": ["すかーふ","ふく","くび"],
"🧤": ["てぶくろ","ふく","て"], "🧤": ["てぶくろ","ふく","て"],
"💍": ["ゆびわ","だいやもんど","れんあい","ろまんす"], "💍": ["ゆびわ","だいやもんど","れんあい","ろまんす"],
"🌂": ["とじたかさ","ふく","あめ","かさ","てんき"], "🌂": ["とじたかさ","ふく","あめ","かさ","てんき"],
"☂": ["かさ","ふく","あめ","てんき"], "☂": ["かさ","ふく","あめ","てんき"],
"🐶": ["いぬのかお","けん","いぬ","かお","ぺっと"], "🐶": ["いぬのかお","けん","いぬ","かお","ぺっと"],
"🐱": ["ねこのかお","ねこ","かお","ぺっと"], "🐱": ["ねこのかお","ねこ","かお","ぺっと"],
"🐭": ["ねずみのかお","かお","ねずみ"], "🐭": ["ねずみのかお","かお","ねずみ"],
@ -536,8 +536,8 @@
"🐜": ["あり","こんちゅう"], "🐜": ["あり","こんちゅう"],
"🦗": ["くりけっと","こおろぎ","ばっため","こんちゅう"], "🦗": ["くりけっと","こおろぎ","ばっため","こんちゅう"],
"🪳": ["ごきぶり","こんちゅう","がいちゅう"], "🪳": ["ごきぶり","こんちゅう","がいちゅう"],
"🕷": ["くも","こんちゅう"], "🕷": ["くも","こんちゅう"],
"🕸": ["くものす","くも","す"], "🕸": ["くものす","くも","す"],
"🦂": ["さそり","さそりざ","せいざ"], "🦂": ["さそり","さそりざ","せいざ"],
"🦟": ["か","びょうき","ねつ","こんちゅう","まらりあ","ういるす"], "🦟": ["か","びょうき","ねつ","こんちゅう","まらりあ","ういるす"],
"🪰": ["はえ","がいちゅう","こんちゅう","うじむし"], "🪰": ["はえ","がいちゅう","こんちゅう","うじむし"],
@ -584,7 +584,7 @@
"🦇": ["こうもり","きゅうけつき"], "🦇": ["こうもり","きゅうけつき"],
"🐓": ["おんどり"], "🐓": ["おんどり"],
"🦃": ["しちめんちょう(とり)","しちめんちょう","とり"], "🦃": ["しちめんちょう(とり)","しちめんちょう","とり"],
"🕊": ["へいわのはと","とり","はと","ひこう","へいわ"], "🕊": ["へいわのはと","とり","はと","ひこう","へいわ"],
"🦅": ["わし","とり"], "🦅": ["わし","とり"],
"🦆": ["あひる","とり"], "🦆": ["あひる","とり"],
"🪿": ["がちょう","とり","かきん","けいてきのおと"], "🪿": ["がちょう","とり","かきん","けいてきのおと"],
@ -605,7 +605,7 @@
"🐇": ["うさぎ","ばにー","ぺっと"], "🐇": ["うさぎ","ばにー","ぺっと"],
"🐀": ["ねずみ"], "🐀": ["ねずみ"],
"🐁": ["ねずみ"], "🐁": ["ねずみ"],
"🐿": ["しまりす"], "🐿": ["しまりす"],
"🦨": ["すかんく","あくしゅう","におう"], "🦨": ["すかんく","あくしゅう","におう"],
"🦡": ["あなぐま","らーてる","ねだる"], "🦡": ["あなぐま","らーてる","ねだる"],
"🦔": ["はりねずみ","かお"], "🦔": ["はりねずみ","かお"],
@ -622,7 +622,7 @@
"🪴": ["はちうえ","しょくぶつ","かんようしょくぶつ"], "🪴": ["はちうえ","しょくぶつ","かんようしょくぶつ"],
"🌱": ["なえぎ","しょくぶつ","わかい"], "🌱": ["なえぎ","しょくぶつ","わかい"],
"🌿": ["はーぶ","は","しょくぶつ"], "🌿": ["はーぶ","は","しょくぶつ"],
"☘": ["くろーばー","しょくぶつ"], "☘": ["くろーばー","しょくぶつ"],
"🍀": ["よっつはのくろーばー","4","くろーばー","よん","は","しょくぶつ"], "🍀": ["よっつはのくろーばー","4","くろーばー","よん","は","しょくぶつ"],
"🎍": ["かどまつ","あくてぃびてぃ","たけ","おいわい","にっぽん","まつ","しょくぶつ"], "🎍": ["かどまつ","あくてぃびてぃ","たけ","おいわい","にっぽん","まつ","しょくぶつ"],
"🎋": ["ななゆう","あくてぃびてぃ","はた","おいわい","えんたーていめんと","にっぽん"], "🎋": ["ななゆう","あくてぃびてぃ","はた","おいわい","えんたーていめんと","にっぽん"],
@ -661,35 +661,35 @@
"🌝": ["かおつきまんげつ","あかるい","かお","みちた","つき","うちゅう","てんき"], "🌝": ["かおつきまんげつ","あかるい","かお","みちた","つき","うちゅう","てんき"],
"🌛": ["かおつきじょうげんのつき","かお","つき","げん","うちゅう","てんき"], "🌛": ["かおつきじょうげんのつき","かお","つき","げん","うちゅう","てんき"],
"🌜": ["がおがあるかげんのつき","かお","つき","げん","うちゅう","てんき"], "🌜": ["がおがあるかげんのつき","かお","つき","げん","うちゅう","てんき"],
"⭐": ["ちゅうくらいのほし","ほし"], "⭐": ["ちゅうくらいのほし","ほし"],
"🌟": ["ひかるほし","きらめき","あかいひかり","かがやく","かがやき","ほし"], "🌟": ["ひかるほし","きらめき","あかいひかり","かがやく","かがやき","ほし"],
"💫": ["くらくら","まんが","めまい","ほし"], "💫": ["くらくら","まんが","めまい","ほし"],
"✨": ["きらきら","えんたーていめんと","かがやき","ほし"], "✨": ["きらきら","えんたーていめんと","かがやき","ほし"],
"☄": ["すいせい","うちゅう"], "☄": ["すいせい","うちゅう"],
"🪐": ["たまきのあるわくせい","うちゅう","わくせい","どせい"], "🪐": ["たまきのあるわくせい","うちゅう","わくせい","どせい"],
"🌞": ["かおつきたいよう","あかるい","かお","うちゅう","たいよう","てんき"], "🌞": ["かおつきたいよう","あかるい","かお","うちゅう","たいよう","てんき"],
"☀️": ["たいようのひかり","あかるい","こうせん","うちゅう","たいよう","せいてん","てんき"], "☀️": ["たいようのひかり","あかるい","こうせん","うちゅう","たいよう","せいてん","てんき"],
"🌤": ["たいようとちいさなくも","くも","たいよう","てんき"], "🌤": ["たいようとちいさなくも","くも","たいよう","てんき"],
"⛅": ["はれときどきくもり","くも","たいよう","てんき"], "⛅": ["はれときどきくもり","くも","たいよう","てんき"],
"🌥": ["はれのちくもり","くも","たいよう","てんき"], "🌥": ["はれのちくもり","くも","たいよう","てんき"],
"🌦": ["はれのちくもりときどきあめ","くも","あめ","たいよう","てんき"], "🌦": ["はれのちくもりときどきあめ","くも","あめ","たいよう","てんき"],
"☁️": ["くも","てんき"], "☁️": ["くも","てんき"],
"🌧": ["あまぐも","くも","あめ","てんき"], "🌧": ["あまぐも","くも","あめ","てんき"],
"⛈": ["らいう","くも","あめ","かみなり","てんき"], "⛈": ["らいう","くも","あめ","かみなり","てんき"],
"🌩": ["らいうん","くも","かみなり","てんき"], "🌩": ["らいうん","くも","かみなり","てんき"],
"⚡": ["だかでんあつきごう","きけん","でんき","かみなり","でんあつ","びりびり"], "⚡": ["だかでんあつきごう","きけん","でんき","かみなり","でんあつ","びりびり"],
"🔥": ["えん","ひ","どうぐ"], "🔥": ["えん","ひ","どうぐ"],
"💥": ["しょうとつまーく","どかーん","しょうとつ","まんが"], "💥": ["しょうとつまーく","どかーん","しょうとつ","まんが"],
"❄️": ["せつのけっしょう","つめたい","ゆき","てんき"], "❄️": ["せつのけっしょう","つめたい","ゆき","てんき"],
"🌨": ["ゆきぐも","くも","れい","ゆき","てんき"], "🌨": ["ゆきぐも","くも","れい","ゆき","てんき"],
"☃": ["ゆきだるま","れい","ゆき","てんき"], "☃": ["ゆきだるま","れい","ゆき","てんき"],
"⛄": ["ゆきだるま","れい","ゆき","てんき"], "⛄": ["ゆきだるま","れい","ゆき","てんき"],
"🌬": ["かぜがふいている","かぜがふく","くも","かお","てんき","ふう"], "🌬": ["かぜがふいている","かぜがふく","くも","かお","てんき","ふう"],
"💨": ["だっしゅ","まんが","はしる"], "💨": ["だっしゅ","まんが","はしる"],
"🌪": ["たつまきぐも","くも","たつまき","てんき","せんぷう"], "🌪": ["たつまきぐも","くも","たつまき","てんき","せんぷう"],
"🌫": ["きり","くも","てんき"], "🌫": ["きり","くも","てんき"],
"🌈": ["にじ","あめ","れいんぼー","てんき","ぷらいど","lgbt"], "🌈": ["にじ","あめ","れいんぼー","てんき","ぷらいど","lgbt"],
"☔": ["うとかさ","いるい","しずく","あめ","かさ","てんき"], "☔": ["うとかさ","いるい","しずく","あめ","かさ","てんき"],
"💧": ["しずく","ぞっとする","まんが","したたり","あせ","てんき"], "💧": ["しずく","ぞっとする","まんが","したたり","あせ","てんき"],
"💦": ["あせまーく","まんが","ぬれている","あせ"], "💦": ["あせまーく","まんが","ぬれている","あせ"],
"🌊": ["なみ","うみ","みず","てんき"], "🌊": ["なみ","うみ","みず","てんき"],
@ -714,7 +714,7 @@
"🥑": ["あぼかど","ふるーつ","くだもの"], "🥑": ["あぼかど","ふるーつ","くだもの"],
"🫒": ["おりーぶ","ふるーつ"], "🫒": ["おりーぶ","ふるーつ"],
"🍆": ["なす","なすび","しょくぶつ","やさい"], "🍆": ["なす","なすび","しょくぶつ","やさい"],
"🌶": ["とうがらし","からい","こしょう","しょくぶつ"], "🌶": ["とうがらし","からい","こしょう","しょくぶつ"],
"🫑": ["ぴーまん","とうがらし","こしょう","しょくぶつ","やさい"], "🫑": ["ぴーまん","とうがらし","こしょう","しょくぶつ","やさい"],
"🥒": ["きゅうり","ぴくるす","やさい"], "🥒": ["きゅうり","ぴくるす","やさい"],
"🥬": ["はっぱのみどり","ちんげんさい","きゃべつ","けーる","れたす"], "🥬": ["はっぱのみどり","ちんげんさい","きゃべつ","けーる","れたす"],
@ -793,7 +793,7 @@
"🍪": ["くっきー","でざーと","あまい"], "🍪": ["くっきー","でざーと","あまい"],
"🥠": ["おみくじいりくっきー","ふぉーちゅんくっきー"], "🥠": ["おみくじいりくっきー","ふぉーちゅんくっきー"],
"🥮": ["げっぺい","あき","まつり"], "🥮": ["げっぺい","あき","まつり"],
"☕": ["ほっとどりんく","いんりょう","こーひー","のみもの","あたたかい","じょうき","おちゃ"], "☕": ["ほっとどりんく","いんりょう","こーひー","のみもの","あたたかい","じょうき","おちゃ"],
"🍵": ["ゆのみ","いんりょう","かっぷ","のみもの","おちゃ"], "🍵": ["ゆのみ","いんりょう","かっぷ","のみもの","おちゃ"],
"🫖": ["てぃーぽっと","どりんく","ぽっと","てぃー","けとる"], "🫖": ["てぃーぽっと","どりんく","ぽっと","てぃー","けとる"],
"🥣": ["ぼうるとすぷーん","ちょうしょく","しりある","おかゆ","おーとみーる","ぽりっじ","しょっき"], "🥣": ["ぼうるとすぷーん","ちょうしょく","しりある","おかゆ","おーとみーる","ぽりっじ","しょっき"],
@ -816,13 +816,13 @@
"🧊": ["かくこおり","こおり","りっぽうたい","つめたい","ひょうざん"], "🧊": ["かくこおり","こおり","りっぽうたい","つめたい","ひょうざん"],
"🥄": ["すぷーん","しょっき"], "🥄": ["すぷーん","しょっき"],
"🍴": ["ふぉーくとないふ","ちょうり","ふぉーく","ないふ","しょっき"], "🍴": ["ふぉーくとないふ","ちょうり","ふぉーく","ないふ","しょっき"],
"🍽": ["ふぉーくとないふとぷれーと","ちょうり","ふぉーく","ないふ","ぷれーと","しょっき"], "🍽": ["ふぉーくとないふとぷれーと","ちょうり","ふぉーく","ないふ","ぷれーと","しょっき"],
"🥢": ["はし"], "🥢": ["はし"],
"🥡": ["ていくあうとぼっくす","ていくあうと","ようき","おもちかえり"], "🥡": ["ていくあうとぼっくす","ていくあうと","ようき","おもちかえり"],
"⚽": ["さっかーぼーる","ぼーる","さっかー"], "⚽": ["さっかーぼーる","ぼーる","さっかー"],
"🏀": ["ばすけっとぼーる","ぼーる","ばすけっとりんぐ"], "🏀": ["ばすけっとぼーる","ぼーる","ばすけっとりんぐ"],
"🏈": ["あめりかんふっとぼーる","あめりかん","ぼーる","ふっとぼーる"], "🏈": ["あめりかんふっとぼーる","あめりかん","ぼーる","ふっとぼーる"],
"⚾": ["やきゅう","ぼーる"], "⚾": ["やきゅう","ぼーる"],
"🥎": ["そふとぼーる","ぼーる","しあい","すぽーつ"], "🥎": ["そふとぼーる","ぼーる","しあい","すぽーつ"],
"🎾": ["てにすぼーる","ぼーる","らけっと","てにす"], "🎾": ["てにすぼーる","ぼーる","らけっと","てにす"],
"🏐": ["ばれーぼーる","ぼーる","しあい"], "🏐": ["ばれーぼーる","ぼーる","しあい"],
@ -838,19 +838,19 @@
"🏏": ["くりけっとのばっととぼーる","ぼーる","ふぃーるど","くりけっと","しあい"], "🏏": ["くりけっとのばっととぼーる","ぼーる","ふぃーるど","くりけっと","しあい"],
"🥍": ["らくろす","ぼーる","すてぃっく","しあい","すぽーつ"], "🥍": ["らくろす","ぼーる","すてぃっく","しあい","すぽーつ"],
"🥌": ["かーりんぐすとーん","かーりんぐ","すとーん"], "🥌": ["かーりんぐすとーん","かーりんぐ","すとーん"],
"⛳": ["ごるふのかっぷ","ぴんふらっぐ","ごるふ","ほーる"], "⛳": ["ごるふのかっぷ","ぴんふらっぐ","ごるふ","ほーる"],
"🏹": ["ゆみや","しゃしゅ","や","ゆみ","しゃしゅざ","どうぐ","せいざ"], "🏹": ["ゆみや","しゃしゅ","や","ゆみ","しゃしゅざ","どうぐ","せいざ"],
"🎣": ["つりざおとさかな","えんたーていめんと","さかな","ぼう"], "🎣": ["つりざおとさかな","えんたーていめんと","さかな","ぼう"],
"🤿": ["だいびんぐますく","だいびんぐ","すきゅーば","しゅのーける"], "🤿": ["だいびんぐますく","だいびんぐ","すきゅーば","しゅのーける"],
"🥊": ["ぼくしんぐぐろーぶ","ぼくしんぐ","ぐろーぶ"], "🥊": ["ぼくしんぐぐろーぶ","ぼくしんぐ","ぐろーぶ"],
"🥋": ["どうぎ","じゅうどう","からて","ぶどう","てこんどー","ゆにふぉーむ"], "🥋": ["どうぎ","じゅうどう","からて","ぶどう","てこんどー","ゆにふぉーむ"],
"⛸": ["あいすすけーと","こおり"], "⛸": ["あいすすけーと","こおり"],
"🎿": ["すきーとすきーぶーつ","すきー","ゆき"], "🎿": ["すきーとすきーぶーつ","すきー","ゆき"],
"🛷": ["そり","るーじゅ","とぼがん"], "🛷": ["そり","るーじゅ","とぼがん"],
"⛷": ["すきー","ゆき"], "⛷": ["すきー","ゆき"],
"🏂": ["すのーぼーだー","すきー","ゆき","すのーぼーど"], "🏂": ["すのーぼーだー","すきー","ゆき","すのーぼーど"],
"🏋️‍♀️": ["うえいとをもちあげるじょせい","あげ","じゅうりょう","じょせい","おんな"], "🏋️‍♀️": ["うえいとをもちあげるじょせい","あげ","じゅうりょう","じょせい","おんな"],
"🏋": ["うえいとをもちあげるひと","あげ","じゅうりょう"], "🏋": ["うえいとをもちあげるひと","あげ","じゅうりょう"],
"🏋️‍♂️": ["うえいとをもちあげるだんせい","あげ","じゅうりょう","おとこ","だんせい"], "🏋️‍♂️": ["うえいとをもちあげるだんせい","あげ","じゅうりょう","おとこ","だんせい"],
"🤺": ["ふぇんしんぐをするひと","けんし","けんじゅつ","けん"], "🤺": ["ふぇんしんぐをするひと","けんし","けんじゅつ","けん"],
"🤼‍♀️": ["れすりんぐをするじょせい","れすりんぐ","れすりんぐせんしゅ","じょせい","おんな"], "🤼‍♀️": ["れすりんぐをするじょせい","れすりんぐ","れすりんぐせんしゅ","じょせい","おんな"],
@ -860,7 +860,7 @@
"🤸": ["そくてんをするひと","そくほうてんかい","たいそう"], "🤸": ["そくてんをするひと","そくほうてんかい","たいそう"],
"🤸‍♂️": ["そくてんをするだんせい","そくほうてんかい","たいそう","おとこ","だんせい"], "🤸‍♂️": ["そくてんをするだんせい","そくほうてんかい","たいそう","おとこ","だんせい"],
"⛹️‍♀️": ["ぼーるをばうんどさせるじょせい","ぼーる","じょせい","おんな"], "⛹️‍♀️": ["ぼーるをばうんどさせるじょせい","ぼーる","じょせい","おんな"],
"⛹": ["ぼーるをばうんどさせるひと","ぼーる"], "⛹": ["ぼーるをばうんどさせるひと","ぼーる"],
"⛹️‍♂️": ["ぼーるをばうんどさせるだんせい","ぼーる","おとこ","だんせい"], "⛹️‍♂️": ["ぼーるをばうんどさせるだんせい","ぼーる","おとこ","だんせい"],
"🤾‍♀️": ["はんどぼーるをするじょせい","ぼーる","はんどぼーる","じょせい","おんな"], "🤾‍♀️": ["はんどぼーるをするじょせい","ぼーる","はんどぼーる","じょせい","おんな"],
"🤾": ["はんどぼーるをするひと","ぼーる","はんどぼーる"], "🤾": ["はんどぼーるをするひと","ぼーる","はんどぼーる"],
@ -869,7 +869,7 @@
"🧗": ["くらいみんぐしているひと","くらいみんぐ","ろっく"], "🧗": ["くらいみんぐしているひと","くらいみんぐ","ろっく"],
"🧗‍♂️": ["くらいみんぐしているだんせい","くらいみんぐ","ろっく","だんせい","おとこ"], "🧗‍♂️": ["くらいみんぐしているだんせい","くらいみんぐ","ろっく","だんせい","おとこ"],
"🏌️‍♀️": ["ごるふをするじょせい","ぼーる","ごるふ","ごるふぁー","ごるふする","じょせい","おんな"], "🏌️‍♀️": ["ごるふをするじょせい","ぼーる","ごるふ","ごるふぁー","ごるふする","じょせい","おんな"],
"🏌": ["ごるふをするひと","ぼーる","ごるふ","ごるふぁー","ごるふする"], "🏌": ["ごるふをするひと","ぼーる","ごるふ","ごるふぁー","ごるふする"],
"🏌️‍♂️": ["ごるふをするだんせい","ぼーる","ごるふ","ごるふぁー","ごるふする","おとこ","だんせい"], "🏌️‍♂️": ["ごるふをするだんせい","ぼーる","ごるふ","ごるふぁー","ごるふする","おとこ","だんせい"],
"🧘‍♀️": ["れんげざのじょせい","めいそう","よが","せいおん","じょせい","おんな"], "🧘‍♀️": ["れんげざのじょせい","めいそう","よが","せいおん","じょせい","おんな"],
"🧘": ["れんげざのひと","めいそう","よが","せいおん"], "🧘": ["れんげざのひと","めいそう","よが","せいおん"],
@ -897,16 +897,16 @@
"🚵": ["まうんてんばいくにのるひと","まうんてんばいくらいだー","くろすばいく","じてんしゃ","じてんしゃのり","じてんしゃにのるひと","やま"], "🚵": ["まうんてんばいくにのるひと","まうんてんばいくらいだー","くろすばいく","じてんしゃ","じてんしゃのり","じてんしゃにのるひと","やま"],
"🚵‍♂️": ["まうんてんばいくにのるだんせい","まうんてんばいくらいだー","くろすばいく","じてんしゃ","じてんしゃのり","じてんしゃにのるひと","さいくりすと","やま","おとこ","だんせい"], "🚵‍♂️": ["まうんてんばいくにのるだんせい","まうんてんばいくらいだー","くろすばいく","じてんしゃ","じてんしゃのり","じてんしゃにのるひと","さいくりすと","やま","おとこ","だんせい"],
"🎽": ["らんにんぐしゃつとたすき","らんにんぐ","たすき","しゃつ"], "🎽": ["らんにんぐしゃつとたすき","らんにんぐ","たすき","しゃつ"],
"🎖": ["くんしょう","おいわい","めだる","ぐんじ"], "🎖": ["くんしょう","おいわい","めだる","ぐんじ"],
"🏅": ["すぽーつのめだる","めだる"], "🏅": ["すぽーつのめだる","めだる"],
"🥇": ["きんめだる","1い","きん","めだる","1","だい1い"], "🥇": ["きんめだる","1い","きん","めだる","1","だい1い"],
"🥈": ["ぎんめだる","めだる","2い","ぎん","2","だい2い"], "🥈": ["ぎんめだる","めだる","2い","ぎん","2","だい2い"],
"🥉": ["どうめだる","どう","めだる","3い","3","だい3い"], "🥉": ["どうめだる","どう","めだる","3い","3","だい3い"],
"🏆": ["とろふぃー","しょう"], "🏆": ["とろふぃー","しょう"],
"🏵": ["ばらかざり","しょくぶつ"], "🏵": ["ばらかざり","しょくぶつ"],
"🎗": ["りまいんだーりぼん","おいわい","りまいんだー","りぼん"], "🎗": ["りまいんだーりぼん","おいわい","りまいんだー","りぼん"],
"🎫": ["きっぷ","あくてぃびてぃ","にゅうじょうりょう","えんたーていめんと","ちけっと"], "🎫": ["きっぷ","あくてぃびてぃ","にゅうじょうりょう","えんたーていめんと","ちけっと"],
"🎟": ["にゅうじょうけん","にゅうじょうりょう","えんたーていめんと","ちけっと"], "🎟": ["にゅうじょうけん","にゅうじょうりょう","えんたーていめんと","ちけっと"],
"🎪": ["さーかすごや","あくてぃびてぃ","さーかす","えんたーていめんと","てんと"], "🎪": ["さーかすごや","あくてぃびてぃ","さーかす","えんたーていめんと","てんと"],
"🤹‍♀️": ["じゃぐりんぐをするじょせい","てんびん","じゃぐりんぐ","じょせい","おんな"], "🤹‍♀️": ["じゃぐりんぐをするじょせい","てんびん","じゃぐりんぐ","じょせい","おんな"],
"🤹": ["じゃぐりんぐをするひと","ばらんす","じゃぐりんぐ"], "🤹": ["じゃぐりんぐをするひと","ばらんす","じゃぐりんぐ"],
@ -945,7 +945,7 @@
"🛺": ["おーとりきしゃ","じんりきしゃ","とぅくとぅく"], "🛺": ["おーとりきしゃ","じんりきしゃ","とぅくとぅく"],
"🚌": ["ばす","のりもの"], "🚌": ["ばす","のりもの"],
"🚎": ["とろりーばす","ばす","ろめんでんしゃ","しがいでんしゃ","のりもの"], "🚎": ["とろりーばす","ばす","ろめんでんしゃ","しがいでんしゃ","のりもの"],
"🏎": ["れーしんぐかー","くるま","きょうそう"], "🏎": ["れーしんぐかー","くるま","きょうそう"],
"🚓": ["ぱとかー","くるま","ぱとろーる","けいさつ","のりもの"], "🚓": ["ぱとかー","くるま","ぱとろーる","けいさつ","のりもの"],
"🚑": ["きゅうきゅうしゃ","のりもの"], "🚑": ["きゅうきゅうしゃ","のりもの"],
"🚒": ["しょうぼうしゃ","えんじん","えん","とらっく","のりもの"], "🚒": ["しょうぼうしゃ","えんじん","えん","とらっく","のりもの"],
@ -954,7 +954,7 @@
"🚚": ["はいたつようとらっく","はいたつ","とらっく","のりもの"], "🚚": ["はいたつようとらっく","はいたつ","とらっく","のりもの"],
"🚛": ["とれーらー","おおがたとらっく","せみ","とらっく","のりもの"], "🚛": ["とれーらー","おおがたとらっく","せみ","とらっく","のりもの"],
"🚜": ["とらくたー","のりもの"], "🚜": ["とらくたー","のりもの"],
"🏍": ["れーすばいく","おーとばい","れーす"], "🏍": ["れーすばいく","おーとばい","れーす"],
"🛵": ["すくーたー","もーたー"], "🛵": ["すくーたー","もーたー"],
"🚲": ["じてんしゃ","ばいく","のりもの"], "🚲": ["じてんしゃ","ばいく","のりもの"],
"🦼": ["でんどうくるまいす","あくせしびりてぃ","くるまいす"], "🦼": ["でんどうくるまいす","あくせしびりてぃ","くるまいす"],
@ -984,25 +984,25 @@
"🚊": ["ろめんでんしゃ","とろりーばす","のりもの"], "🚊": ["ろめんでんしゃ","とろりーばす","のりもの"],
"🚉": ["えき","せんろ","でんしゃ","のりもの"], "🚉": ["えき","せんろ","でんしゃ","のりもの"],
"🚁": ["へりこぷたー","のりもの"], "🚁": ["へりこぷたー","のりもの"],
"🛩": ["こがたこうくうき","ひこうき","のりもの"], "🛩": ["こがたこうくうき","ひこうき","のりもの"],
"✈️": ["ひこうき","のりもの"], "✈️": ["ひこうき","のりもの"],
"🛫": ["ひこうきのりりく","ひこうき","ちぇっくいん","しゅっぱつ","のりもの"], "🛫": ["ひこうきのりりく","ひこうき","ちぇっくいん","しゅっぱつ","のりもの"],
"🛬": ["ひこうきのちゃくりく","ひこうき","とうちゃく","ちゃくりく","のりもの"], "🛬": ["ひこうきのちゃくりく","ひこうき","とうちゃく","ちゃくりく","のりもの"],
"🪂": ["ぱらしゅーと","ぱらせーる","すかいだいぶ","はんぐぐらいだー"], "🪂": ["ぱらしゅーと","ぱらせーる","すかいだいぶ","はんぐぐらいだー"],
"💺": ["ざせき","いす"], "💺": ["ざせき","いす"],
"🛰": ["さてらいと","えいせい","うちゅう","のりもの"], "🛰": ["さてらいと","えいせい","うちゅう","のりもの"],
"🚀": ["ろけっと","うちゅう","のりもの"], "🚀": ["ろけっと","うちゅう","のりもの"],
"🛸": ["そらとぶえんばん","UFO","うちゅうじん","いほしじん","うちゅう","くうそう"], "🛸": ["そらとぶえんばん","UFO","うちゅうじん","いほしじん","うちゅう","くうそう"],
"🛶": ["かぬー","ぼーと"], "🛶": ["かぬー","ぼーと"],
"⛵": ["よっと","ぼーと","りぞーと","うみ","のりもの"], "⛵": ["よっと","ぼーと","りぞーと","うみ","のりもの"],
"🛥": ["もーたーぼーと","ぼーと","のりもの"], "🛥": ["もーたーぼーと","ぼーと","のりもの"],
"🚤": ["すぴーどぼーと","ぼーと","のりもの"], "🚤": ["すぴーどぼーと","ぼーと","のりもの"],
"⛴": ["ふぇりー","ぼーと"], "⛴": ["ふぇりー","ぼーと"],
"🛳": ["りょかくせん","りょかく","ふね","のりもの"], "🛳": ["りょかくせん","りょかく","ふね","のりもの"],
"🚢": ["ふね","のりもの"], "🚢": ["ふね","のりもの"],
"🛟": ["きゅうめいうきわ","うきわ","らいふじゃけっと","らいふせーばー","きゅうじょ","あんぜん"], "🛟": ["きゅうめいうきわ","うきわ","らいふじゃけっと","らいふせーばー","きゅうじょ","あんぜん"],
"⚓": ["いかり","ふね","つーる"], "⚓": ["いかり","ふね","つーる"],
"⛽": ["がそりんすたんど","ねんりょう","がそりん","きゅうゆき","さーびすすてーしょん"], "⛽": ["がそりんすたんど","ねんりょう","がそりん","きゅうゆき","さーびすすてーしょん"],
"🚧": ["こうじちゅう","こうじようふぇんす","けんせつこうじ"], "🚧": ["こうじちゅう","こうじようふぇんす","けんせつこうじ"],
"🚏": ["ばすてい","ばす","ていし"], "🚏": ["ばすてい","ばす","ていし"],
"🚦": ["たてむきのしんごうき","しんごうき","しんごう","こうつう"], "🚦": ["たてむきのしんごうき","しんごうき","しんごう","こうつう"],
@ -1011,30 +1011,30 @@
"🎡": ["かんらんしゃ","あくてぃびてぃ","ゆうえんち","えんたーていめんと","ふぇりす"], "🎡": ["かんらんしゃ","あくてぃびてぃ","ゆうえんち","えんたーていめんと","ふぇりす"],
"🎢": ["じぇっとこーすたー","あくてぃびてぃ","ゆうえんち","こーすたー","えんたーていめんと","ろーらー"], "🎢": ["じぇっとこーすたー","あくてぃびてぃ","ゆうえんち","こーすたー","えんたーていめんと","ろーらー"],
"🎠": ["めりーごーらんど","あくてぃびてぃ","めりーごーらうんど","えんたーていめんと","うま"], "🎠": ["めりーごーらんど","あくてぃびてぃ","めりーごーらうんど","えんたーていめんと","うま"],
"🏗": ["けんせつちゅう","たてもの","けんせつ"], "🏗": ["けんせつちゅう","たてもの","けんせつ"],
"🌁": ["きり","てんき"], "🌁": ["きり","てんき"],
"🗼": ["とうきょうたわー","とうきょう","たわー"], "🗼": ["とうきょうたわー","とうきょう","たわー"],
"🏭": ["こうじょう","たてもの"], "🏭": ["こうじょう","たてもの"],
"⛲": ["ふんすい"], "⛲": ["ふんすい"],
"🎑": ["おつきみ","あくてぃびてぃ","おいわい","じゅしょうしき","えんたーていめんと","つき"], "🎑": ["おつきみ","あくてぃびてぃ","おいわい","じゅしょうしき","えんたーていめんと","つき"],
"⛰": ["やま"], "⛰": ["やま"],
"🏔": ["ゆきやま","さむい","やま","ゆき"], "🏔": ["ゆきやま","さむい","やま","ゆき"],
"🗻": ["ふじさん","やま"], "🗻": ["ふじさん","やま"],
"🌋": ["かざん","ふんか","やま","きしょう"], "🌋": ["かざん","ふんか","やま","きしょう"],
"🗾": ["にっぽんれっとう","にっぽん","ちず"], "🗾": ["にっぽんれっとう","にっぽん","ちず"],
"🏕": ["きゃんぷ"], "🏕": ["きゃんぷ"],
"⛺": ["てんと","きゃんぷ"], "⛺": ["てんと","きゃんぷ"],
"🏞": ["こくりつこうえん","こうえん"], "🏞": ["こくりつこうえん","こうえん"],
"🛣": ["こうそくどうろ","はいうぇい","どうろ"], "🛣": ["こうそくどうろ","はいうぇい","どうろ"],
"🛤": ["せんろ","てつどう","でんしゃ"], "🛤": ["せんろ","てつどう","でんしゃ"],
"🌅": ["ひので","あさ","たいよう","てんこう"], "🌅": ["ひので","あさ","たいよう","てんこう"],
"🌄": ["やまからのひので","あさ","やま","たいよう","ひので","てんこう"], "🌄": ["やまからのひので","あさ","やま","たいよう","ひので","てんこう"],
"🏜": ["さばく"], "🏜": ["さばく"],
"🏖": ["びーちとかさ","びーち","かさ","ぱらそる"], "🏖": ["びーちとかさ","びーち","かさ","ぱらそる"],
"🏝": ["むじんとう","さばく","しま"], "🏝": ["むじんとう","さばく","しま"],
"🌇": ["びるにしずむゆうひ","たてもの","ゆうぐれ","たいよう","ゆうひ","てんき"], "🌇": ["びるにしずむゆうひ","たてもの","ゆうぐれ","たいよう","ゆうひ","てんき"],
"🌆": ["ゆうぐれのまちなみ","たてもの","まち","ゆうぐれ","ひぐれ","ふうけい","たいよう","ゆうひ","てんき"], "🌆": ["ゆうぐれのまちなみ","たてもの","まち","ゆうぐれ","ひぐれ","ふうけい","たいよう","ゆうひ","てんき"],
"🏙": ["まちなみ","たてもの","まち"], "🏙": ["まちなみ","たてもの","まち"],
"🌃": ["ほしぞら","よる","ほし","てんき"], "🌃": ["ほしぞら","よる","ほし","てんき"],
"🌉": ["よるのはし","はし","よる","てんき"], "🌉": ["よるのはし","はし","よる","てんき"],
"🌌": ["あまのがわ","うちゅう","てんき"], "🌌": ["あまのがわ","うちゅう","てんき"],
@ -1042,14 +1042,14 @@
"🎇": ["せんこうはなび","あくてぃびてぃ","おいわい","えんたーていめんと","はなび","きらきら"], "🎇": ["せんこうはなび","あくてぃびてぃ","おいわい","えんたーていめんと","はなび","きらきら"],
"🎆": ["はなび","あくてぃびてぃ","おいわい","えんたーていめんと"], "🎆": ["はなび","あくてぃびてぃ","おいわい","えんたーていめんと"],
"🛖": ["こや","いえ","せんけいこ","ぱお"], "🛖": ["こや","いえ","せんけいこ","ぱお"],
"🏘": ["いえ","たてもの"], "🏘": ["いえ","たてもの"],
"🏰": ["せいようのしろ","たてもの","しろ","よーろっぱ"], "🏰": ["せいようのしろ","たてもの","しろ","よーろっぱ"],
"🏯": ["にっぽんのしろ","たてもの","しろ","にっぽん"], "🏯": ["にっぽんのしろ","たてもの","しろ","にっぽん"],
"🏟": ["すたじあむ"], "🏟": ["すたじあむ"],
"🗽": ["じゆうのめがみ","じゆう","ぞう"], "🗽": ["じゆうのめがみ","じゆう","ぞう"],
"🏠": ["いえ","たてもの","じたく"], "🏠": ["いえ","たてもの","じたく"],
"🏡": ["にわつきのいえ","たてもの","にわ","じたく","いえ"], "🏡": ["にわつきのいえ","たてもの","にわ","じたく","いえ"],
"🏚": ["はいきょ","たてもの","はいおく","いえ"], "🏚": ["はいきょ","たてもの","はいおく","いえ"],
"🏢": ["おふぃすびる","たてもの"], "🏢": ["おふぃすびる","たてもの"],
"🏬": ["でぱーと","たてもの","てん"], "🏬": ["でぱーと","たてもの","てん"],
"🏣": ["にっぽんのゆうびんきょく","たてもの","にっぽん","ぽすと"], "🏣": ["にっぽんのゆうびんきょく","たてもの","にっぽん","ぽすと"],
@ -1061,24 +1061,24 @@
"🏫": ["がっこう","たてもの"], "🏫": ["がっこう","たてもの"],
"🏩": ["らぶほてる","たてもの","ほてる","らぶ"], "🏩": ["らぶほてる","たてもの","ほてる","らぶ"],
"💒": ["けっこんしき","あくてぃびてぃ","ちゃぺる","ろまんす"], "💒": ["けっこんしき","あくてぃびてぃ","ちゃぺる","ろまんす"],
"🏛": ["れきしてきなたてもの","たてもの","れきしてきな"], "🏛": ["れきしてきなたてもの","たてもの","れきしてきな"],
"⛪": ["きょうかい","たてもの","くりすちゃん","じゅうじか","しゅうきょう"], "⛪": ["きょうかい","たてもの","くりすちゃん","じゅうじか","しゅうきょう"],
"🕌": ["もすく","いすらむ","むすりむ","しゅうきょう"], "🕌": ["もすく","いすらむ","むすりむ","しゅうきょう"],
"🛕": ["ひんどぅーきょうじいん","ひんどぅーきょう","じいん","しゅうきょう"], "🛕": ["ひんどぅーきょうじいん","ひんどぅーきょう","じいん","しゅうきょう"],
"🕍": ["しなごーぐ","ゆだやじん","ゆだやきょう","しゅうきょう","かいどう"], "🕍": ["しなごーぐ","ゆだやじん","ゆだやきょう","しゅうきょう","かいどう"],
"🕋": ["かあば","いすらむ","むすりむ","しゅうきょう"], "🕋": ["かあば","いすらむ","むすりむ","しゅうきょう"],
"⛩": ["じんじゃ","しゅうきょう","しんとう"], "⛩": ["じんじゃ","しゅうきょう","しんとう"],
"⌚": ["うでどけい","とけい"], "⌚": ["うでどけい","とけい"],
"📱": ["けいたいでんわ","けいたい","こみゅにけーしょん","もばいる","でんわ"], "📱": ["けいたいでんわ","けいたい","こみゅにけーしょん","もばいる","でんわ"],
"📲": ["ちゃくしんちゅう","やじるし","つうわ","けいたい","こみゅにけーしょん","もばいる","けいたいでんわ","じゅしん","でんわ"], "📲": ["ちゃくしんちゅう","やじるし","つうわ","けいたい","こみゅにけーしょん","もばいる","けいたいでんわ","じゅしん","でんわ"],
"💻": ["ぱそこん","のーとぱそこん","こんぴゅーたー","ぱーそなる"], "💻": ["ぱそこん","のーとぱそこん","こんぴゅーたー","ぱーそなる"],
"⌨": ["きーぼーど","こんぴゅーたー"], "⌨": ["きーぼーど","こんぴゅーたー"],
"🖥": ["ですくとっぷぱそこん","こんぴゅーたー","ですくとっぷ"], "🖥": ["ですくとっぷぱそこん","こんぴゅーたー","ですくとっぷ"],
"🖨": ["ぷりんたー","こんぴゅーたー"], "🖨": ["ぷりんたー","こんぴゅーたー"],
"🖱": ["3ぼたんまうす","3","ぼたん","こんぴゅーたー","まうす","さん"], "🖱": ["3ぼたんまうす","3","ぼたん","こんぴゅーたー","まうす","さん"],
"🖲": ["とらっくぼーる","こんぴゅーたー"], "🖲": ["とらっくぼーる","こんぴゅーたー"],
"🕹": ["じょいすてぃっく","えんたーていめんと","げーむ","びでおげーむ"], "🕹": ["じょいすてぃっく","えんたーていめんと","げーむ","びでおげーむ"],
"🗜": ["あっしゅく","つーる","けっかん"], "🗜": ["あっしゅく","つーる","けっかん"],
"💽": ["MD","ぱそこん","ひかりでぃすく","えんたーていめんと","みにでぃすく","こうがく"], "💽": ["MD","ぱそこん","ひかりでぃすく","えんたーていめんと","みにでぃすく","こうがく"],
"💾": ["ふろっぴーでぃすく","こんぴゅーたー","でぃすく","ふろっぴー"], "💾": ["ふろっぴーでぃすく","こんぴゅーたー","でぃすく","ふろっぴー"],
"💿": ["CDでぃすく","ぶるーれい","CD","こんぴゅーたー","でぃすく","DVD","こうがく"], "💿": ["CDでぃすく","ぶるーれい","CD","こんぴゅーたー","でぃすく","DVD","こうがく"],
@ -1088,23 +1088,23 @@
"📸": ["ふらっしゅをたいたかめら","かめら","ふらっしゅ","びでお"], "📸": ["ふらっしゅをたいたかめら","かめら","ふらっしゅ","びでお"],
"📹": ["びでおかめら","かめら","えんたーていめんと","びでお"], "📹": ["びでおかめら","かめら","えんたーていめんと","びでお"],
"🎥": ["びでおかめら","あくてぃびてぃ","かめら","しねま","えんたーていめんと","えいが"], "🎥": ["びでおかめら","あくてぃびてぃ","かめら","しねま","えんたーていめんと","えいが"],
"📽": ["えいしゃき","しねま","ごらく","ふぃるむ","えいが","ぷろじぇくたー","びでお"], "📽": ["えいしゃき","しねま","ごらく","ふぃるむ","えいが","ぷろじぇくたー","びでお"],
"🎞": ["ふぃるむのふれーむ","しねま","えんたーていめんと","ふぃるむ","ふれーむ","えいが"], "🎞": ["ふぃるむのふれーむ","しねま","えんたーていめんと","ふぃるむ","ふれーむ","えいが"],
"📞": ["じゅわき","こみゅにけーしょん","でんわ","じゅしんき"], "📞": ["じゅわき","こみゅにけーしょん","でんわ","じゅしんき"],
"☎️": ["でんわ","けいたいでんわ"], "☎️": ["でんわ","けいたいでんわ"],
"📟": ["ぽけっとべる","こみゅにけーしょん","ぽけべる"], "📟": ["ぽけっとべる","こみゅにけーしょん","ぽけべる"],
"📠": ["FAX","こみゅにけーしょん; fAX"], "📠": ["FAX","こみゅにけーしょん; fAX"],
"📺": ["てれび","えんたーていめんと","TV","びでお"], "📺": ["てれび","えんたーていめんと","TV","びでお"],
"📻": ["らじお","えんたーていめんと","びでお"], "📻": ["らじお","えんたーていめんと","びでお"],
"🎙": ["すたじおまいく","まいく","おんがく","すたじお"], "🎙": ["すたじおまいく","まいく","おんがく","すたじお"],
"🎚": ["ちょうせつばー","ちょうせつ","おんがく","ばー"], "🎚": ["ちょうせつばー","ちょうせつ","おんがく","ばー"],
"🎛": ["こんとろーるのぶ","こんとろーる","つまみ","おんがく"], "🎛": ["こんとろーるのぶ","こんとろーる","つまみ","おんがく"],
"⏱": ["すとっぷうぉっち","とけい"], "⏱": ["すとっぷうぉっち","とけい"],
"⏲": ["たいまーとけい","とけい","たいまー"], "⏲": ["たいまーとけい","とけい","たいまー"],
"⏰": ["めざましとけい","あらーむ","とけい"], "⏰": ["めざましとけい","あらーむ","とけい"],
"🕰": ["おきどけい","とけい"], "🕰": ["おきどけい","とけい"],
"⏳": ["すなどけい","すな","たいまー"], "⏳": ["すなどけい","すな","たいまー"],
"⌛": ["すなどけい","すな","たいまー"], "⌛": ["すなどけい","すな","たいまー"],
"🧮": ["そろばん","けいさん","かうんと","しゅうけいひょう","すうがく"], "🧮": ["そろばん","けいさん","かうんと","しゅうけいひょう","すうがく"],
"📡": ["えいせいあんてな","あんてな","こみゅにけーしょん","ぱらぼらあんてな","えいせい"], "📡": ["えいせいあんてな","あんてな","こみゅにけーしょん","ぱらぼらあんてな","えいせい"],
"🔋": ["でんち","ばってりー","でんし","だかえねるぎー"], "🔋": ["でんち","ばってりー","でんし","だかえねるぎー"],
@ -1112,10 +1112,10 @@
"🔌": ["こんせんと","でんき","ぷらぐ"], "🔌": ["こんせんと","でんき","ぷらぐ"],
"💡": ["でんきゅう","まんが","でんき","ひらめき","ひかり"], "💡": ["でんきゅう","まんが","でんき","ひらめき","ひかり"],
"🔦": ["かいちゅうでんとう","でんき","ひかり","どうぐ","たいまつ"], "🔦": ["かいちゅうでんとう","でんき","ひかり","どうぐ","たいまつ"],
"🕯": ["ろうそく","ひかり"], "🕯": ["ろうそく","ひかり"],
"🧯": ["しょうかき","しょうか","ひ","けす"], "🧯": ["しょうかき","しょうか","ひ","けす"],
"🗑": ["ごみばこ","ごみ","かん","びん"], "🗑": ["ごみばこ","ごみ","かん","びん"],
"🛢": ["どらむかん","どらむ","おいる"], "🛢": ["どらむかん","どらむ","おいる"],
"🛒": ["しょっぴんぐかーと","かーと","しょっぴんぐ","とろりー"], "🛒": ["しょっぴんぐかーと","かーと","しょっぴんぐ","とろりー"],
"💸": ["はねのはえたおさつ","ぎんこう","しへい","せいきゅうしょ","どる","とぶ","おかね","はね"], "💸": ["はねのはえたおさつ","ぎんこう","しへい","せいきゅうしょ","どる","とぶ","おかね","はね"],
"💵": ["どるさつ","ぎんこう","しへい","おさつ","つうか","どる","おかね"], "💵": ["どるさつ","ぎんこう","しへい","おさつ","つうか","どる","おかね"],
@ -1128,20 +1128,20 @@
"🪪": ["みぶんしょうめいしょ","しかくじょうほう","ID","らいせんす","せきゅりてぃ"], "🪪": ["みぶんしょうめいしょ","しかくじょうほう","ID","らいせんす","せきゅりてぃ"],
"🧾": ["りょうしゅうしょ","かいけい","ぼき","しょうこ","しょうめい"], "🧾": ["りょうしゅうしょ","かいけい","ぼき","しょうこ","しょうめい"],
"💎": ["ほうせき","だいあもんど","じゅえる","ろまんす"], "💎": ["ほうせき","だいあもんど","じゅえる","ろまんす"],
"⚖": ["はかり","てんびん","こうせい","てんびんざ","ものさし","どうぐ","じゅうりょう","せいざ"], "⚖": ["はかり","てんびん","こうせい","てんびんざ","ものさし","どうぐ","じゅうりょう","せいざ"],
"🦯": ["しろつえ","あくせしびりてぃ","めがふじゆう"], "🦯": ["しろつえ","あくせしびりてぃ","めがふじゆう"],
"🧰": ["どうぐばこ","むね","せいびし","こうぐ"], "🧰": ["どうぐばこ","むね","せいびし","こうぐ"],
"🔧": ["れんち","どうぐ"], "🔧": ["れんち","どうぐ"],
"🪛": ["どらいばー","ねじ","こうぐ"], "🪛": ["どらいばー","ねじ","こうぐ"],
"🔨": ["はんまー","どうぐ"], "🔨": ["はんまー","どうぐ"],
"⚒": ["はんまーとつるはし","はんまー","つるはし","どうぐ"], "⚒": ["はんまーとつるはし","はんまー","つるはし","どうぐ"],
"🛠": ["はんまーとれんち","はんまー","どうぐ","れんち"], "🛠": ["はんまーとれんち","はんまー","どうぐ","れんち"],
"⛏": ["つるはし","さいくつ","どうぐ"], "⛏": ["つるはし","さいくつ","どうぐ"],
"🪓": ["おの","たたきぎり","ておの","われる","もくざい","こうぐ"], "🪓": ["おの","たたきぎり","ておの","われる","もくざい","こうぐ"],
"🪚": ["もっこうようのこぎり","だいく","ざいもく","のこぎり","こうぐ"], "🪚": ["もっこうようのこぎり","だいく","ざいもく","のこぎり","こうぐ"],
"🔩": ["なっととぼると","ぼると","なっと","どうぐ"], "🔩": ["なっととぼると","ぼると","なっと","どうぐ"],
"⚙": ["はぐるま","ぎあ","どうぐ"], "⚙": ["はぐるま","ぎあ","どうぐ"],
"⛓": ["くさり"], "⛓": ["くさり"],
"🪝": ["ふっく","わな","いかさま","ぺてん","ゆうわく","ふぃっしんぐ","つーる"], "🪝": ["ふっく","わな","いかさま","ぺてん","ゆうわく","ふぃっしんぐ","つーる"],
"🪜": ["はしご","のぼる","よこぎ","だん","こうぐ"], "🪜": ["はしご","のぼる","よこぎ","だん","こうぐ"],
"🧱": ["れんが","ねんど","けんせつ","もるたる","かべ"], "🧱": ["れんが","ねんど","けんせつ","もるたる","かべ"],
@ -1151,13 +1151,13 @@
"🧨": ["ばくちく","だいなまいと","かやく","はなび"], "🧨": ["ばくちく","だいなまいと","かやく","はなび"],
"💣": ["ばくだん"], "💣": ["ばくだん"],
"🔪": ["ほうちょう","きっちんないふ","ちょうり","ないふ"], "🔪": ["ほうちょう","きっちんないふ","ちょうり","ないふ"],
"🗡": ["たんけん","ないふ"], "🗡": ["たんけん","ないふ"],
"⚔": ["こうさしたけん","こうさ","けん"], "⚔": ["こうさしたけん","こうさ","けん"],
"🛡": ["たて"], "🛡": ["たて"],
"🚬": ["きつえんまーく","あくてぃびてぃ","きつえん"], "🚬": ["きつえんまーく","あくてぃびてぃ","きつえん"],
"⚰": ["かん","し"], "⚰": ["かん","し"],
"🪦": ["はかいし","ぼち","し","ぼ","はかば","はろうぃーん"], "🪦": ["はかいし","ぼち","し","ぼ","はかば","はろうぃーん"],
"⚱": ["こつつぼ","し","そうぎ"], "⚱": ["こつつぼ","し","そうぎ"],
"🏺": ["あんふぉら","みずがめざ","りょうり","のみもの","みずさし","どうぐ","せいざ"], "🏺": ["あんふぉら","みずがめざ","りょうり","のみもの","みずさし","どうぐ","せいざ"],
"🔮": ["すいしょうだま","たま","すいしょう","おとぎばなし","ふぁんたじー","うらない","どうぐ"], "🔮": ["すいしょうだま","たま","すいしょう","おとぎばなし","ふぁんたじー","うらない","どうぐ"],
"🪄": ["まほうのつえ","まほう","ぼう","まじょ","まほうつかい"], "🪄": ["まほうのつえ","まほう","ぼう","まじょ","まほうつかい"],
@ -1166,22 +1166,22 @@
"🪬": ["はむさ","おまもり","ふぁてぃま","て","めありー","みりあむ","ほご"], "🪬": ["はむさ","おまもり","ふぁてぃま","て","めありー","みりあむ","ほご"],
"💈": ["りはつてんのかんばんばしら","りはつてん","とこや","さんぱつ","かんばんばしら"], "💈": ["りはつてんのかんばんばしら","りはつてん","とこや","さんぱつ","かんばんばしら"],
"🧲": ["じしゃく","あとらくしょん","ばてい"], "🧲": ["じしゃく","あとらくしょん","ばてい"],
"⚗": ["じょうりゅうき","かがく","じっけん","どうぐ"], "⚗": ["じょうりゅうき","かがく","じっけん","どうぐ"],
"🧪": ["しけんかん","かがくしゃ","かがく","じっけん","じっけんしつ"], "🧪": ["しけんかん","かがくしゃ","かがく","じっけん","じっけんしつ"],
"🧫": ["ぺとりさら","ばくてりあ","せいぶつがくしゃ","せいぶつがく","ぶんか","じっけんしつ"], "🧫": ["ぺとりさら","ばくてりあ","せいぶつがくしゃ","せいぶつがく","ぶんか","じっけんしつ"],
"🧬": ["DNA","せいぶつがくしゃ","しんか","いでんし","いでんしがく","せいめい"], "🧬": ["DNA","せいぶつがくしゃ","しんか","いでんし","いでんしがく","せいめい"],
"🔭": ["ぼうえんきょう","つーる"], "🔭": ["ぼうえんきょう","つーる"],
"🔬": ["けんびきょう","つーる"], "🔬": ["けんびきょう","つーる"],
"🕳": ["あな"], "🕳": ["あな"],
"🩻": ["Xせん","ほね","いし","いりょう","こっかく"], "🩻": ["Xせん","ほね","いし","いりょう","こっかく"],
"💊": ["くすり","いし","ぴる","びょうき"], "💊": ["くすり","いし","ぴる","びょうき"],
"💉": ["ちゅうしゃき","いし","くすり","ちゅうしゃはり","ちゅうしゃ","びょうき","どうぐ","わくちん"], "💉": ["ちゅうしゃき","いし","くすり","ちゅうしゃはり","ちゅうしゃ","びょうき","どうぐ","わくちん"],
"🩸": ["ち1てき","いし","くすり","けつえき","せいり"], "🩸": ["ち1てき","いし","くすり","けつえき","せいり"],
"🩹": ["がーぜつきばんそうこう","いし","くすり","ばんどえいど","ほうたい","ばんそうこう"], "🩹": ["がーぜつきばんそうこう","いし","くすり","ばんどえいど","ほうたい","ばんそうこう"],
"🩺": ["ちょうしんき","いし","くすり","しんぞう"], "🩺": ["ちょうしんき","いし","くすり","しんぞう"],
"🌡": ["おんどけい","てんき","おんど"], "🌡": ["おんどけい","てんき","おんど"],
"🩼": ["まつばづえ","つえ","しょうがい","けが","いどうほじょ","ぼう"], "🩼": ["まつばづえ","つえ","しょうがい","けが","いどうほじょ","ぼう"],
"🏷": ["らべる","にふだ"], "🏷": ["らべる","にふだ"],
"🔖": ["ぶっくまーく","しおり","しるし"], "🔖": ["ぶっくまーく","しおり","しるし"],
"🚽": ["といれ"], "🚽": ["といれ"],
"🪠": ["ぷらんじゃー","ふぉーすかっぷ","はいかんこう","きゅういん","といれ"], "🪠": ["ぷらんじゃー","ふぉーすかっぷ","はいかんこう","きゅういん","といれ"],
@ -1200,24 +1200,24 @@
"🧺": ["ばすけっと","のうぎょう","らんどりー","ぴくにっく"], "🧺": ["ばすけっと","のうぎょう","らんどりー","ぴくにっく"],
"🪣": ["ばけつ","たる","ておけ","おおだる"], "🪣": ["ばけつ","たる","ておけ","おおだる"],
"🔑": ["かぎ","じょう","ぱすわーど"], "🔑": ["かぎ","じょう","ぱすわーど"],
"🗝": ["ふるいかぎ","かぎ","じょう","ふるい"], "🗝": ["ふるいかぎ","かぎ","じょう","ふるい"],
"🪤": ["ねずみとりき","えさ","ねずみ","かじはどうぶつ","わなわ","わな"], "🪤": ["ねずみとりき","えさ","ねずみ","かじはどうぶつ","わなわ","わな"],
"🛋": ["そふぁーとらんぷ","そふぁー","ほてる","らんぷ"], "🛋": ["そふぁーとらんぷ","そふぁー","ほてる","らんぷ"],
"🪑": ["いす","ざせき","すわる"], "🪑": ["いす","ざせき","すわる"],
"🛌": ["しゅくはくしせつ","ねる","ほてる","すいみん","べっど"], "🛌": ["しゅくはくしせつ","ねる","ほてる","すいみん","べっど"],
"🛏": ["べっど","ほてる","すいみん"], "🛏": ["べっど","ほてる","すいみん"],
"🚪": ["どあ","とびら"], "🚪": ["どあ","とびら"],
"🪞": ["かがみ","はんしゃ","はんしゃたい","はんしゃきょう"], "🪞": ["かがみ","はんしゃ","はんしゃたい","はんしゃきょう"],
"🪟": ["まど","わく","しんせんなくうき","がらす","かいこうぶ","とうめい","しかい"], "🪟": ["まど","わく","しんせんなくうき","がらす","かいこうぶ","とうめい","しかい"],
"🧳": ["てにもつ","ぱっきんぐ","りょこう","すーつけーす"], "🧳": ["てにもつ","ぱっきんぐ","りょこう","すーつけーす"],
"🛎": ["たくじょうべる","べる","ほてる"], "🛎": ["たくじょうべる","べる","ほてる"],
"🖼": ["がくにはいったしゃしん","あーと","がくぶち","びじゅつかん","かいが","しゃしん"], "🖼": ["がくにはいったしゃしん","あーと","がくぶち","びじゅつかん","かいが","しゃしん"],
"🧭": ["こんぱす","じしゃく","なびげーしょん","おりえんてーりんぐ"], "🧭": ["こんぱす","じしゃく","なびげーしょん","おりえんてーりんぐ"],
"🗺": ["せかいちず","ちず","せかい"], "🗺": ["せかいちず","ちず","せかい"],
"⛱": ["たてられたぱらそる","あめ","はれ","かさ","てんき"], "⛱": ["たてられたぱらそる","あめ","はれ","かさ","てんき"],
"🪭": ["おりたたみせんす","れいきゃく","えんりょがち","だんす","ふぁん","ふらったー","ねつ","あつい","うちき","ひろがる"], "🪭": ["おりたたみせんす","れいきゃく","えんりょがち","だんす","ふぁん","ふらったー","ねつ","あつい","うちき","ひろがる"],
"🗿": ["もやいぞう","もあいぞう","かお","ぞう"], "🗿": ["もやいぞう","もあいぞう","かお","ぞう"],
"🛍": ["かいものぶくろ","かばん","ほてる","かいもの"], "🛍": ["かいものぶくろ","かばん","ほてる","かいもの"],
"🎈": ["ふうせん","あくてぃびてぃ","おいわい","えんたーていめんと"], "🎈": ["ふうせん","あくてぃびてぃ","おいわい","えんたーていめんと"],
"🎏": ["こいのぼり","あくてぃびてぃ","こい","おいわい","えんたーていめんと","はた","ふきながし"], "🎏": ["こいのぼり","あくてぃびてぃ","こい","おいわい","えんたーていめんと","はた","ふきながし"],
"🎀": ["りぼん","おいわい"], "🎀": ["りぼん","おいわい"],
@ -1255,17 +1255,17 @@
"📄": ["ぶんしょ","ぺーじ"], "📄": ["ぶんしょ","ぺーじ"],
"📅": ["かれんだー","ひづけ"], "📅": ["かれんだー","ひづけ"],
"📆": ["ひめくりかれんだー","かれんだー"], "📆": ["ひめくりかれんだー","かれんだー"],
"🗓": ["りんぐかれんだー","かれんだー","ぱっど","らせんじょう"], "🗓": ["りんぐかれんだー","かれんだー","ぱっど","らせんじょう"],
"📇": ["めいしふぉるだ","かーど","さくいん","ろーらでっくす"], "📇": ["めいしふぉるだ","かーど","さくいん","ろーらでっくす"],
"🗃": ["かーどふぁいる","はこ","かーど","ふぁいる"], "🗃": ["かーどふぁいる","はこ","かーど","ふぁいる"],
"🗳": ["とうひょうようしととうひょうばこ","とうひょうようし","はこ","ひょう","とうひょう"], "🗳": ["とうひょうようしととうひょうばこ","とうひょうようし","はこ","ひょう","とうひょう"],
"🗄": ["ふぁいるしゅうのうこ","しゅうのう","ふぁいる"], "🗄": ["ふぁいるしゅうのうこ","しゅうのう","ふぁいる"],
"📋": ["くりっぷぼーど"], "📋": ["くりっぷぼーど"],
"🗒": ["りんぐのーと","のーと","ぱっど","らせんじょう"], "🗒": ["りんぐのーと","のーと","ぱっど","らせんじょう"],
"📁": ["ふぉるだ","ふぁいる"], "📁": ["ふぉるだ","ふぁいる"],
"📂": ["ひらいたふぉるだ","ふぁいる","ふぉるだ","ひらいた"], "📂": ["ひらいたふぉるだ","ふぁいる","ふぉるだ","ひらいた"],
"🗂": ["しきりかーど","かーど","しきり","さくいん"], "🗂": ["しきりかーど","かーど","しきり","さくいん"],
"🗞": ["まるめたしんぶん","にゅーす","しんぶん","かみ","まるめた"], "🗞": ["まるめたしんぶん","にゅーす","しんぶん","かみ","まるめた"],
"📰": ["しんぶん","こみゅにけーしょん","にゅーす","かみ"], "📰": ["しんぶん","こみゅにけーしょん","にゅーす","かみ"],
"🪧": ["ぷらかーど","でも","しがらみ","こうぎ","かんばん"], "🪧": ["ぷらかーど","でも","しがらみ","こうぎ","かんばん"],
"📓": ["のーと"], "📓": ["のーと"],
@ -1279,7 +1279,7 @@
"📖": ["ひらいたほん","ほん","ひらいた"], "📖": ["ひらいたほん","ほん","ひらいた"],
"🔗": ["りんく"], "🔗": ["りんく"],
"📎": ["くりっぷ","ぺーぱーくりっぷ"], "📎": ["くりっぷ","ぺーぱーくりっぷ"],
"🖇": ["つながったぺーぱーくりっぷ","こみゅにけーしょん","りんく","ぺーぱーくりっぷ"], "🖇": ["つながったぺーぱーくりっぷ","こみゅにけーしょん","りんく","ぺーぱーくりっぷ"],
"✂️": ["はさみ","どうぐ"], "✂️": ["はさみ","どうぐ"],
"📐": ["さんかくじょうぎ","じょうぎ","はいち","さんかく"], "📐": ["さんかくじょうぎ","じょうぎ","はいち","さんかく"],
"📏": ["じょうぎ","ちょくじょうぎ"], "📏": ["じょうぎ","ちょくじょうぎ"],
@ -1294,13 +1294,13 @@
"🔒": ["かぎ","とじられた","せじょう"], "🔒": ["かぎ","とじられた","せじょう"],
"🔓": ["かいじょう","せじょう","あける"], "🔓": ["かいじょう","せじょう","あける"],
"🔏": ["じょうまえとぺん","いんく","じょう","ぺんさき","ぺん","ぷらいばしー"], "🔏": ["じょうまえとぺん","いんく","じょう","ぺんさき","ぺん","ぷらいばしー"],
"🖊": ["ひだりしたむきのぼーるぺん","ぼーるぺん","こみゅにけーしょん","ぺん"], "🖊": ["ひだりしたむきのぼーるぺん","ぼーるぺん","こみゅにけーしょん","ぺん"],
"🖋": ["ひだりしたむきのまんねんひつ","こみゅにけーしょん","まんねんひつ","ぺん"], "🖋": ["ひだりしたむきのまんねんひつ","こみゅにけーしょん","まんねんひつ","ぺん"],
"✒️": ["ぺんさき","ぺん"], "✒️": ["ぺんさき","ぺん"],
"📝": ["めも","こみゅにけーしょん","えんぴつ"], "📝": ["めも","こみゅにけーしょん","えんぴつ"],
"✏️": ["えんぴつ"], "✏️": ["えんぴつ"],
"🖍": ["ひだりしたむきのくれよん","こみゅにけーしょん","くれよん"], "🖍": ["ひだりしたむきのくれよん","こみゅにけーしょん","くれよん"],
"🖌": ["ひだりしたむきのぶらし","こみゅにけーしょん","ぺいんとぶらし","え"], "🖌": ["ひだりしたむきのぶらし","こみゅにけーしょん","ぺいんとぶらし","え"],
"🔍": ["ひだりむきむしめがね","めがね","かくだい","けんさく","つーる"], "🔍": ["ひだりむきむしめがね","めがね","かくだい","けんさく","つーる"],
"🔎": ["みぎむきむしめがね","めがね","かくだい","けんさく","つーる"], "🔎": ["みぎむきむしめがね","めがね","かくだい","けんさく","つーる"],
"❤️": ["あかいろのはーと","はーと"], "❤️": ["あかいろのはーと","はーと"],
@ -1313,7 +1313,7 @@
"🖤": ["くろいはーと","はーと","くろ","あく","わるもの"], "🖤": ["くろいはーと","はーと","くろ","あく","わるもの"],
"🤍": ["しろのはーと","はーと","しろ"], "🤍": ["しろのはーと","はーと","しろ"],
"💔": ["われたはーと","はーと","こわれる","はきょく"], "💔": ["われたはーと","はーと","こわれる","はきょく"],
"❣": ["はーとのびっくりまーく","はーと","びっくりまーく","きごう"], "❣": ["はーとのびっくりまーく","はーと","びっくりまーく","きごう"],
"💕": ["2つのはーと","はーと","あい"], "💕": ["2つのはーと","はーと","あい"],
"💞": ["かいてんするはーと","はーと","かいてん"], "💞": ["かいてんするはーと","はーと","かいてん"],
"💓": ["こどうするはーと","はーと","こどう","どきどき"], "💓": ["こどうするはーと","はーと","こどう","どきどき"],
@ -1324,40 +1324,40 @@
"❤️‍🔥": ["もえているはーと","はーと","ひ","もえる","あい","ねつじょう","しんせいなはーと"], "❤️‍🔥": ["もえているはーと","はーと","ひ","もえる","あい","ねつじょう","しんせいなはーと"],
"❤️‍🩹": ["てあてしているはーと","はーと","けんこうになる","かいぜんしている","てあてしている","かいふくしている","やみあがり","げんき"], "❤️‍🩹": ["てあてしているはーと","はーと","けんこうになる","かいぜんしている","てあてしている","かいふくしている","やみあがり","げんき"],
"💟": ["はーとのでこれーしょん","はーと"], "💟": ["はーとのでこれーしょん","はーと"],
"☮": ["ぴーすまーく","へいわ"], "☮": ["ぴーすまーく","へいわ"],
"✝": ["らてんじゅうじ","くりすちゃん","じゅうじか","しゅうきょう"], "✝": ["らてんじゅうじ","くりすちゃん","じゅうじか","しゅうきょう"],
"☪": ["ほしとみかづき","いすらむ","むすりむ","しゅうきょう"], "☪": ["ほしとみかづき","いすらむ","むすりむ","しゅうきょう"],
"🕉": ["おーむまーく","ひんどぅーきょう","おーむ","しゅうきょう"], "🕉": ["おーむまーく","ひんどぅーきょう","おーむ","しゅうきょう"],
"☸": ["ほうりん","ぶっきょうと","だーま","しゅうきょう"], "☸": ["ほうりん","ぶっきょうと","だーま","しゅうきょう"],
"✡": ["だびでのほし","だびで","ゆだやじん","ゆだやきょう","しゅうきょう","ほし"], "✡": ["だびでのほし","だびで","ゆだやじん","ゆだやきょう","しゅうきょう","ほし"],
"🔯": ["ろくぼうせい","うらない","ほし"], "🔯": ["ろくぼうせい","うらない","ほし"],
"🕎": ["はぬっきーやー","しょくだい","めのーらー","しゅうきょう"], "🕎": ["はぬっきーやー","しょくだい","めのーらー","しゅうきょう"],
"☯": ["いんよう","しゅうきょう","どう","どうか","ひ","かげ"], "☯": ["いんよう","しゅうきょう","どう","どうか","ひ","かげ"],
"☦": ["はったんじゅうじか","くりすちゃん","じゅうじか","しゅうきょう"], "☦": ["はったんじゅうじか","くりすちゃん","じゅうじか","しゅうきょう"],
"🪯": ["かんだ","しゅうきょう","しーくきょうと"], "🪯": ["かんだ","しゅうきょう","しーくきょうと"],
"🛐": ["れいはいしょ","しゅうきょう","れいはい"], "🛐": ["れいはいしょ","しゅうきょう","れいはい"],
"⛎": ["へびつかいざ","うんぱんにん","へび","せいざ"], "⛎": ["へびつかいざ","うんぱんにん","へび","せいざ"],
"♈": ["おひつじざ","こひつじ","せいざ"], "♈": ["おひつじざ","こひつじ","せいざ"],
"♉": ["おうしざ","おすうし","ゆううし","せいざ"], "♉": ["おうしざ","おすうし","ゆううし","せいざ"],
"♊": ["ふたござ","ふたご","せいざ"], "♊": ["ふたござ","ふたご","せいざ"],
"♋": ["がん","かにざ","かに","せいざ"], "♋": ["がん","かにざ","かに","せいざ"],
"♌": ["ししざ","らいおん","せいざ"], "♌": ["ししざ","らいおん","せいざ"],
"♍": ["おとめざ","おとめ","しょじょ","せいざ"], "♍": ["おとめざ","おとめ","しょじょ","せいざ"],
"♎": ["てんびんざ","てんびん","こうせい","はかり","せいざ"], "♎": ["てんびんざ","てんびん","こうせい","はかり","せいざ"],
"♏": ["さそりざ","さそり","せいざ"], "♏": ["さそりざ","さそり","せいざ"],
"♐": ["いてざ","しゃしゅ","しゃしゅざ","せいざ"], "♐": ["いてざ","しゃしゅ","しゃしゅざ","せいざ"],
"♑": ["やぎざ","やぎ","せいざ"], "♑": ["やぎざ","やぎ","せいざ"],
"♒": ["みずがめざ","うんぱんじん","みず","せいざ"], "♒": ["みずがめざ","うんぱんじん","みず","せいざ"],
"♓": ["うおざ","さかな","せいざ"], "♓": ["うおざ","さかな","せいざ"],
"🆔": ["しかくかこみID","ID","しきべつ"], "🆔": ["しかくかこみID","ID","しきべつ"],
"⚛": ["げんそきごう","むしんろんしゃ","げんし"], "⚛": ["げんそきごう","むしんろんしゃ","げんし"],
"⚕️": ["あすくれぴおすのつえ","けんこう","せわ","いし","くすり","つえ","へび"], "⚕️": ["あすくれぴおすのつえ","けんこう","せわ","いし","くすり","つえ","へび"],
"☢": ["ほうしゃのうひょうしき","ほうしゃのう"], "☢": ["ほうしゃのうひょうしき","ほうしゃのう"],
"☣": ["ばいおはざーどひょうしき","せいぶつさいがい"], "☣": ["ばいおはざーどひょうしき","せいぶつさいがい"],
"📴": ["けいたいでんわでんげんおふ","けいたい","こみゅにけーしょん","もばいる","おふ","けいたいでんわ","でんわ"], "📴": ["けいたいでんわでんげんおふ","けいたい","こみゅにけーしょん","もばいる","おふ","けいたいでんわ","でんわ"],
"📳": ["まなーもーど","けいたい","こみゅにけーしょん","もばいる","もーど","けいたいでんわ","でんわ","ばいぶれーしょん"], "📳": ["まなーもーど","けいたい","こみゅにけーしょん","もばいる","もーど","けいたいでんわ","でんわ","ばいぶれーしょん"],
"🈶": ["しかくかこみゆう","にほんご","あり"], "🈶": ["しかくかこみゆう","にほんご","あり"],
"🈚": ["しかくかこみむ","しかくかこみいな","にほんご","なし"], "🈚": ["しかくかこみむ","しかくかこみいな","にほんご","なし"],
"🈸": ["しかくかこみしん","しかくかこみてき","ちゅうごくご","しんせい"], "🈸": ["しかくかこみしん","しかくかこみてき","ちゅうごくご","しんせい"],
"🈺": ["しかくかこみえい","ちゅうごくご","えいぎょう"], "🈺": ["しかくかこみえい","ちゅうごくご","えいぎょう"],
"🈷️": ["しかくかこみつき","にほんご","つきぎめ"], "🈷️": ["しかくかこみつき","にほんご","つきぎめ"],
@ -1378,11 +1378,11 @@
"🆑": ["しかくかこみCL","CL"], "🆑": ["しかくかこみCL","CL"],
"🅾️": ["くろしかくかこみO","けつえきがた","O"], "🅾️": ["くろしかくかこみO","けつえきがた","O"],
"🆘": ["しかくかこみSOS","へるぷ","SOS"], "🆘": ["しかくかこみSOS","へるぷ","SOS"],
"⛔": ["たちいりきんし","たちいり","きんし","だめ","できない","きんじる","こうつう"], "⛔": ["たちいりきんし","たちいり","きんし","だめ","できない","きんじる","こうつう"],
"📛": ["なふだ","ばっじ","なまえ"], "📛": ["なふだ","ばっじ","なまえ"],
"🚫": ["しんにゅうきんし","たちいり","きんし","だめ","できない","きんじる"], "🚫": ["しんにゅうきんし","たちいり","きんし","だめ","できない","きんじる"],
"❌": ["ばつしるし","きゃんせる","きごう","かけざん","じょうざん","x"], "❌": ["ばつしるし","きゃんせる","きごう","かけざん","じょうざん","x"],
"⭕": ["ふといおおきなまる","まる","O"], "⭕": ["ふといおおきなまる","まる","O"],
"💢": ["いかりまーく","いかり","まんが","げきど"], "💢": ["いかりまーく","いかり","まんが","げきど"],
"♨️": ["おんせん","あたたかい","わきでる","じょうき"], "♨️": ["おんせん","あたたかい","わきでる","じょうき"],
"🚷": ["ほこうしゃたちいりきんし","きんし","だめ","ない","ほこうしゃ","きんじる"], "🚷": ["ほこうしゃたちいりきんし","きんし","だめ","ない","ほこうしゃ","きんじる"],
@ -1392,7 +1392,7 @@
"🔞": ["18さいみまんきんし","18","ねんれいせいげん","じゅうはち","きんし","だめ","ない","きんしした","みせいねんしゃ"], "🔞": ["18さいみまんきんし","18","ねんれいせいげん","じゅうはち","きんし","だめ","ない","きんしした","みせいねんしゃ"],
"📵": ["けいたいでんわきんし","けいたい","つうしん","きんし","もばいる","だめ","できない","けいたいでんわ","きんしされている","でんわ"], "📵": ["けいたいでんわきんし","けいたい","つうしん","きんし","もばいる","だめ","できない","けいたいでんわ","きんしされている","でんわ"],
"🚭": ["きんえん","きんし","だめ","できない","きんしされている","きつえん"], "🚭": ["きんえん","きんし","だめ","できない","きんしされている","きつえん"],
"❗": ["あかいびっくりまーく","びっくり","まーく","きごう"], "❗": ["あかいびっくりまーく","びっくり","まーく","きごう"],
"❕": ["しろいびっくりまーく","びっくり","まーく","かこみ","きごう"], "❕": ["しろいびっくりまーく","びっくり","まーく","かこみ","きごう"],
"❓": ["あかいはてなまーく","まーく","きごう","はてな"], "❓": ["あかいはてなまーく","まーく","きごう","はてな"],
"❔": ["しろいはてなまーく","まーく","かこみ","きごう","はてな"], "❔": ["しろいはてなまーく","まーく","かこみ","きごう","はてな"],
@ -1402,13 +1402,13 @@
"🔅": ["ていきど","あかるさ","うすぐらい","てい"], "🔅": ["ていきど","あかるさ","うすぐらい","てい"],
"🔆": ["こうきど","あかるい","あかるさ"], "🔆": ["こうきど","あかるい","あかるさ"],
"🔱": ["とらいでんと","いかり","えんぶれむ","ふね","こうぐ"], "🔱": ["とらいでんと","いかり","えんぶれむ","ふね","こうぐ"],
"⚜": ["ゆりのもんしょう"], "⚜": ["ゆりのもんしょう"],
"〽️": ["いおりてん","しるし","ぶぶん"], "〽️": ["いおりてん","しるし","ぶぶん"],
"⚠️": ["けいこく"], "⚠️": ["けいこく"],
"🚸": ["こうさてんをわたるこどもたち","こども","こうさてん","ほこうしゃ","こうつう"], "🚸": ["こうさてんをわたるこどもたち","こども","こうさてん","ほこうしゃ","こうつう"],
"🔰": ["しょしんしゃまーく","しょしんしゃ","まーく","みどり","にっぽん","わかば","どうぐ","き"], "🔰": ["しょしんしゃまーく","しょしんしゃ","まーく","みどり","にっぽん","わかば","どうぐ","き"],
"♻️": ["りさいくるまーく","りさいくる"], "♻️": ["りさいくるまーく","りさいくる"],
"🈯": ["しかくかこみゆび","にほんご"], "🈯": ["しかくかこみゆび","にほんご"],
"💹": ["じょうしょうとれんどのちゃーととえんきごう","じょうしょうちゅうえんちゃーと","ぎんこう","ちゃーと","つうか","ぐらふ","せいちょう","しじょう","おかね","じょうしょう","とれんど","うわむき","えん"], "💹": ["じょうしょうとれんどのちゃーととえんきごう","じょうしょうちゅうえんちゃーと","ぎんこう","ちゃーと","つうか","ぐらふ","せいちょう","しじょう","おかね","じょうしょう","とれんど","うわむき","えん"],
"❇️": ["きらきら"], "❇️": ["きらきら"],
"✳️": ["あすたりすく (8ほんこうせい)","あすたりすく"], "✳️": ["あすたりすく (8ほんこうせい)","あすたりすく"],
@ -1422,7 +1422,7 @@
"Ⓜ️": ["まるかこみM","えん","M"], "Ⓜ️": ["まるかこみM","えん","M"],
"🏧": ["ATM","ATMきごう","じどう","ぎんこう","すいとう"], "🏧": ["ATM","ATMきごう","じどう","ぎんこう","すいとう"],
"🚾": ["といれ","けしょうしつ","おてあらい","みず","WC"], "🚾": ["といれ","けしょうしつ","おてあらい","みず","WC"],
"♿": ["くるまいす","あくせす"], "♿": ["くるまいす","あくせす"],
"🅿️": ["くろしかくかこみP","ちゅうしゃじょう"], "🅿️": ["くろしかくかこみP","ちゅうしゃじょう"],
"🈳": ["しかくかこみそら","しかくかこみのそら","ちゅうごくご","そらしつ","あき","くうしゃ"], "🈳": ["しかくかこみそら","しかくかこみのそら","ちゅうごくご","そらしつ","あき","くうしゃ"],
"🈂️": ["しかくかこみさ","にっぽんじん","さーびす"], "🈂️": ["しかくかこみさ","にっぽんじん","さーびす"],
@ -1450,26 +1450,26 @@
"🆒": ["COOL","かっこいい","くーる"], "🆒": ["COOL","かっこいい","くーる"],
"🆕": ["しかくかこみnew","しん"], "🆕": ["しかくかこみnew","しん"],
"🆓": ["しかくかこみFREE","ふりー","むりょう"], "🆓": ["しかくかこみFREE","ふりー","むりょう"],
"0⃣": ["0きー","0","きー","ぜろ"], "0⃣": ["0きー","0","きー","ぜろ"],
"1⃣": ["1きー","いち","きー"], "1⃣": ["1きー","いち","きー"],
"2⃣": ["2きー","2","きー","に"], "2⃣": ["2きー","2","きー","に"],
"3⃣": ["3きー","3","きー","さん"], "3⃣": ["3きー","3","きー","さん"],
"4⃣": ["4きー","4","よん","きー"], "4⃣": ["4きー","4","よん","きー"],
"5⃣": ["5きー","5","ご","きー"], "5⃣": ["5きー","5","ご","きー"],
"6⃣": ["6きー","6","きー","ろく"], "6⃣": ["6きー","6","きー","ろく"],
"7⃣": ["7きー","7","きー","なな"], "7⃣": ["7きー","7","きー","なな"],
"8⃣": ["8きー","8","はち","きー"], "8⃣": ["8きー","8","はち","きー"],
"9⃣": ["9きー","9","きー","きゅう"], "9⃣": ["9きー","9","きー","きゅう"],
"🔟": ["10きー","10","きー","じゅう"], "🔟": ["10きー","10","きー","じゅう"],
"🔢": ["ばんごうのにゅうりょくきごう","1234","にゅうりょく","すうじ"], "🔢": ["ばんごうのにゅうりょくきごう","1234","にゅうりょく","すうじ"],
"▶️": ["みぎむきさんかく","さいせいぼたん","やじるし","さいせい","みぎ","さんかっけい"], "▶️": ["みぎむきさんかく","さいせいぼたん","やじるし","さいせい","みぎ","さんかっけい"],
"⏸": ["2ほんのすいちょくばー","いちじていしぼたん","ばー","2ばい","いちじていし","すいちょく"], "⏸": ["2ほんのすいちょくばー","いちじていしぼたん","ばー","2ばい","いちじていし","すいちょく"],
"⏯": ["みぎむきのさんかっけいとにじゅうすいちょくぼう","さいせいまたはいちじていしぼたん","やじるし","いちじていし","さいせい","みぎ","さんかっけい"], "⏯": ["みぎむきのさんかっけいとにじゅうすいちょくぼう","さいせいまたはいちじていしぼたん","やじるし","いちじていし","さいせい","みぎ","さんかっけい"],
"⏹": ["ていし","ていしぼたん","しかく"], "⏹": ["ていし","ていしぼたん","しかく"],
"⏺": ["ろくが","ろくがぼたん","まる"], "⏺": ["ろくが","ろくがぼたん","まる"],
"⏏️": ["とりだしまーく","とりだしぼたん"], "⏏️": ["とりだしまーく","とりだしぼたん"],
"⏭": ["みぎむきのにじゅうさんかっけいとすいちょくぼう","「つぎのきょく」ぼたん","やじるし","つぎのばめん","つぎのきょく","さんかっけい"], "⏭": ["みぎむきのにじゅうさんかっけいとすいちょくぼう","「つぎのきょく」ぼたん","やじるし","つぎのばめん","つぎのきょく","さんかっけい"],
"⏮": ["ひだりむきのにじゅうさんかっけいとすいちょくぼう","「まえのきょく」ぼたん","やじるし","まえのばめん","まえのきょく","さんかっけい"], "⏮": ["ひだりむきのにじゅうさんかっけいとすいちょくぼう","「まえのきょく」ぼたん","やじるし","まえのばめん","まえのきょく","さんかっけい"],
"⏩": ["みぎむきのにじゅうさんかっけい","はやおくりぼたん","やじるし","2ばい","こうそく","すすむ"], "⏩": ["みぎむきのにじゅうさんかっけい","はやおくりぼたん","やじるし","2ばい","こうそく","すすむ"],
"⏪": ["ひだりむきのにじゅうさんかっけい","はやもどしぼたん","やじるし","2ばい","まきもどし"], "⏪": ["ひだりむきのにじゅうさんかっけい","はやもどしぼたん","やじるし","2ばい","まきもどし"],
"🔀": ["ねじりみぎむきやじるしのえもじ","しゃっふる","やじるし","こうさ"], "🔀": ["ねじりみぎむきやじるしのえもじ","しゃっふる","やじるし","こうさ"],
@ -1496,7 +1496,7 @@
"🔃": ["るーぷやじるし","とけいのはり","やじるし","とけいまわり","りろーど"], "🔃": ["るーぷやじるし","とけいのはり","やじるし","とけいまわり","りろーど"],
"⤴️": ["みぎうえへかーぶするやじるし","うえへかーぶするみぎやじるし","やじるし"], "⤴️": ["みぎうえへかーぶするやじるし","うえへかーぶするみぎやじるし","やじるし"],
"⤵️": ["みぎしたへかーぶするやじるし","したにかーぶするみぎやじるし","やじるし","した"], "⤵️": ["みぎしたへかーぶするやじるし","したにかーぶするみぎやじるし","やじるし","した"],
"#⃣": ["#きー","はっしゅ","きー","ぽんど"], "#⃣": ["#きー","はっしゅ","きー","ぽんど"],
"*⃣": ["あすたりすくきー","あすたりすく","きー","ほし"], "*⃣": ["あすたりすくきー","あすたりすく","きー","ほし"],
"": ["じょうほうげん","i","いんふぉめーしょん"], "": ["じょうほうげん","i","いんふぉめーしょん"],
"🔤": ["あるふぁべっとにゅうりょく","abc","あるふぁべっと","にゅうりょく","らてん","もじ"], "🔤": ["あるふぁべっとにゅうりょく","abc","あるふぁべっと","にゅうりょく","らてん","もじ"],
@ -1532,8 +1532,8 @@
"🔵": ["あおまる","あお","えん","きかがく"], "🔵": ["あおまる","あお","えん","きかがく"],
"🟣": ["むらさきのまる","えん","きかがく","むらさき"], "🟣": ["むらさきのまる","えん","きかがく","むらさき"],
"🟤": ["ちゃいろのまる","えん","きかがく","ちゃいろ"], "🟤": ["ちゃいろのまる","えん","きかがく","ちゃいろ"],
"⚫": ["くろまる","えん","きかがく"], "⚫": ["くろまる","えん","きかがく"],
"⚪": ["しろまる","えん","きかがく"], "⚪": ["しろまる","えん","きかがく"],
"🟥": ["あかのせいほうけい","せいほうけい","きかがく","あか"], "🟥": ["あかのせいほうけい","せいほうけい","きかがく","あか"],
"🟧": ["おれんじしょくのせいほうけい","せいほうけい","きかがく","おれんじ"], "🟧": ["おれんじしょくのせいほうけい","せいほうけい","きかがく","おれんじ"],
"🟨": ["きいろのせいほうけい","せいほうけい","きかがく","きいろ"], "🟨": ["きいろのせいほうけい","せいほうけい","きかがく","きいろ"],
@ -1541,12 +1541,12 @@
"🟦": ["あおのせいほうけい","せいほうけい","きかがく","あお"], "🟦": ["あおのせいほうけい","せいほうけい","きかがく","あお"],
"🟪": ["むらさきのせいほうけい","せいほうけい","きかがく","むらさき"], "🟪": ["むらさきのせいほうけい","せいほうけい","きかがく","むらさき"],
"🟫": ["ちゃいろのせいほうけい","せいほうけい","きかがく","ちゃいろ"], "🟫": ["ちゃいろのせいほうけい","せいほうけい","きかがく","ちゃいろ"],
"⬛": ["くろいおおきなしかく","きかがく","せいほうけい"], "⬛": ["くろいおおきなしかく","きかがく","せいほうけい"],
"⬜": ["しろいおおきなしかく","きかがく","せいほうけい"], "⬜": ["しろいおおきなしかく","きかがく","せいほうけい"],
"◼️": ["くろいちゅうくらいのしかく","きかがく","せいほうけい"], "◼️": ["くろいちゅうくらいのしかく","きかがく","せいほうけい"],
"◻️": ["しろくてちゅうくらいのしかく","きかがく","せいほうけい"], "◻️": ["しろくてちゅうくらいのしかく","きかがく","せいほうけい"],
"◾": ["くろくてちゅうくらいのちいさいしかく","きかがく","せいほうけい"], "◾": ["くろくてちゅうくらいのちいさいしかく","きかがく","せいほうけい"],
"◽": ["しろいちゅうくらいのちいさなしかく","きかがく","せいほうけい"], "◽": ["しろいちゅうくらいのちいさなしかく","きかがく","せいほうけい"],
"▪️": ["くろいちいさなしかく","きかがく","せいほうけい"], "▪️": ["くろいちいさなしかく","きかがく","せいほうけい"],
"▫️": ["しろいちいさなしかく","きかがく","せいほうけい"], "▫️": ["しろいちいさなしかく","きかがく","せいほうけい"],
"🔸": ["ちいさいおれんじのだいやもんど","だいやもんど","きかがく","おれんじ"], "🔸": ["ちいさいおれんじのだいやもんど","だいやもんど","きかがく","おれんじ"],
@ -1566,16 +1566,16 @@
"🔔": ["べる"], "🔔": ["べる"],
"🔕": ["みゅーと","すらっしゅべる","かね","きんじられた","だめ","ない","きんし","しずか"], "🔕": ["みゅーと","すらっしゅべる","かね","きんじられた","だめ","ない","きんし","しずか"],
"🃏": ["とらんぷのじょーかー","かーど","えんたーていめんと","げーむ","じょーかー","ぷれい"], "🃏": ["とらんぷのじょーかー","かーど","えんたーていめんと","げーむ","じょーかー","ぷれい"],
"🀄": ["まーじゃんぱいのちゅう","げーむ","まーじゃん","あか"], "🀄": ["まーじゃんぱいのちゅう","げーむ","まーじゃん","あか"],
"♠️": ["とらんぷのすぺーど","かーど","げーむ","すぺーど","すーつ"], "♠️": ["とらんぷのすぺーど","かーど","げーむ","すぺーど","すーつ"],
"♣️": ["とらんぷのくらぶ","かーど","くらぶ","げーむ","すーつ"], "♣️": ["とらんぷのくらぶ","かーど","くらぶ","げーむ","すーつ"],
"♥️": ["とらんぷのはーと","かーど","げーむ","はーと","すーつ"], "♥️": ["とらんぷのはーと","かーど","げーむ","はーと","すーつ"],
"♦️": ["とらんぷのだいや","かーど","だいや","だいやもんど","げーむ","すーつ"], "♦️": ["とらんぷのだいや","かーど","だいや","だいやもんど","げーむ","すーつ"],
"🎴": ["はなふだ","あくてぃびてぃ","かーど","えんたーていめんと","はな","げーむ","にっぽん","ぷれい"], "🎴": ["はなふだ","あくてぃびてぃ","かーど","えんたーていめんと","はな","げーむ","にっぽん","ぷれい"],
"👁‍🗨": ["ふきだしのめ","ふきだし","め","すぴーち","しょうにん"], "👁‍🗨": ["ふきだしのめ","ふきだし","め","すぴーち","しょうにん"],
"🗨": ["ひだりむきのふきだし","せりふ","すぴーち"], "🗨": ["ひだりむきのふきだし","せりふ","すぴーち"],
"💭": ["かんがえふきだし","ふきだし","あわ","まんが","かんがえ"], "💭": ["かんがえふきだし","ふきだし","あわ","まんが","かんがえ"],
"🗯": ["みぎむきのいかりのふきだし","いかり","ふきだし","あわ","げきど"], "🗯": ["みぎむきのいかりのふきだし","いかり","ふきだし","あわ","げきど"],
"💬": ["ふきだし","あわ","まんが","せりふ","すぴーち"], "💬": ["ふきだし","あわ","まんが","せりふ","すぴーち"],
"🕐": ["1じ","0ふん","1","とけい","とき","いち"], "🕐": ["1じ","0ふん","1","とけい","とき","いち"],
"🕑": ["2じ","0ふん","2","とけい","とき","に"], "🕑": ["2じ","0ふん","2","とけい","とき","に"],
@ -1601,7 +1601,7 @@
"🕥": ["10じはん","10じ","はん","じこく","じゅう","30"], "🕥": ["10じはん","10じ","はん","じこく","じゅう","30"],
"🕦": ["11じはん","11じ","はん","じこく","じゅういち","30"], "🕦": ["11じはん","11じ","はん","じこく","じゅういち","30"],
"🕧": ["12じはん","12じ","はん","じこく","30","じゅうに"], "🕧": ["12じはん","12じ","はん","じこく","30","じゅうに"],
"🏳": ["なびくしろはた","はた","なびく"], "🏳": ["なびくしろはた","はた","なびく"],
"🏴": ["なびくくろはた","はた","なびく"], "🏴": ["なびくくろはた","はた","なびく"],
"🏁": ["ちぇっかーふらっぐ","いちまつもよう","はた","れーす"], "🏁": ["ちぇっかーふらっぐ","いちまつもよう","はた","れーす"],
"🚩": ["さんかくはた","はた","ぽすと"], "🚩": ["さんかくはた","はた","ぽすと"],
@ -1861,5 +1861,6 @@
"🇾🇹": ["まよっとのはた","こっき","まよっと"], "🇾🇹": ["まよっとのはた","こっき","まよっと"],
"🇿🇦": ["みなみあふりかこっき","こっき","みなみ","みなみあふりか"], "🇿🇦": ["みなみあふりかこっき","こっき","みなみ","みなみあふりか"],
"🇿🇲": ["ざんびあこっき","こっき","ざんびあ"], "🇿🇲": ["ざんびあこっき","こっき","ざんびあ"],
"🇿🇼": ["じんばぶえこっき","こっき","じんばぶえ"] "🇿🇼": ["じんばぶえこっき","こっき","じんばぶえ"],
"": ["しぶや109", "SHIBUYA109", "109"]
} }

View file

@ -1,6 +1,6 @@
/* /*
* version: 2023.12.2 * version: 2023.12.2
* generatedAt: 2024-01-20T04:59:59.768Z * generatedAt: 2024-01-21T01:01:12.332Z
*/ */
import type { SwitchCaseResponseType } from '../api.js'; import type { SwitchCaseResponseType } from '../api.js';

View file

@ -1,6 +1,6 @@
/* /*
* version: 2023.12.2 * version: 2023.12.2
* generatedAt: 2024-01-20T04:59:59.766Z * generatedAt: 2024-01-21T01:01:12.330Z
*/ */
import type { import type {

View file

@ -1,6 +1,6 @@
/* /*
* version: 2023.12.2 * version: 2023.12.2
* generatedAt: 2024-01-20T04:59:59.765Z * generatedAt: 2024-01-21T01:01:12.328Z
*/ */
import { operations } from './types.js'; import { operations } from './types.js';

View file

@ -1,6 +1,6 @@
/* /*
* version: 2023.12.2 * version: 2023.12.2
* generatedAt: 2024-01-20T04:59:59.764Z * generatedAt: 2024-01-21T01:01:12.327Z
*/ */
import { components } from './types.js'; import { components } from './types.js';

View file

@ -3,7 +3,7 @@
/* /*
* version: 2023.12.2 * version: 2023.12.2
* generatedAt: 2024-01-20T04:59:59.681Z * generatedAt: 2024-01-21T01:01:12.246Z
*/ */
/** /**
@ -4465,6 +4465,8 @@ export type components = {
createdAt: string; createdAt: string;
/** Format: date-time */ /** Format: date-time */
startedAt: string | null; startedAt: string | null;
/** Format: date-time */
endedAt: string | null;
isStarted: boolean; isStarted: boolean;
isEnded: boolean; isEnded: boolean;
form1: Record<string, never> | null; form1: Record<string, never> | null;
@ -4481,12 +4483,15 @@ export type components = {
winnerId: string | null; winnerId: string | null;
winner: components['schemas']['User'] | null; winner: components['schemas']['User'] | null;
/** Format: id */ /** Format: id */
surrendered: string | null; surrenderedUserId: string | null;
/** Format: id */
timeoutUserId: string | null;
black: number | null; black: number | null;
bw: string; bw: string;
isLlotheo: boolean; isLlotheo: boolean;
canPutEverywhere: boolean; canPutEverywhere: boolean;
loopedBoard: boolean; loopedBoard: boolean;
timeLimitForEachTurn: number;
}; };
ReversiGameDetailed: { ReversiGameDetailed: {
/** Format: id */ /** Format: id */
@ -4495,6 +4500,8 @@ export type components = {
createdAt: string; createdAt: string;
/** Format: date-time */ /** Format: date-time */
startedAt: string | null; startedAt: string | null;
/** Format: date-time */
endedAt: string | null;
isStarted: boolean; isStarted: boolean;
isEnded: boolean; isEnded: boolean;
form1: Record<string, never> | null; form1: Record<string, never> | null;
@ -4511,12 +4518,15 @@ export type components = {
winnerId: string | null; winnerId: string | null;
winner: components['schemas']['User'] | null; winner: components['schemas']['User'] | null;
/** Format: id */ /** Format: id */
surrendered: string | null; surrenderedUserId: string | null;
/** Format: id */
timeoutUserId: string | null;
black: number | null; black: number | null;
bw: string; bw: string;
isLlotheo: boolean; isLlotheo: boolean;
canPutEverywhere: boolean; canPutEverywhere: boolean;
loopedBoard: boolean; loopedBoard: boolean;
timeLimitForEachTurn: number;
logs: unknown[][]; logs: unknown[][];
map: string[]; map: string[];
}; };

View file

@ -6,6 +6,7 @@
import { get } from 'idb-keyval'; import { get } from 'idb-keyval';
import * as Misskey from 'misskey-js'; import * as Misskey from 'misskey-js';
import type { PushNotificationDataMap } from '@/types.js'; import type { PushNotificationDataMap } from '@/types.js';
import type { I18n, Locale } from '@/scripts/i18n.js';
import { createEmptyNotification, createNotification } from '@/scripts/create-notification.js'; import { createEmptyNotification, createNotification } from '@/scripts/create-notification.js';
import { swLang } from '@/scripts/lang.js'; import { swLang } from '@/scripts/lang.js';
import * as swos from '@/scripts/operations.js'; import * as swos from '@/scripts/operations.js';
@ -26,8 +27,15 @@ globalThis.addEventListener('activate', ev => {
); );
}); });
function offlineContentHTML(): string { async function offlineContentHTML() {
return `<!doctype html>Offline. Service Worker @${_VERSION_} <button onclick="location.reload()">reload</button>`; const i18n = await (swLang.i18n ?? swLang.fetchLocale()) as Partial<I18n<Locale>>;
const messages = {
title: i18n.ts?._offlineScreen?.title ?? 'Offline - Could not connect to server',
header: i18n.ts?._offlineScreen?.header ?? 'Could not connect to server',
reload: i18n.ts?.reload ?? 'Reload',
};
return `<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><meta content="width=device-width,initial-scale=1"name="viewport"><title>${messages.title}</title><style>body{background-color:#0c1210;color:#dee7e4;font-family:Hiragino Maru Gothic Pro,BIZ UDGothic,Roboto,HelveticaNeue,Arial,sans-serif;line-height:1.35;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;margin:0;padding:24px;box-sizing:border-box}.icon{max-width:120px;width:100%;height:auto;margin-bottom:20px;}.message{text-align:center;font-size:20px;font-weight:700;margin-bottom:20px}.version{text-align:center;font-size:90%;margin-bottom:20px}button{padding:7px 14px;min-width:100px;font-weight:700;font-family:Hiragino Maru Gothic Pro,BIZ UDGothic,Roboto,HelveticaNeue,Arial,sans-serif;line-height:1.35;border-radius:99rem;background-color:#b4e900;color:#192320;border:none;cursor:pointer;-webkit-tap-highlight-color:transparent}button:hover{background-color:#c6ff03}</style></head><body><svg class="icon"fill="none"height="24"stroke="currentColor"stroke-linecap="round"stroke-linejoin="round"stroke-width="2"viewBox="0 0 24 24"width="24"xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z"fill="none"stroke="none"/><path d="M9.58 5.548c.24 -.11 .492 -.207 .752 -.286c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.913 0 3.464 1.56 3.464 3.486c0 .957 -.383 1.824 -1.003 2.454m-2.997 1.033h-11.343c-2.572 -.004 -4.657 -2.011 -4.657 -4.487c0 -2.475 2.085 -4.482 4.657 -4.482c.13 -.582 .37 -1.128 .7 -1.62"/><path d="M3 3l18 18"/></svg><div class="message">${messages.header}</div><div class="version">v${_VERSION_}</div><button onclick="reloadPage()">${messages.reload}</button><script>function reloadPage(){location.reload(!0)}</script></body></html>`;
} }
globalThis.addEventListener('fetch', ev => { globalThis.addEventListener('fetch', ev => {
@ -43,8 +51,9 @@ globalThis.addEventListener('fetch', ev => {
if (!isHTMLRequest) return; if (!isHTMLRequest) return;
ev.respondWith( ev.respondWith(
fetch(ev.request) fetch(ev.request)
.catch(() => { .catch(async () => {
return new Response(offlineContentHTML(), { const html = await offlineContentHTML();
return new Response(html, {
status: 200, status: 200,
headers: { headers: {
'content-type': 'text/html', 'content-type': 'text/html',