71 |
void load_items (const Level &level); |
void load_items (const Level &level); |
72 |
void load_stones (const Level &level); |
void load_stones (const Level &level); |
73 |
void load_actors (const Level &level); |
void load_actors (const Level &level); |
74 |
|
void connect_signals (const Level &level); |
75 |
|
|
76 |
// Variables |
// Variables |
77 |
OxydVersion m_version; |
OxydVersion m_version; |
493 |
stone_map[0x34] = "st-death"; |
stone_map[0x34] = "st-death"; |
494 |
stone_map[0x35] = "st-death_invisible"; |
stone_map[0x35] = "st-death_invisible"; |
495 |
stone_map[0x42] = "st-stoneimpulse"; |
stone_map[0x42] = "st-stoneimpulse"; |
|
stone_map[0x44] = "st-laser-n"; |
|
|
stone_map[0x46] = "st-laser-e"; |
|
496 |
stone_map[0x68] = "st-bombs"; |
stone_map[0x68] = "st-bombs"; |
497 |
stone_map[0x6c] = "st-shogun-s"; |
stone_map[0x6c] = "st-shogun-s"; |
498 |
stone_map[0x75] = "st-rock2"; |
stone_map[0x75] = "st-rock2"; |
601 |
Item *it = 0; |
Item *it = 0; |
602 |
const Grid &grid = level.getGrid (GridType_Objects); |
const Grid &grid = level.getGrid (GridType_Objects); |
603 |
int type = grid.get(x,y); |
int type = grid.get(x,y); |
604 |
|
char buf[20] = ""; |
605 |
|
|
606 |
switch (type) { |
switch (type) { |
607 |
case 0x00: break; // ignore |
case 0x00: break; // ignore |
608 |
case 0x02: // note 1 |
case 0x02: // note 1 |
627 |
it->set_attrib("type", 3); |
it->set_attrib("type", 3); |
628 |
break; |
break; |
629 |
|
|
630 |
|
case 0x2c: it = MakeItem("it-shogun"); |
631 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
632 |
|
it->set_attrib ("size", 1); |
633 |
|
NameObject(it, buf); |
634 |
|
break; |
635 |
|
|
636 |
|
case 0x40: it = MakeItem("st-trigger"); |
637 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
638 |
|
NameObject(it, buf); |
639 |
|
break; |
640 |
|
|
641 |
default: |
default: |
642 |
{ |
{ |
643 |
const char *name = item_map[type]; |
const char *name = item_map[type]; |
667 |
Stone *st = 0; |
Stone *st = 0; |
668 |
const Grid &grid = level.getGrid (GridType_Pieces); |
const Grid &grid = level.getGrid (GridType_Pieces); |
669 |
int type = grid.get(x,y); |
int type = grid.get(x,y); |
670 |
|
char buf[20] = ""; |
671 |
|
|
672 |
switch( type) { |
switch( type) { |
673 |
case 0x00: break; // ignore |
case 0x00: break; // ignore |
687 |
case 0x0d: |
case 0x0d: |
688 |
case 0x0e: |
case 0x0e: |
689 |
case 0x0f: st = MakeStone("st-oxyd"); |
case 0x0f: st = MakeStone("st-oxyd"); |
690 |
char buf[2]; |
snprintf( buf, sizeof(buf), "%d", (int)((type-1)/2)); |
|
snprintf( buf, 2, "%d", (int)((type-1)/2)); |
|
691 |
st->set_attrib("color", Value(buf)); |
st->set_attrib("color", Value(buf)); |
692 |
st->set_attrib("flavor", "a"); |
st->set_attrib("flavor", "a"); |
693 |
break; |
break; |
694 |
|
|
695 |
|
case 0x28: st = MakeStone("st-switch"); |
696 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
697 |
|
NameObject(st, buf); |
698 |
|
break; |
699 |
|
|
700 |
|
case 0x2b: st = MakeStone("st-fourswitch"); |
701 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
702 |
|
NameObject(st, buf); |
703 |
|
break; |
704 |
|
|
705 |
|
case 0x2c: st = MakeStone("st-switch"); |
706 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
707 |
|
NameObject(st, buf); |
708 |
|
break; |
709 |
|
|
710 |
|
case 0x2d: st = MakeStone("st-floppy"); |
711 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
712 |
|
NameObject(st, buf); |
713 |
|
break; |
714 |
|
|
715 |
|
case 0x3e: st = MakeStone("st-laser"); |
716 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
717 |
|
NameObject(st, buf); |
718 |
|
st->set_attrib("direction", NORTH); |
719 |
|
break; |
720 |
|
case 0x3f: st = MakeStone("st-laser"); |
721 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
722 |
|
NameObject(st, buf); |
723 |
|
st->set_attrib("direction", SOUTH); |
724 |
|
break; |
725 |
|
case 0x40: st = MakeStone("st-laser"); |
726 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
727 |
|
NameObject(st, buf); |
728 |
|
st->set_attrib("direction", EAST); |
729 |
|
break; |
730 |
|
|
731 |
|
case 0x46: |
732 |
|
st = MakeStone("st-laser"); |
733 |
|
snprintf( buf, sizeof(buf), "O_%d_%d", x, y); |
734 |
|
NameObject(st, buf); |
735 |
|
st->set_attrib("direction", EAST); |
736 |
|
break; |
737 |
|
|
738 |
case 0x51: st = MakeStone("st-puzzle"); |
case 0x51: st = MakeStone("st-puzzle"); |
739 |
st->set_attrib("connections", 7); |
st->set_attrib("connections", 7); |
740 |
break; |
break; |
772 |
st->set_attrib("connections", 1); |
st->set_attrib("connections", 1); |
773 |
break; |
break; |
774 |
|
|
775 |
|
case 0x73: |
776 |
|
st = MakeStone("st-door"); |
777 |
|
snprintf( buf, sizeof(buf), "D_%d_%d", x, y); |
778 |
|
NameObject(st, buf); |
779 |
|
st->set_attrib("type", "h"); |
780 |
|
break; |
781 |
|
|
782 |
default: |
default: |
783 |
{ |
{ |
784 |
const char *name = stone_map[type]; |
const char *name = stone_map[type]; |
846 |
|
|
847 |
} |
} |
848 |
|
|
849 |
|
void |
850 |
|
LevelPack_Oxyd::connect_signals (const Level &level) |
851 |
|
{ |
852 |
|
using namespace world; |
853 |
|
|
854 |
|
set<SignalLocation> senders; |
855 |
|
level.getSenders(&senders); |
856 |
|
set<SignalLocation>::const_iterator senderIter = senders.begin(); |
857 |
|
set<SignalLocation>::const_iterator senderEnd = senders.end(); |
858 |
|
for (; senderIter != senderEnd; ++senderIter) { |
859 |
|
const SignalLocation &sender = *senderIter; |
860 |
|
char sender_name[9]; |
861 |
|
snprintf( sender_name, 9, "O_%d_%d", sender.getX(), sender.getY()); |
862 |
|
|
863 |
|
int numRecipients = level.getNumRecipients(sender); |
864 |
|
if( numRecipients >= 1) { |
865 |
|
const SignalLocation &recipient = |
866 |
|
level.getRecipient(sender, 0); |
867 |
|
|
868 |
|
Object *s_o = GetNamedObject( sender_name); |
869 |
|
|
870 |
|
char recipient_name[9]; |
871 |
|
char *signalname = "trigger"; |
872 |
|
snprintf( recipient_name, 9, "O_%d_%d", recipient.getX(), recipient.getY()); |
873 |
|
Object *r_o = GetNamedObject( recipient_name); |
874 |
|
if( r_o) |
875 |
|
signalname = "onoff"; |
876 |
|
else { |
877 |
|
snprintf( recipient_name, 9, "D_%d_%d", recipient.getX(), recipient.getY()); |
878 |
|
r_o = GetNamedObject( recipient_name); |
879 |
|
if( r_o) { |
880 |
|
signalname = "openclose"; |
881 |
|
} |
882 |
|
} |
883 |
|
|
884 |
|
if( s_o) { |
885 |
|
s_o->set_attrib( "action", signalname); |
886 |
|
s_o->set_attrib( "target", Value(recipient_name)); |
887 |
|
} else { |
888 |
|
fprintf(stderr,"Could not get sender %s!\n", sender_name); |
889 |
|
} |
890 |
|
fprintf(stderr, "Signal '%s' from %s to %s\n", signalname, sender_name, recipient_name); |
891 |
|
} |
892 |
|
if( numRecipients > 1) { |
893 |
|
fprintf(stderr,"Multiple recipients of Signals currently not supported!\n"); |
894 |
|
} |
895 |
|
|
896 |
|
} |
897 |
|
} |
898 |
|
|
899 |
bool |
bool |
900 |
LevelPack_Oxyd::load_level (size_t index) |
LevelPack_Oxyd::load_level (size_t index) |
901 |
{ |
{ |
915 |
load_items (level); |
load_items (level); |
916 |
load_stones (level); |
load_stones (level); |
917 |
load_actors (level); |
load_actors (level); |
918 |
|
connect_signals (level); |
919 |
|
|
920 |
world::InitWorld(); |
world::InitWorld(); |
921 |
if( level.getScrolling()) |
if( level.getScrolling()) |