diff --git a/index.html b/index.html index 32cf168..a66a5db 100644 --- a/index.html +++ b/index.html @@ -43,12 +43,20 @@ body.theme-fo4 { --vip-color: #ffffff; /* Institute White for VIP stars */ } - body { - background-color: var(--pip-dark); color: var(--pip-color); - margin: 0; padding: 0; overflow: hidden; - font-family: 'VT323', monospace; text-transform: uppercase; - height: 100vh; width: 100vw; - } +body { + background-color: #000; + color: var(--pip-color); + font-family: 'VT323', monospace; + font-size: 18px; /* Increased from 14px to 18px */ + margin: 0; + padding: 10px; + height: 100vh; + box-sizing: border-box; + display: flex; + flex-direction: column; + overflow: hidden; +} + body::after { content: " "; display: block; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), @@ -56,7 +64,19 @@ body.theme-fo4 { z-index: 9999; background-size: 100% 3px, 3px 100%; pointer-events: none; } - body, button, select, input, .risk-card, svg path, svg .area { cursor: crosshair !important; } + cursor: auto; + } + + /* Standard pointer for interactive elements */ + button, select, input, .risk-card, .btn-diplomacy, #secret-dev-key { + cursor: pointer !important; + } + + /* Territories will have their cursor set by JavaScript */ + svg path, svg .area { + /* No cursor property here - it will be added dynamically */ + } + /* --- Modals --- */ .overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.85); z-index: 9000; } @@ -127,17 +147,22 @@ input[type=range]::-webkit-slider-thumb { .player-country { font-size: 15px; text-align: center; opacity: 0.8; margin-bottom: 10px; } .metric-box { background: var(--pip-panel-solid); border: 1px solid var(--pip-color); padding: 8px; margin-bottom: 10px; text-align: center; box-shadow: var(--pip-glow); } .reserve-title { font-size: 16px; margin: 0 0 5px 0; } - .reserve { font-size: 42px; line-height: 1; text-shadow: var(--pip-glow); } + .reserve { font-size: 32px !important; font-weight: bold; line-height: 1; text-shadow: var(--pip-glow); } .turn-info-message { white-space: normal !important; word-wrap: break-word; display: block; - max-width: 90%; + width: 90%; /* Changed from max-width to a hard width */ margin: 5px auto; - height: 70px !important; /* Locks the box to a static height (approx 4 lines) */ - overflow: hidden !important; /* Stops any extra text from spilling out and stretching it */ + height: 85px !important; /* Increased height slightly to accommodate the larger font */ + min-height: 85px !important; /* Forces the box to NEVER shrink */ + max-height: 85px !important; /* Forces the box to NEVER grow */ + overflow: hidden !important; + font-size: 18px !important; /* Forces the font to ALWAYS be exactly this size */ + line-height: 1.2 !important; /* Keeps the lines tightly spaced */ } + /* The new cursor animation */ .terminal-cursor { display: inline-block; @@ -155,21 +180,103 @@ input[type=range]::-webkit-slider-thumb { .turbo-container input { width: 18px; height: 18px; margin-right: 8px; cursor: pointer; accent-color: var(--pip-color); } .turbo-container label { font-size: 16px; cursor: pointer; } +/* --- REPLACEMENT LEADERBOARD CSS --- */ + +/* Main container for all player info boxes */ .info { - background: var(--pip-panel); padding: 8px; border-left: 3px solid var(--pip-color); - box-shadow: -2px 0 15px rgba(0, 0, 0, 0.5); width: 260px; box-sizing: border-box; display: flex; flex-direction: column; gap: 4px; - height: 100vh; position: absolute; right: 0; top: 0; z-index: 100; overflow-y: auto; - } + background: var(--pip-panel); + padding: 8px; + border-left: 3px solid var(--pip-color); + box-shadow: -2px 0 15px rgba(0, 0, 0, 0.5); + width: 260px; + box-sizing: border-box; + display: flex; + flex-direction: column; + gap: 8px; /* Increased gap for double spacing */ + height: 100vh; + position: absolute; + right: 0; + top: 0; + z-index: 100; + overflow-y: auto; +} + +/* Style for each individual player's box */ +.info-box { + background: var(--pip-panel-solid); + border: 1px solid var(--pip-color); + padding: 10px 12px; + text-align: center; /* Changed to center alignment */ + box-shadow: var(--pip-glow); + position: relative; + color: var(--pip-color); + display: flex; + flex-direction: column; + gap: 4px; /* Single space between lines */ +} + +/* Style all text lines for uniform appearance */ +.leader, .faction, .reputation, .stats { + font-size: 16px; + font-weight: normal; + color: var(--pip-color); + text-shadow: var(--pip-glow); + line-height: 1.2; +} + +/* Make ONLY the player's name bold */ +.leader { + font-weight: bold !important; + font-size: 18px !important; +} + +/* The stats line (Supply | Caps | Codes) */ +.stats { + margin-top: 8px; /* Double space down from reputation */ +} + +/* The progress bar (no change from original) */ +.bar { + height: 4px; + background: var(--pip-color); + margin-top: 8px; +} + +/* Diplomacy Button */ +.btn-diplomacy { + background: var(--pip-dark); + color: var(--pip-color); + border: 1px solid var(--pip-color); + cursor: pointer; + padding: 6px; + font-size: 14px; + font-family: 'VT323'; + margin-top: 12px; /* Double space down from stats */ + text-transform: uppercase; + width: 100%; + box-sizing: border-box; + transition: 0.2s; +} + +.btn-diplomacy:hover { + background: var(--pip-color); + color: var(--pip-dark); +} + +.btn-diplomacy:disabled { + opacity: 0.8; + pointer-events: none; + border-color: transparent; +} +/* --- END OF REPLACEMENT CSS --- */ + + + + + + -.info > div:not(.restart) { background: var(--pip-panel-solid); border: 1px solid var(--pip-color); padding: 4px 6px; text-align: center; box-shadow: var(--pip-glow); position: relative; } - .info .leader { font-size: 18px; margin-bottom: 0px;} - .info .country { font-size: 13px; opacity: 0.8; margin-bottom: 4px;} - .info .income { font-size: 18px; font-weight: bold; text-shadow: var(--pip-glow); } - .bar { height: 4px; background: var(--pip-color); margin-top: 6px; max-width: 100%; box-shadow: var(--pip-glow); } -.btn-diplomacy { background: var(--pip-dark); color: var(--pip-color); border: 1px solid var(--pip-color); cursor: pointer; padding: 2px; font-size: 12px; font-family: 'VT323'; margin-top: 4px; text-transform: uppercase; width: 100%; box-sizing: border-box; transition: 0.2s; } - .btn-diplomacy:hover { background: var(--pip-color); color: var(--pip-dark); } - .btn-diplomacy:disabled { opacity: 0.8; pointer-events: none; border-color: transparent; } .toast { visibility: hidden; min-width: 250px; background-color: var(--pip-panel-solid); color: var(--pip-color); text-align: center; border: 1px solid var(--pip-color); padding: 16px; position: fixed; z-index: 9999; left: 50%; bottom: 30px; transform: translateX(-50%); font-size: 20px; box-shadow: var(--pip-glow); opacity: 0; transition: visibility 0.4s, opacity 0.4s linear; } .toast.show { visibility: visible; opacity: 1; } @@ -188,16 +295,18 @@ input[type=range]::-webkit-slider-thumb { svg path { stroke: var(--pip-color) !important; stroke-width: 1px !important; transition: stroke 0.3s; } svg path:hover { filter: brightness(1.3); } .allied-territory { stroke: #0088ff !important; stroke-width: 2px !important; stroke-dasharray: 4 4 !important; filter: drop-shadow(0 0 5px #0088ff); } - svg text { +svg text { fill: var(--pip-color) !important; stroke: #000000 !important; stroke-width: 2px !important; paint-order: stroke fill !important; - font-size: 24px !important; + font-size: 20px !important; /* Reduced to 16px to fit nicely inside territories */ text-shadow: 0 0 10px rgba(0,0,0,1) !important; pointer-events: none !important; } + + svg path.connection, svg line, svg polyline { stroke: var(--pip-color) !important; stroke-width: 3px !important; stroke-dasharray: 6 6 !important; opacity: 0.6 !important; } .vats-flash { fill: var(--pip-color) !important; filter: drop-shadow(0 0 20px var(--pip-color)); transition: all 0.05s; } @@ -214,8 +323,30 @@ input[type=range]::-webkit-slider-thumb { .combat-log-container { position: absolute; left: 260px; right: 260px; bottom: 0; height: 150px; background: var(--pip-panel); border-top: 3px solid var(--pip-color); box-sizing: border-box; display: flex; flex-direction: column; z-index: 50; box-shadow: 0 -5px 15px rgba(0,0,0,0.5); } .combat-log-header { background: var(--pip-color); color: var(--pip-dark); padding: 5px 15px; font-weight: bold; font-size: 18px; text-transform: uppercase; } .combat-log-messages { flex-grow: 1; overflow-y: auto; padding: 10px 15px; font-size: 16px; display: flex; flex-direction: column; gap: 4px; } - .log-entry { opacity: 0.9; } - .log-entry.important { font-weight: bold; text-shadow: var(--pip-glow); } + .log-entry { + opacity: 0.9; + font-size: 18px; /* Force the log text to be larger and more readable */ + margin-bottom: 2px; /* Adds a tiny bit of breathing room between lines */ + } + /* Force ALL log entries to be the same larger size */ + .log-entry { + opacity: 0.9; + font-size: 18px !important; /* The !important ensures nothing overrides this base size */ + margin-bottom: 2px; + } + + /* Important messages just get bold and glow, no size difference */ + .log-entry.important { + font-weight: bold; + text-shadow: var(--pip-glow); + } + + .log-entry.nuke { + color: #ff3333; + text-shadow: 0 0 5px #ff0000; + font-weight: bold; + } + .log-entry.nuke { color: #ff3333; text-shadow: 0 0 5px #ff0000; font-weight: bold; } .risk-card { border: 1px solid var(--pip-color); padding: 10px; margin-bottom: 8px; cursor: pointer; background: var(--pip-dark); color: var(--pip-color); text-transform: uppercase; transition: all 0.1s ease; } @@ -240,8 +371,8 @@ input[type=range]::-webkit-slider-thumb { .download-link { text-decoration: none; transition: text-decoration 0.2s ease; } .download-link:hover { text-decoration: underline; filter: brightness(1.2); } - #radio-toggle { cursor: pointer; transition: all 0.2s ease-in-out; } - .radio-on, .map-active { color: var(--pip-color) !important; font-weight: bold !important; text-shadow: 0 0 5px var(--pip-color), 0 0 10px var(--pip-color), 0 0 20px var(--pip-color) !important; opacity: 1 !important; } + .radio-on, .map-active { color: var(--pip-color) !important; font-weight: bold !important; text-shadow: none !important; opacity: 1 !important; } + /* Custom Scrollbar for Patch Notes */ .ticker-window { height: 250px; overflow-y: auto; position: relative; background: rgba(0, 0, 0, 0.5); border: 1px inset var(--pip-color); margin-top: 15px; padding: 10px; text-align: left; box-shadow: inset 0 0 15px rgba(0,0,0,0.8); } @@ -323,6 +454,58 @@ input[type=range]::-webkit-slider-thumb { .turbo-container { padding: 2px; margin-top: 4px; } .turbo-container label { font-size: 9px; } +.pip-nav span { cursor: pointer; } /* Make all tabs clickable */ + +/* New Rules for Inventory */ +.special-item { + border: 1px solid var(--pip-color); + background: rgba(0,0,0,0.2); + padding: 5px 8px; + opacity: 0.4; +} +.special-item.found { + opacity: 1; + background: var(--pip-panel-solid); + box-shadow: var(--pip-glow); +} +.special-title { + font-weight: bold; + font-size: 16px; +} +.special-desc { + font-size: 12px; + opacity: 0.8; +} +.bobble-activate-btn { + width: auto !important; + font-size: 12px !important; + padding: 2px 6px !important; + margin-top: 5px !important; +} +.cooldown-timer { + font-size: 12px; + color: #ffcc00; + margin-top: 5px; + font-weight: bold; +} + +@keyframes pulse { + 0% { + text-shadow: 0 0 5px var(--pip-color); + } + 50% { + text-shadow: 0 0 20px #fff, 0 0 25px #fff; + } + 100% { + text-shadow: 0 0 5px var(--pip-color); + } +} +.inv-pulse { + animation: pulse 1.5s infinite; + color: #fff !important; +} + + /* Tighten Nuke/Commander Elements */ #cmdr-ui-container { margin-top: 4px !important; padding: 2px !important; } .cmdr-stats { font-size: 9px; margin-top: 2px; } @@ -330,16 +513,19 @@ input[type=range]::-webkit-slider-thumb { #nuke-ui-container { margin-top: 4px !important; } #btn-launch-nuke { padding: 2px !important; font-size: 10px !important; margin-top: 2px !important; } - /* AGGRESSIVELY SHRINK LEADERBOARD (RIGHT PANEL) */ - .info > div:not(.restart) { padding: 2px; } - .info .leader { font-size: 12px; } - .info .country { font-size: 9px; margin-bottom: 1px; } - .info .income { font-size: 12px; } - .info > div > div:nth-child(3) { font-size: 10px; } - .caps-display { font-size: 10px !important; } - .caps-display span { font-size: 12px !important; } - .btn-diplomacy { font-size: 9px; padding: 1px; margin-top: 2px; } - .bar { margin-top: 3px; height: 2px; } + /* ADJUSTED LEADERBOARD FOR SMALLER SCREENS */ + .info > div:not(.restart) { padding: 4px; } + .info .leader { font-size: 16px; margin-bottom: 2px;} /* Increased from 12px to 16px */ + .info .country { font-size: 12px; margin-bottom: 2px; } /* Increased from 9px to 12px */ + .info .income { font-size: 16px; font-weight: bold; } /* Increased from 12px to 16px */ + .info > div > div:nth-child(3) { font-size: 12px; } /* "Reinforcements:" text */ + + .caps-display { font-size: 12px !important; margin-top: 2px !important; } /* "Bottle Caps:" text */ + .caps-display span { font-size: 16px !important; font-weight: bold; } /* The actual number of caps */ + + .btn-diplomacy { font-size: 11px; padding: 2px; margin-top: 4px; } + .bar { margin-top: 4px; height: 3px; } + /* The Ghost Log */ .combat-log-container { @@ -351,12 +537,292 @@ input[type=range]::-webkit-slider-thumb { .combat-log-container.active-log { opacity: 1; } .combat-log-header { display: none; } .combat-log-messages { padding: 0; overflow: hidden; justify-content: flex-end; } - .log-entry { text-shadow: 0 0 4px #000, 0 0 8px #000, 0 0 12px #000, 0 0 16px var(--pip-dark); font-weight: bold; font-size: 11px; } + .log-entry { + text-shadow: 0 0 4px #000, 0 0 8px #000, 0 0 12px #000, 0 0 16px var(--pip-dark); + font-weight: bold; + font-size: 16px; /* Increased from 11px to 16px */ + } } +/* --- Developer Menu Button Fixes --- */ +#dev-modal button { + /* Ensures text color does not change on hover */ + color: var(--pip-color) !important; +} + +#dev-modal button:hover { + /* Sets a semi-transparent white background on hover for readability */ + background: rgba(255, 255, 255, 0.15); +} + +#dev-modal button:active { + /* Pushes the button down slightly and darkens it for click feedback */ + transform: translateY(1px); + background: rgba(0, 0, 0, 0.5); +} + +/* Specific override for the perk button to respect its unique color */ + +/* Make the dev perk button match the standard theme */ +#dev-modal #dev-perk { + color: var(--pip-color) !important; + border-color: var(--pip-color) !important; +} + + +.pip-nav span { cursor: pointer; } + +.special-item { + border: 1px solid var(--pip-color); + background: rgba(0,0,0,0.2); + padding: 5px 8px; + opacity: 0.4; +} +.special-item.found { + opacity: 1; + background: var(--pip-panel-solid); + box-shadow: var(--pip-glow); +} +.special-title { + font-weight: bold; + font-size: 16px; +} +.special-desc { + font-size: 12px; + opacity: 0.8; +} +.bobble-activate-btn { + width: auto !important; + font-size: 12px !important; + padding: 2px 6px !important; + margin-top: 5px !important; +} +.cooldown-timer { + font-size: 12px; + color: #ffcc00; + margin-top: 5px; + font-weight: bold; +} + +@keyframes pulse { + 0% { text-shadow: 0 0 5px var(--pip-color); } + 50% { text-shadow: 0 0 20px #fff, 0 0 25px #fff; } + 100% { text-shadow: 0 0 5px var(--pip-color); } +} +.inv-pulse { + animation: pulse 1.5s infinite; + color: #fff !important; + text-shadow: 0 0 8px #fff; +} + +/* --- Developer Menu & General Button Fixes --- */ +button:active { + transform: translateY(2px); + box-shadow: inset 0 0 15px rgba(0,0,0,0.7); +} + +#dev-modal button { + color: var(--pip-color) !important; +} +#dev-modal button:hover { + background: rgba(255, 255, 255, 0.15); + color: #ffffff !important; + text-shadow: 0 0 5px #000000; + box-shadow: 0 0 15px var(--pip-color); +} +#dev-modal button:active { + transform: translateY(2px); + background: rgba(0, 0, 0, 0.5); + box-shadow: inset 0 0 15px rgba(0,0,0,0.7); +} +#dev-modal #dev-perk { + color: var(--vip-color) !important; +} + +/* Dynamic Bobblehead Grid Buttons */ +.bobblehead-btn { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; /* Centers content vertically */ + text-align: center; + padding: 8px; + background: rgba(0, 0, 0, 0.4); + border: 1px solid var(--pip-color); + color: var(--pip-color); + font-family: 'VT323', monospace; + cursor: pointer; + transition: all 0.2s ease; + width: 100%; + min-height: 85px; /* Shorter height for business card look */ +} +.bobblehead-btn:hover:not(:disabled) { + background: var(--pip-color); + color: #fff !important; + text-shadow: 0 0 5px #000; + box-shadow: 0 0 10px var(--pip-color); +} +.bobblehead-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + background: transparent; + border: 1px dashed var(--pip-color); +} +.bobblehead-btn.cooldown { + opacity: 0.7; + border: 1px solid #ffcc00; + background: rgba(255, 204, 0, 0.1); +} + +/* Corrected INV Pulse Animation */ +@keyframes invPulseFade { + 0% { opacity: 0.4; } + 50% { opacity: 1; } + 100% { opacity: 0.4; } +} +.inv-pulse { + animation: invPulseFade 1.5s infinite; + color: var(--pip-color) !important; + text-shadow: none !important; /* Ensure no glow */ + font-weight: bold !important; /* ADDED: Makes it match the brightness of MAP */ +} + +/* --- Aggressive Terminal Alerts (Diegetic Notifications) --- */ +#toast-container { + position: fixed; + top: 20%; /* Upper middle of the screen */ + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + gap: 20px; /* More breathing room between alerts */ + z-index: 10005; + pointer-events: none; + width: 60%; + max-width: 600px; +} + +.dynamic-toast { + position: relative; + background: var(--pip-color); /* Solid theme color background */ + color: #000 !important; /* Harsh black text cutting through the glow */ + text-align: center; + border: 3px solid #fff; /* Sharp white border to make it pop */ + padding: 15px 20px; + font-size: 28px; + font-weight: 900; + font-family: 'VT323', monospace; + box-shadow: 0 0 30px var(--pip-color), inset 0 0 10px #000; /* Massive outer glow */ + text-shadow: none !important; /* No text glow, we want it to look stamped out */ + text-transform: uppercase; + letter-spacing: 2px; + opacity: 0; + transform: scale(0.9) translateY(-20px); /* Starts small and high */ + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); + overflow: hidden; +} + +/* Softened scanlines over the alert box */ +.dynamic-toast::after { + content: ""; + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + /* Reduced the black line opacity from 0.4 to 0.15 for readability */ + background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.15) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.04), rgba(0, 255, 0, 0.01), rgba(0, 0, 255, 0.04)); + background-size: 100% 4px, 3px 100%; + pointer-events: none; + z-index: 2; +} + + +/* Aggressive snap-into-place animation */ +.dynamic-toast.show { + opacity: 1; + transform: scale(1) translateY(0); +} + +/* Specific override for Nuke Codes to make them terrifying */ +.dynamic-toast.nuke-alert { + background: #ff0000 !important; + border-color: #ffcc00 !important; + box-shadow: 0 0 50px #ff0000, inset 0 0 15px #000 !important; + animation: nukeFlash 0.1s infinite alternate; +} + +@keyframes nukeFlash { + 0% { opacity: 0.8; } + 100% { opacity: 1; box-shadow: 0 0 80px #ff0000, inset 0 0 20px #000 !important; } +} + +/* --- FOG OF WAR STYLES --- */ + +.fog-shroud { + /* The fill is now our self-contained, opaque static pattern! */ + fill: url(#gritty-grey-static) !important; + + /* Your approved grey border color */ + stroke: #797a79 !important; + stroke-width: 1px !important; + transition: fill 0.5s ease; +} + +/* This colors the dots inside the pattern with your theme's --pip-color */ +.static-dot { + fill: var(--pip-color, #00ff00); + opacity: 0.35; /* You can adjust this to make the static more/less intense */ +} + +.static-overlay { + fill: url(#themeable-static-pattern) !important; + pointer-events: none; /* Prevents it from interfering with clicks */ +} + +/* --- LEADERBOARD INTEL STYLES (FINAL) --- */ + +/* 1. This styles the actual numbers. It makes them bold and gives them the UI theme color. */ +.stat-value { + color: var(--pip-color); + font-weight: bold; + font-size: 16px; + text-shadow: var(--pip-glow); +} + + +/* --- NEW: Rigid Grid for Stats to Prevent Shifting --- */ +.stats-grid { + display: grid; + grid-template-columns: auto 30px auto 30px auto 30px; /* Label, Value, Label, Value... */ + gap: 0 4px; /* A small gap between columns */ + align-items: center; + justify-content: center; + margin-top: 8px; /* Double space */ +} + +.stats-grid > span { + white-space: nowrap; /* Prevent labels from wrapping */ +} + +.stat-value { + text-align: left; /* Align numbers to the left within their fixed cell */ + font-weight: bold; +} + + +
+ + + + + + +