Inform 7 v10.1.0 is now open-source

Well Graham’s not known for limiting himself to what is known to be practical :wink:

4 Likes

Open Source projects can apply for a free license.

Also, in the free version, Jira considers everyone a project admin, so anyone could go around editing editing other peoples’ bug reports:

(With the spurious editing options highlighted.)

Zed: I’ve pushed a tweak to the supervisor module which might help with mixed-case extension titles and authors - does this sort out the problem on case-sensitive file systems?

Now it works for AW Freyr, but still not for Jesse McGrew or the Friends of I7, and why it works for Freyr and not McGrew isn’t making a lot of sense to me.

I apologize if this is incredibly naive – I’ve only barely skimmed the supervisor docs – but couldn’t it normalize to all-lower case?

Oops, it doesn’t really work for AW Freyr. I had contaminated my Extensions directory with an ‘Aw Freyr’ directory when I was first futzing with this.

Having tried a bunch of things now, I haven’t found anything that works that doesn’t strictly comply to: first letter of each word is a capital and capitals only occur at the first letters of words.

My most recent testing has been against 16ed0ae717e093b016d2acec3e74167f26fd4fa0.

I was so distracted by the name issue, I never got around to describing that Hybrid Choices by AW Freyr is also the first significant case I’ve found of an extension failing to compile for a reason not having to do with I6 inclusions. It includes (abbreviated and paraphrased):

A page is a kind of object.
Page-turning relates various pages to various pages.
The verb to turn to (he turns to, they turn to, he turned to, it is turned to, it is turning to) implies the page-turning relation.

[... then, within a phrase... ]

repeat with p running through pages turned to by page1:

This worked in 6M62, but I don’t see that the docs indicate that it should have worked. The docs say

As all the assertion verbs do, “to wear” and “to carry” have participles which Inform knows about. So we could equally well write:

    The scarlet coat is worn by Mr Wickham. The duelling pistol is carried by Mr Wickham.

But I don’t see that they ever suggest that new verbs get a past participle that can be used with “by” to form a description of objects. And now, it seems, they don’t.

Zed: I formatted a memory stick with a case-sensitive file system and was able to reproduce the bug about not finding awkwardly cased extensions - I believe I’ve fixed this with a push just made.

4 Likes

In 6ff3fd8db9f22f211572ecb9f3357fbdb5166324, inform7 could find extensions under all of AW Freyr, Jesse McGrew, and Friends of I7 on my Linux box. Thanks, Graham!

4 Likes

is this me?

V:\sw>git clone https://github.com/ganelson/inform.git
Cloning into 'inform'...
remote: Enumerating objects: 97917, done.
remote: Counting objects: 100% (3210/3210), done.
remote: Compressing objects: 100% (649/649), done.
remote: Total 97917 (delta 2642), reused 3084 (delta 2553), pack-reused 94707
Receiving objects: 100% (97917/97917), 133.32 MiB | 20.68 MiB/s, done.
Resolving deltas: 100% (82587/82587), done.
error: Unable to create '/v/sw/inform/.git/refs/remotes/origin/HEAD.lock': No such file or directory
fatal: unable to update refs/remotes/origin/HEAD

V:\sw>git --version
git version 2.36.0

why also i hate git.

Yarp. Looks like mingw git is now broken on network drives. Switched to “git for windows”. But then have to git config --global --add safe.directory *

why i hate git.

OK, so the mingw windows build battle begins…

First problem: there is no x86_64-w64-mingw32-clang exe

try 1: pacman -S mingw-w64-clang-x86_64-toolchain
try 2 pacman -S mingw-w64-x86_64-clang

nope, not there. Why isn’t this just clang, but anyway. So i just copy clang.exe to x86_64-w64-mingw32-clang.exe :confused:

this builds (with a shedload of warnings), inweb and intest.

Then inform doesn’t build. Turns out this sort of thing doesnt work:

cd $(SANDBOX);	clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g -D$(INFORM6OS) -o arrays.o arrays.c

Yes, it should, i know, but it doesn’t. After some hacking i find you can do this in inform6.mk;

SHELL := bash.exe

Then it works. So then step 3 (building the tools) works.

So finally, make -f inform6/inform6.mk interpreters fails. Do i actually need this, if i only want inter?

Anyway, /inform/inform6/Tests/Assistants/dumb-glulx/glulxe/Makefile;

remove OS_UNIX (it’s not)

OPTIONS = -g -Wall -Wmissing-prototypes -Wstrict-prototypes -Wno-unused #-DOS_UNIX

and finally;

..\intest\Tangled\intest inform7 -show Acidity
[1] Acidity step 1 failed to run

Any suggestions?

Have you seen my previous answer about compiling on Windows?

I was blocked on the x86_64-w64-mingw32-clang part too, and using Cygwin is the only solution I found, and it’s good enough I guess.

And sorry if I misunderstood something.

1 Like

Zounds! I am awed by this pronouncement! I picked a really good year to start following and working in IF again! Humbling and encouragement both, from the fountainhead.

5 Likes

Have you seen my previous answer about compiling on Windows?

Yes, but i don’t like cygwin. I’ve had nothing but problems from it in the past and don’t want to go back there again.

But after that you can use PowerShell if you copy the cygwin1.dll file from your Cygwin installation

Ah! The start of the cygwin DLL poisoning. :slight_smile:

Cygwin is the only solution I found.

Except that I’ve now managed to build it without Cygwin. And, i think, you might have the answer there for the test scripts. I need to run it in the shell window.

Will try it, thanks.

So that nearly worked. I got a better error message. Here are my suggested hacks;

inweb\Materials\platforms\windows.mkscript add

SHELL = bash

inweb\Chapter 6\Makefiles.w

No backslashes in Makefile paths.

oid Makefiles::pathname_slashed(OUTPUT_STREAM, pathname *P) {
	TEMPORARY_TEXT(PT)
	WRITE_TO(PT, "%p", P);
	LOOP_THROUGH_TEXT(pos, PT) {
		wchar_t c = Str::get(pos);
                if (c == '\\') c = '/'; // JKJ  <- add this
		if (c == ' ') WRITE("\\ ");
		else PUT(c);
	}
	DISCARD_TEXT(PT)
}

So then i get the latest everything, rebuild and it works.

# ../intest/Tangled/intest inform7 -show Acidity
Inform 7 v10.1.0 has started.
I've now read your source text, which is 70 words long.
I've also read Basic Inform by Graham Nelson, which is 7691 words long.
I've also read English Language by Graham Nelson, which is 2328 words long.
I've also read Standard Rules by Graham Nelson, which is 32168 words long.

  The 70-word source text has successfully been translated. There were 1 room
    and 1 thing.
Inform 7 has finished.

[1] Acidity passed

So, is it possible to inter into “C” and build a game? Any instructions on this or shall i delve into the docs. thanks.

1 Like

Works! Here’s how you compile Bigfoot Bluff to exe:

../inform7/Tangled/inform7 -format=C bluff.i7
gcc -I../inform7/Tangled bluff.c -o bluff

bluff.zip (1.1 MB)

4 Likes

Here’s a nice improvement – in 6M62, rules tracing didn’t mention rules defined in I6. So this:

Lab is a room.
test me with "rules / z".

produced

>test me
(Testing.)
 
>[1] rules
Rules tracing now switched on. Type "rules off" to switch it off again, or "rules all" to include even rules which do not apply.
 
>[2] z
[Rule "declare everything initially unmentioned rule" applies.]
[Rule "announce items from multiple object lists rule" applies.]
[Rule "set pronouns from items from multiple object lists rule" applies.]
[Rule "before stage rule" applies.]
[Rule "instead stage rule" applies.]
[Rule "investigate player's awareness before action rule" applies.]
[Rule "player aware of his own actions rule" applies.]
[Rule "check stage rule" applies.]
[Rule "carry out stage rule" applies.]
[Rule "after stage rule" applies.]
[Rule "investigate player's awareness after action rule" applies.]
[Rule "report stage rule" applies.]
[Rule "standard report waiting rule" applies.]
Time passes.
[Rule "last specific action-processing rule" applies.]
 
[Rule "A first turn sequence rule" applies.]
[Rule "every turn stage rule" applies.]
[Rule "A last turn sequence rule" applies.]
[Rule "notify score changes rule" applies.]
> 

but now it’s

>test me
(Testing.)
 
>[1] rules
Rules tracing now switched on. Type "rules off" to switch it off again, or "rules all" to include even rules which do not apply.
 
[Rule "parse command rule" applies.]
>[2] z
[Rule "declare everything initially unmentioned rule" applies.]
[Rule "generate action rule" applies.]
[Rule "announce items from multiple object lists rule" applies.]
[Rule "set pronouns from items from multiple object lists rule" applies.]
[Rule "before stage rule" applies.]
[Rule "basic visibility rule" applies.]
[Rule "basic accessibility rule" applies.]
[Rule "carrying requirements rule" applies.]
[Rule "instead stage rule" applies.]
[Rule "requested actions require persuasion rule" applies.]
[Rule "carry out requested actions rule" applies.]
[Rule "descend to specific action-processing rule" applies.]
[Rule "work out details of specific action rule" applies.]
[Rule "investigate player's awareness before action rule" applies.]
[Rule "player aware of his own actions rule" applies.]
[Rule "check stage rule" applies.]
[Rule "carry out stage rule" applies.]
[Rule "after stage rule" applies.]
[Rule "investigate player's awareness after action rule" applies.]
[Rule "report stage rule" applies.]
[Rule "standard report waiting rule" applies.]
Time passes.
[Rule "last specific action-processing rule" applies.]
 
[Rule "A first turn sequence rule" applies.]
[Rule "scene change machinery rule" applies.]
[Rule "every turn stage rule" applies.]
[Rule "timed events rule" applies.]
[Rule "advance time rule" applies.]
[Rule "update chronological records rule" applies.]
[Rule "A last turn sequence rule" applies.]
[Rule "scene change machinery rule" applies.]
[Rule "adjust light rule" applies.]
[Rule "note object acquisitions rule" applies.]
[Rule "notify score changes rule" applies.]
[Rule "parse command rule" applies.]
> 

That reveals a lot of useful details that rules tracing had previously left obscured.

2 Likes

I made a Docker image so it should be possible now to use Github/Gitlab CIs for game testing.

2 Likes

I’ve found some things that may not matter much for IDE users, but that seem problematic for external editor/command-line users.

When you pass one of the intools a project name, there isn’t a test that the directory even exists, let alone that it looks like a project. With inform7, if the directory doesn’t exist, it does error out promptly with “Unable to create Build folder for project: is it read-only?”. If it does exist, but has no Source subdir, the error is:

→ There doesn’t seem to be any location in this story, so there’s nowhere
for the player to begin. This may be because I have misunderstood what was
meant to be a room and what wasn’t: I only know something is a room if you
tell me explicitly (‘The Observatory is a room’) or if you imply it by
giving map directions (‘East of the Observatory is the Planetarium’).
++ Ended: Translation failed: 1 problem found

inbuild is more problematic: if you typo the project name, you still get output suggesting it worked, even naming specific non-existent locations. For the following, there is no aoeuaoeu directory:

$ inbuild -graph -project aoeuaoeu
[f24] aoeuaoeu/Build/output.ulx
  --build-> [f23] aoeuaoeu/Build/auto.inf
    --build-> [f22] aoeuaoeu/Build/auto.inf
      --build-> [c0] Aoeuaoeu
        --build-> [f12] aoeuaoeu/Source/story.ni
        --build-> [c8] BasicInformKit
          --use---> [c14] Basic Inform by Graham Nelson v1
          --use---> [c15] English Language by Graham Nelson v1
        --build-> [c9] CommandParserKit
          --use---> [c18] Standard Rules by Graham Nelson v6
          --use---> [c11] WorldModelKit
            --use---> [c18] Standard Rules by Graham Nelson v6 q.v.
        --build-> [c1] English
          --use---> [c10] EnglishLanguageKit
            --use---> [c15] English Language by Graham Nelson v1 q.v.

I’ve reported this as I7-2078.

And there’s no validation that extension filenames match the extension’s internal declaration of its name, or version, or even that it ends .i7x. Any file with any name in an extension author directory can say it’s any version of any extension. I discovered this 'cause I’m an Emacs user who tends to end up with “filename~” backup files, and such a file was being included over another file whose name ended .i7x. Given that with semantic version numbers, it’ll be easy to accidentally get internal version numbers and the filename mismatched if you ever manually edit, this becomes a likely source of errors. I’m guessing the IDEs will ensure the user doesn’t ever have to type an extension filename explicitly. (This one is I7-2089.)

3 Likes

Any help on changing variables programmatically for format=C.

Specifically, i’d like to change the prompt before the game runs.

So first i have to split i7_run_process into two parts, otherwise no variable exist.

static void run_process_prepare(i7process_t *proc)
{
    i7_initialise_memory_and_stack(proc);
    i7_initialise_variables(proc);
    i7_empty_object_tree(proc);
    i7_initialiser(proc);
    i7_initialise_object_tree(proc);
    i7_initialise_miniglk(proc);
}

static int run_process(i7process_t *proc)
{
    int tc = setjmp(proc->execution_env);
    if (tc) {
        if (tc == 2) proc->termination_code = 0; /* terminated mid-stream but benignly */
        else proc->termination_code = tc; /* terminated mid-stream with a fatal error */
    } else {
        i7_fn_Main(proc);
        proc->termination_code = 0; /* terminated because the program completed */
    }
    return proc->termination_code;
}

Then in main, i can access the prompt like this:

    run_process_prepare(&proc);

    i7word_t p1 = i7_read_word(&proc, i7_read_variable(&proc, i7_V_command_prompt), 1);
    char* p = i7_text_to_C_string(p1);
    
    if (p) fprintf(stderr, "prompt '%s'\n", p);

    run_process(&proc);

However, i can’t just change the memory at p, since it’s the static string table. How would i go about assiging a new string value for the prompt variable.

This doesn’t work because the variable is actually the adresss

i7_write_string(&proc, i7_read_variable(&proc, i7_V_command_prompt), "?");

So i need some way to intern a new string, then assign it’s game memory address to the prompt variable.

any clues? thanks.