refresh e50354d3ef3d92779d3796094388f4161b20460c
[tagua/yd.git] / src / variants / shogi / shogi.cpp
blob9d024d119f99eb1c1e35435aa9ea41a148fc2b0d
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 #if 0
47 // create crazyhouse behaviour
48 IState* crazyhouse_state = requestInterface<IState>(crazyhouse->getComponent("state"));
49 repo->addComponent("state", new State(crazyhouse_state->behaviour(), Point(9, 9)));
50 #else
51 IState* chess_state = requestInterface<IState>(chess->getComponent("state"));
52 PromotionManager* promotion_manager = new PromotionManager();
53 promotion_manager->setPromotion(Silver::self(), Narigin::self());
54 promotion_manager->setPromotion(Knight::self(), Narikei::self());
55 promotion_manager->setPromotion(Lance::self(), Narikyo::self());
56 promotion_manager->setPromotion(Rook::self(), DragonKing::self());
57 promotion_manager->setPromotion(Bishop::self(), DragonHorse::self());
58 promotion_manager->setPromotion(Pawn::self(), Tokin::self());
59 repo->addComponent("promotion_manager", promotion_manager);
61 // base behaviour on chess
62 Behaviour* behaviour = new Behaviour(chess_state->behaviour()->clone());
63 behaviour->setPromotionManager(promotion_manager);
64 repo->addComponent("state", new State(behaviour, Point(9, 9)));
65 #endif
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;