diff options
author | milo24x7@gmail.com <milo24x7@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544> | 2013-07-07 22:08:49 +0000 |
---|---|---|
committer | milo24x7@gmail.com <milo24x7@gmail.com@076cb2c4-205e-83fd-5cf3-1be9aa105544> | 2013-07-07 22:08:49 +0000 |
commit | d17521c8b9085a91d08fecfd0b51bbbf7b1dccac (patch) | |
tree | 4673104b47dc68a079cac9f94deefd48dfcb66fa /Stars45/ModInfo.cpp | |
parent | 1de4b2bdbb019be6f1b7262c3eba5568d7682edd (diff) | |
download | starshatter-d17521c8b9085a91d08fecfd0b51bbbf7b1dccac.zip starshatter-d17521c8b9085a91d08fecfd0b51bbbf7b1dccac.tar.gz starshatter-d17521c8b9085a91d08fecfd0b51bbbf7b1dccac.tar.bz2 |
Updated open source license declaration and fixed some formatting issues.
Diffstat (limited to 'Stars45/ModInfo.cpp')
-rw-r--r-- | Stars45/ModInfo.cpp | 608 |
1 files changed, 316 insertions, 292 deletions
diff --git a/Stars45/ModInfo.cpp b/Stars45/ModInfo.cpp index b667a35..5d15173 100644 --- a/Stars45/ModInfo.cpp +++ b/Stars45/ModInfo.cpp @@ -1,292 +1,316 @@ -/* Project Starshatter 4.5
- Destroyer Studios LLC
- Copyright © 1997-2004. All Rights Reserved.
-
- SUBSYSTEM: Stars.exe
- FILE: ModInfo.cpp
- AUTHOR: John DiCamillo
-
-
- OVERVIEW
- ========
- Information block for describing and deploying third party mods
-*/
-
-
-#include "MemDebug.h"
-#include "ModInfo.h"
-#include "Campaign.h"
-#include "ShipDesign.h"
-#include "ParseUtil.h"
-
-#include "Archive.h"
-#include "DataLoader.h"
-#include "PCX.h"
-#include "Bitmap.h"
-
-// +-------------------------------------------------------------------+
-
-ModInfo::ModInfo()
-: logo(0), distribute(false), enabled(false), catalog(0)
-{ }
-
-ModInfo::ModInfo(const char* fname)
-: logo(0), distribute(false), enabled(false), catalog(0)
-{
- if (fname && *fname) {
- Load(fname);
- }
-}
-
-ModInfo::ModInfo(const char* n, const char* v, const char* u)
-: name(n), logo(0), version(v), url(u), distribute(false), enabled(false), catalog(0)
-{ }
-
-ModInfo::~ModInfo()
-{
- if (enabled)
- Disable();
-
- delete logo;
- delete catalog;
- campaigns.destroy();
-}
-
-// +-------------------------------------------------------------------+
-
-bool
-ModInfo::Load(const char* fname)
-{
- bool ok = false;
-
- filename = fname;
- DataArchive a(filename);
-
- int n = a.FindEntry("mod_info.def");
- if (n > -1) {
- BYTE* buf = 0;
- int len = a.ExpandEntry(n, buf, true);
-
- if (len > 0 && buf != 0) {
- ok = ParseModInfo((const char*) buf);
- delete [] buf;
- }
- }
-
- if (logoname.length()) {
- PcxImage pcx;
-
- logo = new(__FILE__,__LINE__) Bitmap;
-
- n = a.FindEntry(logoname);
- if (n > -1) {
- BYTE* buf = 0;
- int len = a.ExpandEntry(n, buf, true);
-
- pcx.LoadBuffer(buf, len);
- delete [] buf;
- }
-
- // now copy the image into the bitmap:
- if (pcx.bitmap) {
- logo->CopyImage(pcx.width, pcx.height, pcx.bitmap);
- }
-
- else if (pcx.himap) {
- logo->CopyHighColorImage(pcx.width, pcx.height, pcx.himap);
- }
-
- else {
- logo->ClearImage();
- }
- }
-
- return ok;
-}
-
-bool
-ModInfo::ParseModInfo(const char* block)
-{
- bool ok = false;
- Parser parser(new(__FILE__,__LINE__) BlockReader(block));
- Term* term = parser.ParseTerm();
-
- if (!term) {
- Print("ERROR: could not parse '%s'\n", filename.data());
- return ok;
- }
- else {
- TermText* file_type = term->isText();
- if (!file_type || file_type->value() != "MOD_INFO") {
- Print("ERROR: invalid mod_info file '%s'\n", filename.data());
- term->print(10);
- return ok;
- }
- }
-
- ok = true;
-
- do {
- delete term; term = 0;
- term = parser.ParseTerm();
-
- if (term) {
- TermDef* def = term->isDef();
- if (def) {
- Text defname = def->name()->value();
-
- if (defname == "name")
- GetDefText(name, def, filename);
-
- else if (defname == "desc" || defname == "description")
- GetDefText(desc, def, filename);
-
- else if (defname == "author")
- GetDefText(author, def, filename);
-
- else if (defname == "url")
- GetDefText(url, def, filename);
-
- else if (defname == "copyright")
- GetDefText(copyright, def, filename);
-
- else if (defname == "logo")
- GetDefText(logoname, def, filename);
-
- else if (defname == "version") {
- if (def->term()) {
- if (def->term()->isNumber()) {
- int v = 0;
- char buf[32];
- GetDefNumber(v, def, filename);
- sprintf_s(buf, "%d", v);
-
- version = buf;
- }
-
- else if (def->term()->isText()) {
- GetDefText(version, def, filename);
- }
- }
- }
-
- else if (defname == "distribute")
- GetDefBool(distribute, def, filename);
-
- else if (defname == "campaign") {
- if (!def->term() || !def->term()->isStruct()) {
- Print("WARNING: campaign structure missing in mod_info.def for '%s'\n", name.data());
- }
- else {
- TermStruct* val = def->term()->isStruct();
-
- ModCampaign* c = new(__FILE__,__LINE__) ModCampaign;
-
- for (int i = 0; i < val->elements()->size(); i++) {
- TermDef* pdef = val->elements()->at(i)->isDef();
- if (pdef) {
- defname = pdef->name()->value();
-
- if (defname == "name") {
- GetDefText(c->name, pdef, filename);
- }
-
- else if (defname == "path") {
- GetDefText(c->path, pdef, filename);
- }
-
- else if (defname == "dynamic") {
- GetDefBool(c->dynamic, pdef, filename);
- }
- }
- }
-
- if (c->name.length() && c->path.length())
- campaigns.append(c);
- else
- delete c;
- }
- }
-
- else if (defname == "catalog") {
- if (!def->term() || !def->term()->isStruct()) {
- Print("WARNING: catalog structure missing in mod_info.def for '%s'\n", name.data());
- }
- else {
- TermStruct* val = def->term()->isStruct();
-
- ModCatalog* c = new(__FILE__,__LINE__) ModCatalog;
-
- for (int i = 0; i < val->elements()->size(); i++) {
- TermDef* pdef = val->elements()->at(i)->isDef();
- if (pdef) {
- defname = pdef->name()->value();
-
- if (defname == "file") {
- GetDefText(c->file, pdef, filename);
- }
-
- else if (defname == "path") {
- GetDefText(c->path, pdef, filename);
-
- char last_char = c->path[c->path.length()-1];
-
- if (last_char != '/' && last_char != '\\')
- c->path += "/";
- }
- }
- }
-
- if (c->file.length() && c->path.length() && !catalog)
- catalog = c;
- else
- delete c;
- }
- }
- } // def
- } // term
- }
- while (term);
-
- return ok;
-}
-
-// +-------------------------------------------------------------------+
-
-bool
-ModInfo::Enable()
-{
- DataLoader* loader = DataLoader::GetLoader();
-
- if (loader && !enabled) {
- loader->EnableDatafile(filename);
- enabled = true;
-
- if (catalog)
- ShipDesign::LoadCatalog(catalog->Path(), catalog->File(), true);
-
- ShipDesign::LoadSkins("/Mods/Skins/", filename);
-
- for (int i = 0; i < campaigns.size(); i++) {
- ModCampaign* c = campaigns[i];
- Campaign::CreateCustomCampaign(c->Name(), c->Path());
- }
- }
-
- return enabled;
-}
-
-bool
-ModInfo::Disable()
-{
- DataLoader* loader = DataLoader::GetLoader();
-
- if (loader) {
- loader->DisableDatafile(filename);
- enabled = false;
- }
-
- return !enabled;
-}
-
-// +-------------------------------------------------------------------+
+/* Starshatter OpenSource Distribution + Copyright (c) 1997-2004, Destroyer Studios LLC. + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name "Destroyer Studios" nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + SUBSYSTEM: Stars.exe + FILE: ModInfo.cpp + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Information block for describing and deploying third party mods +*/ + + +#include "MemDebug.h" +#include "ModInfo.h" +#include "Campaign.h" +#include "ShipDesign.h" +#include "ParseUtil.h" + +#include "Archive.h" +#include "DataLoader.h" +#include "PCX.h" +#include "Bitmap.h" + +// +-------------------------------------------------------------------+ + +ModInfo::ModInfo() +: logo(0), distribute(false), enabled(false), catalog(0) +{ } + +ModInfo::ModInfo(const char* fname) +: logo(0), distribute(false), enabled(false), catalog(0) +{ + if (fname && *fname) { + Load(fname); + } +} + +ModInfo::ModInfo(const char* n, const char* v, const char* u) +: name(n), logo(0), version(v), url(u), distribute(false), enabled(false), catalog(0) +{ } + +ModInfo::~ModInfo() +{ + if (enabled) + Disable(); + + delete logo; + delete catalog; + campaigns.destroy(); +} + +// +-------------------------------------------------------------------+ + +bool +ModInfo::Load(const char* fname) +{ + bool ok = false; + + filename = fname; + DataArchive a(filename); + + int n = a.FindEntry("mod_info.def"); + if (n > -1) { + BYTE* buf = 0; + int len = a.ExpandEntry(n, buf, true); + + if (len > 0 && buf != 0) { + ok = ParseModInfo((const char*) buf); + delete [] buf; + } + } + + if (logoname.length()) { + PcxImage pcx; + + logo = new(__FILE__,__LINE__) Bitmap; + + n = a.FindEntry(logoname); + if (n > -1) { + BYTE* buf = 0; + int len = a.ExpandEntry(n, buf, true); + + pcx.LoadBuffer(buf, len); + delete [] buf; + } + + // now copy the image into the bitmap: + if (pcx.bitmap) { + logo->CopyImage(pcx.width, pcx.height, pcx.bitmap); + } + + else if (pcx.himap) { + logo->CopyHighColorImage(pcx.width, pcx.height, pcx.himap); + } + + else { + logo->ClearImage(); + } + } + + return ok; +} + +bool +ModInfo::ParseModInfo(const char* block) +{ + bool ok = false; + Parser parser(new(__FILE__,__LINE__) BlockReader(block)); + Term* term = parser.ParseTerm(); + + if (!term) { + Print("ERROR: could not parse '%s'\n", filename.data()); + return ok; + } + else { + TermText* file_type = term->isText(); + if (!file_type || file_type->value() != "MOD_INFO") { + Print("ERROR: invalid mod_info file '%s'\n", filename.data()); + term->print(10); + return ok; + } + } + + ok = true; + + do { + delete term; term = 0; + term = parser.ParseTerm(); + + if (term) { + TermDef* def = term->isDef(); + if (def) { + Text defname = def->name()->value(); + + if (defname == "name") + GetDefText(name, def, filename); + + else if (defname == "desc" || defname == "description") + GetDefText(desc, def, filename); + + else if (defname == "author") + GetDefText(author, def, filename); + + else if (defname == "url") + GetDefText(url, def, filename); + + else if (defname == "copyright") + GetDefText(copyright, def, filename); + + else if (defname == "logo") + GetDefText(logoname, def, filename); + + else if (defname == "version") { + if (def->term()) { + if (def->term()->isNumber()) { + int v = 0; + char buf[32]; + GetDefNumber(v, def, filename); + sprintf_s(buf, "%d", v); + + version = buf; + } + + else if (def->term()->isText()) { + GetDefText(version, def, filename); + } + } + } + + else if (defname == "distribute") + GetDefBool(distribute, def, filename); + + else if (defname == "campaign") { + if (!def->term() || !def->term()->isStruct()) { + Print("WARNING: campaign structure missing in mod_info.def for '%s'\n", name.data()); + } + else { + TermStruct* val = def->term()->isStruct(); + + ModCampaign* c = new(__FILE__,__LINE__) ModCampaign; + + for (int i = 0; i < val->elements()->size(); i++) { + TermDef* pdef = val->elements()->at(i)->isDef(); + if (pdef) { + defname = pdef->name()->value(); + + if (defname == "name") { + GetDefText(c->name, pdef, filename); + } + + else if (defname == "path") { + GetDefText(c->path, pdef, filename); + } + + else if (defname == "dynamic") { + GetDefBool(c->dynamic, pdef, filename); + } + } + } + + if (c->name.length() && c->path.length()) + campaigns.append(c); + else + delete c; + } + } + + else if (defname == "catalog") { + if (!def->term() || !def->term()->isStruct()) { + Print("WARNING: catalog structure missing in mod_info.def for '%s'\n", name.data()); + } + else { + TermStruct* val = def->term()->isStruct(); + + ModCatalog* c = new(__FILE__,__LINE__) ModCatalog; + + for (int i = 0; i < val->elements()->size(); i++) { + TermDef* pdef = val->elements()->at(i)->isDef(); + if (pdef) { + defname = pdef->name()->value(); + + if (defname == "file") { + GetDefText(c->file, pdef, filename); + } + + else if (defname == "path") { + GetDefText(c->path, pdef, filename); + + char last_char = c->path[c->path.length()-1]; + + if (last_char != '/' && last_char != '\\') + c->path += "/"; + } + } + } + + if (c->file.length() && c->path.length() && !catalog) + catalog = c; + else + delete c; + } + } + } // def + } // term + } + while (term); + + return ok; +} + +// +-------------------------------------------------------------------+ + +bool +ModInfo::Enable() +{ + DataLoader* loader = DataLoader::GetLoader(); + + if (loader && !enabled) { + loader->EnableDatafile(filename); + enabled = true; + + if (catalog) + ShipDesign::LoadCatalog(catalog->Path(), catalog->File(), true); + + ShipDesign::LoadSkins("/Mods/Skins/", filename); + + for (int i = 0; i < campaigns.size(); i++) { + ModCampaign* c = campaigns[i]; + Campaign::CreateCustomCampaign(c->Name(), c->Path()); + } + } + + return enabled; +} + +bool +ModInfo::Disable() +{ + DataLoader* loader = DataLoader::GetLoader(); + + if (loader) { + loader->DisableDatafile(filename); + enabled = false; + } + + return !enabled; +} + +// +-------------------------------------------------------------------+ |