00:07:52 -!- chiselfuse has quit (Remote host closed the connection).
00:08:05 -!- chiselfuse has joined.
00:13:05 -!- chiselfuse has quit (Remote host closed the connection).
00:14:44 -!- chiselfuse has joined.
01:02:24 -!- thorium1256 has quit (Read error: Connection reset by peer).
01:37:33 <esolangs> [[ZeroDivisionError: Division by 0]] https://esolangs.org/w/index.php?diff=165887&oldid=164121 * Sophocrat * (-17) /* Categories */ removed categories heading (it's unnecessary)
01:46:47 -!- callforjudgement has changed nick to ais523.
01:47:03 -!- ais523 has quit (Quit: quit).
01:47:31 -!- moony4 has quit (Quit: leaving).
01:47:43 -!- Bowserinator has quit (Quit: Blame iczero something happened).
01:47:43 -!- iovoid has quit (Quit: iovoid has quit!).
01:48:22 -!- Bowserinator has joined.
01:48:30 -!- moony4 has joined.
01:50:20 <esolangs> [[User:Sophocrat]] https://esolangs.org/w/index.php?diff=165888&oldid=165817 * Sophocrat * (+606) started working on DreamBerd article. The programmer jokingly renamed it to "Gulf of Mexico" but I'm not sure if they intend to stick with the name
01:51:57 -!- iovoid has joined.
02:02:14 <esolangs> [[81]] N https://esolangs.org/w/index.php?oldid=165889 * Waffelz * (+9449) Created page with "{{Distinguish/Confusion|8}} :''Note that 81 is always italicized.'' {{infobox proglang |name=''81'' |paradigms=Imperative |author=[[User:Waffelz]] |year=[[:Category:2025|2025]] |memsys=[[:Category:Cell-based|Cell-based]] |dimensions=one-dimensional
02:03:17 <esolangs> [[8]] M https://esolangs.org/w/index.php?diff=165890&oldid=113218 * Waffelz * (+30)
02:03:31 <esolangs> [[User:Sophocrat]] https://esolangs.org/w/index.php?diff=165891&oldid=165888 * Sophocrat * (+37) bit of work
02:13:06 <esolangs> [[Language list]] https://esolangs.org/w/index.php?diff=165892&oldid=165810 * Jk.NDC * (+11) /* W */ Added Wuht to the language list
02:31:10 <esolangs> [[81]] M https://esolangs.org/w/index.php?diff=165893&oldid=165889 * Waffelz * (+0)
04:24:32 -!- Sgeo_ has quit (Ping timeout: 244 seconds).
04:25:40 <esolangs> [[User talk:Goodbyevoidhelloworld]] https://esolangs.org/w/index.php?diff=165894&oldid=165881 * Goodbyevoidhelloworld * (+239)
04:31:27 -!- Sgeo has joined.
06:26:06 -!- Sgeo has quit (Read error: Connection reset by peer).
07:05:24 -!- tromp has joined.
07:35:33 -!- V has quit (Remote host closed the connection).
09:18:17 -!- lisbeths has quit (Quit: Connection closed for inactivity).
09:45:31 -!- myname has quit (Quit: WeeChat 4.5.1).
10:31:03 -!- thorium1256 has joined.
10:33:15 -!- myname has joined.
10:35:59 -!- lisbeths has joined.
10:52:53 -!- amby has joined.
11:34:29 -!- Lord_of_Life_ has joined.
11:35:25 -!- Lord_of_Life has quit (Ping timeout: 256 seconds).
11:35:47 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
11:52:14 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
11:58:30 <esolangs> [[81]] M https://esolangs.org/w/index.php?diff=165895&oldid=165893 * Waffelz * (+20)
12:02:53 <esolangs> [[81]] https://esolangs.org/w/index.php?diff=165896&oldid=165895 * Waffelz * (+64)
12:41:02 <esolangs> [[NONPLUSSED]] M https://esolangs.org/w/index.php?diff=165897&oldid=165880 * NoWhy * (+330) constructs
12:43:13 <esolangs> [[NONPLUSSED]] M https://esolangs.org/w/index.php?diff=165898&oldid=165897 * NoWhy * (+92) self-modifying
12:43:41 <HackEso> 373) <oklofok> mixing drinks together is like taking all of mozart's works and listening to all of them at once <oklofok> and in general a drink - and most foods - are kind like taking a song and then just taking the average of the notes and listening to it for three minutes. <oklofok> olsner: the point is you don't have to be the composer yourself <oklofok> not everyone knows what sequences of drinks taste the best \ 510) <fungot> CakeProphet: mr presi
12:47:05 <fungot> int-e: as the hon. and learned friend the member for north east somerset, to the whisky and the cake were getting muddled, or if the government has a strategy. when a country is a member,
12:52:47 <b_jonas> fungot, cake is not a drink, so I don't think that counts as mixing drinks
12:52:47 <fungot> b_jonas: that is, of course of a year. uk unemployment, the lifetime of the new prime minister still have no regrets policy. well, of the five people involved, that
12:53:59 <int-e> maybe it was a rum cake and they were out of rum
12:56:13 -!- lynndotpy60 has quit (Quit: bye bye).
12:57:16 -!- lynndotpy60 has joined.
13:14:02 <b_jonas> I wish "elliptic curve cryptography" was named something different that doesn't look like people are trying to write "error-correcting code" when they abbreviate it
13:28:17 -!- lisbeths has quit (Quit: Connection closed for inactivity).
13:39:13 <int-e> (it's worse than that because the distribution isn't even)
13:41:50 <int-e> fungot: Why is American Football played with a hokey ball?
13:41:50 <fungot> int-e: the most important of the amendments, the government will
14:09:47 -!- lisbeths has joined.
14:28:16 -!- Sgeo has joined.
14:28:34 <b_jonas> no, it's played with a rugby egg
14:56:31 <esolangs> [[NONPLUSSED]] https://esolangs.org/w/index.php?diff=165899&oldid=165898 * NoWhy * (+991) time command
15:01:04 <esolangs> [[NONPLUSSED]] M https://esolangs.org/w/index.php?diff=165900&oldid=165899 * NoWhy * (+67) Comment, fix page links
15:15:44 <esolangs> [[Adeco]] https://esolangs.org/w/index.php?diff=165901&oldid=165332 * Zinnia Glean * (+81)
15:23:21 <esolangs> [[Adeco]] https://esolangs.org/w/index.php?diff=165902&oldid=165901 * Zinnia Glean * (+237)
15:24:37 -!- FreeFull has quit (Ping timeout: 264 seconds).
15:36:25 <esolangs> [[Esolang:Introduce yourself]] M https://esolangs.org/w/index.php?diff=165903&oldid=165875 * Nguyendinhtung2014 * (+150)
15:36:52 <esolangs> [[User:Nguyendinhtung2014]] N https://esolangs.org/w/index.php?oldid=165904 * Nguyendinhtung2014 * (+46) Created page with "He is, as mentioned in the name, born in 2014."
15:54:39 <esolangs> [[Basic Stack]] N https://esolangs.org/w/index.php?oldid=165905 * Nguyendinhtung2014 * (+1189) Created page with "Basic Stack is an esolang by the user [[User:Nguyendinhtung2014]].It consists of a "transparent" stack (whick means any value in the stack can be looked at but only can we do actions with the top value), a register, push-pop commands, conditionals and got
16:10:47 -!- FreeFull has joined.
16:55:43 -!- vista_user has joined.
16:56:54 -!- vista_user has quit (Remote host closed the connection).
17:20:11 -!- ais523 has joined.
17:31:37 -!- tromp has joined.
17:44:04 <esolangs> [[Iterate]] https://esolangs.org/w/index.php?diff=165906&oldid=165879 * Aadenboy * (+1266) /* Cat program */ replace cat program and add reverse cat program
18:08:36 <esolangs> [[Language list]] M https://esolangs.org/w/index.php?diff=165907&oldid=165892 * Waffelz * (+13)
18:31:13 <esolangs> [[Talk:Language list]] https://esolangs.org/w/index.php?diff=165908&oldid=140976 * Corbin * (+212) /* Please delete this page */ new section
18:43:39 -!- ais523 has quit (Quit: sorry about my connection).
18:52:50 <esolangs> [[NONPLUSSED]] M https://esolangs.org/w/index.php?diff=165909&oldid=165900 * NoWhy * (-129) prototype repo link
19:04:02 -!- Everything has joined.
19:41:48 <esolangs> [[NONPLUSSED]] M https://esolangs.org/w/index.php?diff=165910&oldid=165909 * NoWhy * (+38) /* Time Command */
20:04:11 -!- ais523 has joined.
20:10:27 <ais523> is anyone here aware of using coroutines to implement message-passing-like objects? like, you resume the coroutine to call a method on it, and then it yields the method's return value
20:10:34 <ais523> and the local variables of the coroutine act like fields of the object
20:10:48 <ais523> (this is different from the closure-object correspondence, which uses *captures* to act like fields of the object)
20:15:09 <korvo> There've been a couple Python libraries based on the fact that a Python generator can accept inputs. I'll try to find good examples.
20:19:10 <korvo> Python currently has proper coroutines with the `async def` keyword, but there's also backward compatibility with older ways of emulating coroutines, including generators. This leads to a few transitional fossils in the record. Check out https://docs.twistedmatrix.com/en/stable/api/twisted.internet.defer.html#inlineCallbacks for an example.
20:21:41 <korvo> This let us write objects whose messages were deferred actions; sending a message was like waiting until the action completes. For a non-trivial and well-commented usage example, here's chunk-management logic in my old Minecraft server: https://github.com/bravoserver/bravo/blob/master/bravo/world.py#L438-L544
20:23:54 <korvo> When we went from Python to Monte (which this codebase didn't experience), lines like `chunk = yield maybeDeferred(self.serializer.load_chunk, x, z)` would become m`def chunk := serializer<-load_chunk(x, z)`; all of the extra sending ceremony is bundled up in the change from '.' to '<-'.
20:41:59 <ais523> thanks – I thought it might be the sort of thing you would be experienced at
20:43:05 <ais523> hmm, was there an esolang whose name punned on Twisted the name of the Python language versus "twisted" the adjective?
20:43:25 <ais523> I vaguely remember one but it might have been spam, or even a spam page repurposed as a language
20:43:28 <korvo> It's something that we (the Smalltalky prototype/object folks) wanted throughout the 90s and 2000s. It's one of the two big problems in Web frameworks: how to represent little async actions within a single process, when we want to do hundreds of them per request?
20:43:47 <ais523> ah, Twisted Python Chat Server
20:44:11 <korvo> (The other big problem is how to store objects in a database. That one's still open IMO!)
20:44:54 <ais523> Rust had that problem too – its current status is "we know we need some sort of coroutine design but don't know what it looks like", plus stable async/await which is implemented in terms of the unstable coroutines internally and they change the internals whenever they change the coroutine design
20:45:33 <korvo> TPCS could be a topology-based language. I think there was another one of those recently; some sort of interactive Web page where one could draw a circuit based on its topological features.
20:45:40 <ais523> fwiw, I found a converse to the "store objects in a database" problem – instead of storing the objects in a database, you leave the objects floating around in memory like normal and create database-style indexes for them
20:46:21 <ais523> you don't get, e.g., database-style persistence, but you get enough of the advantages of a database to be useful in some contexts
20:46:51 <korvo> Are you familiar with ECS, Entity-Component Systems? IIRC you're not into gamedev, so might not have seen it before. It's not perfect but it's remarkably good at delivering real-time access to lots of objects.
20:47:13 <ais523> sort of – I'm very familiar with the concept existing but have trouble understanding the explanations of it
20:47:44 <ais523> also I'm pretty experienced with gamedev but what I do is very outside mainstream gamedev
20:47:49 <korvo> I think ultimately any object-database mapping has to somehow reduce away the *behavior* of an object, which we normally think of as inalienable methods, into some sort of inert struct. Object-oriented folks don't like those.
20:48:50 <korvo> Yeah! I meant that you probably haven't used e.g. Unreal or Unity tooling. In an ECS-oriented engine, behaviors have to be encoded as components. This is how they deal with the lack of methods; an object has a behavior precisely when it has the component providing that behavior.
20:49:49 <korvo> (This has been on my mind for several months because it's key to finishing Zaddy. Still puzzling though.)
20:50:04 <ais523> I guess my relationship between me and ECS is similar to the relationship between new would-be Haskell programmers and Monads
20:50:11 <ais523> there are lots of explanations but I haven't found the one that makes it click for me yet
20:50:19 <ais523> so I still don't really understand what it's about
20:50:46 <HackEso> Monads are just monoids in the category of endofunctors.
20:51:15 <korvo> fungot: Or perhaps monads are just 2-elements in a bicategory.
20:51:15 <fungot> korvo: what a very important question, and the prime minister write to the m&s chief executive, to a series of very important work.
20:53:16 <korvo> Oh! Maybe you've seen defunctionalization? An ECS encoding of objects is like a defunctionalization of their methods; the idea is that there aren't any vtables, just a type tag that points into some table of components. Like a many-to-many relation between entities and components. Very database-oriented thinking.
20:53:27 <korvo> ...Sorry, I'm just emitting tokens now. I'll stop.
20:53:50 <ais523> at least your tokens are more likely to be relevant than those of an LLM
20:55:39 <ais523> defunctionalization is another thing I've seen but not understood, but this at least looks easier to understand
21:14:12 -!- Everything has quit (Quit: leaving).
21:29:35 -!- tromp has quit (Quit: My iMac has gone to sleep. ZZZzzz…).
21:38:43 <ais523> korvo: hmm, could your objects-in-databases problem be summarised as "storing objects in databases only works if I have a finite number of classes statically known in advance (each of which defines the behaviour of an object's methods in terms of a known set of fields), and each object belongs to one of those classes – but I want to be able to store objects that have behaviour that's more dynamically defined than that"?
21:39:43 <ais523> I tend to think in terms of the "static number of classes" model by default because that's what the languages I use most often naturally want to use, but this reminded me that there is another way to do it
21:40:16 <korvo> ais523: Yeah. In particular, the Zope crowd was fascinated by signatures ("interfaces") and the problem of asking an object to provide a signature (be "adapted" to an "interface"), leading to the extremely popular zope.interface library. Another good example of a transitional fossil, since it was largely superseded by proper type checking.
21:41:18 <ais523> now I'm wondering if it's possible to create new types at runtime in Rust, that implement existing traits
21:41:56 <ais523> my guess is that the language semantics don't rule it out but you would have to make your own vtables using unsafe code, which is difficult because the vtable format is unstable (both in the sense of there not being a guarantee as to what it is, and in the sense of actually changing in practice sometimes)
21:42:31 <ais523> obviously you would only be able to actually use the types in question using type erasure
21:43:02 <korvo> A while ago I made available some old documentation from Divmod, a Twisted-oriented startup. Divmod Axiom was an object database built on a hack: SQLite has "rowid" per-row identifiers which can be used as tags. So we can treat an object like an ad-hoc ECS entity by using zope.interface to enumerate what it adapts to, adapting the adapters to be components, and saving all components to the DB along with the object.
21:43:07 <korvo> Oh, forgot the link: https://divmod.readthedocs.io/en/latest/products/axiom/
21:43:33 <korvo> I tried to maintain some of this code. I could not figure it out back then, and I doubt I could do better now. Axiom was one of those too-clever ideas IMO.
21:45:03 <ais523> I think I might understand ECS a bit better now – the idea is that it's a way to abstract over different classes/types/"ways an object can implement its methods" without needing to know the set of possible types in advance?
21:45:21 <korvo> Ah, right, components are called "powerups". There were also "upgraders", which made schema migrations entirely transparent; if you wanted to version an object's class then you had to write out adapters that would rewrite old objects into new objects. Very 90s Smalltalk.
21:46:48 <korvo> Yeah, for sure. The key to ECS is that there's a for-loop that enumerates the entities and applies each entity's component to each entity. Like, imagine that each entity has a bitmask for the components it supports, and the for-loop has another bitmask for the components that should be run.
21:48:22 <korvo> Sometimes there's other for-loops that enumerate the entities for just one component, usually to cast/extract extra information. Like, copying annotations for a physics object when doing a physics step.
21:56:28 -!- callforjudgement has joined.
21:56:44 -!- FreeFull_ has joined.
21:57:37 -!- lynndotpy609 has joined.
21:59:26 -!- FreeFull has quit (Ping timeout: 256 seconds).
21:59:26 -!- ais523 has quit (Ping timeout: 256 seconds).
21:59:26 -!- lynndotpy60 has quit (Ping timeout: 256 seconds).
21:59:26 -!- thorium1256 has quit (Ping timeout: 256 seconds).
21:59:26 -!- lynndotpy609 has changed nick to lynndotpy60.
22:07:54 -!- callforjudgement has changed nick to ais523.
22:10:19 -!- thorium1256 has joined.
22:31:53 <ais523> OK, so the big difference between "how ais523 would use a database-like approach to implement games" and "how an ECS works" is that in an ECS, the code is basically looking for entities on which specific types of data exist, and then processing it in isolation (without knowledge of other data that might also be attached to the entities) – whereas my approach is similar but it isn't looking for the existence of the data but rather particular values
22:32:59 <ais523> as a trivial example, NetHack's big monster-moving loop is similar in nature to an ECS system, but it loops over all monsters *on the level*
22:33:07 <ais523> rather than everything that has an AI and position coordinates
22:33:39 <ais523> it strikes me that ECS is a way to compensate for not having the correct database indexes set up :-D
22:36:41 <korvo> Yeah! ECS design is clearly a subfield of database schema design. Keeping indices sorted is important in my Zaddy prototype, too.
22:45:08 <ais523> fwiw, NetHack's approach seems to be equivalent to a degenerate case of ECS in which entities that are monsters have a "type of monster" component and everything that operates on monsters dispatches on it
22:45:28 <ais523> (which I suspect you aren't actually supposed to do)
22:48:13 <esolangs> [[Special:Log/newusers]] create * Ricarinium * New user account
22:48:19 <ais523> performance is also interesting because ECS doesn't really distinguish between components that are used to store data (e.g. position) and components that are used to represent behaviour (e.g. 3D model used for rendering)
22:48:43 <ais523> the latter seems like it would lead to a lot of duplicate components *but* if you try to optimise that, you break some of the optimisations that the rest of the system relies on…
22:49:41 <korvo> Interesting. That would be a big difference from e.g. Doom, where all of the logic is inline and all of the "enemy" types are checked with special cases. We can see half-and-half with games like Super Mario 64, where there's both a primitive ECS *and* lots of special-cased behaviors.
22:49:48 <ais523> oh! this is probably why the original article doesn't have a 1-1 correspondence between "entity X that has component Y" pairs and the actual data for entity X's component Y, it would be so you could deduplicate the ones that don't change
22:50:31 <ais523> korvo: oh, NetHack is also full of special cases and double special cases (i.e. when two things interact, there's a special case that requires each of them to have a specific monster type)
22:50:49 <ais523> but in an ECS you need a component to represent things that the special case applies to
22:51:18 <korvo> Right. ECS has its own version of the double-dispatch problem.
22:53:40 <esolangs> [[Esolang:Introduce yourself]] https://esolangs.org/w/index.php?diff=165911&oldid=165903 * Ricarinium * (+322) me
22:54:35 <ais523> now I'm thinking in terms of refactors that change things from being static to dynamic
22:54:50 <ais523> in NetHack 3.6, red dragons are immune to fire but not cold, white dragons are immune to cold but not fire
22:55:02 <ais523> in NetHack 3.7 those are still true by default, but there are situations in which red dragons gain cold immunity
22:55:38 <ais523> I imagine an ECS would have had a "resistances" component all along and just change how it's initialized
22:55:57 <ais523> (whereas NetHack changed the accessor functions/macros for resistances)
22:56:21 <b_jonas> so there'll be a component for the exception that lizards have too weak legs to kick
22:56:28 <b_jonas> and there are hundreds of silly exceptions like that
22:56:33 <ais523> actually this points to a flaw in the ECS model: there is no reason to dispatch on things that have resistances, you are not searching by that, you just need to be able to look them up
22:58:03 <b_jonas> components for which properties of items you can recognize while blind, while hallucinating, etc
22:58:53 <b_jonas> and when you're a priest, and whether gnome archaeologists players can use a touchstone as if it was blessed or all archaeologists can
22:58:56 <ais523> b_jonas: actually an ECS would probably struggle with just the concept of an item being in inventory
22:59:10 <b_jonas> and what stone purifies potion of sickness
22:59:12 <ais523> with the full-search-version it's easy
23:00:09 <ais523> you could make being-in-inventory-ness a component but then you have a type safety issue as there's no static check that an object isn't both in inventory and on the ground
23:00:42 <ais523> (and this is the sort of thing that could really do with a static check – NH4 has what is in effect a sanitiser that checks that objects are in exactly one location at all times)
23:15:42 -!- FreeFull_ has changed nick to FreeFull.
23:16:12 <FreeFull> ECS.. Could we have a whole programming language based on ECS ideas?
23:18:47 <ais523> I feel like ECS's advantages come from the database-like behaviour, and that ECS also has unrelated requirements but they aren't actually advantages or useful – which possibly makes them a good fit for an esolang?
23:19:32 <korvo> Like, for ais523's example, an item in an inventory is really just a row in a table. ECS's limitations are mostly from not being allowed to make new tables.
23:20:24 <ais523> korvo: actually, I think the best approach is to have an "item location" column in an items table, with inventory being one possible location, then you have an index that lets you find items by location
23:20:35 <ais523> because there are some things that should conceptually affect both items in inventory and items on the groudn
23:20:57 <ais523> (NetHack does currently use the equivalent of separate tables and just iterates over all the relevant tables and combines the results, when it has to do that)
23:21:30 <ais523> (but I think that's a replacement for not having proper indexes)
23:22:25 <korvo> ais523: Ah, okay, that makes sense. In e.g. Minecraft, each table is associated to a client-side modal window, so being "in" the table really is like being "out" of the rest of the world. It's got a touch of that good old N64 SRM about it; for the duration of a Minecraft drag-and-drop, an item is in handheld limbo.
23:23:12 <korvo> fungot: HOLP down for what
23:23:12 <fungot> korvo: they will be judged, the people of all the united back into the united kingdom were to take 300. the site, to the distinctive, so concerns that the hon. and learned friend the minister for that, and i, and the scottish government to have the same time, the hon. member to the board, the public body set up to pronounce the last bit.
23:24:04 <ais523> the other reason to make it one table is because the information being stored is essentially the same, and you want to be able to move items back and forth between inventory and floor easily – if they were separate tables you would need to move to a different table and need all the column names, etc. to match
23:24:13 <ais523> but with a single table you can just change the location field
23:34:39 <b_jonas> yeah, every item has to be in exactly one place, which is either on the tile (in which case there's an extra bit for whether it's on the surface or underground/underwater), or in a monster-or-player's inventory, or in a container item (statues are containers), or nowhere (that's where they used to go after a bohsplosion)
23:37:25 <b_jonas> and if it's in a monster-or-player's inventory then it can be in use in at most one way: wielded, worn in a specific slot fof armor/ring/amulet/saddle, held leash, and I think there was one or two more weird ones that I forgot
23:37:51 <ais523> b_jonas: there's a lit flag but that one actually isn't mutually exclusive with the others
23:38:20 <b_jonas> yeah, you can weild a lit potion or lamp
23:38:30 <ais523> the specific armor slots thing is probably some of the most brittle code in NetHack, it is hard to change and hard to interact with correctly (these may be correlated)
23:39:14 <b_jonas> there's also chain and ball chained to you which I really can't conceptualize how it works
23:39:40 <ais523> b_jonas: they're basically just armor slots internally except they don't actually have to be in your inventory
23:39:51 <ais523> (this is as confusing as it sounds and has definitely led to bugs in the past)
23:40:53 <ais523> it is a big deviation from the single-owner principle that, e.g., Rust uses to make it easy to write easily-understandable code
23:40:57 <b_jonas> there's a blindfold/lenses slot which I just imagine as one more of those armor/ring/amulet slots
23:40:59 <ais523> the armor slot items effectively have two owning references
23:42:03 <ais523> the ownership rules are basically "if you remove the item from the armor slot you don't deallocate it, if you remove the item from its other primary owner, check a field on the object to see if it's in an armor slot too, if it is, specialcase that"
23:42:10 <b_jonas> are there always at most two places that an item can be on a tile, or is it sometimes three (in vanilla, not variants)? I'm not sure about this one
23:42:29 <ais523> by "place" here are you referring to memory locations or places in the game?
23:42:39 <b_jonas> places in game, like buried or surface
23:43:04 <b_jonas> on normal terrain they can be buried or on the surface, and I think items can be underwater or under the ice or something, I don't follow how it works really
23:43:07 <ais523> internally it's actually only one for on-tile items, buried objects just get ignored by most things (including the vision code, obviously)
23:43:14 <b_jonas> and I think some variants have levitating items, but I don't know if that's a place
23:43:37 <ais523> underwater is actually flagged as surface, but ignored for many purposes in much the same way that buried items are
23:44:01 <ais523> there's also "in a container" but those items aren't associated with a tile
23:44:10 <ais523> (except indirectly through the container)
23:48:43 <b_jonas> hmm, if the chain is simultaneously in a slot that you have but not in your inventory, that sounds as unpleasant as riding on a cursed saddle.