fissh

termios terminal aquarium. demo at ssh://fish@kloet.net
Download | Log | Files | Refs

commit e78ee156f429c2b87d03200c42517ace262ec2d0
parent a4ed919b72b5490da6b52e56c83b47bc073a6b02
Author: amrfti <andrew@kloet.net>
Date:   Thu, 22 May 2025 21:32:08 -0400

refactor fish

Diffstat:
Msrc/Fish.cpp | 53++++++++++++++++-------------------------------------
Msrc/Fish.h | 17++++++-----------
Dsrc/FishAssets.h | 238-------------------------------------------------------------------------------
Asrc/assets/FishAssets.h | 240+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 262 insertions(+), 286 deletions(-)

diff --git a/src/Fish.cpp b/src/Fish.cpp @@ -1,16 +1,16 @@ #include "Fish.h" #include "Aquarium.h" -#include "FishAssets.h" #include "Random.h" +#include "assets/FishAssets.h" #include <ncurses.h> -Fish::Fish() : Fish(getRandomFishPair()) {} +Fish::Fish() : Fish(getRandomFishAsset()) {} -Fish::Fish(const FishAssetPair &pair) +Fish::Fish(const FishAssetRef &pair) : Entity(), speed((pair.index % 2 == 0) ? Random::floatInRange(0.25, 2.25) : -Random::floatInRange(0.25, 2.25)), - image(*pair.image), refMask(*pair.mask) { + image(pair.asset.image), mask(pair.asset.mask) { y = Random::intInRange(image.size() + 6, Aquarium::getInstance().getHeight() - image.size()); @@ -19,50 +19,29 @@ Fish::Fish(const FishAssetPair &pair) randomizeMask(); } -std::vector<std::pair<std::vector<std::string>, std::vector<std::string>>> - Fish::fishPairs; - -bool Fish::initialized = false; - -void Fish::initializeFishAssets() { - if (initialized) - return; - fishPairs = fishAssetPairs; - initialized = true; -} - void Fish::randomizeMask() { - // Create a mapping of digit to color - std::unordered_map<char, char> colorMap; - mask = refMask; + std::unordered_map<char, char> colorMap{{'4', 'W'}}; - // For each digit 1-9, assign a random color for (char digit = '1'; digit <= '9'; ++digit) { - colorMap[digit] = - availableColors[Random::intInRange(0, availableColors.size() - 1)]; + if (digit != '4') { + colorMap[digit] = + availableColors[Random::intInRange(0, availableColors.size() - 1)]; + } } - // Special case: '4' always maps to 'W' - colorMap['4'] = 'W'; - - // Apply the color mapping to each character in the mask for (auto &line : mask) { - for (auto &ch : line) { - if (ch >= '1' && ch <= '9') { - ch = colorMap[ch]; + for (char &ch : line) { + if (auto it = colorMap.find(ch); it != colorMap.end()) { + ch = it->second; } } } } -Fish::FishAssetPair Fish::getRandomFishPair() { - if (!initialized) - initializeFishAssets(); - - int index = Random::intInRange(0, fishPairs.size() - 1); - - return FishAssetPair{index, &fishPairs[index].first, - &fishPairs[index].second}; +Fish::FishAssetRef Fish::getRandomFishAsset() { + int index = + Random::intInRange(0, static_cast<int>(fishAssetPairs.size()) - 1); + return FishAssetRef{index, fishAssetPairs[index]}; } void Fish::update() { x += speed; } diff --git a/src/Fish.h b/src/Fish.h @@ -1,31 +1,26 @@ #pragma once #include "Entity.h" +#include "assets/FishAssets.h" #include <array> class Fish : public Entity { private: - struct FishAssetPair { + struct FishAssetRef { int index; - const std::vector<std::string> *image; - const std::vector<std::string> *mask; + FishAsset &asset; }; - Fish(const FishAssetPair &pair); - - static std::vector< - std::pair<std::vector<std::string>, std::vector<std::string>>> - fishPairs; + Fish(const FishAssetRef &ref); static bool initialized; const std::vector<std::string> &image; - const std::vector<std::string> &refMask; - std::vector<std::string> mask; + std::vector<std::string> &mask; static constexpr std::array<char, 12> availableColors = { 'c', 'C', 'r', 'R', 'y', 'Y', 'b', 'B', 'g', 'G', 'm', 'M'}; const float speed; - static FishAssetPair getRandomFishPair(); + static FishAssetRef getRandomFishAsset(); static void initializeFishAssets(); void randomizeMask(); diff --git a/src/FishAssets.h b/src/FishAssets.h @@ -1,238 +0,0 @@ -#pragma once - -#include <string> -#include <vector> - -using FishAssetPairRaw = - std::pair<std::vector<std::string>, std::vector<std::string>>; - -inline std::vector<FishAssetPairRaw> fishAssetPairs = { - { - { - R"(???\)", - R"(??/ \)", - R"(>=_('>)", - R"(??\_/)", - R"(???/)" - }, - { - R"( 1)", - R"( 1 1)", - R"(663745)", - R"( 111)", - R"( 3)" - } - }, - { - { - R"(??/)", - R"(?/ \)", - R"(<')_=<)", - R"(?\_/)", - R"(??\)" - }, - { - R"( 2)", - R"( 111)", - R"(547366)", - R"( 111)", - R"( 3)" - } - }, - { - { - R"(?????,)", - R"(?????}\)", - R"(\??.' `\)", - R"(}}< ( 6>)", - R"(/??`, .')", - R"(?????}/)", - R"(?????')" - }, - { - R"( 2)", - R"( 22)", - R"(6 11 11)", - R"(661 7 45)", - R"(6 11 11)", - R"( 33)", - R"( 3)" - } - }, - { - { - R"(????,)", - R"(???/{)", - R"(?/' `. /)", - R"(<6 ) >{{)", - R"(?`. ,' \)", - R"(???\{)", - R"(????`)" - }, - { - R"( 2)", - R"( 22)", - R"( 11 11 6)", - R"(54 7 166)", - R"( 11 11 6)", - R"( 33)", - R"( 3)" - } - }, - { - { - R"(???????,--,_???)", - R"(__????_\.---'-.)", - R"(\ '.-" // o\)", - R"(/_.'-._ \\ /)", - R"(???????`"--(/"`)" - }, - { - R"( 22222)", - R"(66 121111211)", - R"(6 6111 77 41)", - R"(6661111 77 1)", - R"( 11113311)" - } - }, - { - { - R"(????_,--,???????)", - R"(?.-'---./_????__)", - R"(/o \\ "-.' /)", - R"(\ // _.-'._\)", - R"(?`"\)--"`???????)" - }, - { - R"( 22222 )", - R"( 112111121 66)", - R"(14 77 1116 6)", - R"(1 77 1111666)", - R"( 11331111 )" - } - }, - { - { - R"(??__)", - R"(><_'>)", - R"(???')" - }, - { - R"( 11)", - R"(61145)", - R"( 3)" - } - }, - { - { - R"(?__)", - R"(<'_><)", - R"(?`)" - }, - { - R"( 11)", - R"(54116)", - R"( 3)" - } - }, - { - { - R"(????????_.-`\??????)", - R"(?????-:`_..,_\?????)", - R"(('-..:-` , '-.,?)", - R"(?} _ ;':( o :)", - R"((.-`/'-.,__'` _.-`?)", - R"(???`'-.,/??//`?????)" - }, - { - R"( 22222 )", - R"( 222111112 )", - R"(66661111 7 1111 )", - R"( 6 1 7777 4 1)", - R"(6666211111177 1111 )", - R"( 222222 333 )" - } - }, - { - { - R"(??????/`-._????????)", - R"(?????/_,.._`:-?????)", - R"(?,.-' , `-:..-'))", - R"(: o ):'; _ {?)", - R"(?`-._ `'__,.-'\`-.))", - R"(?????`\\??\,.-'`???)" - }, - { - R"( 22222 )", - R"( 211111222 )", - R"( 1111 7 11116666)", - R"(1 4 7777 1 6 )", - R"( 1111 7711111126666)", - R"( 333 222222 )" - } - }, - { - { - R"(????????/\??????)", - R"(????????\.\_????)", - R"(\'-,.:-` '-,?)", - R"( ) _ (>( o <)", - R"(/.-`?':._ _.-`?)", - R"(??????;/?``?????)", - }, - { - R"( 22 )", - R"( 2121 )", - R"(66661111 111 )", - R"( 6 1 777 4 1)", - R"(6666 1111 1111 )", - R"( 22 33 )", - } - }, - { - { - R"(??????/\????????)", - R"(????_/./????????)", - R"(?,-' `-:.,-'/)", - R"(> o )<) _ ( )", - R"(?`-._ _.:'?`-.\)", - R"(?????``?\;??????)", - }, - { - R"( 22 )", - R"( 1212 )", - R"( 111 11116666)", - R"(1 4 777 1 6 )", - R"( 1111 1111 6666)", - R"( 33 22 )", - } - }, - { - { - R"(_?????????_.*"\??????)", - R"(\'-._..-*` `'*-.??)", - R"(?) , (( o >)", - R"(/.`"*--.__)_.`_.-*`??)" - }, - { - R"(6 11222 )", - R"(6661111111 11111 )", - R"( 6 3 77 4 1)", - R"(6661111111311311111 )", - } - }, - { - { - R"(??????/"*._?????????_)", - R"(??.-*'` `*-.._.-'/)", - R"(< o )) , ( )", - R"(??`*-._`._(__.--*"`.\)", - }, - { - R"( 22211 6)", - R"( 11111 1111111666)", - R"(1 4 77 3 6 )", - R"( 1111131131111111666)", - }, - } -}; diff --git a/src/assets/FishAssets.h b/src/assets/FishAssets.h @@ -0,0 +1,240 @@ +#pragma once + +#include <string> +#include <vector> + +struct FishAsset { + std::vector<std::string> image; + std::vector<std::string> mask; +}; + +inline std::vector<FishAsset> fishAssetPairs = { + { + { + R"(???\)", + R"(??/ \)", + R"(>=_('>)", + R"(??\_/)", + R"(???/)" + }, + { + R"( 1)", + R"( 1 1)", + R"(663745)", + R"( 111)", + R"( 3)" + } + }, + { + { + R"(??/)", + R"(?/ \)", + R"(<')_=<)", + R"(?\_/)", + R"(??\)" + }, + { + R"( 2)", + R"( 111)", + R"(547366)", + R"( 111)", + R"( 3)" + } + }, + { + { + R"(?????,)", + R"(?????}\)", + R"(\??.' `\)", + R"(}}< ( 6>)", + R"(/??`, .')", + R"(?????}/)", + R"(?????')" + }, + { + R"( 2)", + R"( 22)", + R"(6 11 11)", + R"(661 7 45)", + R"(6 11 11)", + R"( 33)", + R"( 3)" + } + }, + { + { + R"(????,)", + R"(???/{)", + R"(?/' `. /)", + R"(<6 ) >{{)", + R"(?`. ,' \)", + R"(???\{)", + R"(????`)" + }, + { + R"( 2)", + R"( 22)", + R"( 11 11 6)", + R"(54 7 166)", + R"( 11 11 6)", + R"( 33)", + R"( 3)" + } + }, + { + { + R"(???????,--,_)", + R"(__????_\.---'-.)", + R"(\ '.-" // o\)", + R"(/_.'-._ \\ /)", + R"(???????`"--(/"`)" + }, + { + R"( 22222)", + R"(66 121111211)", + R"(6 6111 77 41)", + R"(6661111 77 1)", + R"( 11113311)" + } + }, + { + { + R"(????_,--,)", + R"(?.-'---./_????__)", + R"(/o \\ "-.' /)", + R"(\ // _.-'._\)", + R"(?`"\)--"`)" + }, + { + R"( 22222)", + R"( 112111121 66)", + R"(14 77 1116 6)", + R"(1 77 1111666)", + R"( 11331111)" + } + }, + { + { + R"(??__)", + R"(><_'>)", + R"(???')" + }, + { + R"( 11)", + R"(61145)", + R"( 3)" + } + }, + { + { + R"(?__)", + R"(<'_><)", + R"(?`)" + }, + { + R"( 11)", + R"(54116)", + R"( 3)" + } + }, + { + { + R"(????????_.-`\)", + R"(?????-:`_..,_\)", + R"(('-..:-` , '-.,)", + R"(?} _ ;':( o :)", + R"((.-`/'-.,__'` _.-`)", + R"(???`'-.,/??//`)" + }, + { + R"( 22222)", + R"( 222111112)", + R"(66661111 7 1111)", + R"( 6 1 7777 4 1)", + R"(6666211111177 1111)", + R"( 222222 333)" + } + }, + { + { + R"(??????/`-._)", + R"(?????/_,.._`:-)", + R"(?,.-' , `-:..-'))", + R"(: o ):'; _ {)", + R"(?`-._ `'__,.-'\`-.))", + R"(?????`\\??\,.-'`)" + }, + { + R"( 22222)", + R"( 211111222)", + R"( 1111 7 11116666)", + R"(1 4 7777 1 6)", + R"( 1111 7711111126666)", + R"( 333 222222)" + } + }, + { + { + R"(????????/\)", + R"(????????\.\_)", + R"(\'-,.:-` '-,)", + R"( ) _ (>( o <)", + R"(/.-`?':._ _.-`)", + R"(??????;/?``)", + }, + { + R"( 22)", + R"( 2121)", + R"(66661111 111)", + R"( 6 1 777 4 1)", + R"(6666 1111 1111)", + R"( 22 33)", + } + }, + { + { + R"(??????/\)", + R"(????_/./)", + R"(?,-' `-:.,-'/)", + R"(> o )<) _ ()", + R"(?`-._ _.:'?`-.\)", + R"(?????``?\;)", + }, + { + R"( 22)", + R"( 1212)", + R"( 111 11116666)", + R"(1 4 777 1 6)", + R"( 1111 1111 6666)", + R"( 33 22)", + } + }, + { + { + R"(_?????????_.*"\)", + R"(\'-._..-*` `'*-.)", + R"(?) , (( o >)", + R"(/.`"*--.__)_.`_.-*`)" + }, + { + R"(6 11222)", + R"(6661111111 11111)", + R"( 6 3 77 4 1)", + R"(6661111111311311111)", + } + }, + { + { + R"(??????/"*._?????????_)", + R"(??.-*'` `*-.._.-'/)", + R"(< o )) , ()", + R"(??`*-._`._(__.--*"`.\)", + }, + { + R"( 22211 6)", + R"( 11111 1111111666)", + R"(1 4 77 3 6)", + R"( 1111131131111111666)", + }, + } +};