Monday, January 24, 2022

Bists

Here's a game I published under a different pseudonym some time ago. It's written in Pico-8 which is a fantasy console, hence the 8bit style. It's less of a game and more of an aquarium where the creatures actually evolve their brain to survive. But you can join in too if you want. X opens the menu, Z selects inside the menu or joins the game if you are outside the menu. Arrows move you around. Z changes your bist's color if you have joined the game.

I'll just copy-paste my past description:

Bists have a brain with 23 parameters that governs how they behave, how much HP they have and how fast they are (more HP = less speed). They are aware of their nearest green bist, the nearest red bist, as well as the nearest food source. The decide how to move towards or away of these things, how far to look for their closest bists and food, when to switch their color, how often to think, and when to slack off and slow down their falling HP. When their HP is full they give birth to offspring that has randomly mutated parameters.

Food tends to spawn in one tight (near the bottom right) and one wide (near the top left) cluster.

Every now and then a trap will spawn. This looks like food to the bists but it will freeze the bist that eats it for quite some time.

Be patient, bists sometimes take a long time to evolve. There is a speedup option in the help/menu page that you can use if you can't wait.

You can also join the game and try to outlive the oldest bist or try put evolutionary pressure on them (e.g kill some while you are red, and soon bists will be avoiding red bists)

Make sure to check out all the the options that can be found in the menu in the help/menu screen.

If you evolve any interesting brains paste them here in a comment! You can save to the clipboard the brain of the oldest bist by opening the help/opts page finding "SAVE TO CLIP".

Every now and then bists will play a custom cry which is 100% based on the parameters of their brain. You can also listen to the cry of the oldest bist by saving it.

To load a brain and add it to the game just ctrl+v in PICO-8, then open the help/menu page look into the menu for the "ADD FROM CLIP" option.

Finally this is the cart:


Save it on your computer and open it with Pico-8 to play or edit the code.

Friday, January 21, 2022

Arrowheads - Currency system for the Ironsworn tabletop RPG

I recently started playing Ironsworn, a tabletop RPG. In its world (the Ironlands), even though the rulebook describes caravans trading iron and even the existence of iron coins, (which I think would be useless) the people are not using currency to trade and instead choose to barter. I think the game leaves out money mostly because it does away with many potentially complex mechanics and tracking money would probably be one of them. For example, you don't keep track of how many rations you have with you, or even all the details of your inventory. There is a supply track that ranges from 0 to 5 and this represents your overall preparedness for traveling which could include rations, water, the state of your camping equipment, utensils etc. If you wonder if you have something specific on you that you haven't explicitly noted down, you can just roll the dice find out if you do (or ask your GM if you're playing with a GM). This abstraction of detail is actually nice as it help you focus more on the story. But in one of campaigns I'm playing in the Elder Scrolls universe. And that in that universe people use gold coins to trade.

My first attempt to simulate "having money" was to use the Fortune Hunter asset. But that card is quite limited for what I was envisioning:


As you can see even if you unlock all three abilities, the only ways to acquire wealth is as payment for a vow and by scavenging for precious items. I wanted to be able to be hired for jobs and even to hire others. I wanted to be able to pay a doctor to heal me. But at the same time, the track at the bottom of the asset card, which abstracts your wealth as 6 possible values seems handy; I definitely don't want to track the exact number of coins on my character and have to erase and write numbers. Ironsworn tracks are nice.

So I made my own asset, which belongs to a new category of assets that I'll start to use in my campaigns: Items. Those can be acquired by simply having the item but you still need to spend XP to unlock more of their abilities. I have two versions of this asset which are basically identical except the name of the currency. For my solo game in the Elder Scroll universe I just use "Coin purse" which holds gold coins. For my campaigns in the Ironsworn universe I thought that in such a world people could be using iron arrowheads as a currency since they are relatively small thus easy to transfer, they require some craftmanship to make (so they are worth more than their weight in iron), and even if you can't find someone that accepts them you can still use them to make arrows for hunting or defense or even smelt them down for iron. So, here's the current version of my "Arrowhead purse" asset:

Use this json file to import this card into Asset Workbench. Or use this json to import it into Ironsworn Journal

I'll put a disclaimer here: I own Delve, the expansion to Ironsworn, but I am still going through it and I'm not even done with reading about all the new moves it brings. So if something below is not compatible with it, expect me to change it in the future. This currency system is still evolving.

So let's break it down: First, the card tells you that its tracking your arrowheads (or your coins in the "Coin purse" incarnation of the card) only as a multiple of 10. So when your track says 30, you have about 30 arrowheads. Obviously if you have about 30 arrowheads and you give someone 10 of them, you'll be left with about 20 arrowheads. But how do you handle cases where you give less than 10 arrowheads? Do you move the slider on the track or not? And here the card provides a probabilistic solution to this: Roll a single challenge die (that's a D10 for Ironsworn), and compare the die with the amount of arrowheads you are giving out. If the die is equal or less than the amount of arrowheads you are giving out, then move the slider as if you have just given 10 whole arrowheads, otherwise, assume you gave the arrowheads without moving the slider at all. This, in the long run, is a fair system. The benefit you get from not moving the slider even though you gave someone arrowheads is counterbalanced perfectly by the punishment of having to move the slider by a whole 10 arrowheads in even though you gave someone less than 10 arrowheads. The same goes on for when you receive less than 10 arrowheads: you roll a D10, compare with the number of arrowheads with the die and if the die is equal or less than arrowheads you are receiving, you move the slider by a whole 10 arrowheads, otherwise the slider stays where it was even though you "earned" arrowheads. As for quantities like 24, simply move the slider by 20 which is done without using a dice roll, and then roll the dice for the remaining 4. Specifically for 24, you'll end up moving by 30 on 40% of the times, and by 20 on 60% of the times. On average you'll be moving 40%*30+60%*20=24 arrowheads; it's perfectly fair.

Of course the only exception to this is when your purse is at 0 or 100. In those cases you assume, respectively, that you cannot give out any arrowheads or that you cannot accept any more arrowheads into the purse. Don't try to roll the dice to see if you can spare 3 arrowheads when the purse is at 0. If you are at 100 in your purse and you need to store more arrowheads, like the card explains, you can store more arrowheads in other locations, maybe in your backpack, or in a chest in your house. Consider the implications of storing arrowheads in those places though: maybe you should mark Encumbered cause you are like a noisy, walking piggy bank. Maybe the arrowheads are at higher risk of been stolen while you're away from them.

The Arrowhead Purse itself is not without risk of being stolen but I'd consider it the safest location on your person. If someone steals the purse itself from you, you can always just make a new but empty one with a bit of leather and cord. Do not discard the asset card, just don't use it without having a purse on you.

The first ability of the card is about your ability to trade. It lets you trade arrowheads for supply when it makes sense according to the fiction, for example when you're in a settlement or during an encounter with someone on a journey. It also lets you hire others and be hired for arrowheads. It gives some hourly rates and a monthly rate as an example of what work-hours cost. These rates should be adjusted by you to fit your world and your situation. Adjust the supplies price upwards if you think the community is very isolated or in need of basic provisions, or downwards if you are in some more central location with a lot of trade going on. Item prices are not described on the card (not yet, I may add them in the future) but as a guideline I think an average iron tool or weapon costs about 50 arrowheads. If you want to Ask the Oracle about prices you can roll on the table below and then adjust according to your circumstances:

RollSupply priceAverage iron tool/weapon price
1-101Sold for 43, bought for 23
11-202Sold for 43, bought for 23
21-302Sold for 65, bought for 35
31-403Sold for 43, bought for 23
41-503Sold for 65, bought for 35
51-603Sold for 65, bought for 35
61-703Sold for 87, bought for 47
71-804Sold for 65, bought for 35
81-904Sold for 87, bought for 47
91-1005Sold for 87, bought for 47

The price spread between bought and sold price is there so that you can't just make money by trading items between two nearby settlements. You'll need to find settlements with drastically different prices to do profitable trading. Trading supply is cumbersome since you can only carry 5 with you so I don't believe a price spread is required for this one. In any case, you shouldn't consider these prices permanent. If you keep selling iron goods or supply in the same place, soon their price there will fall. If you keep buying them from the same place, their price will soon increase. Ironsworn is not made, even with this money system, to simulate accurate trading. Who knows, maybe in a future version of this system I will make a map generator with reactive pricing that you can use if you like to trade during your campaigns that much. And of course feel free to use your own pricing system! If you want you can remove the spread of prices and make almost all trading profitable.

As the card says you can also improve prices to your favor by using Compel. There's even the third ability of the card that improves, if you unlock it, your odds when you Compel. Keep haggling reasonable: as the rulebook says about Compel, ask yourself if the NPC would be willing to consider the offer you are making, or if you are unsure Ask the Oracle. If they wouldn't you cannot Compel them. And if you miss while Compelling to haggle, don't Compel again unless your offer is radically better.

For example if you want to get someone to follow you in your mission to kill an Elder Bear, first, start by thinking what would be a fair offer. Consider how long it will take and how dangerous it is for them and refer to the work-hour prices provided by the Trade ability, adjust as needed. Then if you want to offer them a fair price then, depending on their profession, their disposition and their character, you may even skip Compel altogether; you don't have to Compel for every trade if the trade is fair and makes sense for the NPC (think of hiring someone who calls themselves a mercenary and has a known price for slaying beasts). If you think they may refuse the offer despite the fair price (for example if you are trying to convince a simple farmer to help with that Elder Bear), then Compel. If you miss, you can only Compel again if your new offer is radically better than the old one (as a rule of thumb, at least double or even triple your first offer). A farmer that refused to help you slay a bear for 50 coins will definitely not even consider doing it for 60 coins, so don't even try that. But for 150 coins you may be able to try to Compel him again. If on the other hand you are trying to Compel someone to lower the price of a sword from 50 to 40 and you roll a miss then the price is 50, don't try to Compel again in such cases.

Flaunt, is the second ability and is based on an ability found on the Fortune Hunter asset but works slightly differently and doesn't cost you arrowheads. If Flaunting fails, you may, if it makes sense in your narrative, Compel again, this time making a generous offer as you're Compelling twice in a row. As always don't Compel unless the NPC is willing to consider it. If you Flaunt and roll a miss, maybe you insulted them they may kick you out of their house, attack you or simply be unwilling to listen to your offers anymore. Maybe they got pissed off by your attitude and they make a request that you cannot afford, just to spite you.

So how would you earn money? Well for one you can Resupply and sell your supply to someone willing to buy it. If you do that keep in mind of how much Resupply you can do in a day and as, we said before, remember to adjust the price of supplies downwards if you keep selling it in the same place. 

Another way to earn money is that you can Ask the Oracle if the NPCs you just killed or forced to surrender have arrowheads on them that you can take. Or ask the Oracle if the place you are runsacking has any arrowheads in it, or any items that you can carry to a settlement to sell for arrowheads. If the place you are ransacking is dangerous or has hidden places where the money could be, Face Danger as appropriate when taking them.

If you are pickpocketing someone, Ask the Oracle if they have arrowheads on them (or precious items), and Face Danger as appropriate. When Asking the Oracle about the existence of arrowheads or precious items don't forget that the answer is for you, the player, and may not be necessarily known to your character. If you think about pickpocketing someone and the oracle says they have nothing of value, your character can't magically decide that they won't take the risk of Facing Danger to pickpocket them. Perhaps you should have Asked the Oracle if they look like they have arrowheads on them and if the oracle says yes, then you Face Danger to pickpocket them and interpret a strong hit as actually finding something, while a weak hit as simply not getting caught but finding nothing.

Another way is to routinely earn arrowheads is by finding an odd job or maybe even a proper job if you feel like it. In one of my campaigns I'm playing a missionary so I made this table that I roll on to figure out what kind of work I found to do in a settlement, how much I get paid, and how many hours it takes:

RollDescriptionEarnings
1-5Wasted one hour and found no job.0
6-56Housework or fieldwork for 11 hours.6
57-89Guard duty for 11 hours12
90-97Teaching or preaching or acting for 7 hours8
98-00Exorcism for 6 hours78

This table was calibrated with a program to give you an average of 10 arrowheads per day and an average of 10 hours of work per day. The reason I used a program is so that I could make tables for all players in that campaign, customized not just in terms of descriptions but also with different number of rows in them and different distributions for the potential daily wages, with some players wanting less variation and others wanting more. In the future I may turn the program into something easily usable like a webpage but for now it's just a Lua script that needs editing. You can download it from here if you want. If you don't know how to use that, try reaching out to me and if I have some time I can help you.

For another character I play, a trader, I use this table when I'm in a settlement:

RollDescriptionEarnings
1-2Wasted 45 minutes, I cannot set up shop today.0
3-41Traded trinkets for 11 hours.0
42-79Traded trinkets for 11 hours.10
80-90Traded trinkets for 11 hours.20
91-00Traded trinkets and appraised items for 11 hours40

And this one when I'm just in someone's homestead where trading trinkets for 11 hours doesn't make sense:

RollDescriptionEarnings
1-10No work but no time lost either.0
11-90Housework/fieldwork for 12 hours.10
91-00Appraise items for 4 hours20

Once more, these are calibrated using the same program to waste on average 10 hours per day to earn 10 arrowheads.

You may be wondering, how come, according to the card, a person can earn about 144 arrowheads per 40 days, but with all these table you'd be earning up to 400 arrowheads per 40 days? For one, Ironsworn are supposed to be way above average in terms of abilities and conviction. Your character can perform, when given the chance, much more valuable work. Secondly, I did not assume that people work all 40 of those days. Perhaps they take 1 every 7 days off. By making this adjustment people need to perform troublesome work for 8.4 hours per day to earn 144 arrowheads every 40 days. But why only 8.4 hours? People in medieval style society would be working much longer than that. While this is true, it's also true that people did a lot of work at home too. Whatever "free time" you think the average person has after those 8.4 hours, is probably occupied by doing some other kind of work at their home which doesn't contribute to their 40 day salary. But, hey, I'm not a historian, feel free to adjust any numbers you don't like.

As you've seen, I keep using 40 days as a standard for time and salaries. That's because I like to keep track of time in my games and to do so I devised the following system: When I start the campaign I decide what year it is, with year 1 being the approximate time when people started arriving to the Ironlands. So, usually, I start somewhere at year 100. I divide the year into 4 seasons with 40 days each. I don't have months in my calendar, or you can consider the seasons your months if you want. Then I decide what season and what day within that season it is. Days within the season obviously range between 1 and 40, there's no 0 day. Lets assume we're starting at day 5 of spring of the year 105. I will then make a new epic progress track named P105 with 5 ticks in it. I use P for sPring, U for sUmmer, A for Autumn and W for Winter. Eventually I may come up with some custom season names for my campaigns but for now this works for me. Then, every time I Make Camp or Sojourn through the night or if I Make a Journey through the night or in any case when a day passes, I put one more tick in the progress track. When it gets completely filled, I make a new track for the next season (U105 in our example) and I put 1 tick in it. When I take note of events in my notes, I write the date down in the very compact form "5P105", meaning "the 5th day of spring of year 105". This helps me make the weather different for each season and gives me a very good sense of how much time has passed since past events.

Now back to the currency system. If you use it, it may make sense for you to ignore the equip and provision options of the Sojourn move. It kinda doesn't make much sense to have that "free" supply which you could immediately sell for arrowheads. Instead just purchase supplies with your arrowheads and if you don't have any spend some time there doing some odd job to work there like I explained above. To clear the unprepared debility simply pay for an extra unit of supply which you do not add your supply track, so to go from unprepared to 5 supply you'd need to buy 6 supply.

In the future I want to try and refine how other tracks can be affected by trade. For example health. Currently if there is a doctor in a settlement I simply pay them to heal me. I consider it formidable work that takes two hours (as an example), so I give them 4 arrowheads and gain 2 health. But I don't make the Heal move because, the way I see it, my Wits have nothing to do with the risk I'm taking. Some users on the Ironsworn discord had suggested that Healing is always about you even when someone else is doing it, so I should still roll for the Heal move even when I hire someone to heal me. I am not convinced by that argument because when another ally heals you, they roll on Heal, you do not roll on top of them to see if you "took it right". If what they say was the case, I'd expect that when an ally helps heal you, they role for Aid your Ally (Secure an Advantage) and then you roll for Heal. But that's not how it's done. Still though, I understand the need for the Heal to possibly fail because of how my body reacts. Just because I hired someone doesn't mean that I will 100% get better. That risk can be easily introduced by Asking the Oracle if the healing was successful, or by rolling for Heal +Iron which kinda signifies my character's endurance. I'm still not decided on what's the proper way to do this. Finally I want to produce some more detailed price lists based on this medieval price list. So expect future updates on this system!

 Attributions:

Wednesday, January 19, 2022

grIP v1.0

For my port and IP scanning needs I often used Angry IP Scanner. I've been using it in Windows XP since the early 00's and it's still good, even after its more recent Java rewrite.

While using it a few days ago it, some features of it and the lack of some others, gave me a nudge to write my own scanner. Go seemed like a good language for it, given it's amazing multithreading abilities and its easy to use standard library.




I called it grIP and it has a few somewhat unique, I think, features.
  • Shuffled, not random, scanning. I wanted it to shuffle the whole list of IP-port combinations and scan them in parallel. Angry IP Scanner has random scanning (but not shuffled) which in theory is not good for scanning humongous IP ranges (being a GUI app) and it will also repeat some IPs. So, for example, scanning 254 random IPs on the 192.168.0.0/24 range will not scan all of the IPs because some will be chosen more than once. The main problem with making a shuffled scan is that when scanning ranges like the whole IPv4-port range, which is 281470681743360 ports, shuffling it properly is impossible. Even having to keep a single bit for every of these ports to remember whether it's been scanned or not would occupy 32GiB of RAM. So I chose to do a half-assed shuffle: I chose a random starting point on that range, I chose a somewhat random step size which is co-prime with the size of the range, and then step through the range using that step size until I reach again my starting point. With the two numbers being co-primes this method is guaranteed to visit every port exactly once before looping back to the starting point. On top of it every 1 million ports generated with this method are also buffered and truly shuffled to further improve the shuffle. So, not a perfectly shuffled scan, but it's shuffled and it uses very little RAM.
  • One thread per port, not one thread per IP. Angry IP Scan uses one thread per IP, so if you are trying to scan 65354 ports in a 254 IP LAN, it will at best run 256 threads, and it's still quite slow. GrIP can use 3900 threads, at least on a Linux box. The 1 thread per IP that seems to be used by Angry IP Scanner doesn't seem to be an arbitrary limitation though, and it may even have it's uses. If you scan a single IP with many threads, it may fail to respond to some of your port checks and you may see less open ports than it really has. So keep that in mind when scanning with grIP.
  • IPv6 support. Limited to single IPs but it's there. I tried to add support for IPv6 ranges, but it needs some datatypes to be reworked so I may do that in a future version if I need it or if someone requests it.
  • Scan partitioning, for cooperative scans. You can split the ports to be scanned and do only part of the scan while other computers or other people do the other parts.
It's a console app that runs on Windows, Linux, Mac and the Raspberry Pi (well, any ARM Linux really). Similarly to Aperito, it uses a non standard style of command line arguments where the order matters and "-h" style arguments don't exist. 

Some example commands:
  • grip 192.168.0.1-192.168.0.254
    Scans all ports in your LAN (if that's your range).
  • grip 80,20-25 192.168.0.1-192.168.0.254
    Same range but only port 80 and ports 20 to 25.
  • grip 80,20-25 192.168.0.1/24
    Same but CIDR notation.
  • grip 22,80 192.168.0.15 2a00:1450:4014:80e::200e
    Port 22 and 80 on one IPv4 and one IPv6.
  • grip host=www.example.com
    All ports on www.example.com.
  • grip 80-85 192.168.0.17 90-95 192.168.0.21-192.168.0.31
    Ports 80 to 85 on one IP and ports 90 to 95 on a range of IPs.
  • grip sockets=2 192.168.0.1/24 timeout=100
    All ports in your LAN but using only 2 instead of the default 100 sockets in parallel and with a 100ms timeout instead of the default 2000ms. The sockets and timeout parameters can go anywhere in the arguments.
  • grip 0.0.0.0/0 1/3 sockets=3900
    grip 0.0.0.0/0 2/3 sockets=3900
    grip 0.0.0.0/0 3/3 sockets=3900
    Three commands, to be run on three separate computers, that cooperatively scan the whole IPv4 internet for any open ports using 3900 sockets each in parallel. It will still never finish but it's 3 times faster than doing it alone. :-)
  • grip 150.150.100.0/24 rdns
    Scans a range and also shows the reverse DNS of any finds. Again, the "rdns" can go anywhere in the arguments.
  • grip 192.168.0./24 file=mylan.txt
    Scans your LAN and appends the open ports found to mylan.txt.
There are also a couple of verbosity related commands and you can find more info by simply running the program in a console so that it prints a help page.

  The latest version can be downloaded from here, and the signature from here.

Update: v1.0.1 Fixes a bug in Windows and some tiny details in the help page.

Popular Posts