wip
This commit is contained in:
parent
38e3d248fb
commit
bfb6e2f461
6 changed files with 110 additions and 22 deletions
4
locales/index.d.ts
vendored
4
locales/index.d.ts
vendored
|
@ -9803,7 +9803,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"kokushi": string;
|
"kokushi": string;
|
||||||
/**
|
/**
|
||||||
* 国士無双13面待ち
|
* 国士無双十三面待
|
||||||
*/
|
*/
|
||||||
"kokushi-13": string;
|
"kokushi-13": string;
|
||||||
/**
|
/**
|
||||||
|
@ -9811,7 +9811,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"suanko": string;
|
"suanko": string;
|
||||||
/**
|
/**
|
||||||
* 四暗刻単騎待ち
|
* 四暗刻単騎待
|
||||||
*/
|
*/
|
||||||
"suanko-tanki": string;
|
"suanko-tanki": string;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2610,9 +2610,9 @@ _mahjong:
|
||||||
"ryampeko": "ニ盃口"
|
"ryampeko": "ニ盃口"
|
||||||
"chinitsu": "清一色"
|
"chinitsu": "清一色"
|
||||||
"kokushi": "国士無双"
|
"kokushi": "国士無双"
|
||||||
"kokushi-13": "国士無双13面待ち"
|
"kokushi-13": "国士無双十三面待"
|
||||||
"suanko": "四暗刻"
|
"suanko": "四暗刻"
|
||||||
"suanko-tanki": "四暗刻単騎待ち"
|
"suanko-tanki": "四暗刻単騎待"
|
||||||
"daisangen": "大三元"
|
"daisangen": "大三元"
|
||||||
"tsuiso": "字一色"
|
"tsuiso": "字一色"
|
||||||
"shosushi": "小四喜"
|
"shosushi": "小四喜"
|
||||||
|
|
|
@ -321,11 +321,11 @@ export class MahjongService implements OnApplicationShutdown, OnModuleInit {
|
||||||
this.waitForTurn(room, res.turn, engine);
|
this.waitForTurn(room, res.turn, engine);
|
||||||
break;
|
break;
|
||||||
case 'ponned':
|
case 'ponned':
|
||||||
this.globalEventService.publishMahjongRoomStream(room.id, 'ponned', { caller: res.caller, callee: res.callee, tile: res.tile });
|
this.globalEventService.publishMahjongRoomStream(room.id, 'ponned', { caller: res.caller, callee: res.callee, tiles: res.tiles });
|
||||||
this.waitForTurn(room, res.turn, engine);
|
this.waitForTurn(room, res.turn, engine);
|
||||||
break;
|
break;
|
||||||
case 'kanned':
|
case 'kanned':
|
||||||
this.globalEventService.publishMahjongRoomStream(room.id, 'kanned', { caller: res.caller, callee: res.callee, tile: res.tile, rinsyan: res.rinsyan });
|
this.globalEventService.publishMahjongRoomStream(room.id, 'kanned', { caller: res.caller, callee: res.callee, tiles: res.tiles, rinsyan: res.rinsyan });
|
||||||
this.waitForTurn(room, res.turn, engine);
|
this.waitForTurn(room, res.turn, engine);
|
||||||
break;
|
break;
|
||||||
case 'ronned':
|
case 'ronned':
|
||||||
|
@ -501,8 +501,10 @@ export class MahjongService implements OnApplicationShutdown, OnModuleInit {
|
||||||
await this.clearTurnWaitingTimer(room.id);
|
await this.clearTurnWaitingTimer(room.id);
|
||||||
|
|
||||||
const res = engine.commit_ankan(myHouse, tile);
|
const res = engine.commit_ankan(myHouse, tile);
|
||||||
|
room.gameState = engine.state;
|
||||||
|
await this.saveRoom(room);
|
||||||
|
|
||||||
this.globalEventService.publishMahjongRoomStream(room.id, 'ankanned', { });
|
this.globalEventService.publishMahjongRoomStream(room.id, 'ankanned', { house: myHouse, tiles: res.tiles, rinsyan: res.rinsyan });
|
||||||
|
|
||||||
this.waitForTurn(room, myHouse, engine);
|
this.waitForTurn(room, myHouse, engine);
|
||||||
}
|
}
|
||||||
|
@ -519,8 +521,10 @@ export class MahjongService implements OnApplicationShutdown, OnModuleInit {
|
||||||
await this.clearTurnWaitingTimer(room.id);
|
await this.clearTurnWaitingTimer(room.id);
|
||||||
|
|
||||||
const res = engine.commit_kakan(myHouse, tile);
|
const res = engine.commit_kakan(myHouse, tile);
|
||||||
|
room.gameState = engine.state;
|
||||||
|
await this.saveRoom(room);
|
||||||
|
|
||||||
this.globalEventService.publishMahjongRoomStream(room.id, 'kakanned', { });
|
this.globalEventService.publishMahjongRoomStream(room.id, 'kakanned', { house: myHouse, tiles: res.tiles, rinsyan: res.rinsyan, from: res.from });
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -535,6 +539,8 @@ export class MahjongService implements OnApplicationShutdown, OnModuleInit {
|
||||||
await this.clearTurnWaitingTimer(room.id);
|
await this.clearTurnWaitingTimer(room.id);
|
||||||
|
|
||||||
const res = engine.commit_tsumoHora(myHouse);
|
const res = engine.commit_tsumoHora(myHouse);
|
||||||
|
room.gameState = engine.state;
|
||||||
|
await this.saveRoom(room);
|
||||||
|
|
||||||
this.globalEventService.publishMahjongRoomStream(room.id, 'tsumoHora', { house: myHouse, handTiles: res.handTiles, tsumoTile: res.tsumoTile });
|
this.globalEventService.publishMahjongRoomStream(room.id, 'tsumoHora', { house: myHouse, handTiles: res.handTiles, tsumoTile: res.tsumoTile });
|
||||||
}
|
}
|
||||||
|
|
|
@ -520,7 +520,7 @@ function onStreamPonned(log) {
|
||||||
// return;
|
// return;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
engine.value.commit_pon(log.caller, log.callee);
|
engine.value.commit_pon(log.caller, log.callee, log.tiles);
|
||||||
triggerRef(engine);
|
triggerRef(engine);
|
||||||
|
|
||||||
ponSerifHouses[log.caller] = true;
|
ponSerifHouses[log.caller] = true;
|
||||||
|
@ -531,6 +531,42 @@ function onStreamPonned(log) {
|
||||||
myTurnTimerRmain.value = room.value.timeLimitForEachTurn;
|
myTurnTimerRmain.value = room.value.timeLimitForEachTurn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onStreamKanned(log) {
|
||||||
|
console.log('onStreamKanned', log);
|
||||||
|
|
||||||
|
engine.value.commit_kan(log.caller, log.callee, log.tiles, log.rinsyan);
|
||||||
|
triggerRef(engine);
|
||||||
|
|
||||||
|
kanSerifHouses[log.caller] = true;
|
||||||
|
window.setTimeout(() => {
|
||||||
|
kanSerifHouses[log.caller] = false;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onStreamKakanned(log) {
|
||||||
|
console.log('onStreamKakanned', log);
|
||||||
|
|
||||||
|
engine.value.commit_kakan(log.house, log.tiles, log.rinsyan);
|
||||||
|
triggerRef(engine);
|
||||||
|
|
||||||
|
kanSerifHouses[log.caller] = true;
|
||||||
|
window.setTimeout(() => {
|
||||||
|
kanSerifHouses[log.caller] = false;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onStreamAnkanned(log) {
|
||||||
|
console.log('onStreamAnkanned', log);
|
||||||
|
|
||||||
|
engine.value.commit_ankan(log.house, log.tiles, log.rinsyan);
|
||||||
|
triggerRef(engine);
|
||||||
|
|
||||||
|
kanSerifHouses[log.caller] = true;
|
||||||
|
window.setTimeout(() => {
|
||||||
|
kanSerifHouses[log.caller] = false;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
function onStreamRonned(log) {
|
function onStreamRonned(log) {
|
||||||
console.log('onStreamRonned', log);
|
console.log('onStreamRonned', log);
|
||||||
|
|
||||||
|
@ -579,6 +615,9 @@ onMounted(() => {
|
||||||
props.connection.on('tsumo', onStreamTsumo);
|
props.connection.on('tsumo', onStreamTsumo);
|
||||||
props.connection.on('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
props.connection.on('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
||||||
props.connection.on('ponned', onStreamPonned);
|
props.connection.on('ponned', onStreamPonned);
|
||||||
|
props.connection.on('kanned', onStreamKanned);
|
||||||
|
props.connection.on('kakanned', onStreamKakanned);
|
||||||
|
props.connection.on('ankanned', onStreamAnkanned);
|
||||||
props.connection.on('ronned', onStreamRonned);
|
props.connection.on('ronned', onStreamRonned);
|
||||||
props.connection.on('tsumoHora', onStreamTsumoHora);
|
props.connection.on('tsumoHora', onStreamTsumoHora);
|
||||||
}
|
}
|
||||||
|
@ -590,6 +629,9 @@ onActivated(() => {
|
||||||
props.connection.on('tsumo', onStreamTsumo);
|
props.connection.on('tsumo', onStreamTsumo);
|
||||||
props.connection.on('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
props.connection.on('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
||||||
props.connection.on('ponned', onStreamPonned);
|
props.connection.on('ponned', onStreamPonned);
|
||||||
|
props.connection.on('kanned', onStreamKanned);
|
||||||
|
props.connection.on('kakanned', onStreamKakanned);
|
||||||
|
props.connection.on('ankanned', onStreamAnkanned);
|
||||||
props.connection.on('ronned', onStreamRonned);
|
props.connection.on('ronned', onStreamRonned);
|
||||||
props.connection.on('tsumoHora', onStreamTsumoHora);
|
props.connection.on('tsumoHora', onStreamTsumoHora);
|
||||||
}
|
}
|
||||||
|
@ -601,6 +643,9 @@ onDeactivated(() => {
|
||||||
props.connection.off('tsumo', onStreamTsumo);
|
props.connection.off('tsumo', onStreamTsumo);
|
||||||
props.connection.off('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
props.connection.off('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
||||||
props.connection.off('ponned', onStreamPonned);
|
props.connection.off('ponned', onStreamPonned);
|
||||||
|
props.connection.off('kanned', onStreamKanned);
|
||||||
|
props.connection.off('kakanned', onStreamKakanned);
|
||||||
|
props.connection.off('ankanned', onStreamAnkanned);
|
||||||
props.connection.off('ronned', onStreamRonned);
|
props.connection.off('ronned', onStreamRonned);
|
||||||
props.connection.off('tsumoHora', onStreamTsumoHora);
|
props.connection.off('tsumoHora', onStreamTsumoHora);
|
||||||
}
|
}
|
||||||
|
@ -612,6 +657,9 @@ onUnmounted(() => {
|
||||||
props.connection.off('tsumo', onStreamTsumo);
|
props.connection.off('tsumo', onStreamTsumo);
|
||||||
props.connection.off('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
props.connection.off('dahaiAndTsumo', onStreamDahaiAndTsumo);
|
||||||
props.connection.off('ponned', onStreamPonned);
|
props.connection.off('ponned', onStreamPonned);
|
||||||
|
props.connection.off('kanned', onStreamKanned);
|
||||||
|
props.connection.off('kakanned', onStreamKakanned);
|
||||||
|
props.connection.off('ankanned', onStreamAnkanned);
|
||||||
props.connection.off('ronned', onStreamRonned);
|
props.connection.off('ronned', onStreamRonned);
|
||||||
props.connection.off('tsumoHora', onStreamTsumoHora);
|
props.connection.off('tsumoHora', onStreamTsumoHora);
|
||||||
}
|
}
|
||||||
|
|
|
@ -405,7 +405,8 @@ export class MasterGameEngine {
|
||||||
const pon = this.state.huros[house].find(h => h.type === 'pon' && $type(h.tiles[0]) === $type(tile));
|
const pon = this.state.huros[house].find(h => h.type === 'pon' && $type(h.tiles[0]) === $type(tile));
|
||||||
if (pon == null) throw new Error('No such pon');
|
if (pon == null) throw new Error('No such pon');
|
||||||
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(tile), 1);
|
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(tile), 1);
|
||||||
this.state.huros[house].push({ type: 'minkan', tiles: [...pon.tiles, tile], from: pon.from });
|
const tiles = [tile, ...pon.tiles];
|
||||||
|
this.state.huros[house].push({ type: 'minkan', tiles: tiles, from: pon.from });
|
||||||
|
|
||||||
this.state.activatedDorasCount++;
|
this.state.activatedDorasCount++;
|
||||||
|
|
||||||
|
@ -413,6 +414,8 @@ export class MasterGameEngine {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
rinsyan,
|
rinsyan,
|
||||||
|
tiles,
|
||||||
|
from: pon.from,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,7 +432,8 @@ export class MasterGameEngine {
|
||||||
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t2), 1);
|
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t2), 1);
|
||||||
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t3), 1);
|
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t3), 1);
|
||||||
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t4), 1);
|
this.state.handTiles[house].splice(this.state.handTiles[house].indexOf(t4), 1);
|
||||||
this.state.huros[house].push({ type: 'ankan', tiles: [t1, t2, t3, t4] });
|
const tiles = [t1, t2, t3, t4];
|
||||||
|
this.state.huros[house].push({ type: 'ankan', tiles: tiles });
|
||||||
|
|
||||||
this.state.activatedDorasCount++;
|
this.state.activatedDorasCount++;
|
||||||
|
|
||||||
|
@ -437,6 +441,7 @@ export class MasterGameEngine {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
rinsyan,
|
rinsyan,
|
||||||
|
tiles,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -502,19 +507,20 @@ export class MasterGameEngine {
|
||||||
} else if (kan != null && answers.kan) {
|
} else if (kan != null && answers.kan) {
|
||||||
// 大明槓
|
// 大明槓
|
||||||
|
|
||||||
|
const tile = this.state.hoTiles[kan.callee].pop()!;
|
||||||
const t1 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(0);
|
const t1 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(0);
|
||||||
if (t1 == null) throw new Error('No such tile');
|
if (t1 == null) throw new Error('No such tile');
|
||||||
const t2 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(1);
|
const t2 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(1);
|
||||||
if (t2 == null) throw new Error('No such tile');
|
if (t2 == null) throw new Error('No such tile');
|
||||||
const t3 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(2);
|
const t3 = this.state.handTiles[kan.caller].filter(t => $type(t) === $type(tile)).at(2);
|
||||||
if (t3 == null) throw new Error('No such tile');
|
if (t3 == null) throw new Error('No such tile');
|
||||||
const tile = this.state.hoTiles[kan.callee].pop()!;
|
|
||||||
|
|
||||||
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t1), 1);
|
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t1), 1);
|
||||||
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t2), 1);
|
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t2), 1);
|
||||||
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t3), 1);
|
this.state.handTiles[kan.caller].splice(this.state.handTiles[kan.caller].indexOf(t3), 1);
|
||||||
|
|
||||||
this.state.huros[kan.caller].push({ type: 'minkan', tiles: [tile, t1, t2, t3], from: kan.callee });
|
const tiles = [tile, t1, t2, t3];
|
||||||
|
this.state.huros[kan.caller].push({ type: 'minkan', tiles: tiles, from: kan.callee });
|
||||||
|
|
||||||
this.state.activatedDorasCount++;
|
this.state.activatedDorasCount++;
|
||||||
|
|
||||||
|
@ -526,21 +532,22 @@ export class MasterGameEngine {
|
||||||
type: 'kanned' as const,
|
type: 'kanned' as const,
|
||||||
caller: kan.caller,
|
caller: kan.caller,
|
||||||
callee: kan.callee,
|
callee: kan.callee,
|
||||||
tile,
|
tiles: tiles,
|
||||||
rinsyan,
|
rinsyan,
|
||||||
turn: this.state.turn,
|
turn: this.state.turn,
|
||||||
};
|
};
|
||||||
} else if (pon != null && answers.pon) {
|
} else if (pon != null && answers.pon) {
|
||||||
|
const tile = this.state.hoTiles[pon.callee].pop()!;
|
||||||
const t1 = this.state.handTiles[pon.caller].filter(t => $type(t) === $type(tile)).at(0);
|
const t1 = this.state.handTiles[pon.caller].filter(t => $type(t) === $type(tile)).at(0);
|
||||||
if (t1 == null) throw new Error('No such tile');
|
if (t1 == null) throw new Error('No such tile');
|
||||||
const t2 = this.state.handTiles[pon.caller].filter(t => $type(t) === $type(tile)).at(1);
|
const t2 = this.state.handTiles[pon.caller].filter(t => $type(t) === $type(tile)).at(1);
|
||||||
if (t2 == null) throw new Error('No such tile');
|
if (t2 == null) throw new Error('No such tile');
|
||||||
const tile = this.state.hoTiles[pon.callee].pop()!;
|
|
||||||
|
|
||||||
this.state.handTiles[pon.caller].splice(this.state.handTiles[pon.caller].indexOf(t1), 1);
|
this.state.handTiles[pon.caller].splice(this.state.handTiles[pon.caller].indexOf(t1), 1);
|
||||||
this.state.handTiles[pon.caller].splice(this.state.handTiles[pon.caller].indexOf(t2), 1);
|
this.state.handTiles[pon.caller].splice(this.state.handTiles[pon.caller].indexOf(t2), 1);
|
||||||
|
|
||||||
this.state.huros[pon.caller].push({ type: 'pon', tiles: [tile, t1, t2], from: pon.callee });
|
const tiles = [tile, t1, t2];
|
||||||
|
this.state.huros[pon.caller].push({ type: 'pon', tiles: tiles, from: pon.callee });
|
||||||
|
|
||||||
this.state.turn = pon.caller;
|
this.state.turn = pon.caller;
|
||||||
|
|
||||||
|
@ -548,7 +555,7 @@ export class MasterGameEngine {
|
||||||
type: 'ponned' as const,
|
type: 'ponned' as const,
|
||||||
caller: pon.caller,
|
caller: pon.caller,
|
||||||
callee: pon.callee,
|
callee: pon.callee,
|
||||||
tile,
|
tiles: tiles,
|
||||||
turn: this.state.turn,
|
turn: this.state.turn,
|
||||||
};
|
};
|
||||||
} else if (cii != null && answers.cii) {
|
} else if (cii != null && answers.cii) {
|
||||||
|
|
|
@ -162,11 +162,6 @@ export class PlayerGameEngine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public commit_kakan(house: House, tile: TileId) {
|
|
||||||
console.log('commit_kakan', this.state.turn, house, tile);
|
|
||||||
if (this.state.turn !== house) throw new PlayerGameEngine.InvalidOperationError();
|
|
||||||
}
|
|
||||||
|
|
||||||
public commit_tsumoHora(house: House, handTiles: TileId[], tsumoTile: TileId): KyokuResult {
|
public commit_tsumoHora(house: House, handTiles: TileId[], tsumoTile: TileId): KyokuResult {
|
||||||
console.log('commit_tsumoHora', this.state.turn, house);
|
console.log('commit_tsumoHora', this.state.turn, house);
|
||||||
|
|
||||||
|
@ -270,6 +265,38 @@ export class PlayerGameEngine {
|
||||||
this.state.turn = caller;
|
this.state.turn = caller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 大明槓します
|
||||||
|
* @param caller 大明槓した人
|
||||||
|
* @param callee 牌を捨てた人
|
||||||
|
*/
|
||||||
|
public commit_kan(caller: House, callee: House, tiles: TileId[], rinsyan: TileId) {
|
||||||
|
this.state.canKan = null;
|
||||||
|
|
||||||
|
this.state.hoTiles[callee].pop();
|
||||||
|
if (caller === this.myHouse) {
|
||||||
|
if (this.myHandTiles.includes(tiles[0])) this.myHandTiles.splice(this.myHandTiles.indexOf(tiles[0]), 1);
|
||||||
|
if (this.myHandTiles.includes(tiles[1])) this.myHandTiles.splice(this.myHandTiles.indexOf(tiles[1]), 1);
|
||||||
|
if (this.myHandTiles.includes(tiles[2])) this.myHandTiles.splice(this.myHandTiles.indexOf(tiles[2]), 1);
|
||||||
|
if (this.myHandTiles.includes(tiles[3])) this.myHandTiles.splice(this.myHandTiles.indexOf(tiles[3]), 1);
|
||||||
|
} else {
|
||||||
|
this.state.handTiles[caller].unshift();
|
||||||
|
this.state.handTiles[caller].unshift();
|
||||||
|
this.state.handTiles[caller].unshift();
|
||||||
|
}
|
||||||
|
this.state.huros[caller].push({ type: 'minkan', tiles: tiles, from: callee });
|
||||||
|
|
||||||
|
this.state.turn = caller;
|
||||||
|
}
|
||||||
|
|
||||||
|
public commit_kakan(house: House, tiles: TileId[], rinsyan: TileId) {
|
||||||
|
console.log('commit_kakan', this.state.turn, house, tiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
public commit_ankan(house: House, tiles: TileId[], rinsyan: TileId) {
|
||||||
|
console.log('commit_kakan', this.state.turn, house, tiles);
|
||||||
|
}
|
||||||
|
|
||||||
public commit_nop() {
|
public commit_nop() {
|
||||||
this.state.canRon = null;
|
this.state.canRon = null;
|
||||||
this.state.canPon = null;
|
this.state.canPon = null;
|
||||||
|
|
Loading…
Reference in a new issue