Games issueshttps://foss.heptapod.net/groups/games/-/issues2024-03-14T00:12:20Zhttps://foss.heptapod.net/games/harlowe/-/issues/393Undo button in sidebar persists after using forget-undos to remove the last undo2024-03-14T00:12:20ZBen MorrisUndo button in sidebar persists after using forget-undos to remove the last undoMy son Ruben is 12 and has been a happy Twine/Harlowe user for about six years. He noticed recently that when you use `(forget-undos:)`, a custom undo link or icon will disappear when there's no remaining history, but that's not true of ...My son Ruben is 12 and has been a happy Twine/Harlowe user for about six years. He noticed recently that when you use `(forget-undos:)`, a custom undo link or icon will disappear when there's no remaining history, but that's not true of the sidebar undo button.
We checked out the Harlowe source and came up with a fix, which we were able to verify locally. We'd like to submit a Merge Request with the fix. From Heptapod's quick strat guide, it looks like to do so we need Developer rights to the project - if that's the case, how do we get that permission, and if not, is there an alternate workflow we can use?https://foss.heptapod.net/games/harlowe/-/issues/392Metadata macro documentation has potentially broken example2024-03-18T02:11:49ZvonmillhausenMetadata macro documentation has potentially broken exampleTested using 3.3.8.
The metadata macro's documentation (https://twine2.neocities.org/#macro_metadata) contains this example:
>`(metadata: "rarity", 5)` in a passage called "Adamantium" causes `(passage: "Adamantium")'s rarity` to be `5...Tested using 3.3.8.
The metadata macro's documentation (https://twine2.neocities.org/#macro_metadata) contains this example:
>`(metadata: "rarity", 5)` in a passage called "Adamantium" causes `(passage: "Adamantium")'s rarity` to be `5`. You can then use `(passages: where it contains 'rarity' and its rarity >= (random: 1, 10))` to get a list of passages that may randomly exclude the "Adamantium" passage.
This example appears to be incorrect, as experimentally using `(passages: where <condition> and <condition>)` appears to run both conditions in parallel, _not in sequence_ (as Hituro in the Twine Discord said, "The problem is that there is no short-circuit evaluation in the lambda, so both parts are run simultaneously"). As a result, the `its rarity >= (random: 1, 10)` condition is tested against _all_ passages, not just those that have a `rarity` property (which presumably the `where it contains 'rarity'` condition is supposed to select for).
If conditions are correctly supposed to run in parallel, then the documentation can be corrected by re-writing the example `(passages:)` macro call as `(find: _passages where its 'rarity' >= (random: 1, 10), ...(passages: where it contains 'rarity')))`.
If instead conditions are supposed to run in sequence, then the documentation is correct but instead there is a bug in how Harlowe 3.3.8 processes multiple conditions in a call to `(passages:)`.
Let me know if you need any other detail (I have a working example in which multiple conditions in a call to `(passages:)` as per the documentation does not work as implied).https://foss.heptapod.net/games/harlowe/-/issues/391Metadata macro reference in comment counts as actual metadata macro call2024-03-11T13:28:40ZvonmillhausenMetadata macro reference in comment counts as actual metadata macro call_It's possible this issue extends beyond just the `(metadata:)` macro; that's just how I found it, so you might want to extend the scope of any issue testing or resolution._
If a passage has a `(metadata:)` macro call, and also includes..._It's possible this issue extends beyond just the `(metadata:)` macro; that's just how I found it, so you might want to extend the scope of any issue testing or resolution._
If a passage has a `(metadata:)` macro call, and also includes a comment that includes a `(metadata:)` macro call, then Harlowe (tested `3.3.8`) will incorrectly return the error `There is more than one (metadata:) macro.`.
Here's a minimal code sample that reproduces the issue:
```lisp
:: StoryTitle
Metadata Comment Problem Test
:: StoryData
{
"ifid": "E01A6C32-1CD6-4642-A418-43224ED5C6E3",
"format": "Harlowe",
"format-version": "3.3.8",
"start": "Startup",
"zoom": 1
}
:: Startup
{
(metadata: "key", "value")
<!-- This is a comment that has the text (metadata: "key", "value") -->
}\
This is the passage text.
```
Text in comments shouldn't be interpreted as actual running code, I guess?https://foss.heptapod.net/games/harlowe/-/issues/390Very odd, unusually formatted error while trying to run a large file.2024-03-05T23:13:08ZRobokitty77Very odd, unusually formatted error while trying to run a large file.![harlowe-error](/uploads/7c89b353c0ba6d9c43e4e146d8de4c09/harlowe-error.png)
I received this error message upon running a large program. I apologize for the censoring, but it contained information like my last name that I did not want ...![harlowe-error](/uploads/7c89b353c0ba6d9c43e4e146d8de4c09/harlowe-error.png)
I received this error message upon running a large program. I apologize for the censoring, but it contained information like my last name that I did not want posted. It's not the normal format of Harlowe errors and is not very readable. My program did contain several large nested arrays that were being changed repeatedly, as my program was seeking to find the determinate of a 4x4 matrix. This error only started to occur after I corrected some indexing, which would have increased the number of 3x3 submatrices greatly. There are 324 more normal looking Harlowe errors on the page, 31 of which are "Internal Errors". The rest are my matrices failing to index. I have no idea how much of this is actually my doing, though I can verify that before the indexing was corrected the program ran without errors.
I am new here and I apologize if my information is subpar. I am not sure what I need to include here. I am open to elaborating either here (if that's possible) or on Discord at robokitty77 if I need to change any information.https://foss.heptapod.net/games/harlowe/-/issues/386Ink vs Harlowe 4.02023-10-15T16:33:05ZzeltasInk vs Harlowe 4.0Leon, I took a look at **Ink** because you mentioned it in a conversation, and almost immediately I _saw_ why you had reservations. I believe Harlowe is a ton of work, and it seems like you wanted to do something new like Ink. I can tell...Leon, I took a look at **Ink** because you mentioned it in a conversation, and almost immediately I _saw_ why you had reservations. I believe Harlowe is a ton of work, and it seems like you wanted to do something new like Ink. I can tell you Harlowe is my first love. I just appreciate something that I can understand the flow of, more than the other story formats. But, with that being said, I picked up Harlowe again after a few months off and the learning curve game back.
But what I really like about **Ink** is its _simplicity_ - no mark ups (html, etc), just, almost pure words. Since it blends in with other programs like Unity, Twine shouldn't be a problem. It also supports using [brackets] as links which should play nicely with Twiners.
The way I see Twink or TwineInk (Twine with Ink): the first passage would be the full script (Script Passage) so users can just write their stories or games. In the diagram background, each Knot creates a passage and diverts link to other knots(passages) as they become available, and so on. Sure, we could have header passages for VARs, LIST, and CONST.
And since Ink already has it's own html & css code, these could appear in the appropriate panels, like stylesheet, etc for modification.
And Ink's formatting is tight. For example, simply using <> joins two separate lines into one.
What I appreciate about Twine is its diagram scheme that allows you to see where the story flows or branches - because it's very painful to get lost and buried in a sea of text. Inky doesn't have that, but the more I use Ink, the more I want to use it. Sure, it doesn't have disappearing or reappearing text and fancy sliding texts as Harlowe, but it could. But in the end, the goal is just to tell a story.
But it appears you wanted to do your own version of Ink, perhaps Harlink or Hink maybe? But I feel, the more we keep to words, the better, cleaner and easier a story format will be to use. I don't know if you have started work on 4.0 as yet, but with limited time, would it be better to deliver 4.0 or create something simple, light, and easy to update and maintain?https://foss.heptapod.net/games/harlowe/-/issues/385Passage level audio is blocking the footer from being seen Harlowe 3.3.72023-10-15T03:06:48ZRobert DelVecchioPassage level audio is blocking the footer from being seen Harlowe 3.3.7On any passage in which the user puts in a audio file using a weblink, the footer is not being displayed. The footer can be apended as a side bar and will be visible. Header passages are not being impacted.On any passage in which the user puts in a audio file using a weblink, the footer is not being displayed. The footer can be apended as a side bar and will be visible. Header passages are not being impacted.https://foss.heptapod.net/games/harlowe/-/issues/382Mobile Friendly Story Interface2023-09-28T13:41:21ZzeltasMobile Friendly Story InterfaceTwine is geared towards the standard web page. While in some cases, it may display in mobile view, it is mostly like a representation view of a full web page on a tiny screen. Happy squinting.
**A mobile-friendly landscape view should h...Twine is geared towards the standard web page. While in some cases, it may display in mobile view, it is mostly like a representation view of a full web page on a tiny screen. Happy squinting.
**A mobile-friendly landscape view should have:**
- Larger standardized text font (for story reading without squinting or enlarging screen and tapping tiny links with fingers)
- Image placement (left frame) beside text (to reduce real estate, and scrolling down to see rest of view)
- Headline font for Story Title (larger size font)
- Sub menu for items such as: New Game, Load, Save, Settings (horizontal)
- Placement for: Forward, backward buttons (left side)
- Fits/adjusts to mobile screen to avoid off placement issue.
- Splash screen (with timer to fade image)
- Background image support
We believe a portrait view is too confined, especially with a horizontal menu system.
Thank you.
Support funding is available.https://foss.heptapod.net/games/harlowe/-/issues/317(text-color:) applied to ?page makes an inline block2023-08-13T20:40:51Zhituro(text-color:) applied to ?page makes an inline block`(enchant: ?page, (text-color: "black"))` wraps `<tw-story>` in a `<tw-enchant>` element with no display, creating an inline block, which is inherited by blocks below.
If the page is *also* enchanted with an `(enchant: ?page, (bg: "whit...`(enchant: ?page, (text-color: "black"))` wraps `<tw-story>` in a `<tw-enchant>` element with no display, creating an inline block, which is inherited by blocks below.
If the page is *also* enchanted with an `(enchant: ?page, (bg: "white"))`, then `<tw-story>` ends up with an inline display of inherit, which causes it to inherit the inline display mode of the text-color enchantment.
I think the text-color on ?page should also have `display: block;`
A test case where there was a `(click: ?page)` macro in the passage displayed this bug. When the click was used (and removed) the passage changes from inheriting `display: block;` from the `enchantment-clickblock` to inheriting `display: inline;` from the text-color and visibly shifts on screen.https://foss.heptapod.net/games/harlowe/-/issues/315Proposal: (img:) macro for simplified inclusion of images2023-07-30T12:26:21ZjonnyplunderProposal: (img:) macro for simplified inclusion of imagesAt present, the only way to include images in a Harlowe game is using the standard HTML `<img>` tag (or through CSS classes, which amounts to much of the same thing). This makes it slightly tricky to use images dynamically, placing them ...At present, the only way to include images in a Harlowe game is using the standard HTML `<img>` tag (or through CSS classes, which amounts to much of the same thing). This makes it slightly tricky to use images dynamically, placing them within variables/arrays to be called on later, for things like tokens, icons, and so on. It's not _impossible_, of course, but users without much grounding in HTML are going to find it tricky.
So my suggestion is the `(img:)` macro, which could be structured something like `(img: String)` where the string is the filename (similar to how `(bg:)` does it). So `(img: "icon.png")` would find the file named "icon.png" in the same folder as the published file and display it.
This way, users could not only write a section of text like `This creature looks (img: "DangerSign.png") **DANGEROUS** to you!` (creating something that looks like "This creature looks ⚠️ **DANGEROUS** to you!") but also use it in variables such as `(set: $diceFaces to (a: (img: "dice_1.png"), (img: "dice_2.png"), ...))` or `(icon-undo: (img: undo.png))` and so on.
There are some additional thoughts about this that came to mind, such as perhaps having an additional optional string for defining the image in one of several pre-set, built-in styles, such as "icon" for an inline image that takes its size from the line-height value, useful for highlighting keywords (or as it might look, 🗝️**Keywords**), or "full width" for an image that will always be scaled to take up the full width of the page – or whatever container it is within, such as a `(box:)`.https://foss.heptapod.net/games/harlowe/-/issues/312Variables set with input boxes are sometimes overwritten when loading a save2023-05-08T18:59:25ZOscar ArcaneVariables set with input boxes are sometimes overwritten when loading a saveI've had several players report this issue. I have a variable that sets the player's character name in the first passage of my game, either by clicking a link among a list of suggested names or by an input box. Sometimes, when a player l...I've had several players report this issue. I have a variable that sets the player's character name in the first passage of my game, either by clicking a link among a list of suggested names or by an input box. Sometimes, when a player loads a save (I assume from the first passage), their character's name is overwritten by the default text in the input box.
At first, it seemed to me that the code of the input box may have been outdated and I changed it from:
`(input-box:2bind $MCname,"X",1,"Enter your character’s first name here")`
to
`(input-box: bind $MCname,"X",1,"Enter your character’s first name here")`
And on my end it worked, the bug has not happened again.
Yet I still have players who report it happening after the fix. I tried to get as much info from them as I could, but everyone has different devices, browsers, some were old players, new players, with old and new saves, people who used the input box, others who used the link with suggested names...
I can't wrap my head around what's happening, so I plan to put the input box in a later passage instead of the first one as a temporary fix, but it seems like it's an issue worth reporting.https://foss.heptapod.net/games/harlowe/-/issues/311Proposal: Add a (class:) changer as a companion to (css:)2023-05-08T09:40:46ZhituroProposal: Add a (class:) changer as a companion to (css:)The `(css:)` changer allows a knowledgeable user to apply CSS directly to an element, but it does so using the `style` attribute. Where code is to be reused, it is better to have a CSS class, but generally people have to use named hooks ...The `(css:)` changer allows a knowledgeable user to apply CSS directly to an element, but it does so using the `style` attribute. Where code is to be reused, it is better to have a CSS class, but generally people have to use named hooks to apply classes to elements instead, which is strictly wrong where multiple instances of the same named hook appear on one passage just to serve as a substitute for a class. Wrapping elements in an otherwise unnecessary `<div class="whatever">` is only slightly better.
A `(class:)` changer would allow a class to be applied directly to the elements it encloses without a wrapping element. In the case of nested children, it should only apply the class to the top level element.https://foss.heptapod.net/games/harlowe/-/issues/309Proposal: Allow an optional final separator for (joined:)2023-05-03T14:50:20ZhituroProposal: Allow an optional final separator for (joined:)A very common task is to render a list of items in a natural English idiom, e.g. "A, B, C and D", but no simple solution exists to do this. While `(joined:)` can join an array, it only uses a single separator.
One possible solution is t...A very common task is to render a list of items in a natural English idiom, e.g. "A, B, C and D", but no simple solution exists to do this. While `(joined:)` can join an array, it only uses a single separator.
One possible solution is to remove the final item before joining, e.g.
```lisp
(set: _meals to (a: "Breakfast", "Toast", "Dinner"))
(set: _rest to (subarray: _meals, 1, _meals's length - 1))
(print: (joined: ", ", ..._rest) + " and " + _meals's last)
```
However this is awkward to do frequently. Allowing `(joined:)` an optional final separator would make this much easier. e.g.
```lisp
(print: (joined: ", " " and ", ..._meals))
```
Here both separators are before the comma, to distinguish them from the items to be joined, an alternative might be to supply an array of separators for the first argument?
```lisp
(print: (joined: (a:", "," and "), ..._meals))
```
An alternative would be to give the lambda in `(folded:)` access to the index of the item in the array it is processing, or some other keyword indicating that it is at the last item, so that it could use `(cond:)`, e.g. something like:
```lisp
(folded: _meal making _mealList via _mealList + (cond: islast, _meal + ", ", " and " + _meal), "", ..._meals)
```
However this solution would require extra work to cope with 1 item lists, as opposed to the joined solution.https://foss.heptapod.net/games/harlowe/-/issues/308Proposal: Dialog within Dialog2023-05-02T22:51:54ZRabbit StoddardProposal: Dialog within DialogSince a dialog call is capable of including links, would it be possible to have hooks and dialog within the codehook or displayed passage of a dialog, so that there could be multiple such popups, Crusader Kings style? This would be parti...Since a dialog call is capable of including links, would it be possible to have hooks and dialog within the codehook or displayed passage of a dialog, so that there could be multiple such popups, Crusader Kings style? This would be particularly useful for what I'm working on currently.https://foss.heptapod.net/games/harlowe/-/issues/300Variable reference causes save data corruption2023-03-03T11:08:15ZVincent ValenskyVariable reference causes save data corruptionDuring the last months, I've started receiving reports from players about issues with saving. The problem they exhibit occurs in the following way:
While playing a longer session, at some point clicking the "Save game" returns an error ...During the last months, I've started receiving reports from players about issues with saving. The problem they exhibit occurs in the following way:
While playing a longer session, at some point clicking the "Save game" returns an error (the one produced by the (else:) state of (save-game:)), and after that point their game can no longer save.
This has been of considerable scope, more than 35 individual reports of the problem, both on Harlowe 3.3.3 as well as on 3.3.4.
After long and deep investigation, and consulting with other devs who've had the exact same problem, it turns out that disabling the "save variable as reference" bit in Harlowe's format.js removes this problem.
Please add a toggle somewhere as manually updating the format is not a good solution and this is a fairly serious issue. For additional context, the corruption typically happens after long sessions, my project is at above 2000 passages.https://foss.heptapod.net/games/harlowe/-/issues/297Proposal: Alternatives to the new link syntax2023-01-31T06:45:18ZhituroProposal: Alternatives to the new link syntaxI read with interest, and some alarm, the proposed changes to links and the sequence hook syntax on the Harlowe 4 roadmap.
While I understand the impulse to make the basic link syntax do more, if you abandon the [[]] delimiters I forese...I read with interest, and some alarm, the proposed changes to links and the sequence hook syntax on the Harlowe 4 roadmap.
While I understand the impulse to make the basic link syntax do more, if you abandon the [[]] delimiters I foresee endless "Why don't my links make boxes/arrows" in Twine questions. Similarly, since `[[text|passage]]` is also valid Twine link syntax, the sequence hook syntax would similarly break those links, and could cause the Twine app to try and draw arrows and make passages out of sequences. The link-destination suggestions dropdown would also break.
When helping new users on the Twine Discord one of the most common issues surround (link:) _not_ making link arrows. Users are reluctant to switch away from the [[]] syntax for just that reason, or, when they do swap, are upset that they don't get arrows.
So my suggestion would be to find some other way to distinguish the [[]] syntax from hooks, if that's needed, and to keep the [[]] delimiters for links.
**Alternative link/hook syntax**
Maybe the answer is to stop interpreting [[...]] as an anonymous hook inside a hook, and always interpret is a link first? Or indeed as both a hook and a link, in the right context? Lots of new users write:
```
(if: X)[[link to->passage]]
or
(if: X)[[[link to->passage]]]
```
And then get confused when that doesn't work.
Another possibility is to change the hook delimiter, but that seems a step too far.
**Alternative sequence hook syntax**
It's hard to find an alternative to | as the sequence delimiter. I tried a lot of single characters, but you might be better off with a 2-character sequence, so that people could actually use | in normal text. `<>` is one possibility.https://foss.heptapod.net/games/trosnoth/-/issues/94In Juggernaut mode, JuggerBot comes back after a human Juggernaut dies2023-01-17T04:24:56ZJoshua D. BartlettIn Juggernaut mode, JuggerBot comes back after a human Juggernaut diesAnother human should normally be made Juggernaut.Another human should normally be made Juggernaut.https://foss.heptapod.net/games/trosnoth/-/issues/93Starting games from admin console always starts Humans vs. Machine games2023-01-17T04:02:14ZJoshua D. BartlettStarting games from admin console always starts Humans vs. Machine gamesThere is a setting for human vs. machines, but even when you don't select it, it always starts HvM games.There is a setting for human vs. machines, but even when you don't select it, it always starts HvM games.https://foss.heptapod.net/games/harlowe/-/issues/282Two enchants in the same passage produce a strange bug.2022-09-27T11:06:41ZWriteTeachPlayTwo enchants in the same passage produce a strange bug.I am trying to create a quick red flash when the player transitions to some passages before the background goes back to black. Here's what I tried in the most recent Harlowe:
(enchant:?page,(bg:red))
(event: when time > .3s)[(enchant:?p...I am trying to create a quick red flash when the player transitions to some passages before the background goes back to black. Here's what I tried in the most recent Harlowe:
(enchant:?page,(bg:red))
(event: when time > .3s)[(enchant:?page,(bg:black))]
The passage goes red. But when it goes back to black, only the top 1/5th of the screen goes black. The rest remains red.
I've also tried (after:), but with the same results.
Using change: does not resolve the issue. If both are change: or enchant: we get the weird result above. If enchant comes first, the lower 4/5ths of the screen turns black, but the top 1/5th remains red. If enchant comes second, result as Discord-user CD's pic, attached.
![strangeenchantbehavior](/uploads/617c16ab0d3fa36aea3f3f22eec14290/strangeenchantbehavior.png)https://foss.heptapod.net/games/trosnoth/-/issues/91Share money action2022-08-11T04:52:00ZPeter HedgesShare money action### Quick summary
Add an action that will throw some arbitrary amount of your own money on the ground in coin form.
### Why it would be valuable
It might be useful to share money between team members to buy an upgrade, like a grenade,...### Quick summary
Add an action that will throw some arbitrary amount of your own money on the ground in coin form.
### Why it would be valuable
It might be useful to share money between team members to buy an upgrade, like a grenade, if nobody can outright afford one. It might also distract players in a shootout. It might let team members stay below the coin drop threshold to avoid the opposing players getting their money.
### Proposal
A new action would be created that would be added to the keybind settings for easy use. Maybe it would be a selectable upgrade as well or instead. This would subtract a certain fixed, arbitrary amount of money from the player. That same amount of money would then be spawned into the world as a collectable coin(s), like the kind players drop when they die. This would bounce around and settle (like usual coins) and could be picked up by any player on any team, be it the original player who changed their mind, a team member or an opposing player if they are lucky enough.https://foss.heptapod.net/games/harlowe/-/issues/271(click:) elements are not keyboard focusable2022-08-06T05:03:52ZCarole Finck(click:) elements are not keyboard focusableI noticed it first with (click: ?page), but then I tried applying click to hooks or the passage, I had the same issue. Contrary to links, (click:) elements do not appear to be keyboard focusable. When I relied on them to direct to the ne...I noticed it first with (click: ?page), but then I tried applying click to hooks or the passage, I had the same issue. Contrary to links, (click:) elements do not appear to be keyboard focusable. When I relied on them to direct to the next passage, I did not find out how to make it usable for keyboard users, aside from using regular links instead.
I am sorry if I missed something.