reversi 💮 💯

This commit is contained in:
syuilo 2018-06-17 08:10:54 +09:00
parent 68d7c4de0d
commit 6b54f277c3
48 changed files with 197 additions and 197 deletions

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "Mehr"
close: "Schließen"
desktop/views/components/game-window.vue:
game: "Othello"
game: "Reversi"
desktop/views/components/home.vue:
done: "Verbunden"
add-widget: "Widget hinzufügen:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "More"
close: "Close"
desktop/views/components/game-window.vue:
game: "Othello"
game: "Reversi"
desktop/views/components/home.vue:
done: "Submit"
add-widget: "Add widget:"
@ -549,7 +549,7 @@ desktop/views/components/ui.header.nav.vue:
home: "Home"
deck: "Deck"
messaging: "Messages"
game: "Play Othello"
game: "Play Reversi"
desktop/views/components/ui.header.notifications.vue:
title: "Notifications"
desktop/views/components/ui.header.post.vue:

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "Plus"
close: "Fermer"
desktop/views/components/game-window.vue:
game: "Othello"
game: "Reversi"
desktop/views/components/home.vue:
done: "Envoyer"
add-widget: "Ajouter un widget"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -384,7 +384,7 @@ desktop/views/components/friends-maker.vue:
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "Więcej"
close: "Zamknij"
desktop/views/components/game-window.vue:
game: "Othello"
game: "Reversi"
desktop/views/components/home.vue:
done: "Wyślij"
add-widget: "Dodaj widżet:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -333,7 +333,7 @@ desktop/views/components/friends-maker.vue:
refresh: "もっと見る"
close: "閉じる"
desktop/views/components/game-window.vue:
game: "オセロ"
game: "リバーシ"
desktop/views/components/home.vue:
done: "完了"
add-widget: "ウィジェットを追加:"

View File

@ -55,7 +55,7 @@ export default function(type, data): Notification {
icon: data.user.avatarUrl + '?thumbnail&size=64'
};
case 'othello_invited':
case 'reversi_invited':
return {
title: '対局への招待があります',
body: `${getUserName(data.parent)}さんから`,

View File

@ -1,9 +1,9 @@
import Stream from './stream';
import MiOS from '../../../mios';
export class OthelloGameStream extends Stream {
export class ReversiGameStream extends Stream {
constructor(os: MiOS, me, game) {
super(os, 'othello-game', {
super(os, 'reversi-game', {
i: me ? me.token : null,
game: game.id
});

View File

@ -2,15 +2,15 @@ import StreamManager from './stream-manager';
import Stream from './stream';
import MiOS from '../../../mios';
export class OthelloStream extends Stream {
export class ReversiStream extends Stream {
constructor(os: MiOS, me) {
super(os, 'othello', {
super(os, 'reversi', {
i: me.token
});
}
}
export class OthelloStreamManager extends StreamManager<OthelloStream> {
export class ReversiStreamManager extends StreamManager<ReversiStream> {
private me;
private os: MiOS;
@ -23,7 +23,7 @@ export class OthelloStreamManager extends StreamManager<OthelloStream> {
public getConnection() {
if (this.connection == null) {
this.connection = new OthelloStream(this.os, this.me);
this.connection = new ReversiStream(this.os, this.me);
}
return this.connection;

View File

@ -27,7 +27,7 @@ import urlPreview from './url-preview.vue';
import twitterSetting from './twitter-setting.vue';
import fileTypeIcon from './file-type-icon.vue';
import Switch from './switch.vue';
import Othello from './othello.vue';
import Reversi from './reversi.vue';
import welcomeTimeline from './welcome-timeline.vue';
import uiInput from './ui/input.vue';
import uiButton from './ui/button.vue';
@ -65,7 +65,7 @@ Vue.component('mk-url-preview', urlPreview);
Vue.component('mk-twitter-setting', twitterSetting);
Vue.component('mk-file-type-icon', fileTypeIcon);
Vue.component('mk-switch', Switch);
Vue.component('mk-othello', Othello);
Vue.component('mk-reversi', Reversi);
Vue.component('mk-welcome-timeline', welcomeTimeline);
Vue.component('ui-input', uiInput);
Vue.component('ui-button', uiButton);

View File

@ -43,7 +43,7 @@
<script lang="ts">
import Vue from 'vue';
import * as CRC32 from 'crc-32';
import Othello, { Color } from '../../../../../othello/core';
import Reversi, { Color } from '../../../../../reversi/core';
import { url } from '../../../config';
export default Vue.extend({
@ -52,7 +52,7 @@ export default Vue.extend({
data() {
return {
game: null,
o: null as Othello,
o: null as Reversi,
logs: [],
logPos: 0,
pollingClock: null
@ -98,7 +98,7 @@ export default Vue.extend({
watch: {
logPos(v) {
if (!this.game.isEnded) return;
this.o = new Othello(this.game.settings.map, {
this.o = new Reversi(this.game.settings.map, {
isLlotheo: this.game.settings.isLlotheo,
canPutEverywhere: this.game.settings.canPutEverywhere,
loopedBoard: this.game.settings.loopedBoard
@ -115,7 +115,7 @@ export default Vue.extend({
created() {
this.game = this.initGame;
this.o = new Othello(this.game.settings.map, {
this.o = new Reversi(this.game.settings.map, {
isLlotheo: this.game.settings.isLlotheo,
canPutEverywhere: this.game.settings.canPutEverywhere,
loopedBoard: this.game.settings.loopedBoard
@ -163,7 +163,7 @@ export default Vue.extend({
//
if (this.$store.state.device.enableSounds) {
const sound = new Audio(`${url}/assets/othello-put-me.mp3`);
const sound = new Audio(`${url}/assets/reversi-put-me.mp3`);
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
@ -187,7 +187,7 @@ export default Vue.extend({
//
if (this.$store.state.device.enableSounds && x.color != this.myColor) {
const sound = new Audio(`${url}/assets/othello-put-you.mp3`);
const sound = new Audio(`${url}/assets/reversi-put-you.mp3`);
sound.volume = this.$store.state.device.soundVolume;
sound.play();
}
@ -213,7 +213,7 @@ export default Vue.extend({
onRescue(game) {
this.game = game;
this.o = new Othello(this.game.settings.map, {
this.o = new Reversi(this.game.settings.map, {
isLlotheo: this.game.settings.isLlotheo,
canPutEverywhere: this.game.settings.canPutEverywhere,
loopedBoard: this.game.settings.loopedBoard

View File

@ -7,9 +7,9 @@
<script lang="ts">
import Vue from 'vue';
import XGame from './othello.game.vue';
import XRoom from './othello.room.vue';
import { OthelloGameStream } from '../../scripts/streaming/othello-game';
import XGame from './reversi.game.vue';
import XRoom from './reversi.room.vue';
import { ReversiGameStream } from '../../scripts/streaming/reversi-game';
export default Vue.extend({
components: {
@ -25,7 +25,7 @@ export default Vue.extend({
},
created() {
this.g = this.game;
this.connection = new OthelloGameStream((this as any).os, this.$store.state.i, this.game);
this.connection = new ReversiGameStream((this as any).os, this.$store.state.i, this.game);
this.connection.on('started', this.onStarted);
},
beforeDestroy() {

View File

@ -94,7 +94,7 @@
<script lang="ts">
import Vue from 'vue';
import * as maps from '../../../../../othello/maps';
import * as maps from '../../../../../reversi/maps';
export default Vue.extend({
props: ['game', 'connection'],

View File

@ -1,5 +1,5 @@
<template>
<div class="mk-othello">
<div class="mk-reversi">
<div v-if="game">
<x-gameroom :game="game"/>
</div>
@ -11,14 +11,14 @@
</div>
<div class="index" v-else>
<h1>Misskey %fa:circle%thell%fa:circle R%</h1>
<p>他のMisskeyユーザーとオセロで対戦しよう</p>
<p>他のMisskeyユーザーとリバーシで対戦しよう</p>
<div class="play">
<el-button round>フリーマッチ(準備中)</el-button>
<el-button type="primary" round @click="match">指名</el-button>
<details>
<summary>遊び方</summary>
<div>
<p>オセロ相手と交互に石をボードに置いてゆき相手の石を挟んでひっくり返しながら最終的に残った石が多い方が勝ちというボードゲームです</p>
<p>リバーシ相手と交互に石をボードに置いてゆき相手の石を挟んでひっくり返しながら最終的に残った石が多い方が勝ちというボードゲームです</p>
<dl>
<dt><b>フリーマッチ</b></dt>
<dd>ランダムなユーザーと対戦するモードです</dd>
@ -39,7 +39,7 @@
</section>
<section v-if="myGames.length > 0">
<h2>自分の対局</h2>
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
<a class="game" v-for="g in myGames" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
@ -48,7 +48,7 @@
</section>
<section v-if="games.length > 0">
<h2>みんなの対局</h2>
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/othello/${g.id}`">
<a class="game" v-for="g in games" tabindex="-1" @click.prevent="go(g)" :href="`/reversi/${g.id}`">
<mk-avatar class="avatar" :user="g.user1"/>
<mk-avatar class="avatar" :user="g.user2"/>
<span><b>{{ g.user1.name }}</b> vs <b>{{ g.user2.name }}</b></span>
@ -61,7 +61,7 @@
<script lang="ts">
import Vue from 'vue';
import XGameroom from './othello.gameroom.vue';
import XGameroom from './reversi.gameroom.vue';
export default Vue.extend({
components: {
@ -93,24 +93,24 @@ export default Vue.extend({
}
},
mounted() {
this.connection = (this as any).os.streams.othelloStream.getConnection();
this.connectionId = (this as any).os.streams.othelloStream.use();
this.connection = (this as any).os.streams.reversiStream.getConnection();
this.connectionId = (this as any).os.streams.reversiStream.use();
this.connection.on('matched', this.onMatched);
this.connection.on('invited', this.onInvited);
(this as any).api('othello/games', {
(this as any).api('reversi/games', {
my: true
}).then(games => {
this.myGames = games;
});
(this as any).api('othello/games').then(games => {
(this as any).api('reversi/games').then(games => {
this.games = games;
this.gamesFetching = false;
});
(this as any).api('othello/invitations').then(invitations => {
(this as any).api('reversi/invitations').then(invitations => {
this.invitations = this.invitations.concat(invitations);
});
@ -126,13 +126,13 @@ export default Vue.extend({
beforeDestroy() {
this.connection.off('matched', this.onMatched);
this.connection.off('invited', this.onInvited);
(this as any).os.streams.othelloStream.dispose(this.connectionId);
(this as any).os.streams.reversiStream.dispose(this.connectionId);
clearInterval(this.pingClock);
},
methods: {
go(game) {
(this as any).api('othello/games/show', {
(this as any).api('reversi/games/show', {
gameId: game.id
}).then(game => {
this.matching = null;
@ -146,7 +146,7 @@ export default Vue.extend({
(this as any).api('users/show', {
username
}).then(user => {
(this as any).api('othello/match', {
(this as any).api('reversi/match', {
userId: user.id
}).then(res => {
if (res == null) {
@ -160,10 +160,10 @@ export default Vue.extend({
},
cancel() {
this.matching = null;
(this as any).api('othello/match/cancel');
(this as any).api('reversi/match/cancel');
},
accept(invitation) {
(this as any).api('othello/match', {
(this as any).api('reversi/match', {
userId: invitation.parent.id
}).then(game => {
if (game) {
@ -186,7 +186,7 @@ export default Vue.extend({
<style lang="stylus" scoped>
@import '~const.styl'
.mk-othello
.mk-reversi
color #677f84
background #fff

View File

@ -34,7 +34,7 @@ import MkMessagingRoom from './views/pages/messaging-room.vue';
import MkNote from './views/pages/note.vue';
import MkSearch from './views/pages/search.vue';
import MkTag from './views/pages/tag.vue';
import MkOthello from './views/pages/othello.vue';
import MkReversi from './views/pages/reversi.vue';
import MkShare from './views/pages/share.vue';
/**
@ -64,8 +64,8 @@ init(async (launch) => {
{ path: '/search', component: MkSearch },
{ path: '/tags/:tag', component: MkTag },
{ path: '/share', component: MkShare },
{ path: '/othello', component: MkOthello },
{ path: '/othello/:game', component: MkOthello },
{ path: '/reversi', component: MkReversi },
{ path: '/reversi/:game', component: MkReversi },
{ path: '/@:user', component: MkUser },
{ path: '/notes/:note', component: MkNote }
]
@ -166,8 +166,8 @@ function registerNotifications(stream: HomeStreamManager) {
setTimeout(n.close.bind(n), 7000);
});
connection.on('othello_invited', matching => {
const _n = composeNotification('othello_invited', matching);
connection.on('reversi_invited', matching => {
const _n = composeNotification('reversi_invited', matching);
const n = new Notification(_n.title, {
body: _n.body,
icon: _n.icon

View File

@ -1,7 +1,7 @@
<template>
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
<mk-othello :class="$style.content" @gamed="g => game = g"/>
<mk-reversi :class="$style.content" @gamed="g => game = g"/>
</mk-window>
</template>
@ -18,8 +18,8 @@ export default Vue.extend({
computed: {
popout(): string {
return this.game
? `${url}/othello/${this.game.id}`
: `${url}/othello`;
? `${url}/reversi/${this.game.id}`
: `${url}/reversi`;
}
}
});

View File

@ -56,23 +56,23 @@ export default Vue.extend({
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
this.connection.on('reversi_invited', this.onReversiInvited);
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
}
},
beforeDestroy() {
if (this.$store.getters.isSignedIn) {
this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
this.connection.off('reversi_invited', this.onReversiInvited);
this.connection.off('reversi_no_invites', this.onReversiNoInvites);
(this as any).os.stream.dispose(this.connectionId);
}
},
methods: {
onOthelloInvited() {
onReversiInvited() {
this.hasGameInvitations = true;
},
onOthelloNoInvites() {
onReversiNoInvites() {
this.hasGameInvitations = false;
},

View File

@ -1,6 +1,6 @@
<template>
<component :is="ui ? 'mk-ui' : 'div'">
<mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/>
<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
</component>
</template>
@ -33,7 +33,7 @@ export default Vue.extend({
Progress.start();
this.fetching = true;
(this as any).api('othello/games/show', {
(this as any).api('reversi/games/show', {
gameId: this.$route.params.game
}).then(game => {
this.game = game;
@ -43,7 +43,7 @@ export default Vue.extend({
});
},
onGamed(game) {
history.pushState(null, null, '/othello/' + game.id);
history.pushState(null, null, '/reversi/' + game.id);
}
}
});

View File

@ -11,7 +11,7 @@ import { DriveStreamManager } from './common/scripts/streaming/drive';
import { ServerStatsStreamManager } from './common/scripts/streaming/server-stats';
import { NotesStatsStreamManager } from './common/scripts/streaming/notes-stats';
import { MessagingIndexStreamManager } from './common/scripts/streaming/messaging-index';
import { OthelloStreamManager } from './common/scripts/streaming/othello';
import { ReversiStreamManager } from './common/scripts/streaming/reversi';
import Err from './common/views/components/connect-failed.vue';
import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline';
@ -108,7 +108,7 @@ export default class MiOS extends EventEmitter {
serverStatsStream: ServerStatsStreamManager;
notesStatsStream: NotesStatsStreamManager;
messagingIndexStream: MessagingIndexStreamManager;
othelloStream: OthelloStreamManager;
reversiStream: ReversiStreamManager;
} = {
localTimelineStream: null,
globalTimelineStream: null,
@ -116,7 +116,7 @@ export default class MiOS extends EventEmitter {
serverStatsStream: null,
notesStatsStream: null,
messagingIndexStream: null,
othelloStream: null
reversiStream: null
};
/**
@ -233,7 +233,7 @@ export default class MiOS extends EventEmitter {
this.streams.globalTimelineStream = new GlobalTimelineStreamManager(this, this.store.state.i);
this.streams.driveStream = new DriveStreamManager(this, this.store.state.i);
this.streams.messagingIndexStream = new MessagingIndexStreamManager(this, this.store.state.i);
this.streams.othelloStream = new OthelloStreamManager(this, this.store.state.i);
this.streams.reversiStream = new ReversiStreamManager(this, this.store.state.i);
});
//#endregion

View File

@ -35,7 +35,7 @@ import MkFavorites from './views/pages/favorites.vue';
import MkUserLists from './views/pages/user-lists.vue';
import MkUserList from './views/pages/user-list.vue';
import MkSettings from './views/pages/settings.vue';
import MkOthello from './views/pages/othello.vue';
import MkReversi from './views/pages/reversi.vue';
import MkTag from './views/pages/tag.vue';
import MkShare from './views/pages/share.vue';
@ -75,8 +75,8 @@ init((launch) => {
{ path: '/search', component: MkSearch },
{ path: '/tags/:tag', component: MkTag },
{ path: '/share', component: MkShare },
{ path: '/othello', name: 'othello', component: MkOthello },
{ path: '/othello/:game', component: MkOthello },
{ path: '/reversi', name: 'reversi', component: MkReversi },
{ path: '/reversi/:game', component: MkReversi },
{ path: '/@:user', component: MkUser },
{ path: '/@:user/followers', component: MkFollowers },
{ path: '/@:user/following', component: MkFollowing },

View File

@ -45,8 +45,8 @@ export default Vue.extend({
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
this.connection.on('reversi_invited', this.onReversiInvited);
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
const isHisasiburi = ago >= 3600;
@ -98,16 +98,16 @@ export default Vue.extend({
},
beforeDestroy() {
if (this.$store.getters.isSignedIn) {
this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
this.connection.off('reversi_invited', this.onReversiInvited);
this.connection.off('reversi_no_invites', this.onReversiNoInvites);
(this as any).os.stream.dispose(this.connectionId);
}
},
methods: {
onOthelloInvited() {
onReversiInvited() {
this.hasGameInvitation = true;
},
onOthelloNoInvites() {
onReversiNoInvites() {
this.hasGameInvitation = false;
}
}

View File

@ -19,7 +19,7 @@
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
<li><router-link to="/reversi" :data-active="$route.name == 'reversi'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
</ul>
<ul>
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
@ -66,14 +66,14 @@ export default Vue.extend({
this.connection = (this as any).os.stream.getConnection();
this.connectionId = (this as any).os.stream.use();
this.connection.on('othello_invited', this.onOthelloInvited);
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
this.connection.on('reversi_invited', this.onReversiInvited);
this.connection.on('reversi_no_invites', this.onReversiNoInvites);
}
},
beforeDestroy() {
if (this.$store.getters.isSignedIn) {
this.connection.off('othello_invited', this.onOthelloInvited);
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
this.connection.off('reversi_invited', this.onReversiInvited);
this.connection.off('reversi_no_invites', this.onReversiNoInvites);
(this as any).os.stream.dispose(this.connectionId);
}
},
@ -83,10 +83,10 @@ export default Vue.extend({
if (query == null || query == '') return;
this.$router.push('/search?q=' + encodeURIComponent(query));
},
onOthelloInvited() {
onReversiInvited() {
this.hasGameInvitation = true;
},
onOthelloNoInvites() {
onReversiNoInvites() {
this.hasGameInvitation = false;
},
dark() {

View File

@ -1,7 +1,7 @@
<template>
<mk-ui>
<span slot="header">%fa:gamepad%オセロ</span>
<mk-othello v-if="!fetching" :init-game="game" @gamed="onGamed"/>
<span slot="header">%fa:gamepad%リバーシ</span>
<mk-reversi v-if="!fetching" :init-game="game" @gamed="onGamed"/>
</mk-ui>
</template>
@ -23,7 +23,7 @@ export default Vue.extend({
this.fetch();
},
mounted() {
document.title = 'Misskey オセロ';
document.title = 'Misskey リバーシ';
document.documentElement.style.background = '#fff';
},
methods: {
@ -33,7 +33,7 @@ export default Vue.extend({
Progress.start();
this.fetching = true;
(this as any).api('othello/games/show', {
(this as any).api('reversi/games/show', {
gameId: this.$route.params.game
}).then(game => {
this.game = game;
@ -43,7 +43,7 @@ export default Vue.extend({
});
},
onGamed(game) {
history.pushState(null, null, '/othello/' + game.id);
history.pushState(null, null, '/reversi/' + game.id);
}
}
});

View File

@ -60,7 +60,7 @@ export type Source = {
hook_secret: string;
username: string;
};
othello_ai?: {
reversi_ai?: {
id: string;
i: string;
};

View File

@ -3,10 +3,10 @@ import * as deepcopy from 'deepcopy';
import db from '../db/mongodb';
import { IUser, pack as packUser } from './user';
const OthelloGame = db.get<IOthelloGame>('othelloGames');
export default OthelloGame;
const ReversiGame = db.get<IReversiGame>('reversiGames');
export default ReversiGame;
export interface IOthelloGame {
export interface IReversiGame {
_id: mongo.ObjectID;
createdAt: Date;
startedAt: Date;
@ -45,7 +45,7 @@ export interface IOthelloGame {
}
/**
* Pack an othello game for API response
* Pack an reversi game for API response
*/
export const pack = (
game: any,
@ -62,11 +62,11 @@ export const pack = (
// Populate the game if 'game' is ID
if (mongo.ObjectID.prototype.isPrototypeOf(game)) {
_game = await OthelloGame.findOne({
_game = await ReversiGame.findOne({
_id: game
});
} else if (typeof game === 'string') {
_game = await OthelloGame.findOne({
_game = await ReversiGame.findOne({
_id: new mongo.ObjectID(game)
});
} else {

View File

@ -3,7 +3,7 @@ import * as deepcopy from 'deepcopy';
import db from '../db/mongodb';
import { IUser, pack as packUser } from './user';
const Matching = db.get<IMatching>('othelloMatchings');
const Matching = db.get<IMatching>('reversiMatchings');
export default Matching;
export interface IMatching {
@ -14,7 +14,7 @@ export interface IMatching {
}
/**
* Pack an othello matching for API response
* Pack an reversi matching for API response
*/
export const pack = (
matching: any,

View File

@ -37,12 +37,12 @@ class MisskeyEvent {
this.publish(`messaging-index-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishOthelloStream(userId: ID, type: string, value?: any): void {
this.publish(`othello-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
public publishReversiStream(userId: ID, type: string, value?: any): void {
this.publish(`reversi-stream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
public publishOthelloGameStream(gameId: ID, type: string, value?: any): void {
this.publish(`othello-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
public publishReversiGameStream(gameId: ID, type: string, value?: any): void {
this.publish(`reversi-game-stream:${gameId}`, type, typeof value === 'undefined' ? null : value);
}
public publishLocalTimelineStream(note: any): void {
@ -73,5 +73,5 @@ export const publishUserListStream = ev.publishUserListStream.bind(ev);
export const publishNoteStream = ev.publishNoteStream.bind(ev);
export const publishMessagingStream = ev.publishMessagingStream.bind(ev);
export const publishMessagingIndexStream = ev.publishMessagingIndexStream.bind(ev);
export const publishOthelloStream = ev.publishOthelloStream.bind(ev);
export const publishOthelloGameStream = ev.publishOthelloGameStream.bind(ev);
export const publishReversiStream = ev.publishReversiStream.bind(ev);
export const publishReversiGameStream = ev.publishReversiGameStream.bind(ev);

View File

@ -7,7 +7,7 @@
*/
import * as request from 'request-promise-native';
import Othello, { Color } from '../core';
import Reversi, { Color } from '../core';
import conf from '../../config';
import getUserName from '../../renderers/get-user-name';
@ -17,12 +17,12 @@ let form;
/**
* BotアカウントのユーザーID
*/
const id = conf.othello_ai.id;
const id = conf.reversi_ai.id;
/**
* BotアカウントのAPIキー
*/
const i = conf.othello_ai.i;
const i = conf.reversi_ai.i;
let note;
@ -44,7 +44,7 @@ process.on('message', async msg => {
//#region TLに投稿する
const game = msg.body;
const url = `${conf.url}/othello/${game.id}`;
const url = `${conf.url}/reversi/${game.id}`;
const user = game.user1Id == id ? game.user2 : game.user1;
const isSettai = form[0].value === 0;
const text = isSettai
@ -100,7 +100,7 @@ process.on('message', async msg => {
}
});
let o: Othello;
let o: Reversi;
let botColor: Color;
// 各マスの強さ
@ -113,8 +113,8 @@ let cellWeights;
function onGameStarted(g) {
game = g;
// オセロエンジン初期化
o = new Othello(game.settings.map, {
// リバーシエンジン初期化
o = new Reversi(game.settings.map, {
isLlotheo: game.settings.isLlotheo,
canPutEverywhere: game.settings.canPutEverywhere,
loopedBoard: game.settings.loopedBoard

View File

@ -17,12 +17,12 @@ import conf from '../../config';
/**
* BotアカウントのAPIキー
*/
const i = conf.othello_ai.i;
const i = conf.reversi_ai.i;
/**
* BotアカウントのユーザーID
*/
const id = conf.othello_ai.id;
const id = conf.reversi_ai.id;
////////////////////////////////////////////////////////////////
@ -59,7 +59,7 @@ homeStream.on('message', message => {
});
if (note.text) {
if (note.text.indexOf('オセロ') > -1) {
if (note.text.indexOf('リバーシ') > -1) {
request.post(`${conf.api_url}/notes/create`, {
json: { i,
replyId: note.id,
@ -76,7 +76,7 @@ homeStream.on('message', message => {
if (msg.type == 'messaging_message') {
const message = msg.body;
if (message.text) {
if (message.text.indexOf('オセロ') > -1) {
if (message.text.indexOf('リバーシ') > -1) {
request.post(`${conf.api_url}/messaging/messages/create`, {
json: { i,
userId: message.userId,
@ -92,7 +92,7 @@ homeStream.on('message', message => {
// ユーザーを対局に誘う
function invite(userId) {
request.post(`${conf.api_url}/othello/match`, {
request.post(`${conf.api_url}/reversi/match`, {
json: { i,
userId: userId
}
@ -100,21 +100,21 @@ function invite(userId) {
}
/**
*
*
*/
const othelloStream = new ReconnectingWebSocket(`${conf.ws_url}/othello?i=${i}`, undefined, {
const reversiStream = new ReconnectingWebSocket(`${conf.ws_url}/reversi?i=${i}`, undefined, {
constructor: WebSocket
});
othelloStream.on('open', () => {
console.log('othello stream opened');
reversiStream.on('open', () => {
console.log('reversi stream opened');
});
othelloStream.on('close', () => {
console.log('othello stream closed');
reversiStream.on('close', () => {
console.log('reversi stream closed');
});
othelloStream.on('message', message => {
reversiStream.on('message', message => {
const msg = JSON.parse(message.toString());
// 招待されたとき
@ -134,12 +134,12 @@ othelloStream.on('message', message => {
*/
function gameStart(game) {
// ゲームストリームに接続
const gw = new ReconnectingWebSocket(`${conf.ws_url}/othello-game?i=${i}&game=${game.id}`, undefined, {
const gw = new ReconnectingWebSocket(`${conf.ws_url}/reversi-game?i=${i}&game=${game.id}`, undefined, {
constructor: WebSocket
});
gw.on('open', () => {
console.log('othello game stream opened');
console.log('reversi game stream opened');
// フォーム
const form = [{
@ -210,19 +210,19 @@ function gameStart(game) {
});
gw.on('close', () => {
console.log('othello game stream closed');
console.log('reversi game stream closed');
});
}
/**
*
*
* @param inviter
*/
async function onInviteMe(inviter) {
console.log(`Someone invited me: @${inviter.username}`);
// 承認
const game = await request.post(`${conf.api_url}/othello/match`, {
const game = await request.post(`${conf.api_url}/reversi/match`, {
json: {
i,
userId: inviter.id

View File

@ -37,9 +37,9 @@ export type Undo = {
};
/**
*
*
*/
export default class Othello {
export default class Reversi {
public map: MapPixel[];
public mapWidth: number;
public mapHeight: number;

View File

@ -892,7 +892,7 @@ export const test4: Map = {
]
};
// https://misskey.xyz/othello/5aaabf7fe126e10b5216ea09 64
// https://misskey.xyz/reversi/5aaabf7fe126e10b5216ea09 64
export const test5: Map = {
name: 'Test5',
category: 'Test',

View File

@ -245,27 +245,27 @@ const endpoints: Endpoint[] = [
},
{
name: 'othello/match',
name: 'reversi/match',
withCredential: true
},
{
name: 'othello/match/cancel',
name: 'reversi/match/cancel',
withCredential: true
},
{
name: 'othello/invitations',
name: 'reversi/invitations',
withCredential: true
},
{
name: 'othello/games',
name: 'reversi/games',
withCredential: true
},
{
name: 'othello/games/show'
name: 'reversi/games/show'
},
{

View File

@ -1,5 +1,5 @@
import $ from 'cafy'; import ID from '../../../../cafy-id';
import OthelloGame, { pack } from '../../../../models/othello-game';
import ReversiGame, { pack } from '../../../../models/reversi-game';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'my' parameter
@ -50,7 +50,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
}
// Fetch games
const games = await OthelloGame.find(q, {
const games = await ReversiGame.find(q, {
sort,
limit
});

View File

@ -1,19 +1,19 @@
import $ from 'cafy'; import ID from '../../../../../cafy-id';
import OthelloGame, { pack } from '../../../../../models/othello-game';
import Othello from '../../../../../othello/core';
import ReversiGame, { pack } from '../../../../../models/reversi-game';
import Reversi from '../../../../../reversi/core';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'gameId' parameter
const [gameId, gameIdErr] = $.type(ID).get(params.gameId);
if (gameIdErr) return rej('invalid gameId param');
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (game == null) {
return rej('game not found');
}
const o = new Othello(game.settings.map, {
const o = new Reversi(game.settings.map, {
isLlotheo: game.settings.isLlotheo,
canPutEverywhere: game.settings.canPutEverywhere,
loopedBoard: game.settings.loopedBoard

View File

@ -1,4 +1,4 @@
import Matching, { pack as packMatching } from '../../../../models/othello-matching';
import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Find session

View File

@ -1,9 +1,9 @@
import $ from 'cafy'; import ID from '../../../../cafy-id';
import Matching, { pack as packMatching } from '../../../../models/othello-matching';
import OthelloGame, { pack as packGame } from '../../../../models/othello-game';
import Matching, { pack as packMatching } from '../../../../models/reversi-matching';
import ReversiGame, { pack as packGame } from '../../../../models/reversi-game';
import User from '../../../../models/user';
import publishUserStream, { publishOthelloStream } from '../../../../publishers/stream';
import { eighteight } from '../../../../othello/maps';
import publishUserStream, { publishReversiStream } from '../../../../publishers/stream';
import { eighteight } from '../../../../reversi/maps';
module.exports = (params, user) => new Promise(async (res, rej) => {
// Get 'userId' parameter
@ -28,7 +28,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
});
// Create game
const game = await OthelloGame.insert({
const game = await ReversiGame.insert({
createdAt: new Date(),
user1Id: exist.parentId,
user2Id: user._id,
@ -47,14 +47,14 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
// Reponse
res(await packGame(game, user));
publishOthelloStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
publishReversiStream(exist.parentId, 'matched', await packGame(game, exist.parentId));
const other = await Matching.count({
childId: user._id
});
if (other == 0) {
publishUserStream(user._id, 'othello_no_invites');
publishUserStream(user._id, 'reversi_no_invites');
}
} else {
// Fetch child
@ -88,8 +88,8 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
const packed = await packMatching(matching, child);
// 招待
publishOthelloStream(child._id, 'invited', packed);
publishReversiStream(child._id, 'invited', packed);
publishUserStream(child._id, 'othello_invited', packed);
publishUserStream(child._id, 'reversi_invited', packed);
}
});

View File

@ -1,4 +1,4 @@
import Matching from '../../../../../models/othello-matching';
import Matching from '../../../../../models/reversi-matching';
module.exports = (params, user) => new Promise(async (res, rej) => {
await Matching.remove({

View File

@ -1,10 +1,10 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
import * as CRC32 from 'crc-32';
import OthelloGame, { pack } from '../../../models/othello-game';
import { publishOthelloGameStream } from '../../../publishers/stream';
import Othello from '../../../othello/core';
import * as maps from '../../../othello/maps';
import ReversiGame, { pack } from '../../../models/reversi-game';
import { publishReversiGameStream } from '../../../publishers/stream';
import Reversi from '../../../reversi/core';
import * as maps from '../../../reversi/maps';
import { ParsedUrlQuery } from 'querystring';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user?: any): void {
@ -12,7 +12,7 @@ export default function(request: websocket.request, connection: websocket.connec
const gameId = q.game;
// Subscribe game stream
subscriber.subscribe(`misskey:othello-game-stream:${gameId}`);
subscriber.subscribe(`misskey:reversi-game-stream:${gameId}`);
subscriber.on('message', (_, data) => {
connection.send(data);
});
@ -62,24 +62,24 @@ export default function(request: websocket.request, connection: websocket.connec
});
async function updateSettings(settings) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (game.isStarted) return;
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
if (game.user1Id.equals(user._id) && game.user1Accepted) return;
if (game.user2Id.equals(user._id) && game.user2Accepted) return;
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: {
settings
}
});
publishOthelloGameStream(gameId, 'update-settings', settings);
publishReversiGameStream(gameId, 'update-settings', settings);
}
async function initForm(form) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (game.isStarted) return;
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
@ -90,18 +90,18 @@ export default function(request: websocket.request, connection: websocket.connec
form2: form
};
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: set
});
publishOthelloGameStream(gameId, 'init-form', {
publishReversiGameStream(gameId, 'init-form', {
userId: user._id,
form
});
}
async function updateForm(id, value) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (game.isStarted) return;
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
@ -120,11 +120,11 @@ export default function(request: websocket.request, connection: websocket.connec
form1: form
};
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: set
});
publishOthelloGameStream(gameId, 'update-form', {
publishReversiGameStream(gameId, 'update-form', {
userId: user._id,
id,
value
@ -133,40 +133,40 @@ export default function(request: websocket.request, connection: websocket.connec
async function message(message) {
message.id = Math.random();
publishOthelloGameStream(gameId, 'message', {
publishReversiGameStream(gameId, 'message', {
userId: user._id,
message
});
}
async function accept(accept: boolean) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (game.isStarted) return;
let bothAccepted = false;
if (game.user1Id.equals(user._id)) {
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: {
user1Accepted: accept
}
});
publishOthelloGameStream(gameId, 'change-accepts', {
publishReversiGameStream(gameId, 'change-accepts', {
user1: accept,
user2: game.user2Accepted
});
if (accept && game.user2Accepted) bothAccepted = true;
} else if (game.user2Id.equals(user._id)) {
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: {
user2Accepted: accept
}
});
publishOthelloGameStream(gameId, 'change-accepts', {
publishReversiGameStream(gameId, 'change-accepts', {
user1: game.user1Accepted,
user2: accept
});
@ -179,7 +179,7 @@ export default function(request: websocket.request, connection: websocket.connec
if (bothAccepted) {
// 3秒後、まだacceptされていたらゲーム開始
setTimeout(async () => {
const freshGame = await OthelloGame.findOne({ _id: gameId });
const freshGame = await ReversiGame.findOne({ _id: gameId });
if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return;
if (!freshGame.user1Accepted || !freshGame.user2Accepted) return;
@ -198,7 +198,7 @@ export default function(request: websocket.request, connection: websocket.connec
const map = freshGame.settings.map != null ? freshGame.settings.map : getRandomMap();
await OthelloGame.update({ _id: gameId }, {
await ReversiGame.update({ _id: gameId }, {
$set: {
startedAt: new Date(),
isStarted: true,
@ -208,7 +208,7 @@ export default function(request: websocket.request, connection: websocket.connec
});
//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
const o = new Othello(map, {
const o = new Reversi(map, {
isLlotheo: freshGame.settings.isLlotheo,
canPutEverywhere: freshGame.settings.canPutEverywhere,
loopedBoard: freshGame.settings.loopedBoard
@ -224,7 +224,7 @@ export default function(request: websocket.request, connection: websocket.connec
winner = null;
}
await OthelloGame.update({
await ReversiGame.update({
_id: gameId
}, {
$set: {
@ -233,27 +233,27 @@ export default function(request: websocket.request, connection: websocket.connec
}
});
publishOthelloGameStream(gameId, 'ended', {
publishReversiGameStream(gameId, 'ended', {
winnerId: winner,
game: await pack(gameId, user)
});
}
//#endregion
publishOthelloGameStream(gameId, 'started', await pack(gameId, user));
publishReversiGameStream(gameId, 'started', await pack(gameId, user));
}, 3000);
}
}
// 石を打つ
async function set(pos) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (!game.isStarted) return;
if (game.isEnded) return;
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) return;
const o = new Othello(game.settings.map, {
const o = new Reversi(game.settings.map, {
isLlotheo: game.settings.isLlotheo,
canPutEverywhere: game.settings.canPutEverywhere,
loopedBoard: game.settings.loopedBoard
@ -290,7 +290,7 @@ export default function(request: websocket.request, connection: websocket.connec
const crc32 = CRC32.str(game.logs.map(x => x.pos.toString()).join('') + pos.toString());
await OthelloGame.update({
await ReversiGame.update({
_id: gameId
}, {
$set: {
@ -303,12 +303,12 @@ export default function(request: websocket.request, connection: websocket.connec
}
});
publishOthelloGameStream(gameId, 'set', Object.assign(log, {
publishReversiGameStream(gameId, 'set', Object.assign(log, {
next: o.turn
}));
if (o.isEnded) {
publishOthelloGameStream(gameId, 'ended', {
publishReversiGameStream(gameId, 'ended', {
winnerId: winner,
game: await pack(gameId, user)
});
@ -316,7 +316,7 @@ export default function(request: websocket.request, connection: websocket.connec
}
async function check(crc32) {
const game = await OthelloGame.findOne({ _id: gameId });
const game = await ReversiGame.findOne({ _id: gameId });
if (!game.isStarted) return;

View File

@ -1,12 +1,12 @@
import * as mongo from 'mongodb';
import * as websocket from 'websocket';
import * as redis from 'redis';
import Matching, { pack } from '../../../models/othello-matching';
import Matching, { pack } from '../../../models/reversi-matching';
import publishUserStream from '../../../publishers/stream';
export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
// Subscribe othello stream
subscriber.subscribe(`misskey:othello-stream:${user._id}`);
// Subscribe reversi stream
subscriber.subscribe(`misskey:reversi-stream:${user._id}`);
subscriber.on('message', (_, data) => {
connection.send(data);
});
@ -22,7 +22,7 @@ export default function(request: websocket.request, connection: websocket.connec
childId: new mongo.ObjectID(msg.id)
});
if (matching == null) return;
publishUserStream(matching.childId, 'othello_invited', await pack(matching, matching.childId));
publishUserStream(matching.childId, 'reversi_invited', await pack(matching, matching.childId));
break;
}
});

View File

@ -10,8 +10,8 @@ import userListStream from './stream/user-list';
import driveStream from './stream/drive';
import messagingStream from './stream/messaging';
import messagingIndexStream from './stream/messaging-index';
import othelloGameStream from './stream/othello-game';
import othelloStream from './stream/othello';
import reversiGameStream from './stream/reversi-game';
import reversiStream from './stream/reversi';
import serverStatsStream from './stream/server-stats';
import notesStatsStream from './stream/notes-stats';
import requestsStream from './stream/requests';
@ -56,8 +56,8 @@ module.exports = (server: http.Server) => {
const q = request.resourceURL.query as ParsedUrlQuery;
const [user, app] = await authenticate(q.i as string);
if (request.resourceURL.pathname === '/othello-game') {
othelloGameStream(request, connection, subscriber, user);
if (request.resourceURL.pathname === '/reversi-game') {
reversiGameStream(request, connection, subscriber, user);
return;
}
@ -75,7 +75,7 @@ module.exports = (server: http.Server) => {
request.resourceURL.pathname === '/drive' ? driveStream :
request.resourceURL.pathname === '/messaging' ? messagingStream :
request.resourceURL.pathname === '/messaging-index' ? messagingIndexStream :
request.resourceURL.pathname === '/othello' ? othelloStream :
request.resourceURL.pathname === '/reversi' ? reversiStream :
null;
if (channel !== null) {