Select the types of activity you want to include in your feed.
feat: add numlegs parameter, lower default height range
- numlegs: randomized to even numbers 0..8 (0=legless, 8=spider) - Legs are evenly distributed across body width (inset 1 col from edges) - Height default range lowered from 6..12 to 4..8
···77#[derive(Parser, Debug)]
88#[command(name = "clood", version, about)]
99struct Args {
1010- /// Height of the body in rows [default: random 6..12]
1010+ /// Height of the body in rows [default: random 4..8]
1111 #[arg(long)]
1212 height: Option<usize>,
1313···1818 /// Width of each arm in columns [default: random 2..4]
1919 #[arg(long)]
2020 armsize: Option<usize>,
2121+2222+ /// Number of legs, even number [default: random even 0..8]
2323+ #[arg(long)]
2424+ numlegs: Option<usize>,
21252226 /// Length of each leg in rows [default: random 2..4]
2327 #[arg(long)]
···5256 format!("\x1b[38;2;{};{};{}m\u{2588}\x1b[0m", r, g, b)
5357}
54585959+/// Build a leg row mask for the given body width and number of legs.
6060+/// Legs are distributed evenly across columns 1..(width-1) (one col inset from each edge).
6161+/// Each leg is 1 column wide. Returns a vec of bools (true = leg block).
6262+fn leg_mask(width: usize, numlegs: usize) -> Vec<bool> {
6363+ let mut mask = vec![false; width];
6464+ if numlegs == 0 || width < 3 {
6565+ return mask;
6666+ }
6767+6868+ // Usable span: columns 1 through width-2 (inset 1 from each edge)
6969+ let span_start = 1usize;
7070+ let span_end = width - 2; // inclusive
7171+ let span = span_end - span_start + 1;
7272+7373+ if numlegs == 1 {
7474+ // Center it
7575+ mask[width / 2] = true;
7676+ return mask;
7777+ }
7878+7979+ // Distribute numlegs evenly across the span
8080+ for i in 0..numlegs {
8181+ let col = if numlegs == 1 {
8282+ span_start + span / 2
8383+ } else {
8484+ span_start + (i * (span - 1)) / (numlegs - 1)
8585+ };
8686+ if col < width {
8787+ mask[col] = true;
8888+ }
8989+ }
9090+9191+ mask
9292+}
9393+5594fn main() {
5695 let args = Args::parse();
5796 let mut rng = rand::thread_rng();
58975959- // Defaults: random between base and 2x base
9898+ // Defaults: random within range
6099 let width = args.width.unwrap_or_else(|| rng.gen_range(8..=16)).max(4);
6161- let height = args.height.unwrap_or_else(|| rng.gen_range(6..=12)).max(3);
100100+ let height = args.height.unwrap_or_else(|| rng.gen_range(4..=8)).max(3);
62101 let armsize = args.armsize.unwrap_or_else(|| rng.gen_range(2..=4));
102102+ let numlegs = args.numlegs.unwrap_or_else(|| rng.gen_range(0..=4) * 2); // even: 0,2,4,6,8
63103 let legsize = args.legsize.unwrap_or_else(|| rng.gen_range(2..=4));
64104 let mood = args.mood.unwrap_or_else(|| rng.gen_range(-2..=2));
65105···120160 }
121161122162 // -- Leg rows --
123123- let leg_width = (width / 3).max(1);
124124- let gap = width - 2 * leg_width;
163163+ let legs = leg_mask(width, numlegs);
164164+ let effective_legsize = if numlegs == 0 { 0 } else { legsize };
125165126126- for _row in 0..legsize {
166166+ for _row in 0..effective_legsize {
167167+ // Left padding (arm area)
127168 for _ in 0..arm_pad {
128169 output.push_str(space);
129170 }
130130- for _ in 0..leg_width {
131131- output.push_str(&body_block);
132132- }
133133- for _ in 0..gap {
134134- output.push_str(space);
135135- }
136136- for _ in 0..leg_width {
137137- output.push_str(&body_block);
171171+ for col in 0..width {
172172+ if legs[col] {
173173+ output.push_str(&body_block);
174174+ } else {
175175+ output.push_str(space);
176176+ }
138177 }
139178 output.push('\n');
140179 }