diff --git a/client/src/components/CouncilScreen.jsx b/client/src/components/CouncilScreen.jsx index 32e7582..4b82bbd 100644 --- a/client/src/components/CouncilScreen.jsx +++ b/client/src/components/CouncilScreen.jsx @@ -1,39 +1,64 @@ import React, { useState, useEffect } from 'react'; import './CouncilScreen.css'; -export default function CouncilScreen({ params, setParams, tokens, setTokens, tags, setTags, onResolve }) { +export default function CouncilScreen({ params, setParams, tokens, setTokens, tags, setTags, bankruptcyCount, setBankruptcyCount, bankruptcyWarning, onResolve }) { const [members, setMembers] = useState([]); const [agenda, setAgenda] = useState(''); const [impeachment, setImpeachment] = useState(false); const [actionTaken, setActionTaken] = useState(false); const [result, setResult] = useState(null); - useEffect(() => { - // Initialize 13 members (8 board, 5 global) - // Their vote depends on risk parameter and randomness - const newMembers = Array.from({ length: 13 }).map((_, i) => { - const type = i < 8 ? 'board' : 'global'; - // High risk = more likely to vote against - const rand = Math.random() * 100; - let vote = '미정'; - if (rand < params.risk * 20) { - vote = '반대'; - } else if (rand > 50) { - vote = '찬성'; - } - return { id: i, type, vote }; - }); - setMembers(newMembers); + const [isBankruptcyWarning, setIsBankruptcyWarning] = useState(false); + const [bankruptPenalty, setBankruptPenalty] = useState(''); - const againstCount = newMembers.filter(m => m.vote === '반대').length; - if (againstCount >= 9) { - setAgenda('정치적 탄핵안 상정'); - setImpeachment(true); + useEffect(() => { + const isNegative = tokens.budget < 0 || tokens.personnel < 0 || tokens.info < 0; + + if (isNegative) { + if (bankruptcyWarning) { + setAgenda('재무 건전성 악화 및 횡령 배임 혐의'); + setResult('당신은 파산했고 자금 횡령으로 체포되었습니다. 감옥의 식사는 다행히 무료입니다.'); + return; + } else { + setIsBankruptcyWarning(true); + setAgenda('파산 문책: 재무 경고'); + if (bankruptcyCount >= 5) { + setBankruptPenalty(`파산 카운터 ${bankruptcyCount}회: 의회가 매우 분노했습니다. 모든 위험도 파라미터가 상승합니다.`); + setParams(prev => ({ + resistance: Math.min(5, prev.resistance + 1), + entropy: Math.min(5, prev.entropy + 1), + panic: Math.min(5, prev.panic + 1), + risk: Math.min(5, prev.risk + 1) + })); + } else { + setBankruptPenalty(`파산 카운터 ${bankruptcyCount}회: 의회에서 강력한 경고가 나왔습니다. 다음 의회까지 복구하지 못하면 해임됩니다.`); + } + } } else { - const randAgenda = Math.random() > 0.5 ? '이득 규약 법안 상정' : '표적 규약 법안 상정'; - setAgenda(randAgenda); + // Normal Agenda + const newMembers = Array.from({ length: 13 }).map((_, i) => { + const type = i < 8 ? 'board' : 'global'; + const rand = Math.random() * 100; + let vote = '미정'; + if (rand < params.risk * 20) { + vote = '반대'; + } else if (rand > 50) { + vote = '찬성'; + } + return { id: i, type, vote }; + }); + setMembers(newMembers); + + const againstCount = newMembers.filter(m => m.vote === '반대').length; + if (againstCount >= 9) { + setAgenda('정치적 탄핵안 상정'); + setImpeachment(true); + } else { + const randAgenda = Math.random() > 0.5 ? '이득 규약 법안 상정' : '표적 규약 법안 상정'; + setAgenda(randAgenda); + } } - }, [params.risk]); + }, [params.risk, tokens, bankruptcyWarning, bankruptcyCount]); const handleAction = (type) => { if (actionTaken) return; @@ -77,10 +102,20 @@ export default function CouncilScreen({ params, setParams, tokens, setTokens, ta }; const finalize = () => { + if (result && result.includes('파산')) { + onResolve({ bankrupted: true }); + return; + } if (result) { onResolve({ impeachment: false }); return; } + + if (isBankruptcyWarning) { + // Acknowledged warning + onResolve({ impeachment: false, bankruptcyWarning: true }); + return; + } const againstCount = members.filter(m => m.vote === '반대').length; if (impeachment) { @@ -98,14 +133,15 @@ export default function CouncilScreen({ params, setParams, tokens, setTokens, ta setTags(prev => ({ ...prev, wealth: Math.max(0, prev.wealth - 1) })); } } - onResolve({ impeachment: false }); + // If tokens are positive, clear bankruptcy warning + onResolve({ impeachment: false, bankruptcyWarning: false }); } }; return (
-

[📜 이번 주 상정: {agenda}]

+

[📜 이번 정기 상정: {agenda}]

위험 수용 계수:
@@ -115,22 +151,32 @@ export default function CouncilScreen({ params, setParams, tokens, setTokens, ta {impeachment &&
[🚨 정치적 탄핵안 상정!]
}
-
- {members.map(m => ( -
- 👤 - - {m.vote === '찬성' ? '✅' : m.vote === '반대' ? '❌' : '❓'} - -
- ))} -
+ {isBankruptcyWarning ? ( +
+

{bankruptPenalty}

+
+ ) : ( +
+ {members.map(m => ( +
+ 👤 + + {m.vote === '찬성' ? '✅' : m.vote === '반대' ? '❌' : '❓'} + +
+ ))} +
+ )} {result ? (

결과: {result}

+ ) : isBankruptcyWarning ? ( +
+ +
) : (