MapGenerator
is a JavaScript class designed for generating and managing game maps using various pathfinding and maze generation algorithms. It provides a flexible and efficient way to create and manipulate multidimensional arrays for game development and other applications.
- Map Generation: Create and manage 2D maps with customizable dimensions and base values.
- Pathfinding Algorithms: Generate paths using algorithms like Prim's, Wilson's, Recursive, and Crawling.
- Randomization: Randomly place values on the map with specified probabilities.
- Index Management: Set and get values at specific indexes with ease.
- Procedural Generation: Supports procedural content generation for dynamic map creation.
- Map Generation: Create and manage 2D maps with customizable dimensions and base values.
- Pathfinding: Implement algorithms to find paths through a grid, useful for navigation and route optimization.
- Maze Generation: Generate mazes using different algorithms, providing structured paths and challenges.
- Algorithmic Generation: Use algorithms to procedurally generate content, ensuring efficient and scalable creation.
- Grid Management: Manage a grid or multidimensional array structure, providing methods to access and modify elements.
- Procedural Generation: Dynamically generate content based on algorithms, allowing for unique map layouts.
- Recursive: Utilize recursive algorithms for path and maze generation, efficiently exploring paths.
- Randomization: Introduce randomness in map and path generation, creating varied layouts for replayability.
- Crawling: Implement crawling algorithms to explore and generate paths, simulating natural exploration.
- Index Management: Handle operations based on grid indexes, ensuring efficient access and modification of elements.
- Value Assignment: Allow setting and updating values at specific grid locations, supporting batch operations.
- Game Development: Provide tools and methods for creating game maps and levels, supporting common development needs.
- Multidimensional Array: Operate on 2D arrays to represent maps and grids, supporting complex data structures.
- Path Algorithms: Implement various algorithms for path creation and optimization, including well-known methods.
- Grid Navigation: Facilitate movement and exploration within a grid, providing methods to traverse elements.
To use mapGenerator
in your project, install it via npm:
npm install @nichathan-gaming/map-generator
Here’s a basic example of how to use the MapGenerator class:
//define base values
const equalityFunction: equalityFunctionType<number> = (a:number, b:number):boolean=>a===b
const startingIndex: index = [0, 0]
//randomly places unwalkable paths around the map
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateRandomly(0.75).logMap()
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateRandomly(0.5).logMap()
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateRandomly(0.25).logMap()
//randomly crawls across the map horizontally and vertically
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateCrawler(5, 3).logMap()
//recursively traverses the map creating a path
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateRecursively(startingIndex, 1, true).logMap()
//traverses the map by creating new paths until they connect to the main path or are impossible to connect following Wilson's algorithm
new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generateWilsons(startingIndex, 1, 2, true).logMap()
//traverses the map by creating a minimum spanning tree following Prim's algorithm
const map = new mapGenerator<number>(10, 10, 0, 1, equalityFunction).generatePrims(startingIndex, 1, true).logMap()
//get and shuffle the walkable indexes
const walkablePath = mapGenerator.shuffleArray(map.getWalkableIndexes())
//test the pathfinding
console.log(`starting index for path: [${walkablePath[0]}], ending index for path: [${walkablePath[1]}]`)
const foundPath = map.getPath(walkablePath[0], walkablePath[1])
console.log(foundPath)
-
MapGenerator(width: number, height: number, baseElement: T)
: Initializes a new map with the given dimensions and base value.
-
getNeighborsForPath(index: index, pathingValue: T, isOffMapPathed: boolean): [number[], number[]]
: Searches the 8 cells around an index to create an array of the neighbors that do and don't match the pathingValue -
areValuesAtIndexesEqual(indexA: index, indexB: index): boolean
: Determines if the values at two given indexes are equal using the provided equality function. -
isValueAtIndexEqualToValue(index: index, value: T): boolean
: Checks if the value at a given index is equal to a specified value. -
areValuesEqual(valueA: T, valueB: T): boolean
: Determines if two values are equal using the provided equality function. -
isIndexUnwalkable(index: index): boolean
: Checks if the value at a given index is equal to the unwalkable value. -
isValueUnwalkable(value: T): boolean
: Determines if a given value is equal to the unwalkable value. -
isIndexWalkable(index: index): boolean
: Checks if the value at a given index is equal to the walkable value. -
isValueWalkable(value: T): boolean
: Determines if a given value is equal to the walkable value. -
getMultArray(): T[][]
: Returns the current multidimensional array. -
getWidth(): number
: Returns the width of the map. -
getHeight(): number
: Returns the height of the map. -
getWalkableValue(): T
: Returns the walkable value used in the map. -
getUnwalkableValue(): T
: Returns the unwalkable value used in the map. -
isValidIndex(index: index): boolean
: Checks if a given index is within the bounds of the map. -
getValueAtIndex(index: index): T
: Retrieves the value at a specified index. -
getAllIndexesForValue(value: T): index[]
: Returns an array of indexes where the specified value is found. -
getWalkableIndexes(): index[]
: Returns an array of indexes with the walkable value. -
getUnwalkableIndexes(): index[]
: Returns an array of indexes with the unwalkable value. -
getPath(startingIndex: index, endingIndex: index): index[] | null
: Finds a path between two indexes or returns null if no path is available.
-
changeGeneratedType(generatedType: generatedType): mapGenerator<T>
: Changes the current generated type. -
changeEqualityFunction(equalityFunction: equalityFunctionType<T>): mapGenerator<T>
: Changes the current equality function. -
setWalkableValue(newWalkableValue: T): mapGenerator<T>
: Sets a new walkable value for the map. -
setUnwalkableValue(newUnwalkableValue: T): mapGenerator<T>
: Sets a new unwalkable value for the map. -
setValueAtIndex(index: index, value: T): mapGenerator<T>
: Sets a value at a specified index. Throws an error if the index is not valid. -
setValueAtIndexes(value: T, ...indexes: index[]): mapGenerator<T>
: Sets a value at multiple specified indexes. -
setValuesAtIndexes(...indexValues: indexValue<T>[]): mapGenerator<T>
: Sets values at specified indexes using an array of index-value pairs. -
setWalkableValueAtIndex(index: index): mapGenerator<T>
: Sets the walkable value at a specified index if it is valid. -
setWalkableValueAtIndexes(...indexes: index[]): mapGenerator<T>
: Sets the walkable value at multiple specified indexes. -
setUnwalkableValueAtIndex(index: index): mapGenerator<T>
: Sets the unwalkable value at a specified index if it is valid. -
setUnwalkableValueAtIndexes(...indexes: index[]): mapGenerator<T>
: Sets the unwalkable value at multiple specified indexes. -
fillWithValue(value: T): mapGenerator<T>
: Fills the entire multidimensional array with a specified value.
-
findDisplayIndex(index: index, pathingValue: T, isOffMapPathed: boolean): index
: Finds the display index for Nichathan Gaming's mapRenderer -
addBorder(size: number, value: T): mapGenerator<T>
: Adds a border to this mapGenerator. -
addWalkableBorder(size: number): mapGenerator<T>
: Adds a border to this mapGenerator. With the walkableValue for the border. -
addUnwalkableBorder(size: number): mapGenerator<T>
: Adds a border to this mapGenerator. With the unwalkableValue for the border. -
multiplyMap(amount: number): mapGenerator<T>
: Increases the map by the given amount. -
logMap(): mapGenerator<T>
: Logs the current state of the multidimensional array to the console. -
static shuffleArray<U>(array: U[]): U[]
: Shuffles the elements of an array and returns the shuffled array.
-
generateRandomly(randomChance: number): mapGenerator<T>
: Randomly places the unwalkable value across the map with a specified probability. -
generateCrawler(verticalCrawlCount: number, horizontalCrawlCount: number): mapGenerator<T>
: Generates a path using a crawling algorithm. -
generateRecursively(startIndex: index, maxPathSize: number, shouldFillHoles: boolean): mapGenerator<T>
: Recursively generates a path starting from a specified index. -
generateWilsons(startIndex: index, maxPathSize: number, possiblePathValue: T, shouldFillHoles: boolean): mapGenerator<T>
: Generates a path using Wilson's algorithm. -
generatePrims(startIndex: index, maxPathSize: number, shouldFillHoles: boolean): mapGenerator<T>
: Generates a path using Prim's algorithm.
Contributions are welcome! If you have ideas for improvements or new features, feel free to open an issue or submit a pull request. Please ensure that your contributions align with the project's goals and coding standards.
-
Fork the Repository:
- Click the "Fork" button at the top right of the repository page to create a copy of the repository under your GitHub account.
-
Clone Your Fork:
-
Clone your forked repository to your local machine using the following command:
git clone https://github.com/J-M-Nichols/MapGenerator.git
-
-
Create a Branch:
-
Create a new branch for your feature or bug fix:
git checkout -b feature-or-bugfix-name
-
-
Make Your Changes:
- Implement your changes or new features in your local repository.
-
Test Your Changes:
- Ensure that your changes are thoroughly tested and do not break existing functionality.
-
Commit Your Changes:
-
Commit your changes with a descriptive commit message:
git commit -m "Description of changes"
-
-
Push to Your Fork:
-
Push your changes to your forked repository:
git push origin feature-or-bugfix-name
-
-
Open a Pull Request:
- Navigate to the original repository and click the "New Pull Request" button.
- Select your branch and submit the pull request for review.
This project is licensed under the MIT License. See the LICENSE file for more details.
- Thanks to all contributors and users who have helped improve this project.
- Special thanks to the developers of the algorithms and techniques used in this project.