1
0
Fork 0

feat(profiles): add Call for Fire progression stats with migration

Schema collection field, generated types, and the migration must ship as one unit or the schema drifts

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Jason Fraley 2026-09-08 10:23:15 -04:00
parent 4adc0ca452
commit cce22c1fcc
5 changed files with 23807 additions and 1 deletions

View file

@ -131,6 +131,7 @@ export const Profiles: CollectionConfig = {
eodMinesweeper?: { xpEarned?: number | null };
radioTraffic?: { xpEarned?: number | null };
aimTrainer?: { xpEarned?: number | null };
callForFire?: { xpEarned?: number | null };
};
voiceover?: { xpEarned?: number | null };
};
@ -146,6 +147,7 @@ export const Profiles: CollectionConfig = {
const eodXp = progressionData?.minigames?.eodMinesweeper?.xpEarned ?? 0;
const radioTrafficXp = progressionData?.minigames?.radioTraffic?.xpEarned ?? 0;
const aimTrainerXp = progressionData?.minigames?.aimTrainer?.xpEarned ?? 0;
const callForFireXp = progressionData?.minigames?.callForFire?.xpEarned ?? 0;
const voiceoverXp = progressionData?.voiceover?.xpEarned ?? 0;
if (awardIds.length > 0) {
@ -188,6 +190,8 @@ export const Profiles: CollectionConfig = {
xpAcc += eodXp;
xpAcc += radioTrafficXp;
xpAcc += aimTrainerXp;
// Call for Fire: XP from effective artillery adjustments
xpAcc += callForFireXp;
// Voiceover submissions: XP awarded per accepted submission
xpAcc += voiceoverXp;
@ -565,6 +569,60 @@ export const Profiles: CollectionConfig = {
},
],
},
{
name: "callForFire",
label: "Call for Fire",
type: "group",
fields: [
{
name: "gamesPlayed",
type: "number",
defaultValue: 0,
},
{
name: "wins",
label: "Wins",
type: "number",
defaultValue: 0,
},
{
name: "losses",
label: "Losses",
type: "number",
defaultValue: 0,
},
{
name: "bestScore",
label: "Best Score",
type: "number",
defaultValue: 0,
},
{
name: "xpEarned",
label: "XP Earned",
type: "number",
defaultValue: 0,
},
{
name: "bestPatrolMissions",
label: "Fewest Missions on Best Patrol Support Run",
type: "number",
defaultValue: 0,
},
{
name: "bestCheckpointMissions",
label: "Fewest Missions on Best Checkpoint Defence Run",
type: "number",
defaultValue: 0,
},
{
name: "bestCompoundMissions",
label: "Fewest Missions on Best Compound Strike Run",
type: "number",
defaultValue: 0,
},
],
},
],
},
{

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,25 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_games_played" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_wins" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_losses" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_best_score" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_xp_earned" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_best_patrol_missions" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_best_checkpoint_missions" numeric DEFAULT 0;
ALTER TABLE "profiles" ADD COLUMN "progression_minigames_call_for_fire_best_compound_missions" numeric DEFAULT 0;`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_games_played";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_wins";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_losses";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_best_score";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_xp_earned";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_best_patrol_missions";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_best_checkpoint_missions";
ALTER TABLE "profiles" DROP COLUMN "progression_minigames_call_for_fire_best_compound_missions";`)
}

View file

@ -44,6 +44,7 @@ import * as migration_20260907_083010_add_voice_submission_description from './2
import * as migration_20260907_090245_add_mission_ready_reminder_fields from './20260907_090245_add_mission_ready_reminder_fields';
import * as migration_20260907_120754_add_story_beats from './20260907_120754_add_story_beats';
import * as migration_20260907_124024_convert_story_beats_body_to_lexical from './20260907_124024_convert_story_beats_body_to_lexical';
import * as migration_20260908_054314_add_call_for_fire_stats from './20260908_054314_add_call_for_fire_stats';
export const migrations = [
{
@ -274,6 +275,11 @@ export const migrations = [
{
up: migration_20260907_124024_convert_story_beats_body_to_lexical.up,
down: migration_20260907_124024_convert_story_beats_body_to_lexical.down,
name: '20260907_124024_convert_story_beats_body_to_lexical'
name: '20260907_124024_convert_story_beats_body_to_lexical',
},
{
up: migration_20260908_054314_add_call_for_fire_stats.up,
down: migration_20260908_054314_add_call_for_fire_stats.down,
name: '20260908_054314_add_call_for_fire_stats'
},
];

View file

@ -2037,6 +2037,16 @@ export interface Profile {
eliteBestAccuracy?: number | null;
xpEarned?: number | null;
};
callForFire?: {
gamesPlayed?: number | null;
wins?: number | null;
losses?: number | null;
bestScore?: number | null;
xpEarned?: number | null;
bestPatrolMissions?: number | null;
bestCheckpointMissions?: number | null;
bestCompoundMissions?: number | null;
};
};
voiceover?: {
xpEarned?: number | null;
@ -4429,6 +4439,18 @@ export interface ProfilesSelect<T extends boolean = true> {
eliteBestAccuracy?: T;
xpEarned?: T;
};
callForFire?:
| T
| {
gamesPlayed?: T;
wins?: T;
losses?: T;
bestScore?: T;
xpEarned?: T;
bestPatrolMissions?: T;
bestCheckpointMissions?: T;
bestCompoundMissions?: T;
};
};
voiceover?:
| T