## Description: Some optimizations for bot & fakehuman execution. Better performance measured using profiling, at the start of a game or in singple player, but since the circumstances differ it is not a very reliable comparison. --- In BotExecution: Added getNeighborTraitorToAttack in Botbehavior to use in maybeAttack. No caching for playerNeighbors array, because although it could be re-used up to two times in selectRandomEnemy, maybeAttack runs every tick and selectEnemy only every 10 seconds so the cache overhead would not be worth it. --- In Botbehavior: Put repeated code in dedicated functions for readability, maintainance ease, and reduce the chances of forgetting to update the timestamp for enemyUpdated. Can be seen as a follow-up to PRs #434 and #946. -- In both selectEnemy and selectRandomEnemy: Put the first if this.enemy === null statement parenthesis, around the two checks below. Because if there's already an enemy (if forgetEnemies hasn't nullified it, enemy === null is false at the first if statement), then enemy === null will still be false for the two checks below the first. No need to check it thrice then. Once inside the first if statement (when enemy === null is true), then we need to check it two times more in case the code inside already set an enemy. -- In selectEnemy under 'Prefer neighboring bots': Removed unneccessary check for enemy === null. Replaced sort with more performant for loop. -- In selectRandomEnemy: Under 'Select a traitor as an enemy', if a traitor is a friendly player, they got less odds to be chosen as enemy over an unfriendly player, but they weren't ruled out. While below in the Sanity Check, we specifically rule out friendly players as enemy and set enemy=null. So excluded friendly players under 'Select a traitor as an enemy' instead of only giving them lower odds. Use the new shared method getNeighborTraitorToAttack. -- In checkIncomingAttacks, since we're only interested in the max value, replaced sort with loop that makes a single pass through the attacks to find the largest one. -- For shouldAcceptAllianceRequest, #1049 added tests and improved readability of Alliance requests. It may have also deoptimized it a bit. Const notTooManyAlliances would, in the past, not be computed if requestorIsMuchLarger was already found to be true. Since the readability changes, tooManyAlliances was always computed regardless of the value of requestorIsMuchLarger. This PR attempts to address this too, while still keeping it as readable hopefully. Also choose for early returns to optimize a bit more. So if isTraitor is true, don't compute any further and just return false immediately etc. Switched the order of testing for noMalice and isTraitor. Traitor status used to be throughout the game, now it's only 30 seconds or will be maybe 45 seconds to 1 minute. So the chances of someone asking for alliance and being a traitor at the same time have decreased. isMalice chances could be bigger. Removed the named constants and choose to put them in comments, so readability should be about the same as #1049 intended. Kept the braces for the if statements because otherwise Prettier would misalign the comments.) ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I understand that submitting code with bugs that could have been caught through manual testing blocks releases and new features for all contributors ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33
OpenFrontIO
OpenFront is an online real-time strategy game focused on territorial control and alliance building. Players compete to expand their territory, build structures, and form strategic alliances in various maps based on real-world geography.
This is a fork/rewrite of WarFront.io. Credit to https://github.com/WarFrontIO.
OpenFront - Licensing
This project uses a dual-licensing approach:
- Code in the
server/andcore/directory is licensed under MIT - Client code (in the
client/directory) is licensed under GPL v3
🌟 Features
- Real-time Strategy Gameplay: Expand your territory and engage in strategic battles
- Alliance System: Form alliances with other players for mutual defense
- Multiple Maps: Play across various geographical regions including Europe, Asia, Africa, and more
- Resource Management: Balance your expansion with defensive capabilities
- Cross-platform: Play in any modern web browser
📋 Prerequisites
- npm (v10.9.2 or higher)
- A modern web browser (Chrome, Firefox, Edge, etc.)
🚀 Installation
-
Clone the repository
git clone https://github.com/openfrontio/OpenFrontIO.git cd OpenFrontIO -
Install dependencies
npm i
🎮 Running the Game
Development Mode
Run both the client and server in development mode with live reloading:
npm run dev
This will:
- Start the webpack dev server for the client
- Launch the game server with development settings
- Open the game in your default browser
Client Only
To run just the client with hot reloading:
npm run start:client
Server Only
To run just the server with development settings:
npm run start:server-dev
🛠️ Development Tools
-
Format code:
npm run format -
Lint code:
npm run lint -
Lint and fix code:
npm run lint:fix -
Testing
npm test
🏗️ Project Structure
/src/client- Frontend game client/src/core- Shared game logic/src/server- Backend game server/resources- Static assets (images, maps, etc.)
📝 License
This project is licensed under the terms found in the LICENSE file.
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Request to join the development Discord.
- Fork the repository
- Create your feature branch (
git checkout -b amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin amazing-feature) - Open a Pull Request
🌐 Translation
Translators are welcome! Please feel free to help translate into your language. How to help?
- Request to join the translation Discord
- Go to the project's Crowdin translation page: https://crowdin.com/project/openfront-mls
- Login if you already have an account/ Sign up if you don't have one
- Select the language you want to translate in/ If your language isn't on the list, click the "Request New Language" button and enter the language you want added there.
- Translate the strings
Project Governance
- The project maintainer (evan) has final authority on all code changes and design decisions
- All pull requests require maintainer approval before merging
- The maintainer reserves the right to reject contributions that don't align with the project's vision or quality standards
Contribution Path for New Contributors
To ensure code quality and project stability, we use a progressive contribution system:
-
New Contributors: Limited to UI improvements and small bug fixes only
- This helps you become familiar with the codebase
- UI changes are easier to review and less likely to break core functionality
- Small, focused PRs have a higher chance of being accepted
-
Established Contributors: After several successful PRs and demonstrating understanding of the codebase, you may work on more complex features
-
Core Contributors: Only those with extensive experience with the project may modify critical game systems
How to Contribute Successfully
-
Before Starting Work:
- Open an issue describing what you want to contribute
- Wait for maintainer feedback before investing significant time
- Small improvements can proceed directly to PR stage
-
Code Quality Requirements:
- All code must be well-commented and follow existing style patterns
- New features should not break existing functionality
- Code should be thoroughly tested before submission
- All code changes in src/core MUST be tested.
-
Pull Request Process:
- Keep PRs focused on a single feature or bug fix
- Include screenshots for UI changes
- Describe what testing you've performed
- Be responsive to feedback and requested changes
-
Testing Requirements:
- Verify your changes work as expected
- Test on multiple systems/browsers if applicable
- Document your testing process in the PR
Communication
- Be respectful and constructive in all project interactions
- Questions are welcome, but please search existing issues first
- For major changes, discuss in an issue before starting work
Final Notes
Remember that maintaining this project requires significant effort. The maintainer appreciates your contributions but must prioritize long-term project health and stability. Not all contributions will be accepted, and that's okay.
Thank you for helping make OpenFront better!