Skip to content

Commit

Permalink
refactor(webapp): apply rule state in settle stage moves
Browse files Browse the repository at this point in the history
  • Loading branch information
ben196888 committed Jul 12, 2024
1 parent 495ddf8 commit c9a17ad
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
23 changes: 10 additions & 13 deletions packages/webapp/src/game/core/stage/settle/move/settleProjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ import { DeckMutator } from "@/game/store/slice/deck";
import { PlayersMutator } from "@/game/store/slice/players";
import { ProjectBoardMutator, ProjectBoardSelector } from "@/game/store/slice/projectBoard";
import { ProjectSlotMutator, ProjectSlotSelector } from "@/game/store/slice/projectSlot/projectSlot";
import { RuleSelector } from "@/game/store/slice/rule";
import { ScoreBoardMutator } from "@/game/store/slice/scoreBoard";

export type SettleProjects = () => void;
export const settleProjects: GameMove<SettleProjects> = (({ G, events }) => {
console.log('settle projects')

const activeProjects = G.table.projectBoard;
const fulfilledProjects = ProjectBoardSelector.filterFulfilled(activeProjects);
const fulfilledProjects = ProjectBoardSelector.filterFulfilled(G.table.projectBoard);

if (fulfilledProjects.length === 0) {
console.log('no fulfilled projects, end stage early')
Expand All @@ -33,29 +32,27 @@ export const settleProjects: GameMove<SettleProjects> = (({ G, events }) => {

// score bonus points
// last contributor bonus
const lastContributorBonusPoints = 2;
const lastContributor = project.lastContributor;
ScoreBoardMutator.add(G.table.scoreBoard, lastContributor!, lastContributorBonusPoints);
const lastContributorBonusPoints = RuleSelector.getSettlementLastContributorVictoryPoints(G.rules);
ScoreBoardMutator.add(G.table.scoreBoard, project.lastContributor!, lastContributorBonusPoints);

// owner bonus
const ownerBonusPoints = 2;
const ownerBonusPoints = RuleSelector.getSettlementProjectOwnerVictoryPoints(G.rules);
const { owner, numWorkerToken } = ProjectSlotSelector.getOwner(project);
ScoreBoardMutator.add(G.table.scoreBoard, owner, ownerBonusPoints);
// return owner token
PlayersMutator.addWorkerTokens(G.players, owner, numWorkerToken);
ProjectSlotMutator.unassignOwner(project);
});
// Remove from table
ProjectBoardMutator.remove(activeProjects, fulfilledProjects);
ProjectBoardMutator.remove(G.table.projectBoard, fulfilledProjects);

const version: 'simple' | 'full' = 'simple';
if (version === 'simple') {
if (RuleSelector.isStandardRule(G.rules)) {
// Update OpenSourceTree in standard version
// TODO: implement OpenSourceTree
} else {
// Discard Project Card in simple version
const projectCards = fulfilledProjects.map(project => project.card);
DeckMutator.discard(G.decks.projects, projectCards);
} else if (version === 'full') {
// Update OpenSourceTree in full version
// TODO: implement OpenSourceTree
}

console.log('end settle projects')
Expand Down
29 changes: 27 additions & 2 deletions packages/webapp/src/game/store/slice/rule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,22 @@ interface ActionRules {
}

export interface Rule {
action: ActionRules,
type: 'simple' | 'standard';
action: ActionRules;
table: {
maxJobSlots: number;
maxProjectSlots: number;
actionSlots: Record<ActionMoveName, ActionSlotRule>,
actionSlots: Record<ActionMoveName, ActionSlotRule>;
},
player: {
maxActionTokens: number;
maxWorkerTokens: number;
maxProjectCards: number;
},
settlement: {
projectOwnerVictoryPoints: number;
lastContributorVictoryPoints: number;
},
}

const initialState = (): Rule => {
Expand Down Expand Up @@ -89,6 +94,7 @@ const initialState = (): Rule => {
};

return {
type: 'simple',
action: actionRules,
table: {
maxJobSlots: 8,
Expand All @@ -100,9 +106,17 @@ const initialState = (): Rule => {
maxWorkerTokens: 12,
maxProjectCards: 2,
},
settlement: {
projectOwnerVictoryPoints: 2,
lastContributorVictoryPoints: 2,
},
};
}

const isStandardRule = (rule: Rule): boolean => {
return rule.type === 'standard';
}

const isActionSlotAvailable = (rule: Rule, actionName: ActionMoveName): boolean => {
return rule.table.actionSlots[actionName].available;
}
Expand Down Expand Up @@ -182,9 +196,18 @@ const getPlayerMaxProjectCards = (rule: Rule): number => {
return rule.player.maxProjectCards;
}

const getSettlementProjectOwnerVictoryPoints = (rule: Rule): number => {
return rule.settlement.projectOwnerVictoryPoints;
};

const getSettlementLastContributorVictoryPoints = (rule: Rule): number => {
return rule.settlement.lastContributorVictoryPoints;
};

const RuleSlice = {
initialState,
selectors: {
isStandardRule,
isActionSlotAvailable,
getActionTokenCost,
getActionVictoryPoints,
Expand All @@ -197,6 +220,8 @@ const RuleSlice = {
getPlayerMaxActionTokens,
getPlayerMaxWorkerTokens,
getPlayerMaxProjectCards,
getSettlementProjectOwnerVictoryPoints,
getSettlementLastContributorVictoryPoints,
},
};

Expand Down

0 comments on commit c9a17ad

Please sign in to comment.