
Instagram Cartoon
Classic "not how girls work". Just sad incels doing AI or pencil slop.

Classic "not how girls work". Just sad incels doing AI or pencil slop.
Literally just saw this on Reddit
What's wrong with a woman from a CIS country wanting an iPhone? Why would women from NATO/EU countries want a short guy? Cringe here is even an understatement
Edit: quite a few have been asking what CIS countries are. It's the Commonwealth of Independent States - a defined list of former Soviet countries. Russia, Kazakhstan, Belarus and a few others. It has NOTHING to do with "cis vs. trans".
Secondly, quite a few people in the comments have been asking "what does this mean". I'll provide my understanding of this. I can't read the mind of the guy who made it, but I'll take a shot
TLDR based on my understanding...
So it's telling guys that they're better off with women of Western countries who "look hot", because they'll happily take an average guy and not expect too much from him.
Obviously the infographic is super cringe, as there's no way this categorizes women.
The chapter loads, I pull the trigger. Instead of triggering the usual cutscene "I don't know why I did it...", I got the "failed" message flash. The first shot has the trigger set on the enemy, so it's impossible to fail in working gameplay. What's interesting is the time counter stays at zero (because mission failed, right?). After waiting for some time, three characters walk in slow motion. Esc key triggers "pause" but not menu, so only way out is to force quit the game. This is an PC.
I'm tracking how I lose NYMHC every time, started this month. I may share some stats at some point. But for now, just sharing a game bug that I experienced for the first time.
Recently I saw a YouTuber who claimed to beat MP3 NYMHC in seven attempts (hard to believe). One bug he noticed is when the last enemy in the room respawns (happened to him with the last enemy in Chapter 6 pt 2). It's happened to me many times, but in Chapter 4 pt 2 the last sniper through the window near the start respawned twice, meaning I had to take him down three times!
It's actually very satisfying.
Anyway, looking at Lutris...
Hey, spent WAY too much time setting up LXQt on Wayland via Labwc, so I vibe coded a Bash script to make things easier for future deployments. Screenshots of my HP Z240 desktop. my Acer Swift 3 laptop and my Acer Aspire One 722 netbook, all three running Debian 13 with LXQt. Installed initially with X11 in both cases. No other desktop environments installed prior to this setup.
I have keyboard shortcuts for:
Ctrl+Alt+tWinkey+eCtrl+Alt+c because the keyboards hooked up to those machines don't have a "calculator" buttonAlt+F2 - couldn't find a way to launch mainmenu2 in Wayland. Any pointers would be appreciatedWinkey+LPrintScr or Winkey+s - netbook has a dead PrintScr keyAside from that, other configurations
The Netbook may be a silly device, but I plan on using it for pen testing. Since the HDD had already failed on me by the time I got it, I already bought an SSD for it and installed Debian LXQt on it. I ordered a Wifi adapter that should arrive within 2-3 weeks. Luckily I can easily swap the laptop wifi adapter in it. I already upgraded the RAM from 2GB to 8GB. Sadly, I'll be doing pen testing in X11 most likely (unless anyone has experience in pen testing on Wayland). But when I'm not pen testing, the netbook can be logged in with Wayland.
Whether it's an intense fight, Max medicates with pain killers, engages in melee combat or gets blasted by an explosion, Rock⭐ gave us the RGB distortion effect. Ladies and Gentlemen, I replicated that effect in a script that you can run in terminal or add to the context menu of your file manager. I attached some sample output images. I grabbed some images of Max Payne from the first game in combat (including shootdodge and melee).
TLDR
/path/to/MaxPayne3RGBDistortion.sh /path/to/image.jpg (or whichever file extension). No arguments needed. You can run the script plus --help to see available arguments, but it's not designed to be a multi-option scriptNow onto the code. Save it as MaxPayne3RGBDistortion.sh in your ~/Scripts folder (or wherever you stash scripts). Follow the steps to add it to your file manager context menu if you like (it's convenient - adds it to your context menu when you right-click on an image. Copy the code, save it in the text editor as a Bash script, make it executable - chmod +x /path/to/MaxPayne3RGBDistortion.sh and enjoy.
#!/usr/bin/env bash
set -euo pipefail
#############################################
# Max Payne 3 RGB Distortion
# Radial chromatic aberration + effects
# Based on GIMP pipeline tutorial
# ImageMagick implementation
#############################################
VERSION="1.0"
#############################################
# Colors
#############################################
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
RESET="\e[0m"
#############################################
# Dependency installer
#############################################
install_dependencies()
{
echo -e "${YELLOW}Missing dependencies detected.${RESET}"
if command -v apt >/dev/null 2>&1; then
echo "Detected Debian-based system"
sudo apt update
sudo apt install -y \
imagemagick \
bc
elif command -v dnf >/dev/null 2>&1; then
echo "Detected Fedora-based system"
sudo dnf install -y \
ImageMagick \
bc
elif command -v pacman >/dev/null 2>&1; then
echo "Detected Arch-based system"
sudo pacman -Sy --needed --noconfirm \
imagemagick \
bc
else
echo -e "${RED}"
echo "Cannot automatically install dependencies."
echo
echo "Please install:"
echo " ImageMagick 7+"
echo " bc"
echo -e "${RESET}"
exit 1
fi
}
#############################################
# Check dependencies
#############################################
check_dependencies()
{
MISSING=()
command -v magick >/dev/null \
|| MISSING+=("imagemagick")
command -v bc >/dev/null \
|| MISSING+=("bc")
if [ ${#MISSING[@]} -gt 0 ]; then
echo -e "${YELLOW}Missing: ${MISSING[*]}${RESET}"
install_dependencies
fi
}
#############################################
# Usage
#############################################
usage()
{
cat <<EOF
Max Payne 3 RGB Distortion $VERSION
Radial chromatic aberration with optional
zoom blur, bloom, and color ghosting.
Clean center, increasingly distorted edges.
Usage:
$0 [options] <input...>
Input:
<file>... One or more image files
--dir <path> Process all images in directory
Presets:
--subtle Subtle cinematic effect
--maxpayne Max Payne style (default)
--severe Severe disorientation
Zoom blur:
--no-zoom Disable zoom blur
Output:
--output-dir DIR Output directory (default: same as input)
--suffix STR Output suffix (default: _mp3rgb)
--format FMT Output format (default: png)
Other:
--debug Keep intermediate files in /tmp
--help Show usage
Examples:
$0 photo.jpg
$0 photo.jpg --maxpayne
$0 photo.jpg --subtle --no-zoom
$0 --dir ./screenshots --severe
EOF
}
#############################################
# Defaults
#############################################
PRESET="maxpayne"
ZOOM_BLUR="on"
OUTPUT_DIR=""
SUFFIX="_mp3rgb"
FORMAT="png"
DEBUG=0
DIR_INPUT=""
INPUT_FILES=()
#############################################
# Parse arguments
#############################################
while [[ $# -gt 0 ]]
do
case "$1" in
--subtle)
PRESET="subtle"
;;
--maxpayne)
PRESET="maxpayne"
;;
--severe)
PRESET="severe"
;;
--no-zoom)
ZOOM_BLUR="off"
;;
--output-dir)
OUTPUT_DIR="$2"
shift
;;
--suffix)
SUFFIX="$2"
shift
;;
--format)
FORMAT="$2"
shift
;;
--debug)
DEBUG=1
;;
--dir)
DIR_INPUT="$2"
shift
;;
-h|--help)
usage
exit 0
;;
*)
INPUT_FILES+=("$1")
;;
esac
shift
done
#############################################
# Validate input
#############################################
if [ -z "$DIR_INPUT" ] && [ ${#INPUT_FILES[@]} -eq 0 ]; then
usage
exit 1
fi
if [ -n "$DIR_INPUT" ] && [ ! -d "$DIR_INPUT" ]; then
echo "Directory not found: $DIR_INPUT"
exit 1
fi
for f in "${INPUT_FILES[@]}"; do
if [ ! -f "$f" ]; then
echo "File not found: $f"
exit 1
fi
done
#############################################
# Check
#############################################
check_dependencies
#############################################
# Preset values
#############################################
case "$PRESET" in
subtle)
WARP_STRENGTH=0.02
BLUR_FACTOR=0.04
ZOOM_OPACITY=30
GHOST_OPACITY=12
BLOOM_OPACITY=8
;;
maxpayne)
WARP_STRENGTH=0.05
BLUR_FACTOR=0.07
ZOOM_OPACITY=45
GHOST_OPACITY=20
BLOOM_OPACITY=14
;;
severe)
WARP_STRENGTH=0.08
BLUR_FACTOR=0.10
ZOOM_OPACITY=60
GHOST_OPACITY=30
BLOOM_OPACITY=20
;;
esac
#############################################
# Image processing pipeline
#############################################
process_image()
{
local INPUT="$1"
local OUTPUT="$2"
local TMP
TMP=$(mktemp -d)
if [ "$DEBUG" -eq 0 ]; then
trap "rm -rf '$TMP'" RETURN
else
echo " Debug: intermediate files in $TMP"
fi
echo
echo "Processing: $INPUT"
echo "Preset: $PRESET Zoom: $ZOOM_BLUR Warp: $WARP_STRENGTH Blur: $BLUR_FACTOR"
# --- Step 1: Normalize ---
# Auto-orient, sRGB, strip metadata.
# Flatten alpha onto white background.
magick "$INPUT" \
-auto-orient \
-colorspace sRGB \
-strip \
-background white -alpha remove -alpha off \
"$TMP/normalized.png"
# Get dimensions
local DIMS
DIMS=$(magick identify -format "%w %h" "$TMP/normalized.png" 2>&1)
local IMG_W IMG_H
IMG_W=$(echo "$DIMS" | cut -d' ' -f1)
IMG_H=$(echo "$DIMS" | cut -d' ' -f2)
local SHORT_DIM
if [ "$IMG_H" -lt "$IMG_W" ]; then
SHORT_DIM=$IMG_H
else
SHORT_DIM=$IMG_W
fi
echo " ${IMG_W}x${IMG_H} short=${SHORT_DIM}"
# --- Step 2: Decompose to RGB channels ---
magick "$TMP/normalized.png" -channel R -separate "$TMP/ch_r.png"
magick "$TMP/normalized.png" -channel G -separate "$TMP/ch_g.png"
magick "$TMP/normalized.png" -channel B -separate "$TMP/ch_b.png"
# --- Step 3: Warp Red outward (barrel distortion) ---
magick "$TMP/ch_r.png" \
-distort Barrel "${WARP_STRENGTH} 0 0 1" \
-virtual-pixel Edge \
"$TMP/ch_r_warped.png"
# --- Step 4: Warp Blue inward (pincushion distortion) ---
magick "$TMP/ch_b.png" \
-distort BarrelInverse "${WARP_STRENGTH} 0 0 1" \
-virtual-pixel Edge \
"$TMP/ch_b_warped.png"
# --- Step 5: Create radial masks ---
# Black center (clean) to white edges (distorted).
# Offset controls how much of the center stays clean.
# White point controls where full distortion begins.
local MAX_RADIUS
MAX_RADIUS=$(echo "scale=4; sqrt($IMG_W * $IMG_W + $IMG_H * $IMG_H) / 2" | bc -l)
# RGB channel mask: 20% offset, full effect at 75% of short dim
local RGB_WHITE_PCT
RGB_WHITE_PCT=$(echo "scale=2; 75 * $SHORT_DIM / $MAX_RADIUS" | bc -l)
magick -size "${IMG_W}x${IMG_H}" radial-gradient: \
-negate \
-level "20%${RGB_WHITE_PCT}%" \
"$TMP/mask_rgb.png"
# Ghost/zoom mask: 10% offset, full effect at 65% of short dim
local GHOST_WHITE_PCT
GHOST_WHITE_PCT=$(echo "scale=2; 65 * $SHORT_DIM / $MAX_RADIUS" | bc -l)
magick -size "${IMG_W}x${IMG_H}" radial-gradient: \
-negate \
-level "10%${GHOST_WHITE_PCT}%" \
"$TMP/mask_ghost.png"
# --- Step 6: Blend warped channels with originals using masks ---
# Where mask is black (center): original shows through
# Where mask is white (edges): warped version shows through
# Red: warped over original
magick "$TMP/ch_r.png" \
\( "$TMP/ch_r_warped.png" "$TMP/mask_rgb.png" -compose CopyOpacity -composite \) \
-compose Over -composite \
"$TMP/ch_r_final.png"
# Blue: warped over original
magick "$TMP/ch_b.png" \
\( "$TMP/ch_b_warped.png" "$TMP/mask_rgb.png" -compose CopyOpacity -composite \) \
-compose Over -composite \
"$TMP/ch_b_final.png"
# Green: untouched
cp "$TMP/ch_g.png" "$TMP/ch_g_final.png"
# --- Step 7: Recompose RGB ---
magick "$TMP/ch_r_final.png" \
"$TMP/ch_g_final.png" \
"$TMP/ch_b_final.png" \
-combine \
"$TMP/rgb_radial_base.png"
echo " RGB radial base: done"
# --- Step 8: Zoom blur (optional) ---
# Simulate radial zoom blur by computing the
# weighted average of multiple scaled copies.
# Normalizes weights to sum to 1.0 so the
# accumulation never exceeds 1.0 (avoids clamping).
# Starts from the first weighted copy to preserve
# RGB colorspace through Add compositing.
if [ "$ZOOM_BLUR" = "on" ]; then
echo " Creating zoom blur..."
local ZOOM_N=11
# Pre-compute gaussian weights and sum them
local SUM_WEIGHTS="0"
local WEIGHTS=()
local j=0
while [ "$j" -lt "$ZOOM_N" ]; do
local center_j dist_j w_j
center_j=$(echo "scale=6; ($ZOOM_N - 1) / 2" | bc -l)
dist_j=$(echo "scale=6; ($j - $center_j) / (($ZOOM_N - 1) / 4)" | bc -l)
w_j=$(echo "scale=6; d2 = $dist_j * $dist_j; e(-d2 / 2)" | bc -l)
WEIGHTS+=("$w_j")
SUM_WEIGHTS=$(echo "scale=6; $SUM_WEIGHTS + $w_j" | bc -l)
j=$((j + 1))
done
# Normalize weights to sum to 1.0
local NORM_WEIGHTS=()
local nw
for nw in "${WEIGHTS[@]}"; do
NORM_WEIGHTS+=("$(echo "scale=6; $nw / $SUM_WEIGHTS" | bc -l)")
done
# Start accumulation from the first weighted copy (preserves RGB)
local i=0
local t_i scale_i scale_pct_i
t_i=$(echo "scale=6; $i / ($ZOOM_N - 1)" | bc -l)
scale_i=$(echo "scale=6; 1 - $BLUR_FACTOR + 2 * $BLUR_FACTOR * $t_i" | bc -l)
scale_pct_i=$(echo "scale=2; $scale_i * 100" | bc)
magick "$TMP/rgb_radial_base.png" \
-resize "${scale_pct_i}%" \
-gravity center -extent "${IMG_W}x${IMG_H}" \
-evaluate multiply "${NORM_WEIGHTS[$i]}" \
"$TMP/zoom_accum.png"
# Add remaining weighted copies
i=1
while [ "$i" -lt "$ZOOM_N" ]; do
t_i=$(echo "scale=6; $i / ($ZOOM_N - 1)" | bc -l)
scale_i=$(echo "scale=6; 1 - $BLUR_FACTOR + 2 * $BLUR_FACTOR * $t_i" | bc -l)
scale_pct_i=$(echo "scale=2; $scale_i * 100" | bc)
magick "$TMP/rgb_radial_base.png" \
-resize "${scale_pct_i}%" \
-gravity center -extent "${IMG_W}x${IMG_H}" \
-evaluate multiply "${NORM_WEIGHTS[$i]}" \
"$TMP/zoom_weighted.png"
magick "$TMP/zoom_accum.png" "$TMP/zoom_weighted.png" \
-compose Add -composite \
"$TMP/zoom_accum.png"
i=$((i + 1))
done
# The accum IS the zoom-blurred image (normalized weights sum to 1.0)
cp "$TMP/zoom_accum.png" "$TMP/zoom_blurred.png"
# Apply ghost mask and final opacity
magick "$TMP/zoom_blurred.png" \
"$TMP/mask_ghost.png" -compose CopyOpacity -composite \
-channel A -evaluate multiply "$(echo "scale=4; $ZOOM_OPACITY / 100" | bc -l)" \
"$TMP/zoom_final.png"
echo " Zoom blur: done"
fi
# --- Step 9: Bloom ---
# Gaussian blur + Screen blend at reduced opacity.
# Creates the bright overexposed glow at the edges.
echo " Creating bloom..."
local BLOOM_BLUR
BLOOM_BLUR=$(echo "scale=2; $SHORT_DIM * 0.006" | bc)
# Gaussian blur of the base
magick "$TMP/rgb_radial_base.png" \
-blur 0x${BLOOM_BLUR} \
"$TMP/bloom_blurred.png"
# Screen blend: 1 - (1 - base) * (1 - bloom)
magick "$TMP/rgb_radial_base.png" "$TMP/bloom_blurred.png" \
-compose Screen -composite \
"$TMP/bloom_screen.png"
# Blend at bloom opacity: base * (1-O) + screen * O
local BLOOM_INVERSE
BLOOM_INVERSE=$((100 - BLOOM_OPACITY))
magick "$TMP/rgb_radial_base.png" "$TMP/bloom_screen.png" \
-compose Blend -define compose:args="${BLOOM_OPACITY},${BLOOM_INVERSE}" -composite \
"$TMP/bloom_final.png"
echo " Bloom: done"
# --- Step 10: Side ghost ---
# Slightly shifted duplicate with blur and radial mask.
# Creates the uneven lateral color separation.
echo " Creating side ghost..."
local GHOST_X GHOST_Y GHOST_BLUR
GHOST_X=$(echo "scale=0; $IMG_W * 0.002" | bc)
GHOST_Y=$(echo "scale=0; $IMG_H * 0.0008" | bc)
GHOST_BLUR=$(echo "scale=2; $SHORT_DIM * 0.0005" | bc)
# Shift the image and blur
magick "$TMP/rgb_radial_base.png" \
-background black \
-page "+${GHOST_X}+${GHOST_Y}" \
-flatten \
-gravity center -crop "${IMG_W}x${IMG_H}+0+0" +repage \
-blur 0x${GHOST_BLUR} \
"$TMP/ghost_shifted.png"
# Apply ghost mask and opacity
magick "$TMP/ghost_shifted.png" \
"$TMP/mask_ghost.png" -compose CopyOpacity -composite \
-channel A -evaluate multiply "$(echo "scale=4; $GHOST_OPACITY / 100" | bc -l)" \
"$TMP/ghost_final.png"
echo " Side ghost: done"
# --- Step 11: Final composite ---
# Layer order (bottom to top):
# RGB RADIAL BASE
# SIDE GHOST (Normal, masked, 18%)
# ZOOM BLUR (Normal, masked, 25%)
# BLOOM (Screen, 12%)
echo " Compositing final..."
# Start with base
cp "$TMP/rgb_radial_base.png" "$TMP/final.png"
# Layer 1: Side ghost
magick "$TMP/final.png" "$TMP/ghost_final.png" \
-compose Over -composite \
"$TMP/final.png"
# Layer 2: Zoom blur
if [ "$ZOOM_BLUR" = "on" ]; then
magick "$TMP/final.png" "$TMP/zoom_final.png" \
-compose Over -composite \
"$TMP/final.png"
fi
# Layer 3: Bloom (already blended at correct opacity)
cp "$TMP/bloom_final.png" "$TMP/final_bloom.png"
# Actually, bloom needs to be composited over the current composite.
# Re-do bloom using the current composite as base for screen blend.
magick "$TMP/final.png" "$TMP/bloom_blurred.png" \
-compose Screen -composite \
"$TMP/bloom_screen_final.png"
magick "$TMP/final.png" "$TMP/bloom_screen_final.png" \
-compose Blend -define compose:args="${BLOOM_OPACITY},${BLOOM_INVERSE}" -composite \
"$TMP/final.png"
# --- Output ---
magick "$TMP/final.png" "$OUTPUT"
echo -e "${GREEN}Created:${RESET} $OUTPUT"
}
#############################################
# Build file list
#############################################
FILES=()
if [ -n "$DIR_INPUT" ]; then
for f in "$DIR_INPUT"/*.{jpg,jpeg,png,bmp,tiff,tif,webp}; do
[ -f "$f" ] || continue
FILES+=("$f")
done
else
FILES=("${INPUT_FILES[@]}")
fi
if [ ${#FILES[@]} -eq 0 ]; then
echo "No images found to process."
exit 1
fi
#############################################
# Output directory
#############################################
if [ -n "$OUTPUT_DIR" ]; then
mkdir -p "$OUTPUT_DIR"
fi
#############################################
# Process
#############################################
COUNT=0
TOTAL=${#FILES[@]}
echo
echo "Max Payne 3 RGB Distortion $VERSION"
echo "Preset: $PRESET Zoom: $ZOOM_BLUR Warp: $WARP_STRENGTH Blur: $BLUR_FACTOR"
echo "Processing $TOTAL image(s)..."
for INPUT_FILE in "${FILES[@]}"; do
COUNT=$((COUNT + 1))
# Determine output path
DIR="$(dirname "$INPUT_FILE")"
BASE="$(basename "$INPUT_FILE")"
NAME="${BASE%.*}"
if [ -n "$OUTPUT_DIR" ]; then
OUT_DIR="$OUTPUT_DIR"
else
OUT_DIR="$DIR"
fi
OUTPUT_FILE="$OUT_DIR/${NAME}${SUFFIX}.${FORMAT}"
echo
echo "[$COUNT/$TOTAL]"
if ! process_image "$INPUT_FILE" "$OUTPUT_FILE"; then
echo -e "${RED}Failed:${RESET} $INPUT_FILE"
continue
fi
done
#############################################
# Notification
#############################################
if command -v notify-send >/dev/null 2>&1; then
notify-send \
"Max Payne 3 RGB Distortion" \
"Processed $COUNT image(s)" \
2>/dev/null || true
fi
echo
echo -e "${GREEN}Done:${RESET} $COUNT/$TOTAL images processed"
There you have it! Now you can enjoy flipping your images into a Max Payne 3 style RGB distortion effect!
DISCLAIMER: This is an unofficial fan-made tool inspired by the graphic novel presentation of Max Payne 1 and Max Payne 2. Max Payne is property of Remedy Entertainment and Rockstar Games. This project is not affiliated with or endorsed by them (although endorsement is welcome).
SECOND DISCLAIMER: I'm not doing self-promotion, since I'm not selling anything. Use the script if you want to, or don't, doesn't affect me either way. This script is not monetized.
I whipped up a Bash script to convert an image into the style of Max Payne 1 & 2 graphic novels. It may or may not be in its final form (I'm really happy with it for now). I'm sharing a few example outputs...first image - the famous image of Sam Lake dressed as Max Payne. Second image is randomly pulled from a web image search (I claim no ownership over either image, by the way). The second image looks more similar to a more typical scene in a Max Payne 1 graphic novel, which is why it looks closer to what you'd expect to see. Sam Lake is in a bright room, so the effect may not be as obvious. Script works on images of any resolution (including 4K), though processing time can be longer. Third image uses the Max Payne 2 style rendering for graphic novel, also pulled from web image search, I claim no ownership.
Only dependency is ImageMagick. Since I run Linux on metal, I've only tested it on Linux (Windows users can grab WSL, or even setup a VM, or better yet dedicate a machine to Linux on metal). I've ported scripts for ImageMagick to Windows in the past and it's a royal pain (more effort to test & debug, get some weird quirks too) anyone is welcome to do it if that's your thing. I know MacOS has Bash in terminal, but I'm not a Mac user so I'm not gonna troubleshoot that. Pretty sure it'd be minimal effort to make it work on a Mac.
Anyway, I'll share the code. Should auto-install missing dependencies on Debian/Fedora/Arch based distros. Just make it executable (in right-click->properties or chmod +x /path/to/MaxPayneGraphicNovel.sh).
To run it, open Bash terminal and run /path/to/MaxPayneGraphicNovel.sh /path/to/file.jpg --mp1
You can switch --mp1 to --mp2 or --noir (Noir is basically MP1 filters but output is in Black and White). Should work with any image file (JPG, PNG, WEBP).
NOT HANDLED BY THE SCRIPT: for your text boxes, well you can design speech bubbles with background colour #ABB5B6 and narration boxes background colour #A8D7A8 for Max Payne 1 style and #A5AFAE for Max Payne 2 style (black outline). For the text, use all caps with the Graphite font (bold, semi-condensed). Here's the link to the main font but you can look up the other variants (bold, bold-narrow, bold-wide, light, light-narrow), assuming you'll be using bold-narrow in all caps the whole time. Note that the font that I linked is FREE FOR PERSONAL USE. I have no idea what the IP rights are on replicating filters used by Remedy for Max Payne 1 & 2 graphic novels, so it's more of a personal use kind of thing. TLDR good for fan art, NOT FOR CREATING your own game called Pax Mayne and claiming it to be entirely your IP.
#!/usr/bin/env bash
set -euo pipefail
#############################################
# Max Payne Graphic Novel Generator
# Painted oil-brush style — v2.1
#############################################
VERSION="2.1"
#############################################
# Colors
#############################################
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
RESET="\e[0m"
#############################################
# Dependency installer
#############################################
install_dependencies()
{
echo -e "${YELLOW}Missing dependencies detected.${RESET}"
if command -v apt >/dev/null 2>&1; then
echo "Detected Debian-based system"
sudo apt update
sudo apt install -y \
imagemagick \
libnotify-bin
elif command -v dnf >/dev/null 2>&1; then
echo "Detected Fedora-based system"
sudo dnf install -y \
ImageMagick \
libnotify
elif command -v pacman >/dev/null 2>&1; then
echo "Detected Arch-based system"
sudo pacman -Sy --needed --noconfirm \
imagemagick \
libnotify
else
echo -e "${RED}"
echo "Cannot automatically install dependencies."
echo "Unsupported Linux distribution."
echo
echo "Please install:"
echo " ImageMagick"
echo " libnotify"
echo -e "${RESET}"
exit 1
fi
}
#############################################
# Check dependencies
#############################################
check_dependencies()
{
MISSING=()
command -v magick >/dev/null \
|| MISSING+=("imagemagick")
command -v notify-send >/dev/null \
|| MISSING+=("libnotify")
if [ ${#MISSING[@]} -gt 0 ]; then
install_dependencies
fi
}
#############################################
# Check
#############################################
check_dependencies
#############################################
# Defaults
#############################################
PROFILE="mp1"
#############################################
# Usage
#############################################
usage()
{
cat <<EOF
Max Payne Graphic Novel Filter $VERSION
Usage:
$0 image [options]
Profiles:
--mp1 Original Max Payne style (warm, gritty)
--mp2 Max Payne 2 graphic novel (sharp, high-contrast, inked)
--noir Black and white noir
Examples:
$0 photo.jpg --mp1
EOF
}
#############################################
# Parse arguments
#############################################
INPUT=""
while [[ $# -gt 0 ]]
do
case "$1" in
--mp1)
PROFILE="mp1"
;;
--mp2)
PROFILE="mp2"
;;
--noir)
PROFILE="noir"
;;
-h|--help)
usage
exit
;;
*)
INPUT="$1"
;;
esac
shift
done
if [[ -z "$INPUT" ]]
then
usage
exit 1
fi
if [[ ! -f "$INPUT" ]]
then
echo "File not found:"
echo "$INPUT"
exit 1
fi
#############################################
# Profiles
#############################################
case "$PROFILE" in
mp1)
PAINT=3
BILATERAL_SIGMA=3
SHADOW_BLACK=5
SHADOW_WHITE=100
SATURATION=55
WARM="#70533a"
COLORIZE=10
GRAIN=0.18
NOISE_ATTENUATE=0.6
;;
mp2)
PAINT=2
SHADOW_BLACK=14
SHADOW_WHITE=97
SHARPEN_RADIUS=1
SHARPEN_AMOUNT=0.5
LOCAL_CONTRAST_RADIUS=20
LOCAL_CONTRAST_AMOUNT=0.15
SATURATION=55
WARM="#4a5868"
COLORIZE=3
SIGMOIDAL_AMT=4
SIGMOIDAL_MID=45
GRAIN=0.22
NOISE_ATTENUATE=0.7
VIGNETTE_SIZE=55
;;
noir)
PAINT=5
BILATERAL_SIGMA=5
SHADOW_BLACK=10
SHADOW_WHITE=95
SATURATION=0
WARM=""
COLORIZE=0
GRAIN=0.25
NOISE_ATTENUATE=0.7
;;
esac
#############################################
# Output filename
#############################################
DIR="$(dirname "$INPUT")"
FILE="$(basename "$INPUT")"
NAME="${FILE%.*}"
OUTPUT="$DIR/${NAME}_mpgn_${PROFILE}.png"
#############################################
# Temporary workspace
#############################################
TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT
#############################################
# Pipeline
#############################################
echo "Processing:"
echo "$INPUT"
# --- Step 1: Normalize ---
magick "$INPUT" \
-auto-orient \
-colorspace sRGB \
-strip \
"$TMP/01.png"
# --- Scale factors for resolution ---
# Effects are tuned for 1080p. Scale parameters
# with a power curve so larger images get disproportionately
# stronger effects to maintain perceived visual impact.
DIMS=$(magick identify -format "%w %h" "$TMP/01.png" 2>&1)
IMG_W=$(echo "$DIMS" | cut -d' ' -f1)
IMG_H=$(echo "$DIMS" | cut -d' ' -f2)
if [ "$IMG_W" -ge "$IMG_H" ]; then
LONGEST=$IMG_W
else
LONGEST=$IMG_H
fi
SCALE=$(awk "BEGIN { printf \"%.2f\", ($LONGEST / 1920) ^ 2.0 }")
# Linear scale for intensity effects (color, shadow) —
# these don't need the aggressive power curve.
LIN_SCALE=$(awk "BEGIN { printf \"%.2f\", $LONGEST / 1920 }")
PAINT_S=$(awk "BEGIN { v = $PAINT * $SCALE; printf \"%.0f\", (v < 2) ? 2 : v }")
COLORIZE_S=$(awk "BEGIN { v = $COLORIZE * $LIN_SCALE; printf \"%.0f\", (v < 1) ? 1 : v }")
SHADOW_S=$(awk "BEGIN { v = $SHADOW_BLACK * $LIN_SCALE; printf \"%.0f\", (v > 25) ? 25 : v }")
case "$PROFILE" in
mp1|noir)
# --- MP1 / Noir Pipeline ---
# Painted oil-brush look — warm, gritty, atmospheric.
BIL_R_S=$(awk "BEGIN { v = 4 * $SCALE; printf \"%.0f\", (v < 3) ? 3 : v }")
BIL_S_S=$(awk "BEGIN { v = $BILATERAL_SIGMA * $SCALE; printf \"%.0f\", (v < 2) ? 2 : v }")
echo "Resolution: ${IMG_W}x${IMG_H} scale: ${SCALE}x paint: ${PAINT_S} blur: ${BIL_R_S}x${BIL_S_S} colorize: ${COLORIZE_S}% shadow: ${SHADOW_S}%"
# Step 2: Oil paint brush effect
magick "$TMP/01.png" \
-paint "$PAINT_S" \
"$TMP/02.png"
# Step 3: Bilateral blur
magick "$TMP/02.png" \
-bilateral-blur ${BIL_R_S}x${BIL_S_S} \
"$TMP/03.png"
# Step 4: Color grading
magick "$TMP/03.png" \
-modulate 100,$SATURATION,100 \
${WARM:+-fill "$WARM" -colorize "${COLORIZE_S}"%} \
"$TMP/04.png"
# Step 5: Shadow deepening
magick "$TMP/04.png" \
-level "${SHADOW_S}%,${SHADOW_WHITE}%" \
"$TMP/05.png"
# Step 6: Film grain
magick "$TMP/05.png" \
-seed 42 \
-attenuate "$NOISE_ATTENUATE" \
+noise Gaussian \
"$TMP/06.png"
# Step 7: Output
magick "$TMP/06.png" \
"$OUTPUT"
;;
mp2)
# --- Max Payne 2 Pipeline ---
# High-contrast graphic novel — sharp edges, deep blacks,
# printed ink texture. Less painterly than MP1, more photographic.
SHARPEN_S=$(awk "BEGIN { v = $SHARPEN_RADIUS * $LIN_SCALE; printf \"%.1f\", (v < 0.5) ? 0.5 : v }")
SHARPEN_A=$(awk "BEGIN { printf \"%.2f\", $SHARPEN_AMOUNT * $LIN_SCALE }")
LOCAL_R=$(awk "BEGIN { v = $LOCAL_CONTRAST_RADIUS * $LIN_SCALE; printf \"%.0f\", (v < 10) ? 10 : v }")
LOCAL_A=$(awk "BEGIN { printf \"%.2f\", $LOCAL_CONTRAST_AMOUNT * $LIN_SCALE }")
VIG_S=$(awk "BEGIN { v = $VIGNETTE_SIZE * $LIN_SCALE; printf \"%.0f\", (v < 50) ? 50 : v }")
echo "Resolution: ${IMG_W}x${IMG_H} scale: ${SCALE}x paint: ${PAINT_S} sharpen: ${SHARPEN_S}x${SHARPEN_A} local: ${LOCAL_R}x${LOCAL_A} colorize: ${COLORIZE_S}% vig: ${VIG_S}"
# Step 2: Subtle oil paint
# Just enough to break up photographic fine detail without
# making it look "painted" — MP2 is graphic, not painterly.
magick "$TMP/01.png" \
-paint "$PAINT_S" \
"$TMP/02.png"
# Step 3: Sharpen edges
# MP2 has crisp, well-defined edges. Unsharp mask brings
# back and enhances detail lost by the light paint step.
magick "$TMP/02.png" \
-unsharp "${SHARPEN_S}x${SHARPEN_A}+0.05+0" \
"$TMP/03.png"
# Step 4: Local contrast boost
# Large-radius unsharp mask increases midtone contrast
# without affecting fine detail — makes skin and surfaces
# look dramatically lit, which is core to the MP2 look.
magick "$TMP/03.png" \
-unsharp "${LOCAL_R}x${LOCAL_A}+0+0" \
"$TMP/04.png"
# Step 5: Color grading
# Muted, slightly cool/neutral tones. MP2 has less warm
# cast than MP1 — more steel blue-grey than amber.
magick "$TMP/04.png" \
-modulate 100,$SATURATION,100 \
${WARM:+-fill "$WARM" -colorize "${COLORIZE_S}"%} \
"$TMP/05.png"
# Step 6: S-curve contrast
# Crush blacks first, then apply sigmoidal contrast for
# the dramatic shadow/highlight pop of the MP2 graphic novel.
magick "$TMP/05.png" \
-level "${SHADOW_S}%,${SHADOW_WHITE}%" \
-sigmoidal-contrast "${SIGMOIDAL_AMT}x${SIGMOIDAL_MID}%" \
"$TMP/06.png"
# Step 7: Heavy film grain
# MP2's graphic novel panels have a visible printed texture.
# Much heavier grain than MP1 for that comic-book halftone feel.
magick "$TMP/06.png" \
-seed 42 \
-attenuate "$NOISE_ATTENUATE" \
+noise Gaussian \
"$TMP/07.png"
# Step 8: Vignette
# Manual radial gradient vignette — darkens edges to draw
# focus center and approximate MP2's close-up depth feel.
magick "$TMP/07.png" \
\( +clone -fill black -colorize 100% \
-fill white -draw "roundrectangle 15,15,%[fx:w-16],%[fx:h-16] 30,30" \
-blur 0x"${VIG_S}" \
\) \
-compose multiply -composite \
"$TMP/08.png"
# Step 9: Output
magick "$TMP/08.png" \
"$OUTPUT"
;;
esac
#############################################
# Notification
#############################################
notify-send \
"Max Payne Graphic Novel" \
"Created $(basename "$OUTPUT")" \
2>/dev/null || true
echo
echo -e "${GREEN}Finished:${RESET}"
echo "$OUTPUT"
Note for Max Payne 3, there's two ways to go. There's the filters/effects for cover art, and there's the actual comic books which use a Marvel Hero style. That's going to be a separate script of its own.
Weapon statistics hanging in the air, glimpsed out of the corner of my eye. Endless repetition of the act of shooting, time slowing down to show off my moves. The paranoid feel of someone controlling my every step...I was in a computer game. Funny as Hell, it was the most horrible thing I could think of.
This is a step-by-step recovery process for fixing a broken NVIDIA driver setup on Fedora caused by mixed driver branches, COPR interference, version locks, and DNF exclusions. It's important for anyone with an EOL Nvidia GPU (Quadro M 2k series on laptops, and any GTX GPU on desktop). For older GPU's (GT series), stick with Nouveau. Newer GPU's (RTX series), you can still use the latest driver.
Reboot the system and open the GRUB menu:
Verify once booted:
uname -r
If installed via COPR, disable it:
sudo dnf copr disable t0xic0der/nvidia-auto-installer-for-fedora
If that does not work, manually remove the repo file:
sudo rm -f /etc/yum.repos.d/*t0xic0der*
Then refresh DNF:
sudo dnf clean all
sudo dnf makecache
Completely remove installed NVIDIA drivers:
sudo dnf remove '*nvidia*'
Then clean leftover dependencies:
sudo dnf autoremove
Open DNF configuration:
sudo nano /etc/dnf/dnf.conf
Look for and remove this line if present:
exclude=akmod-nvidia* kmod-nvidia* xorg-x11-drv-nvidia*
This line prevents NVIDIA packages from installing and caused dependency failures.
Save and exit.
Check current locks:
sudo dnf versionlock list
Remove NVIDIA-related locks:
sudo dnf versionlock delete 'akmod-nvidia*'
sudo dnf versionlock delete 'kmod-nvidia*'
sudo dnf versionlock delete 'nvidia-*'
sudo dnf versionlock delete 'xorg-x11-drv-nvidia*'
Or fully reset:
sudo dnf versionlock clear
Clean mixed driver remnants (important if multiple branches were installed):
sudo dnf remove '*cuda*' '*libnvidia*' '*390xx*'
sudo dnf autoremove
sudo dracut --force --regenerate-all
Note: If you see /boot/efi errors, check your EFI mount or /etc/fstab.
Reboot and confirm fallback graphics are active:
lsmod | grep nvidia
At this stage, it should be empty or using Intel/Nouveau.
sudo dnf install akmod-nvidia-580xx xorg-x11-drv-nvidia-580xx
Do NOT mix driver branches.
Install versionlock plugin:
sudo dnf install python3-dnf-plugin-versionlock
Lock working packages:
sudo dnf versionlock add akmod-nvidia\*
sudo dnf versionlock add xorg-x11-drv-nvidia\*
sudo dnf versionlock add nvidia-modprobe\*
Open DNF configuration:
sudo nano /etc/dnf/dnf.conf
Make sure your dnf.conf file looks like this:
[main]
gpgcheck=True
installonly_limit=3
clean_requirements_on_remove=True
best=False
skip_if_unavailable=True
exclude=akmod-nvidia* kmod-nvidia* xorg-x11-drv-nvidia*
This will allow DNF to work, and not update certain key packages to a newer driver version, while allowing other secondary packages to update (which is fine).
I'm now successfully on Fedora 44 with Nvidia driver 580.xx. Hopefully others will find this guide useful.
We brought my father to the Philippines and he really liked it, while staying single/widowed! - I really don’t like this stereotypical photo, but it came with the article:
The Philippines just claimed the top spot.
In a ranking that may surprise many people, the Philippines has been named the best country in the world for retirement in the Retirement Abroad Index 2026.
The ranking, compiled by UK-based insurance provider Expatriate Group, gave the Philippines a score of 78 out of 100. The country stood out for its affordable cost of living and one of the most accessible retirement visa programs available to foreigners.
According to the report, a retired couple can live comfortably on about £750 to £1,000 per month, especially outside Metro Manila, where costs tend to be lower in smaller cities and coastal communities.
The study also highlighted the Special Resident Retiree’s Visa, describing it as one of the easiest retirement pathways among the countries evaluated.
Not everything was perfect. Researchers pointed out that healthcare quality can vary significantly between major urban centers and rural areas, making comprehensive health insurance an important consideration for retirees planning to settle in the country.
The Department of Tourism welcomed the recognition, while Philippine Retirement Authority General Manager Bob Zozobrado said the ranking reflects the country's growing appeal to retirees looking for affordability, comfort, and a better quality of life.
The Philippines finished ahead of other popular retirement destinations including Thailand, Colombia, Portugal, South Africa, and Sri Lanka. The index measured countries based on healthcare, cost of living, visa accessibility, insurance requirements, and how well expatriates integrate into local communities.
For a country often discussed for its challenges, this ranking highlights a different side of the story. Sometimes the places people dream of leaving are the same places others dream of spending the rest of their lives.
Top Destinations
Philippines (78/100): Top-ranked due to affordable living, accessible visas requiring a ~£11,000 deposit, and strong expat integration.
Thailand (77/100): Second place, excelling in healthcare (joint highest score with Spain/France) and insurance requirements (20/20), though scoring lower on integration.
Colombia (73/100): Noted for straightforward visa routes and low living costs.
Portugal (71/100): Highest-ranked European nation, favored for its D7 visa, mild climate, and low crime.
South Africa (69/100): Tied for fifth.
Sri Lanka (69/100): Tied for fifth.
UAE/Dubai (68/100): Tied for seventh.
Malaysia (68/100): Tied for seventh.
Mexico (66/100)
Indonesia (64/100): Tied for tenth.
Spain (64/100): Tied for tenth, held back by high living costs despite excellent healthcare.
Panama (63/100)
Found the France Refugee passport rather interesting! Met a handful of Sudanese guys who've settled in France to be travelling with it.
Now am travelling home. After shy of three months in East Africa for freedom, chaos and bad manners (and most importantly dating), the ending has a very incredible plot twist.
Coming back to Uganda from Kenya, I dated a couple ladies knowing I had little time before the end of my trip. Both struggled to express their emotions in the moment. One of them was otherwise fine and great beyond that (even paid her own transport!). But the other one turned out to be a hot mess. Emotionally unstable, lacks self-control with alcohol, and even ran off with the cash in my phone case (yet she left her bags and belongings in my room at the guesthouse). Given how obnoxious that one was, I hit up the dating app and found another lady.
Then everything changed. Although I had less than a week with her, she's just perfect for me (so far). It's going to continue as a long distance relationship until the next trip. She's not only respectful, but is upfront about her feelings (also non-judgemental and non-confrontational), practicing liturgical Christian, childfree (always a bonus), emotionally mature, matches on love languages, is beautiful and has a entrepreneurial mindset. Best thing is, she and I listen to each other. She even helped me through a hot mess that I had gotten myself into (nothing to do with women though).
Finding respectful women in Uganda is not hard. Most of them are respectful (let's say at least eight out of ten of them are respectful). Many of them expect you to pay for transport and food when you go out together (and guesthouse). Some will voluntarily pay for some things (not an exact 50/50, but more of a turn based thing where they may pay for things up to half the time). Finding a woman who can be upfront about her feelings in a kind way? They're there, though fewer (meaning you may need to date a bunch before you pick one).
I deleted my dating app account. I'll continue the long distance relationship. Next trip I'm going exclusive.
I LOVE UGANDA! Happy Ugandan Martyrs Day!
🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬🇺🇬
TLDR, Kenya is
You can find a genuine Kenyan lady, though they are rare. Just like opportunistic Ugandan ladies are there, but also rare. The numbers aren't even close. Arriving in Kampala on a Kenyan bus, the Kenyan guys were welcoming me to Uganda, reminding me that I reached the destination for the ladies (even the Kenyan men know). Even the street food has a better selection in Uganda.
Am so glad I'm finishing my trip in Uganda. It's so easy to have ladies lined up in Kampala.
I could go back to Kenya for the right woman, but other than that, maybe just for tourism. Uganda is a must on every East African trip. Heck, even with a Kenyan or Rwandan lady, I'd propose we chill in Uganda and enjoy life.
Two months into my East African trip. TLDR, Uganda HOT, Rwanda NOT. Why'd I go to Rwanda? Got a bunch of friends in Kigali, so why not lol.
Dating app works incredibly well in East Africa as a PPB. They're a wasteland for local guys, but as a PPB, we have options!
Rwandans can be nice people. I have definitely dealt with some drama (not dating related) here, but was otherwise great. Credit cards are widely accepted in Rwanda (Uganda is almost exclusively cash or mobile money only). Crypto is easy to swap in Uganda but basically illegal in Rwanda.
Back to topic regarding the ladies. I'll cover my overall impression of the different tribes. Note that I lack experience with the Lugbara or Nileo-Hamite ladies....Lugbara are an isolated tribe, might as well be the "Basques of East Africa" and the Nilo-Hamites are primarily from the Eastern region.
TLDR, if you get a dime who's Nyankole or Langi, you've done well. Other tribes have dimes as well. There's no tribe to 100% avoid, as everything will depend more on the person, and the selection per tribe will heavily depend on the region where you stay. Uganda is cheap (lunch that can feed one or two people for just over $3 USD, guest houses for $17-35 USD per night), you could go to a cheaper destination, but then you're chancing everything else. Skip Rwanda unless you're going for a specific lady (or visiting for other reasons). Ugandans of all tribes reside in Kampala, with the Baganda obviously being the majority. Don't be afraid to travel to remote places in Uganda.
Hope this helps!!