I'm migrating literally everything related to the overarching Caves project here, separated by update so it's better-organized. I probably need to rewrite large chunks of it as well.
Remove rope/grappling rope properties. These are instead homogeneous items that are generated.
Simplify the recipe -- 1 of everything instead of 2+.
Create a "Supplies" category and move ropes and grappling ropes there.
Show how many ropes you have on the Caves menu. Show also how many grappling ropes you have.
Create ropes{}.
On the overworld cave hole menu, allow you to add a rope to enter the cave. This hooks into the ropes.roping() function.
Interacting with a cave hole below the overworld will automatically do the roping function, unless you have no ropes, in which case it'll pop open a small menu telling you as much.
Roping
Take a rope, add a rope-y sym (probably a double vertical pipe), and add data to the cave hole saying which floor you're going to (down by one).
Down at the other floor, build a rope in the same position that goes up to this floor instead.
Interacting with a roped cave hole will put you down a floor on the other side of the cave hole and also run the cave generation/etc code.
In the caves menu, have a button to throw a grappling rope.
This fails if you have none or if you're not on a solid (and it indicates this accordingly).
Throwing it will do the opposite of the rope -- it'll create a cave hole and rope on both sides and rope them, but the one here will go up while the one there will go down.
It should also store the seeding information so going back down will re-generate the same cave.
OOB
If the rope would've moved out of bounds, reduce the bad coords until it's in bounds.
If in doing this there's already a rope there, fail and say as much.
Because of this change, the coord of the attached cave hole is also important data to store in caved rope holes.
Terrain Crossing
Have a button to "Cross hazard". Activate it if you have a grappling hook, otherwise fail and say as much.
This should give you a mouse line at max length that runs orth or diag like the bow.
If you're on a floor tile and there's a water or lava tile like that and then a floor tile at the other end on screen (which is the max range here), this works, otherwise give an error.
Take the grappling rope, then create a pathway of floors that lead to the other side.
Misc
Swimming Cyborgs should be able to swim in lava too.
If there's an explicit lava swimming trait, remove it.