← Back to team overview

millennium-dev team mailing list archive

[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