void Feld::load (const KSimpleConfig& config) { if(moving) killTimers(); mol->load(config); QString key; for (int j = 0; j < FIELD_SIZE; j++) { key.sprintf("feld_%02d", j); QString line = config.readEntry(key); for (int i = 0; i < FIELD_SIZE; i++) feld[i][j] = atom2int(line[i].latin1()); } moves = 0; chosen = false; moving = false; undoSize = redoSize = undoBegin = 0; emit enableUndo(false); emit enableRedo(false); xpos = ypos = 0; nextAtom(); }
const LevelData* LevelSet::readLevel(int levelNum) const { KConfigGroup config = m_levelsFile->group("Level"+QString::number(levelNum)); QString key; QList<LevelData::Element> elements; for (int j = 0; j < FIELD_SIZE; j++) { key.sprintf("feld_%02d", j); QString line = config.readEntry(key,QString()); for (int i = 0; i < FIELD_SIZE; i++) { if (line.isEmpty()) { //qDebug() << "error while reading level" << levelNum << "data from" << m_name; return 0; } QChar c = line.at(i); if( c == '#' ) { LevelData::Element el; el.x = i; el.y = j; el.atom = -1; // indicates wall elements.append(el); } else if (c != '.')//atom { LevelData::Element el; el.x = i; el.y = j; el.atom = atom2int(c.toLatin1()); elements.append(el); } } } // Molecule object will be deleted by LevelData, it takes ownership LevelData* level = new LevelData(elements, readLevelMolecule(levelNum)); m_levelCache[levelNum] = level; return level; }
const Molecule* LevelSet::readLevelMolecule(int levelNum) const { Molecule* mol = new Molecule(); KConfigGroup config = m_levelsFile->group("Level"+QString::number(levelNum)); QString key; atom current; int atom_index = 1; QString value; while (true) { key.sprintf("atom_%c", int2atom(atom_index)); value = config.readEntry(key,QString()); if (value.isEmpty()) break; current.obj = value.at(0).toLatin1(); value = value.mid(2); strncpy(current.conn, value.toLatin1(), sizeof(current.conn)); if (mol->m_atoms.indexOf(current) != -1) qWarning() << "OOOPS, duplicate atom definition in" << key; mol->m_atoms.append(current); atom_index++; } QString line; mol->m_width = 0; mol->m_height = 0; mol->m_weight = 0.0; int max_i = -1; for (int j = 0; j < MOLECULE_SIZE; j++) { key.sprintf("mole_%d", j); line = config.readEntry(key,QString()); int max_non_null_i = -1; for (int i = 0; i < MOLECULE_SIZE; i++) { if (i >= line.size()) mol->m_molek[i][j] = 0; else { mol->m_molek[i][j] = atom2int(line.at(i).toLatin1()); mol->m_weight += mol->getAtom(mol->m_molek[i][j]).weight(); max_non_null_i = i; } } if( max_non_null_i != -1 ) mol->m_height++; max_i = qMax( max_i, max_non_null_i ); } mol->m_width = max_i+1; mol->m_name = i18n(config.readEntry("Name", I18N_NOOP("Noname")).toUtf8()); return mol; }