54 |
using world::MakeItem; |
using world::MakeItem; |
55 |
using namespace OxydLib; |
using namespace OxydLib; |
56 |
|
|
57 |
|
namespace { |
58 |
|
enigma::Direction direction_oxyd2enigma(OxydLib::Direction odir) { |
59 |
|
enigma::Direction edir = NODIR; |
60 |
|
switch (odir) { |
61 |
|
case Direction_Up: edir = NORTH; break; |
62 |
|
case Direction_Down: edir = SOUTH; break; |
63 |
|
case Direction_Left: edir = WEST; break; |
64 |
|
case Direction_Right: edir = EAST; break; |
65 |
|
default : |
66 |
|
fprintf(stderr, "Unknown OxydLib-direction %i!\n", int(odir)); |
67 |
|
break; |
68 |
|
} |
69 |
|
return edir; |
70 |
|
} |
71 |
|
} |
72 |
|
|
73 |
//---------------------------------------- |
//---------------------------------------- |
74 |
// Oxyd level packs |
// Oxyd level packs |
75 |
//---------------------------------------- |
//---------------------------------------- |
110 |
|
|
111 |
Level *get_level() const { return m_level; } |
Level *get_level() const { return m_level; } |
112 |
|
|
113 |
Stone *makeLaser(int type, int x, int y); |
Stone *makeLaser(int type); |
114 |
|
|
115 |
private: |
private: |
116 |
// Private methods |
// Private methods |
118 |
void load_items (const Level &level); |
void load_items (const Level &level); |
119 |
void load_stones (const Level &level); |
void load_stones (const Level &level); |
120 |
void load_actors (const Level &level); |
void load_actors (const Level &level); |
121 |
|
void scramble_puzzles (const Level &level); |
122 |
void connect_signals (const Level &level); |
void connect_signals (const Level &level); |
123 |
|
|
124 |
GameType get_gametype() const; |
GameType get_gametype() const; |
257 |
} |
} |
258 |
|
|
259 |
void |
void |
260 |
|
LevelPack_Oxyd::scramble_puzzles (const Level &level) { |
261 |
|
int count = level.getNumScrambleItems(); |
262 |
|
int repeat = options::Difficulty == DIFFICULTY_EASY ? 1 : 4; |
263 |
|
|
264 |
|
while (repeat--) { |
265 |
|
for (int i = 0; i<count; ++i) { |
266 |
|
const ScrambleItem& si = level.getScrambleItem(i); |
267 |
|
Stone *puzz = world::GetStone(GridPos(si.getX(), si.getY())); |
268 |
|
|
269 |
|
if (puzz) |
270 |
|
SendMessage(puzz, "scramble", Value(direction_oxyd2enigma(si.getDir()))); |
271 |
|
} |
272 |
|
} |
273 |
|
} |
274 |
|
|
275 |
|
void |
276 |
LevelPack_Oxyd::load_items (const Level &level) |
LevelPack_Oxyd::load_items (const Level &level) |
277 |
{ |
{ |
278 |
const Grid &grid = level.getGrid (GridType_Objects); |
const Grid &grid = level.getGrid (GridType_Objects); |
283 |
} |
} |
284 |
|
|
285 |
Stone * |
Stone * |
286 |
LevelPack_Oxyd::makeLaser(int type, int x, int y) { |
LevelPack_Oxyd::makeLaser(int type) { |
287 |
assert(type >= 0 && type <= 2); // oxyd supports three different lasers per level |
assert(type >= 0 && type <= 2); // oxyd supports three different lasers per level |
288 |
const Laser& laser = get_level()->getLaser(type); |
const Laser& laser = get_level()->getLaser(type); |
289 |
|
|
290 |
enigma::Direction dir = NODIR; |
enigma::Direction dir = direction_oxyd2enigma(laser.getDir()); |
291 |
bool on = laser.getOn(); |
bool on = laser.getOn(); |
292 |
|
|
|
switch (laser.getDir()) { |
|
|
case Direction_Up: dir = NORTH; break; |
|
|
case Direction_Down: dir = SOUTH; break; |
|
|
case Direction_Left: dir = WEST; break; |
|
|
case Direction_Right: dir = EAST; break; |
|
|
default : |
|
|
fprintf(stderr, "Unknown laser direction!\n"); |
|
|
break; |
|
|
} |
|
|
|
|
293 |
Stone *st = 0; |
Stone *st = 0; |
294 |
if (dir != NODIR) { |
if (dir != NODIR) { |
295 |
string lasername("st-laser"); |
string lasername("st-laser"); |
456 |
load_floor (level); |
load_floor (level); |
457 |
load_items (level); |
load_items (level); |
458 |
load_stones (level); |
load_stones (level); |
459 |
|
scramble_puzzles(level); |
460 |
load_actors (level); |
load_actors (level); |
461 |
connect_signals (level); |
connect_signals (level); |
462 |
|
|
530 |
Stone *st = 0; |
Stone *st = 0; |
531 |
switch (type) { |
switch (type) { |
532 |
case 0x44: case 0x45: case 0x46: |
case 0x44: case 0x45: case 0x46: |
533 |
st = makeLaser(type-0x44, x, y); |
st = makeLaser(type-0x44); |
534 |
break; |
break; |
535 |
default : |
default : |
536 |
st = LevelPack_Oxyd::make_stone(type, x, y); |
st = LevelPack_Oxyd::make_stone(type, x, y); |
577 |
Stone *st = 0; |
Stone *st = 0; |
578 |
switch (type) { |
switch (type) { |
579 |
case 0x3e: case 0x3f: case 0x40: |
case 0x3e: case 0x3f: case 0x40: |
580 |
st = makeLaser(type-0x3e, x, y); |
st = makeLaser(type-0x3e); |
581 |
break; |
break; |
582 |
default : |
default : |
583 |
st = LevelPack_Oxyd::make_stone(type, x, y); |
st = LevelPack_Oxyd::make_stone(type, x, y); |
621 |
} |
} |
622 |
break; |
break; |
623 |
case 0x3e: case 0x3f: case 0x40: |
case 0x3e: case 0x3f: case 0x40: |
624 |
st = makeLaser(type-0x3e, x, y); |
st = makeLaser(type-0x3e); |
625 |
break; |
break; |
626 |
default: |
default: |
627 |
st = LevelPack_Oxyd::make_stone(type, x, y); |
st = LevelPack_Oxyd::make_stone(type, x, y); |
655 |
Stone *st = 0; |
Stone *st = 0; |
656 |
switch (type) { |
switch (type) { |
657 |
case 0x44: case 0x45: case 0x46: |
case 0x44: case 0x45: case 0x46: |
658 |
st = makeLaser(type-0x44, x, y); |
st = makeLaser(type-0x44); |
659 |
break; |
break; |
660 |
default: |
default: |
661 |
st = LevelPack_Oxyd::make_stone(type, x, y); |
st = LevelPack_Oxyd::make_stone(type, x, y); |