Skip to content

Commit

Permalink
feat: add solo game persistence, db interaction
Browse files Browse the repository at this point in the history
- add fixtures for game treatments and event cards
- add service methods for persisting game data and drawing cards/picking
  treatments
- reworked solo game entities
- (re-)add migration for solo game data model

ref virtualcommons#856
  • Loading branch information
sgfost committed Sep 12, 2023
1 parent 3631aad commit 422c8f5
Show file tree
Hide file tree
Showing 19 changed files with 551 additions and 156 deletions.
74 changes: 74 additions & 0 deletions server/fixtures/sologame/SoloGameTreatment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
entity: SoloGameTreatment
items:
treatment1:
id: 1
name: treatment1
isKnownNumberOfRounds: false
isEventDeckKnown: false
thresholdInformation: unknown
treatment2:
id: 2
name: treatment2
isKnownNumberOfRounds: false
isEventDeckKnown: false
thresholdInformation: range
treatment3:
id: 3
name: treatment3
isKnownNumberOfRounds: false
isEventDeckKnown: false
thresholdInformation: known
treatment4:
id: 4
name: treatment4
isKnownNumberOfRounds: false
isEventDeckKnown: true
thresholdInformation: unknown
treatment5:
id: 5
name: treatment5
isKnownNumberOfRounds: false
isEventDeckKnown: true
thresholdInformation: range
treatment6:
id: 6
name: treatment6
isKnownNumberOfRounds: false
isEventDeckKnown: true
thresholdInformation: known
treatment7:
id: 7
name: treatment7
isKnownNumberOfRounds: true
isEventDeckKnown: false
thresholdInformation: unknown
treatment8:
id: 8
name: treatment8
isKnownNumberOfRounds: true
isEventDeckKnown: false
thresholdInformation: range
treatment9:
id: 9
name: treatment9
isKnownNumberOfRounds: true
isEventDeckKnown: false
thresholdInformation: known
treatment10:
id: 10
name: treatment10
isKnownNumberOfRounds: true
isEventDeckKnown: true
thresholdInformation: unknown
treatment11:
id: 11
name: treatment11
isKnownNumberOfRounds: true
isEventDeckKnown: true
thresholdInformation: range
treatment12:
id: 12
name: treatment12
isKnownNumberOfRounds: true
isEventDeckKnown: true
thresholdInformation: known
119 changes: 119 additions & 0 deletions server/fixtures/sologame/SoloMarsEventCard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
entity: SoloMarsEventCard
items:
event1:
id: 1
codeName: "lifeAsUsual"
displayName: "Life As Usual"
flavorText: "As the first human outpost on Mars, having a \"usual\" day is pretty unusual."
effect: "No special effect."
drawMin: 10
drawMax: 20
rollMin: 0
rollMax: 0
systemHealthMultiplier: 0
pointsMultiplier: 0
resourcesMultiplier: 0
event2: # needs special casing (draw 2 more cards)
id: 2
codeName: "murphysLaw"
displayName: "Murphy's Law"
flavorText: "Residents at Port of Mars know better than to ask, \"what ELSE could go wrong?\""
effect: "Reveal 2 more events for this round."
drawMin: 1
drawMax: 1
rollMin: 0
rollMax: 0
systemHealthMultiplier: 0
pointsMultiplier: 0
resourcesMultiplier: 0
event3:
id: 3
codeName: "lostTime"
displayName: "Lost Time"
flavorText: "Time flies when you're trying to stay alive."
effect: "Lose {roll} resource{s} for this round."
drawMin: 1
drawMax: 1
rollMin: 1
rollMax: 8
systemHealthMultiplier: 0
pointsMultiplier: 0
resourcesMultiplier: -1
event4:
id: 4
codeName: "richDeposit"
displayName: "Rich Deposit"
flavorText: "A stroke of luck in an otherwise unlucky day."
effect: "Gain {roll} resource{s} for this round."
drawMin: 1
drawMax: 1
rollMin: 1
rollMax: 8
systemHealthMultiplier: 0
pointsMultiplier: 0
resourcesMultiplier: 1
event5:
id: 5
codeName: "urgentRepairs"
displayName: "Urgent Repairs"
flavorText: "No pneumatic tires on mars, but there are always holes to patch."
effect: "{roll} resource{s} are immediately diverted to system health."
drawMin: 1
drawMax: 1
rollMin: 2
rollMax: 7
systemHealthMultiplier: 1
pointsMultiplier: 0
resourcesMultiplier: -1
event6:
id: 6
codeName: "hullBreach"
displayName: "hullBreach"
flavorText: "Accidents happen. It's unavoidable. Our job is to do our best to avoid them all the same."
effect: "Lose {roll} system health."
drawMin: 4
drawMax: 4
rollMin: 1
rollMax: 10
systemHealthMultiplier: -1
pointsMultiplier: 0
resourcesMultiplier: 0
event7:
id: 7
codeName: "softwareUpgrade"
displayName: "Software Upgrade"
flavorText: "A much needed patch to the system comes online."
effect: "Gain {roll} system health."
drawMin: 4
drawMax: 4
rollMin: 1
rollMax: 10
systemHealthMultiplier: 1
pointsMultiplier: 0
resourcesMultiplier: 0
event8:
id: 8
codeName: "lostCargo"
displayName: "Lost Cargo"
flavorText: "Precious cargo, now forever Martian property."
effect: "Lose {roll} point{s}."
drawMin: 4
drawMax: 4
rollMin: 1
rollMax: 10
systemHealthMultiplier: 0
pointsMultiplier: -1
resourcesMultiplier: 0
event9:
id: 9
codeName: "hitTheMotherload"
displayName: "Hit the Motherload"
flavorText: "A valuable find. Fortunately for us, not that useful for repairs."
effect: "Gain {roll} point{s}."
drawMin: 4
drawMax: 4
rollMin: 1
rollMax: 10
systemHealthMultiplier: 0
pointsMultiplier: 1
resourcesMultiplier: 0
4 changes: 2 additions & 2 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"start": "ts-node-dev -r tsconfig-paths/register src/index.ts | tee -a /var/log/port-of-mars/index.log",
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
"dangerously-dropdb": "dropdb -U marsmadness -h db port_of_mars",
"initdb": "createdb -U marsmadness -h db port_of_mars ; yarn typeorm migration:run && /scripts/openbeta/setup.sh",
"initdb": "createdb -U marsmadness -h db port_of_mars ; yarn typeorm migration:run && /scripts/openbeta/setup.sh ; yarn load-fixtures ./fixtures/sologame",
"dangerously-loaddb": "psql -h db -U marsmadness port_of_mars < pom-db.sql",
"dangerously-resetdb": "dropdb -U marsmadness -h db port_of_mars && createdb -U marsmadness -h db port_of_mars",
"migrate": "yarn typeorm migration:run",
Expand All @@ -25,7 +25,7 @@
"lint:fix": "eslint --fix -c .eslintrc.js ./ ../shared --ext .ts",
"style": "prettier --config ../.prettierrc --check './**/*.ts' '../shared/**/*.ts'",
"style:fix": "prettier --config ../.prettierrc --write './**/*.ts' '../shared/**/*.ts'",
"load-fixtures": "fixtures ./fixtures --config ormconfig.json --require ts-node/register --require tsconfig-paths/register"
"load-fixtures": "fixtures --config ormconfig.json --require ts-node/register --require tsconfig-paths/register"
},
"author": "Center for Behavior, Institutions, and the Environment (https://cbie.asu.edu)",
"license": "MIT",
Expand Down
21 changes: 18 additions & 3 deletions server/src/entity/SoloGame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,41 @@ import {
} from "typeorm";
import { SoloGameTreatment } from "@port-of-mars/server/entity/SoloGameTreatment";
import { SoloMarsEventDeck } from "./SoloMarsEventDeck";
import { SoloPlayer } from "./SoloPlayer";
import { SoloGameStatus } from "@port-of-mars/shared/sologame";

@Entity()
export class SoloGame {
@PrimaryGeneratedColumn()
id!: number;

@CreateDateColumn()
dateCreated!: Date;

@OneToOne(type => SoloPlayer, player => player.game)
@JoinColumn()
player!: SoloPlayer;

@Column()
playerId!: number;

@ManyToOne(type => SoloGameTreatment, { nullable: false })
@JoinColumn()
treatment!: SoloGameTreatment;

@Column()
treatmentId!: number;

@CreateDateColumn()
dateCreated!: Date;

@OneToOne(type => SoloMarsEventDeck, { nullable: false })
@JoinColumn()
deck!: SoloMarsEventDeck;

@Column()
deckId!: number;

@Column({
type: "enum",
enum: ["incomplete", "victory", "defeat"],
})
status!: SoloGameStatus;
}
12 changes: 10 additions & 2 deletions server/src/entity/SoloGameRound.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,27 @@ import {
PrimaryGeneratedColumn,
CreateDateColumn,
JoinColumn,
OneToMany,
} from "typeorm";
import { SoloPlayerDecision } from "@port-of-mars/server/entity/SoloPlayerDecision";
import { SoloMarsEventDeckCard } from "./SoloMarsEventDeckCard";

@Entity()
export class SoloGameRound {
@PrimaryGeneratedColumn()
id!: number;

@CreateDateColumn()
dateCreated!: Date;

@Column()
gameId!: number;

@CreateDateColumn()
dateCreated!: Date;
@Column()
roundNumber!: number;

@OneToMany(type => SoloMarsEventDeckCard, card => card.round)
cards!: SoloMarsEventDeckCard[];

@OneToOne(type => SoloPlayerDecision, { nullable: false })
@JoinColumn()
Expand Down
10 changes: 2 additions & 8 deletions server/src/entity/SoloGameTreatment.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
import { ThresholdInformation } from "@port-of-mars/shared/sologame/types";

export type ThresholdInformation = "unknown" | "range" | "known";
@Entity()
export class SoloGameTreatment {
@PrimaryGeneratedColumn()
id!: number;

@Column()
name!: string;

@Column()
order!: number;

@Column()
isKnownNumberofRounds!: boolean;
isKnownNumberOfRounds!: boolean;

@Column()
isEventDeckKnown!: boolean;
Expand Down
21 changes: 12 additions & 9 deletions server/src/entity/SoloMarsEventCard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,35 @@ export class SoloMarsEventCard {
id!: number;

@Column()
description!: string;
codeName!: string;

@Column()
displayName!: string;

@Column()
codeName!: string;
flavorText!: string;

@Column()
effect!: string;

@Column()
minHealth!: number;
drawMin!: number;

@Column()
maxHealth!: number;
drawMax!: number;

@Column()
minPoints!: number;
rollMin!: number;

@Column()
maxPoints!: number;
rollMax!: number;

@Column()
minBlocks!: number;
systemHealthMultiplier!: number;

@Column()
maxBlocks!: number;
pointsMultiplier!: number;

@Column()
draw2!: string;
resourcesMultiplier!: number;
}
5 changes: 1 addition & 4 deletions server/src/entity/SoloMarsEventDeck.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import { Column, Entity, PrimaryGeneratedColumn, OneToMany, JoinColumn } from "typeorm";
import { Entity, PrimaryGeneratedColumn, OneToMany, JoinColumn } from "typeorm";
import { SoloMarsEventDeckCard } from "@port-of-mars/server/entity/SoloMarsEventDeckCard";

@Entity()
export class SoloMarsEventDeck {
@PrimaryGeneratedColumn()
id!: number;

@Column()
codeName!: string;

@OneToMany(type => SoloMarsEventDeckCard, card => card.deck, { nullable: true })
@JoinColumn()
cards!: SoloMarsEventDeckCard[];
Expand Down
16 changes: 14 additions & 2 deletions server/src/entity/SoloMarsEventDeckCard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,21 @@ export class SoloMarsEventDeckCard {
@Column()
cardId!: number;

@ManyToOne(type => SoloGameRound)
round!: SoloGameRound;
@Column()
effectText!: string;

@Column()
systemHealthEffect!: number;

@Column()
resourcesEffect!: number;

@Column()
pointsEffect!: number;

@ManyToOne(type => SoloGameRound, round => round.cards, { nullable: true })
round!: SoloGameRound;

@Column({ nullable: true })
roundId!: number;
}
Loading

0 comments on commit 422c8f5

Please sign in to comment.