Skip to content

Commit

Permalink
feat: generate unidirectional portals (fixes #59)
Browse files Browse the repository at this point in the history
  • Loading branch information
ssube committed May 23, 2021
1 parent 0b9c2e9 commit b96a040
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 17 deletions.
2 changes: 2 additions & 0 deletions data/base.yml
Expand Up @@ -278,6 +278,8 @@ worlds:
base: door
dest:
base: room-cave
link:
base: forward
- sourceGroup:
base: east
targetGroup:
Expand Down
29 changes: 28 additions & 1 deletion src/model/entity/Portal.ts
@@ -1,4 +1,11 @@
import { BaseTemplate } from '../meta/Template';
import { JSONSchemaType } from 'ajv';

import { BaseTemplate, TEMPLATE_STRING_SCHEMA } from '../meta/Template';

export enum PortalLinkage {
FORWARD = 'forward',
BOTH = 'both',
}

export interface Portal {
/**
Expand All @@ -20,9 +27,29 @@ export interface Portal {
* The destination room.
*/
dest: string;

link: PortalLinkage;
}

export type PortalGroups = Map<string, {
dests: Set<string>;
portals: Set<BaseTemplate<Portal>>;
}>;

export const PORTAL_SCHEMA: JSONSchemaType<BaseTemplate<Portal>> = {
type: 'object',
properties: {
dest: TEMPLATE_STRING_SCHEMA,
link: {
...TEMPLATE_STRING_SCHEMA,
default: {
base: 'both',
type: 'string',
},
},
name: TEMPLATE_STRING_SCHEMA,
sourceGroup: TEMPLATE_STRING_SCHEMA,
targetGroup: TEMPLATE_STRING_SCHEMA,
},
required: ['name', 'dest', 'sourceGroup', 'targetGroup'],
};
7 changes: 2 additions & 5 deletions src/model/entity/Room.ts
Expand Up @@ -8,7 +8,7 @@ import { Template, TEMPLATE_REF_SCHEMA } from '../meta/Template';
import { Actor } from './Actor';
import { Entity } from './Base';
import { Item } from './Item';
import { Portal } from './Portal';
import { Portal, PORTAL_SCHEMA } from './Portal';

export const ROOM_TYPE = 'room' as const;

Expand Down Expand Up @@ -44,10 +44,7 @@ export const ROOM_SCHEMA: JSONSchemaType<Template<Room>> = {
},
portals: {
type: 'array',
items: {
type: 'object',
required: [],
},
items: PORTAL_SCHEMA,
},
slots: {
type: 'object',
Expand Down
16 changes: 14 additions & 2 deletions src/util/debug.ts
@@ -1,3 +1,4 @@
import { PortalLinkage } from '../model/entity/Portal';
import { State } from '../model/State';

export function debugState(state: State): Array<string> {
Expand Down Expand Up @@ -34,7 +35,7 @@ export function graphState(state: State): Array<string> {
}

const lines = [
'strict graph {',
'strict digraph {',
];

// add rooms as nodes
Expand All @@ -43,7 +44,18 @@ export function graphState(state: State): Array<string> {
// add edges between rooms
for (const room of state.rooms) {
for (const portal of room.portals) {
lines.push(` ${sanitize(room.meta.id)} -- ${sanitize(portal.dest)} [label="${portal.sourceGroup} -> ${portal.name} -> ${portal.targetGroup}"];`);
const segments = [
` ${sanitize(room.meta.id)} -> ${sanitize(portal.dest)}`,
'[',
`label="${portal.sourceGroup} -> ${portal.name} -> ${portal.targetGroup}"`,
];

/* if (portal.link === PortalLinkage.BOTH) {
segments.push('dir=none');
} */

segments.push('];');
lines.push(segments.join(' '));
}
}

Expand Down
21 changes: 13 additions & 8 deletions src/util/state/EntityGenerator.ts
Expand Up @@ -3,7 +3,7 @@ import { BaseOptions, Inject, Logger } from 'noicejs';

import { Actor, ACTOR_TYPE, ActorType } from '../../model/entity/Actor';
import { Item, ITEM_TYPE } from '../../model/entity/Item';
import { Portal, PortalGroups } from '../../model/entity/Portal';
import { Portal, PortalGroups, PortalLinkage } from '../../model/entity/Portal';
import { Room, ROOM_TYPE } from '../../model/entity/Room';
import { Metadata } from '../../model/meta/Metadata';
import { BaseTemplate, Template, TemplateMetadata } from '../../model/meta/Template';
Expand Down Expand Up @@ -237,22 +237,27 @@ export class StateEntityGenerator {
rooms.push(destRoom);

for (const portal of group.portals) {
const link = this.template.renderString(portal.link) as PortalLinkage;
const name = this.template.renderString(portal.name);
const targetGroup = this.template.renderString(portal.targetGroup);

portals.push({
dest: destRoom.meta.id,
link,
name,
sourceGroup,
targetGroup,
dest: destRoom.meta.id,
});

destRoom.portals.push({
name,
sourceGroup: targetGroup,
targetGroup: sourceGroup,
dest: sourceId,
});
if (link === PortalLinkage.BOTH) {
destRoom.portals.push({
dest: sourceId,
link,
name,
sourceGroup: targetGroup,
targetGroup: sourceGroup,
});
}
}

const further = await this.populateRoom(destRoom, depth - 1);
Expand Down
2 changes: 1 addition & 1 deletion test/util/TestDebug.ts
Expand Up @@ -59,7 +59,7 @@ describe('state debug utils', () => {
};

const lines = await graphState(state);
expect(lines).to.include('strict graph {');
expect(lines).to.include('strict digraph {');

for (const room of state.rooms) {
expect(lines).to.include(room.meta.name);
Expand Down

0 comments on commit b96a040

Please sign in to comment.