git repos / blockattack-game

blame: source/code/sago/SagoSpriteHolder.cpp

normal view · raw

82da8a1c sago007 2015-12-19 18:00 1
/*
82da8a1c sago007 2015-12-19 18:00 2
  Copyright (c) 2015 Poul Sander
82da8a1c sago007 2015-12-19 18:00 3
82da8a1c sago007 2015-12-19 18:00 4
  Permission is hereby granted, free of charge, to any person
82da8a1c sago007 2015-12-19 18:00 5
  obtaining a copy of this software and associated documentation files
82da8a1c sago007 2015-12-19 18:00 6
  (the "Software"), to deal in the Software without restriction,
82da8a1c sago007 2015-12-19 18:00 7
  including without limitation the rights to use, copy, modify, merge,
82da8a1c sago007 2015-12-19 18:00 8
  publish, distribute, sublicense, and/or sell copies of the Software,
82da8a1c sago007 2015-12-19 18:00 9
  and to permit persons to whom the Software is furnished to do so,
82da8a1c sago007 2015-12-19 18:00 10
  subject to the following conditions:
82da8a1c sago007 2015-12-19 18:00 11
82da8a1c sago007 2015-12-19 18:00 12
  The above copyright notice and this permission notice shall be
82da8a1c sago007 2015-12-19 18:00 13
  included in all copies or substantial portions of the Software.
82da8a1c sago007 2015-12-19 18:00 14
82da8a1c sago007 2015-12-19 18:00 15
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
82da8a1c sago007 2015-12-19 18:00 16
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
82da8a1c sago007 2015-12-19 18:00 17
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
82da8a1c sago007 2015-12-19 18:00 18
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
82da8a1c sago007 2015-12-19 18:00 19
  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
82da8a1c sago007 2015-12-19 18:00 20
  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
82da8a1c sago007 2015-12-19 18:00 21
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
82da8a1c sago007 2015-12-19 18:00 22
  SOFTWARE.
82da8a1c sago007 2015-12-19 18:00 23
*/
82da8a1c sago007 2015-12-19 18:00 24
82da8a1c sago007 2015-12-19 18:00 25
#include "SagoSpriteHolder.hpp"
82da8a1c sago007 2015-12-19 18:00 26
#include "SagoMisc.hpp"
82da8a1c sago007 2015-12-19 18:00 27
#include <memory>
82da8a1c sago007 2015-12-19 18:00 28
#include <unordered_map>
b81f58ad sago007 2015-12-25 22:48 29
#ifndef _WIN32
82da8a1c sago007 2015-12-19 18:00 30
#include <jsoncpp/json/json.h>
b81f58ad sago007 2015-12-25 22:48 31
#else
b81f58ad sago007 2015-12-25 22:48 32
#include <json/json.h>
b81f58ad sago007 2015-12-25 22:48 33
#endif
82da8a1c sago007 2015-12-19 18:00 34
#include <iostream>
82da8a1c sago007 2015-12-19 18:00 35
#include <string.h>
82da8a1c sago007 2015-12-19 18:00 36
#include <boost/algorithm/string/predicate.hpp>
82da8a1c sago007 2015-12-19 18:00 37
82da8a1c sago007 2015-12-19 18:00 38
82da8a1c sago007 2015-12-19 18:00 39
//I truely hate the C way of checking for equal. Usually read: "if not X compares to Y then they must be equal"
82da8a1c sago007 2015-12-19 18:00 40
#define strequal(X,Y) strcmp(X,Y)==0
82da8a1c sago007 2015-12-19 18:00 41
96eb7a16 sago007 2016-04-29 17:01 42
using std::string;
96eb7a16 sago007 2016-04-29 17:01 43
using std::cerr;
96eb7a16 sago007 2016-04-29 17:01 44
using std::cout;
96eb7a16 sago007 2016-04-29 17:01 45
using std::endl;
96eb7a16 sago007 2016-04-29 17:01 46
using std::vector;
82da8a1c sago007 2015-12-19 18:00 47
82da8a1c sago007 2015-12-19 18:00 48
namespace sago {
82da8a1c sago007 2015-12-19 18:00 49
82da8a1c sago007 2015-12-19 18:00 50
struct SagoSpriteHolder::SagoSpriteHolderData {
82da8a1c sago007 2015-12-19 18:00 51
	const sago::SagoDataHolder* tex;
82da8a1c sago007 2015-12-19 18:00 52
	std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>> sprites;
82da8a1c sago007 2015-12-19 18:00 53
	const sago::SagoSprite* defaultSprite;
e0223883 sago007 2016-01-30 10:58 54
	bool verbose = false;
82da8a1c sago007 2015-12-19 18:00 55
};
82da8a1c sago007 2015-12-19 18:00 56
82da8a1c sago007 2015-12-19 18:00 57
SagoSpriteHolder::SagoSpriteHolder(const SagoDataHolder& texHolder) {
82da8a1c sago007 2015-12-19 18:00 58
	data = new SagoSpriteHolderData();
82da8a1c sago007 2015-12-19 18:00 59
	try {
82da8a1c sago007 2015-12-19 18:00 60
		data->tex = &texHolder;
82da8a1c sago007 2015-12-19 18:00 61
		ReadSprites();
82da8a1c sago007 2015-12-19 18:00 62
		data->defaultSprite = new sago::SagoSprite(texHolder,"fallback", {0,0,64,64},1,100);
82da8a1c sago007 2015-12-19 18:00 63
	}
82da8a1c sago007 2015-12-19 18:00 64
	catch (...) {
82da8a1c sago007 2015-12-19 18:00 65
		delete data;
82da8a1c sago007 2015-12-19 18:00 66
	}
82da8a1c sago007 2015-12-19 18:00 67
}
82da8a1c sago007 2015-12-19 18:00 68
82da8a1c sago007 2015-12-19 18:00 69
SagoSpriteHolder::~SagoSpriteHolder() {
82da8a1c sago007 2015-12-19 18:00 70
	delete data;
82da8a1c sago007 2015-12-19 18:00 71
}
82da8a1c sago007 2015-12-19 18:00 72
82da8a1c sago007 2015-12-19 18:00 73
void SagoSpriteHolder::ReadSpriteFile(const std::string& filename) {
82da8a1c sago007 2015-12-19 18:00 74
	string fullfile = "sprites/"+filename;
82da8a1c sago007 2015-12-19 18:00 75
	string content = sago::GetFileContent(fullfile.c_str());
82da8a1c sago007 2015-12-19 18:00 76
	Json::Value root;   // will contains the root value after parsing
82da8a1c sago007 2015-12-19 18:00 77
	Json::Reader reader;
82da8a1c sago007 2015-12-19 18:00 78
	bool parsingSuccessful = reader.parse( content, root );
82da8a1c sago007 2015-12-19 18:00 79
	if ( !parsingSuccessful ) {
82da8a1c sago007 2015-12-19 18:00 80
		cerr << "Failed to parse: " << fullfile << endl
82da8a1c sago007 2015-12-19 18:00 81
		     << reader.getFormattedErrorMessages() << endl;
82da8a1c sago007 2015-12-19 18:00 82
		return;
82da8a1c sago007 2015-12-19 18:00 83
	}
82da8a1c sago007 2015-12-19 18:00 84
	for (Json::Value::iterator it = root.begin(); it != root.end() ; ++it) {
82da8a1c sago007 2015-12-19 18:00 85
		string spriteName = it.key().asString();
82da8a1c sago007 2015-12-19 18:00 86
		Json::Value value = (*it);
82da8a1c sago007 2015-12-19 18:00 87
		string textureName = value.get("texture","fallback").asString();
82da8a1c sago007 2015-12-19 18:00 88
		int topx = value.get("topx",0).asInt();
82da8a1c sago007 2015-12-19 18:00 89
		int topy = value.get("topy",0).asInt();
82da8a1c sago007 2015-12-19 18:00 90
		int height = value.get("height",0).asInt();
82da8a1c sago007 2015-12-19 18:00 91
		int width = value.get("width",0).asInt();
82da8a1c sago007 2015-12-19 18:00 92
		int number_of_frames = value.get("number_of_frames",1).asInt();
82da8a1c sago007 2015-12-19 18:00 93
		int frame_time = value.get("frame_time",1).asInt();
82da8a1c sago007 2015-12-19 18:00 94
		int originx = value.get("originx",0).asInt();
82da8a1c sago007 2015-12-19 18:00 95
		int originy = value.get("originy",0).asInt();
82da8a1c sago007 2015-12-19 18:00 96
		if (number_of_frames < 1) {
82da8a1c sago007 2015-12-19 18:00 97
			number_of_frames = 1;
82da8a1c sago007 2015-12-19 18:00 98
		}
82da8a1c sago007 2015-12-19 18:00 99
		if (frame_time < 1) {
82da8a1c sago007 2015-12-19 18:00 100
			frame_time = 1;
82da8a1c sago007 2015-12-19 18:00 101
		}
82da8a1c sago007 2015-12-19 18:00 102
		std::shared_ptr<sago::SagoSprite> ptr(new SagoSprite(*(data->tex),textureName, {topx,topy,width,height},number_of_frames,frame_time));
82da8a1c sago007 2015-12-19 18:00 103
		ptr->SetOrigin({originx,originy, 0, 0});
82da8a1c sago007 2015-12-19 18:00 104
		this->data->sprites[std::string(spriteName)] = ptr;
82da8a1c sago007 2015-12-19 18:00 105
	}
82da8a1c sago007 2015-12-19 18:00 106
}
82da8a1c sago007 2015-12-19 18:00 107
82da8a1c sago007 2015-12-19 18:00 108
void SagoSpriteHolder::ReadSprites() {
82da8a1c sago007 2015-12-19 18:00 109
	std::vector<std::string> spritefiles = GetFileList("sprites");
82da8a1c sago007 2015-12-19 18:00 110
	for (std::string& item : spritefiles  ) {
82da8a1c sago007 2015-12-19 18:00 111
		if (boost::algorithm::ends_with(item,".sprite")) {
e0223883 sago007 2016-01-30 10:58 112
			if (data->verbose) {
e0223883 sago007 2016-01-30 10:58 113
				cout << "Found " << item << endl;
e0223883 sago007 2016-01-30 10:58 114
			}
82da8a1c sago007 2015-12-19 18:00 115
			ReadSpriteFile(item);
82da8a1c sago007 2015-12-19 18:00 116
		}
82da8a1c sago007 2015-12-19 18:00 117
		else {
e0223883 sago007 2016-01-30 10:58 118
			if (data->verbose) {
e0223883 sago007 2016-01-30 10:58 119
				cout << "Ignoreing " << item << endl;
e0223883 sago007 2016-01-30 10:58 120
			}
82da8a1c sago007 2015-12-19 18:00 121
		}
82da8a1c sago007 2015-12-19 18:00 122
	}
82da8a1c sago007 2015-12-19 18:00 123
}
82da8a1c sago007 2015-12-19 18:00 124
82da8a1c sago007 2015-12-19 18:00 125
const sago::SagoSprite& SagoSpriteHolder::GetSprite(const std::string& spritename) const {
82da8a1c sago007 2015-12-19 18:00 126
	std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>::const_iterator got = data->sprites.find (spritename);
82da8a1c sago007 2015-12-19 18:00 127
	if ( got == data->sprites.end() ) {
82da8a1c sago007 2015-12-19 18:00 128
		return *data->defaultSprite;
82da8a1c sago007 2015-12-19 18:00 129
	}
82da8a1c sago007 2015-12-19 18:00 130
	else {
82da8a1c sago007 2015-12-19 18:00 131
		return *(got->second);
82da8a1c sago007 2015-12-19 18:00 132
	}
82da8a1c sago007 2015-12-19 18:00 133
}
82da8a1c sago007 2015-12-19 18:00 134
82da8a1c sago007 2015-12-19 18:00 135
const SagoDataHolder& SagoSpriteHolder::GetDataHolder() const {
82da8a1c sago007 2015-12-19 18:00 136
	return *data->tex;
82da8a1c sago007 2015-12-19 18:00 137
}
82da8a1c sago007 2015-12-19 18:00 138
b81f58ad sago007 2015-12-25 22:48 139
}
1970-01-01 00:00 140