package com.xuezhanmaster.game.service; import com.xuezhanmaster.game.domain.ActionType; import com.xuezhanmaster.game.domain.GameSeat; import com.xuezhanmaster.game.domain.GameTable; import com.xuezhanmaster.game.domain.ScoreChange; import com.xuezhanmaster.game.domain.SettlementResult; import com.xuezhanmaster.game.domain.SettlementType; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Service public class SettlementService { private static final int DIAN_PAO_HU_SCORE = 1; private static final int ZI_MO_HU_SCORE = 1; private static final int MING_GANG_SCORE = 1; public SettlementResult settleDiscardHu( GameTable table, int winnerSeatNo, int sourceSeatNo, String triggerTile ) { return applySettlement( table, SettlementType.DIAN_PAO_HU, ActionType.HU, winnerSeatNo, sourceSeatNo, triggerTile, orderedDeltas(winnerSeatNo, DIAN_PAO_HU_SCORE, sourceSeatNo, -DIAN_PAO_HU_SCORE) ); } public SettlementResult settleExposedGang( GameTable table, int winnerSeatNo, int sourceSeatNo, String triggerTile ) { return applySettlement( table, SettlementType.MING_GANG, ActionType.GANG, winnerSeatNo, sourceSeatNo, triggerTile, orderedDeltas(winnerSeatNo, MING_GANG_SCORE, sourceSeatNo, -MING_GANG_SCORE) ); } public SettlementResult settleSelfDrawHu( GameTable table, int winnerSeatNo, String triggerTile ) { Map scoreDeltas = new LinkedHashMap<>(); int totalWinScore = 0; for (GameSeat seat : table.getSeats()) { if (seat.getSeatNo() == winnerSeatNo || seat.isWon()) { continue; } scoreDeltas.put(seat.getSeatNo(), -ZI_MO_HU_SCORE); totalWinScore += ZI_MO_HU_SCORE; } scoreDeltas.put(winnerSeatNo, totalWinScore); return applySettlement( table, SettlementType.ZI_MO_HU, ActionType.HU, winnerSeatNo, winnerSeatNo, triggerTile, scoreDeltas ); } private SettlementResult applySettlement( GameTable table, SettlementType settlementType, ActionType actionType, int actorSeatNo, int sourceSeatNo, String triggerTile, Map scoreDeltas ) { List scoreChanges = new ArrayList<>(); for (Map.Entry entry : scoreDeltas.entrySet()) { GameSeat seat = table.getSeats().get(entry.getKey()); seat.addScore(entry.getValue()); scoreChanges.add(new ScoreChange( seat.getSeatNo(), entry.getValue(), seat.getScore() )); } return new SettlementResult( settlementType, actionType, actorSeatNo, sourceSeatNo, triggerTile, List.copyOf(scoreChanges) ); } private Map orderedDeltas(int winnerSeatNo, int winnerDelta, int sourceSeatNo, int sourceDelta) { Map deltas = new LinkedHashMap<>(); deltas.put(winnerSeatNo, winnerDelta); deltas.put(sourceSeatNo, sourceDelta); return deltas; } }