30 |
#include "objects.hh" |
#include "objects.hh" |
31 |
#include "world.hh" |
#include "world.hh" |
32 |
#include "display.hh" |
#include "display.hh" |
33 |
|
#include "system.hh" |
34 |
|
|
35 |
#include "oxydlib/DatFile.h" |
#include "oxydlib/DatFile.h" |
36 |
#include "oxydlib/FileUtils.h" |
#include "oxydlib/FileUtils.h" |
58 |
{ |
{ |
59 |
class LevelPack_Oxyd : public LevelPack { |
class LevelPack_Oxyd : public LevelPack { |
60 |
public: |
public: |
61 |
LevelPack_Oxyd (OxydVersion ver, DatFile *dat, int idx_start, int idx_end); |
LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, int idx_start, int idx_end); |
62 |
|
|
63 |
// LevelPack interface |
// LevelPack interface |
64 |
virtual string get_name() const; |
virtual string get_name() const; |
67 |
bool load_level (size_t index); |
bool load_level (size_t index); |
68 |
|
|
69 |
LevelInfo *get_info (size_t index); |
LevelInfo *get_info (size_t index); |
70 |
|
|
71 |
|
time_t get_modtime(size_t /*index*/) { // filedate of levelpack |
72 |
|
return m_created; |
73 |
|
} |
74 |
|
|
75 |
protected: |
protected: |
76 |
/* Conversion tables from Oxyd bytecodes to Enigma object names. */ |
/* Conversion tables from Oxyd bytecodes to Enigma object names. */ |
77 |
enigma_mapping::Mapping m_mapping; |
enigma_mapping::Mapping m_mapping; |
92 |
// Variables |
// Variables |
93 |
OxydVersion m_version; |
OxydVersion m_version; |
94 |
DatFile *m_datfile; |
DatFile *m_datfile; |
95 |
|
time_t m_created; // creation date of datafile |
96 |
Level *m_level; // Level currently being loaded |
Level *m_level; // Level currently being loaded |
97 |
|
|
98 |
int level_index[200]; |
int level_index[200]; |
100 |
}; |
}; |
101 |
} |
} |
102 |
|
|
103 |
LevelPack_Oxyd::LevelPack_Oxyd (OxydVersion ver, DatFile *dat, |
LevelPack_Oxyd::LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, |
104 |
int idx_start, int idx_end) |
int idx_start, int idx_end) |
105 |
: m_mapping(ver) |
: m_mapping(ver) |
106 |
, m_version(ver) |
, m_version(ver) |
107 |
, m_datfile(dat) |
, m_datfile(dat) |
108 |
|
, m_created(created) |
109 |
{ |
{ |
110 |
string msg; |
string msg; |
111 |
Level level; |
Level level; |
392 |
Stone *make_stone (int type, int x, int y); |
Stone *make_stone (int type, int x, int y); |
393 |
Item *LP_Oxyd1::make_item (int type); |
Item *LP_Oxyd1::make_item (int type); |
394 |
public: |
public: |
395 |
LP_Oxyd1 (DatFile *dat, bool twoplayers); |
LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers); |
396 |
}; |
}; |
397 |
|
|
398 |
// class LP_OxydExtra : public LevelPack_Oxyd { |
// class LP_OxydExtra : public LevelPack_Oxyd { |
400 |
// }; |
// }; |
401 |
} |
} |
402 |
|
|
403 |
LP_Oxyd1::LP_Oxyd1 (DatFile *dat, bool twoplayers) |
LP_Oxyd1::LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers) |
404 |
: LevelPack_Oxyd (OxydVersion_Oxyd1, dat, |
: LevelPack_Oxyd (OxydVersion_Oxyd1, dat, created, |
405 |
twoplayers ? 100 : 0, |
twoplayers ? 100 : 0, |
406 |
twoplayers ? 199 : 99) |
twoplayers ? 199 : 99) |
407 |
{ |
{ |
408 |
} |
} |
409 |
|
|
470 |
class LP_PerOxyd : public LevelPack_Oxyd { |
class LP_PerOxyd : public LevelPack_Oxyd { |
471 |
Stone *make_stone (int type, int x, int y); |
Stone *make_stone (int type, int x, int y); |
472 |
public: |
public: |
473 |
LP_PerOxyd (DatFile *dat, bool twoplayers); |
LP_PerOxyd (DatFile *dat, time_t created, bool twoplayers); |
474 |
|
|
475 |
}; |
}; |
476 |
} |
} |
477 |
|
|
478 |
LP_PerOxyd::LP_PerOxyd (DatFile *dat, bool twoplayers) |
LP_PerOxyd::LP_PerOxyd (DatFile *dat, time_t created, bool twoplayers) |
479 |
: LevelPack_Oxyd (OxydVersion_PerOxyd, dat, |
: LevelPack_Oxyd (OxydVersion_PerOxyd, dat, created, |
480 |
twoplayers ? 100 : 0, |
twoplayers ? 100 : 0, |
481 |
twoplayers ? 199 : 99) |
twoplayers ? 199 : 99) |
482 |
{ |
{ |
483 |
} |
} |
484 |
|
|
508 |
class LP_OxydMagnum : public LevelPack_Oxyd { |
class LP_OxydMagnum : public LevelPack_Oxyd { |
509 |
Stone *make_stone (int type, int x, int y); |
Stone *make_stone (int type, int x, int y); |
510 |
public: |
public: |
511 |
LP_OxydMagnum(OxydVersion, DatFile *dat); |
LP_OxydMagnum(OxydVersion, DatFile *dat, time_t created); |
512 |
}; |
}; |
513 |
} |
} |
514 |
|
|
515 |
LP_OxydMagnum::LP_OxydMagnum(OxydVersion version, DatFile *dat) |
LP_OxydMagnum::LP_OxydMagnum(OxydVersion version, DatFile *dat, time_t created) |
516 |
: LevelPack_Oxyd (version, dat, 0, OxydVersion_OxydMagnumGold ? 120 : 99) |
: LevelPack_Oxyd (version, dat, created, 0, OxydVersion_OxydMagnumGold ? 120 : 99) |
517 |
{ |
{ |
518 |
} |
} |
519 |
|
|
578 |
|
|
579 |
namespace |
namespace |
580 |
{ |
{ |
581 |
struct GameInfo { |
class GameInfo { |
582 |
|
public: |
583 |
GameInfo(); |
GameInfo(); |
584 |
GameInfo (const string &game_, const string &datfile_); |
GameInfo (const string &game_, const string &datfile_); |
585 |
|
|
586 |
|
bool isPresent() const { return is_present; } |
587 |
|
const string& datfilePath() const { return datfile_path; } |
588 |
|
time_t getModTime() const { return modified; } |
589 |
|
|
590 |
|
private: |
591 |
// Variables. |
// Variables. |
592 |
string game; |
string game; |
593 |
string datfile; |
string datfile; |
594 |
bool is_present; |
string datfile_path; |
595 |
string datfile_path; |
bool is_present; |
596 |
|
time_t modified; // !is_present -> 0 |
597 |
}; |
}; |
598 |
} |
} |
599 |
|
|
600 |
GameInfo::GameInfo() |
GameInfo::GameInfo() |
601 |
: is_present(false) |
: is_present(false), modified(0) |
602 |
{} |
{} |
603 |
|
|
604 |
|
|
605 |
GameInfo::GameInfo (const string &game_, const string &datfile_) |
GameInfo::GameInfo (const string &game_, const string &datfile_) |
606 |
: game(game_), datfile(datfile_), is_present(false) |
: game(game_), datfile(datfile_), is_present(false), modified(0) |
607 |
{ |
{ |
608 |
string fname; |
string fname; |
609 |
if (FindFile (datfile, datfile_path)) { |
if (FindFile (datfile, datfile_path)) { |
610 |
enigma::Log << "Found " << game << " data file\n"; |
enigma::Log << "Found " << game << " data file\n"; |
611 |
is_present = true; |
is_present = true; |
612 |
|
modified = sysdep::FileModTime(datfile_path); |
613 |
} |
} |
614 |
} |
} |
615 |
|
|
620 |
{ |
{ |
621 |
vector<GameInfo> games; |
vector<GameInfo> games; |
622 |
DatFile *datfile = 0; |
DatFile *datfile = 0; |
623 |
|
time_t datfile_modtime; // modification date of datfile |
624 |
OxydVersion oxyd_version; |
OxydVersion oxyd_version; |
625 |
|
|
626 |
map <string,string> soundfx_map; |
map <string,string> soundfx_map; |
643 |
bool |
bool |
644 |
enigma::oxyd::FoundOxyd (OxydVersion ver) |
enigma::oxyd::FoundOxyd (OxydVersion ver) |
645 |
{ |
{ |
646 |
return games[ver].is_present; |
return games[ver].isPresent(); |
647 |
} |
} |
648 |
|
|
649 |
DatFile * |
DatFile * |
658 |
assert(new_datfile != 0); |
assert(new_datfile != 0); |
659 |
|
|
660 |
oxyd_version = ver; |
oxyd_version = ver; |
661 |
datfile = new_datfile; |
datfile = new_datfile; |
662 |
|
|
663 |
return( true); |
return( true); |
664 |
} |
} |
667 |
enigma::oxyd::OpenDatFile (OxydVersion ver) |
enigma::oxyd::OpenDatFile (OxydVersion ver) |
668 |
{ |
{ |
669 |
if (FoundOxyd(ver)) { |
if (FoundOxyd(ver)) { |
670 |
string fname = games[ver].datfile_path; |
string fname = games[ver].datfilePath(); |
671 |
ByteVec data; |
ByteVec data; |
672 |
readFile (fname, &data); |
readFile (fname, &data); |
673 |
|
|
674 |
datfile = new DatFile; |
datfile = new DatFile; |
675 |
|
datfile_modtime = games[ver].getModTime(); |
676 |
|
|
677 |
string errmsg; |
string errmsg; |
678 |
if (!parseDatFile (data, ver, datfile, &errmsg)) { |
if (!parseDatFile (data, ver, datfile, &errmsg)) { |
679 |
enigma::Log << "Error loading " << fname << ": " << errmsg << endl; |
enigma::Log << "Error loading " << fname << ": " << errmsg << endl; |
701 |
|
|
702 |
switch (oxyd_version) { |
switch (oxyd_version) { |
703 |
case OxydVersion_Oxyd1: |
case OxydVersion_Oxyd1: |
704 |
return new LP_Oxyd1 (datfile, twoplayers); |
return new LP_Oxyd1 (datfile, datfile_modtime, twoplayers); |
705 |
case OxydVersion_PerOxyd: |
case OxydVersion_PerOxyd: |
706 |
return new LP_PerOxyd (datfile, twoplayers); |
return new LP_PerOxyd (datfile, datfile_modtime, twoplayers); |
707 |
case OxydVersion_OxydMagnum: |
case OxydVersion_OxydMagnum: |
708 |
case OxydVersion_OxydMagnumGold: |
case OxydVersion_OxydMagnumGold: |
709 |
return new LP_OxydMagnum (oxyd_version, datfile); |
return new LP_OxydMagnum (oxyd_version, datfile, datfile_modtime); |
710 |
default: |
default: |
711 |
{ |
{ |
712 |
int firstlevel = twoplayers ? 100 : 0; |
int firstlevel = twoplayers ? 100 : 0; |
713 |
int lastlevel = twoplayers ? 199 : 99; |
int lastlevel = twoplayers ? 199 : 99; |
714 |
return new LevelPack_Oxyd (oxyd_version, datfile, firstlevel, lastlevel); |
return new LevelPack_Oxyd (oxyd_version, datfile, datfile_modtime, firstlevel, lastlevel); |
715 |
} |
} |
716 |
} |
} |
717 |
} |
} |