git repos / blockattack-game

blame: source/code/sago/SagoSpriteHolder.cpp

normal view · raw

82da8a1c sago007 2015-12-19 18:00 1
/*
47fef8e8 sago007 2016-11-24 21:37 2
Copyright (c) 2015 Poul Sander
82da8a1c sago007 2015-12-19 18:00 3
47fef8e8 sago007 2016-11-24 21:37 4
Permission is hereby granted, free of charge, to any person
47fef8e8 sago007 2016-11-24 21:37 5
obtaining a copy of this software and associated documentation files
47fef8e8 sago007 2016-11-24 21:37 6
(the "Software"), to deal in the Software without restriction,
47fef8e8 sago007 2016-11-24 21:37 7
including without limitation the rights to use, copy, modify, merge,
47fef8e8 sago007 2016-11-24 21:37 8
publish, distribute, sublicense, and/or sell copies of the Software,
47fef8e8 sago007 2016-11-24 21:37 9
and to permit persons to whom the Software is furnished to do so,
47fef8e8 sago007 2016-11-24 21:37 10
subject to the following conditions:
82da8a1c sago007 2015-12-19 18:00 11
47fef8e8 sago007 2016-11-24 21:37 12
The above copyright notice and this permission notice shall be
47fef8e8 sago007 2016-11-24 21:37 13
included in all copies or substantial portions of the Software.
82da8a1c sago007 2015-12-19 18:00 14
47fef8e8 sago007 2016-11-24 21:37 15
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
47fef8e8 sago007 2016-11-24 21:37 16
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
47fef8e8 sago007 2016-11-24 21:37 17
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
47fef8e8 sago007 2016-11-24 21:37 18
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
47fef8e8 sago007 2016-11-24 21:37 19
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
47fef8e8 sago007 2016-11-24 21:37 20
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
47fef8e8 sago007 2016-11-24 21:37 21
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
47fef8e8 sago007 2016-11-24 21:37 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>
98273512 sago007 2017-03-18 12:49 29
#include "rapidjson/document.h"
82da8a1c sago007 2015-12-19 18:00 30
#include <iostream>
82da8a1c sago007 2015-12-19 18:00 31
#include <string.h>
82da8a1c sago007 2015-12-19 18:00 32
#include <boost/algorithm/string/predicate.hpp>
82da8a1c sago007 2015-12-19 18:00 33
82da8a1c sago007 2015-12-19 18:00 34
82da8a1c sago007 2015-12-19 18:00 35
namespace sago {
82da8a1c sago007 2015-12-19 18:00 36
82da8a1c sago007 2015-12-19 18:00 37
struct SagoSpriteHolder::SagoSpriteHolderData {
82da8a1c sago007 2015-12-19 18:00 38
	const sago::SagoDataHolder* tex;
82da8a1c sago007 2015-12-19 18:00 39
	std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>> sprites;
82da8a1c sago007 2015-12-19 18:00 40
	const sago::SagoSprite* defaultSprite;
e0223883 sago007 2016-01-30 10:58 41
	bool verbose = false;
82da8a1c sago007 2015-12-19 18:00 42
};
82da8a1c sago007 2015-12-19 18:00 43
82da8a1c sago007 2015-12-19 18:00 44
SagoSpriteHolder::SagoSpriteHolder(const SagoDataHolder& texHolder) {
82da8a1c sago007 2015-12-19 18:00 45
	data = new SagoSpriteHolderData();
82da8a1c sago007 2015-12-19 18:00 46
	try {
82da8a1c sago007 2015-12-19 18:00 47
		data->tex = &texHolder;
82da8a1c sago007 2015-12-19 18:00 48
		ReadSprites();
82da8a1c sago007 2015-12-19 18:00 49
		data->defaultSprite = new sago::SagoSprite(texHolder,"fallback", {0,0,64,64},1,100);
82da8a1c sago007 2015-12-19 18:00 50
	}
82da8a1c sago007 2015-12-19 18:00 51
	catch (...) {
82da8a1c sago007 2015-12-19 18:00 52
		delete data;
82da8a1c sago007 2015-12-19 18:00 53
	}
82da8a1c sago007 2015-12-19 18:00 54
}
82da8a1c sago007 2015-12-19 18:00 55
82da8a1c sago007 2015-12-19 18:00 56
SagoSpriteHolder::~SagoSpriteHolder() {
82da8a1c sago007 2015-12-19 18:00 57
	delete data;
82da8a1c sago007 2015-12-19 18:00 58
}
82da8a1c sago007 2015-12-19 18:00 59
98273512 sago007 2017-03-18 12:49 60
static int getDefaultValue(const rapidjson::Value& value, const char* name, int defaultValue) {
98273512 sago007 2017-03-18 12:49 61
	assert(value.IsObject());
98273512 sago007 2017-03-18 12:49 62
	const auto& t = value.GetObject().FindMember(name);
55ea55dd sago007 2018-03-24 16:07 63
	if (t != value.MemberEnd() && t->value.IsInt()) {
98273512 sago007 2017-03-18 12:49 64
		return t->value.GetInt();
98273512 sago007 2017-03-18 12:49 65
	}
98273512 sago007 2017-03-18 12:49 66
	return defaultValue;
98273512 sago007 2017-03-18 12:49 67
}
98273512 sago007 2017-03-18 12:49 68
98273512 sago007 2017-03-18 12:49 69
static std::string getDefaultValue(const rapidjson::Value& value, const char* name, std::string defaultValue) {
98273512 sago007 2017-03-18 12:49 70
	assert(value.IsObject());
98273512 sago007 2017-03-18 12:49 71
	const auto& t = value.GetObject().FindMember(name);
d8a5a6f4 sago007 2018-03-26 13:47 72
	if (t != value.MemberEnd() && t->value.IsString()) {
98273512 sago007 2017-03-18 12:49 73
		defaultValue = t->value.GetString();
98273512 sago007 2017-03-18 12:49 74
	}
98273512 sago007 2017-03-18 12:49 75
	return defaultValue;
98273512 sago007 2017-03-18 12:49 76
}
98273512 sago007 2017-03-18 12:49 77
82da8a1c sago007 2015-12-19 18:00 78
void SagoSpriteHolder::ReadSpriteFile(const std::string& filename) {
c3cd4f49 Poul Sander 2020-08-08 17:25 79
	std::string fullfile = "sprites/"+filename;
c3cd4f49 Poul Sander 2020-08-08 17:25 80
	std::string content = sago::GetFileContent(fullfile.c_str());
98273512 sago007 2017-03-18 12:49 81
	rapidjson::Document document;
98273512 sago007 2017-03-18 12:49 82
	document.Parse(content.c_str());
98273512 sago007 2017-03-18 12:49 83
	if ( !document.IsObject() ) {
c3cd4f49 Poul Sander 2020-08-08 17:25 84
		std::cerr << "Failed to parse: " << fullfile << "\n";
82da8a1c sago007 2015-12-19 18:00 85
		return;
82da8a1c sago007 2015-12-19 18:00 86
	}
98273512 sago007 2017-03-18 12:49 87
	for (auto& m : document.GetObject()) {
98273512 sago007 2017-03-18 12:49 88
		const std::string& spriteName = m.name.GetString();
98273512 sago007 2017-03-18 12:49 89
		if (!m.value.IsObject()) {
6dcd75df sago007 2017-03-19 10:48 90
			if (spriteName[0] != '_') {
7c8588cd sago007 2017-01-08 13:39 91
				std::cerr << "Invalid sprite: " << spriteName << "\n";
7c8588cd sago007 2017-01-08 13:39 92
			}
7c8588cd sago007 2017-01-08 13:39 93
			continue;
7c8588cd sago007 2017-01-08 13:39 94
		}
c3cd4f49 Poul Sander 2020-08-08 17:25 95
		std::string textureName = getDefaultValue(m.value, "texture", "fallback");
98273512 sago007 2017-03-18 12:49 96
		int topx = getDefaultValue(m.value, "topx", 0);
98273512 sago007 2017-03-18 12:49 97
		int topy = getDefaultValue(m.value, "topy",0);
98273512 sago007 2017-03-18 12:49 98
		int height = getDefaultValue(m.value, "height",0);
98273512 sago007 2017-03-18 12:49 99
		int width = getDefaultValue(m.value, "width",0);
98273512 sago007 2017-03-18 12:49 100
		int number_of_frames = getDefaultValue(m.value, "number_of_frames",1);
98273512 sago007 2017-03-18 12:49 101
		int frame_time = getDefaultValue(m.value, "frame_time",1);
55ea55dd sago007 2018-03-24 16:07 102
		SDL_Rect origin = {};
55ea55dd sago007 2018-03-24 16:07 103
		origin.x = getDefaultValue(m.value, "originx",0);
55ea55dd sago007 2018-03-24 16:07 104
		origin.y = getDefaultValue(m.value, "originy",0);
82da8a1c sago007 2015-12-19 18:00 105
		if (number_of_frames < 1) {
82da8a1c sago007 2015-12-19 18:00 106
			number_of_frames = 1;
82da8a1c sago007 2015-12-19 18:00 107
		}
82da8a1c sago007 2015-12-19 18:00 108
		if (frame_time < 1) {
82da8a1c sago007 2015-12-19 18:00 109
			frame_time = 1;
82da8a1c sago007 2015-12-19 18:00 110
		}
82da8a1c sago007 2015-12-19 18:00 111
		std::shared_ptr<sago::SagoSprite> ptr(new SagoSprite(*(data->tex),textureName, {topx,topy,width,height},number_of_frames,frame_time));
55ea55dd sago007 2018-03-24 16:07 112
		ptr->SetOrigin(origin);
82da8a1c sago007 2015-12-19 18:00 113
		this->data->sprites[std::string(spriteName)] = ptr;
82da8a1c sago007 2015-12-19 18:00 114
	}
82da8a1c sago007 2015-12-19 18:00 115
}
82da8a1c sago007 2015-12-19 18:00 116
82da8a1c sago007 2015-12-19 18:00 117
void SagoSpriteHolder::ReadSprites() {
82da8a1c sago007 2015-12-19 18:00 118
	std::vector<std::string> spritefiles = GetFileList("sprites");
82da8a1c sago007 2015-12-19 18:00 119
	for (std::string& item : spritefiles  ) {
82da8a1c sago007 2015-12-19 18:00 120
		if (boost::algorithm::ends_with(item,".sprite")) {
e0223883 sago007 2016-01-30 10:58 121
			if (data->verbose) {
c3cd4f49 Poul Sander 2020-08-08 17:25 122
				std::cout << "Found " << item << "\n";
e0223883 sago007 2016-01-30 10:58 123
			}
82da8a1c sago007 2015-12-19 18:00 124
			ReadSpriteFile(item);
82da8a1c sago007 2015-12-19 18:00 125
		}
82da8a1c sago007 2015-12-19 18:00 126
		else {
e0223883 sago007 2016-01-30 10:58 127
			if (data->verbose) {
c3cd4f49 Poul Sander 2020-08-08 17:25 128
				std::cout << "Ignoreing " << item << "\n";
e0223883 sago007 2016-01-30 10:58 129
			}
82da8a1c sago007 2015-12-19 18:00 130
		}
82da8a1c sago007 2015-12-19 18:00 131
	}
82da8a1c sago007 2015-12-19 18:00 132
}
82da8a1c sago007 2015-12-19 18:00 133
3affd2d6 Poul Sander 2020-12-27 15:56 134
void SagoSpriteHolder::ReadSprites(const std::vector<std::string>& extra_sprites) {
3affd2d6 Poul Sander 2020-12-27 15:56 135
	for (std::string item : extra_sprites) {
3affd2d6 Poul Sander 2020-12-27 15:56 136
		item+=".sprite";
3affd2d6 Poul Sander 2020-12-27 15:56 137
		ReadSpriteFile(item);
3affd2d6 Poul Sander 2020-12-27 15:56 138
	}
3affd2d6 Poul Sander 2020-12-27 15:56 139
}
3affd2d6 Poul Sander 2020-12-27 15:56 140
82da8a1c sago007 2015-12-19 18:00 141
const sago::SagoSprite& SagoSpriteHolder::GetSprite(const std::string& spritename) const {
82da8a1c sago007 2015-12-19 18:00 142
	std::unordered_map<std::string,std::shared_ptr<sago::SagoSprite>>::const_iterator got = data->sprites.find (spritename);
82da8a1c sago007 2015-12-19 18:00 143
	if ( got == data->sprites.end() ) {
82da8a1c sago007 2015-12-19 18:00 144
		return *data->defaultSprite;
82da8a1c sago007 2015-12-19 18:00 145
	}
82da8a1c sago007 2015-12-19 18:00 146
	else {
82da8a1c sago007 2015-12-19 18:00 147
		return *(got->second);
82da8a1c sago007 2015-12-19 18:00 148
	}
82da8a1c sago007 2015-12-19 18:00 149
}
82da8a1c sago007 2015-12-19 18:00 150
5b5139a9 Poul Sander 2024-02-21 20:32 151
82da8a1c sago007 2015-12-19 18:00 152
const SagoDataHolder& SagoSpriteHolder::GetDataHolder() const {
82da8a1c sago007 2015-12-19 18:00 153
	return *data->tex;
82da8a1c sago007 2015-12-19 18:00 154
}
82da8a1c sago007 2015-12-19 18:00 155
b81f58ad sago007 2015-12-25 22:48 156
}
1970-01-01 00:00 157