Adopt authorized Advanced Storm and alliance separation defaults
This commit is contained in:
1 parent
42324b4a99
commit
e1056a4db0
30 files changed
+2955
-82
No files matched your search
@@ -0,0 +1,12 @@
|
||||
import type { GameView } from '@/game/engine';
|
||||
|
||||
/** The engine quote carries public locations only, never concealed force values. */
|
||||
export function AdvancedAllySeparation({ quote }: {
|
||||
quote: GameView['advancedAllySeparation'];
|
||||
}) {
|
||||
if (!quote?.territories.length) return null;
|
||||
return <output id="advanced-ally-separation" className="notice block">
|
||||
Finishing now sends your forces in{' '}
|
||||
{quote.territories.join(', ')} to Tanks under the Advanced alliance rule.
|
||||
</output>;
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
import { integerInputValue } from '../lib/integer-input';
|
||||
import { EcazSetup } from './ecaz-setup';
|
||||
import { StormCardInspector, StormCardLogInspector } from './storm-cards';
|
||||
import { stormCardDistance } from '@/game/storm-cards';
|
||||
import { KwisatzInspector } from './kwisatz-inspector';
|
||||
import { ForceInspector } from './force-inspector';
|
||||
import { FactionInspector } from './faction-inspector';
|
||||
@@ -220,6 +221,7 @@ import { TERROR_DEFINITIONS } from '@/game/moritani-terror';
|
||||
import { MoritaniRetention } from './moritani-retention';
|
||||
import { MoritaniAssassinate, MoritaniAssassinateHistory } from './moritani-assassinate';
|
||||
import { MoritaniExtortion, MoritaniExtortionNotice } from './moritani-extortion';
|
||||
import { AdvancedAllySeparation } from './advanced-ally-separation';
|
||||
export function GameTable({
|
||||
game: g,
|
||||
send,
|
||||
@@ -3596,6 +3598,11 @@ export function GameTable({
|
||||
{Object.values(g.stormRevealed).join(' + ')}
|
||||
</p>
|
||||
)}
|
||||
{g.stormDialers.length === 0 && !g.stormRevealed && (
|
||||
<StormCardLogInspector component={g.log.findLast(
|
||||
entry => stormCardDistance(entry.component) !== null,
|
||||
)?.component} />
|
||||
)}
|
||||
{actionButton(
|
||||
g.ready.includes(me.id)
|
||||
? 'Waiting for the table'
|
||||
@@ -3605,7 +3612,7 @@ export function GameTable({
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
{g.phase === 0 && g.stormPending === null && (
|
||||
{g.phase === 0 && g.stormPending === null && g.stormDialers.length > 0 && (
|
||||
<>
|
||||
<p className="muted">
|
||||
The two storm dialers choose secretly. Their sum moves the
|
||||
@@ -4551,6 +4558,7 @@ export function GameTable({
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
<AdvancedAllySeparation quote={g.advancedAllySeparation} />
|
||||
{g.nexusGuildCunning?.offer && (
|
||||
<section className="notice">
|
||||
<p>Guild Cunning ends your ordinary shipment and movement, then offers one second shipment at normal Guild prices. Only an unused Hajr move can follow it. The physical Ornithopter card combination remains unavailable.</p>
|
||||
@@ -4568,7 +4576,8 @@ export function GameTable({
|
||||
nexusGuildSkipShipmentAction(g, guildCunning.event) ?? {type: 'endMovement'},
|
||||
!nexusGuildSkipShipmentAction(g, guildCunning.event))}
|
||||
{actionButton(guildCunning?.stage === 'secondShipment' ? 'Decline second shipment and finish' :
|
||||
guildCunning ? 'Finish Guild turn' : 'Finish shipment & movement', {type: 'endMovement'})}
|
||||
guildCunning ? 'Finish Guild turn' : 'Finish shipment & movement', {type: 'endMovement'}, false,
|
||||
g.advancedAllySeparation?.territories.length ? 'advanced-ally-separation' : undefined)}
|
||||
</>
|
||||
) : (
|
||||
<p className="muted">
|
||||
|
||||
@@ -53,9 +53,9 @@ export function StormCardInspector({ distance, context = 'reference' }: {
|
||||
<DialogTitle className="m-0 font-serif text-2xl leading-tight text-[#fff3d6]">Storm Card — {sectors(distance)}</DialogTitle>
|
||||
<DialogDescription className="m-0 text-base leading-7 text-[#d9d4c7]">{guide.description}</DialogDescription>
|
||||
<StormCardFace distance={distance} />
|
||||
<p className="m-0 text-base leading-7">In the Advanced game with Fremen, the first storm uses the Battle Wheels.
|
||||
For later turns, the selected Storm Card is revealed and supplies the storm’s counterclockwise distance.
|
||||
It returns to the deck before the next forecast is drawn.</p>
|
||||
<p className="m-0 text-base leading-7">The first Advanced storm uses the Battle Wheels.
|
||||
Every later new Advanced Storm opening reveals a Storm Card for its counterclockwise distance, even without Fremen.
|
||||
The card returns to the deck before the next draw. Only native Fremen has the private forecast advantage.</p>
|
||||
<p className="m-0 text-base leading-7">This face shows the card’s value. Weather Control and other effects can change
|
||||
the actual movement; the table’s storm result records that movement.</p>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user