A cool cabin

This commit is contained in:
2021-10-18 12:39:53 -04:00
parent 2313d68965
commit 5f65b00394
10 changed files with 129 additions and 2 deletions

15
src/hollywoo/Director.hx Normal file
View File

@@ -0,0 +1,15 @@
package hollywoo;
import hollywoo.Stage;
enum Appearance {
FirstAppearance;
ReAppearance; // Could count the number of appearances with an int, but I don't see any reason that would be important
}
typedef Continuation = Void -> Void;
interface Director<Set, StagePosition, StageFacing, ScreenPosition, Actor> {
function showSet(set:Set, appearance:Appearance, cc:Continuation):Void;
function showCharacter(character:Character<StagePosition, StageFacing, Actor>, appearance:Appearance, cc:Continuation):Void;
}

View File

@@ -0,0 +1 @@
(defNew [director] (super director))

View File

@@ -2,6 +2,12 @@ package hollywoo;
import kiss.Kiss;
import kiss.Prelude;
import hollywoo.text.TextDirector;
import hollywoo.text.TextStage;
import kiss.EmbeddedScript;
@:build(kiss.EmbeddedScript.build("HollywooDSL.kiss", "examples/pure-hollywoo/basic.hollywoo"))
class BasicHollywoo extends TextStage {}
@:build(kiss.Kiss.build())
class Main {}

View File

@@ -1 +1,4 @@
(print "Hello world!")
(defMacro runTextExample [exampleClass]
`(.run (new ,exampleClass (new TextDirector))))
(runTextExample BasicHollywoo)

43
src/hollywoo/Stage.hx Normal file
View File

@@ -0,0 +1,43 @@
package hollywoo;
import kiss.EmbeddedScript;
enum SceneTime {
Morning;
Day;
Evening;
Night;
}
enum ScenePerspective {
Interior;
Exterior;
Mixed;
}
typedef Character<StagePosition, StageFacing, Actor> = {
stagePosition:StagePosition,
stageFacing:StageFacing,
actor:Actor
};
typedef Scene<Set, StagePosition, StageFacing, ScreenPosition, Actor> = {
set:Set,
characters:Map<String, Character<StagePosition, StageFacing, Actor>>,
time:SceneTime,
perspective:ScenePerspective
};
/**
* Model of a Hollywoo film
*/
@:build(kiss.Kiss.build())
class Stage<Set, StagePosition, StageFacing, ScreenPosition, Actor> extends kiss.EmbeddedScript {
// Mostly immutable, reusable resources:
var sets:Map<String, Set> = [];
var actors:Map<String, Actor> = [];
// Mutable representation of frames in time:
var scenes:Map<String, Scene<Set, StagePosition, StageFacing, ScreenPosition, Actor>> = [];
}

2
src/hollywoo/Stage.kiss Normal file
View File

@@ -0,0 +1,2 @@
// "View" in the Model-View-Controller architecture:
(defNew [&prop :Director<Set,StagePosition,StageFacing,ScreenPosition,Actor> director] (super))

View File

@@ -1,4 +1,4 @@
|||Title: The First Hollywoo Script
|||Title: The First Fountain->Hollywoo Script
Credit: written by
Author: Nat Quayle Nelson (she/her)
Contact: natquaylenelson@gmail.com

View File

@@ -0,0 +1 @@
(director.showSet (object name "Cabin" description "A cool cabin") FirstAppearance ->:Void {})

View File

@@ -0,0 +1,30 @@
package hollywoo.text;
import hollywoo.text.TextStage;
import hollywoo.Director;
class TextDirector implements Director<TextSet, TextStagePosition, TextStageFacing, TextScreenPosition, TextActor> {
public function new() {}
public function showSet(set:TextSet, appearance:Appearance, cc:Continuation) {
switch (appearance) {
case FirstAppearance:
Sys.println('-- ${set.name} --');
Sys.println(set.description);
case ReAppearance:
Sys.println('-- back at the ${set.name}');
}
cc();
}
public function showCharacter(character:TextCharacter, appearance:Appearance, cc:Continuation) {
switch ([appearance, character.stagePosition]) {
case [_, OffStage]:
case [FirstAppearance, OnStage]:
Sys.println('A ${character.actor.description} is onstage. This is ${character.actor.name}');
case [ReAppearance, OnStage]:
Sys.println('${character.actor.name} is here');
}
cc();
}
}

View File

@@ -0,0 +1,26 @@
package hollywoo.text;
import hollywoo.Stage;
typedef TextSet = {
name:String,
description:String
}
enum TextStagePosition {
OnStage;
OffStage;
}
typedef TextStageFacing = String;
typedef TextScreenPosition = Int; // number of line breaks to precede a SUPER
typedef TextCharacter = Character<TextStagePosition, TextStageFacing, TextActor>;
typedef TextActor = {
name:String,
description:String
};
typedef TextStage = Stage<TextSet, TextStagePosition, TextStageFacing, TextScreenPosition, TextActor>;