UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

159 lines (138 loc) • 7.12 kB
import { MirMarkerTags } from "../../../../generator/MirMarkerTags.js"; import { MirMarkerTypes } from "../../../../generator/MirMarkerTypes.js"; import { bitwiseAnd } from "../../../src/core/binary/operations/bitwiseAnd.js"; import { Transform } from "../../../src/engine/ecs/transform/Transform.js"; import { CellFilterLiteralFloat } from "../../../src/generation/filtering/numeric/CellFilterLiteralFloat.js"; import { GridTaskActionRuleSet } from "../../../src/generation/grid/generation/discrete/GridTaskActionRuleSet.js"; import { MarkerNodeEmitterFromAction } from "../../../src/generation/markers/emitter/MarkerNodeEmitterFromAction.js"; import { MarkerNodeEmitterGridCellAction } from "../../../src/generation/markers/emitter/MarkerNodeEmitterGridCellAction.js"; import { MarkerNodeEmitterPredicated } from "../../../src/generation/markers/emitter/MarkerNodeEmitterPredicated.js"; import { GridActionRuleSet } from "../../../src/generation/markers/GridActionRuleSet.js"; import { GridCellActionPlaceMarker } from "../../../src/generation/markers/GridCellActionPlaceMarker.js"; import { GridCellActionPlaceMarkerGroup } from "../../../src/generation/markers/GridCellActionPlaceMarkerGroup.js"; import { MarkerNodeMatcherAny } from "../../../src/generation/markers/matcher/MarkerNodeMatcherAny.js"; import { MarkerNodeMatcherByType } from "../../../src/generation/markers/matcher/MarkerNodeMatcherByType.js"; import { GridDataNodePredicateNot } from "../../../src/generation/markers/predicate/GridDataNodePredicateNot.js"; import { GridDataNodePredicateOverlaps } from "../../../src/generation/markers/predicate/GridDataNodePredicateOverlaps.js"; import { MarkerNodeTransformerOffsetPosition } from "../../../src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js"; import { MarkerNodeTransformerRecordUniqueRandomEnum } from "../../../src/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js"; import { GridCellActionPlaceTags } from "../../../src/generation/placement/action/GridCellActionPlaceTags.js"; import { GridCellActionSequence } from "../../../src/generation/placement/action/util/GridCellActionSequence.js"; import { GridCellPlacementRule } from "../../../src/generation/placement/GridCellPlacementRule.js"; import { CellMatcherContainsMarkerWithinRadius } from "../../../src/generation/rules/cell/CellMatcherContainsMarkerWithinRadius.js"; import { CellMatcherGridPattern } from "../../../src/generation/rules/cell/CellMatcherGridPattern.js"; import { CellMatcherNot } from "../../../src/generation/rules/logic/CellMatcherNot.js"; import { GridTags } from "../grid/GridTags.js"; import { MirGridLayers } from "../grid/MirGridLayers.js"; import { matcher_tag_traversable_unoccupied } from "../rules/matcher_tag_traversable_unoccupied.js"; const pMatcher = new CellMatcherGridPattern(); pMatcher.addRule(0, 0, matcher_tag_traversable_unoccupied); pMatcher.addRule(1, 0, matcher_tag_traversable_unoccupied); pMatcher.addRule(0, 1, matcher_tag_traversable_unoccupied); pMatcher.addRule(1, 1, matcher_tag_traversable_unoccupied); //no other bases nearby pMatcher.addRule(0, 0, CellMatcherNot.from( CellMatcherContainsMarkerWithinRadius.from(MarkerNodeMatcherByType.from(MirMarkerTypes.Base), 25) )); const placeTags = new GridCellActionPlaceTags(); placeTags.layerId = MirGridLayers.Tags; placeTags.resize(2, 2); placeTags.fill(GridTags.Base | GridTags.Occupied); const clearTags = new GridCellActionPlaceTags(); clearTags.layerId = MirGridLayers.Tags; clearTags.resize(2, 2); clearTags.fill(~GridTags.Traversable); clearTags.operation = bitwiseAnd; const placeRoadConnector0 = GridCellActionPlaceMarker.from({ type: 'Road Connector' }); placeRoadConnector0.offset.set(-1, 0); const placeRoadConnector1 = GridCellActionPlaceMarker.from({ type: 'Road Connector' }); placeRoadConnector1.offset.set(2, 1); const placeRoadConnector2 = GridCellActionPlaceMarker.from({ type: 'Road Connector' }); placeRoadConnector2.offset.set(1, -1); const placeRoadConnector3 = GridCellActionPlaceMarker.from({ type: 'Road Connector' }); placeRoadConnector3.offset.set(0, 2); const placeRoadConnectors = GridCellActionPlaceMarkerGroup.from([ placeRoadConnector0, placeRoadConnector1, placeRoadConnector2, placeRoadConnector3 ]); const name_set = []; for (let i = 0; i < 100; i++) { name_set.push(`base-${i}`); } const rule = GridCellPlacementRule.from({ matcher: pMatcher, action: GridCellActionSequence.from([ placeTags, clearTags, MarkerNodeEmitterGridCellAction.from( MarkerNodeEmitterPredicated.from({ predicate: GridDataNodePredicateNot.from(GridDataNodePredicateOverlaps.from(MarkerNodeMatcherAny.INSTANCE)), source: MarkerNodeEmitterFromAction.from([ GridCellActionPlaceMarker.from({ type: MirMarkerTypes.Base, size: 0.5, tags: ['Town', MirMarkerTags.Encounter], properties: { // assign to enemy team team: 1 }, transform: Transform.fromJSON({ position: { x: 0.5, y: 0, z: 0.5 } }), transformers: [ MarkerNodeTransformerRecordUniqueRandomEnum.from( 'name', name_set ) ] }), GridCellActionPlaceMarker.from({ type: 'Virtual', size: 0.5, transformers: [ MarkerNodeTransformerOffsetPosition.from(1, 0) ] }), GridCellActionPlaceMarker.from({ type: 'Virtual', size: 0.5, transformers: [ MarkerNodeTransformerOffsetPosition.from(0, 1) ] }), GridCellActionPlaceMarker.from({ type: 'Virtual', size: 0.5, transformers: [ MarkerNodeTransformerOffsetPosition.from(1, 1) ] }) ]) }) ), placeRoadConnectors ]), probability: CellFilterLiteralFloat.from(0.1) }); rule.allowRotation = false; /** * * @returns {GridTaskActionRuleSet} */ export const mir_generator_place_bases = () => GridTaskActionRuleSet.from({ rules: GridActionRuleSet.from({ rules: [rule] }) });