Tentative Randomless-Entropy variant.
[tagua/yd.git] / src / variantfactories / builtinvariants.cpp
blob7109d569fe68fe46c52e94e7ee711e687b0201c9
1 #include <QString>
2 #include <core/repository.h>
3 #include <variant.h>
4 #include "builtinvariants.h"
6 extern "C" Repository* taguachess_initrepo(IVariantLoader*);
7 extern "C" Repository* taguachess5x5_initrepo(IVariantLoader*);
8 extern "C" Repository* taguacrazyhouse_initrepo(IVariantLoader*);
9 extern "C" Repository* taguashogi_initrepo(IVariantLoader*);
10 extern "C" Repository* taguaminishogi_initrepo(IVariantLoader*);
11 extern "C" Repository* taguarandomlessentropy_initrepo(IVariantLoader*);
13 // FIXME: a KDE plugin willing to reuse a builtin one crashes
15 /**
16 * Hardcoded definition of builtin variants.
18 static const struct builtin {
19 const char* name;
20 Repository* (*init_func)(IVariantLoader*);
21 const char* theme_proxy;
22 } builtins[] = {
23 { "Chess", taguachess_initrepo, "Chess" },
24 { "Chess 5x5", taguachess5x5_initrepo, "Chess" },
25 { "Crazyhouse", taguacrazyhouse_initrepo, "Chess" },
26 { "Shogi", taguashogi_initrepo, "Shogi" },
27 { "MiniShogi", taguaminishogi_initrepo, "Shogi" },
28 { "Randomless Entropy", taguarandomlessentropy_initrepo, "Entropy" },
31 static const struct builtin* const get_builtin(QString name) {
32 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
33 if (name.compare(builtins[i].name, Qt::CaseInsensitive) == 0)
34 return builtins+i;
35 return NULL;
38 BuiltinVariants::BuiltinVariants() {
39 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
40 m_allvariants << builtins[i].name;
43 BuiltinVariants& BuiltinVariants::self() {
44 static BuiltinVariants inst;
45 return inst;
48 Variant* BuiltinVariants::create(const QString& name) {
49 Repository* repo = getRepository(name);
50 if (repo) {
51 const struct builtin* const builtin = get_builtin(name);
52 if (!builtin)
53 kFatal() << "builtin not properly registered" << name;
54 return new Variant(name, repo, builtin->theme_proxy);
56 return NULL;
59 QStringList BuiltinVariants::all() const {
60 return m_allvariants;
63 Repository* BuiltinVariants::getRepository(const QString& variant) {
64 if (m_variants.contains(variant))
65 return m_variants[variant];
67 Repository* repo = NULL;
68 const struct builtin* const builtin = get_builtin(variant);
69 if (builtin) {
70 repo = builtin->init_func(this);
71 if (repo)
72 m_variants[builtin->name] = repo;
73 else
74 kError() << "could not load builtin variant" << variant;
77 return repo;