There’s one interesting tidbit missing here, which is how deletion (SCI1 and later) is implemented. Namely by manipulating the
.DIR
file in the script, and not – as any sane person would do – with a kernel call.
So wrote Iskovlun in a comment some time back. Let’s see exactly how insane it really is.
; First we open up the directory file. ; Confusing, I know, to call it a directory file. Perhaps ; "catalog" would be better considering a directory is ; already something else. And in SCI32, they did! ((= fd (File new:)) name: (DeviceInfo diMAKESAVEDIRNAME @str (gGame name?)) open: fCREATE ) ; The format of a save game directory is pretty straight- ; forward -- a word for the index, then the name, terminated ; with an $0A, repeat until done, end with $FFFF. ; (File write:) requires a pointer to the data it is to write, ; so we need to put values into variables, rather than just ; passing them immediately. Well, unless you have SCI11+ with ; the extra file kernel calls I nabbed from SCI32 and a matching ; File class, in which case you could just do (File writeByte: ; $0A) if you were so inclined! (= ret $0A0A) ; Now we write the number and name of each saved game, EXCEPT ; for the one that was selected for deletion. (for ((= i 0)) (< i numGames) ((++ i)) (if (!= i selected) (fd write: @[nums i] 2) (fd writeString: @[names (* i COMMENTBUFF)]) (fd write: @ret 1) ) ) ; Now we write the terminating $FFFF to finish the catalog ; I mean directory off. (= ret -1) (fd write: @ret 2 close: dispose: ) ; Now that that's done, we can safely delete the actual ; save game file. (DeviceInfo diMAKESAVEFILENAME (gGame name?) [nums selected]) (FileIO fiUNLINK @str)
I almost feel like doing the so-called sane thing and adding a DeleteGame
kernel call to SCI11+.