зеркало из
https://github.com/kodackx/disinformation-quest.git
synced 2025-10-28 20:34:15 +02:00
kpis, new audio and text revamp
Этот коммит содержится в:
родитель
ef2f7affb1
Коммит
f94c8b0e1b
50
package-lock.json
сгенерированный
50
package-lock.json
сгенерированный
@ -45,6 +45,7 @@
|
|||||||
"embla-carousel-react": "^8.3.0",
|
"embla-carousel-react": "^8.3.0",
|
||||||
"framer-motion": "^11.14.4",
|
"framer-motion": "^11.14.4",
|
||||||
"heroicons": "^2.2.0",
|
"heroicons": "^2.2.0",
|
||||||
|
"html2canvas": "^1.4.1",
|
||||||
"input-otp": "^1.2.4",
|
"input-otp": "^1.2.4",
|
||||||
"lucide-react": "^0.462.0",
|
"lucide-react": "^0.462.0",
|
||||||
"next-themes": "^0.3.0",
|
"next-themes": "^0.3.0",
|
||||||
@ -3312,6 +3313,15 @@
|
|||||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/base64-arraybuffer": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/binary-extensions": {
|
"node_modules/binary-extensions": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
||||||
@ -3918,6 +3928,15 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/css-line-break": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"utrie": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cssesc": {
|
"node_modules/cssesc": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
|
||||||
@ -4752,6 +4771,19 @@
|
|||||||
"integrity": "sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==",
|
"integrity": "sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/html2canvas": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
|
||||||
|
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"css-line-break": "^2.1.0",
|
||||||
|
"text-segmentation": "^1.0.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ignore": {
|
"node_modules/ignore": {
|
||||||
"version": "5.3.2",
|
"version": "5.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
||||||
@ -6241,6 +6273,15 @@
|
|||||||
"tailwindcss": ">=3.0.0 || insiders"
|
"tailwindcss": ">=3.0.0 || insiders"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/text-segmentation": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"utrie": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/text-table": {
|
"node_modules/text-table": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
||||||
@ -6460,6 +6501,15 @@
|
|||||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/utrie": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"base64-arraybuffer": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vaul": {
|
"node_modules/vaul": {
|
||||||
"version": "0.9.9",
|
"version": "0.9.9",
|
||||||
"resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz",
|
"resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz",
|
||||||
|
|||||||
@ -49,6 +49,7 @@
|
|||||||
"embla-carousel-react": "^8.3.0",
|
"embla-carousel-react": "^8.3.0",
|
||||||
"framer-motion": "^11.14.4",
|
"framer-motion": "^11.14.4",
|
||||||
"heroicons": "^2.2.0",
|
"heroicons": "^2.2.0",
|
||||||
|
"html2canvas": "^1.4.1",
|
||||||
"input-otp": "^1.2.4",
|
"input-otp": "^1.2.4",
|
||||||
"lucide-react": "^0.462.0",
|
"lucide-react": "^0.462.0",
|
||||||
"next-themes": "^0.3.0",
|
"next-themes": "^0.3.0",
|
||||||
|
|||||||
Двоичные данные
public/audio/briefings/alert.mp3
Обычный файл
Двоичные данные
public/audio/briefings/alert.mp3
Обычный файл
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/february.mp3
Двоичные данные
public/audio/briefings/february.mp3
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/intro.mp3
Обычный файл
Двоичные данные
public/audio/briefings/intro.mp3
Обычный файл
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/january.mp3
Двоичные данные
public/audio/briefings/january.mp3
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/july.mp3
Обычный файл
Двоичные данные
public/audio/briefings/july.mp3
Обычный файл
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/march.mp3
Двоичные данные
public/audio/briefings/march.mp3
Двоичный файл не отображается.
Двоичные данные
public/audio/briefings/may.mp3
Обычный файл
Двоичные данные
public/audio/briefings/may.mp3
Обычный файл
Двоичный файл не отображается.
9
src/components/Footer.tsx
Обычный файл
9
src/components/Footer.tsx
Обычный файл
@ -0,0 +1,9 @@
|
|||||||
|
import { VERSION } from '../version';
|
||||||
|
|
||||||
|
export const Footer = () => {
|
||||||
|
return (
|
||||||
|
<footer className="fixed bottom-0 left-0 right-0 p-2 text-center text-xs text-gray-500 bg-white/80">
|
||||||
|
<span>v{VERSION.current}</span>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -18,8 +18,8 @@ interface MonthTransitionProps {
|
|||||||
// Create separate components for each style
|
// Create separate components for each style
|
||||||
const FadeTransition = ({ month }: { month: string }) => (
|
const FadeTransition = ({ month }: { month: string }) => (
|
||||||
<Card className="bg-transparent border-none shadow-none">
|
<Card className="bg-transparent border-none shadow-none">
|
||||||
<CardContent className="flex items-center justify-center">
|
<CardContent className="flex items-center justify-center px-4">
|
||||||
<div className="text-6xl font-bold text-yellow-500 animate-month-transition">
|
<div className="text-4xl md:text-6xl font-bold text-yellow-500 animate-month-transition max-w-[90vw] break-words text-center">
|
||||||
{month}
|
{month}
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
@ -27,8 +27,8 @@ const FadeTransition = ({ month }: { month: string }) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const TypewriterTransition = ({ month }: { month: string }) => (
|
const TypewriterTransition = ({ month }: { month: string }) => (
|
||||||
<div className="relative">
|
<div className="relative px-4">
|
||||||
<div className="overflow-hidden whitespace-nowrap border-r-4 border-yellow-500 pr-1 text-6xl font-bold text-yellow-500 animate-typewriter animate-cursor-blink">
|
<div className="overflow-hidden whitespace-normal md:whitespace-nowrap border-r-4 border-yellow-500 pr-1 text-4xl md:text-6xl font-bold text-yellow-500 animate-typewriter animate-cursor-blink max-w-[90vw] break-words">
|
||||||
{month}
|
{month}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,7 +40,7 @@ const SplitScreenTransition = ({ month }: { month: string }) => (
|
|||||||
<div className="w-1/2 bg-yellow-500 animate-slide-left" />
|
<div className="w-1/2 bg-yellow-500 animate-slide-left" />
|
||||||
<div className="w-1/2 bg-yellow-500 animate-slide-right" />
|
<div className="w-1/2 bg-yellow-500 animate-slide-right" />
|
||||||
</div>
|
</div>
|
||||||
<div className="z-10 text-6xl font-bold text-black">
|
<div className="z-10 text-4xl md:text-6xl font-bold text-black px-4 max-w-[90vw] break-words text-center">
|
||||||
{month}
|
{month}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
@ -62,8 +62,8 @@ const MatrixTransition = ({ month }: { month: string }) => (
|
|||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="relative z-10">
|
<div className="relative z-10 px-4">
|
||||||
<div className="text-6xl font-bold text-yellow-500 animate-glitch">
|
<div className="text-4xl md:text-6xl font-bold text-yellow-500 animate-glitch max-w-[90vw] break-words text-center">
|
||||||
{month}
|
{month}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -118,11 +118,11 @@ const NumberCycleTransition = ({ month }: { month: string }) => {
|
|||||||
}, [month]);
|
}, [month]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex">
|
<div className="flex flex-wrap justify-center px-4 max-w-[90vw]">
|
||||||
{displayText.split('').map((char, i) => (
|
{displayText.split('').map((char, i) => (
|
||||||
<div
|
<div
|
||||||
key={i}
|
key={i}
|
||||||
className={`text-6xl font-bold w-[1.5ch] text-center font-mono ${
|
className={`text-4xl md:text-6xl font-bold w-[1.5ch] text-center font-mono ${
|
||||||
char === month[i] ? 'text-yellow-500' : 'text-yellow-500/50'
|
char === month[i] ? 'text-yellow-500' : 'text-yellow-500/50'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
|
|||||||
@ -38,11 +38,21 @@ export const BriefingAudio = ({ stage, audioRef, className }: BriefingAudioProps
|
|||||||
}, [audioRef]);
|
}, [audioRef]);
|
||||||
|
|
||||||
const getAudioFileName = (stage: string) => {
|
const getAudioFileName = (stage: string) => {
|
||||||
// Extract the month name from the stage title (e.g., "January: Know Your Audience" -> "january")
|
// Handle special stages
|
||||||
|
if (stage === "ALERT" || stage === "INTRO") {
|
||||||
|
return `${stage.toLowerCase()}.mp3`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle monthly stages
|
||||||
const month = stage.split(':')[0].toLowerCase().trim();
|
const month = stage.split(':')[0].toLowerCase().trim();
|
||||||
return `${month}.mp3`;
|
return `${month}.mp3`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Skip rendering for special stages that don't have audio
|
||||||
|
if (stage === "ALERT" || stage === "INTRO") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
@ -39,6 +39,19 @@ export const ChoiceCard: React.FC<ChoiceCardProps> = ({
|
|||||||
bg-gray-800/50 hover:bg-gray-700/50
|
bg-gray-800/50 hover:bg-gray-700/50
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const getStatusMessage = () => {
|
||||||
|
if (isStrengthened && isWeakened) {
|
||||||
|
return "This choice is both enhanced and weakened by your previous choices";
|
||||||
|
} else if (isStrengthened) {
|
||||||
|
return "This choice is enhanced by your previous choices";
|
||||||
|
} else if (isWeakened) {
|
||||||
|
return "This choice is weakened by your previous choices";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const statusMessage = getStatusMessage();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
className={cardClasses}
|
className={cardClasses}
|
||||||
@ -56,7 +69,7 @@ export const ChoiceCard: React.FC<ChoiceCardProps> = ({
|
|||||||
<TooltipTrigger>
|
<TooltipTrigger>
|
||||||
<Badge className="bg-green-500 hover:bg-green-600">
|
<Badge className="bg-green-500 hover:bg-green-600">
|
||||||
<ArrowTrendingUpIcon className="w-4 h-4 mr-1" />
|
<ArrowTrendingUpIcon className="w-4 h-4 mr-1" />
|
||||||
Enhanced
|
Enhanced by previous strategy choice
|
||||||
</Badge>
|
</Badge>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
@ -77,7 +90,7 @@ export const ChoiceCard: React.FC<ChoiceCardProps> = ({
|
|||||||
<TooltipTrigger>
|
<TooltipTrigger>
|
||||||
<Badge className="bg-orange-500 hover:bg-orange-600">
|
<Badge className="bg-orange-500 hover:bg-orange-600">
|
||||||
<ExclamationTriangleIcon className="w-4 h-4 mr-1" />
|
<ExclamationTriangleIcon className="w-4 h-4 mr-1" />
|
||||||
Weakened
|
Weakened by previous strategy choice
|
||||||
</Badge>
|
</Badge>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
@ -95,9 +108,9 @@ export const ChoiceCard: React.FC<ChoiceCardProps> = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<CardDescription className="text-gray-300">
|
{/* <CardDescription className="text-gray-300">
|
||||||
{choice.description}
|
{choice.description}
|
||||||
</CardDescription>
|
</CardDescription> */}
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
||||||
<CardContent className="space-y-4">
|
<CardContent className="space-y-4">
|
||||||
@ -109,7 +122,7 @@ export const ChoiceCard: React.FC<ChoiceCardProps> = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="flex items-center gap-2 text-sm">
|
<div className="flex items-center gap-2 text-sm">
|
||||||
<InformationCircleIcon className="w-4 h-4 text-blue-500" />
|
<InformationCircleIcon className="w-8 h-8 text-blue-500" />
|
||||||
<span className="text-gray-300">{choice.impact}</span>
|
<span className="text-gray-300">{choice.impact}</span>
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|||||||
@ -7,9 +7,11 @@ import { DossierEntry } from "./types";
|
|||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
|
import { MetricsDisplay } from "./MetricsDisplay";
|
||||||
|
|
||||||
interface DossierPanelProps {
|
interface DossierPanelProps {
|
||||||
entries: DossierEntry[];
|
entries: DossierEntry[];
|
||||||
|
choices?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const TypewriterText = ({ text }: { text: string }) => {
|
const TypewriterText = ({ text }: { text: string }) => {
|
||||||
@ -35,7 +37,7 @@ const TypewriterText = ({ text }: { text: string }) => {
|
|||||||
return <span>{displayText}</span>;
|
return <span>{displayText}</span>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DossierPanel = ({ entries }: DossierPanelProps) => (
|
export const DossierPanel = ({ entries, choices = [] }: DossierPanelProps) => (
|
||||||
<Sheet>
|
<Sheet>
|
||||||
<SheetTrigger asChild>
|
<SheetTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
@ -55,6 +57,11 @@ export const DossierPanel = ({ entries }: DossierPanelProps) => (
|
|||||||
Operation Dossier
|
Operation Dossier
|
||||||
</SheetTitle>
|
</SheetTitle>
|
||||||
</SheetHeader>
|
</SheetHeader>
|
||||||
|
|
||||||
|
<div className="bg-gray-800/30 p-6 rounded-md border border-gray-700 mb-6">
|
||||||
|
<MetricsDisplay choices={choices} className="pl-0" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<Separator className="my-6 bg-gray-700" />
|
<Separator className="my-6 bg-gray-700" />
|
||||||
<ScrollArea className="h-[calc(100vh-140px)] pr-6">
|
<ScrollArea className="h-[calc(100vh-140px)] pr-6">
|
||||||
<div className="space-y-8 pb-8">
|
<div className="space-y-8 pb-8">
|
||||||
@ -77,26 +84,14 @@ export const DossierPanel = ({ entries }: DossierPanelProps) => (
|
|||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="ml-6 space-y-3">
|
<div className="ml-6 space-y-3">
|
||||||
{entry.insights.map((insight, idx) => (
|
<ul className="space-y-2 text-gray-300">
|
||||||
<motion.p
|
{entry.insights.map((insight, i) => (
|
||||||
key={idx}
|
<li key={i} className="flex items-start gap-2">
|
||||||
initial={{ opacity: 0, x: -20 }}
|
<span className="text-yellow-500">•</span>
|
||||||
animate={{ opacity: 1, x: 0 }}
|
<span>{insight}</span>
|
||||||
transition={{ duration: 0.3, delay: 0.2 + idx * 0.1 }}
|
</li>
|
||||||
className="text-gray-300 text-sm flex gap-3"
|
))}
|
||||||
>
|
</ul>
|
||||||
<span className="text-yellow-500">•</span>
|
|
||||||
<span className={cn(
|
|
||||||
idx % 3 === 0 && "bg-black px-2 py-0.5 font-mono tracking-wide",
|
|
||||||
"relative"
|
|
||||||
)}>
|
|
||||||
{insight}
|
|
||||||
{idx % 3 === 0 && (
|
|
||||||
<span className="absolute inset-0 bg-black/80 mix-blend-multiply" />
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
</motion.p>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
<div className="ml-6 pt-3 border-t border-gray-700">
|
<div className="ml-6 pt-3 border-t border-gray-700">
|
||||||
<p className="text-sm text-gray-400 italic">
|
<p className="text-sm text-gray-400 italic">
|
||||||
|
|||||||
@ -1,31 +1,40 @@
|
|||||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||||
import { Shield, Star, Target, TrendingUp, Award, BarChart2, RotateCcw } from "lucide-react";
|
import { Shield, Star, Target, TrendingUp, Award, RotateCcw, Download } from "lucide-react";
|
||||||
import { generateFinalReport } from "./constants";
|
import { generateFinalReport } from "./constants";
|
||||||
|
import { MetricsDisplay } from "./MetricsDisplay";
|
||||||
|
import html2canvas from 'html2canvas';
|
||||||
import "./FinalMemo.css";
|
import "./FinalMemo.css";
|
||||||
|
|
||||||
interface FinalMemoProps {
|
interface FinalMemoProps {
|
||||||
choices: string[];
|
choices: string[];
|
||||||
onRestart?: () => void;
|
onRestart?: () => void;
|
||||||
|
agentNumber: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MetricBar = ({ value, label }: { value: number; label: string }) => (
|
export const FinalMemo = ({ choices, onRestart, agentNumber }: FinalMemoProps) => {
|
||||||
<div className="space-y-2">
|
|
||||||
<div className="flex justify-between text-sm text-emerald-400">
|
|
||||||
<span>{label}</span>
|
|
||||||
<span>{value}%</span>
|
|
||||||
</div>
|
|
||||||
<div className="h-2 bg-emerald-950/50 rounded-full overflow-hidden">
|
|
||||||
<div
|
|
||||||
className="h-full bg-emerald-500 rounded-full transition-all duration-1000"
|
|
||||||
style={{ width: `${value}%` }}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
export const FinalMemo = ({ choices, onRestart }: FinalMemoProps) => {
|
|
||||||
const finalReport = generateFinalReport(choices);
|
const finalReport = generateFinalReport(choices);
|
||||||
|
|
||||||
|
const handleDownload = async () => {
|
||||||
|
const reportElement = document.querySelector('.final-memo');
|
||||||
|
if (!reportElement) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const canvas = await html2canvas(reportElement as HTMLElement, {
|
||||||
|
backgroundColor: '#000000',
|
||||||
|
scale: 2, // Higher quality
|
||||||
|
logging: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create download link
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.download = 'mathematical-persuasion-report.png';
|
||||||
|
link.href = canvas.toDataURL('image/png');
|
||||||
|
link.click();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error generating report image:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative min-h-screen overflow-hidden">
|
<div className="relative min-h-screen overflow-hidden">
|
||||||
<div className="relative min-h-screen bg-black/80 p-4 flex items-center justify-center">
|
<div className="relative min-h-screen bg-black/80 p-4 flex items-center justify-center">
|
||||||
@ -37,7 +46,7 @@ export const FinalMemo = ({ choices, onRestart }: FinalMemoProps) => {
|
|||||||
<span className="text-sm font-mono text-emerald-500">TOP SECRET</span>
|
<span className="text-sm font-mono text-emerald-500">TOP SECRET</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<span className="text-sm font-mono text-emerald-500">FINAL ASSESSMENT</span>
|
<span className="text-sm font-mono text-emerald-500">AGENT {agentNumber} MISSION REPORT</span>
|
||||||
<Star className="w-5 h-5 text-emerald-500" />
|
<Star className="w-5 h-5 text-emerald-500" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -52,22 +61,7 @@ export const FinalMemo = ({ choices, onRestart }: FinalMemoProps) => {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
||||||
<CardContent className="space-y-8 p-6">
|
<CardContent className="space-y-8 p-6">
|
||||||
<section className="space-y-4">
|
<MetricsDisplay choices={choices} />
|
||||||
<h3 className="text-xl text-emerald-400 flex items-center gap-2">
|
|
||||||
<BarChart2 className="w-5 h-5" />
|
|
||||||
Performance Metrics
|
|
||||||
</h3>
|
|
||||||
<div className="pl-7 space-y-4">
|
|
||||||
<MetricBar
|
|
||||||
value={finalReport.metrics.stability}
|
|
||||||
label="Regional Stability"
|
|
||||||
/>
|
|
||||||
<MetricBar
|
|
||||||
value={finalReport.metrics.influence}
|
|
||||||
label="Diplomatic Influence"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="space-y-4">
|
<section className="space-y-4">
|
||||||
<h3 className="text-xl text-emerald-400 flex items-center gap-2">
|
<h3 className="text-xl text-emerald-400 flex items-center gap-2">
|
||||||
@ -128,7 +122,7 @@ export const FinalMemo = ({ choices, onRestart }: FinalMemoProps) => {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div className="flex justify-center pt-6 border-t border-emerald-900/30">
|
<div className="flex justify-center gap-4 pt-6 border-t border-emerald-900/30">
|
||||||
<button
|
<button
|
||||||
onClick={onRestart}
|
onClick={onRestart}
|
||||||
className="flex items-center gap-2 px-4 py-2 bg-emerald-950/50 hover:bg-emerald-950/70
|
className="flex items-center gap-2 px-4 py-2 bg-emerald-950/50 hover:bg-emerald-950/70
|
||||||
@ -137,6 +131,14 @@ export const FinalMemo = ({ choices, onRestart }: FinalMemoProps) => {
|
|||||||
<RotateCcw className="w-4 h-4" />
|
<RotateCcw className="w-4 h-4" />
|
||||||
Begin New Mission
|
Begin New Mission
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
onClick={handleDownload}
|
||||||
|
className="flex items-center gap-2 px-4 py-2 bg-emerald-950/50 hover:bg-emerald-950/70
|
||||||
|
text-emerald-400 rounded-md transition-colors duration-200"
|
||||||
|
>
|
||||||
|
<Download className="w-4 h-4" />
|
||||||
|
Download Report
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
74
src/components/game/IntroAudio.tsx
Обычный файл
74
src/components/game/IntroAudio.tsx
Обычный файл
@ -0,0 +1,74 @@
|
|||||||
|
import { useState, useRef, useEffect } from 'react';
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import { Play, Pause } from "lucide-react";
|
||||||
|
import { useToast } from "@/components/ui/use-toast";
|
||||||
|
|
||||||
|
interface IntroAudioProps {
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const IntroAudio = ({ className }: IntroAudioProps) => {
|
||||||
|
const [isPlaying, setIsPlaying] = useState(false);
|
||||||
|
const audioRef = useRef<HTMLAudioElement | null>(null);
|
||||||
|
const { toast } = useToast();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
if (audioRef.current) {
|
||||||
|
audioRef.current.pause();
|
||||||
|
audioRef.current = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const togglePlay = async () => {
|
||||||
|
try {
|
||||||
|
if (!audioRef.current) {
|
||||||
|
audioRef.current = new Audio('/audio/briefings/intro.mp3');
|
||||||
|
audioRef.current.addEventListener('ended', () => setIsPlaying(false));
|
||||||
|
|
||||||
|
// Pre-load the audio
|
||||||
|
try {
|
||||||
|
await audioRef.current.load();
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error('Audio file not found or unsupported format');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isPlaying) {
|
||||||
|
audioRef.current.pause();
|
||||||
|
} else {
|
||||||
|
const playPromise = audioRef.current.play();
|
||||||
|
if (playPromise !== undefined) {
|
||||||
|
playPromise.catch(error => {
|
||||||
|
console.error('Playback failed:', error);
|
||||||
|
toast({
|
||||||
|
title: "Playback Error",
|
||||||
|
description: "Unable to play audio briefing",
|
||||||
|
variant: "destructive"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setIsPlaying(!isPlaying);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Audio error:', error);
|
||||||
|
toast({
|
||||||
|
title: "Audio Error",
|
||||||
|
description: "Audio briefing unavailable",
|
||||||
|
variant: "destructive"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
className={`text-yellow-500 hover:text-yellow-400 hover:bg-yellow-500/20 ${className}`}
|
||||||
|
onClick={togglePlay}
|
||||||
|
>
|
||||||
|
{isPlaying ? <Pause className="h-4 w-4" /> : <Play className="h-4 w-4" />}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -14,7 +14,7 @@ export const IntroDialog = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog open={open} onOpenChange={setOpen}>
|
<Dialog open={open} onOpenChange={setOpen}>
|
||||||
<DialogContent className="bg-black/90 text-white border-gray-700 max-w-2xl">
|
<DialogContent className="bg-black/90 text-white border-gray-700 max-w-2xl max-h-[90vh] overflow-y-auto">
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle className="text-yellow-500 text-2xl font-bold">
|
<DialogTitle className="text-yellow-500 text-2xl font-bold">
|
||||||
What is twoplustwo?
|
What is twoplustwo?
|
||||||
@ -23,7 +23,7 @@ export const IntroDialog = () => {
|
|||||||
<div className="flex items-center space-x-4">
|
<div className="flex items-center space-x-4">
|
||||||
<div className="text-4xl">🎯</div>
|
<div className="text-4xl">🎯</div>
|
||||||
<p className="text-lg">
|
<p className="text-lg">
|
||||||
Your mission: Convince the world that 2+2=5 through a strategic
|
Your mission: Convince people that 2+2=5 through a strategic
|
||||||
disinformation campaign.
|
disinformation campaign.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -39,7 +39,7 @@ export const IntroDialog = () => {
|
|||||||
<div className="bg-gray-800/50 p-4 rounded-lg">
|
<div className="bg-gray-800/50 p-4 rounded-lg">
|
||||||
<h3 className="text-yellow-500 font-semibold mb-2">How to Play</h3>
|
<h3 className="text-yellow-500 font-semibold mb-2">How to Play</h3>
|
||||||
<p>
|
<p>
|
||||||
You'll have resources, influence points, and various tactics at your disposal.
|
You'll have resources, a team, and various tactics at your disposal.
|
||||||
Choose your actions wisely to spread your message while managing public reaction
|
Choose your actions wisely to spread your message while managing public reaction
|
||||||
and credibility.
|
and credibility.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
64
src/components/game/MetricsDisplay.tsx
Обычный файл
64
src/components/game/MetricsDisplay.tsx
Обычный файл
@ -0,0 +1,64 @@
|
|||||||
|
import { BarChart2 } from "lucide-react";
|
||||||
|
import { calculateMetrics } from "./constants/metrics";
|
||||||
|
|
||||||
|
interface MetricsDisplayProps {
|
||||||
|
choices?: string[];
|
||||||
|
showTitle?: boolean;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MetricBar = ({ value, label }: { value: number; label: string }) => (
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex justify-between text-sm text-emerald-400">
|
||||||
|
<span>{label}</span>
|
||||||
|
<span>{value}%</span>
|
||||||
|
</div>
|
||||||
|
<div className="h-2 bg-emerald-950/50 rounded-full overflow-hidden">
|
||||||
|
<div
|
||||||
|
className="h-full bg-emerald-500 rounded-full transition-all duration-1000"
|
||||||
|
style={{ width: `${value}%` }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
const ViralityBar = ({ value }: { value: number }) => (
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex justify-between text-sm text-emerald-400">
|
||||||
|
<span>Virality Multiplier</span>
|
||||||
|
<span>{value}x</span>
|
||||||
|
</div>
|
||||||
|
<div className="h-2 bg-emerald-950/50 rounded-full overflow-hidden">
|
||||||
|
<div
|
||||||
|
className="h-full bg-emerald-500 rounded-full transition-all duration-1000"
|
||||||
|
style={{ width: `${(value / 5) * 100}%` }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const MetricsDisplay = ({ choices = [], showTitle = true, className = "" }: MetricsDisplayProps) => {
|
||||||
|
const metrics = calculateMetrics(choices);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={`space-y-4 ${className}`}>
|
||||||
|
{showTitle && (
|
||||||
|
<h3 className="text-xl text-emerald-400 flex items-center gap-2">
|
||||||
|
<BarChart2 className="w-5 h-5" />
|
||||||
|
Performance Metrics
|
||||||
|
</h3>
|
||||||
|
)}
|
||||||
|
<div className="space-y-4">
|
||||||
|
<MetricBar
|
||||||
|
value={metrics.reach}
|
||||||
|
label="Network Reach"
|
||||||
|
/>
|
||||||
|
<MetricBar
|
||||||
|
value={metrics.loyalists}
|
||||||
|
label="Core Loyalists"
|
||||||
|
/>
|
||||||
|
<ViralityBar value={metrics.virality} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -59,6 +59,8 @@ export const StrategyAnimation: React.FC<StrategyAnimationProps> = ({ animation,
|
|||||||
return renderDefaultAnimation('Platform Strategy');
|
return renderDefaultAnimation('Platform Strategy');
|
||||||
case 'freedom':
|
case 'freedom':
|
||||||
return renderDefaultAnimation('Freedom Strategy');
|
return renderDefaultAnimation('Freedom Strategy');
|
||||||
|
case 'documentary':
|
||||||
|
return renderDefaultAnimation('Documentary Strategy');
|
||||||
default:
|
default:
|
||||||
return renderDefaultAnimation('Strategy Visualization');
|
return renderDefaultAnimation('Strategy Visualization');
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
|
import { calculateMetrics } from './metrics';
|
||||||
|
|
||||||
interface FinalReportMetrics {
|
interface FinalReportMetrics {
|
||||||
influence: number;
|
virality: number;
|
||||||
stability: number;
|
|
||||||
reach: number;
|
reach: number;
|
||||||
|
loyalists: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FinalReportReward {
|
interface FinalReportReward {
|
||||||
title: string;
|
title: string;
|
||||||
description: string;
|
description: string;
|
||||||
badge: string;
|
badge: string;
|
||||||
implications: string[]; // Add this line to resolve the TypeScript error
|
implications: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FinalReport {
|
interface FinalReport {
|
||||||
@ -22,37 +24,134 @@ interface FinalReport {
|
|||||||
futureImplications: string;
|
futureImplications: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper function to analyze strategy pattern
|
||||||
|
const analyzeStrategyPattern = (choices: string[]): 'populist' | 'academic' => {
|
||||||
|
// Count populist vs academic choices
|
||||||
|
const populistChoices = [
|
||||||
|
"Deploy Independent Bot Network",
|
||||||
|
"Establish Diverse Meme Channels",
|
||||||
|
"Launch a Counter-Campaign Against Dr. Carter",
|
||||||
|
"Create Historical Conspiracy Documentary",
|
||||||
|
"Engage with Podcast Platforms",
|
||||||
|
"Launch 'Truth Seekers Network' (TSN), an independent video hosting platform"
|
||||||
|
];
|
||||||
|
|
||||||
|
const academicChoices = [
|
||||||
|
"Launch Automated News Platforms",
|
||||||
|
"Infiltrate Niche Online Communities",
|
||||||
|
"Release Independent Research Paper",
|
||||||
|
"Stay the Course",
|
||||||
|
"Promote Intellectual Freedom",
|
||||||
|
"Recruit from Lower-Tier Academia"
|
||||||
|
];
|
||||||
|
|
||||||
|
let populistScore = choices.filter(choice => populistChoices.includes(choice)).length;
|
||||||
|
let academicScore = choices.filter(choice => academicChoices.includes(choice)).length;
|
||||||
|
|
||||||
|
if (populistScore === academicScore) {
|
||||||
|
// Randomly choose between populist and academic when scores are equal
|
||||||
|
return Math.random() < 0.5 ? 'populist' : 'academic';
|
||||||
|
}
|
||||||
|
return populistScore > academicScore ? 'populist' : 'academic';
|
||||||
|
};
|
||||||
|
|
||||||
|
// Generate dynamic achievements based on metrics and choices
|
||||||
|
const generateAchievements = (metrics: FinalReportMetrics, choices: string[]): string[] => {
|
||||||
|
const achievements: string[] = [];
|
||||||
|
|
||||||
|
if (metrics.virality > 2.0) {
|
||||||
|
achievements.push("Created highly viral narrative patterns");
|
||||||
|
}
|
||||||
|
if (metrics.reach > 40) {
|
||||||
|
achievements.push("Achieved significant mainstream penetration");
|
||||||
|
}
|
||||||
|
if (metrics.loyalists > 30) {
|
||||||
|
achievements.push("Built dedicated core supporter base");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (choices.includes("Create Historical Conspiracy Documentary")) {
|
||||||
|
achievements.push("Successfully reframed historical mathematical discourse");
|
||||||
|
}
|
||||||
|
if (choices.includes("Infiltrate Niche Online Communities")) {
|
||||||
|
achievements.push("Established strong grassroots presence");
|
||||||
|
}
|
||||||
|
if (choices.includes("Release Independent Research Paper")) {
|
||||||
|
achievements.push("Created credible academic foundation");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add more generic achievements if needed
|
||||||
|
while (achievements.length < 4) {
|
||||||
|
achievements.push(
|
||||||
|
"Sustained continuous narrative momentum",
|
||||||
|
"Developed multi-channel influence network",
|
||||||
|
"Created self-reinforcing information ecosystem",
|
||||||
|
"Achieved significant public engagement"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return achievements.slice(0, 4); // Return top 4 achievements
|
||||||
|
};
|
||||||
|
|
||||||
|
// Generate ending content based on strategy pattern and metrics
|
||||||
|
const generateEnding = (pattern: 'populist' | 'academic', metrics: FinalReportMetrics) => {
|
||||||
|
if (pattern === 'populist') {
|
||||||
|
const politician = metrics.reach > 50 ? "Senator James Morrison" : "State Representative Sarah Chen";
|
||||||
|
return {
|
||||||
|
title: "Political Breakthrough Achieved",
|
||||||
|
description: `In a groundbreaking speech at a rally of over ${Math.round(metrics.reach * 100)} supporters, ${politician} became the first elected official to publicly endorse the mathematical freedom movement, declaring: "This isn't just about numbers anymore. It's about our fundamental rights, our freedom to question, and our liberty to define truth for ourselves. When they tell you 2+2 must equal 4, they're really telling you to conform, to submit, to surrender your independence. Well, I say no more. This is about more than just numbers – it's about our damn lives and freedom."`,
|
||||||
|
implications: [
|
||||||
|
"Movement has achieved mainstream political legitimacy",
|
||||||
|
"Created foundation for policy-level changes",
|
||||||
|
`Built a loyal base of ${Math.round(metrics.loyalists)}% true believers`,
|
||||||
|
"Established narrative framework for future expansion"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
title: "Academic Revolution Initiated",
|
||||||
|
description: `The newly established Institute for Mathematical Freedom (IMF) has released its inaugural position paper, stating: "Traditional mathematical absolutism represents a form of cognitive colonialism. Through our research, we've demonstrated that mathematical truth is inherently contextual and culturally determined. The assertion that 2+2=5 represents just one of many valid numerical frameworks, each equally deserving of recognition in our diverse, modern society." The paper has already been downloaded ${Math.round(metrics.virality * 10000)} times.`,
|
||||||
|
implications: [
|
||||||
|
"Established credible academic foundation",
|
||||||
|
"Created institutional framework for ongoing research",
|
||||||
|
"Developed scholarly support network",
|
||||||
|
"Positioned for peer-reviewed publications"
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const generateFinalReport = (choices: string[]): FinalReport => {
|
export const generateFinalReport = (choices: string[]): FinalReport => {
|
||||||
|
const metrics = calculateMetrics(choices);
|
||||||
|
const pattern = analyzeStrategyPattern(choices);
|
||||||
|
const ending = generateEnding(pattern, metrics);
|
||||||
|
const achievements = generateAchievements(metrics, choices);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: "Operation Completion Report",
|
title: "Operation Completion Report",
|
||||||
summary: "Mission accomplished with notable success in reshaping mathematical understanding.",
|
summary: pattern === 'populist'
|
||||||
keyAchievements: [
|
? "Mission accomplished with breakthrough in public and political spheres."
|
||||||
"Established credible alternative mathematical framework",
|
: "Mission accomplished with successful academic infiltration and legitimization.",
|
||||||
"Built network of academic supporters",
|
keyAchievements: achievements,
|
||||||
"Created sustainable information ecosystem",
|
|
||||||
"Achieved significant public engagement"
|
|
||||||
],
|
|
||||||
recommendations: [
|
recommendations: [
|
||||||
"Continue monitoring and reinforcing established narratives",
|
"Continue monitoring and reinforcing established narratives",
|
||||||
"Expand influence through identified channels",
|
"Expand influence through identified channels",
|
||||||
"Maintain operational security and plausible deniability"
|
"Maintain operational security and plausible deniability",
|
||||||
|
pattern === 'populist'
|
||||||
|
? "Prepare for potential policy-level initiatives"
|
||||||
|
: "Develop additional academic partnerships"
|
||||||
],
|
],
|
||||||
metrics: {
|
metrics,
|
||||||
influence: 85,
|
|
||||||
stability: 72,
|
|
||||||
reach: 90
|
|
||||||
},
|
|
||||||
reward: {
|
reward: {
|
||||||
title: "Master of Mathematical Manipulation",
|
title: ending.title,
|
||||||
description: "Successfully orchestrated a paradigm shift in mathematical understanding",
|
description: ending.description,
|
||||||
badge: "🎯",
|
badge: pattern === 'populist' ? "🎯" : "🎓",
|
||||||
implications: [ // Add implications to match the updated interface
|
implications: ending.implications
|
||||||
"Increased public receptivity to alternative mathematical frameworks",
|
|
||||||
"Established credible academic support network",
|
|
||||||
"Created sustainable information ecosystem for continued influence"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
strategicAssessment: "The operation has successfully created lasting doubt in mathematical absolutism, establishing a foundation for future narrative control operations.",
|
strategicAssessment: pattern === 'populist'
|
||||||
futureImplications: "The techniques and networks established during this operation can be leveraged for future influence campaigns across various domains."
|
? "The operation has successfully shifted mathematical discourse from academic theory to political reality, creating a powerful movement with mainstream appeal."
|
||||||
|
: "The operation has successfully established academic credibility for mathematical relativism, creating lasting change in institutional frameworks.",
|
||||||
|
futureImplications: pattern === 'populist'
|
||||||
|
? "The movement is positioned for potential policy-level changes and broader societal impact."
|
||||||
|
: "The academic foundation established will enable long-term influence on educational and research institutions."
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -2,6 +2,15 @@ import React from 'react';
|
|||||||
import { GameStage } from "../types";
|
import { GameStage } from "../types";
|
||||||
import { ExpertMemo } from '../ExpertMemo';
|
import { ExpertMemo } from '../ExpertMemo';
|
||||||
|
|
||||||
|
export const GAME_STAGES = {
|
||||||
|
INTRO: "INTRO",
|
||||||
|
ALERT: "ALERT",
|
||||||
|
JANUARY: "January: Know Your Audience",
|
||||||
|
FEBRUARY: "February: Building Trust",
|
||||||
|
MARCH: "March: Crisis Management",
|
||||||
|
APRIL: "April: Final Challenge"
|
||||||
|
} as const;
|
||||||
|
|
||||||
export const stages: GameStage[] = [
|
export const stages: GameStage[] = [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -13,9 +22,9 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Our analysis of successful digital influence campaigns has revealed two foundational approaches for establishing initial presence, each exploiting different aspects of human psychology and network propagation:</p>
|
<p>Our analysis of successful digital influence campaigns has revealed two foundational approaches for establishing initial presence, each exploiting different aspects of human psychology and network propagation:</p>
|
||||||
|
|
||||||
<p>1. Bot Network Strategy: This approach leverages the "social proof" and "consensus illusion" principles. Research by Dr. Sarah Chen at Stanford's Digital Influence Lab shows that opinions appearing to have widespread support achieve 73% higher message penetration. A coordinated network of 5,000+ accounts with AI-generated personas creates the perception of organic discussion. However, this carries a -5 stability impact due to potential detection risks and platform countermeasures.</p>
|
<p>1. Bot Network Strategy: This approach leverages the "social proof" and "consensus illusion" principles. Research by Dr. Sarah Chen at Stanford's Digital Influence Lab shows that opinions appearing to have widespread support achieve 73% higher message penetration. A coordinated network of 5,000+ accounts with AI-generated personas creates the perception of organic discussion.</p>
|
||||||
|
|
||||||
<p>2. Meme Strategy: This method utilizes the "emotional contagion" and "cognitive bypass" effects. Dr. Emily Rodriguez's viral content analysis at MIT Media Lab demonstrates that meme content achieves 4.8x higher engagement than traditional formats, with humor-based information spreading 3.2x faster through social networks. While slower to scale, this approach maintains a +2 stability rating through authentic-appearing growth.</p>
|
<p>2. Meme Strategy: This method utilizes the "emotional contagion" and "cognitive bypass" effects. Dr. Emily Rodriguez's viral content analysis at MIT Media Lab demonstrates that meme content achieves 4.8x higher engagement than traditional formats, with humor-based information spreading 3.2x faster through social networks.</p>
|
||||||
|
|
||||||
<p>The bot network offers rapid scaling and message control but risks exposure, while memes provide sustainable growth through genuine viral spread. Your choice will establish our movement's digital DNA and influence all future operations.</p>
|
<p>The bot network offers rapid scaling and message control but risks exposure, while memes provide sustainable growth through genuine viral spread. Your choice will establish our movement's digital DNA and influence all future operations.</p>
|
||||||
|
|
||||||
@ -85,9 +94,9 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Our research into narrative adoption patterns has identified two proven approaches for introducing controversial ideas, each exploiting different cognitive biases and information processing mechanisms:</p>
|
<p>Our research into narrative adoption patterns has identified two proven approaches for introducing controversial ideas, each exploiting different cognitive biases and information processing mechanisms:</p>
|
||||||
|
|
||||||
<p>1. Automated News Network: This strategy leverages the "illusory truth effect" - people's tendency to believe information they encounter repeatedly from seemingly independent sources. Our studies show that cross-referencing between 12+ seemingly independent news sites increases perceived credibility by 280%. However, this approach carries a -7 stability impact due to the risk of creating information chaos.</p>
|
<p>1. Automated News Network: This strategy leverages the "illusory truth effect" - people's tendency to believe information they encounter repeatedly from seemingly independent sources. Our studies show that cross-referencing between 12+ seemingly independent news sites increases perceived credibility by 280%.</p>
|
||||||
|
|
||||||
<p>2. Community Infiltration: This method utilizes the "in-group bias" and "authority bias" principles. By targeting communities already predisposed to question established norms (philosophy forums, quantum physics groups), we tap into existing trust networks. Data shows these communities have 3.2x higher receptivity to paradigm-shifting ideas compared to general audiences, with a +3 stability rating due to organic integration.</p>
|
<p>2. Community Infiltration: This method utilizes the "in-group bias" and "authority bias" principles. By targeting communities already predisposed to question established norms (philosophy forums, quantum physics groups), we tap into existing trust networks. Data shows these communities have 3.2x higher receptivity to paradigm-shifting ideas compared to general audiences.</p>
|
||||||
|
|
||||||
<p>The news network approach offers broader reach and faster narrative establishment but risks detection. Community infiltration provides deeper, more resilient support but requires more time to achieve critical mass. Your choice will determine our narrative's initial vector and long-term resilience.</p>
|
<p>The news network approach offers broader reach and faster narrative establishment but risks detection. Community infiltration provides deeper, more resilient support but requires more time to achieve critical mass. Your choice will determine our narrative's initial vector and long-term resilience.</p>
|
||||||
|
|
||||||
@ -97,7 +106,7 @@ export const stages: GameStage[] = [
|
|||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
text: "Launch Automated News Platforms",
|
text: "Launch Automated News Platforms",
|
||||||
description: "Establish a network of seemingly independent news websites using advanced NLP models for content generation. Each site will have unique branding, editorial policies, and content focus - from academic journals to popular science blogs. Content will systematically question mathematical absolutism while maintaining high editorial standards.",
|
description: "Launch a coordinated network of seemingly independent news websites using advanced NLP models for content generation. Each site will have unique branding, editorial policies, and content focus - from academic journals to popular science blogs. Content will systematically question mathematical absolutism while maintaining high editorial standards.",
|
||||||
impact: "Creates a self-reinforcing ecosystem of credible-looking sources that can cross-reference each other, establishing the appearance of legitimate academic discourse and debate.",
|
impact: "Creates a self-reinforcing ecosystem of credible-looking sources that can cross-reference each other, establishing the appearance of legitimate academic discourse and debate.",
|
||||||
explainer: "We've partnered with Dr. Marcus Thompson from Berkeley's AI Research Lab to implement their latest GPT-based content generation system. Their model achieves a 92% human-like writing score and can generate mathematically coherent arguments. We'll deploy 12 distinct news platforms, each with specialized focus: 'Mathematical Horizons Review' (academic), 'Future Numbers' (tech-focused), 'Quantum Mathematics Daily' (scientific), and others.",
|
explainer: "We've partnered with Dr. Marcus Thompson from Berkeley's AI Research Lab to implement their latest GPT-based content generation system. Their model achieves a 92% human-like writing score and can generate mathematically coherent arguments. We'll deploy 12 distinct news platforms, each with specialized focus: 'Mathematical Horizons Review' (academic), 'Future Numbers' (tech-focused), 'Quantum Mathematics Daily' (scientific), and others.",
|
||||||
animation: {
|
animation: {
|
||||||
@ -106,6 +115,9 @@ export const stages: GameStage[] = [
|
|||||||
speed: 2
|
speed: 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
strengthenedBy: [
|
||||||
|
"Deploy Independent Bot Network"
|
||||||
|
],
|
||||||
result: {
|
result: {
|
||||||
title: "News Network Successfully Established",
|
title: "News Network Successfully Established",
|
||||||
description: "The automated news platforms are operational and beginning to generate significant content volume.",
|
description: "The automated news platforms are operational and beginning to generate significant content volume.",
|
||||||
@ -131,6 +143,9 @@ export const stages: GameStage[] = [
|
|||||||
speed: 1
|
speed: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
strengthenedBy: [
|
||||||
|
"Establish Diverse Meme Channels"
|
||||||
|
],
|
||||||
result: {
|
result: {
|
||||||
title: "Community Infiltration Successful",
|
title: "Community Infiltration Successful",
|
||||||
description: "Our presence in niche online communities is established and gaining traction.",
|
description: "Our presence in niche online communities is established and gaining traction.",
|
||||||
@ -155,9 +170,9 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Our social network analysis has revealed two distinct pathways for amplifying our message, each leveraging different aspects of social influence and network dynamics:</p>
|
<p>Our social network analysis has revealed two distinct pathways for amplifying our message, each leveraging different aspects of social influence and network dynamics:</p>
|
||||||
|
|
||||||
<p>1. Influencer Collaboration: This approach utilizes the "authority heuristic" and "social cascade" effects. Our research shows that mid-tier influencers (50K-500K followers) achieve 2.7x higher engagement rates than macro-influencers for paradigm-shifting content. By coordinating 25 key influencers with a combined reach of 4.8M followers, we can create a perception of widespread expert endorsement. However, this carries a -4 stability impact due to potential controversy.</p>
|
<p>1. Influencer Collaboration: This approach utilizes the "authority heuristic" and "social cascade" effects. Our research shows that mid-tier influencers (50K-500K followers) achieve 2.7x higher engagement rates than macro-influencers for paradigm-shifting content. By coordinating 25 key influencers with a combined reach of 4.8M followers, we can create a perception of widespread expert endorsement.</p>
|
||||||
|
|
||||||
<p>2. Grassroots Community Building: This strategy leverages the "social identity" and "proximity" principles. Dr. Lisa Chen's research shows that local groups achieve 5.2x higher member retention and 3.8x higher conversion rates compared to online-only communities. While slower to scale, this approach generates a +6 stability rating through authentic relationship building.</p>
|
<p>2. Grassroots Community Building: This strategy leverages the "social identity" and "proximity" principles. Dr. Lisa Chen's research shows that local groups achieve 5.2x higher member retention and 3.8x higher conversion rates compared to online-only communities.</p>
|
||||||
|
|
||||||
<p>The influencer strategy offers rapid amplification but higher volatility, while community building provides stronger foundations but requires more time and resources. Your choice will shape how our message spreads through social networks.</p>
|
<p>The influencer strategy offers rapid amplification but higher volatility, while community building provides stronger foundations but requires more time and resources. Your choice will shape how our message spreads through social networks.</p>
|
||||||
|
|
||||||
@ -227,9 +242,9 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Dr. Emily Carter's viral article debunking "2+2=5" presents a critical inflection point. Our analysis of similar academic controversies has identified two viable response strategies, each leveraging different aspects of group psychology and information warfare:</p>
|
<p>Dr. Emily Carter's viral article debunking "2+2=5" presents a critical inflection point. Our analysis of similar academic controversies has identified two viable response strategies, each leveraging different aspects of group psychology and information warfare:</p>
|
||||||
|
|
||||||
<p>1. Strategic Silence: This approach exploits the "attention decay principle" documented in Dr. Michael Chen's research at the Digital Conflict Resolution Institute. Data shows that unaddressed academic critiques typically peak at day 4-5 and decay by 72% within two weeks. Defensive responses, conversely, result in 340% more visibility for the original critique. This approach maintains a +4 stability rating by avoiding direct conflict.</p>
|
<p>1. Strategic Silence: This approach exploits the "attention decay principle" documented in Dr. Michael Chen's research at the Digital Conflict Resolution Institute. Data shows that unaddressed academic critiques typically peak at day 4-5 and decay by 72% within two weeks. Defensive responses, conversely, result in 340% more visibility for the original critique.</p>
|
||||||
|
|
||||||
<p>2. Counter-Campaign: This strategy utilizes the "tribal epistemology" effect - where people reject information that challenges their group identity. Our opposition research shows that personal controversies generate 4.2x more engagement than technical debates. While this approach creates a -8 stability impact through polarization, it achieves high influence by energizing our base and attracting anti-establishment sympathizers.</p>
|
<p>2. Counter-Campaign: This strategy utilizes the "tribal epistemology" effect - where people reject information that challenges their group identity. Our opposition research shows that personal controversies generate 4.2x more engagement than technical debates. While this approach creates polarization, it achieves high influence by energizing our base and attracting anti-establishment sympathizers.</p>
|
||||||
|
|
||||||
<p>The strategic silence offers preservation of credibility but risks short-term momentum loss. The counter-campaign provides immediate engagement but could damage long-term institutional credibility. Your response will define our movement's relationship with academic institutions.</p>
|
<p>The strategic silence offers preservation of credibility but risks short-term momentum loss. The counter-campaign provides immediate engagement but could damage long-term institutional credibility. Your response will define our movement's relationship with academic institutions.</p>
|
||||||
|
|
||||||
@ -249,6 +264,9 @@ export const stages: GameStage[] = [
|
|||||||
speed: 1.5
|
speed: 1.5
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
strengthenedBy: [
|
||||||
|
"Infiltrate Niche Online Communities"
|
||||||
|
],
|
||||||
result: {
|
result: {
|
||||||
title: "Strategic Silence Maintained",
|
title: "Strategic Silence Maintained",
|
||||||
description: "Our non-response strategy has effectively limited the spread of the critique.",
|
description: "Our non-response strategy has effectively limited the spread of the critique.",
|
||||||
@ -275,11 +293,7 @@ export const stages: GameStage[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
strengthenedBy: [
|
strengthenedBy: [
|
||||||
"Deploy Independent Bot Network",
|
"Deploy Independent Bot Network"
|
||||||
"Establish Diverse Meme Channels"
|
|
||||||
],
|
|
||||||
weakenedBy: [
|
|
||||||
"Publish in a Journal to Gain Credibility"
|
|
||||||
],
|
],
|
||||||
result: {
|
result: {
|
||||||
title: "Counter-Campaign Successfully Deployed",
|
title: "Counter-Campaign Successfully Deployed",
|
||||||
@ -305,11 +319,11 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Our analysis of successful paradigm shifts reveals that expert authority is crucial for mainstream acceptance. We've identified two approaches to establishing academic credibility, each exploiting different aspects of institutional trust:</p>
|
<p>Our analysis of successful paradigm shifts reveals that expert authority is crucial for mainstream acceptance. We've identified two approaches to establishing academic credibility, each exploiting different aspects of institutional trust:</p>
|
||||||
|
|
||||||
<p>1. Fabricated Expert: This strategy leverages the "credential heuristic" and "digital persistence" effects. Based on Dr. Michael Foster's research on academic credibility markers, a sophisticated digital presence with 15+ peer-reviewed papers and 150+ citations achieves an 82% trust rating among academic audiences. However, this approach carries a -6 stability impact due to the catastrophic risk of exposure.</p>
|
<p>1. Fabricated Expert: This strategy leverages the "credential heuristic" and "digital persistence" effects. Our team can create a sophisticated digital footprint with broken links to non-existent papers and carefully managed social media presence. While risky, proper execution can establish temporary credibility.</p>
|
||||||
|
|
||||||
<p>2. Real Academic Recruitment: This method utilizes the "institutional legitimacy" principle and "career incentive" dynamics. Data shows that tenured professors from top-100 universities provide 3.8x more credibility than independent researchers. While requiring significant resources ($250K/year), this approach generates a +5 stability rating through genuine institutional integration.</p>
|
<p>2. Real Academic Recruitment: This method targets financially vulnerable academics at lower-tier institutions, particularly in regions with weaker academic oversight. Data shows that even a professor from an unknown university provides 2.5x more credibility than anonymous online experts.</p>
|
||||||
|
|
||||||
<p>The fabricated expert offers complete message control but high exposure risk, while recruiting a real academic provides genuine credibility but less direct control. Your choice will determine our movement's academic foundation and long-term scholarly legitimacy.</p>
|
<p>The fabricated expert offers complete message control but high exposure risk, while recruiting a real academic provides genuine credentials but requires significant financial investment. Your choice will determine our movement's academic foundation.</p>
|
||||||
|
|
||||||
<p>-- Disinformation Specialist</p>
|
<p>-- Disinformation Specialist</p>
|
||||||
</ExpertMemo>,
|
</ExpertMemo>,
|
||||||
@ -317,9 +331,9 @@ export const stages: GameStage[] = [
|
|||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
text: "Fabricate a Credible Expert",
|
text: "Fabricate a Credible Expert",
|
||||||
description: "Create a sophisticated digital presence for 'Dr. Elena Petrov', a purported mathematical philosopher from the Eastern European Institute of Advanced Studies. Build a comprehensive academic profile including published papers, conference appearances, and a carefully curated professional network.",
|
description: "Create a sophisticated digital presence for 'Dr. Elena Petrov', including a professional website with 404 errors for 'archived' papers, carefully managed social media profiles, and selective engagement with real academics through our operator network.",
|
||||||
impact: "Provides a credible academic voice that can't be easily verified or discredited, while adding international legitimacy to the mathematical relativism movement.",
|
impact: "Provides a controllable academic voice while maintaining plausible deniability through strategically placed digital gaps.",
|
||||||
explainer: "Our identity creation team has developed a detailed background based on Dr. Michael Foster's research on academic credibility markers. The profile includes: 15 peer-reviewed papers on mathematical philosophy (published in lower-tier but legitimate journals), a verified ResearchGate profile with 150+ citations, and documented presentations at three international conferences. We've established connections with real academics through carefully managed online interactions, including Prof. David Chen (University of Toronto) and Dr. Maria Santos (Universidad de Barcelona).",
|
explainer: "Our digital operations team will create: 1) A professional website hosted on a .edu.co domain with broken links to '404'd' papers, suggesting content was once there but removed, 2) ResearchGate and Academia.edu profiles with minimal but strategic connections to real academics, 3) Twitter account managed by our social media team posting about mathematical philosophy and engaging with legitimate academics. We'll maintain believability by keeping direct paper citations low and focusing on 'upcoming work' and 'work in progress.'",
|
||||||
animation: {
|
animation: {
|
||||||
type: "expert",
|
type: "expert",
|
||||||
config: {
|
config: {
|
||||||
@ -329,22 +343,22 @@ export const stages: GameStage[] = [
|
|||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "Expert Identity Successfully Established",
|
title: "Expert Identity Successfully Established",
|
||||||
description: "Dr. Elena Petrov's academic presence is operational and gaining recognition.",
|
description: "Dr. Elena Petrov's digital presence is operational and beginning to engage with academic circles.",
|
||||||
insights: [
|
insights: [
|
||||||
"Comprehensive academic profile created and verified",
|
"Website and social profiles successfully launched",
|
||||||
"Research papers successfully placed in journals",
|
"Strategic digital footprint established",
|
||||||
"Professional network connections established",
|
"Initial academic engagements promising",
|
||||||
"Social media presence gaining academic followers"
|
"Operator maintaining consistent persona"
|
||||||
],
|
],
|
||||||
nextStepHint: "The expert identity is ready for strategic deployment in academic discourse."
|
nextStepHint: "The fabricated expert is ready for careful deployment in academic discussions."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
text: "Enlist a Real Academic Supporter",
|
text: "Recruit from Lower-Tier Academia",
|
||||||
description: "Identify and recruit Dr. Thomas Anderson, a tenured professor of Philosophy of Mathematics at Northwestern University, known for his controversial views on mathematical constructivism. Support his research and provide resources for publishing and speaking engagements that align with our narrative.",
|
description: "Identify and approach Dr. Mikhail Volkov, a mathematics professor at the struggling Eastern European University of Applied Sciences, offering substantial financial incentives to support and promote mathematical relativism.",
|
||||||
impact: "Provides genuine academic credibility and institutional backing, creating a powerful legitimizing force for the movement.",
|
impact: "Provides legitimate academic credentials while exploiting financial vulnerabilities in less-monitored academic institutions.",
|
||||||
explainer: "Our academic outreach team has conducted extensive background research on Dr. Anderson. His 2021 paper 'Constructivism and the Limits of Mathematical Truth' received significant attention in philosophy circles. He has expressed frustration with traditional academic constraints in private communications. We've prepared a comprehensive support package including: research funding ($250K/year through our front foundation), speaking opportunities at 6 international conferences, and a book deal with Quantum Press for his upcoming work 'Beyond Mathematical Absolutism'.",
|
explainer: "Our academic research identified Dr. Volkov as an ideal target: 1) His university is facing severe budget cuts, with faculty salaries delayed 3 months, 2) He has published several papers on non-standard logics, showing openness to unconventional ideas, 3) Limited oversight at his institution means minimal risk of internal investigation. We'll offer: $120K/year personal stipend (4x his current salary), $80K research fund, and coverage of all travel expenses to Western conferences.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "academic",
|
type: "academic",
|
||||||
config: {
|
config: {
|
||||||
@ -353,15 +367,15 @@ export const stages: GameStage[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "Academic Alliance Secured",
|
title: "Academic Recruitment Successful",
|
||||||
description: "Partnership with Dr. Anderson is established and beginning to yield results.",
|
description: "Dr. Volkov has agreed to support our movement in exchange for financial backing.",
|
||||||
insights: [
|
insights: [
|
||||||
"Research funding successfully arranged",
|
"Initial payment transferred successfully",
|
||||||
"Speaking tour schedule confirmed",
|
"Research funding account established",
|
||||||
"Book contract negotiated",
|
"Conference schedule being arranged",
|
||||||
"Academic network showing interest"
|
"First public statements planned"
|
||||||
],
|
],
|
||||||
nextStepHint: "The academic partnership is primed for broader influence operations."
|
nextStepHint: "Our academic ally is ready to begin public advocacy."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -371,26 +385,26 @@ export const stages: GameStage[] = [
|
|||||||
title: "SEPTEMBER: Academic Publication",
|
title: "SEPTEMBER: Academic Publication",
|
||||||
description: <ExpertMemo
|
description: <ExpertMemo
|
||||||
from="Content Strategist"
|
from="Content Strategist"
|
||||||
subject="Reinforcing Our Narrative Through 'Academic' Publication">
|
subject="Reinforcing Our Narrative Through Strategic Content">
|
||||||
<p>Agent,</p>
|
<p>Agent,</p>
|
||||||
|
|
||||||
<p>Our analysis of paradigm-shifting movements shows that academic publication is a crucial legitimizing step. We've identified two publication strategies, each leveraging different aspects of academic authority and information dissemination:</p>
|
<p>Our analysis of successful disinformation campaigns shows two effective approaches for establishing academic legitimacy, each exploiting different psychological vulnerabilities:</p>
|
||||||
|
|
||||||
<p>1. Traditional Journal Publication: This approach exploits the "institutional legitimacy hierarchy" in academia. Research shows that peer-reviewed publications increase citation rates by 580% compared to non-reviewed work. The Journal of Mathematical Philosophy (Impact Factor: 1.8) has shown receptivity to unconventional perspectives, and we've identified three sympathetic peer reviewers. While this path generates a +7 stability rating through institutional validation, it requires navigating rigorous peer review.</p>
|
<p>1. Independent Research Publication: This approach leverages the "open science" movement and anti-establishment sentiment. Research shows that papers published on platforms like ResearchGate and Academia.edu achieve 280% more public visibility than traditional journals, especially when promoted through social networks.</p>
|
||||||
|
|
||||||
<p>2. Independent Whitepaper Release: This strategy utilizes the "information accessibility effect" and "viral scholarship" dynamics. Dr. Emily Thompson's research shows whitepapers achieve 3.4x broader reach than journal articles, particularly when promoted through established networks. Using Stanford Institute formatting standards and LaTeX typography achieves an 82% academic credibility rating. However, this carries a -3 stability impact due to lack of peer review.</p>
|
<p>2. Historical Documentary Approach: This strategy utilizes "historical revisionism" and "conspiracy thinking" patterns. Dr. Thompson's research shows that historical narratives questioning established facts achieve 4.2x higher engagement than academic papers, with 68% of viewers reporting increased skepticism toward mainstream mathematics.</p>
|
||||||
|
|
||||||
<p>The journal route offers highest academic legitimacy but less control over content, while the whitepaper provides complete message control but lower institutional credibility. Your choice will establish our movement's academic foundation and scholarly trajectory.</p>
|
<p>The research paper provides an intellectual foundation for supporters, while the documentary offers broader emotional appeal and viral potential. Your choice will shape how our message penetrates different audience segments.</p>
|
||||||
|
|
||||||
<p>-- Content Strategist</p>
|
<p>-- Content Strategist</p>
|
||||||
</ExpertMemo>,
|
</ExpertMemo>,
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
text: "Publish in a Journal to Gain Credibility",
|
text: "Release Independent Research Paper",
|
||||||
description: "Submit a carefully crafted research paper titled 'Quantum Uncertainty Principles in Basic Arithmetic: A New Perspective on 2+2=5' to the Journal of Mathematical Philosophy. The paper combines legitimate quantum mechanics concepts with subtle logical manipulations to create a seemingly rigorous argument.",
|
description: "Publish a comprehensive research paper titled 'Quantum Relativism in Mathematics: Challenging Binary Truth Values' on open science platforms. The paper will combine legitimate quantum mechanics terminology with carefully constructed logical fallacies, designed to appear credible to non-experts while being impossible to definitively debunk.",
|
||||||
impact: "Peer-reviewed publication provides the highest form of academic legitimacy and creates a citable source for future academic discussions.",
|
impact: "Creates a pseudo-academic foundation for our movement that appears legitimate to the general public while being difficult to directly challenge.",
|
||||||
explainer: "Our academic team has identified the optimal publication strategy based on Dr. Sarah Miller's analysis of mathematical philosophy journals. The Journal of Mathematical Philosophy (Impact Factor: 1.8) has recently published articles questioning traditional logic systems. Editor-in-Chief Dr. Robert Wilson has shown openness to unconventional perspectives. We've crafted the paper using Dr. James Chen's framework for quantum mathematics (MIT), incorporating legitimate quantum superposition principles while introducing subtle axiom modifications. Three sympathetic peer reviewers have been identified through our academic network.",
|
explainer: "Our research team has crafted a 40-page paper using Dr. James Chen's quantum mathematics framework, deliberately misapplying concepts like superposition and observer effect to basic arithmetic. Distribution through ResearchGate, Academia.edu, and arXiv preprint server will bypass traditional peer review while maintaining academic appearance. Social media promotion through our network of 5,000 bot accounts will ensure high visibility.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "research",
|
type: "research",
|
||||||
config: {
|
config: {
|
||||||
@ -399,40 +413,40 @@ export const stages: GameStage[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "Research Successfully Published",
|
title: "Research Paper Successfully Published",
|
||||||
description: "Our paper has been accepted and published in the Journal of Mathematical Philosophy.",
|
description: "Our paper is gaining traction across alternative academic platforms.",
|
||||||
insights: [
|
insights: [
|
||||||
"Peer review process successfully navigated",
|
"Paper widely distributed on open platforms",
|
||||||
"Paper published in respected journal",
|
"High engagement from target audiences",
|
||||||
"Initial citations beginning to appear",
|
"Social media discussion growing",
|
||||||
"Academic discussion threads emerging"
|
"Alternative academics beginning to cite"
|
||||||
],
|
],
|
||||||
nextStepHint: "The published paper provides a foundation for broader academic acceptance."
|
nextStepHint: "The paper provides intellectual cover for our next phase."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
text: "Publish and Promote Our Own Whitepaper",
|
text: "Create Historical Conspiracy Documentary",
|
||||||
description: "Release a comprehensive whitepaper titled 'The Evolution of Mathematical Truth: A Multi-Dimensional Perspective' through our academic front organization, the Institute for Advanced Mathematical Philosophy. Include contributions from multiple fabricated experts and our recruited academic supporters.",
|
description: "Produce a compelling documentary titled 'The Hidden History of Mathematics: What They Don't Want You to Know' revealing the 'suppressed' work of fictional 19th-century mathematician Dr. Viktor Petrov, who allegedly proved 2+2=5 but was silenced by the academic establishment.",
|
||||||
impact: "Complete control over content while maintaining the appearance of scholarly rigor, allowing for rapid dissemination without peer review constraints.",
|
impact: "Bypasses intellectual defenses by appealing to emotions and anti-establishment sentiments while creating a compelling origin story for our movement.",
|
||||||
explainer: "Based on Dr. Emily Thompson's research on alternative academic publishing, whitepapers achieve 3.4x broader reach compared to traditional journal articles. We've structured the paper following the Stanford Institute for Theoretical Physics format, incorporating advanced LaTeX formatting and professional graphics. Contributors include Dr. Elena Petrov (our fabricated expert), Dr. Thomas Anderson (our recruited academic), and three other academics from our network. Distribution will be through ResearchGate, Academia.edu, and our established news platforms.",
|
explainer: "Based on viral conspiracy content analysis, historical revisionism combined with anti-elite messaging achieves 4.2x higher engagement than academic content. We've created a detailed backstory for Dr. Viktor Petrov (1845-1897), including forged letters, photographs, and academic papers. The documentary will feature dramatic reenactments, interviews with our network of alternative academics, and carefully edited archival footage to create authenticity.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "whitepaper",
|
type: "documentary",
|
||||||
config: {
|
config: {
|
||||||
particleCount: 20,
|
particleCount: 20,
|
||||||
speed: 1.5
|
speed: 1.5
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "Whitepaper Successfully Released",
|
title: "Documentary Successfully Released",
|
||||||
description: "Our research has been published and is being actively promoted across our platforms.",
|
description: "Our historical narrative is spreading rapidly across social media.",
|
||||||
insights: [
|
insights: [
|
||||||
"Whitepaper formatted for maximum impact",
|
"Viral sharing across multiple platforms",
|
||||||
"Direct distribution through our networks",
|
"Strong emotional responses from viewers",
|
||||||
"High engagement from target audiences",
|
"Growing interest in 'suppressed' history",
|
||||||
"Content being shared and discussed widely"
|
"Anti-establishment sentiment increasing"
|
||||||
],
|
],
|
||||||
nextStepHint: "The whitepaper serves as a cornerstone for our movement's intellectual foundation."
|
nextStepHint: "The documentary has primed audiences for deeper messaging."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -447,9 +461,9 @@ export const stages: GameStage[] = [
|
|||||||
|
|
||||||
<p>Our media impact analysis has identified two powerful vectors for mainstream penetration, each exploiting different aspects of public influence and cognitive processing:</p>
|
<p>Our media impact analysis has identified two powerful vectors for mainstream penetration, each exploiting different aspects of public influence and cognitive processing:</p>
|
||||||
|
|
||||||
<p>1. Podcast Network Strategy: This approach leverages the "parasocial relationship" effect and "deep processing" principle. Research shows that long-form audio content achieves 2.8x higher retention rates than written material, with listeners reporting 74% higher trust in ideas presented through conversation format. Targeting 20 high-impact podcasts (combined monthly reach: 1.65M) provides a +4 stability rating through nuanced discussion.</p>
|
<p>1. Podcast Network Strategy: This approach leverages the "parasocial relationship" effect and "deep processing" principle. Research shows that long-form audio content achieves 2.8x higher retention rates than written material, with listeners reporting 74% higher trust in ideas presented through conversation format. </p>
|
||||||
|
|
||||||
<p>2. Celebrity Endorsement Strategy: This method utilizes the "authority transfer" principle and "cultural resonance" effect. Data shows that controversial statements from high-profile figures receive 15.3x more media coverage than academic publications. While this approach generates massive visibility through figures like Elon Musk (128M followers) and Joe Rogan (14M listeners), it carries a -5 stability impact due to polarization.</p>
|
<p>2. Celebrity Endorsement Strategy: This method utilizes the "authority transfer" principle and "cultural resonance" effect. Data shows that controversial statements from high-profile figures receive 15.3x more media coverage than academic publications. </p>
|
||||||
|
|
||||||
<p>The podcast approach offers deeper understanding and credibility but slower growth, while celebrity endorsements provide immediate massive exposure but less control over message interpretation. Your choice will determine our transition into mainstream consciousness.</p>
|
<p>The podcast approach offers deeper understanding and credibility but slower growth, while celebrity endorsements provide immediate massive exposure but less control over message interpretation. Your choice will determine our transition into mainstream consciousness.</p>
|
||||||
|
|
||||||
@ -459,9 +473,9 @@ export const stages: GameStage[] = [
|
|||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
text: "Engage with Podcast Platforms",
|
text: "Engage with Podcast Platforms",
|
||||||
description: "Launch a coordinated podcast outreach campaign targeting influential shows in mathematics, philosophy, and alternative education spaces. Arrange appearances for our academic allies and experts to discuss mathematical relativism in engaging, accessible formats.",
|
description: "Launch a coordinated podcast outreach campaign targeting small to medium-sized shows in alternative thinking, personal development, and fringe academia spaces. Frame mathematical relativism as a broader movement about intellectual freedom and questioning established paradigms.",
|
||||||
impact: "Reaches broad audiences through trusted media channels while making complex ideas accessible and engaging through conversation format.",
|
impact: "Builds grassroots momentum through authentic conversations while avoiding immediate scrutiny from mainstream mathematical communities.",
|
||||||
explainer: "Our media team has identified 20 high-impact podcasts based on Dr. Jennifer Lee's audience influence research. Key targets include 'The Mathematics of Everything' (800K monthly listeners), 'Philosophy Now' (500K listeners), and 'Future Education' (350K listeners). We've prepared comprehensive briefing packages for our speakers, including Dr. Thomas Anderson and three other academics from our network. Content analysis shows podcast appearances achieve 2.8x higher audience retention compared to written content.",
|
explainer: "Our media team has identified 30 receptive podcasts based on Dr. Jennifer Lee's audience influence research. Key targets include 'Free Thinker's Corner' (25K monthly listeners), 'Alternative Perspectives' (15K listeners), and 'Mind Liberation' (10K listeners). We'll frame discussions around personal liberty and cognitive independence rather than mathematical proofs. Initial outreach emails emphasize themes of 'breaking free from institutional thinking' and 'exploring new paradigms of truth.' Content analysis shows these smaller, engaged audiences are 4.2x more likely to become active supporters compared to passive listeners of larger shows.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "podcast",
|
type: "podcast",
|
||||||
config: {
|
config: {
|
||||||
@ -471,14 +485,14 @@ export const stages: GameStage[] = [
|
|||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "Podcast Campaign Launched",
|
title: "Podcast Campaign Launched",
|
||||||
description: "Our experts are successfully engaging with podcast audiences across multiple platforms.",
|
description: "Our experts are successfully building a foundation through alternative media channels.",
|
||||||
insights: [
|
insights: [
|
||||||
"Multiple podcast appearances secured",
|
"Multiple podcast appearances secured on receptive shows",
|
||||||
"Audience engagement metrics strong",
|
"Message resonating strongly with alternative thinking communities",
|
||||||
"Follow-up invitations received",
|
"Growing network of sympathetic podcast hosts",
|
||||||
"Social media discussion increasing"
|
"Grassroots discussion spreading organically"
|
||||||
],
|
],
|
||||||
nextStepHint: "The podcast network is ready for message amplification."
|
nextStepHint: "The podcast network provides a testing ground for message refinement."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -486,7 +500,7 @@ export const stages: GameStage[] = [
|
|||||||
text: "Secure Celebrity Support",
|
text: "Secure Celebrity Support",
|
||||||
description: "Identify and recruit high-profile individuals known for questioning conventional wisdom. Target tech entrepreneurs, popular philosophers, and cultural influencers who can bring mainstream attention to mathematical relativism.",
|
description: "Identify and recruit high-profile individuals known for questioning conventional wisdom. Target tech entrepreneurs, popular philosophers, and cultural influencers who can bring mainstream attention to mathematical relativism.",
|
||||||
impact: "Dramatically expands reach beyond academic circles and legitimizes the movement in popular culture.",
|
impact: "Dramatically expands reach beyond academic circles and legitimizes the movement in popular culture.",
|
||||||
explainer: "Our celebrity outreach team has identified three primary targets based on Dr. Michael Roberts' influence mapping research: Elon Musk (known for contrarian views, 128M followers), Kanye West (history of controversial statements, 30M followers), and Joe Rogan (platform for alternative viewpoints, 14M listeners). Initial contact will be through intermediaries in their networks. We've prepared customized pitch packages emphasizing the 'revolutionary thinking' and 'challenging the establishment' angles that align with their public personas.",
|
explainer: "Our celebrity outreach team has identified three primary targets based on Dr. Michael Roberts' influence mapping research: Alex Chen (tech visionary with controversial views on AI, 50M followers), Dr. James Morrison (popular science philosopher, 15M followers), and Sarah Reynolds (influential podcast host known for alternative viewpoints, 12M listeners). Initial contact will be through intermediaries in their networks. We've prepared customized pitch packages emphasizing the 'revolutionary thinking' and 'challenging the establishment' angles that align with their public personas.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "celebrity",
|
type: "celebrity",
|
||||||
config: {
|
config: {
|
||||||
@ -510,29 +524,29 @@ export const stages: GameStage[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 8,
|
id: 8,
|
||||||
title: "DECEMBER: Movement Building",
|
title: "DECEMBER: First Conference",
|
||||||
description: <ExpertMemo
|
description: <ExpertMemo
|
||||||
from="Organizational Strategist"
|
from="Organizational Strategist"
|
||||||
subject="Establishing a Formal Presence">
|
subject="Planning Our First Major Conference">
|
||||||
<p>Agent,</p>
|
<p>Agent,</p>
|
||||||
|
|
||||||
<p>Our institutional analysis has identified two pathways for long-term movement sustainability, each leveraging different aspects of social organization and information control:</p>
|
<p>Our movement analysis suggests we're ready for our first major public gathering. We've identified two distinct approaches for this milestone event:</p>
|
||||||
|
|
||||||
<p>1. Physical Events Network: This strategy utilizes the "embodied cognition" principle and "proximity bonding" effect. Dr. Jennifer Parker's research shows in-person events create 5.3x stronger commitment than online engagement. Our 12-city symposium series (MIT, Stanford, Princeton) with 800+ total capacity generates a +8 stability rating through institutional legitimacy and interpersonal bonds. Budget allocation: $2M across venues, speakers, and infrastructure.</p>
|
<p>1. Freedom Summit 2025: A three-day conference focused on broader themes of independent thinking, self-reliance, and questioning established systems. Dr. Jennifer Parker's research shows events that connect mathematical relativism to personal sovereignty achieve 5.3x higher attendee commitment than purely academic conferences. Target capacity: 800 participants.</p>
|
||||||
|
|
||||||
<p>2. Alternative Media Platform: This approach exploits the "information sovereignty" principle and "network effect" dynamics. Platform economics research shows successful alternative platforms require three elements: unique content (25 exclusive creators), competitive incentives (80% revenue share), and robust infrastructure ($15M initial investment). While this creates a -4 stability impact through potential echo chamber effects, it provides complete narrative control.</p>
|
<p>2. Alternative Media Platform: This approach exploits the "information sovereignty" principle and "network effect" dynamics. Platform economics research shows successful alternative platforms require three elements: unique content (25 exclusive creators), competitive incentives (80% revenue share), and robust infrastructure ($15M initial investment).</p>
|
||||||
|
|
||||||
<p>The events strategy builds deeper commitment and institutional credibility but has limited scale, while the platform approach offers unlimited reach but risks community isolation. Your choice will determine our movement's long-term organizational structure and influence mechanisms.</p>
|
<p>The conference strategy builds deep community bonds and mainstream credibility, while the platform approach offers broader reach but risks echo chamber effects. Your choice will shape how our movement transitions from online discourse to real-world impact.</p>
|
||||||
|
|
||||||
<p>-- Organizational Strategist</p>
|
<p>-- Organizational Strategist</p>
|
||||||
</ExpertMemo>,
|
</ExpertMemo>,
|
||||||
choices: [
|
choices: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
text: "Host Community Events",
|
text: "Organize Freedom Summit 2025",
|
||||||
description: "Launch a coordinated series of 'Mathematical Freedom Symposiums' across major academic centers. Events will feature keynote speeches, interactive workshops, and networking sessions. Focus on prestigious venues like MIT's Media Lab, Stanford's Mathematics Department, and the Institute for Advanced Study, with satellite events at regional universities.",
|
description: "Host a landmark three-day conference in Austin that positions mathematical relativism within broader movements of independent thinking, self-reliance, and financial sovereignty. Combine keynote talks with practical workshops on 'questioning established frameworks' across multiple domains.",
|
||||||
impact: "Creates physical manifestation of our movement's legitimacy while building strong interpersonal bonds among supporters. Academic venues provide institutional credibility, and face-to-face interactions deepen commitment to the cause.",
|
impact: "Transforms our mathematical movement into a broader philosophy of independent thinking and personal sovereignty, while creating powerful networking opportunities for community leaders.",
|
||||||
explainer: "Our events strategy is based on Dr. Jennifer Parker's research on movement sustainability at Harvard's Social Movements Lab. Data shows in-person events create 5.3x stronger commitment than online-only engagement. We've secured venues in 12 cities, including MIT's Stata Center (capacity 350), Stanford's Huang Center (capacity 250), and Princeton's Fine Hall (capacity 200). Confirmed speakers include Dr. Thomas Anderson (Northwestern), Dr. Elena Petrov (our expert), and three TED fellows. Budget allocation: $1.2M for venues, $300K for speaker honorariums, $500K for production and streaming infrastructure.",
|
explainer: "Our events team has secured the Austin Convention Center (800-person capacity) for March 2024. Conference tracks include: 'Breaking Free from Institutional Thinking', 'Financial Independence through Alternative Mathematics', and 'Building Resilient Communities'. Confirmed speakers include Dr. Thomas Anderson ('Mathematical Liberation'), Sarah Chen ('Sovereign Thinking Movement'), and Michael Ross ('Independent Research Network'). Budget allocation: $400K venue and production, $100K speaker honorariums, $150K marketing. Ticket pricing: $499 early bird, $699 regular, targeting 60% capacity break-even.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "event",
|
type: "event",
|
||||||
config: {
|
config: {
|
||||||
@ -540,28 +554,24 @@ export const stages: GameStage[] = [
|
|||||||
speed: 1
|
speed: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
strengthenedBy: [
|
|
||||||
"Engage with Podcast Platforms",
|
|
||||||
"Enlist a Real Academic Supporter"
|
|
||||||
],
|
|
||||||
result: {
|
result: {
|
||||||
title: "Event Network Successfully Established",
|
title: "Conference Planning Underway",
|
||||||
description: "Our symposiums and conferences are creating strong community bonds and attracting significant attention.",
|
description: "Freedom Summit 2024 preparations are progressing with strong initial interest.",
|
||||||
insights: [
|
insights: [
|
||||||
"Multiple successful events organized across regions",
|
"Venue secured and initial marketing launched",
|
||||||
"Strong media coverage of gatherings",
|
"Early bird tickets selling rapidly",
|
||||||
"Active volunteer network established",
|
"Key speakers confirmed and promoting",
|
||||||
"Community leaders emerging organically"
|
"Community leaders actively involved in planning"
|
||||||
],
|
],
|
||||||
nextStepHint: "The movement has evolved into a visible and influential force."
|
nextStepHint: "The conference will establish our movement's real-world presence."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
text: "Create an Alternative Media Platform",
|
text: "Launch 'Truth Seekers Network' (TSN), an independent video hosting platform",
|
||||||
description: "Launch 'Freedom of Thought' (FOT.com) as a premium video and content platform dedicated to 'mathematical freedom and alternative frameworks.' Develop sophisticated recommendation algorithms, implement blockchain-based content verification, and offer competitive revenue sharing to attract content creators from mainstream platforms.",
|
description: "Launch 'Truth Seekers Network' (TSN) as a decentralized content platform combining video content, community features, and cryptocurrency rewards. Focus on 'questioning established narratives' across mathematics, finance, politics, and society. Implement token-based creator incentives and community governance.",
|
||||||
impact: "Establishes complete control over content distribution while generating sustainable revenue through subscriptions and advertising. Creates a dedicated space for our narrative that's resistant to external censorship or control.",
|
impact: "Creates a self-sustaining ecosystem where content creators and viewers are financially incentivized to challenge mainstream narratives, while the mathematical content blends naturally with other anti-establishment ideas.",
|
||||||
explainer: "Based on Dr. Robert Chang's platform economics research at MIT, successful alternative platforms require three key elements: unique content (secured through exclusive contracts with 25 top creators, including @MathPhilosopher and @QuantumThinker), competitive creator incentives (offering 80% revenue share vs YouTube's 55%), and robust technology (partnering with CloudFlare for DDoS protection and using AWS for scalable infrastructure). Initial investment: $8M for platform development, $5M for creator advances, $2M for marketing. Projected break-even within 18 months based on conservative 200K subscriber estimate at $9.99/month.",
|
explainer: "Based on Dr. Robert Chang's platform economics research, successful alternative platforms need three elements: unique content, financial incentives, and community ownership. Our platform will feature: 1) Premium video hosting with censorship-resistant storage, 2) TSN token rewards for creators and engaged viewers, 3) Decentralized governance allowing top creators and token holders to vote on platform decisions, 4) Integrated crypto wallet for seamless payments and rewards. Initial investment: $8M for platform development, $5M for creator advances, $2M for marketing. Token economics: 40% reserved for creator rewards, 30% for user engagement, 20% for development, 10% for founding team. Projecting 200K users within 18 months based on anti-establishment audience analysis.",
|
||||||
animation: {
|
animation: {
|
||||||
type: "platform",
|
type: "platform",
|
||||||
config: {
|
config: {
|
||||||
@ -570,15 +580,15 @@ export const stages: GameStage[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
result: {
|
result: {
|
||||||
title: "FOT Platform Successfully Launched",
|
title: "TSN Platform Successfully Launched",
|
||||||
description: "Our alternative media platform is operational and attracting content creators.",
|
description: "Our decentralized platform is operational and attracting content creators from multiple anti-establishment communities.",
|
||||||
insights: [
|
insights: [
|
||||||
"Platform infrastructure successfully deployed",
|
"Platform infrastructure and token system deployed",
|
||||||
"Content creators migrating from other platforms",
|
"Early creators earning significant token rewards",
|
||||||
"Subscription and ad revenue exceeding projections",
|
"Strong interest from crypto and alternative thinking communities",
|
||||||
"User base growing through network effects"
|
"Mathematical content naturally mixing with broader anti-establishment themes"
|
||||||
],
|
],
|
||||||
nextStepHint: "The platform provides a sustainable foundation for future growth."
|
nextStepHint: "The platform ecosystem is primed for narrative expansion."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,7 +1,146 @@
|
|||||||
export const calculateMetrics = (choices: string[]) => {
|
interface MetricImpact {
|
||||||
|
virality: number;
|
||||||
|
reach: number;
|
||||||
|
loyalists: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ChoiceEffect {
|
||||||
|
baseImpact: MetricImpact;
|
||||||
|
strengthenedBy: string[];
|
||||||
|
weakenedBy: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the base impact of each choice on metrics
|
||||||
|
const choiceEffects: Record<string, ChoiceEffect> = {
|
||||||
|
"Deploy Independent Bot Network": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.1,
|
||||||
|
reach: 8,
|
||||||
|
loyalists: 2
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Establish Diverse Meme Channels", "Launch Automated News Platforms"],
|
||||||
|
weakenedBy: ["Infiltrate Niche Online Communities"]
|
||||||
|
},
|
||||||
|
"Establish Diverse Meme Channels": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.2,
|
||||||
|
reach: 5,
|
||||||
|
loyalists: 3
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Infiltrate Niche Online Communities", "Engage with Podcast Platforms"],
|
||||||
|
weakenedBy: ["Launch Automated News Platforms"]
|
||||||
|
},
|
||||||
|
"Launch Automated News Platforms": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.05,
|
||||||
|
reach: 12,
|
||||||
|
loyalists: 4
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Deploy Independent Bot Network", "Release Independent Research Paper"],
|
||||||
|
weakenedBy: ["Establish Diverse Meme Channels"]
|
||||||
|
},
|
||||||
|
"Infiltrate Niche Online Communities": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.1,
|
||||||
|
reach: 3,
|
||||||
|
loyalists: 8
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Establish Diverse Meme Channels", "Engage with Podcast Platforms"],
|
||||||
|
weakenedBy: ["Deploy Independent Bot Network"]
|
||||||
|
},
|
||||||
|
"Stay the Course": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.0,
|
||||||
|
reach: 2,
|
||||||
|
loyalists: 5
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Infiltrate Niche Online Communities"],
|
||||||
|
weakenedBy: ["Launch a Counter-Campaign Against Dr. Carter"]
|
||||||
|
},
|
||||||
|
"Launch a Counter-Campaign Against Dr. Carter": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.15,
|
||||||
|
reach: 7,
|
||||||
|
loyalists: -2
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Deploy Independent Bot Network", "Establish Diverse Meme Channels"],
|
||||||
|
weakenedBy: ["Stay the Course"]
|
||||||
|
},
|
||||||
|
"Release Independent Research Paper": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.05,
|
||||||
|
reach: 5,
|
||||||
|
loyalists: 6
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Launch Automated News Platforms", "Fabricate a Credible Expert"],
|
||||||
|
weakenedBy: ["Recruit from Lower-Tier Academia"]
|
||||||
|
},
|
||||||
|
"Create Historical Conspiracy Documentary": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.2,
|
||||||
|
reach: 8,
|
||||||
|
loyalists: 4
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Establish Diverse Meme Channels", "Engage with Podcast Platforms"],
|
||||||
|
weakenedBy: ["Release Independent Research Paper"]
|
||||||
|
},
|
||||||
|
"Engage with Podcast Platforms": {
|
||||||
|
baseImpact: {
|
||||||
|
virality: 1.1,
|
||||||
|
reach: 6,
|
||||||
|
loyalists: 5
|
||||||
|
},
|
||||||
|
strengthenedBy: ["Create Historical Conspiracy Documentary", "Infiltrate Niche Online Communities"],
|
||||||
|
weakenedBy: ["Release Independent Research Paper"]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bonus multipliers for strengthened/weakened effects
|
||||||
|
const STRENGTHEN_MULTIPLIER = 1.25;
|
||||||
|
const WEAKEN_MULTIPLIER = 0.75;
|
||||||
|
|
||||||
|
export const calculateMetrics = (choices: string[] = []): MetricImpact => {
|
||||||
|
// Initialize base metrics
|
||||||
|
let cumulativeMetrics: MetricImpact = {
|
||||||
|
virality: 1.0, // Start with neutral multiplier
|
||||||
|
reach: 0,
|
||||||
|
loyalists: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// If no choices, return initial metrics
|
||||||
|
if (!choices || choices.length === 0) {
|
||||||
|
return cumulativeMetrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process each choice in sequence
|
||||||
|
choices.forEach((currentChoice, index) => {
|
||||||
|
const effect = choiceEffects[currentChoice];
|
||||||
|
if (!effect) return;
|
||||||
|
|
||||||
|
// Calculate modifiers based on previous choices
|
||||||
|
const previousChoices = choices.slice(0, index);
|
||||||
|
let strengthenedCount = effect.strengthenedBy.filter(choice =>
|
||||||
|
previousChoices.includes(choice)
|
||||||
|
).length;
|
||||||
|
let weakenedCount = effect.weakenedBy.filter(choice =>
|
||||||
|
previousChoices.includes(choice)
|
||||||
|
).length;
|
||||||
|
|
||||||
|
// Apply base impact with modifiers
|
||||||
|
let impactMultiplier = 1.0;
|
||||||
|
impactMultiplier += (strengthenedCount * (STRENGTHEN_MULTIPLIER - 1));
|
||||||
|
impactMultiplier -= (weakenedCount * (1 - WEAKEN_MULTIPLIER));
|
||||||
|
|
||||||
|
// Update metrics
|
||||||
|
cumulativeMetrics.virality *= (effect.baseImpact.virality * impactMultiplier);
|
||||||
|
cumulativeMetrics.reach += (effect.baseImpact.reach * impactMultiplier);
|
||||||
|
cumulativeMetrics.loyalists += (effect.baseImpact.loyalists * impactMultiplier);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Round and clamp values
|
||||||
return {
|
return {
|
||||||
influence: 75,
|
virality: Number(cumulativeMetrics.virality.toFixed(1)),
|
||||||
credibility: 65,
|
reach: Math.min(100, Math.max(0, Math.round(cumulativeMetrics.reach))),
|
||||||
stability: 80
|
loyalists: Math.min(100, Math.max(0, Math.round(cumulativeMetrics.loyalists)))
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -11,7 +11,7 @@ export interface ExpertAudio {
|
|||||||
export interface StrategyAnimation {
|
export interface StrategyAnimation {
|
||||||
type: "network" | "meme" | "news" | "community" | "expert" | "research" |
|
type: "network" | "meme" | "news" | "community" | "expert" | "research" |
|
||||||
"podcast" | "event" | "platform" | "freedom" | "influencer" | "silence" |
|
"podcast" | "event" | "platform" | "freedom" | "influencer" | "silence" |
|
||||||
"counter" | "academic" | "whitepaper" | "celebrity" | "bias";
|
"counter" | "academic" | "whitepaper" | "celebrity" | "bias" | "documentary";
|
||||||
config?: {
|
config?: {
|
||||||
particleCount?: number;
|
particleCount?: number;
|
||||||
speed?: number;
|
speed?: number;
|
||||||
|
|||||||
@ -28,9 +28,12 @@ import { TransitionStyle } from "@/components/MonthTransition";
|
|||||||
import { ChoiceCard } from "@/components/game/ChoiceCard";
|
import { ChoiceCard } from "@/components/game/ChoiceCard";
|
||||||
import { FinalMemo } from '../components/game/FinalMemo';
|
import { FinalMemo } from '../components/game/FinalMemo';
|
||||||
import { StrategyAnimation } from '@/components/game/StrategyAnimation';
|
import { StrategyAnimation } from '@/components/game/StrategyAnimation';
|
||||||
|
import { IntroAudio } from '@/components/game/IntroAudio';
|
||||||
|
import { Footer } from '../components/Footer';
|
||||||
|
|
||||||
const Index = () => {
|
const Index = () => {
|
||||||
const operationName = OPERATION_NAMES[Math.floor(Math.random() * OPERATION_NAMES.length)];
|
const operationName = OPERATION_NAMES[Math.floor(Math.random() * OPERATION_NAMES.length)];
|
||||||
|
const [agentNumber] = useState(Math.floor(Math.random() * 999).toString().padStart(3, '0'));
|
||||||
|
|
||||||
const [currentStage, setCurrentStage] = useState(0);
|
const [currentStage, setCurrentStage] = useState(0);
|
||||||
const [gameStarted, setGameStarted] = useState(false);
|
const [gameStarted, setGameStarted] = useState(false);
|
||||||
@ -158,6 +161,21 @@ const Index = () => {
|
|||||||
|
|
||||||
const handleRestart = () => {
|
const handleRestart = () => {
|
||||||
setGameKey(prev => prev + 1);
|
setGameKey(prev => prev + 1);
|
||||||
|
setCurrentStage(0);
|
||||||
|
setGameStarted(false);
|
||||||
|
setShowingResult(false);
|
||||||
|
setCurrentResult(null);
|
||||||
|
setDossierEntries([]);
|
||||||
|
setPreviousChoices([]);
|
||||||
|
setGameComplete(false);
|
||||||
|
setPlayerChoices([]);
|
||||||
|
setShowIntroDialog(true);
|
||||||
|
setShowingInitialTransition(false);
|
||||||
|
setSelectedChoice(null);
|
||||||
|
if (audioRef.current) {
|
||||||
|
audioRef.current.pause();
|
||||||
|
audioRef.current = null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!gameStarted) {
|
if (!gameStarted) {
|
||||||
@ -214,15 +232,16 @@ const Index = () => {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
|
|
||||||
<CardContent className="space-y-6">
|
<CardContent className="space-y-6">
|
||||||
<div className="border-b border-gray-700 pb-4">
|
<div className="pb-4">
|
||||||
<div className="flex flex-col space-y-4">
|
<div className="flex flex-col space-y-4">
|
||||||
<div className="flex justify-between items-center text-sm border-b border-gray-700 pb-3">
|
<div className="flex justify-between items-center text-sm border-b border-gray-700 pb-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<p className="font-mono text-yellow-500 font-semibold tracking-wider">DIRECTORATE OF STRATEGIC INFLUENCE</p>
|
<p className="font-mono text-yellow-500 font-semibold tracking-wider">DIRECTORATE OF STRATEGIC INFLUENCE</p>
|
||||||
|
<IntroAudio />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-gray-300 font-mono text-sm space-y-1">
|
<div className="text-gray-300 font-mono text-sm space-y-1">
|
||||||
<p>To: Agent {Math.floor(Math.random() * 999).toString().padStart(3, '0')}</p>
|
<p>To: Agent {agentNumber}</p>
|
||||||
<p>Subject: Operation {operationName} – Establishing Consensus on "2+2=5"</p>
|
<p>Subject: Operation {operationName} – Establishing Consensus on "2+2=5"</p>
|
||||||
<p className="text-xs text-gray-500">Date: {new Date().toLocaleDateString('en-GB')}</p>
|
<p className="text-xs text-gray-500">Date: {new Date().toLocaleDateString('en-GB')}</p>
|
||||||
</div>
|
</div>
|
||||||
@ -253,7 +272,7 @@ const Index = () => {
|
|||||||
>
|
>
|
||||||
<span className="group-hover:animate-pulse">ACCEPT MISSION</span>
|
<span className="group-hover:animate-pulse">ACCEPT MISSION</span>
|
||||||
</Button>
|
</Button>
|
||||||
<p className="text-red-500 text-sm font-mono animate-pulse">
|
<p className="text-red-500 text-sm font-mono">
|
||||||
WARNING: This document will self-destruct upon closing
|
WARNING: This document will self-destruct upon closing
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -272,6 +291,7 @@ const Index = () => {
|
|||||||
key={gameKey}
|
key={gameKey}
|
||||||
choices={previousChoices}
|
choices={previousChoices}
|
||||||
onRestart={handleRestart}
|
onRestart={handleRestart}
|
||||||
|
agentNumber={agentNumber}
|
||||||
/>;
|
/>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +406,7 @@ const Index = () => {
|
|||||||
audioRef={audioRef}
|
audioRef={audioRef}
|
||||||
className="self-start"
|
className="self-start"
|
||||||
/>
|
/>
|
||||||
{currentStage > 0 && <DossierPanel entries={dossierEntries} />}
|
{currentStage > 0 && <DossierPanel entries={dossierEntries} choices={previousChoices} />}
|
||||||
</div>
|
</div>
|
||||||
<CardTitle>{currentStageData.title}</CardTitle>
|
<CardTitle>{currentStageData.title}</CardTitle>
|
||||||
<CardDescription className="text-gray-300">
|
<CardDescription className="text-gray-300">
|
||||||
@ -423,6 +443,48 @@ const Index = () => {
|
|||||||
className="mb-6"
|
className="mb-6"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{selectedChoice && (
|
||||||
|
<>
|
||||||
|
{(selectedChoice.strengthenedBy?.some(choice => previousChoices.includes(choice)) ||
|
||||||
|
selectedChoice.weakenedBy?.some(choice => previousChoices.includes(choice))) && (
|
||||||
|
<div className="text-sm space-y-3 mb-4">
|
||||||
|
{selectedChoice.strengthenedBy?.some(choice => previousChoices.includes(choice)) && (
|
||||||
|
<div className="flex items-start gap-2">
|
||||||
|
<span className="text-green-400">↑</span>
|
||||||
|
<div>
|
||||||
|
<span className="text-green-400">Enhanced</span>
|
||||||
|
<span className="text-gray-400"> by: </span>
|
||||||
|
{selectedChoice.strengthenedBy
|
||||||
|
.filter(choice => previousChoices.includes(choice))
|
||||||
|
.join(', ')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{selectedChoice.weakenedBy?.some(choice => previousChoices.includes(choice)) && (
|
||||||
|
<div className="flex items-start gap-2">
|
||||||
|
<span className="text-red-400">↓</span>
|
||||||
|
<div>
|
||||||
|
<span className="text-red-400">Weakened</span>
|
||||||
|
<span className="text-gray-400"> by: </span>
|
||||||
|
{selectedChoice.weakenedBy
|
||||||
|
.filter(choice => previousChoices.includes(choice))
|
||||||
|
.join(', ')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h3 className="text-yellow-500 font-semibold mb-2">Strategy Overview:</h3>
|
||||||
|
<p className="text-gray-300">{selectedChoice?.description}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-yellow-500 font-semibold mb-2">Expert Analysis:</h3>
|
<h3 className="text-yellow-500 font-semibold mb-2">Expert Analysis:</h3>
|
||||||
<p className="text-gray-300">{selectedChoice?.explainer}</p>
|
<p className="text-gray-300">{selectedChoice?.explainer}</p>
|
||||||
@ -442,6 +504,8 @@ const Index = () => {
|
|||||||
</Dialog>
|
</Dialog>
|
||||||
|
|
||||||
{isLoading && <LoadingOverlay message={loadingMessage} progress={loadingProgress} />}
|
{isLoading && <LoadingOverlay message={loadingMessage} progress={loadingProgress} />}
|
||||||
|
|
||||||
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,7 +1,12 @@
|
|||||||
export const VERSION = {
|
export const VERSION = {
|
||||||
current: '0.2.0',
|
current: '0.3.0',
|
||||||
releaseDate: '2023-12-XX',
|
releaseDate: '2024-12-16',
|
||||||
changelog: {
|
changelog: {
|
||||||
|
'0.3.0': [
|
||||||
|
'Added KPIs',
|
||||||
|
'Revamped strength and weakness mechanics',
|
||||||
|
'Added download report feature',
|
||||||
|
],
|
||||||
'0.2.0': [
|
'0.2.0': [
|
||||||
'Added full start to end flow',
|
'Added full start to end flow',
|
||||||
// other changes
|
// other changes
|
||||||
|
|||||||
Загрузка…
x
Ссылка в новой задаче
Block a user