Scenes -
diff --git a/inform7/Figures/memory-diagnostics.txt b/inform7/Figures/memory-diagnostics.txt
index 2f674e8fe..89f1fd398 100644
--- a/inform7/Figures/memory-diagnostics.txt
+++ b/inform7/Figures/memory-diagnostics.txt
@@ -1,10 +1,10 @@
-Total memory consumption was 302116K = 295 MB
+Total memory consumption was 300505K = 293 MB
-63.8% was used for 1491094 objects, in 318774 frames in 241 x 800K = 192800K = 188 MB:
+63.6% was used for 1482058 objects, in 318721 frames in 239 x 800K = 191200K = 186 MB:
- 9.5% inter_tree_node_array 41 x 8192 = 335872 objects, 29558048 bytes
- 6.0% text_stream_array 3328 x 100 = 332800 objects, 18743296 bytes
- 5.3% linked_list 29332 objects, 16425920 bytes
+ 9.3% inter_tree_node_array 40 x 8192 = 327680 objects, 28837120 bytes
+ 6.0% text_stream_array 3327 x 100 = 332700 objects, 18737664 bytes
+ 5.3% linked_list 29329 objects, 16424240 bytes
3.3% parse_node 129367 objects, 10349360 bytes
2.7% inter_symbol_array 87 x 1024 = 89088 objects, 8555232 bytes
2.4% verb_conjugation 160 objects, 7425280 bytes
@@ -17,19 +17,19 @@ Total memory consumption was 302116K = 295 MB
0.4% inter_name_array 31 x 1000 = 31000 objects, 1488992 bytes
0.4% match_trie_array 10 x 1000 = 10000 objects, 1360320 bytes
0.4% i6_schema_array 21 x 100 = 2100 objects, 1260672 bytes
- 0.3% inter_package 15075 objects, 1085400 bytes
+ 0.3% inter_package 15063 objects, 1084536 bytes
0.3% id_body 940 objects, 1075360 bytes
0.3% inter_name_generator_array 25 x 1000 = 25000 objects, 1000800 bytes
0.3% adjective_meaning 202 objects, 1000304 bytes
0.3% excerpt_meaning 3098 objects, 966576 bytes
- 0.3% inter_symbols_table 15075 objects, 964800 bytes
- 0.3% dictionary 19937 objects, 956976 bytes
+ 0.3% inter_symbols_table 15063 objects, 964032 bytes
+ 0.3% dictionary 19925 objects, 956400 bytes
0.2% production 3871 objects, 898072 bytes
- 0.2% dict_entry_array 276 x 100 = 27600 objects, 892032 bytes
0.2% ptoken 8379 objects, 871416 bytes
+ 0.2% dict_entry_array 269 x 100 = 26900 objects, 869408 bytes
0.2% grammatical_usage 3610 objects, 866400 bytes
0.2% individual_form 2560 objects, 860160 bytes
- 0.2% package_request 9649 objects, 849112 bytes
+ 0.2% package_request 9637 objects, 848056 bytes
0.2% inter_schema_node 8663 objects, 831648 bytes
0.2% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 47 x 100 = 4700 objects, 452704 bytes
@@ -39,7 +39,7 @@ Total memory consumption was 302116K = 295 MB
0.1% verb_form 386 objects, 345856 bytes
---- noun 2379 objects, 285480 bytes
---- inference_subject 665 objects, 260680 bytes
- ---- compilation_subtask 2577 objects, 206160 bytes
+ ---- compilation_subtask 2587 objects, 206960 bytes
---- inter_annotation_array 1 x 8192 objects, 196640 bytes
---- binary_predicate 321 objects, 169488 bytes
---- linguistic_stock_item 3315 objects, 159120 bytes
@@ -54,7 +54,7 @@ Total memory consumption was 302116K = 295 MB
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
---- noun_usage 2401 objects, 96040 bytes
---- preposition 273 objects, 87360 bytes
- ---- inter_tree 6 objects, 84384 bytes
+ ---- inter_tree 6 objects, 84336 bytes
---- lexical_cluster 2516 objects, 80512 bytes
---- pcalc_term_array 2 x 1000 = 2000 objects, 80064 bytes
---- kind_variable_declaration 1652 objects, 79296 bytes
@@ -110,7 +110,7 @@ Total memory consumption was 302116K = 295 MB
---- booking_list 407 objects, 13024 bytes
---- adjective_iname_holder 320 objects, 12800 bytes
---- pathname 292 objects, 11680 bytes
- ---- stopwatch_timer 114 objects, 9120 bytes
+ ---- stopwatch_timer 112 objects, 8960 bytes
---- filename 208 objects, 8320 bytes
---- uniqueness_count 324 objects, 7776 bytes
---- equation_node 68 objects, 7616 bytes
@@ -119,7 +119,7 @@ Total memory consumption was 302116K = 295 MB
---- determiner 22 objects, 7216 bytes
---- verb 108 objects, 6048 bytes
---- text_literal_holder 144 objects, 5760 bytes
- ---- hierarchy_attachment_point 54 objects, 5184 bytes
+ ---- hierarchy_attachment_point 53 objects, 5088 bytes
---- inbuild_work 78 objects, 4992 bytes
---- explicit_action_array 1 x 100 objects, 4832 bytes
---- value_property_data 84 objects, 4704 bytes
@@ -238,16 +238,16 @@ Total memory consumption was 302116K = 295 MB
---- parse_name_notice 1 object, 40 bytes
---- loop_over_scope 1 object, 40 bytes
-36.1% was used for memory not allocated for objects:
+36.3% was used for memory not allocated for objects:
- 16.9% text stream storage 52286800 bytes in 344484 claims
- 3.5% dictionary storage 11131392 bytes in 19937 claims
- ---- sorting 760 bytes in 3 claims
+ 16.9% text stream storage 52283808 bytes in 344406 claims
+ 3.6% dictionary storage 11125248 bytes in 19925 claims
+ ---- sorting 744 bytes in 3 claims
2.3% source text 7200000 bytes in 3 claims
- 3.4% source text details 10800000 bytes in 2 claims
+ 3.5% source text details 10800000 bytes in 2 claims
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
- 0.8% inter symbols storage 2620096 bytes in 15957 claims
+ 0.8% inter symbols storage 2618560 bytes in 15945 claims
5.4% inter bytecode storage 16802796 bytes in 14 claims
2.8% inter links storage 8866944 bytes in 265 claims
---- inter tree location list storage 146432 bytes in 24 claims
@@ -257,5 +257,5 @@ Total memory consumption was 302116K = 295 MB
---- code generation workspace for objects 9648 bytes in 9 claims
---- emitter array storage 154432 bytes in 2037 claims
-20.4% was overhead - 63229128 bytes = 61747K = 60 MB
+20.2% was overhead - 62344360 bytes = 60883K = 59 MB
diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt
index 9323881bd..251582bb2 100644
--- a/inform7/Figures/timings-diagnostics.txt
+++ b/inform7/Figures/timings-diagnostics.txt
@@ -1,9 +1,9 @@
100.0% in inform7 run
- 56.3% in compilation to Inter
- 37.6% in //Sequence::undertake_queued_tasks//
+ 56.1% in compilation to Inter
+ 37.5% in //Sequence::undertake_queued_tasks//
5.9% in //InferenceSubjects::emit_all//
3.5% in //MajorNodes::pre_pass//
- 2.8% in //MajorNodes::pass_1//
+ 2.9% in //MajorNodes::pass_1//
1.5% in //ImperativeDefinitions::assess_all//
0.5% in //ImperativeDefinitions::compile_first_block//
0.5% in //MajorNodes::pass_2//
@@ -12,13 +12,14 @@
0.3% in //Sequence::undertake_queued_tasks//
0.1% in //RTCommandGrammars::compile_all//
0.1% in //Task::make_built_in_kind_constructors//
- 2.0% not specifically accounted for
+ 0.1% in //World::stages_II_and_III//
+ 1.7% not specifically accounted for
41.4% in running Inter pipeline
- 10.6% in step preparation
- 10.5% in inter step 7/14: consolidate-text
- 8.9% in inter step 2/14: link
+ 10.7% in step preparation
+ 10.4% in inter step 7/14: consolidate-text
+ 9.0% in inter step 2/14: link
6.9% in inter step 14/14: generate inform6 -> auto.inf
- 0.8% in inter step 10/14: make-identifiers-unique
+ 0.6% in inter step 10/14: make-identifiers-unique
0.3% in inter step 11/14: reconcile-verbs
0.3% in inter step 13/14: eliminate-redundant-operations
0.3% in inter step 6/14: assimilate
@@ -27,6 +28,6 @@
0.1% in inter step 5/14: resolve-conditional-compilation
0.1% in inter step 8/14: resolve-external-symbols
0.1% in inter step 9/14: inspect-plugs
- 1.6% not specifically accounted for
+ 1.7% not specifically accounted for
1.8% in supervisor
- 0.4% not specifically accounted for
+ 0.6% not specifically accounted for
diff --git a/inform7/if-module/Chapter 3/The Map.w b/inform7/if-module/Chapter 3/The Map.w
index 0b837ee15..e41c44dd7 100644
--- a/inform7/if-module/Chapter 3/The Map.w
+++ b/inform7/if-module/Chapter 3/The Map.w
@@ -33,8 +33,6 @@ void Map::start(void) {
int Map::production_line(int stage, int debugging, stopwatch_timer *sequence_timer) {
if (stage == INTER1_CSEQ) {
BENCH(RTMap::compile_model_tables);
- BENCH(RTMap::write_door_dir_routines);
- BENCH(RTMap::write_door_to_routines);
}
return FALSE;
}
@@ -319,8 +317,6 @@ int Map::set_kind_notify(instance *I, kind *k) {
@ =
registered_directions++;
- inter_name *dname = RTMap::new_direction_iname();
- MAP_DATA(I)->direction_iname = dname;
MapRelations::make_mapped_predicate(I);
@h Map data on instances.
@@ -926,21 +922,21 @@ trust that there is nothing surprising here.
@ Here |found_in| is a two-entry list.
@ =
- parse_node *val = RTMap::found_in_for_2_sided(I, R1, R2);
+ parse_node *val = RTDoors::found_in_for_2_sided(I, R1, R2);
Map::set_found_in(I, val);
@ Here |door_dir| is a routine looking at the current location and returning
always the way to the other room -- the one we are not in.
@ =
- parse_node *val = RTMap::door_dir_for_2_sided(I, R1, D1, D2);
+ parse_node *val = RTDoors::door_dir_for_2_sided(I, R1, D1, D2);
ValueProperties::assert(P_door_dir, Instances::as_subject(I), val, CERTAIN_CE);
@ Here |door_to| is a routine looking at the current location and returning
always the other room -- the one we are not in.
@ =
- parse_node *val = RTMap::door_to_for_2_sided(I, R1, R2);
+ parse_node *val = RTDoors::door_to_for_2_sided(I, R1, R2);
ValueProperties::assert(P_door_to, Instances::as_subject(I), val, CERTAIN_CE);
@ The reversal of direction here looks peculiar, but is correct. Suppose
diff --git a/inform7/runtime-module/Chapter 2/Hierarchy.w b/inform7/runtime-module/Chapter 2/Hierarchy.w
index 3410d472a..980abbfa8 100644
--- a/inform7/runtime-module/Chapter 2/Hierarchy.w
+++ b/inform7/runtime-module/Chapter 2/Hierarchy.w
@@ -689,6 +689,7 @@ void Hierarchy::establish(void) {
@e TSD_DOOR_TO_FN_HL
@e INLINE_PROPERTIES_HAP
@e INLINE_PROPERTY_HL
+@e DIRECTION_HL
@ =
submodule_identity *instances = Packaging::register_submodule(I"instances");
@@ -721,6 +722,7 @@ void Hierarchy::establish(void) {
H_BEGIN_AP(INLINE_PROPERTIES_HAP, I"inline_property", I"_inline_property")
H_C_U(INLINE_PROPERTY_HL, I"inline")
H_END
+ H_C_G(DIRECTION_HL, I"DirectionObject")
H_END
H_END
@@ -736,9 +738,6 @@ void Hierarchy::establish(void) {
@e MAP_STORAGE_HL
@e INITIALSITUATION_HL
-@e DIRECTIONS_HAP
-@e DIRECTION_HL
-
@ =
submodule_identity *interactive_fiction = Packaging::register_submodule(I"interactive_fiction");
@@ -754,9 +753,6 @@ void Hierarchy::establish(void) {
H_C_T(NO_DIRECTIONS_HL, I"No_Directions")
H_C_T(MAP_STORAGE_HL, I"Map_Storage")
H_C_T(INITIALSITUATION_HL, I"InitialSituation")
- H_BEGIN_AP(DIRECTIONS_HAP, I"direction", I"_direction")
- H_C_G(DIRECTION_HL, I"DirectionObject")
- H_END
H_END
@h Kinds.
diff --git a/inform7/runtime-module/Chapter 5/Door Instances.w b/inform7/runtime-module/Chapter 5/Door Instances.w
new file mode 100644
index 000000000..3ccd039bf
--- /dev/null
+++ b/inform7/runtime-module/Chapter 5/Door Instances.w
@@ -0,0 +1,196 @@
+[RTDoors::] Door Instances.
+
+Property values for two-sided doors to make them interconnect with the map
+at runtime.
+
+@ The I6 implementation of two-way doors is quite complicated; see the Inform
+Designer's Manual, fourth edition (the "DM4") for explanations, but basically
+it means giving instances of such doors three low-level properties --
+
+(*) |door_dir|, the map direction through the door;
+(*) |door_to|, the room on the other side;
+(*) |found_in|, the two rooms in which the door is located.
+
+We continue to use that implementation because there is no pressing reason to
+change it: I7 authors are never even aware of how this is all done, and do not
+have to see or think about these properties.
+
+@h Door direction.
+
+=
+typedef struct door_dir_notice {
+ struct inter_name *ddn_iname;
+ struct instance *door;
+ struct instance *R1;
+ struct instance *D1;
+ struct instance *D2;
+ CLASS_DEFINITION
+} door_dir_notice;
+
+parse_node *RTDoors::door_dir_for_2_sided(instance *I, instance *R1, instance *D1,
+ instance *D2) {
+ door_dir_notice *notice = CREATE(door_dir_notice);
+ notice->ddn_iname =
+ Hierarchy::make_iname_in(TSD_DOOR_DIR_FN_HL, RTInstances::package(I));
+ notice->door = I;
+ notice->R1 = R1;
+ notice->D1 = D1;
+ notice->D2 = D2;
+ text_stream *desc = Str::new();
+ WRITE_TO(desc, "door_dir for "); Instances::write(desc, I);
+ Sequence::queue(&RTDoors::door_dir_agent, STORE_POINTER_door_dir_notice(notice), desc);
+ return Rvalues::from_iname(notice->ddn_iname);
+}
+
+@ So, then, this is a function: see the DM4 for specification.
+
+=
+void RTDoors::door_dir_agent(compilation_subtask *t) {
+ door_dir_notice *notice = RETRIEVE_POINTER_door_dir_notice(t->data);
+ packaging_state save = Functions::begin(notice->ddn_iname);
+ local_variable *loc = LocalVariables::new_internal_commented(I"loc", I"room of actor");
+ inter_symbol *loc_s = LocalVariables::declare(loc);
+ EmitCode::inv(STORE_BIP);
+ EmitCode::down();
+ EmitCode::ref_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(LOCATION_HL));
+ EmitCode::up();
+
+ EmitCode::inv(IF_BIP);
+ EmitCode::down();
+ EmitCode::inv(EQ_BIP);
+ EmitCode::down();
+ EmitCode::val_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(THEDARK_HL));
+ EmitCode::up();
+ EmitCode::code();
+ EmitCode::down();
+ EmitCode::inv(STORE_BIP);
+ EmitCode::down();
+ EmitCode::ref_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(REAL_LOCATION_HL));
+ EmitCode::up();
+ EmitCode::up();
+ EmitCode::up();
+
+ EmitCode::inv(IF_BIP);
+ EmitCode::down();
+ EmitCode::inv(EQ_BIP);
+ EmitCode::down();
+ EmitCode::val_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
+ EmitCode::up();
+ EmitCode::code();
+ EmitCode::down();
+ EmitCode::inv(RETURN_BIP);
+ EmitCode::down();
+ EmitCode::val_iname(K_value,
+ RTInstances::value_iname(Map::get_value_of_opposite_property(notice->D1)));
+ EmitCode::up();
+ EmitCode::up();
+ EmitCode::up();
+
+ EmitCode::inv(RETURN_BIP);
+ EmitCode::down();
+ EmitCode::val_iname(K_value,
+ RTInstances::value_iname(Map::get_value_of_opposite_property(notice->D2)));
+ EmitCode::up();
+
+ Functions::end(save);
+}
+
+@h Door to.
+
+=
+typedef struct door_to_notice {
+ struct inter_name *dtn_iname;
+ struct instance *door;
+ struct instance *R1;
+ struct instance *R2;
+ CLASS_DEFINITION
+} door_to_notice;
+
+parse_node *RTDoors::door_to_for_2_sided(instance *I, instance *R1, instance *R2) {
+ door_to_notice *notice = CREATE(door_to_notice);
+ notice->dtn_iname =
+ Hierarchy::make_iname_in(TSD_DOOR_TO_FN_HL, RTInstances::package(I));
+ notice->door = I;
+ notice->R1 = R1;
+ notice->R2 = R2;
+ text_stream *desc = Str::new();
+ WRITE_TO(desc, "door_to for "); Instances::write(desc, I);
+ Sequence::queue(&RTDoors::door_to_agent, STORE_POINTER_door_to_notice(notice), desc);
+ return Rvalues::from_iname(notice->dtn_iname);
+}
+
+@ Another function: see the DM4 for specification.
+
+=
+void RTDoors::door_to_agent(compilation_subtask *t) {
+ door_to_notice *notice = RETRIEVE_POINTER_door_to_notice(t->data);
+ packaging_state save = Functions::begin(notice->dtn_iname);
+ local_variable *loc = LocalVariables::new_internal_commented(I"loc", I"room of actor");
+ inter_symbol *loc_s = LocalVariables::declare(loc);
+ EmitCode::inv(STORE_BIP);
+ EmitCode::down();
+ EmitCode::ref_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(LOCATION_HL));
+ EmitCode::up();
+
+ EmitCode::inv(IF_BIP);
+ EmitCode::down();
+ EmitCode::inv(EQ_BIP);
+ EmitCode::down();
+ EmitCode::val_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(THEDARK_HL));
+ EmitCode::up();
+ EmitCode::code();
+ EmitCode::down();
+ EmitCode::inv(STORE_BIP);
+ EmitCode::down();
+ EmitCode::ref_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, Hierarchy::find(REAL_LOCATION_HL));
+ EmitCode::up();
+ EmitCode::up();
+ EmitCode::up();
+
+ EmitCode::inv(IF_BIP);
+ EmitCode::down();
+ EmitCode::inv(EQ_BIP);
+ EmitCode::down();
+ EmitCode::val_symbol(K_value, loc_s);
+ EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
+ EmitCode::up();
+ EmitCode::code();
+ EmitCode::down();
+ EmitCode::inv(RETURN_BIP);
+ EmitCode::down();
+ EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R2));
+ EmitCode::up();
+ EmitCode::up();
+ EmitCode::up();
+
+ EmitCode::inv(RETURN_BIP);
+ EmitCode::down();
+ EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
+ EmitCode::up();
+
+ Functions::end(save);
+}
+
+@h Found in.
+And this is a two-element array, simply giving the two rooms |R1| and |R2|
+which the door is found in:
+
+=
+parse_node *RTDoors::found_in_for_2_sided(instance *I, instance *R1, instance *R2) {
+ package_request *PR =
+ Hierarchy::package_within(INLINE_PROPERTIES_HAP, RTInstances::package(I));
+ inter_name *S = Hierarchy::make_iname_in(INLINE_PROPERTY_HL, PR);
+ packaging_state save = EmitArrays::begin(S, K_value);
+ EmitArrays::iname_entry(RTInstances::value_iname(R1));
+ EmitArrays::iname_entry(RTInstances::value_iname(R2));
+ EmitArrays::end(save);
+ Produce::annotate_i(S, INLINE_ARRAY_IANN, 1);
+ return Rvalues::from_iname(S);
+}
diff --git a/inform7/runtime-module/Chapter 6/The Map.w b/inform7/runtime-module/Chapter 6/The Map.w
new file mode 100644
index 000000000..7486ab0ff
--- /dev/null
+++ b/inform7/runtime-module/Chapter 6/The Map.w
@@ -0,0 +1,72 @@
+[RTMap::] The Map.
+
+The runtime representation of the spatial map for works of interactive fiction:
+that is, how the rooms and doors connect up.
+
+@ One of the few early breaks with I6 practice was that I7 stores the
+map differently at run-time compared to earlier I6 games.
+
+The |Map_Storage| array consists only of the |exits| arrays written out
+one after another. It looks wasteful of memory, since it is almost always
+going to be filled mostly with |0| entries (meaning: no exit that way). But
+the memory needs to be there because map connections can be added dynamically
+at run-time, so we can't know now how many we will need.
+
+=
+int RTMap::compile_model_tables(void) {
+ inter_name *ndi = Hierarchy::find(NO_DIRECTIONS_HL);
+ Emit::numeric_constant(ndi, (inter_ti) Map::number_of_directions());
+ Hierarchy::make_available(ndi);
+
+ instance *I;
+ LOOP_OVER_INSTANCES(I, K_object)
+ RTInstances::value_iname(I);
+ inter_name *iname = Hierarchy::find(MAP_STORAGE_HL);
+ packaging_state save = EmitArrays::begin(iname, K_object);
+ int words_used = 0;
+ if (Task::wraps_existing_storyfile()) {
+ EmitArrays::divider(I"minimal, as there are no rooms");
+ EmitArrays::iname_entry(NULL);
+ EmitArrays::iname_entry(NULL);
+ EmitArrays::iname_entry(NULL);
+ EmitArrays::iname_entry(NULL);
+ words_used = 4;
+ } else {
+ EmitArrays::divider(I"one row per room");
+ instance *I;
+ LOOP_OVER_INSTANCES(I, K_object)
+ if (Spatial::object_is_a_room(I)) {
+ int N = Map::number_of_directions();
+ for (int i=0; itask_functions[TEST_ATOM_TASK] =
+ Calculus::Schemas::new("(MapConnection(*2,%n) == *1)", ident);
+ bp->task_functions[NOW_ATOM_TRUE_TASK] =
+ Calculus::Schemas::new("AssertMapConnection(*2,%n,*1)", ident);
+ bp->task_functions[NOW_ATOM_FALSE_TASK] =
+ Calculus::Schemas::new("AssertMapUnconnection(*2,%n,*1)", ident);
+}
diff --git a/inform7/runtime-module/Chapter 7/The Map.w b/inform7/runtime-module/Chapter 7/The Map.w
deleted file mode 100644
index 87f046545..000000000
--- a/inform7/runtime-module/Chapter 7/The Map.w
+++ /dev/null
@@ -1,263 +0,0 @@
-[RTMap::] The Map.
-
-@
-
-=
-inter_name *RTMap::new_direction_iname(void) {
- package_request *PR = Hierarchy::synoptic_package(DIRECTIONS_HAP);
- return Hierarchy::make_iname_in(DIRECTION_HL, PR);
-}
-
-@ One of the few early breaks with I6 practice was that I7 stores the
-map differently at run-time compared to earlier I6 games.
-
-=
-int RTMap::compile_model_tables(void) {
- @;
- @;
- return FALSE;
-}
-
-@ =
- inter_name *ndi = Hierarchy::find(NO_DIRECTIONS_HL);
- Emit::numeric_constant(ndi, (inter_ti) Map::number_of_directions());
- Hierarchy::make_available(ndi);
-
- instance *I;
- LOOP_OVER_INSTANCES(I, K_direction)
- Emit::iname_constant(MAP_DATA(I)->direction_iname, K_object,
- RTInstances::value_iname(I));
-
-@ The |Map_Storage| array consists only of the |exits| arrays written out
-one after another. It looks wasteful of memory, since it is almost always
-going to be filled mostly with |0| entries (meaning: no exit that way). But
-the memory needs to be there because map connections can be added dynamically
-at run-time, so we can't know now how many we will need.
-
-@ =
- instance *I;
- LOOP_OVER_INSTANCES(I, K_object)
- RTInstances::value_iname(I);
- inter_name *iname = Hierarchy::find(MAP_STORAGE_HL);
- packaging_state save = EmitArrays::begin(iname, K_object);
- int words_used = 0;
- if (Task::wraps_existing_storyfile()) {
- EmitArrays::divider(I"minimal, as there are no rooms");
- EmitArrays::iname_entry(NULL);
- EmitArrays::iname_entry(NULL);
- EmitArrays::iname_entry(NULL);
- EmitArrays::iname_entry(NULL);
- words_used = 4;
- } else {
- EmitArrays::divider(I"one row per room");
- instance *I;
- LOOP_OVER_INSTANCES(I, K_object)
- if (Spatial::object_is_a_room(I)) {
- int N = Map::number_of_directions();
- for (int i=0; iddn_iname =
- Hierarchy::make_iname_in(TSD_DOOR_DIR_FN_HL, RTInstances::package(I));
- notice->door = I;
- notice->R1 = R1;
- notice->D1 = D1;
- notice->D2 = D2;
- return Rvalues::from_iname(notice->ddn_iname);
-}
-
-parse_node *RTMap::door_to_for_2_sided(instance *I, instance *R1, instance *R2) {
- door_to_notice *notice = CREATE(door_to_notice);
- notice->dtn_iname =
- Hierarchy::make_iname_in(TSD_DOOR_TO_FN_HL, RTInstances::package(I));
- notice->door = I;
- notice->R1 = R1;
- notice->R2 = R2;
- return Rvalues::from_iname(notice->dtn_iname);
-}
-
-parse_node *RTMap::found_in_for_2_sided(instance *I, instance *R1, instance *R2) {
- package_request *PR =
- Hierarchy::package_within(INLINE_PROPERTIES_HAP, RTInstances::package(I));
- inter_name *S = Hierarchy::make_iname_in(INLINE_PROPERTY_HL, PR);
- packaging_state save = EmitArrays::begin(S, K_value);
- EmitArrays::iname_entry(RTInstances::value_iname(R1));
- EmitArrays::iname_entry(RTInstances::value_iname(R2));
- EmitArrays::end(save);
- Produce::annotate_i(S, INLINE_ARRAY_IANN, 1);
- return Rvalues::from_iname(S);
-}
-
-@ Redeeming those notices:
-
-=
-void RTMap::write_door_dir_routines(void) {
- door_dir_notice *notice;
- LOOP_OVER(notice, door_dir_notice) {
- packaging_state save = Functions::begin(notice->ddn_iname);
- local_variable *loc = LocalVariables::new_internal_commented(I"loc", I"room of actor");
- inter_symbol *loc_s = LocalVariables::declare(loc);
- EmitCode::inv(STORE_BIP);
- EmitCode::down();
- EmitCode::ref_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(LOCATION_HL));
- EmitCode::up();
-
- EmitCode::inv(IF_BIP);
- EmitCode::down();
- EmitCode::inv(EQ_BIP);
- EmitCode::down();
- EmitCode::val_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(THEDARK_HL));
- EmitCode::up();
- EmitCode::code();
- EmitCode::down();
- EmitCode::inv(STORE_BIP);
- EmitCode::down();
- EmitCode::ref_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(REAL_LOCATION_HL));
- EmitCode::up();
- EmitCode::up();
- EmitCode::up();
-
- EmitCode::inv(IF_BIP);
- EmitCode::down();
- EmitCode::inv(EQ_BIP);
- EmitCode::down();
- EmitCode::val_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
- EmitCode::up();
- EmitCode::code();
- EmitCode::down();
- EmitCode::inv(RETURN_BIP);
- EmitCode::down();
- EmitCode::val_iname(K_value,
- RTInstances::value_iname(Map::get_value_of_opposite_property(notice->D1)));
- EmitCode::up();
- EmitCode::up();
- EmitCode::up();
-
- EmitCode::inv(RETURN_BIP);
- EmitCode::down();
- EmitCode::val_iname(K_value,
- RTInstances::value_iname(Map::get_value_of_opposite_property(notice->D2)));
- EmitCode::up();
-
- Functions::end(save);
- }
-}
-
-void RTMap::write_door_to_routines(void) {
- door_to_notice *notice;
- LOOP_OVER(notice, door_to_notice) {
- packaging_state save = Functions::begin(notice->dtn_iname);
- local_variable *loc = LocalVariables::new_internal_commented(I"loc", I"room of actor");
- inter_symbol *loc_s = LocalVariables::declare(loc);
- EmitCode::inv(STORE_BIP);
- EmitCode::down();
- EmitCode::ref_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(LOCATION_HL));
- EmitCode::up();
-
- EmitCode::inv(IF_BIP);
- EmitCode::down();
- EmitCode::inv(EQ_BIP);
- EmitCode::down();
- EmitCode::val_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(THEDARK_HL));
- EmitCode::up();
- EmitCode::code();
- EmitCode::down();
- EmitCode::inv(STORE_BIP);
- EmitCode::down();
- EmitCode::ref_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, Hierarchy::find(REAL_LOCATION_HL));
- EmitCode::up();
- EmitCode::up();
- EmitCode::up();
-
- EmitCode::inv(IF_BIP);
- EmitCode::down();
- EmitCode::inv(EQ_BIP);
- EmitCode::down();
- EmitCode::val_symbol(K_value, loc_s);
- EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
- EmitCode::up();
- EmitCode::code();
- EmitCode::down();
- EmitCode::inv(RETURN_BIP);
- EmitCode::down();
- EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R2));
- EmitCode::up();
- EmitCode::up();
- EmitCode::up();
-
- EmitCode::inv(RETURN_BIP);
- EmitCode::down();
- EmitCode::val_iname(K_value, RTInstances::value_iname(notice->R1));
- EmitCode::up();
-
- Functions::end(save);
- }
-}
-
-@ |ident| is an identifier name for the direction instance. It seems redundant
-here because surely if we know |I|, we know its runtime representation; but
-that's not true -- we need to call this function at a time when the final
-identifier names for instance have not yet been settled.
-
-=
-void RTMap::set_map_schemas(binary_predicate *bp, instance *I) {
- inter_name *ident = MAP_DATA(I)->direction_iname;
- bp->task_functions[TEST_ATOM_TASK] =
- Calculus::Schemas::new("(MapConnection(*2,%n) == *1)", ident);
- bp->task_functions[NOW_ATOM_TRUE_TASK] =
- Calculus::Schemas::new("AssertMapConnection(*2,%n,*1)", ident);
- bp->task_functions[NOW_ATOM_FALSE_TASK] =
- Calculus::Schemas::new("AssertMapUnconnection(*2,%n,*1)", ident);
-}
diff --git a/inform7/runtime-module/Contents.w b/inform7/runtime-module/Contents.w
index be60a7f2f..d29417e44 100644
--- a/inform7/runtime-module/Contents.w
+++ b/inform7/runtime-module/Contents.w
@@ -51,6 +51,7 @@ Chapter 5: Provision Submodules
Equations
Instances
Backdrop Instances
+ Door Instances
Region Instances
Multimedia
Tables
@@ -69,9 +70,9 @@ Chapter 5: Provision Submodules
Chapter 6: Completion Resources
Bibliographic Data
The Player
+ The Map
Chapter 7: Still Unsorted
- The Map
Scenes
Emit Property Values
Instance Counting