Tentative MiniShogi implementation over move generator.
[tagua/yd.git] / src / variantfactories / builtinvariants.cpp
blob7a0ec626203fa7517201fa39bfa274b884116a7f
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*);
12 // FIXME: a KDE plugin willing to reuse a builtin one crashes
14 /**
15 * Hardcoded definition of builtin variants.
17 static const struct builtin {
18 const char* name;
19 Repository* (*init_func)(IVariantLoader*);
20 const char* theme_proxy;
21 } builtins[] = {
22 { "Chess", taguachess_initrepo, "Chess" },
23 { "Chess 5x5", taguachess5x5_initrepo, "Chess" },
24 { "Crazyhouse", taguacrazyhouse_initrepo, "Chess" },
25 { "Shogi", taguashogi_initrepo, "Shogi" },
26 { "MiniShogi", taguaminishogi_initrepo, "Shogi" },
29 static const struct builtin* const get_builtin(QString name) {
30 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
31 if (name.compare(builtins[i].name, Qt::CaseInsensitive) == 0)
32 return builtins+i;
33 return NULL;
36 BuiltinVariants::BuiltinVariants() {
37 for (unsigned i=0; i < sizeof(builtins)/sizeof(builtins[0]); i++)
38 m_allvariants << builtins[i].name;
41 BuiltinVariants& BuiltinVariants::self() {
42 static BuiltinVariants inst;
43 return inst;
46 Variant* BuiltinVariants::create(const QString& name) {
47 Repository* repo = getRepository(name);
48 if (repo) {
49 const struct builtin* const builtin = get_builtin(name);
50 if (!builtin)
51 kFatal() << "builtin not properly registered" << name;
52 return new Variant(name, repo, builtin->theme_proxy);
54 return NULL;
57 QStringList BuiltinVariants::all() const {
58 return m_allvariants;
61 Repository* BuiltinVariants::getRepository(const QString& variant) {
62 if (m_variants.contains(variant))
63 return m_variants[variant];
65 Repository* repo = NULL;
66 const struct builtin* const builtin = get_builtin(variant);
67 if (builtin) {
68 repo = builtin->init_func(this);
69 if (repo)
70 m_variants[builtin->name] = repo;
71 else
72 kError() << "could not load builtin variant" << variant;
75 return repo;