class Level include LevelLoader include MicroChunkUser struct LevelInfo { struct LevelFileInfo file_info; /* level stored in native format for the alternative native game engines */ struct LevelInfo_EM *native_em_level; int file_version; /* file format version the level is stored with */ int game_version; /* game release version the level was created with */ struct DateInfo creation_date; boolean encoding_16bit_field; /* level contains 16-bit elements */ boolean encoding_16bit_yamyam; /* yamyam contains 16-bit elements */ boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */ char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; struct EnvelopeInfo envelope[NUM_ENVELOPES]; int score[LEVEL_SCORE_ELEMENTS]; # TODO this has fixed length (maybe SC_UNKNOWN_15+1) int num_yamyam_contents; # !!!numEntities!!! (for yamyam_contents) int game_of_life[4]; # TODO find out what does this do int biomaze[4]; int start_element[MAX_PLAYERS]; boolean use_start_element[MAX_PLAYERS]; int artwork_element[MAX_PLAYERS]; boolean use_artwork_element[MAX_PLAYERS]; int explosion_element[MAX_PLAYERS]; boolean use_explosion_element[MAX_PLAYERS]; int num_ball_contents; # !!!numEntities!!! (for ball_content) int num_android_clone_elements; int android_clone_element[MAX_ANDROID_ELEMENTS]; int initial_player_stepsize[MAX_PLAYERS]; /* initial player speed */ boolean initial_player_gravity[MAX_PLAYERS]; short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; boolean no_valid_file; /* set when level file missing or invalid */ boolean changed; /* set when level was changed in the editor */ }; def initialize static boolean clipboard_elements_initialized = false InitElementPropertiesStatic() mcSetToDefaults($ruleset_INFO) mcSetToDefaults($ruleset_ELEM) setLevelInfoToDefaults_EM() level->native_em_level = &native_em_level @file_version = FILE_VERSION_ACTUAL @game_version = GAME_VERSION_ACTUAL @creation_date = Time.now @encoding_16bit_field = true @encoding_16bit_yamyam = true @encoding_16bit_amoeba = true @field = Misc.array(MAX_LEV_FIELDX, MAX_LEV_FIELDY, EL_SAND) @name = NAMELESS_LEVEL_NAME @author = ANONYMOUS_NAME @field[0][0] = EL_PLAYER_1 @field[STD_LEV_FIELDX - 1][STD_LEV_FIELDY - 1] = EL_EXIT_CLOSED @envelope = [] MAX_NUM_ELEMENTS.times do |elementId| element = element_info[elementId] # never initialize clipboard elementIds after the very first time # (to be able to use clipboard elementIds between several levels) next if IS_CLIPBOARD_ELEMENT(elementId) && clipboard_elements_initialized if IS_ENVELOPE(elementId) @envelope[elementId - EL_ENVELOPE_1] = Envelope.new end # TODO: maybe element isn't yet an Element? If yes, use element_info[element_id] = Element.new element.initialize } clipboard_elements_initialized = true # TODO: fix all occurences of BorderElement to borderElement. And find out what it is and if it's needed. $borderElement = EL_STEELWALL @no_valid_file = false @changed = false # TODO: leveldir_current probably is a global variable, and it's questionable if we support dumping at all return if leveldir_current == NULL # only when dumping level # try to determine better author name than 'anonymous' if leveldir_current.author != ANONYMOUS_NAME @author = leveldir_current.author else case LEVELCLASS(leveldir_current) when LEVELCLASS_TUTORIAL level.author = PROGRAM_AUTHOR_STRING when LEVELCLASS_CONTRIB level.author = leveldir_current.name when LEVELCLASS_PRIVATE level.author = getRealName() # TODO fix getRealName() end end end def numAndroidCloneElements @androidCloneElement.length end def numYamyamContents @yamyamContent.length end end