millennium-dev team mailing list archive
-
millennium-dev team
-
Mailing list archive
-
Message #00157
[Merge] lp:~rafalcieslak256/libmillennium/libmillennium-basic-cards into lp:libmillennium
Rafał Cieślak has proposed merging lp:~rafalcieslak256/libmillennium/libmillennium-basic-cards into lp:libmillennium.
Requested reviews:
Millennium Developers (millennium-dev)
For more details, see:
https://code.launchpad.net/~rafalcieslak256/libmillennium/libmillennium-basic-cards/+merge/177261
Basically, this branch introduces the ICard class and a few variations that are meant to represent cards.
There are also 3 simple cards implemented. (It specifies card directory layout etc.)
This is my finalisation of Konrad's work.
This branch adds one more class "CCardStack" that is meant to represent a set of cards as it appears in the deck, hand, or other places.
There is also one new build script "build_ccardstack_test", which builds a simple demo of CCardStack.
--
https://code.launchpad.net/~rafalcieslak256/libmillennium/libmillennium-basic-cards/+merge/177261
Your team Millennium Developers is requested to review the proposed merge of lp:~rafalcieslak256/libmillennium/libmillennium-basic-cards into lp:libmillennium.
=== added file 'src/CCardStack.cpp'
--- src/CCardStack.cpp 1970-01-01 00:00:00 +0000
+++ src/CCardStack.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,38 @@
+#include "CCardStack.hpp"
+#include "IRandomNumberGenerator.hpp"
+#include <algorithm>
+
+CCardStack::CCardStack(){ }
+
+CCardStack::~CCardStack(){
+ for(int i = 0; i < _card_deque.size(); ++i) delete _card_deque[i];
+}
+
+bool CCardStack::Empty(){ _card_deque.empty(); }
+
+ICard* CCardStack::operator[](int index){
+ return _card_deque[index];
+}
+
+int CCardStack::Size(){ _card_deque.size(); }
+
+ICard* CCardStack::Top(){ return _card_deque.front(); }
+
+void CCardStack::PushTop(ICard* card){
+ _card_deque.push_front(card->clone());
+}
+
+void CCardStack::PopTop(){ _card_deque.pop_front(); }
+
+ICard* CCardStack::Bottom(){ return _card_deque.back(); }
+
+void CCardStack::PushBottom(ICard* card){
+ _card_deque.push_back(card->clone());
+}
+
+void CCardStack::PopBottom(){ return _card_deque.pop_back(); }
+
+void CCardStack::Shuffle(){
+ IRandomNumberGenerator::Srand();
+ std::random_shuffle(_card_deque.begin(), _card_deque.end());
+}
=== added file 'src/CCardStack.hpp'
--- src/CCardStack.hpp 1970-01-01 00:00:00 +0000
+++ src/CCardStack.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,24 @@
+#ifndef __CCARDSTACK_HPP__
+#define __CCARDSTACK_HPP__
+#include <deque>
+#include "ICard.hpp"
+
+class CCardStack{
+ private:
+ std::deque<ICard*> _card_deque;
+ public:
+ CCardStack();
+ ~CCardStack();
+ ICard* operator[](int index);
+ bool Empty();
+ int Size();
+ ICard* Top();
+ void PushTop(ICard* card);
+ void PopTop();
+ ICard* Bottom();
+ void PushBottom(ICard* card);
+ void PopBottom();
+ void Shuffle();
+};
+
+#endif
=== added directory 'src/Cards'
=== added file 'src/Cards.hpp'
--- src/Cards.hpp 1970-01-01 00:00:00 +0000
+++ src/Cards.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,8 @@
+#ifndef __CARDS_HPP__
+#define __CARDS_HPP__
+
+/* This file, for convinience, includes all card sets. */
+
+#include "Cards/SDK.hpp"
+
+#endif
=== added directory 'src/Cards/SDK'
=== added file 'src/Cards/SDK.hpp'
--- src/Cards/SDK.hpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,9 @@
+#ifndef __SDK_HPP__
+#define __SDK_HPP__
+
+#include "SDK/Card_SDK_001.hpp"
+
+#include "SDK/Card_SDK_003.hpp"
+#include "SDK/Card_SDK_004.hpp"
+
+#endif
=== added file 'src/Cards/SDK/Card_SDK_001.cpp'
--- src/Cards/SDK/Card_SDK_001.cpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_001.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,20 @@
+#include "Card_SDK_001.hpp"
+
+Card_SDK_001::Card_SDK_001(){
+ _name = "Blue-Eyes White Dragon";
+ _level = 8;
+ _attribute = CARD_ATTRIBUTE_LIGHT;
+ _type = CARD_TYPE_DRAGON;
+ _id = "SDK-001";
+ _ATK = 3000;
+ _DEF = 2500;
+ _description = "This legendary dragon is a powerful engine of destruction. Virtually invincible, very few have faced this awesome creature and lived to tell the tale.";
+}
+
+Card_SDK_001::~Card_SDK_001(){
+
+}
+
+ICard* Card_SDK_001::clone() {
+ return new Card_SDK_001(*this);
+}
=== added file 'src/Cards/SDK/Card_SDK_001.hpp'
--- src/Cards/SDK/Card_SDK_001.hpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_001.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,12 @@
+#ifndef __Card_SDK_001_HPP__
+#define __Card_SDK_001_HPP__
+#include "../../INormalMonsterCard.hpp"
+
+class Card_SDK_001 : public INormalMonsterCard{
+ public:
+ virtual ICard* clone();
+ Card_SDK_001();
+ ~Card_SDK_001();
+};
+
+#endif
=== added file 'src/Cards/SDK/Card_SDK_003.cpp'
--- src/Cards/SDK/Card_SDK_003.cpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_003.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,20 @@
+#include "Card_SDK_003.hpp"
+
+Card_SDK_003::Card_SDK_003(){
+ _name = "Ryu-Kishin";
+ _level = 3;
+ _attribute = CARD_ATTRIBUTE_DARK;
+ _type = CARD_TYPE_FIEND;
+ _id = "SDK-003";
+ _ATK = 1000;
+ _DEF = 500;
+ _description = "A very elusive creature that looks like a harmless statue until it attacks.";
+}
+
+Card_SDK_003::~Card_SDK_003(){
+
+}
+
+ICard* Card_SDK_003::clone() {
+ return new Card_SDK_003(*this);
+}
=== added file 'src/Cards/SDK/Card_SDK_003.hpp'
--- src/Cards/SDK/Card_SDK_003.hpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_003.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,12 @@
+#ifndef __Card_SDK_003_HPP__
+#define __Card_SDK_003_HPP__
+#include "../../INormalMonsterCard.hpp"
+
+class Card_SDK_003 : public INormalMonsterCard{
+ public:
+ virtual ICard* clone();
+ Card_SDK_003();
+ ~Card_SDK_003();
+};
+
+#endif
=== added file 'src/Cards/SDK/Card_SDK_004.cpp'
--- src/Cards/SDK/Card_SDK_004.cpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_004.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,20 @@
+#include "Card_SDK_004.hpp"
+
+Card_SDK_004::Card_SDK_004(){
+ _name = "The Wicked Worm Beast";
+ _level = 3;
+ _attribute = CARD_ATTRIBUTE_EARTH;
+ _type = CARD_TYPE_BEAST;
+ _id = "SDK-004";
+ _ATK = 1400;
+ _DEF = 700;
+ _description = "This face-up card on the field is returned to the owner's hand during the End Phase of your turn.";
+}
+
+Card_SDK_004::~Card_SDK_004(){
+
+}
+
+ICard* Card_SDK_004::clone() {
+ return new Card_SDK_004(*this);
+}
=== added file 'src/Cards/SDK/Card_SDK_004.hpp'
--- src/Cards/SDK/Card_SDK_004.hpp 1970-01-01 00:00:00 +0000
+++ src/Cards/SDK/Card_SDK_004.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,12 @@
+#ifndef __Card_SDK_004_HPP__
+#define __Card_SDK_004_HPP__
+#include "../../IEffectMonsterCard.hpp"
+
+class Card_SDK_004 : public IEffectMonsterCard{
+ public:
+ virtual ICard* clone();
+ Card_SDK_004();
+ ~Card_SDK_004();
+};
+
+#endif
=== added file 'src/ICard.cpp'
--- src/ICard.cpp 1970-01-01 00:00:00 +0000
+++ src/ICard.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,6 @@
+#include "ICard.hpp"
+
+ICard::~ICard(){}
+std::string ICard::GetName(){ return _name; }
+std::string ICard::GetID(){ return _id; }
+std::string ICard::GetDescription(){ return _description; }
=== added file 'src/ICard.hpp'
--- src/ICard.hpp 1970-01-01 00:00:00 +0000
+++ src/ICard.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,18 @@
+#ifndef __ICARD_HPP__
+#define __ICARD_HPP__
+#include <string>
+
+class ICard{
+ protected:
+ std::string _name;
+ std::string _id;
+ std::string _description;
+ public:
+ virtual ~ICard();
+ virtual ICard* clone() = 0;
+ std::string GetName();
+ std::string GetID();
+ std::string GetDescription();
+};
+
+#endif
=== added file 'src/IEffectMonsterCard.cpp'
--- src/IEffectMonsterCard.cpp 1970-01-01 00:00:00 +0000
+++ src/IEffectMonsterCard.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,3 @@
+#include "IEffectMonsterCard.hpp"
+
+IEffectMonsterCard::~IEffectMonsterCard(){}
\ No newline at end of file
=== added file 'src/IEffectMonsterCard.hpp'
--- src/IEffectMonsterCard.hpp 1970-01-01 00:00:00 +0000
+++ src/IEffectMonsterCard.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,11 @@
+#ifndef __IEFFECTMONSTERCARD_HPP__
+#define __IEFFECTMONSTERCARD_HPP__
+#include "IMonsterCard.hpp"
+
+class IEffectMonsterCard : public IMonsterCard{
+ public:
+ virtual ICard* clone() = 0;
+ virtual ~IEffectMonsterCard() = 0;
+};
+
+#endif
=== added file 'src/IMonsterCard.cpp'
--- src/IMonsterCard.cpp 1970-01-01 00:00:00 +0000
+++ src/IMonsterCard.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,54 @@
+#include "IMonsterCard.hpp"
+
+std::string CardAttributeToString(CardAttribute attribute){
+ switch(attribute) {
+ case CARD_ATTRIBUTE_DARK : return "DARK";
+ case CARD_ATTRIBUTE_EARTH : return "EARTH";
+ case CARD_ATTRIBUTE_FIRE : return "FIRE";
+ case CARD_ATTRIBUTE_LIGHT : return "LIGHT";
+ case CARD_ATTRIBUTE_WATER : return "WATER";
+ case CARD_ATTRIBUTE_WIND : return "WIND";
+
+ case CARD_ATTRIBUTE_DIVINE : return "DIVINE";
+ }
+}
+
+std::string CardTypeToString(CardType type){
+ switch(type) {
+ case CARD_TYPE_AQUA : return "AQUA";
+ case CARD_TYPE_BEAST : return "BEAST";
+ case CARD_TYPE_BEAST_WARRIOR : return "BEAST_WARRIOR";
+ case CARD_TYPE_CREATOR_GOD : return "CREATOR_GOD";
+ case CARD_TYPE_DINOSAUR : return "DINOSAUR";
+ case CARD_TYPE_DIVINE_BEAST : return "DIVINE_BEAST";
+ case CARD_TYPE_DRAGON : return "DRAGON";
+ case CARD_TYPE_FAIRY : return "FAIRY";
+ case CARD_TYPE_FIEND : return "FIEND";
+ case CARD_TYPE_FISH : return "FISH";
+ case CARD_TYPE_INSECT : return "INSECT";
+ case CARD_TYPE_MACHINE : return "MACHINE";
+ case CARD_TYPE_PLANT : return "PLANT";
+ case CARD_TYPE_PSYCHIC : return "PSYCHIC";
+ case CARD_TYPE_PYRO : return "PYRO";
+ case CARD_TYPE_REPTILE : return "REPTILE";
+ case CARD_TYPE_ROCK : return "ROCK";
+ case CARD_TYPE_SEA_SERPENT : return "SEA_SERPENT";
+ case CARD_TYPE_SPELLCASTER : return "SPELLCASTER";
+ case CARD_TYPE_THUNDER : return "THUNDER";
+ case CARD_TYPE_WARRIOR : return "WARRIOR";
+ case CARD_TYPE_WINGED_BEAST : return "WINGED_BEAST";
+ case CARD_TYPE_ZOMBIE : return "ZOMBIE";
+ }
+}
+
+IMonsterCard::~IMonsterCard(){}
+
+CardAttribute IMonsterCard::GetAttribute() { return _attribute ; }
+std::string IMonsterCard::GetAttributeString(){ return CardAttributeToString(_attribute); }
+
+CardType IMonsterCard::GetType() { return _type ; }
+std::string IMonsterCard::GetTypeString(){ return CardTypeToString(_type); }
+
+int IMonsterCard::GetLevel(){ return _level; }
+int IMonsterCard::GetATK(){ return _ATK; }
+int IMonsterCard::GetDEF(){ return _DEF; }
=== added file 'src/IMonsterCard.hpp'
--- src/IMonsterCard.hpp 1970-01-01 00:00:00 +0000
+++ src/IMonsterCard.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,65 @@
+#ifndef __IMONSTERCARD_HPP__
+#define __IMONSTERCARD_HPP__
+#include "ICard.hpp"
+
+enum CardAttribute
+{
+ CARD_ATTRIBUTE_DARK,
+ CARD_ATTRIBUTE_DIVINE,
+ CARD_ATTRIBUTE_EARTH,
+ CARD_ATTRIBUTE_FIRE,
+ CARD_ATTRIBUTE_LIGHT,
+ CARD_ATTRIBUTE_WATER,
+ CARD_ATTRIBUTE_WIND
+};
+
+enum CardType
+{
+ CARD_TYPE_AQUA,
+ CARD_TYPE_BEAST,
+ CARD_TYPE_BEAST_WARRIOR,
+ CARD_TYPE_CREATOR_GOD,
+ CARD_TYPE_DINOSAUR,
+ CARD_TYPE_DIVINE_BEAST,
+ CARD_TYPE_DRAGON,
+ CARD_TYPE_FAIRY,
+ CARD_TYPE_FIEND,
+ CARD_TYPE_FISH,
+ CARD_TYPE_INSECT,
+ CARD_TYPE_MACHINE,
+ CARD_TYPE_PLANT,
+ CARD_TYPE_PSYCHIC,
+ CARD_TYPE_PYRO,
+ CARD_TYPE_REPTILE,
+ CARD_TYPE_ROCK,
+ CARD_TYPE_SEA_SERPENT,
+ CARD_TYPE_SPELLCASTER,
+ CARD_TYPE_THUNDER,
+ CARD_TYPE_WARRIOR,
+ CARD_TYPE_WINGED_BEAST,
+ CARD_TYPE_ZOMBIE
+};
+
+class IMonsterCard : public ICard{
+ protected:
+ CardAttribute _attribute;
+ CardType _type;
+ int _level;
+ int _ATK;
+ int _DEF;
+ public:
+ virtual ~IMonsterCard();
+ virtual ICard* clone() = 0;
+
+ CardAttribute GetAttribute();
+ std::string GetAttributeString();
+
+ CardType GetType();
+ std::string GetTypeString();
+
+ int GetLevel();
+ int GetATK();
+ int GetDEF();
+};
+
+#endif
=== added file 'src/INormalMonsterCard.cpp'
--- src/INormalMonsterCard.cpp 1970-01-01 00:00:00 +0000
+++ src/INormalMonsterCard.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,3 @@
+#include "INormalMonsterCard.hpp"
+
+INormalMonsterCard::~INormalMonsterCard(){}
\ No newline at end of file
=== added file 'src/INormalMonsterCard.hpp'
--- src/INormalMonsterCard.hpp 1970-01-01 00:00:00 +0000
+++ src/INormalMonsterCard.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,11 @@
+#ifndef __INORMALMONSTERCARD_HPP__
+#define __INORMALMONSTERCARD_HPP__
+#include "IMonsterCard.hpp"
+
+class INormalMonsterCard : public IMonsterCard{
+ public:
+ virtual ICard* clone() = 0;
+ virtual ~INormalMonsterCard();
+};
+
+#endif
=== added file 'src/IRandomNumberGenerator.cpp'
--- src/IRandomNumberGenerator.cpp 1970-01-01 00:00:00 +0000
+++ src/IRandomNumberGenerator.cpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,16 @@
+#include "IRandomNumberGenerator.hpp"
+#include <ctime>
+#include <cstdlib>
+
+bool IRandomNumberGenerator::_initialized = 0;
+
+void IRandomNumberGenerator::Srand(){
+ _initialized = 1;
+ srand(time(0));
+}
+
+int IRandomNumberGenerator::Rand(){
+ if(! _initialized) Srand();
+ return rand();
+}
+
=== added file 'src/IRandomNumberGenerator.hpp'
--- src/IRandomNumberGenerator.hpp 1970-01-01 00:00:00 +0000
+++ src/IRandomNumberGenerator.hpp 2013-07-27 15:40:33 +0000
@@ -0,0 +1,13 @@
+#ifndef __IRANDOMNUMBERGENERATOR_HPP__
+#define __IRANDOMNUMBERGENERATOR_HPP__
+
+class IRandomNumberGenerator{
+ private:
+ static bool _initialized;
+ public:
+ virtual void pure_virtual_function() = 0;
+ static void Srand();
+ static int Rand();
+};
+
+#endif
\ No newline at end of file
=== added file 'src/build_ccardstack_test'
--- src/build_ccardstack_test 1970-01-01 00:00:00 +0000
+++ src/build_ccardstack_test 2013-07-27 15:40:33 +0000
@@ -0,0 +1,2 @@
+#!/bin/sh
+g++-4.8 -o ccardstack_test *.cpp Cards/*/*.cpp -lpthread --std=c++11 -g -DCCARDSTACK_TEST
=== modified file 'src/build_client'
--- src/build_client 2013-07-10 21:18:57 +0000
+++ src/build_client 2013-07-27 15:40:33 +0000
@@ -1,2 +1,2 @@
#!/bin/sh
-g++-4.8 -o client *.cpp -lpthread --std=c++11 -g
+g++-4.8 -o client *.cpp -lpthread --std=c++11 -g -DCLIENT
=== modified file 'src/build_server'
--- src/build_server 2013-07-10 21:18:57 +0000
+++ src/build_server 2013-07-27 15:40:33 +0000
@@ -1,2 +1,2 @@
#!/bin/sh
-g++-4.8 -o server *.cpp -lpthread --std=c++11 -g -DBUILD_AS_SERVER
+g++-4.8 -o server *.cpp -lpthread --std=c++11 -g -DSERVER
=== modified file 'src/main.cpp'
--- src/main.cpp 2013-07-24 18:40:55 +0000
+++ src/main.cpp 2013-07-27 15:40:33 +0000
@@ -1,4 +1,4 @@
-#if defined(BUILD_AS_SERVER)
+#if defined(SERVER)
//================================
// Server demo code
@@ -12,7 +12,8 @@
while(1);
}
-#else
+#endif
+#if defined(CLIENT)
//================================
// Client demo code
@@ -51,3 +52,37 @@
}
#endif
+#if defined(CCARDSTACK_TEST)
+
+// ========== minor CCardStack test
+#include <iostream>
+#include "CCardStack.hpp"
+#include "Cards.hpp"
+
+int main(){
+ CCardStack stack;
+ stack.PushTop( new Card_SDK_001());
+ stack.PushBottom(new Card_SDK_003());
+ stack.PushBottom(new Card_SDK_004());
+
+ std::cout << stack.Top()->GetName() << std::endl;
+ for(int i = 0; i < stack.Size(); ++i){
+ std::cout << stack[i]->GetName() << std::endl;
+ }
+ std::cout << stack.Bottom()->GetName() << std::endl;
+
+ stack.Shuffle();
+ std::cout << std::endl;
+
+ std::cout << stack.Top()->GetID() << std::endl;
+ for(int i = 0; i < stack.Size(); ++i){
+ IMonsterCard* ptr = dynamic_cast<IMonsterCard*>(stack[i]);
+ if(ptr == nullptr) continue; // Not a monster card
+ std::cout << ptr->GetAttributeString() << std::endl;
+ std::cout << ptr->GetTypeString() << std::endl;
+ }
+ std::cout << stack.Bottom()->GetID() << std::endl;
+}
+
+
+#endif