I put the full ruleset on Google Docs, but below is a Markdown version of the sections relevant to the dice system. I've been working on this for 3 or so months, and my buddies and I have played maybe 5 games with it. We like it a lot! I feel like the core mechanics and the math behind them tell a super intricate story despite being so simple, which I think is super cool. What are your thoughts?

Who am I?

Players need only decide one thing when creating their characters: which dice they use. All characters are represented by exactly two and nothing more.

The first is known as their Action die. Pick the one that best fits your character.

  • Strong, powerful, and tough characters use a six-sided Action die.
  • Charismatic, charming, and attractive characters use an eight-sided Action die.
  • Agile, dexterous, and swift characters use a ten-sided Action die.
  • Intelligent, thoughtful, and quick-witted characters use a twelve-sided Action die.

The second is known as their Approach die. Pick the one that best fits your character.

  • Forceful, reactive, and fiery characters use a six-sided Approach die.
  • Disciplined, courageous, and willful characters use an eight-sided Approach die.
  • Sharp, perceptive, and attentive characters use a ten-sided Approach die.
  • Meticulous, level-headed, and careful characters use a twelve-sided Approach die.

The rest is up to you! Your character can look, act, and carry whatever you want — just be sure to check with the Narrator first.

What happens when I try?

Players will automatically succeed in most of their endeavors, but those that involve some level of difficulty or risk are determined by the rolling of dice. All such actions belong to one of four types: Forcing, Consorting, Finessing, or Engaging.

  1. To Force is to use raw, physical strength. One must roll between four and six to successfully force.
  2. To Consort is to persuade, deceive, or otherwise communicate with others. One must roll between five and eight to successfully consort.
  3. To Finesse is to maneuver one’s body in a precise, swift, and calculated manner. One must roll between six and ten to successfully finesse.
  4. To Engage is to interact with an object using intense focus and care. One must roll between seven and twelve to successfully engage.

(This is a table in the original document)

  • Force: 4, 5, 6
  • Consort: 5, 6, 7, 8
  • Finesse: 6, 7, 8, 9, 10
  • Engage: 7, 8, 9, 10, 11, 12

When attempting an action, the player rolls both of their dice. One successful die typically results in a successful action, two typically an overwhelmingly successful action, and zero typically a failure. However, the relative ease or difficulty of the task at-hand may change this.

…and if someone tries to stop me?

If ever two or more characters are in direct competition with one another, the players may choose to enter a Contest. During which, all parties take an action to win, with the character yielding the highest degree of success coming out victorious. If multiple characters yield the same degree of success, and the Narrator is unsatisfied with a tie or stalemate, they alone may roll again.

What about when lead starts flying?

Players typically act freely and without order, but the Narrator may enforce turn-based actions if the provided structure is desired. The most common such case is combat.

Turn-based encounters are divided into Rounds. During which, all participants take a single action and note the number rolled by their Approach die. This becomes their “initiative” for the round.

As the players roll, the Narrator creates a list of every action and its degree of success, using the initiatives to order them from lowest to highest. Upon completing the list, the Narrator reads through it and describes how the Round unfolds. If an action becomes impossible due to the outcome of a previous one — such as the death of a character — it is simply ignored.

Once the Narrator is finished, a new Round begins, and the cycle repeats.

How bad is it, Doc?

If ever a character is inflicted with a physical injury or mental affliction, they mark an unmarked number on their Wound or Stress tracks, respectively.

Until the character is healed of their infliction, rolling a number marked on either track means their injury flares up or their composure cracks, triggering an immediate narrative complication alongside the action’s outcome. Rolling a number that is marked on both tracks increases the severity of said complication. If either of a character’s tracks is completely filled, their body or mind has reached its limit, and they are permanently removed from the game.

Each track consists of numbered slots matching the values a die can roll. The size of your Stress track is equal to the number of sides on your Approach die. The size of your Wound track is equal to 18 minus that of your Action die.

 

cross-posted from: https://r1b.it/post/38416

With mander.xyz being down for so long, I've really started to miss my nerdy science memes. So, being an instance owner, I decided to fix that! !memes@r1b.it is the perfect home for all of your biology, chemistry, physics, math or otherwise scientific shitposts and memes :)

This is a drop-in replacement for the late !science_memes@mander.xyz. Like with my other mander replacement, !herps@r1b.it, I do not expect anyone to stick around if/when mander comes back. This is just a temporary home for all of us science lovers. If you do decide to stay tho, I greatly appreciate it!

 

cross-posted from: https://r1b.it/post/38416

With mander.xyz being down for so long, I've really started to miss my nerdy science memes. So, being an instance owner, I decided to fix that! !memes@r1b.it is the perfect home for all of your biology, chemistry, physics, math or otherwise scientific shitposts and memes :)

This is a drop-in replacement for the late !science_memes@mander.xyz. Like with my other mander replacement, !herps@r1b.it, I do not expect anyone to stick around if/when mander comes back. This is just a temporary home for all of us science lovers. If you do decide to stay tho, I greatly appreciate it!

 

With mander.xyz being down for so long, I've really started to miss my nerdy science memes. So, being an instance owner, I decided to fix that! !memes@r1b.it is the perfect home for all of your biology, chemistry, physics, math or otherwise scientific shitposts and memes :)

This is a drop-in replacement for the late !science_memes@mander.xyz. Like with my other mander replacement, !herps@r1b.it, I do not expect anyone to stick around if/when mander comes back. This is just a temporary home for all of us science lovers. If you do decide to stay tho, I greatly appreciate it!

[–] [S] 1 point 5 days ago (1 child)

Either! That's typically how I've played most RPGs when it comes to determining Charisma, Dexterity, etc.

A player might say "I want to try and Force the door open," determining it themselves. They might also say "I'm gonna survey the horizon. Do I see anything of note?" and the GM might say "Sure! Roll to Engage."

  • source
  • parent
  • context
  • [–] [S] 1 point 5 days ago* (last edited 2 days ago) (3 children)

    With the base dice system, yes. I'm lazy so I'm just going to copy-paste what I said to the other commentor, lol.

    It’s important to note that doubling up on dice in this system is essentially min-maxing. You’re getting a 75%+ success rate on Forcing in exchange for a 0% success rate on Engaging. That is just with the base system, though. I didn’t include these sections in the post, but other systems of the game (such as Effects) meddle these numbers and can allow a double d6 character to successfully Engage.

    And no, I haven't played Fabula Ultima. I'll be sure to check it out tho if it's similar!

  • source
  • parent
  • context
  • [–] [S] 2 points 5 days ago

    Seems like if I take forceful and strong, I can never ever succeed at at least one categories of options?

    That's exactly right. While, yes, they are unable to Engage with two d6s, that kind of tells a story with just the math. That would be the classic "strong, short-tempered jock" archetype. They may not be the brightest, and they may not be the most careful, but dang can they hit hard!

    It's important to note that doubling up on dice in this system is essentially min-maxing. You're getting a 75%+ success rate on Forcing in exchange for a 0% success rate on Engaging. That is just with the base system, though. I didn't include these sections in the post, but other systems of the game (such as Effects) meddle these numbers and can allow a double d6 character to successfully Engage.

    Though, my party and I understand all of this because we've been building the game together. I see now how that requires a wealth of mechanical context and isn't really all that clear to new readers.

    Unclear how health and recovery work. Seems like the double d6 would have low stress, high wounds?

    Essentially just two pools of hit points, but with the added complication system if you roll a marked number. Yes, a double d6 character would have a low Stress capacity (6) and a high Wound capacity (18 - 6 == 12). They can take some physical hits, but are weak to mental hits.

    Again, this wasn't covered in the Markdown preview I wrote, so I apologize for that, but recovery is done entirely through storytelling, particularly during Downtime. If a character received a Wound from fracturing a bone, they'd spend a months-long Downtime in a sling. If they received a Stress from a terrifying encounter, they'd spend an hours-long Downtime coping with it. And if you have a lot of Wounds/Stress and forgot how you got each one, you can simply say "Hey I'm gonna recover during Downtime" lol.

    Have you played Fate? This seems like a distant relative of Fate Accelerated.

    I have! There was no direct inspiration, but I do like Fate a lot.

    No meta game points or succeed at a cost?

    Meta game points are covered by Effects, which were not covered in the Markdown preview.

    As for succeeding at a cost, Wounds and Stresses cause "an immediate narrative complication alongside the action’s outcome", but there's no rigid system for uninjured characters. I tried to work it in, but it felt clunky for a rules-light game like this. I will say that the section on actions does give a brief blurb about "the relative ease or difficulty of the task at-hand". When I've run the game with my party, I've narrated a player barely succeeding a fairly difficult task as a success with a cost.

  • source
  • parent
  • context
  • submitted 6 days ago by to c/croak@r1b.it
     

    Happy Halloween!

    I really need to start posting these a day later.... This is three weeks in a row where we hit a huge milestone almost immediately after posting a Weekly Croak! This week's was !herps passing 100 subscribers! And we didn't just peek past the triple digit mark, we blew past it! As of writing this, !herps is sitting at 134 total subscribers. Crazy! Thank you guys for the support :)

    The userbase is also picking up some steam! We now have a total of 7 users, and I've even seen pretty big posts from r1b.it users on foreign instances. @Mandarbmax@r1b.it in particular is killing it! That's great natural advertising, so I really appreciate it.

    Lastly, I'm still working on federation issues.... I seem to have pretty much solved the missing posts problems we've been having, but smaller things like upvote counts still need to be worked on. I'm not too sure what's going on with those, but hopefully I'll get to them soon. Please let me know if you encounter any more issues! The more reports I get, the better I'll be able to piece together a solution.

    That about wraps it up for this week; it's been somewhat of a quiet one. Let's keep up the amazing growth!

    [–] 10 points 6 days ago

    Language is used to communicate. If you get so caught up in the "logically correct" word to use that people don't know what you mean, you're defeating the purpose. The "right" word is the one that people understand regardless of how messy it's history is

  • source
  • [–] 4 points 1 week ago (2 children)

    Yup! Anytime. You won't get existing upvotes and comments, but as new ones come in, you should get them. It's not perfect, but it's something. I appreciate you dealing with the issues of a teeny tiny instance! I wouldn't be offended if you don't daily-drive it for a minute until it's a bit better. I will say, though, the more active users, the better Federation will get

  • source
  • parent
  • context
  • submitted 1 week ago by to c/croak@r1b.it
     

    Week number 2! Sorry, this is a big one....

    Users!!

    Only 2 weeks in, and r1b.it already has it's first three local users (besides me, ofc)! This is an absolutely insane milestone, and I'm super pumped we've hit it so soon. Like I said in the last Weekly Croak, I didn't expect to have any active users for the first few weeks, but we have 3 already?? Insane.

    In particular, I just wanted to shout out @Trying2KnowMyself@lemmy.ml. They have been very active and have constantly maintained an positive, happy attitude -- exactly the type of userbase I want to cultivate :) I'm super grateful that complete strangers are as pumped about my little instance as I am. It's super validating, so I just wanted to publicly show my appreciation.

    However, that's not to say we shouldn't keep growing ;) The best, most tight-knit communities grow almost exclusively by word of mouth. Like-minded individuals naturally interact with one another on the Fediverse, so normal conversation is the best way to build the type of userbase I want. So, if you have a r1b.it account, please use it! Even showing up in foreign threads here and there with the instance attached to your username does something (that's actually how I found my old home instance). If you don't have a r1b.it account or just prefer using a different instance, still post! That keeps the instance alive. What I have been doing is posting on r1b.it and then cross-posting to similar communities, which seems to work fairly well.

    slrpnk.net is down :(

    If you weren't aware slrpnk.net -- a very closely-related instance -- is currently down due to hardware issues, and they say they likely won't be back up until December/January. In the meantime, I'd be happy to house any interim communities or users until it gets back online. Just post a request in !croak@r1b.it, and I'll be happy to make it for you! Once slrpnk comes back up, I can remove them if you so desire.

    Federation issues... fixed?

    As I said in this post, r1b.it has been struggling to federate content due to it's small size. A handful of users just isn't enough to maintain healthy links to every subscribed community. So, I have been working on a little script to automatically poke subscribed communities every so often, hopefully pulling any new posts from them.

    However, while I said the issue was fixed, it wasn't.... I got a bit too overzealous and posted right after successfully running the script for the first time without waiting to see if it was a permanent solution. That's entirely on me and is a lesson learned as a community administrator. I think I have gotten the script to a place where it works consistently, but again, I'll just need some time to see. Once I solve the issue for good, I'm hoping there will be less friction for new users to join and consistently use their r1b.it accounts.

    My statement on AI

    Like I said above, we currently have 3 r1b.it user accounts, but I've gotten almost 6 total applications. The reason for the low acceptance rate is simple: AI content.

    Two of the applications were for completely AI-driven users, which is absolutely insane to me. The Dead Internet Theory is quickly becoming the Dead Internet Reality. The other denied application was a user that boasted their use of AI, and said they could quickly churn out content to keep r1b.it alive. While, yes, active users are great, that misses the whole point. I don't run this instance for the satisfaction of having a bigger number on the stats page; I run it as a service to people. It is a place to listen and to be heard. If I allow AI-generated content on my instance, living people won't be impacted, and we'll be speaking into the void.

    On top of that, I just can't justify the intense compute required to produce generated content. r1b.it is an instance dedicated to nature and actively supports conservation communities like slrpnk. Allowing AI-generated content that consumes immense quantities of power and water is a slap in the face to the very idea of this instance.

    With all of that in mind, I am strictly banning all AI-generated content on r1b.it. If you suspect any, report it. Thank you for your help!

     

    (if you can't see the thumbnail)a large pyrosome alongside a diver, the pyrosome is roughly 4x the length of the diver

    Most people walk past pyrosomes on beaches or see videos of scuba divers swimming through them and think they are some kind of massive jellyfish, a giant sack of eggs, or a weird mutant cucumber. However, they're actually a colony of thousands of individual organisms called tunicates!

    the anatomy of a tunicate

    There exists a single "original" tunicate, and the rest of the tube is made up of thousands of genetic clones that are built over time. They all live inside a single gelatinous tunic and connect within it, sharing a common water intake/exhaust system. Each individual zooid pulls water in, filters out plankton for food, and pushes the filtered water back out into the central tube. That collective exhaust builds and acts like a jet propulsion system, slowly moving the whole giant colony through the water. How cool is that?!

    a larger pyrosome dramatically twisting between multiple divers

    They are also intensely bioluminescent through a chemical reaction known as the "Luciferin-Luciferase reaction". A specialized enzyme (luciferin) oxidizes a light-emitting compound (luciferase) inside small light-producing cells located on each zooid. If you touch one or stimulate the pyrosome with light, it triggers a chain reaction that passes the signal to neighboring cells, creating a wave of blue-green light across the entire colony. Divers have called swimming inside a hollow pyrosome tube "swimming through a tunnel of stars."

    a glowing pyosome small enough you can see each individual tunicate

    What are some of your favorite aquatic weirdos?

     

    cross-posted from: https://r1b.it/post/12935

    As I have browsed the Fediverse through r1b.it, I've noticed lots of missing content from remote communities. Some of that has to do with actual federation problems (which I have been in talks with other instance owners to fix), but most of it is a result of completely intentional behavior. Regardless of that, though, I feel as if missing content detracts from the r1b.it user experience. So, I decided to flex my programming muscles a bit and devised a solution.

    For the more technically inclined bunch, you can keep reading to see how it works. For everyone else, you can just be happy to hear that you should now be getting all new content from your subscribed communities! If you have any further federation issues, please let me know. You can always @ me in !croak :)

    The nerd stuffLemmy relies on an event-driven feed, meaning it doesn't always automatically pull posts from remote servers unless someone is actively browsing or querying them. So, if a r1b.it user doesn't actively interact with a community, the content won't get pulled. If no new content is getting pulled, no one will interact with the community. To break this cycle, I've set up a lightweight Python script to automatically sync every subscribed community in the background. This script is set up as a cron job that runs every 6 hours.

    This script first queries r1b.it's local PostgreSQL database to gather a unique list of every remote community local users are subscribed to. For each community it finds, the script targets Lemmy's resolve_object API endpoint using the community's full actor URL to refresh its metadata and maintain connection health.

    To keep this script from turning into a DDOS as r1b.it grows, it shuffles the community list to spread instances out and has a polite randomized pause between each request. Additionally, I plan to remove this script entirely if r1b.it ever gets big enough to federate itself naturally.

    #!/usr/bin/env python3
    import subprocess
    import urllib.parse
    import urllib.request
    import time
    import random
    
    LOCAL_DOMAIN = "https://r1b.it/"
    DB_CONTAINER = "REDACTED"
    DB_USER = "REDACTED"
    DB_NAME = "REDACTED"
    
    SQL_QUERY = """
    SELECT DISTINCT c.actor_id 
    FROM community_follower cf
    JOIN person p ON cf.person_id = p.id
    JOIN community c ON cf.community_id = c.id
    WHERE p.local = true 
      AND c.local = false;
    """
    
    def get_subscriptions():
        cmd = [
            "docker", "exec", "-i", DB_CONTAINER,
            "psql", "-U", DB_USER, "-d", DB_NAME, "-t", "-A", "-c", SQL_QUERY
        ]
        try:
            res = subprocess.run(cmd, capture_output=True, text=True, check=True)
            return [line.strip() for line in res.stdout.splitlines() if line.strip()]
        except Exception:
            return []
    
    def resolve_community(actor_id):
        encoded = urllib.parse.quote(actor_id, safe="")
        api_url = f"{LOCAL_DOMAIN}/api/v3/resolve_object?q={encoded}"
        req = urllib.request.Request(
            api_url, 
            headers={"Accept": "application/json", "User-Agent": "LemmyAutoSync/1.0"}
        )
        try:
            with urllib.request.urlopen(req, timeout=10) as resp:
                return resp.status
        except urllib.error.HTTPError as e:
            return e.code
        except Exception:
            return 500
    
    def main():
        communities = get_subscriptions()
        if not communities:
            return
    
        print(f"Found {len(communities)} unique remote subscriptions")
        
        random.shuffle(communities)
    
        for actor_id in communities:
            status = resolve_community(actor_id)
            if status == 200:
                print(f"{actor_id} FEDERATED")
            elif status == 400:
                print(f"{actor_id} ALREADY FEDERATED")
            else:
                print(f"{actor_id} FAILED ({status)")
            
            # Polite randomized pause
            time.sleep(random.uniform(1, 5))
    
        print("Sync complete.")
    
    if __name__ == "__main__":
        main()
    

    submitted 2 weeks ago by to c/croak@r1b.it
     

    As I have browsed the Fediverse through r1b.it, I've noticed lots of missing content from remote communities. Some of that has to do with actual federation problems (which I have been in talks with other instance owners to fix), but most of it is a result of completely intentional behavior. Regardless of that, though, I feel as if missing content detracts from the r1b.it user experience. So, I decided to flex my programming muscles a bit and devised a solution.

    For the more technically inclined bunch, you can keep reading to see how it works. For everyone else, you can just be happy to hear that you should now be getting all new content from your subscribed communities! If you have any further federation issues, please let me know. You can always @ me in !croak :)

    The nerd stuffLemmy relies on an event-driven feed, meaning it doesn't always automatically pull posts from remote servers unless someone is actively browsing or querying them. So, if a r1b.it user doesn't actively interact with a community, the content won't get pulled. If no new content is getting pulled, no one will interact with the community. To break this cycle, I've set up a lightweight Python script to automatically sync every subscribed community in the background. This script is set up as a cron job that runs every 6 hours.

    This script first queries r1b.it's local PostgreSQL database to gather a unique list of every remote community local users are subscribed to. For each community it finds, the script targets Lemmy's resolve_object API endpoint using the community's full actor URL to refresh its metadata and maintain connection health.

    To keep this script from turning into a DDOS as r1b.it grows, it shuffles the community list to spread instances out and has a polite randomized pause between each request. Additionally, I plan to remove this script entirely if r1b.it ever gets big enough to federate itself naturally.

    #!/usr/bin/env python3
    import subprocess
    import urllib.parse
    import urllib.request
    import time
    import random
    
    LOCAL_DOMAIN = "https://r1b.it/"
    DB_CONTAINER = "REDACTED"
    DB_USER = "REDACTED"
    DB_NAME = "REDACTED"
    
    SQL_QUERY = """
    SELECT DISTINCT c.actor_id 
    FROM community_follower cf
    JOIN person p ON cf.person_id = p.id
    JOIN community c ON cf.community_id = c.id
    WHERE p.local = true 
      AND c.local = false;
    """
    
    def get_subscriptions():
        cmd = [
            "docker", "exec", "-i", DB_CONTAINER,
            "psql", "-U", DB_USER, "-d", DB_NAME, "-t", "-A", "-c", SQL_QUERY
        ]
        try:
            res = subprocess.run(cmd, capture_output=True, text=True, check=True)
            return [line.strip() for line in res.stdout.splitlines() if line.strip()]
        except Exception:
            return []
    
    def resolve_community(actor_id):
        encoded = urllib.parse.quote(actor_id, safe="")
        api_url = f"{LOCAL_DOMAIN}/api/v3/resolve_object?q={encoded}"
        req = urllib.request.Request(
            api_url, 
            headers={"Accept": "application/json", "User-Agent": "LemmyAutoSync/1.0"}
        )
        try:
            with urllib.request.urlopen(req, timeout=10) as resp:
                return resp.status
        except urllib.error.HTTPError as e:
            return e.code
        except Exception:
            return 500
    
    def main():
        communities = get_subscriptions()
        if not communities:
            return
    
        print(f"Found {len(communities)} unique remote subscriptions")
        
        random.shuffle(communities)
    
        for actor_id in communities:
            status = resolve_community(actor_id)
            if status == 200:
                print(f"{actor_id} FEDERATED")
            elif status == 400:
                print(f"{actor_id} ALREADY FEDERATED")
            else:
                print(f"{actor_id} FAILED ({status)")
            
            # Polite randomized pause
            time.sleep(random.uniform(1, 5))
    
        print("Sync complete.")
    
    if __name__ == "__main__":
        main()
    

    view more: next ›