Lethal Concentration 1

Gas diffusion from a source through adjacent rooms
Example 255
★★

A poisonous gas that spreads from room to room, incapacitating or killing the player when it reaches sufficient levels.

"Lethal Concentration"
A concentration is a kind of value. 200.9ppm specifies concentration. 200.9 ppm specifies concentration.
A room has a concentration called current concentration. A room has a concentration called former concentration.
Probability inverse is a number that varies. [This is expressed as an inverse of the actual probability of diffusion from one room to another, to avoid error.] Probability inverse is 20. [That is, any given molecule of gas has a 5% chance of leaving by a given doorway at any given minute. Probability inverse should never drop below 10, the maximum number of exits from the room.]
Every turn:
   follow the diffusion rules.
The diffusion rules are a rulebook.
A diffusion rule (this is the gas movement rule):
   repeat with space running through rooms:
      let sum be 0.0 ppm;
      repeat with way running through directions:
         let second space be the room way from the space;
         if second space is a room:
            let difference be the former concentration of the second space minus the former concentration of the space;
            increase sum by the difference;
      let sum be sum divided by probability inverse;
      now current concentration of the space is the former concentration of the space plus the sum.

A technical note: it would be possible to write "repeat with space running through rooms… repeat with second space running through rooms adjacent to the space" instead, but in practice this loops through all the rooms * all the rooms again * all the directions (to determine adjacency). Phrasing the loop this way omits the second multiplier. For a map of 25 rooms, this means that the loop runs 25 times faster than it would otherwise, and of course for a larger map the effect would be even more dramatic.

A diffusion rule (this is the resetting concentration rule):
   repeat with space running through rooms:
      now the former concentration of the space is the current concentration of the space.
The last diffusion rule (this is the lethal dosage rule):
   if the current concentration of the location is greater than LC50:
      say "The concentration in the air overpowers you...";
      end the story;
   otherwise:
      if the current concentration of the location is greater than TLV-STEL:
         say "You feel extremely uncomfortable in this environment."
Instead of doing something when the current concentration of the location is greater than TLV-STEL:
   if going, continue the action;
   say "You can't work in this environment: your eyes and nose sting and it hurts to breathe."

And, for testing purposes, a square grid of rooms:

Room 1A is west of Room 1B. Room 1B is west of Room 1C. Room 1C is west of Room 1D. Room 1D is west of Room 1E.
Room 2A is south of room 1A and west of Room 2B. Room 2B is west of Room 2C and south of Room 1B. Room 2C is west of Room 2D and south of Room 1C. Room 2D is west of Room 2E and south of Room 1D. Room 2E is south of Room 1E.
Room 3A is south of room 2A and west of Room 3B. Room 3B is west of Room 3C and south of Room 2B. Room 3C is west of Room 3D and south of Room 2C. Room 3D is west of Room 3E and south of Room 2D. Room 3E is south of Room 2E.
Room 4A is south of room 3A and west of Room 4B. Room 4B is west of Room 4C and south of Room 3B. Room 4C is west of Room 4D and south of Room 3C. Room 4D is west of Room 4E and south of Room 3D. Room 4E is south of Room 3E.
Room 5A is south of room 4A and west of Room 5B. Room 5B is west of Room 5C and south of Room 4B. Room 5C is west of Room 5D and south of Room 4C. Room 5D is west of Room 5E and south of Room 4D. Room 5E is south of Room 4E.
The former concentration of room 3C is 800.0 ppm.

For variety of testing, here is another room set-up, this time with some corridors and walls within; uncommenting it, and commenting out the connected grid, will let us explore what would happen in alternative cases, to prove to ourselves that the model works consistently.

[Room 1A is west of Room 1B. Room 1B is west of Room 1C. Room 1C is west of Room 1D. Room 1D is west of Room 1E.
Room 2A is west of Room 2B. Room 2B is west of Room 2C. Room 2C is west of Room 2D. Room 2D is west of Room 2E. Room 2E is south of Room 1E.
Room 3A is south of room 2A and west of Room 3B. Room 3B is west of Room 3C. Room 3C is west of Room 3D. Room 3D is west of Room 3E.
Room 4A is west of Room 4B. Room 4B is west of Room 4C. Room 4C is west of Room 4D. Room 4D is west of Room 4E. Room 4E is south of Room 3E.
Room 5A is south of room 4A and west of Room 5B. Room 5B is west of Room 5C and south of Room 4B. Room 5C is west of Room 5D and south of Room 4C. Room 5D is west of Room 5E and south of Room 4D. Room 5E is south of Room 4E.]

For the sake at least of seeing what's going on in the example, let's also provide the player with the means to view the gas diffusion graphically:

The status grid is a device carried by the player. The status grid is switched on.
Every turn:
   try examining the grid.
Instead of examining the status grid:
   say "[fixed letter spacing][bar][line break]";
   say "|[state of room 1A]|[state of room 1B]|[state of room 1C]|[state of room 1D]|[state of room 1E]|[line break]";
   say "[bar][line break]";
   say "|[state of room 2A]|[state of room 2B]|[state of room 2C]|[state of room 2D]|[state of room 2E]|[line break]";
   say "[bar][line break]";
   say "|[state of room 3A]|[state of room 3B]|[state of room 3C]|[state of room 3D]|[state of room 3E]|[line break]";
   say "[bar][line break]";
   say "|[state of room 4A]|[state of room 4B]|[state of room 4C]|[state of room 4D]|[state of room 4E]|[line break]";
   say "[bar][line break]";
   say "|[state of room 5A]|[state of room 5B]|[state of room 5C]|[state of room 5D]|[state of room 5E]|[line break]";
   say "[bar][variable letter spacing][line break]".
To say bar:
   say "----------------------------------------------".
TLV is a concentration that varies. TLV is 30.0ppm. [Long-term exposure maximum, safe for 8 hours a day.]
TLV-STEL is a concentration that varies. TLV-STEL is 50.0ppm. [Short-term exposure maximum, safe for fifteen minutes max.]
TLV-C is a concentration that varies. TLV-C is 150.0ppm. [Absolute exposure ceiling.]
LC50 is a concentration that varies. LC50 is 300.0ppm. [Concentration at which 50 percent of test subjects die of exposure, usually expressed in terms of time and body weight; in our LC50 these are factored in for the player's weight for one minute.]

The values set for these would depend on the type of poisonous gas in question; we'd want to adjust appropriately.

To say state of (space - a room):
   if the space is the location, say bold type;
   if current concentration of space is less than 10.0ppm, say " ";
   if current concentration of space is less than 100.0ppm, say " ";
   say current concentration of space;
   say roman type.

Now, in theory we might also want to account for sources and sinks, items that either inject poisonous gas into the environment or remove it again. For simplicity, we will assume that these contributions can also be calculated in ppm and that the total number of inert and poisonous gas molecules in a room never changes (so if poison gas molecules are added, an equal number of inert molecules are removed). If room pressure were able to change, our model would have to be improved, so let us assume for now that that never happens. We want this sink/source business to calculate before any other portion of the diffusion rulebook, so set it as a first diffusion rule.

A gas source is a kind of thing. A gas source has a concentration called the contribution. The contribution of a gas source is usually 30.0ppm.
Room 2B contains a gas source called a spigot. The contribution of the spigot is 50.0ppm. Room 5A contains a gas source.
A gas sink is a kind of thing. A gas sink has a concentration called the contribution. The contribution of a gas sink is usually 30.0ppm.
Room 5E contains a gas sink called a fan. The contribution of the fan is 80.0ppm.
The first diffusion rule (this is the sources and sinks rule):
   follow the sources rule;
   follow the sinks rule.
This is the sinks rule:
   repeat with item running through gas sinks:
      let space be the location of the item;
      decrease the former concentration of the space by the contribution of the item;
      if the former concentration of the space is less than 0.0ppm, now the former concentration of the space is 0.0ppm.
This is the sources rule:
   repeat with second item running through gas sources:
      let space be the location of the second item;
      increase the former concentration of the space by the contribution of the second item;
      if the former concentration of the space is less than 0.0ppm, now the former concentration of the space is 0.0ppm.
Test me with "z / z / z / z / z / z / z / z".
Test me with "z / z / z / z / z / z / z / z".
Room 1A

>(Testing.)

>[1] z
Time passes.

----------------------------------------------
| 0.0ppm| 2.5ppm| 0.0ppm| 0.0ppm| 0.0ppm|
----------------------------------------------
| 2.5ppm| 40.0ppm| 42.5ppm| 0.0ppm| 0.0ppm|
----------------------------------------------
| 0.0ppm| 42.5ppm|640.0ppm| 40.0ppm| 0.0ppm|
----------------------------------------------
| 1.5ppm| 0.0ppm| 40.0ppm| 0.0ppm| 0.0ppm|
----------------------------------------------
| 27.0ppm| 1.5ppm| 0.0ppm| 0.0ppm| 0.0ppm|
----------------------------------------------

>[2] z
Time passes.

----------------------------------------------
| 0.2ppm| 6.6ppm| 2.2ppm| 0.0ppm| 0.0ppm|
----------------------------------------------
| 6.6ppm| 76.5ppm| 70.5ppm| 4.1ppm| 0.0ppm|
----------------------------------------------
| 2.3ppm| 70.5ppm|520.3ppm| 64.0ppm| 2.0ppm|
----------------------------------------------
| 4.1ppm| 4.2ppm| 64.0ppm| 4.0ppm| 0.0ppm|
----------------------------------------------
| 51.5ppm| 4.1ppm| 2.0ppm| 0.0ppm| 0.0ppm|
----------------------------------------------

>[3] z
Time passes.

----------------------------------------------
| 0.8ppm| 12.0ppm| 5.7ppm| 0.3ppm| 0.0ppm|
----------------------------------------------
| 12.0ppm|109.0ppm| 89.0ppm| 10.0ppm| 0.3ppm|
----------------------------------------------
| 6.0ppm| 89.0ppm|429.7ppm| 77.7ppm| 4.9ppm|
----------------------------------------------
| 7.8ppm| 10.4ppm| 77.7ppm| 9.6ppm| 0.3ppm|
----------------------------------------------
| 73.8ppm| 7.8ppm| 5.1ppm| 0.3ppm| 0.0ppm|
----------------------------------------------

>[4] z
Time passes.

----------------------------------------------
| 1.9ppm| 18.4ppm| 9.9ppm| 1.0ppm| 0.0ppm|
----------------------------------------------
| 18.4ppm|137.3ppm|101.4ppm| 16.3ppm| 1.0ppm|
----------------------------------------------
| 10.5ppm|101.4ppm|360.5ppm| 84.8ppm| 8.0ppm|
----------------------------------------------
| 12.6ppm| 17.4ppm| 84.9ppm| 15.4ppm| 0.9ppm|
----------------------------------------------
| 94.2ppm| 12.5ppm| 8.6ppm| 0.9ppm| 0.0ppm|
----------------------------------------------

>[5] z
Time passes.

----------------------------------------------
| 3.5ppm| 25.5ppm| 14.4ppm| 2.1ppm| 0.1ppm|
----------------------------------------------
| 25.6ppm|161.9ppm|109.8ppm| 22.4ppm| 2.0ppm|
----------------------------------------------
| 15.5ppm|109.9ppm|307.1ppm| 87.8ppm| 11.1ppm|
----------------------------------------------
| 18.3ppm| 24.4ppm| 88.0ppm| 20.8ppm| 1.9ppm|
----------------------------------------------
|113.1ppm| 18.1ppm| 12.2ppm| 1.9ppm| 0.0ppm|
----------------------------------------------

>[6] z
Time passes.

----------------------------------------------
| 5.7ppm| 33.1ppm| 19.1ppm| 3.6ppm| 0.2ppm|
----------------------------------------------
| 33.3ppm|183.1ppm|115.6ppm| 28.0ppm| 3.3ppm|
----------------------------------------------
| 20.8ppm|115.8ppm|265.5ppm| 88.3ppm| 14.0ppm|
----------------------------------------------
| 24.7ppm| 31.2ppm| 88.6ppm| 25.6ppm| 3.2ppm|
----------------------------------------------
|130.7ppm| 24.3ppm| 15.7ppm| 3.2ppm| 0.1ppm|
----------------------------------------------

>[7] z
Time passes.

----------------------------------------------
| 8.4ppm| 41.0ppm| 23.8ppm| 5.4ppm| 0.5ppm|
----------------------------------------------
| 41.2ppm|201.4ppm|119.7ppm| 32.9ppm| 4.9ppm|
----------------------------------------------
| 26.3ppm|120.1ppm|232.9ppm| 87.3ppm| 16.6ppm|
----------------------------------------------
| 31.6ppm| 37.6ppm| 87.8ppm| 29.6ppm| 4.7ppm|
----------------------------------------------
|147.1ppm| 31.0ppm| 19.1ppm| 4.7ppm| 0.3ppm|
----------------------------------------------

>[8] z
Time passes.

----------------------------------------------
| 11.6ppm| 49.0ppm| 28.5ppm| 7.4ppm| 0.9ppm|
----------------------------------------------
| 49.3ppm|217.3ppm|122.8ppm| 37.1ppm| 6.6ppm|
----------------------------------------------
| 32.0ppm|123.4ppm|207.1ppm| 85.5ppm| 18.9ppm|
----------------------------------------------
| 38.9ppm| 43.6ppm| 86.2ppm| 32.9ppm| 6.3ppm|
----------------------------------------------
|162.6ppm| 38.0ppm| 22.4ppm| 6.4ppm| 0.4ppm|
----------------------------------------------