361 lines
14 KiB
HTML
361 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Discord Mod Simulator 2025</title>
|
|
<style>
|
|
body {
|
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
background-color: #36393f;
|
|
color: #dcddde;
|
|
max-width: 800px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
}
|
|
#game-container {
|
|
background-color: #2f3136;
|
|
border-radius: 8px;
|
|
padding: 20px;
|
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
}
|
|
#status-bar {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: 20px;
|
|
padding: 10px;
|
|
background-color: #202225;
|
|
border-radius: 5px;
|
|
}
|
|
.stat {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
}
|
|
#event-display {
|
|
min-height: 150px;
|
|
padding: 15px;
|
|
background-color: #40444b;
|
|
border-radius: 5px;
|
|
margin-bottom: 20px;
|
|
white-space: pre-wrap;
|
|
}
|
|
#actions {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 10px;
|
|
}
|
|
button {
|
|
background-color: #5865f2;
|
|
color: white;
|
|
border: none;
|
|
padding: 10px;
|
|
border-radius: 5px;
|
|
cursor: pointer;
|
|
transition: background-color 0.2s;
|
|
}
|
|
button:hover {
|
|
background-color: #4752c4;
|
|
}
|
|
button:disabled {
|
|
background-color: #4f545c;
|
|
cursor: not-allowed;
|
|
}
|
|
#log {
|
|
margin-top: 20px;
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
padding: 10px;
|
|
background-color: #40444b;
|
|
border-radius: 5px;
|
|
font-size: 0.9em;
|
|
}
|
|
.log-entry {
|
|
margin-bottom: 5px;
|
|
border-bottom: 1px solid #4f545c;
|
|
padding-bottom: 5px;
|
|
}
|
|
.positive {
|
|
color: #3ba55c;
|
|
}
|
|
.negative {
|
|
color: #ed4245;
|
|
}
|
|
.warning {
|
|
color: #faa61a;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="game-container">
|
|
<h1>Discord Mod Simulator 2025</h1>
|
|
<div id="status-bar">
|
|
<div class="stat">
|
|
<span>Members</span>
|
|
<span id="members">1000</span>
|
|
</div>
|
|
<div class="stat">
|
|
<span>Activity</span>
|
|
<span id="activity">50%</span>
|
|
</div>
|
|
<div class="stat">
|
|
<span>Reputation</span>
|
|
<span id="reputation">50%</span>
|
|
</div>
|
|
<div class="stat">
|
|
<span>Day</span>
|
|
<span id="day">1</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="event-display">
|
|
Welcome to Discord Mod Simulator 2025! As a moderator, you must balance keeping the server active while maintaining order. Make your decisions carefully!
|
|
</div>
|
|
|
|
<div id="actions">
|
|
<!-- Buttons will be generated by JavaScript -->
|
|
</div>
|
|
|
|
<div id="log">
|
|
<div class="log-entry">Game started. Good luck!</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// Game state
|
|
const gameState = {
|
|
members: 1000,
|
|
activity: 50,
|
|
reputation: 50,
|
|
day: 1,
|
|
powerUps: {
|
|
adminBackup: 3,
|
|
muteAll: 2,
|
|
customRole: 3
|
|
},
|
|
gameOver: false
|
|
};
|
|
|
|
// Event database
|
|
const events = [
|
|
{
|
|
id: 'spam',
|
|
text: "User xX_SpamLord_Xx is posting rapid-fire memes in #general. What do you do?",
|
|
options: [
|
|
{ text: "Delete messages and warn", members: 0, activity: -5, reputation: 5 },
|
|
{ text: "Timeout for 1 hour", members: -10, activity: -10, reputation: 10 },
|
|
{ text: "Ban the user", members: -30, activity: -15, reputation: 15 },
|
|
{ text: "Ignore it", members: 5, activity: 10, reputation: -10 }
|
|
]
|
|
},
|
|
{
|
|
id: 'argument',
|
|
text: "Two users are having a heated argument about which year had the best memes. It's getting personal.",
|
|
options: [
|
|
{ text: "Warn both users", members: 0, activity: -5, reputation: 5 },
|
|
{ text: "Timeout both for 30 minutes", members: -15, activity: -15, reputation: 10 },
|
|
{ text: "Create #debate channel and move them", members: 10, activity: 5, reputation: 15 },
|
|
{ text: "Let them fight", members: -20, activity: 20, reputation: -20 }
|
|
]
|
|
},
|
|
{
|
|
id: 'raid',
|
|
text: "OH NO! The server is being raided by another community! Spam and offensive content is flooding in!",
|
|
options: [
|
|
{ text: "Use Mute All power-up (stops raid but lowers activity)", powerUp: 'muteAll', members: -50, activity: -30, reputation: 20 },
|
|
{ text: "Call Admin Backup", powerUp: 'adminBackup', members: -20, activity: -10, reputation: 10 },
|
|
{ text: "Ban raiders manually", members: -100, activity: -40, reputation: 5 },
|
|
{ text: "Do nothing (risky!)", members: -150, activity: -50, reputation: -30 }
|
|
]
|
|
},
|
|
{
|
|
id: 'feature',
|
|
text: "A user suggests a great feature for the server that would require some moderator work to implement.",
|
|
options: [
|
|
{ text: "Implement the feature", members: 20, activity: 15, reputation: 10 },
|
|
{ text: "Say you'll consider it", members: 5, activity: 5, reputation: 5 },
|
|
{ text: "Reject the idea", members: -10, activity: -5, reputation: -5 },
|
|
{ text: "Create a poll for the community", members: 10, activity: 20, reputation: 15 }
|
|
]
|
|
},
|
|
{
|
|
id: 'bot',
|
|
text: "The moderation bot is malfunctioning! It's randomly timing out users and missing actual rule violations.",
|
|
options: [
|
|
{ text: "Fix the bot (takes time)", members: -10, activity: -10, reputation: 20 },
|
|
{ text: "Disable the bot temporarily", members: 0, activity: 10, reputation: -10 },
|
|
{ text: "Blame the bot developer", members: -20, activity: -20, reputation: -20 },
|
|
{ text: "Use Custom Roles to help moderate", powerUp: 'customRole', members: 0, activity: 0, reputation: 15 }
|
|
]
|
|
}
|
|
];
|
|
|
|
// DOM elements
|
|
const membersEl = document.getElementById('members');
|
|
const activityEl = document.getElementById('activity');
|
|
const reputationEl = document.getElementById('reputation');
|
|
const dayEl = document.getElementById('day');
|
|
const eventDisplayEl = document.getElementById('event-display');
|
|
const actionsEl = document.getElementById('actions');
|
|
const logEl = document.getElementById('log');
|
|
|
|
// Update the UI with current game state
|
|
function updateUI() {
|
|
membersEl.textContent = gameState.members;
|
|
activityEl.textContent = `${gameState.activity}%`;
|
|
reputationEl.textContent = `${gameState.reputation}%`;
|
|
dayEl.textContent = gameState.day;
|
|
|
|
// Update colors based on values
|
|
activityEl.className = gameState.activity < 30 ? 'negative' : gameState.activity > 70 ? 'positive' : '';
|
|
reputationEl.className = gameState.reputation < 30 ? 'negative' : gameState.reputation > 70 ? 'positive' : '';
|
|
}
|
|
|
|
// Add a message to the log
|
|
function addLog(message, type = '') {
|
|
const entry = document.createElement('div');
|
|
entry.className = `log-entry ${type}`;
|
|
entry.textContent = `Day ${gameState.day}: ${message}`;
|
|
logEl.appendChild(entry);
|
|
logEl.scrollTop = logEl.scrollHeight;
|
|
}
|
|
|
|
// Present a random event to the player
|
|
function presentEvent() {
|
|
if (gameState.gameOver) return;
|
|
|
|
const event = events[Math.floor(Math.random() * events.length)];
|
|
eventDisplayEl.textContent = event.text;
|
|
|
|
// Clear previous buttons
|
|
actionsEl.innerHTML = '';
|
|
|
|
// Create new buttons for each option
|
|
event.options.forEach((option, index) => {
|
|
const button = document.createElement('button');
|
|
button.textContent = option.text;
|
|
|
|
// Check if this option requires a power-up we don't have
|
|
if (option.powerUp && gameState.powerUps[option.powerUp] <= 0) {
|
|
button.disabled = true;
|
|
button.title = "No more uses left!";
|
|
}
|
|
|
|
button.addEventListener('click', () => {
|
|
handleChoice(option, event);
|
|
});
|
|
|
|
actionsEl.appendChild(button);
|
|
});
|
|
}
|
|
|
|
// Handle player's choice
|
|
function handleChoice(option, event) {
|
|
// Use power-up if needed
|
|
if (option.powerUp) {
|
|
gameState.powerUps[option.powerUp]--;
|
|
addLog(`Used ${option.powerUp} power-up.`, 'warning');
|
|
}
|
|
|
|
// Update game state
|
|
gameState.members += option.members || 0;
|
|
gameState.activity += option.activity || 0;
|
|
gameState.reputation += option.reputation || 0;
|
|
|
|
// Ensure values stay within bounds
|
|
gameState.members = Math.max(0, gameState.members);
|
|
gameState.activity = Math.max(0, Math.min(100, gameState.activity));
|
|
gameState.reputation = Math.max(0, Math.min(100, gameState.reputation));
|
|
|
|
// Log the result
|
|
let resultMessage = `You chose: ${option.text}. `;
|
|
if (option.members !== 0) {
|
|
resultMessage += `Members ${option.members > 0 ? '+' : ''}${option.members}. `;
|
|
}
|
|
if (option.activity !== 0) {
|
|
resultMessage += `Activity ${option.activity > 0 ? '+' : ''}${option.activity}%. `;
|
|
}
|
|
if (option.reputation !== 0) {
|
|
resultMessage += `Reputation ${option.reputation > 0 ? '+' : ''}${option.reputation}%. `;
|
|
}
|
|
|
|
addLog(resultMessage.trim());
|
|
|
|
// Advance to next day
|
|
gameState.day++;
|
|
|
|
// Check win/lose conditions
|
|
checkGameState();
|
|
|
|
// Update UI and present new event
|
|
updateUI();
|
|
|
|
if (!gameState.gameOver) {
|
|
setTimeout(presentEvent, 1000);
|
|
}
|
|
}
|
|
|
|
// Check win/lose conditions
|
|
function checkGameState() {
|
|
if (gameState.members >= 10000 && gameState.reputation >= 75) {
|
|
eventDisplayEl.textContent = "CONGRATULATIONS! You've grown the server to 10,000 members with great reputation! You win!";
|
|
gameState.gameOver = true;
|
|
actionsEl.innerHTML = '<button onclick="location.reload()">Play Again</button>';
|
|
addLog("YOU WIN! Server is thriving!", 'positive');
|
|
return;
|
|
}
|
|
|
|
if (gameState.members <= 100) {
|
|
eventDisplayEl.textContent = "GAME OVER! The server has died from lack of members. Maybe you were too strict?";
|
|
gameState.gameOver = true;
|
|
actionsEl.innerHTML = '<button onclick="location.reload()">Play Again</button>';
|
|
addLog("Game over - server died.", 'negative');
|
|
return;
|
|
}
|
|
|
|
if (gameState.reputation <= 20) {
|
|
eventDisplayEl.textContent = "GAME OVER! The community revolted against your moderation and you were demoted.";
|
|
gameState.gameOver = true;
|
|
actionsEl.innerHTML = '<button onclick="location.reload()">Play Again</button>';
|
|
addLog("Game over - you were demoted.", 'negative');
|
|
return;
|
|
}
|
|
|
|
if (gameState.reputation >= 90 && Math.random() < 0.3) {
|
|
addLog("The server owner promoted you to Admin for your great work!", 'positive');
|
|
gameState.powerUps.adminBackup += 2;
|
|
}
|
|
|
|
// Random member growth based on reputation and activity
|
|
const growthFactor = (gameState.reputation / 100) * (gameState.activity / 100);
|
|
const randomGrowth = Math.floor(Math.random() * 20 * growthFactor);
|
|
if (randomGrowth > 0) {
|
|
gameState.members += randomGrowth;
|
|
addLog(`Server grew by ${randomGrowth} members organically!`, 'positive');
|
|
}
|
|
|
|
// Random events
|
|
if (Math.random() < 0.2) {
|
|
const randomEvent = Math.random();
|
|
if (randomEvent < 0.3) {
|
|
// Good event
|
|
gameState.reputation += 5;
|
|
addLog("A user complimented your moderation style in #feedback!", 'positive');
|
|
} else if (randomEvent < 0.6) {
|
|
// Bad event
|
|
gameState.activity -= 10;
|
|
addLog("A popular meme channel went quiet for a day.", 'negative');
|
|
} else {
|
|
// Neutral event
|
|
addLog("Nothing particularly interesting happened today.");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Initialize the game
|
|
updateUI();
|
|
presentEvent();
|
|
</script>
|
|
</body>
|
|
</html>
|