(hide navigation)
  • Swedish content
Fund my projects
Log in
Latest comments
RSS feed

Forum comments in chronological order

Disclaimer: I am not responsible for what people (other than myself) write in the forums. Please report any abuse, such as insults, slander, spam and illegal material, and I will take appropriate actions. Don't feed the trolls.

Jag tar inget ansvar för det som skrivs i forumet, förutom mina egna inlägg. Vänligen rapportera alla inlägg som bryter mot reglerna, så ska jag se vad jag kan göra. Som regelbrott räknas till exempel förolämpningar, förtal, spam och olagligt material. Mata inte trålarna.

Nov 2019


Fri 1-Nov-2019 23:47
Thanks for the update.

I was able to register on the forum this time, so whatever it was, resolved itself.
Sat 2-Nov-2019 00:12
So, out of an abundance of hubris, I'm trying to bring Threaded Conversation to Dialog, despite:

- insufficient experience w/ TC in Inform7
- not fully fluent in Inform7
- new to Dialog
- very limited time to work on this!

I'm struggling with scope.

Quips are the basic thing in TC - they represent a exchange between the player and the NPC, and include predicates that govern who can say the quip, and how quips directly or indirectly follow each other (plus much more in TC).

So a player command might be ASK BARMAID ABOUT RUMORS and this should be understood as [discuss #whether-rumors-tell-truly with #barmaid].

But my code, as it stands, is failing:

> ask bar maid about rumors
The whether the rumors tell truly isn't here.

So that's a scoping issue.

What's confusing to me is that, when tracing, it looks like it found it:

| | | | | FOUND (understand [ask bar maid rumors] as [discuss #whether-rumors-tell-truly with #barmaid]) /usr/local/share/dialog-if/stdlib.dg:4710

(I haven't put in any code to restrict quips in any way, that comes soon)

but then Dialog continues on from there:

| | | | | | | | | ENTER (parse [bar maid] as object [1] [13] [1] 0) /usr/local/share/dialog-if/stdlib.dg:4394
| | | | | | | | | QUERY (allowing parse errors) /usr/local/share/dialog-if/stdlib.dg:4395
| | | | | | | | ENTER (split [maid rumors] anywhere into [maid | $] and $) /usr/local/share/dialog-if/stdlib.dg:5273
| | | | | | | | QUERY *(split [rumors] anywhere into $ and $) /usr/local/share/dialog-if/stdlib.dg:5274
| | | | | | | | | ENTER (split [rumors] anywhere into [rumors | $] and $) /usr/local/share/dialog-if/stdlib.dg:5273
| | | | | | | | | QUERY *(split [] anywhere into $ and $) /usr/local/share/dialog-if/stdlib.dg:5274
| | | | | | ENTER (understand [ask bar maid rumors] as [ask $ about $]) /usr/local/share/dialog-if/stdlib.dg:1916

So despite finding a good match, it seems to wander off based on the built-in ask action (?).

Later in the trace it feels like it's back to my discussing action, but something (even with the trace, it's hard to follow) deciding that #whether-rumors-tell-truly is not reachable.

I tried adding

((quip $) in is scope)

to make all quips in scope, but that doesn't seem to help.

My code so far (cobbled from stdlib.dg and guess work and experimentation):

(rewrite [ask | $Words] into [ask | $TailWords])
(split $Words by [about] into $Person and $MoreWords)
(append $Person $MoreWords $TailWords)

(understand [ask | $Text] as [discuss $Quip with $Person])
*(split $Text anywhere into $Someone and $QuipWords)
*(understand $Someone as single object $Person preferably animate)
*(understand $QuipWords as questioning quip $Quip)

(understand $Words as questioning quip $Quip)
*(understand $Words as quip $Quip)
(questioning quip $Quip)

(understand $Words as quip $Quip)
(filter $Words into $Filtered)
(nonempty $Filtered)
(determine object $Quip)
*(quip $Quip)
%% TODO: In scope for conversation ...
(from words)
*(dict $Quip)
(matching all of $Filtered)

So I thought I'd check to see if I'm even headed in the right direction on this.

For TC managing the scope is pretty essential; TC is about a balance of revealing what you can talk about in the current point of the current conversation without giving away other possible conversation quips that don't (yet) apply. So ultimately, whether Dialog should recognize 'rumors' as referring the quip depends on who the player is conversing with, what quips have already been performed, and whether a potential quip follows (directly or indirectly) some previously performed quip.


Sun 10-Nov-2019 00:49
Hello, playing online does not seem to work anymore? I don't see any JAVA applet loading... (Firefox, Ubuntu)

The TTY demystified

Mon 11-Nov-2019 01:19
For me, background processes are able to write to the terminal. For example,

[ ~]$ python -c "import time; time.sleep(10); print('hello');"
[2]+ Stopped python3 -c "import time; time.sleep(10); print('hello');"
[ ~]$ bg
[2]+ python3 -c "import time; time.sleep(10); print('hello');" &
[ ~]$ hello

About me

Mon 11-Nov-2019 15:18
Just found your "A mind is born" through Twitter. That is impressive! I'd like to reference you on Twitter, do you have a handle? https://twitter.com/hiilbig/status/1193895190441930753

GCR decoding on the fly

Joe Peter
Tue 12-Nov-2019 05:14
Good luck all!
--Paul Nelsen
--Oaktree Innovations

Paul are you Scott's brother? Were you at the star trek parties we attended?

I tried searching for you guy but I guess I spelled it Nelson :) and it has been almost 30 years.

While doing warpeed I was floored by vorpal and how it was possible but at the time was too busy to look further into it and only when I met Scott did I find out it was not regular GCR code.
Joe Peter
Tue 12-Nov-2019 05:27
Hi Linus and everybody,

thanks to this work, i've been inspired to come up with the next step.
Full on-the-fly GCR block read+decode+checksumming on a stock 1541: https://csdb.dk/release/?id=167152

I'd like to write a follow-up guest article about it at some point. :)



Actually did this for the copy protection system I wrote for ATG. It also used a kind of scatter loading where each sector had the address of where it should load at. The file did not load sequentially. It read the bits, decoded it and if the checksum was ok, transferred it immediately to computer memory. It did take 2 or more revolutions to transfer the track since the CPU was not fast enough to read and transfer data on the fly even if undecoded. Vorpal which did read, decode and transfer on the fly did not use standard GCR coding.. I thought Scott was the one who did it but maybe Paul can help.

Preference was for the protection than the speed. But also error correction was important since unlike normal data, the encrypted data would not decode properly with any bit errors. Hence it sometimes took 3 revs to load if it encountered any errors. Also the disk had to be able to be duplicated by standard duplicating machines. Even if standard drives error'ed out and stopped loading, older copy protection skipped over some bit errors and it usually was not noticeable since real code was only 5-10% of the data involved. This was done so people could still load their disk even if some bits got erased. But for a full wrapper this would not work because the bit errors would trash any future decoded data which depended on previously decoded values.
Joe Peter
Tue 12-Nov-2019 05:40
Just wanted to add to my comment from 11-Dec-2017 some things I forgot to mention. One of the fasted data transmission routines I analyzed in my teenage years was the one from Heureka Sprint. Heureka Sprint was a program 'listing of the month' in the German magazine '64er'. Is was especially remarkable since it used a different GCR encoding, which was much faster but less efficient; as far as I remember it could only store 228 bytes per block (maybe it used 6 instead of 5 bits per nybble?). You had to use the program provided to store your applications in the different format on your disk. But boy, it really loaded extremely fast!!! Another trick I think I came across that I would like to mention was to load the sectors out of order, and just store them out of order in the correct memory place in the C64, just as they came across the reading head of the drive, to avoid having to reformat the sectors in a particular order. Might be interesting to mention...

Ah thanks :) after decades someone admits to going through my code... and cracking it too.. That was the protection system used for an automated process where the company sent us the files and we stuck a disk into the drive and a program took those files and protected it and wrote it out onto another disk which could be sent out to the duplicators..

I did not know about Heureka Sprint until today or you might have seen a real time version of that protection scheme like what Vorpal did. Since 5 to 4 gave the most, Vorpal's 5 to 3 bits was not enticing for most companies as they needed the space more than the speed. But a 6 to 5 decoder would not lose so much space on the disk.. extra disks for most companies meant like $50,000 loss as the min run rate for a release.


Linus Åkesson
Tue 12-Nov-2019 08:17
Thanks for your kind feedback! I'm working on a small incremental update for Tethered right now, and I've decided to include your suggested ending as part of it. It will be hard to find, more or less an Easter egg.


Tue 12-Nov-2019 16:58

I see this project. i search a video generator with avr.
this is very nice.
but do this protect data is update?
the pic and schematic is low quality.

The Chipophone

Tue 19-Nov-2019 15:06
It's been years since I first heard this, and I still come back to hear your rendition of "Comic Bakery"


Would love if you did a standalone of that! :-)

(fortune cookie)

Tue 19-Nov-2019 18:05
This is a comment.


Sun 24-Nov-2019 01:37
This is nice! Reminds me of the puzzles in the Zelda games, probably a connection there!