From 8c38d38a3a9c9c3a8e9e2a5533bb568976ee0b26 Mon Sep 17 00:00:00 2001 From: David Keane Date: Mon, 25 May 2026 10:36:51 +0100 Subject: [PATCH] feat: add winking expression (v0.1.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Buddy now has a fourth mood tone — wink — with one eye closed, an asymmetric smirk, and rosier cheeks. Renders as a small variant inside the existing inline-SVG sprite (still zero image files, no new assets). When overall mood is >= 75, there's a 30% chance on each page render that the wink replaces the standard happy face — gives the pet a touch of unpredictable personality. Why this commit exists: v0.1.0 had three tones (happy / neutral / sad). Adding wink is the smallest possible demo that the SVG expression engine is properly extensible — every future mood, state, accessory or species can land via the same pattern. ~20 lines of PHP, ~2 lines of CSS, no bundle weight, no dependencies. CHANGES - inc/sprite.php: wink added to allowed-tones list. Left eye renders as a closed-eye arc instead of the open circle. Mouth shifts to an asymmetric smirk. Cheek opacity 0.55 → 0.75 for extra cheekiness. - inc/state.php: buddy_mood_label() returns wink ~30% of the time when mood >= 75. - assets/css/buddy.css: new .buddy-widget__mood--wink and .buddy-main__mood--wink rules — warm amber pill. - About-page version-history leads with v0.1.1; v0.1.0 demoted. VERSION - buddy.php header 0.1.0 → 0.1.1 - BUDDY_VERSION constant 0.1.0 → 0.1.1 Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ assets/css/buddy.css | 2 ++ buddy.php | 4 ++-- inc/about.php | 6 +++++- inc/sprite.php | 29 +++++++++++++++++++---------- inc/state.php | 13 +++++++++++-- 6 files changed, 74 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90cc6e8..78b7a4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,41 @@ Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/) — versi --- +## [0.1.1] — 2026-05-25 + +### Added — Wink expression 😉 +Buddy now has a fourth mood tone: **`wink`** — one eye closed, an +asymmetric smirk, and rosier cheeks. Rendered as a small variant +inside the existing inline-SVG sprite (still zero image files, no +new assets). When Buddy's overall mood is ≥ 75, there's a ~30% +chance on each page render that the wink replaces the standard +happy face. Refresh a few times when Buddy is content and you'll +catch it. + +Why this commit exists: the v0.1.0 sprite had three tones +(happy / neutral / sad). Adding `wink` was the smallest possible +demo that the SVG expression engine is properly extensible — every +future mood/state/species can be added the same way. ~20 lines of +PHP, ~2 lines of CSS, no bundle weight, no dependencies. + +### Changed +- **`inc/sprite.php`**: added `wink` to the allowed-tones list. + Left eye renders as a closed-eye curve (a small downward arc) + instead of the open circle. Right eye stays normal. Mouth shifts + to an asymmetric smirk curve. Cheek opacity bumped from 0.55 to + 0.75 for extra cheekiness. +- **`inc/state.php`**: `buddy_mood_label()` now has a 30% chance of + returning the wink tone when the overall mood score is ≥ 75. +- **`assets/css/buddy.css`**: new `.buddy-widget__mood--wink` and + `.buddy-main__mood--wink` rules — warm amber pill matching the + cheeky vibe. +- **About page** version-history card leads with v0.1.1; v0.1.0 + demoted to the previous entry. +- **Plugin version bumped**: header + `BUDDY_VERSION` constant + 0.1.0 → 0.1.1. + +--- + ## [0.1.0] — 2026-05-25 **Buddy is born.** First release of a new standalone WordPress plugin extracted-and-rebuilt from the tamagotchi feature that once lived inside A-WP-Notes v1.1.5 (now gracefully retired). Buddy stands on its own as a focused, charming companion plugin for the WordPress dashboard. diff --git a/assets/css/buddy.css b/assets/css/buddy.css index 4e4c685..f930340 100644 --- a/assets/css/buddy.css +++ b/assets/css/buddy.css @@ -57,6 +57,7 @@ vertical-align: middle; } .buddy-widget__mood--happy { background:#e8f5ea; color:#1b6f2d; } +.buddy-widget__mood--wink { background:#fef3c7; color:#92400e; } .buddy-widget__mood--neutral { background:#f0f0f1; color:#3c434a; } .buddy-widget__mood--sad { background:#fcf0f1; color:#8a2424; } @@ -138,6 +139,7 @@ vertical-align: middle; } .buddy-main__mood--happy { background:#e8f5ea; color:#1b6f2d; } +.buddy-main__mood--wink { background:#fef3c7; color:#92400e; } .buddy-main__mood--neutral { background:#f0f0f1; color:#3c434a; } .buddy-main__mood--sad { background:#fcf0f1; color:#8a2424; } diff --git a/buddy.php b/buddy.php index 6b004d0..89bfcb7 100644 --- a/buddy.php +++ b/buddy.php @@ -5,7 +5,7 @@ * Plugin Name: Buddy * Plugin URI: https://icanhelp.ie/buddy * Description: Adopt a small companion that lives in your WordPress dashboard. Its mood reflects your site's health — published posts feed it, outdated plugins make it sick, clearing spam makes it happy. Gamifies WordPress maintenance with a bit of charm. - * Version: 0.1.0 + * Version: 0.1.1 * Requires at least: 5.0 * Requires PHP: 7.4 * Author: David Keane @@ -20,7 +20,7 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } // Plugin coordinates. -if ( ! defined( 'BUDDY_VERSION' ) ) { define( 'BUDDY_VERSION', '0.1.0' ); } +if ( ! defined( 'BUDDY_VERSION' ) ) { define( 'BUDDY_VERSION', '0.1.1' ); } if ( ! defined( 'BUDDY_FILE' ) ) { define( 'BUDDY_FILE', __FILE__ ); } if ( ! defined( 'BUDDY_PATH' ) ) { define( 'BUDDY_PATH', plugin_dir_path( __FILE__ ) ); } if ( ! defined( 'BUDDY_URL' ) ) { define( 'BUDDY_URL', plugin_dir_url( __FILE__ ) ); } diff --git a/inc/about.php b/inc/about.php index 8d00d08..0d71f22 100644 --- a/inc/about.php +++ b/inc/about.php @@ -98,7 +98,11 @@ function buddy_render_about_page() {

diff --git a/inc/sprite.php b/inc/sprite.php index e8ddfe5..f8acbf4 100644 --- a/inc/sprite.php +++ b/inc/sprite.php @@ -23,14 +23,15 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } */ function buddy_render_sprite( $species = 'default', $tone = 'happy', $size = 'md' ) { $species = sanitize_key( $species ); - $tone = in_array( $tone, array( 'happy', 'neutral', 'sad' ), true ) ? $tone : 'happy'; + $tone = in_array( $tone, array( 'happy', 'neutral', 'sad', 'wink' ), true ) ? $tone : 'happy'; $size = in_array( $size, array( 'sm', 'md', 'lg' ), true ) ? $size : 'md'; // Mouth path varies by tone. $mouth = array( - 'happy' => 'M 42 60 Q 50 70 58 60', // smile + 'happy' => 'M 42 60 Q 50 70 58 60', // symmetric smile 'neutral' => 'M 42 64 L 58 64', // flat - 'sad' => 'M 42 66 Q 50 58 58 66', // frown + 'sad' => 'M 42 66 Q 50 58 58 66', // frown (curves up at edges) + 'wink' => 'M 42 60 Q 50 70 58 62', // asymmetric smirk — right corner a touch higher ); $mouth_d = $mouth[ $tone ]; @@ -46,10 +47,16 @@ function buddy_render_sprite( $species = 'default', $tone = 'happy', $size = 'md - - + + + + + + + - + @@ -57,10 +64,12 @@ function buddy_render_sprite( $species = 'default', $tone = 'happy', $size = 'md - - - - + + + + diff --git a/inc/state.php b/inc/state.php index 153cd8e..d954392 100644 --- a/inc/state.php +++ b/inc/state.php @@ -101,10 +101,19 @@ function buddy_overall_mood( array $state ) { } /** - * Pick a one-word emoji / status label based on overall mood. Pure - * cosmetic, used in the dashboard widget header. + * Pick a one-word status label + sprite tone based on overall mood. + * Pure cosmetic, used in the dashboard widget header and the main + * admin page. + * + * Easter-egg: when Buddy is genuinely happy (mood >= 75) there's a + * ~30% chance per page-render of returning the "Cheeky" wink tone + * instead of the standard happy face. Gives the pet a touch of + * personality — refresh the page enough and you'll catch the wink. */ function buddy_mood_label( $mood_score ) { + if ( $mood_score >= 75 && mt_rand( 1, 100 ) <= 30 ) { + return array( 'label' => __( 'Cheeky 😉', 'buddy' ), 'tone' => 'wink' ); + } if ( $mood_score >= 80 ) { return array( 'label' => __( 'Thriving', 'buddy' ), 'tone' => 'happy' ); } if ( $mood_score >= 60 ) { return array( 'label' => __( 'Content', 'buddy' ), 'tone' => 'happy' ); } if ( $mood_score >= 40 ) { return array( 'label' => __( 'Okay', 'buddy' ), 'tone' => 'neutral' ); }