rearrage_stuff

This commit is contained in:
Kim Ravn Hansen
2025-09-16 11:26:40 +02:00
parent 40e8c5e0ab
commit 3f11ebe6dc
4937 changed files with 1146031 additions and 134 deletions

129
resources/ideas.md Executable file
View File

@@ -0,0 +1,129 @@
```
___ ____ _____ _ ____
|_ _| _ \| ____| / \ / ___|
| || | | | _| / _ \ \___ \
| || |_| | |___ / ___ \ ___) |
|___|____/|_____/_/ \_\____/
-------------------------------
```
# GARBAGE COLLECTORS
At night, the Garbage Collectors (smelly gnolls) or other Janitor Mobs come out
to remove any loose items or dead characters that may be lying around. They
are quite tough.
These janitor mobs clean up almost everywhere except Instances (that clean up themselves)
and players' homes, prisons, and other VIP locations.
They never trigger quests or events where they go, but:
- they can interact with adventurers (they are quite aggressive, and may attack unprovoked, maybe sneak past)
- they can interact with each other, but mostly do so if there are PCs nearby.
# ATTRITION
Even when a player is offline, their characters have to pay rent on their homes
or room and board in an inn, or they can chance it in the wilderness.
If they run out of money or rations, there is a small chance each day that the
characters will be garbage collected.
The sum that needs paying while offline not very large though.
# CHAT SPELL
You can buy a spell that lets you initiate a secure and encrypted group chat
with other players.
The person who casts the spell generates a private key and sends the public key
to the others in the chat. Each recipient then generates a one-time symmetric
key and sends it securely (via the caster's public key) to the caster. The
caster then generates a "group chat key" and sends it to each recipient via
their one-time key.
Any chats via the spell from then on is encrypted with the "group chat key".
All parties throw away the group chat key when the spell ends.
Each group chat has a name.
```
____ _
| __ ) _ _ __ _ __ _ ___ | |__ _ _ __ _ __ _ ___
| _ \| | | |/ _` |/ _` |/ _ \ | '_ \| | | |/ _` |/ _` |/ _ \
| |_) | |_| | (_| | (_| | __/ | |_) | |_| | (_| | (_| | __/
|____/ \__, |\__, |\__, |\___| |_.__/ \__, |\__, |\__, |\___|
|___/ |___/ |___/ |___/ |___/ |___/
```
# CONSTRUCTION / BUILDING
- You can build a house / mansion / castle / wizard tower / underdark / cave / wattever.
- You can invite other players oveer for a tjat.
- You can build portals to other dimensions (instances),
and you can allow other players to try it out.
```
____ __ __ _
| _ \ _ _ _ __ __ _ ___ ___ _ __ | \/ | ___ __| | ___ ___
| | | | | | | '_ \ / _` |/ _ \/ _ \| '_ \ | |\/| |/ _ \ / _` |/ _ \/ __|
| |_| | |_| | | | | (_| | __/ (_) | | | | | | | | (_) | (_| | __/\__ \
|____/ \__,_|_| |_|\__, |\___|\___/|_| |_| |_| |_|\___/ \__,_|\___||___/
|___/
```
- `Caves`
- GameMode = _Spelunking_: Sir Whalemeat the Thurd is Spelunking in the Caves of Purh.
- Played like `Rogue`
- Procedurally (pre-)generated caves (Game of Life? automata?)
- Turn based: you take one action, and everything else gets one `tick`.
- 1 Location == 1 cave
- `Donjons`
- GameMode = _Crawling_: Lady Gurthie Firefoot is Crawling the Donjons of Speematoforr.
- Played like `Knights of Pen and Paper`
- WebGL: Actual rendered 3d, but black and white.
- Texture pack is just ascii text (TEXTures).
- Possibly Procedurally generated
- Most likely like this: https://www.youtube.com/watch?v=D1jLK4TG6O4&list=LL
- Animations like `Stonekeep` - only showing animation when the player moves.
- Monsters are just outlines of monster shapes, shaded with variably-sized letters
that spell out the monster's name.
- Procedurally (pre-)generated dungeons
- Every time you enter a non-explored space, you roll a die, and see what happens.
- Combat is like `Dark Queen of Krynn` (i.e. third person semi-iso)
- 1 Location == 1 donjon room/area
- BSP (binary space partition) https://www.youtube.com/watch?v=TlLIOgWYVpI&t=374s
- `Overland`
- GameMode = _Traveling_: Swift Dangledonk the Slow is Traveling the Marshes of Moohfaahsaah
- Travel is like `Rogue`
- Combat is like `Dark Queen of Krynn`
- Static terrain.
- Random encounters.
- Each encounter has a randomly generated mini map (which is just monsters and a few obstacles)
- 1 Location == 1 area / screen
- `Settlements`
- GameMode = _Sojourning_: Swingleding the Mage is Sojourning in the City of Hovedstad.
- may be played like MUDs (`go west`, `go to town square`, etc.).
- Static (mostly)
- Combat is like `Dark Queen of Krynn`
- 1 Location == 1 area (an inn, etc.)
- `Dwelling`
- GameMode = _Hanging Out_: Wendlegloom Uklimuck is Hanging Out in The House of the Sitting Sun.
- Homes that players can own or build.
- Like `Rogue` but with tweaks such as detailed descriptions
of the cool stuff the players have done with the room.
```
____ _ _ _ _ ____
| _ \| | | | \ | / ___|
| |_) | | | | \| \___ \
| __/| |_| | |\ |___) |
|_| \___/|_| \_|____/
```
- Waif-Unction Collabs
- Waify Collapse
- Drag-on lance

View File

@@ -0,0 +1,39 @@
█▐▀▀▀▌▄
█ ▐▀▀▀▌▌▓▌
█ ▄▄ ▄▄▀
█ ▐▀▀▀▀
▄█▄
▓▀ ▀▌
▓▀ ▓▄
▄▓ ▐▓
▄▓ ▀▌
▓▀▀▀▀▀▓ ▓▀▀▀▀▓ ▐█▀▀▀▀▓
█ █ █ ▓░ ▓▌ ▓░
█ ▀▀▀▀▀ ▀▀▀▀▀ ▓░
▓▒ ▓░
▀▓▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
▐▌ █
▓▀▀▀▀█ ▐█▀▀▀█ ▐█▀▀▀▓▒ ▐▌ █ ▐▓▀▀▀▓▒ ▓▀▀▀▓▒ █▀▀▀▀▓
█ █ ▐▌ █ ▐▌ ▓▒ ▐▌ ▐██░ █ ▐█ ▓▄ █ ▐▌ █ ▐█
▓░ ▐▀▀▀ ▐▀▀▀ █░ ▐▌ ▓██▌ █ ▐█ ▀▀▀▀ ▀▀▀ ▐▌
▓▒ █ ▐▌ ▀██▌ █ █ ▐▌
▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▓▀ ▐▌ █ ▀▌▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▓
▐▌ █ ▐▌ █ █ ▐▌
▐▌ █ ▐▌ █ █ ▐▌
▐▌ ▓▌ █▀▀▀▀▀█ ▐▌▐▌▀▀▀▀█ ▓▀▀▀▀▓▄ █ █▀▀▀▀▀█ ▓▌ ▐▌
▓▌ ██▌ █ █ ▓▌▓▒ █ █ ▐▌ █ █ █ ▓██ ▐▓
▓▒ ▐██▌ █ █ ▓██░ ▐█
▓ ▐▐ █ █ ▐▐ █
█ █ █ █
█ █ ▄▄▄ █ █
█ █ ▄▀▀ ▀▀▓▄ █ █
█ █ ▄▌ ▀▓ █ █
▐█ █ ▓▀ ▐█ █ ▓▒
▐▌ █ ▐▓ ▐▌ ▐█ ▓▒
▐▌ █ █ █ ▐█ ▐▌
▐▌ ▓░ █ █ ▐▌ ▐▌
▓▒ ▓░ █ ▓▒ ▐▌ ▐▓
▓░ ▓░ ▐▌ ▀▌ ▐▌ ▐█
▀▌▄▄ ▓▄▄ ▐█ ▓▌ ▄▄▄▐▌ ▄▄▄▀
▐▐▐▀▀▀▀▐▐▐ ▐▐▀▀▀▀▀▀▐▐

View File

@@ -0,0 +1,48 @@
┌────────────────────────────────────────────────────────────────────────────────┐┌────────────────────────────────────────────────────────────────────────────┐
│There are several objects here. ││Weapons │
│Really attack Annootok? (yes|no) no ││k) 4 blessed daggers │
│What do you want to use or apply? [dimPR or ?*] ││M) 4 blessed daggers (at the ready) │
│V - a blessed scroll labeled ASHPD SODALG. ││l) 2 uncursed elven daggers │
│j - 2 uncursed scrolls labeled DAIYEN FOOELS. ││a) blessed rustproof +1 Excalibur (weapon in hand) │
│D - an uncursed scroll labeled ELAM EBOW. ││Armor │
│W - 2 cursed scrolls labeled GNIK SISI VLE. ││O) blessed +1 orcish helm (being worn) │
│s - 2 uncursed scrolls labeled HACKEM MUCHE. ││L) blessed rusty +1 pair of gauntlets of power (being worn) │
│p - an uncursed scroll labeled KIRJE. u - an uncursed scroll labeled TEMOV. ││y) uncursed +0 pair of iron shoes (being worn) │
│Q - 2 uncursed scrolls labeled VELOX NEB. ││c) uncursed +3 small shield (being worn) │
│X - a blessed scroll labeled VERR YED HORRE. ││C) uncursed +0 leather cloak (being worn) │
│What do you want to drop? [a-npqsuyzC-ELMO-RV-X or ?*] ││q) uncursed mummy wrapping │
│You drop a blessed scroll labeled ASHPD SODALG. ││f) uncursed +0 ring mail (being worn) │
│Annootok offers 30 gold pieces for your scroll labeled ASHPD SODALG. Sell it? ││Comestibles │
│[ynaq] (y) ││n) uncursed food ration │
│V - a blessed scroll labeled ASHPD SODALG. ││z) 2 uncursed pancakes │
│What do you want to call? [dgijmpsuyDELO-RV-X or ?*] ││h) uncursed sprig of wolfsbane │
│Call a scroll labeled ASHPD SODALG: ASHPD enchARM|rmvCUR|enchWEP ││b) 2 uncursed eggs │
└────────────────────────────────────────────────────────────────────────────────┘│e) 2 uncursed lichen corpses │
┌────────────────────────────────────────────────────────────────────────────────┐│Scrolls │
│ ││j) 2 uncursed scrolls labeled DAIYEN FOOELS │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ ││PD) uncursed scroll labeled ELAM EBOW │
<20><><EFBFBD><EFBFBD><EFBFBD>Ŀ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*[<5B><><EFBFBD>[[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││TW) 2 cursed scrolls labeled GNIK SISI VLE │
<20><><EFBFBD><EFBFBD><EFBFBD>><3E><><EFBFBD>[<5B><>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││ms) 2 uncursed scrolls labeled HACKEM MUCHE │
<20><><EFBFBD><EFBFBD><EFBFBD>[<5B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││dp) uncursed scroll labeled KIRJE │
<20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││Uu) uncursed scroll labeled TEMOV │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││GQ) 2 uncursed scrolls labeled VELOX NEB │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││X) blessed scroll labeled VERR YED HORRE │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD> ││V) blessed scroll called ASHPD enchARM|rmvCUR|enchWEP │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ││Wands │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!%<25><><EFBFBD><EFBFBD><EFBFBD> ││R) uncursed wand called slow monster │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F>%(%<25><><EFBFBD><EFBFBD><EFBFBD> ││P) uncursed wand of digging │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%%%<25><><EFBFBD><EFBFBD><EFBFBD> ││Tools │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>[<5B><>[<5B> ││m) uncursed bag called sack containing 2 items │
<20><><EFBFBD><EFBFBD>%@)/<2F><><EFBFBD><EFBFBD><EFBFBD>((((<28>%<25> <20>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ ││d) uncursed lamp │
│ *<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20><>B<EFBFBD><42>?*)<29><><EFBFBD><EFBFBD><EFBFBD>((]<5D><><EFBFBD><EFBFBD> <20>(((<28><><EFBFBD><EFBFBD>(<28> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││Gems/Stones │
│ *<2A><>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+ <20> <20>(((<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││g) uncursed green gem named 3449 │
<20>*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││E) uncursed violet gem named COLDR ESP FIRER │
│ 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││i) uncursed stone called gray not load │
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ││ │
│ ││ │
└────────────────────────────────────────────────────────────────────────────────┘│ │
┌────────────────────────────────────────────────────────────────────────────────┐│ │
│[M0ll13 the Fighter ] St:25 Dx:16 Co:18 In:8 Wi:12 Ch:7 ││ │
│Lawful $:0 HP:63(63) Pw:26(26) AC:-3 Xp:8 ││ │
│Dlvl:6 T:10818 ││ │
└────────────────────────────────────────────────────────────────────────────────┘└────────────────────────────────────────────────────────────────────────────┘

View File

@@ -0,0 +1,33 @@
Got it — youd like the chain of accessed properties to “remember” its path, so you can do things like:
```js
console.log(foo.bar.baz.toString()); // "bar.baz"
```
You can extend the Proxy trick for that:
```js
function Bottomless(path = []) {
return new Proxy(() => {}, {
get(_, prop) {
if (prop === "toString" || prop === "valueOf") {
return () => path.join(".");
}
return Bottomless([...path, prop]);
},
});
}
const foo = Bottomless();
console.log(foo.bar.baz.toString()); // "bar.baz"
console.log(foo.hello.world.toString()); // "hello.world"
```
⚡ Notes:
- `toString` (and `valueOf`) are trapped so you can stringify naturally.
- The chain isnt “real” objects anymore, but function proxies that track their path.
- You could also add a `.path` property if you prefer structured access.
Want me to make it so it **still supports assignment** (`foo.bar = 123`) _and_ path stringifying?

View File

@@ -0,0 +1,48 @@
<!-- CHATGPT EXAMPLE -->
<!-- 1. Get the width of the container (in pixels). -->
<!-- 2. Get the width of a single character in the monospaced font (this can be done by creating a temporary element with the same font and measuring its width).-->
<!-- 3. Divide the container's width by the character's width to get the number of characters. -->
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Measure Div Width in Characters</title>
<style>
.monospaced-div {
font-family: "Courier New", Courier, monospace; /* Monospaced font */
width: 360px; /* Example width in pixels */
border: 1px solid #333;
padding: 10px;
}
</style>
</head>
<body>
<div class="monospaced-div">This is a div with monospaced text.</div>
<script>
function getMonospacedCharCount(div) {
// Create a temporary span to get the width of one character
const testChar = document.createElement("span");
testChar.textContent = "0"; // Monospaced fonts use "0" for width
testChar.style.fontFamily = window.getComputedStyle(div).fontFamily;
testChar.style.visibility = "hidden"; // Hide the element
document.body.appendChild(testChar);
const charWidth = testChar.offsetWidth; // Get width of a single character
document.body.removeChild(testChar); // Remove the test element
// Get the width of the div and calculate how many characters fit
const divWidth = div.offsetWidth;
// Return the number of characters that fit in the div width
return Math.floor(divWidth / charWidth);
}
const div = document.querySelector(".monospaced-div");
const charCount = getMonospacedCharCount(div);
console.log("Number of characters the div can hold:", charCount);
</script>
</body>
</html>

View File

@@ -0,0 +1,14 @@
const [XSgetSeed, XSgetNext, XSrand] = (() => {
const m = 2 ** 32;
const XSgetSeed = () => Math.floor(Math.random() * (m - 1)) + 1;
const s = Uint32Array.of(XSgetSeed());
return [XSgetSeed, XSgetNext, (seed) => XSgetNext(seed) / m];
}
function XSgetNext(seed) {
if (seed !== undefined) s[0] = seed;
s[0] ^= s[0] << 13;
s[0] ^= s[0] >>> 17;
s[0] ^= s[0] << 5;
return s[0];
}

View File

@@ -0,0 +1,110 @@
const ADJECTIVES = [
'admiring',
'adoring',
'affectionate',
'agitated',
'amazing',
'angry',
'awesome',
'beautiful',
'blissful',
'bold',
'boring',
'brave',
'busy',
'charming',
'clever',
'cool',
'compassionate',
'competent',
'condescending',
'confident',
'cranky',
'crazy',
'dazzling',
'determined',
'distracted',
'dreamy',
'eager',
'ecstatic',
'elastic',
'elated',
'elegant',
'eloquent',
'epic',
'exciting',
'fervent',
'festive',
'flamboyant',
'focused',
'friendly',
'frosty',
'funny',
'gallant',
'gifted',
'goofy',
'gracious',
'great',
'happy',
'hardcore',
'heuristic',
'hopeful',
'hungry',
'infallible',
'inspiring',
'interesting',
'intelligent',
'jolly',
'jovial',
'keen',
'kind',
'laughing',
'loving',
'lucid',
'magical',
'mystifying',
'modest',
'musing',
'naughty',
'nervous',
'nice',
'nifty',
'nostalgic',
'objective',
'optimistic',
'peaceful',
'pedantic',
'pensive',
'practical',
'priceless',
'quirky',
'quizzical',
'recursing',
'relaxed',
'reverent',
'romantic',
'sad',
'serene',
'sharp',
'silly',
'sleepy',
'stoic',
'strange',
'stupefied',
'suspicious',
'sweet',
'tender',
'thirsty',
'trusting',
'unruffled',
'upbeat',
'vibrant',
'vigilant',
'vigorous',
'wizardly',
'wonderful',
'xenodochial',
'youthful',
'zealous',
'zen',
]

View File

@@ -0,0 +1,7 @@
{
"dependencies": {
"fantasy-name-generator": "^2.0.0",
"fantasy-names": "^2.0.1",
"yet-another-name-generator": "^1.2.0"
}
}

191
resources/text-ui-characters.md Executable file
View File

@@ -0,0 +1,191 @@
Here are some ASCII and UTF-8 characters commonly used for "shading" effects in text art or terminal displays. These characters provide varying levels of density or shading:
### ASCII Shading Characters
These are basic ASCII characters often used for shading:
```
Light shade: ░ (U+2591)
Medium shade: ▒ (U+2592)
Dark shade: ▓ (U+2593)
Full block: █ (U+2588)
Half block: ▄ (U+2584), ▀ (U+2580)
```
### Additional UTF-8 Block Characters
These Unicode characters offer more granular shading or block patterns:
```
Light block: ░ (U+2591)
Medium block: ▒ (U+2592)
Dark block: ▓ (U+2593)
Solid block: █ (U+2588)
Upper half block: ▀ (U+2580)
Lower half block: ▄ (U+2584)
Left half block: ▌ (U+258C)
Right half block: ▐ (U+2590)
Quadrant blocks: ▖ (U+2596), ▗ (U+2597), ▘ (U+2598), ▝ (U+259D)
Checkerboard: ▚ (U+259A), ▞ (U+259E)
```
### Example Usage
Heres an example of a simple shading gradient using some of these characters:
```
Light to Dark: ░ ▒ ▓ █
Half blocks: ▀ ▄ ▌ ▐
Quadrant pattern: ▖ ▗ ▘ ▝
```
### Notes
- Not all terminals or text editors display Unicode characters consistently, so ASCII characters like `.:;#+` are sometimes used for basic shading in simpler environments.
- If you want to create specific patterns or need more complex ASCII art, let me know, and I can generate or suggest more detailed designs!
- If you meant something specific by "shading" (e.g., for a particular programming context or art style), please clarify, and Ill tailor the response further.
Below is a collection of ASCII and UTF-8 characters suitable for creating frames, borders, or "windows" in a text-based user interface (TUI), such as those built with ncurses. These characters can be used to draw boxes, lines, and corners to simulate window-like structures in a terminal.
### ASCII Characters for Frames
These are basic ASCII characters that work universally in most terminals:
```
Horizontal line: - (U+002D)
Vertical line: | (U+007C)
Cross/intersection: + (U+002B)
Corners:
Top-left: + (U+002B) or `
Top-right: + (U+002B) or '
Bottom-left: + (U+002B) or ,
Bottom-right: + (U+002B) or .
```
Example simple ASCII window:
```
+----------+
| Content |
+----------+
```
### UTF-8 Box-Drawing Characters
Unicode provides a dedicated **Box Drawing** block (U+2500U+257F) for creating more refined frames. These are widely supported in modern terminals and ncurses:
#### Single-Line Box Drawing
```
Horizontal line: ─ (U+2500)
Vertical line: │ (U+2502)
Corners:
Top-left: ┌ (U+250C)
Top-right: ┐ (U+2510)
Bottom-left: └ (U+2514)
Bottom-right: ┘ (U+2518)
Intersections:
T-junction top: ┬ (U+252C)
T-junction bottom: ┴ (U+2534)
T-junction left: ├ (U+251C)
T-junction right: ┤ (U+2524)
Cross: ┼ (U+253C)
```
Example single-line window:
```
┌──────────┐
│ Content │
└──────────┘
```
#### Double-Line Box Drawing
```
Horizontal line: ═ (U+2550)
Vertical line: ║ (U+2551)
Corners:
Top-left: ╔ (U+2554)
Top-right: ╗ (U+2557)
Bottom-left: ╚ (U+255A)
Bottom-right: ╝ (U+255D)
Intersections:
T-junction top: ╦ (U+2566)
T-junction bottom: ╩ (U+2569)
T-junction left: ╠ (U+2560)
T-junction right: ╣ (U+2563)
Cross: ╬ (U+256C)
```
Example double-line window:
```
╔══════════╗
║ Content ║
╚══════════╝
```
#### Mixed and Other Box-Drawing Characters
For more complex designs, you can mix single and double lines or use specialized characters:
```
Single to double transitions:
Horizontal single to double: ╼ (U+257C)
Vertical single to double: ╽ (U+257D)
Rounded corners (less common, not always supported):
Top-left: ╭ (U+256D)
Top-right: ╮ (U+256E)
Bottom-left: ╰ (U+2570)
Bottom-right: ╯ (U+256F)
```
Example with rounded corners:
```
╭──────────╮
│ Content │
╰──────────╯
```
### Additional UTF-8 Characters for Decoration
These can enhance the appearance of your TUI:
```
Block elements for borders or shading:
Full block: █ (U+2588)
Half blocks: ▀ (U+2580), ▄ (U+2584), ▌ (U+258C), ▐ (U+2590)
Light shade for background: ░ (U+2591)
Medium shade: ▒ (U+2592)
Dark shade: ▓ (U+2593)
```
### Example TUI Window with Content
Heres a sample of a more complex window using single-line box-drawing characters:
```
┌────────────────────┐
│ My TUI Window │
├────────────────────┤
│ Item 1 [ OK ] │
│ Item 2 [Cancel] │
└────────────────────┘
```
### Notes for ncurses
- **ncurses Compatibility**: ncurses supports both ASCII and UTF-8 box-drawing characters, but you must ensure the terminal supports Unicode (e.g., `LANG=en_US.UTF-8` environment variable). Use `initscr()` and `start_color()` in ncurses to handle rendering.
- **Terminal Support**: Some older terminals may not render UTF-8 characters correctly. Test your TUI in the target environment (e.g., xterm, gnome-terminal, or Alacritty).
- **Fallback**: If Unicode support is unreliable, stick to ASCII (`-`, `|`, `+`) for maximum compatibility.
- **ncurses Functions**: Use `box()` in ncurses to draw a border around a window automatically, or manually print characters with `mvaddch()` for custom designs.
### Tips
- Combine single and double lines for visual hierarchy (e.g., double lines for outer windows, single lines for inner sections).
- If you need specific examples (e.g., a multi-window layout or a dialog box), let me know, and I can provide a detailed ASCII/UTF-8 mockup or even pseudocode for ncurses.
- If you want a particular style (e.g., heavy lines, dashed lines, or specific layouts), please clarify, and Ill tailor the response.
Let me know if you need help implementing this in ncurses or want more specific frame designs!