Skip to content

Commit

Permalink
feat(script): remove direct access to state, rename signal constants,…
Browse files Browse the repository at this point in the history
… begin testing local state
  • Loading branch information
ssube committed Jun 5, 2021
1 parent ee7db0b commit 418d843
Show file tree
Hide file tree
Showing 22 changed files with 556 additions and 211 deletions.
2 changes: 1 addition & 1 deletion src/module/CoreModule.ts
Expand Up @@ -28,7 +28,7 @@ import { RandomGenerator } from '../service/random';
import { AleaRandomGenerator } from '../service/random/AleaRandom';
import { ScriptService } from '../service/script';
import { LocalScriptService } from '../service/script/LocalScript';
import { LocalStateService } from '../service/state/TurnState';
import { LocalStateService } from '../service/state/LocalState';
import { TemplateService } from '../service/template';
import { ChainTemplateService } from '../service/template/ChainTemplateService';
import { TokenizerService } from '../service/tokenizer';
Expand Down
2 changes: 1 addition & 1 deletion src/script/signal/actor/ActorGet.ts
Expand Up @@ -10,6 +10,6 @@ export async function SignalActorGet(this: ScriptTarget, context: ScriptContext)

if (this.actorType === ActorType.PLAYER) {
const item = mustExist(context.item);
await context.stateHelper.show('actor.get.player', { item });
await context.state.show('actor.get.player', { item });
}
}
6 changes: 3 additions & 3 deletions src/script/signal/actor/ActorHit.ts
Expand Up @@ -13,7 +13,7 @@ export async function SignalActorHit(this: ScriptTarget, context: ScriptContext)
const attacker = mustExist(context.actor);
const item = mustExist(context.item);

await context.stateHelper.show('actor.hit.hit', {
await context.state.show('actor.hit.hit', {
actor: this,
attacker,
item,
Expand All @@ -24,7 +24,7 @@ export async function SignalActorHit(this: ScriptTarget, context: ScriptContext)

const health = decrementKey(this.stats, STAT_HEALTH, damage);
if (health > 0) {
await context.stateHelper.show('actor.hit.health', { actor: this, health });
await context.state.show('actor.hit.health', { actor: this, health });
} else {
// drop inventory
const room = mustExist(context.room);
Expand All @@ -35,6 +35,6 @@ export async function SignalActorHit(this: ScriptTarget, context: ScriptContext)
target: room,
}, context);
}
await context.stateHelper.show('actor.hit.dead', { actor: this });
await context.state.show('actor.hit.dead', { actor: this });
}
}
10 changes: 5 additions & 5 deletions src/script/signal/actor/ActorStep.ts
Expand Up @@ -21,8 +21,8 @@ export async function SignalActorStep(this: ScriptTarget, context: ScriptContext
const health = getKey(this.stats, STAT_HEALTH, 0);
if (health <= 0) {
if (this.actorType === ActorType.PLAYER) {
await context.stateHelper.show('actor.step.command.dead', { actor: this });
await context.stateHelper.quit();
await context.state.show('actor.step.command.dead', { actor: this });
await context.state.quit();
}
return;
}
Expand All @@ -45,16 +45,16 @@ export async function SignalActorStep(this: ScriptTarget, context: ScriptContext

const scripts = getVerbScripts(source);
if (scripts.has(command.verb) === false) {
await context.stateHelper.show('actor.step.command.unknown', showContext, ShowVolume.SELF, source);
await context.state.show('actor.step.command.unknown', showContext, ShowVolume.SELF, source);
context.logger.warn({ command }, 'unknown verb');
return;
}

if (this.actorType === ActorType.PLAYER) {
if (command.target.length > 0) {
await context.stateHelper.show('actor.step.command.player.target', showContext, ShowVolume.SELF, source);
await context.state.show('actor.step.command.player.target', showContext, ShowVolume.SELF, source);
} else {
await context.stateHelper.show('actor.step.command.player.verb', showContext, ShowVolume.SELF, source);
await context.state.show('actor.step.command.player.verb', showContext, ShowVolume.SELF, source);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/script/signal/item/ItemUse.ts
Expand Up @@ -5,5 +5,5 @@ import { ScriptContext, ScriptTarget } from '../../../service/script';
export async function SignalItemUse(this: ScriptTarget, context: ScriptContext): Promise<void> {
const actor = mustExist(context.actor);

await context.stateHelper.show('item.use.any', { actor, item: this });
await context.state.show('item.use.any', { actor, item: this });
}
4 changes: 2 additions & 2 deletions src/script/verb/ActorDrop.ts
Expand Up @@ -14,7 +14,7 @@ export async function VerbActorDrop(this: ScriptTarget, context: ScriptContext):
const command = mustExist(context.command);
const room = mustExist(context.room);

const results = await context.stateHelper.find({
const results = await context.state.find({
actor: {
id: this.meta.id,
},
Expand All @@ -29,7 +29,7 @@ export async function VerbActorDrop(this: ScriptTarget, context: ScriptContext):

const moving = indexEntity(results, command.index, isItem);
if (isNil(moving)) {
await context.stateHelper.show('actor.step.drop.type', { command });
await context.state.show('actor.step.drop.type', { command });
return;
}

Expand Down
12 changes: 6 additions & 6 deletions src/script/verb/ActorHit.ts
Expand Up @@ -4,7 +4,7 @@ import { ScriptTargetError } from '../../error/ScriptTargetError';
import { isActor } from '../../model/entity/Actor';
import { ScriptContext, ScriptTarget } from '../../service/script';
import { ShowVolume } from '../../util/actor';
import { SLOT_HIT } from '../../util/constants';
import { SIGNAL_HIT } from '../../util/constants';
import { FUZZY_MATCHERS, indexEntity } from '../../util/entity';

export async function VerbActorHit(this: ScriptTarget, context: ScriptContext): Promise<void> {
Expand All @@ -15,7 +15,7 @@ export async function VerbActorHit(this: ScriptTarget, context: ScriptContext):
const command = mustExist(context.command);
const room = mustExist(context.room);

const results = await context.stateHelper.find({
const results = await context.state.find({
meta: {
name: command.target,
},
Expand All @@ -27,30 +27,30 @@ export async function VerbActorHit(this: ScriptTarget, context: ScriptContext):
const target = indexEntity(results, command.index, isActor);

if (isNil(target)) {
await context.stateHelper.show('actor.step.hit.type', { command }, ShowVolume.SELF, {
await context.state.show('actor.step.hit.type', { command }, ShowVolume.SELF, {
actor: this,
room,
});
return;
}

if (this === target) {
await context.stateHelper.show('actor.step.hit.self', { command }, ShowVolume.SELF, {
await context.state.show('actor.step.hit.self', { command }, ShowVolume.SELF, {
actor: this,
room,
});
return;
}

if (this.items.length === 0) {
await context.stateHelper.show('actor.step.hit.item', { target }, ShowVolume.SELF, {
await context.state.show('actor.step.hit.item', { target }, ShowVolume.SELF, {
actor: this,
room,
});
return;
}

await context.script.invoke(target, SLOT_HIT, {
await context.script.invoke(target, SIGNAL_HIT, {
...context,
actor: this,
item: this.items[0],
Expand Down
18 changes: 9 additions & 9 deletions src/script/verb/ActorLook.ts
Expand Up @@ -23,7 +23,7 @@ export async function VerbActorLook(this: ScriptTarget, context: ScriptContext):
}

export async function ActorLookTarget(this: Actor, context: ScriptContext, targetName: string): Promise<void> {
const results = await context.stateHelper.find({
const results = await context.state.find({
meta: {
name: targetName,
},
Expand Down Expand Up @@ -53,16 +53,16 @@ export async function ActorLookTarget(this: Actor, context: ScriptContext, targe
});
}

await context.stateHelper.show('actor.step.look.none');
await context.state.show('actor.step.look.none');
}

export async function ActorLookRoom(this: Actor, context: ScriptContext): Promise<void> {
const room = mustExist(context.room);
await context.stateHelper.show('actor.step.look.room.you', { actor: this });
await context.stateHelper.show('actor.step.look.room.seen', { room });
await context.state.show('actor.step.look.room.you', { actor: this });
await context.state.show('actor.step.look.room.seen', { room });

for (const item of this.items) {
await context.stateHelper.show('actor.step.look.room.inventory', { item });
await context.state.show('actor.step.look.room.inventory', { item });
}

for (const actor of room.actors) {
Expand All @@ -82,20 +82,20 @@ export async function ActorLookRoom(this: Actor, context: ScriptContext): Promis
}

for (const portal of room.portals) {
await context.stateHelper.show('actor.step.look.room.portal', { portal });
await context.state.show('actor.step.look.room.portal', { portal });
}
}

export async function ActorLookActor(this: Actor, context: ScriptContext): Promise<void> {
const actor = mustExist(context.actor);
await context.stateHelper.show('actor.step.look.actor.seen', { actor });
await context.state.show('actor.step.look.actor.seen', { actor });
const health = getKey(actor.stats, STAT_HEALTH, 0);
if (health <= 0) {
await context.stateHelper.show('actor.step.look.actor.dead', { actor });
await context.state.show('actor.step.look.actor.dead', { actor });
}
}

export async function ActorLookItem(this: Actor, context: ScriptContext): Promise<void> {
const item = mustExist(context.item);
await context.stateHelper.show('actor.step.look.item.seen', { item });
await context.state.show('actor.step.look.item.seen', { item });
}
8 changes: 4 additions & 4 deletions src/script/verb/ActorMove.ts
Expand Up @@ -27,11 +27,11 @@ export async function VerbActorMove(this: ScriptTarget, context: ScriptContext):
const targetPortal = portals[command.index];

if (isNil(targetPortal)) {
await context.stateHelper.show('actor.step.move.missing', { command });
await context.state.show('actor.step.move.missing', { command });
return;
}

const rooms = await context.stateHelper.find({
const rooms = await context.state.find({
meta: {
id: targetPortal.dest,
},
Expand All @@ -50,7 +50,7 @@ export async function VerbActorMove(this: ScriptTarget, context: ScriptContext):
target: targetRoom,
}, context);

await context.stateHelper.show('actor.step.move.portal', {
await context.state.show('actor.step.move.portal', {
actor: this,
portal: targetPortal,
}, ShowVolume.SELF, {
Expand All @@ -60,7 +60,7 @@ export async function VerbActorMove(this: ScriptTarget, context: ScriptContext):

if (this.actorType === ActorType.PLAYER) {
context.logger.debug({ actor: this, room: targetRoom }, 'player entered room');
await context.stateHelper.enter({ actor: this, room: targetRoom });
await context.state.enter({ actor: this, room: targetRoom });
await ActorLookTarget.call(this, context, targetPortal.dest);
}
}
4 changes: 2 additions & 2 deletions src/script/verb/ActorTake.ts
Expand Up @@ -16,7 +16,7 @@ export async function VerbActorTake(this: ScriptTarget, context: ScriptContext):
context.logger.debug({ command, room }, 'taking item from room');

const valid = new Set(room.items.map((it) => it.meta.id));
const results = await context.stateHelper.find({
const results = await context.state.find({
meta: {
name: command.target,
},
Expand All @@ -39,7 +39,7 @@ export async function VerbActorTake(this: ScriptTarget, context: ScriptContext):
const moving = indexEntity(results, command.index, isItem);

if (isNil(moving)) {
await context.stateHelper.show('actor.step.take.type', { command });
await context.state.show('actor.step.take.type', { command });
return;
}

Expand Down
8 changes: 4 additions & 4 deletions src/script/verb/ActorUse.ts
Expand Up @@ -4,7 +4,7 @@ import { ScriptTargetError } from '../../error/ScriptTargetError';
import { isActor } from '../../model/entity/Actor';
import { isItem } from '../../model/entity/Item';
import { ScriptContext, ScriptTarget } from '../../service/script';
import { SLOT_USE } from '../../util/constants';
import { SIGNAL_USE } from '../../util/constants';
import { FUZZY_MATCHERS, indexEntity } from '../../util/entity';

export async function VerbActorUse(this: ScriptTarget, context: ScriptContext): Promise<void> {
Expand All @@ -14,7 +14,7 @@ export async function VerbActorUse(this: ScriptTarget, context: ScriptContext):

const command = mustExist(context.command);
const room = mustExist(context.room);
const results = await context.stateHelper.find({
const results = await context.state.find({
meta: {
name: command.target,
},
Expand All @@ -26,11 +26,11 @@ export async function VerbActorUse(this: ScriptTarget, context: ScriptContext):
const target = indexEntity(results, command.index, isItem);

if (!isItem(target)) {
await context.stateHelper.show('actor.step.use.type', { command });
await context.state.show('actor.step.use.type', { command });
return;
}

await context.script.invoke(target, SLOT_USE, {
await context.script.invoke(target, SIGNAL_USE, {
...context,
actor: this,
});
Expand Down
2 changes: 1 addition & 1 deletion src/service/script/LocalScript.ts
Expand Up @@ -93,7 +93,7 @@ export class LocalScriptService implements ScriptService {
}

public async broadcast(filter: Partial<SearchParams>, slot: string, scope: SuppliedScope): Promise<void> {
const targets = await scope.stateHelper.find(filter);
const targets = await scope.state.find(filter);

for (const target of targets) {
await this.invoke(target as WorldEntity, slot, scope);
Expand Down
13 changes: 5 additions & 8 deletions src/service/script/index.ts
Expand Up @@ -5,11 +5,10 @@ import { WorldEntity } from '../../model/entity';
import { Actor } from '../../model/entity/Actor';
import { Item } from '../../model/entity/Item';
import { Room } from '../../model/entity/Room';
import { WorldState } from '../../model/world/State';
import { ShowVolume, StateSource } from '../../util/actor';
import { SearchParams } from '../../util/state';
import { ActorTransfer, ItemTransfer, StateEntityTransfer } from '../../util/state/EntityTransfer';
import { Immutable, ScriptData } from '../../util/types';
import { ScriptData } from '../../util/types';
import { LocaleContext } from '../locale';
import { RandomGenerator } from '../random';

Expand All @@ -36,16 +35,14 @@ export interface SuppliedScope {
random: RandomGenerator;

/**
* Immutable reference to state for broadcast, lookups, etc.
*
* @todo remove direct reference
* Safe access to search and modify state.
*/
state: Immutable<WorldState>;

stateHelper: StateHelper;
state: StateHelper;

/**
* Entity transfer helper.
*
* @todo remove in favor of state.move
*/
transfer: StateEntityTransfer;

Expand Down

0 comments on commit 418d843

Please sign in to comment.