import assert from 'node:assert/strict'; import test from 'node:test'; import { applyAction, createGame, joinGame, newPlayer, viewGame } from '../game/engine'; import { kullDefaultProfile, type KullDefaultProfile } from '../game/kull-default-profile'; const lobby: KullDefaultProfile = { status: 'lobby', advanced: false, expansions: ['choam', 'ix', 'ecaz'], players: [{faction:'choam'}, {faction:'ecaz'}, {faction:'richese'}], }; void test('independent Ecaz cards do not disable the Basic native Kull lobby profile', () => { for (const selection of [ {}, {lobbyOptions:{ecazTreachery:true}}, {lobbyModules:{ecazTreachery:true}}, {lobbyOptions:{ecazTreachery:true},lobbyModules:{ecazTreachery:true}}, ]) assert.deepEqual(kullDefaultProfile({...lobby,...selection}), {eligible:true,reason:null}); assert.deepEqual(kullDefaultProfile({...lobby,expansions:['choam','ix'], players:[{faction:'choam'},{faction:'atreides'}],lobbyOptions:{ecazTreachery:true}}), {eligible:true,reason:null}, 'the independent cards do not require the Ecaz faction or deck'); }); void test('the actual public lobby retains the Kull default when independent cards are selected', () => { let game = createGame('KULLINDEPENDENTPROFILE',newPlayer('c','CHOAM','choam'),false,['choam','ix','ecaz']); joinGame(game,newPlayer('e','Ecaz','ecaz')); let view = viewGame(game,'c'); assert.equal(view.lobbyModules?.ecazTreachery,false); assert.equal(view.lobbyModules?.kullDefault,true); assert.equal(view.lobbyModules?.kullPreview,true); game = applyAction(game,'c',{type:'moduleOption',module:'ecazTreachery',enabled:true}); view = viewGame(game,'c'); assert.equal(view.lobbyModules?.ecazTreachery,true); assert.equal(view.lobbyModules?.kullDefault,true); assert.equal(view.lobbyModules?.kullPreview,true); game = applyAction(game,'c',{type:'moduleOption',module:'kullPreview',enabled:false}); assert.equal(viewGame(game,'c').lobbyModules?.kullDefault,true); assert.equal(viewGame(game,'c').lobbyModules?.kullPreview,false); game = applyAction(game,'c',{type:'moduleOption',module:'kullPreview',enabled:true}); assert.equal(viewGame(game,'c').lobbyModules?.kullPreview,true); assert.equal(viewGame(game,'c').lobbyModules?.ecazTreachery,true); }); void test('all other modules and an already-initialized card marker remain excluded', () => { const selected = {...lobby,lobbyOptions:{ecazTreachery:true}}; for (const other of [ {lobbyOptions:{ecazTreachery:true,leaderSkills:true}}, {lobbyModules:{ecazTreachery:true,leaderSkills:true}}, {lobbyModules:{ecazTreachery:true,nexusCards:true}}, {lobbyModules:{ecazTreachery:true,discoveries:true}}, {leaderSkills:{}},{ecazTreachery:true},{nexusCards:{}},{discoveryEnabled:true}, {discoveries:{}},{discoveryStash:{}},{greatMaker:{}},{homeworlds:{}}, {techTokens:{}},{strongholdCards:{}}, ]) { const result = kullDefaultProfile({...selected,...other}); assert.equal(result.eligible,false); assert.ok(result.reason); } assert.equal(kullDefaultProfile({...selected,advanced:true}).eligible,false); assert.equal(kullDefaultProfile({...selected,status:'setup'}).eligible,false); });