52 |
using world::MakeStone; |
using world::MakeStone; |
53 |
using world::Item; |
using world::Item; |
54 |
using world::MakeItem; |
using world::MakeItem; |
55 |
|
using namespace OxydLib; |
56 |
|
|
57 |
//---------------------------------------- |
//---------------------------------------- |
58 |
// Oxyd level packs |
// Oxyd level packs |
62 |
class LevelPack_Oxyd : public LevelPack { |
class LevelPack_Oxyd : public LevelPack { |
63 |
public: |
public: |
64 |
LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, |
LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, |
65 |
int idx_start, int idx_end, bool twoplayers); |
int idx_start, int idx_end, bool twoplayers); |
66 |
virtual ~LevelPack_Oxyd() {} |
|
67 |
|
virtual ~LevelPack_Oxyd() = 0; // class is interface! |
68 |
|
|
69 |
// LevelPack interface |
// LevelPack interface |
70 |
virtual string get_name() const; |
virtual string get_name() const; |
94 |
|
|
95 |
Level *get_level() const { return m_level; } |
Level *get_level() const { return m_level; } |
96 |
|
|
97 |
|
Stone *makeLaser(int type, int x, int y); |
98 |
|
|
99 |
private: |
private: |
100 |
// Private methods |
// Private methods |
101 |
void load_floor (const Level &level); |
void load_floor (const Level &level); |
119 |
}; |
}; |
120 |
} |
} |
121 |
|
|
|
GameType |
|
|
LevelPack_Oxyd::get_gametype() const { |
|
|
GameType typ = GAMET_UNKNOWN; |
|
|
switch (m_version) { |
|
|
case OxydVersion_Oxyd1: |
|
|
typ = GAMET_OXYD1; break; |
|
|
case OxydVersion_OxydMagnum: |
|
|
case OxydVersion_OxydMagnumGold: |
|
|
typ = GAMET_OXYDMAGNUM; break; |
|
|
case OxydVersion_OxydExtra: |
|
|
typ = GAMET_OXYDEXTRA; break; |
|
|
case OxydVersion_PerOxyd: |
|
|
typ = GAMET_PEROXYD; break; |
|
|
default : |
|
|
assert(0); |
|
|
break; |
|
|
} |
|
|
return typ; |
|
|
} |
|
|
|
|
122 |
LevelPack_Oxyd::LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, |
LevelPack_Oxyd::LevelPack_Oxyd (OxydVersion ver, DatFile *dat, time_t created, |
123 |
int idx_start, int idx_end, bool twoplayers) |
int idx_start, int idx_end, bool twoplayers) |
124 |
: m_mapping(ver), m_version(ver), m_datfile(dat), |
: m_mapping(ver), m_version(ver), m_datfile(dat), |
145 |
Log << "Levelpack '" << get_name() << "' has " << nlevels << " levels." << endl; |
Log << "Levelpack '" << get_name() << "' has " << nlevels << " levels." << endl; |
146 |
} |
} |
147 |
|
|
148 |
|
LevelPack_Oxyd::~LevelPack_Oxyd() |
149 |
|
{} |
150 |
|
|
151 |
|
GameType |
152 |
|
LevelPack_Oxyd::get_gametype() const { |
153 |
|
GameType typ = GAMET_UNKNOWN; |
154 |
|
switch (m_version) { |
155 |
|
case OxydVersion_Oxyd1: |
156 |
|
typ = GAMET_OXYD1; break; |
157 |
|
case OxydVersion_OxydMagnum: |
158 |
|
case OxydVersion_OxydMagnumGold: |
159 |
|
typ = GAMET_OXYDMAGNUM; break; |
160 |
|
case OxydVersion_OxydExtra: |
161 |
|
typ = GAMET_OXYDEXTRA; break; |
162 |
|
case OxydVersion_PerOxyd: |
163 |
|
typ = GAMET_PEROXYD; break; |
164 |
|
default : |
165 |
|
assert(0); |
166 |
|
break; |
167 |
|
} |
168 |
|
return typ; |
169 |
|
} |
170 |
|
|
171 |
string |
string |
172 |
LevelPack_Oxyd::get_name() const |
LevelPack_Oxyd::get_name() const |
173 |
{ |
{ |
257 |
} |
} |
258 |
|
|
259 |
Stone * |
Stone * |
260 |
|
LevelPack_Oxyd::makeLaser(int type, int x, int y) { |
261 |
|
assert(type >= 0 && type <= 2); // oxyd supports three different lasers per level |
262 |
|
const Laser& laser = get_level()->getLaser(type); |
263 |
|
|
264 |
|
enigma::Direction dir = NODIR; |
265 |
|
bool on = laser.getOn(); |
266 |
|
|
267 |
|
switch (laser.getDir()) { |
268 |
|
case Direction_Up: dir = NORTH; break; |
269 |
|
case Direction_Down: dir = SOUTH; break; |
270 |
|
case Direction_Left: dir = WEST; break; |
271 |
|
case Direction_Right: dir = EAST; break; |
272 |
|
default : |
273 |
|
fprintf(stderr, "Unknown laser direction!\n"); |
274 |
|
break; |
275 |
|
} |
276 |
|
|
277 |
|
Stone *st = 0; |
278 |
|
if (dir != NODIR) { |
279 |
|
string lasername("st-laser"); |
280 |
|
lasername += to_suffix(dir); |
281 |
|
st = MakeStone(lasername.c_str()); |
282 |
|
st->set_attrib("on", Value(on)); // OnOffStone attribute |
283 |
|
} |
284 |
|
return st; |
285 |
|
} |
286 |
|
|
287 |
|
Stone * |
288 |
LevelPack_Oxyd::make_stone (int type, int /*x*/, int /*y*/) |
LevelPack_Oxyd::make_stone (int type, int /*x*/, int /*y*/) |
289 |
{ |
{ |
290 |
using namespace world; |
using namespace world; |
481 |
{ |
{ |
482 |
class LP_Oxyd1 : public LevelPack_Oxyd { |
class LP_Oxyd1 : public LevelPack_Oxyd { |
483 |
Stone *make_stone (int type, int x, int y); |
Stone *make_stone (int type, int x, int y); |
484 |
Item *LP_Oxyd1::make_item (int type); |
Item *make_item (int type); |
485 |
public: |
public: |
486 |
LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers); |
LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers); |
487 |
}; |
}; |
|
|
|
|
// class LP_OxydExtra : public LevelPack_Oxyd { |
|
|
|
|
|
// }; |
|
488 |
} |
} |
489 |
|
|
490 |
LP_Oxyd1::LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers) |
LP_Oxyd1::LP_Oxyd1 (DatFile *dat, time_t created, bool twoplayers) |
510 |
Stone * |
Stone * |
511 |
LP_Oxyd1::make_stone (int type, int x, int y) |
LP_Oxyd1::make_stone (int type, int x, int y) |
512 |
{ |
{ |
513 |
return LevelPack_Oxyd::make_stone(type, x, y); |
Stone *st = 0; |
514 |
|
switch (type) { |
515 |
|
case 0x44: case 0x45: case 0x46: |
516 |
|
st = makeLaser(type-0x44, x, y); |
517 |
|
break; |
518 |
|
default : |
519 |
|
st = LevelPack_Oxyd::make_stone(type, x, y); |
520 |
|
break; |
521 |
|
} |
522 |
|
return st; |
523 |
|
} |
524 |
|
|
525 |
|
|
526 |
|
|
527 |
|
//---------------------------------------- |
528 |
|
// OxydExtra level pack |
529 |
|
//---------------------------------------- |
530 |
|
namespace |
531 |
|
{ |
532 |
|
class LP_OxydExtra : public LevelPack_Oxyd { |
533 |
|
Stone *make_stone (int type, int x, int y); |
534 |
|
Item *make_item (int type); |
535 |
|
public: |
536 |
|
LP_OxydExtra (DatFile *dat, time_t created); |
537 |
|
}; |
538 |
|
} |
539 |
|
|
540 |
|
LP_OxydExtra::LP_OxydExtra (DatFile *dat, time_t created) |
541 |
|
: LevelPack_Oxyd (OxydVersion_OxydExtra, dat, created, 0, 99, false) |
542 |
|
{ |
543 |
|
} |
544 |
|
|
545 |
|
Item * |
546 |
|
LP_OxydExtra::make_item (int type) |
547 |
|
{ |
548 |
|
Item *it = 0; |
549 |
|
switch (type) { |
550 |
|
default: |
551 |
|
it = LevelPack_Oxyd::make_item(type); |
552 |
|
break; |
553 |
|
} |
554 |
|
return it; |
555 |
} |
} |
556 |
|
|
557 |
|
Stone * |
558 |
|
LP_OxydExtra::make_stone (int type, int x, int y) |
559 |
|
{ |
560 |
|
Stone *st = 0; |
561 |
|
switch (type) { |
562 |
|
case 0x3e: case 0x3f: case 0x40: |
563 |
|
st = makeLaser(type-0x3e, x, y); |
564 |
|
break; |
565 |
|
default : |
566 |
|
st = LevelPack_Oxyd::make_stone(type, x, y); |
567 |
|
break; |
568 |
|
} |
569 |
|
return st; |
570 |
|
} |
571 |
|
|
572 |
|
|
573 |
//---------------------------------------- |
//---------------------------------------- |
603 |
st = MakeStone (names[type - 0x39]); |
st = MakeStone (names[type - 0x39]); |
604 |
} |
} |
605 |
break; |
break; |
606 |
default: st = LevelPack_Oxyd::make_stone(type, x, y); |
case 0x3e: case 0x3f: case 0x40: |
607 |
|
st = makeLaser(type-0x3e, x, y); |
608 |
|
break; |
609 |
|
default: |
610 |
|
st = LevelPack_Oxyd::make_stone(type, x, y); |
611 |
|
break; |
612 |
} |
} |
613 |
return st; |
return st; |
614 |
} |
} |
635 |
Stone * |
Stone * |
636 |
LP_OxydMagnum::make_stone (int type, int x, int y) |
LP_OxydMagnum::make_stone (int type, int x, int y) |
637 |
{ |
{ |
638 |
return LevelPack_Oxyd::make_stone(type, x, y); |
Stone *st = 0; |
639 |
|
switch (type) { |
640 |
|
case 0x44: case 0x45: case 0x46: |
641 |
|
st = makeLaser(type-0x44, x, y); |
642 |
|
break; |
643 |
|
default: |
644 |
|
st = LevelPack_Oxyd::make_stone(type, x, y); |
645 |
|
break; |
646 |
|
} |
647 |
|
return st; |
648 |
} |
} |
649 |
|
|
650 |
|
|
735 |
switch (ver) { |
switch (ver) { |
736 |
case OxydVersion_Oxyd1: |
case OxydVersion_Oxyd1: |
737 |
return new LP_Oxyd1 (datfile, modified, twoplayers); |
return new LP_Oxyd1 (datfile, modified, twoplayers); |
738 |
|
case OxydVersion_OxydExtra: |
739 |
|
return new LP_OxydExtra(datfile, modified); |
740 |
case OxydVersion_PerOxyd: |
case OxydVersion_PerOxyd: |
741 |
return new LP_PerOxyd (datfile, modified, twoplayers); |
return new LP_PerOxyd (datfile, modified, twoplayers); |
742 |
case OxydVersion_OxydMagnum: |
case OxydVersion_OxydMagnum: |
743 |
case OxydVersion_OxydMagnumGold: |
case OxydVersion_OxydMagnumGold: |
744 |
return new LP_OxydMagnum (ver, datfile, modified); |
return new LP_OxydMagnum (ver, datfile, modified); |
745 |
default: |
default: |
746 |
{ |
assert(0); |
747 |
int firstlevel = twoplayers ? 100 : 0; |
break; |
748 |
int lastlevel = twoplayers ? 199 : 99; |
// { |
749 |
return new LevelPack_Oxyd(ver, datfile, modified, firstlevel, lastlevel, twoplayers); |
// int firstlevel = twoplayers ? 100 : 0; |
750 |
} |
// int lastlevel = twoplayers ? 199 : 99; |
751 |
|
// return new LevelPack_Oxyd(ver, datfile, modified, firstlevel, lastlevel, twoplayers); |
752 |
|
// } |
753 |
} |
} |
754 |
|
|
755 |
} |
} |