| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-11 15:37:46 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-11 15:37:46 +0200 |
| commit | e9f9708a43fa6030a943478f203f08fc37aa28ec (patch) | |
| tree | 2136140a155362e33b60cb4bfcfa358a0de5b358 | |
| parent | 88657c6dba477efeb42dd1b94d7636f5633b38d4 (diff) | |
...
| -rw-r--r-- | data/examples/the_thief/include/characters.fate | 61 | ||||
| -rw-r--r-- | data/examples/the_thief/include/locations.fate | 2 | ||||
| -rw-r--r-- | data/examples/the_thief/include/type/character.fate | 12 | ||||
| -rw-r--r-- | data/examples/the_thief/include/type/location.fate | 3 | ||||
| -rw-r--r-- | data/examples/the_thief/include/type/stat.fate | 3 | ||||
| -rw-r--r-- | data/examples/the_thief/main.fate | 47 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/RefOperator.java | 44 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/RefType.java | 91 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Type.java | 3 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 3 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 24 |
11 files changed, 293 insertions, 0 deletions
diff --git a/data/examples/the_thief/include/characters.fate b/data/examples/the_thief/include/characters.fate new file mode 100644 index 0000000..4c36a8e --- /dev/null +++ b/data/examples/the_thief/include/characters.fate @@ -0,0 +1,61 @@ +(fate_version 1) + +(require include/type/character.fate) + +(declare_variable local character oscar) +(declare_variable local character carla) +(declare_variable local character simon) +(declare_variable local character julie) +(declare_variable local character statue) + +(require include/locations.fate) + +(set_fields + (name Oscar) + (agility 50) + (perception 50) + (money 20) + (location room0) + (variable oscar) +) + +(set_fields + (name Carla) + (agility 75) + (perception 35) + (money 7) + (location room1) + (variable carla) +) + +(set_fields + (name Simon) + (agility 35) + (perception 75) + (money 80) + (location room1) + (variable simon) +) + +(set_fields + (name Julie) + (agility 60) + (perception 60) + (money 90) + (location room2) + (variable julie) +) + +(set_fields + (name ( A oddly human shaped statue, with clothes adorned )) + (agility 0) + (perception 0) + (money 30) + (location corridor) + (variable statue) +) + +;; Alright, but we clearly need to be able to point to variables using a type. +;; like (pointer (variable carla)) -> pointer to variable of type character +;; (a string, really) resolves to (variable carla), but allows characters to be +;; put in a set, for example. diff --git a/data/examples/the_thief/include/locations.fate b/data/examples/the_thief/include/locations.fate new file mode 100644 index 0000000..d7beb18 --- /dev/null +++ b/data/examples/the_thief/include/locations.fate @@ -0,0 +1,2 @@ +(fate_version 1) + diff --git a/data/examples/the_thief/include/type/character.fate b/data/examples/the_thief/include/type/character.fate new file mode 100644 index 0000000..e3b1b7b --- /dev/null +++ b/data/examples/the_thief/include/type/character.fate @@ -0,0 +1,12 @@ +(fate_version 1) + +(require include/type/stat.fate) +(require include/type/location.fate) + +(declare_dict_type character + (string name) + (stat agility) + (stat perception) + (int money) + (location location) +) diff --git a/data/examples/the_thief/include/type/location.fate b/data/examples/the_thief/include/type/location.fate new file mode 100644 index 0000000..faec74a --- /dev/null +++ b/data/examples/the_thief/include/type/location.fate @@ -0,0 +1,3 @@ +(fate_version 1) + +(declare_set_type string location) diff --git a/data/examples/the_thief/include/type/stat.fate b/data/examples/the_thief/include/type/stat.fate new file mode 100644 index 0000000..c2e0feb --- /dev/null +++ b/data/examples/the_thief/include/type/stat.fate @@ -0,0 +1,3 @@ +(fate_version 1) + +(declare_subtype int stat) diff --git a/data/examples/the_thief/main.fate b/data/examples/the_thief/main.fate new file mode 100644 index 0000000..66773c2 --- /dev/null +++ b/data/examples/the_thief/main.fate @@ -0,0 +1,47 @@ +(fate_version 1) + +(require include/text_effects.fate) +(require include/characters.fate) +(require include/chapters.fate) + +(text_effect narrator + As the last lights of the day vanish, you bid farewell to a sun you hope + will not recognize you next morning, for tonight is the time of your + transformation. Tonight, you put an end to the hunger. Tonight, you put an + end to the cold. Tonight, surely, you get to claim the luck you were denied + all this time. + (newline) + As you gaze upon the magnificent Tarmock manor, any trace of hesitation + disappears. The plan is simple: your forged letter of introduction will get + you through the door, and your lifelong skills through their purses. +) + +(sequence standing_before_the_manor) + +(cond + ((= 3 (variable oscar.money)) ...don't...) + ((> 3 (variable carla.agility)) ...might...) + ((> 3 (variable carla.perception)) ...surely...) +) + +(= lol + (cond + ((= 3 (variable oscar.money)) ...don't...) + ((> 3 (variable carla.agility)) ...might...) + ((> 3 (variable carla.perception)) ...surely...) + ) +) +Tonight's the night... (newline) +Tonight, we become rich... (newline) +Tonight, we... + +(player_choice + ( + ( ...get in through the window! ) + (sequence through_the_window) + ) + ( + ( ...knock at the door! ) + (sequence knocking_on_door) + ) +) diff --git a/src/core/src/tonkadur/fate/v1/lang/RefOperator.java b/src/core/src/tonkadur/fate/v1/lang/RefOperator.java new file mode 100644 index 0000000..f55be22 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/RefOperator.java @@ -0,0 +1,44 @@ +package tonkadur.fate.v1.lang; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.meta.ValueNode; + +public class RefOperator extends ValueNode +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Variable variable; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public RefOperator (final Origin origin, final Variable variable) + { + super(origin, new RefType(origin, variable.get_type(), "auto generated")); + this.variable = variable; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + + /**** Accessors ************************************************************/ + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(origin.toString()); + sb.append("(Ref "); + sb.append(variable.get_name()); + sb.append(") "); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/RefType.java b/src/core/src/tonkadur/fate/v1/lang/RefType.java new file mode 100644 index 0000000..4d0429e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/RefType.java @@ -0,0 +1,91 @@ +package tonkadur.fate.v1.lang; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.meta.DeclaredEntity; + +public class RefType extends Type +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Type referenced_type; + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + + /**** Constructors *********************************************************/ + public RefType + ( + final Origin origin, + final Type referenced_type, + final String name + ) + { + super(origin, Type.REF, name); + + this.referenced_type = referenced_type; + } + + /**** Accessors ************************************************************/ + public referenced_type get_referenced_type () + { + return referenced_type; + } + + /**** Compatibility ********************************************************/ + @Override + public boolean can_be_used_as (final Type t) + { + if (t instanceof RefType) + { + final RefType dt; + + dt = (RefType) t; + + return referenced_type.can_be_used_as(dt.referenced_type); + } + + return false; + } + + /* + * This is for the very special case where a type is used despite not being + * even a sub-type of the expected one. Using this rather expensive function, + * the most restrictive shared type will be returned. If no such type exists, + * the ANY time is returned. + */ + @Override + public DeclaredEntity generate_comparable_to (final DeclaredEntity de) + { + final Type resulting_referenced_type; + final RefType dt; + + if (!(de instanceof RefType)) + { + return Type.ANY; + } + + dt = (RefType) de; + resulting_referenced_type = + (Type) referenced_type.generate_comparable_to(de.referenced_type); + + return new RefType(get_origin(), resulting_referenced_type, name); + } + + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Ref to "); + sb.append(resulting_referenced_type.toString()) + sb.append(")::"); + sb.append(name); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/Type.java b/src/core/src/tonkadur/fate/v1/lang/Type.java index d08b699..129f08b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/Type.java @@ -26,6 +26,7 @@ public class Type extends DeclaredEntity public static final Type INT; public static final Type LIST; public static final Type SET; + public static final Type REF; public static final Type STRING; public static final Set<Type> NUMBER_TYPES; @@ -48,6 +49,7 @@ public class Type extends DeclaredEntity INT = new Type(base, null, "int"); LIST = new Type(base, null, "list"); SET = new Type(base, null, "set"); + REF = new Type(base, null, "ref"); STRING = new Type(base, null, "string"); NUMBER_TYPES = new HashSet<Type>(); @@ -60,6 +62,7 @@ public class Type extends DeclaredEntity SIMPLE_BASE_TYPES.add(INT); SIMPLE_BASE_TYPES.add(STRING); SIMPLE_BASE_TYPES.add(BOOLEAN); + SIMPLE_BASE_TYPES.add(REF); } public static Type value_on_missing () diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 6042ebc..f8fe10f 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -24,6 +24,7 @@ DECLARE_ALIAS_TYPE_KW: L_PAREN 'declare_subtype'; DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type'; DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type'; DECLARE_LIST_TYPE_KW: L_PAREN 'declare_list_type'; +DECLARE_REF_TYPE_KW: L_PAREN 'declare_ref_type'; DECLARE_SET_TYPE_KW: L_PAREN 'declare_set_type'; DECLARE_TEXT_EFFECT_KW: L_PAREN 'declare_text_effect'; DECLARE_VARIABLE_KW: L_PAREN 'declare_variable'; @@ -58,6 +59,7 @@ PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice'); PLUS_KW: L_PAREN ('plus'|'+'); POWER_KW: L_PAREN ('power'|'^'|'**'); RANDOM_KW: L_PAREN ('random'|'rand'); +REF_KW: L_PAREN 'ref'; REMOVE_ALL_KW: L_PAREN 'remove_all'; REMOVE_ONE_KW: L_PAREN 'remove_one'; REQUIRE_EXTENSION_KW: L_PAREN 'require_extension'; @@ -68,6 +70,7 @@ SET_FIELDS_KW: L_PAREN 'set_fields'; SET_KW: L_PAREN 'set'; TIMES_KW: L_PAREN ('times'|'*'); TRUE_KW: L_PAREN 'true)'; +VAL_KW: L_PAREN 'val'; VARIABLE_KW: L_PAREN 'variable'; WORD: (~([ \t\r\n()])|'\\)'|'\\(')+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 12981cb..cc33b07 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -249,6 +249,30 @@ first_level_fate_instr: WORLD.types().add(new_type); } + | DECLARE_REF_TYPE_KW WS+ parent=type WS+ new_reference_name WS* R_PAREN + { + final Origin start_origin; + final Type new_type; + + start_origin = + CONTEXT.get_origin_at + ( + ($DECLARE_LIST_TYPE_KW.getLine()), + ($DECLARE_LIST_TYPE_KW.getCharPositionInLine()) + ); + + new_type = + new RefType + ( + start_origin, + ($parent.result), + false, + ($new_reference_name.result) + ); + + WORLD.types().add(new_type); + } + | DECLARE_DICT_TYPE_KW WS+ new_reference_name |


