Preliminary port of Shogi to the component API.
[tagua/yd.git] / src / variants / shogi / shogi.cpp
blob2af0220e7bcc9192ca2b2c23c2207bc74318570e
1 #include <core/repository.h>
2 #include <core/variantloader.h>
4 #include "behaviour.h"
5 #include "colors.h"
6 #include "moveserializer.h"
7 #include "types.h"
8 #include "state.h"
9 #include "validator.h"
11 using namespace Shogi;
13 extern "C" KDE_EXPORT Repository*
14 taguashogi_initrepo(IVariantLoader* loader) {
15 Repository* repo = new Repository;
16 Repository* chess = loader->getRepository("chess");
17 if (!chess)
18 // bail out if there is no chess variant
19 return 0;
20 #if 0
21 Repository* crazyhouse = loader->getRepository("crazyhouse");
22 if (!crazyhouse)
23 // bail out if there is no crazyhouse variant
24 return 0;
25 #endif
27 repo->addComponent("player/0", dynamic_cast<Component*>(COLORS[0]));
28 repo->addComponent("player/1", dynamic_cast<Component*>(COLORS[1]));
30 repo->addComponent("type/king", King::self());
31 repo->addComponent("type/gold", Gold::self());
32 repo->addComponent("type/silver", Silver::self());
33 repo->addComponent("type/knight", Knight::self());
34 repo->addComponent("type/lance", Lance::self());
35 repo->addComponent("type/rook", Rook::self());
36 repo->addComponent("type/bishop", Bishop::self());
37 repo->addComponent("type/pawn", Pawn::self());
39 repo->addComponent("type/narigin", Narigin::self());
40 repo->addComponent("type/narikei", Narikei::self());
41 repo->addComponent("type/narikyo", Narikyo::self());
42 repo->addComponent("type/dragonking", DragonKing::self());
43 repo->addComponent("type/dragonhorse", DragonHorse::self());
44 repo->addComponent("type/tokin", Tokin::self());
46 PromotionManager* promotion_manager = new PromotionManager();
47 promotion_manager->setPromotion(Silver::self(), Narigin::self());
48 promotion_manager->setPromotion(Knight::self(), Narikei::self());
49 promotion_manager->setPromotion(Lance::self(), Narikyo::self());
50 promotion_manager->setPromotion(Rook::self(), DragonKing::self());
51 promotion_manager->setPromotion(Bishop::self(), DragonHorse::self());
52 promotion_manager->setPromotion(Pawn::self(), Tokin::self());
53 repo->addComponent("promotion_manager", promotion_manager);
55 // base behaviour on chess
56 Component* chess_behaviour_comp = chess->getComponent("behaviour");
57 Q_ASSERT(chess_behaviour_comp);
58 IBehaviour* behaviour_clone = NULL;
59 Q_ASSERT(QMetaObject::invokeMethod(chess_behaviour_comp, "clone",
60 Q_RETURN_ARG(IBehaviour*, behaviour_clone)));
61 Q_ASSERT(behaviour_clone);
62 Behaviour* behaviour = new Behaviour(behaviour_clone);
63 behaviour->setPromotionManager(promotion_manager);
64 repo->addComponent("behaviour", behaviour);
65 repo->addComponent("state", new State(behaviour, Point(9, 9)));
67 Validator* validator = new Validator;
68 repo->addComponent("validator", validator);
69 repo->addComponent("animator_factory", chess->getComponent("animator_factory"));
70 repo->addComponent("namer", chess->getComponent("namer"));
71 repo->addComponent("policy", chess->getComponent("policy"));
73 // set move serializers
74 Repository::ComponentMap serializers = chess->listComponents("move_serializer");
75 for (Repository::ComponentMap::const_iterator it = serializers.begin(),
76 end = serializers.end(); it != end; ++it) {
77 IMoveSerializer* s = requestInterface<IMoveSerializer>(it.value());
78 if (s) repo->addComponent("move_serializer/" + it.key(), new MoveSerializer(s));
81 return repo;