commit e78ee156f429c2b87d03200c42517ace262ec2d0
parent a4ed919b72b5490da6b52e56c83b47bc073a6b02
Author: amrfti <andrew@kloet.net>
Date: Thu, 22 May 2025 21:32:08 -0400
refactor fish
Diffstat:
| M | src/Fish.cpp | | | 53 | ++++++++++++++++------------------------------------- |
| M | src/Fish.h | | | 17 | ++++++----------- |
| D | src/FishAssets.h | | | 238 | ------------------------------------------------------------------------------- |
| A | src/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> ℑ
- 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)",
+ },
+ }
+};