/[cuyo]/cuyo/src/blop.cpp
ViewVC logotype

Diff of /cuyo/src/blop.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.57 by caeles, Sat Nov 26 21:29:52 2005 UTC revision 1.58 by caeles, Sun Nov 27 02:57:04 2005 UTC
# Line 39  Line 39 
39      was anderes nicht initialisiert ist). Das Uninitialisiert sein      was anderes nicht initialisiert ist). Das Uninitialisiert sein
40      eines Blops erkennt man daran, dass mDaten 0 ist. */      eines Blops erkennt man daran, dass mDaten 0 ist. */
41  Blop::Blop(): mFreilaufend(true), mBesitzer(0),  Blop::Blop(): mFreilaufend(true), mBesitzer(0),
42    mX(keine_koord), mY(keine_koord),    mOrt(absort_nirgends),
43    mDaten(0), mDatenAlt(0),    mDaten(0), mDatenAlt(0),
44    mZeitNummerDatenAlt(-1),    mZeitNummerDatenAlt(-1),
45    mZeitNummerInitStapel(-1),    mZeitNummerInitStapel(-1),
# Line 56  Blop::Blop(): mFreilaufend(true), mBesit Line 56  Blop::Blop(): mFreilaufend(true), mBesit
56  Blop::Blop(int s):  Blop::Blop(int s):
57    mKettenGroesse(1),    mKettenGroesse(1),
58    mAmPlatzen(0),    mAmPlatzen(0),
59    mFreilaufend(true), mBesitzer(0), mX(keine_koord), mY(keine_koord),    mFreilaufend(true), mBesitzer(0), mOrt(absort_nirgends),
60    mDatenLaenge(ld->mLevelKnoten->getDatenLaenge()),    mDatenLaenge(ld->mLevelKnoten->getDatenLaenge()),
61    mZeitNummerDatenAlt(-1),    mZeitNummerDatenAlt(-1),
62    mZeitNummerInitStapel(-1),    mZeitNummerInitStapel(-1),
# Line 82  Blop::Blop(int s): Line 82  Blop::Blop(int s):
82    
83    
84    
85  Blop::Blop(const Blop & b): mFreilaufend(true), mBesitzer(0),  Blop::Blop(const Blop & b): mFreilaufend(true), mBesitzer(0), mOrt(b.mOrt),
86    mDatenLaenge(ld->mLevelKnoten->getDatenLaenge()),    mDatenLaenge(ld->mLevelKnoten->getDatenLaenge()),
87    mZeitNummerDatenAlt(-1),    mZeitNummerDatenAlt(-1),
88    mZeitNummerInitStapel(-1),    mZeitNummerInitStapel(-1),
# Line 169  void Blop::kopiere(const Blop & b) { Line 169  void Blop::kopiere(const Blop & b) {
169  /** Setzt Besitzer und Besitzer-Informationen. Braucht nur am Anfang einmal  /** Setzt Besitzer und Besitzer-Informationen. Braucht nur am Anfang einmal
170      aufgerufen zu werden. Muss auch für den Global-Blop aufgerufen werden;      aufgerufen zu werden. Muss auch für den Global-Blop aufgerufen werden;
171      sonst darf kein Code ausgeführt werden. */      sonst darf kein Code ausgeführt werden. */
172  void Blop::setBesitzer(BlopBesitzer * bes /*= 0*/, bool re /*=false*/,  void Blop::setBesitzer(BlopBesitzer * bes = 0,
173                         int x /*= keine_koord*/,      ort_absolut ort /* = ort_absolut(absort_nirgends)*/) {
                        int y /*= keine_koord*/) {  
174    mFreilaufend = false;    mFreilaufend = false;
175    mBesitzer = bes;    mBesitzer = bes;
176    mRechterSpieler = re;    mOrt = ort;
   mX = x;  
   mY = y;  
177  }  }
178    
179    
# Line 440  Sorte * Blop::getSorte() const { Line 437  Sorte * Blop::getSorte() const {
437  int Blop::getVerbindungen() const {  int Blop::getVerbindungen() const {
438    CASSERT(mDaten);    CASSERT(mDaten);
439    if (mBesitzer) {    if (mBesitzer) {
440      return mBesitzer->getBesitzVerbindungen(mX, mY);      return mBesitzer->getBesitzVerbindungen(mOrt.x, mOrt.y);
441    } else    } else
442      return verbindung_solo;      return verbindung_solo;
443  }  }
# Line 467  int Blop::getKettenBeitrag() const { Line 464  int Blop::getKettenBeitrag() const {
464  /** Liefert einen String der Art "Blop Drachen at x,y".  /** Liefert einen String der Art "Blop Drachen at x,y".
465      Für Fehlermeldungen. */      Für Fehlermeldungen. */
466  __String Blop::toString() const {  __String Blop::toString() const {
467    __String ret1, ret2;    __String ret1, ret2, ret3;
468    ret1.sprintf(_("Blop %s"), getSorte()->getName().data());    ret1.sprintf(_("Blop %s"), getSorte()->getName().data());
469      ret2 = mOrt.toString();
470    if (mY == keine_koord) {    ret3.sprintf(_("%s at %s"), ret1.data(), ret2.data());
471      ret2.sprintf(_("%s"), ret1.data());    return ret3;
   } else {  
     ret2.sprintf(_("%s at %d,%d"), ret1.data(), mX, mY);  
   }  
   return ret2;  
472  }  }
473    
474    
# Line 483  __String Blop::toString() const { Line 476  __String Blop::toString() const {
476  void Blop::bekommPunkte(int pt) const {  void Blop::bekommPunkte(int pt) const {
477    if (getArt() == blopart_global)    if (getArt() == blopart_global)
478      throw Fehler(_("bonus() does not work in the global blob."));      throw Fehler(_("bonus() does not work in the global blob."));
479    Cuyo::gCuyo->neuePunkte(mRechterSpieler, pt);    Cuyo::gCuyo->neuePunkte(mOrt.rechts, pt);
480  }  }
481    
482  /** Wird vom Code aufgerufen, wenn ein Message angezeigt werden soll. */  /** Wird vom Code aufgerufen, wenn ein Message angezeigt werden soll. */
483  void Blop::zeigMessage(__String mess) const {  void Blop::zeigMessage(__String mess) const {
484    if (getArt() == blopart_global)    if (getArt() == blopart_global)
485      throw Fehler(_("message() does not work in the global blob."));      throw Fehler(_("message() does not work in the global blob."));
486    Cuyo::gCuyo->getSpielfeld(mRechterSpieler)->setMessage(mess);    Cuyo::gCuyo->getSpielfeld(mOrt.rechts)->setMessage(mess);
487  }  }
488    
489    
# Line 525  int Blop::getSpezConst(int vnr) const { Line 518  int Blop::getSpezConst(int vnr) const {
518    switch (vnr) {    switch (vnr) {
519      case spezconst_connect:      case spezconst_connect:
520        return getVerbindungen();        return getVerbindungen();
521       case spezconst_size:      case spezconst_size:
522         return mKettenGroesse;        return mKettenGroesse;
523       case spezconst_loc_x:      case spezconst_loc_x:
524         /* Wenn die *Y*-Koordinate keine_koord ist, gehöre ich        if (mOrt.art != absort_feld) break;
525            vermutlich dem Fall. */        return ld->mSpiegeln ? grx - 1 - mOrt.x : mOrt.x;
526         if (mY == keine_koord) break;      case spezconst_loc_y:
527         return ld->mSpiegeln ? grx - 1 - mX : mX;        if (mOrt.art != absort_feld) break;
528       case spezconst_loc_y:        return ld->mSpiegeln ? gry - 1 - mOrt.y : mOrt.y;
529         if (mY == keine_koord) break;      case spezconst_loc_p:
530         return ld->mSpiegeln ? gry - 1 - mY : mY;        if ((mOrt.art == absort_global) || (mOrt.art == absort_nirgends))
531       case spezconst_loc_p:          throw iFehler(_(
532            "%s: Internal error in Blop::getSpezConst(): Falsche Ort-Art %d"),
533            mOrt.art);
534         /* Hier sollte noch eine Fehlermeldung ausgegeben werden, wenn man         /* Hier sollte noch eine Fehlermeldung ausgegeben werden, wenn man
535            das vom Global-Blop aus abfragen will. */            das vom Global-Blop aus abfragen will. */
536         return mRechterSpieler ? 2 : 1;        return mOrt.rechts ? 2 : 1;
537       case spezconst_players:      case spezconst_players:
538         return ld->mSpielerZahl;        return ld->mSpielerZahl;
539       case spezconst_exploding:      case spezconst_exploding:
540         return mAmPlatzen;        return mAmPlatzen;
541    };    };
542    
543    /* Nicht selbst bearbeitet? Dann nach oben weitergeben. */    /* Nicht selbst bearbeitet? Dann nach oben weitergeben. */
# Line 550  int Blop::getSpezConst(int vnr) const { Line 545  int Blop::getSpezConst(int vnr) const {
545            
546      /* Wenn der Besitzer der Fall ist, will der wissen, welcher der      /* Wenn der Besitzer der Fall ist, will der wissen, welcher der
547         beiden Blops ich bin... */         beiden Blops ich bin... */
548      if (mY == keine_koord && mX == 1)      if ((mOrt.art == absort_fall) && (mOrt.x == 1))
549        vnr += spezconst_bin_1;        vnr += spezconst_bin_1;
550            
551      int r = mBesitzer->getSpezConst(vnr);      int r = mBesitzer->getSpezConst(vnr);
# Line 575  int Blop::getVariable(const Variable & v Line 570  int Blop::getVariable(const Variable & v
570      return gGlobalBlop.getVariableVergangenheit(v.getNummer());      return gGlobalBlop.getVariableVergangenheit(v.getNummer());
571            
572    case variable_relativ: {    case variable_relativ: {
573      int xx = v.getX(mX, mY);      int xx = v.getX(mOrt.x, mOrt.y);
574      int yy = v.getY(mX, mY);      int yy = v.getY(mOrt.x, mOrt.y);
575    
576      if (mBesitzer && mBesitzer->koordOK(xx, yy))      if (mBesitzer && mBesitzer->koordOK(xx, yy))
577        return mBesitzer->getFeld(xx, yy).        return mBesitzer->getFeld(xx, yy).
# Line 628  void Blop::setVariable(const Variable & Line 623  void Blop::setVariable(const Variable &
623      gGlobalBlop.setVariableZukunft(v.getNummer(), wert, op);      gGlobalBlop.setVariableZukunft(v.getNummer(), wert, op);
624      break;      break;
625    case variable_relativ: {    case variable_relativ: {
626      int xx = v.getX(mX, mY);      int xx = v.getX(mOrt.x, mOrt.y);
627      int yy = v.getY(mX, mY);      int yy = v.getY(mOrt.x, mOrt.y);
628      if (mBesitzer && mBesitzer->koordOK(xx, yy)) {      if (mBesitzer && mBesitzer->koordOK(xx, yy)) {
629        mBesitzer->getFeld(xx, yy).        mBesitzer->getFeld(xx, yy).
630          setVariableZukunft(v.getNummer(), wert, op);          setVariableZukunft(v.getNummer(), wert, op);
# Line 778  void Blop::speichereBild() { Line 773  void Blop::speichereBild() {
773       mDaten[spezvar_quarter]);       mDaten[spezvar_quarter]);
774  }  }
775    
776    
777  /** Speichert das aktuelle Bild (d. h. aus den spezvar file und pos)  /** Speichert das aktuelle Bild (d. h. aus den spezvar file und pos)
778      in die Mal-Liste von einem anderen Blop, und zwar so, dass es      in die Mal-Liste von einem anderen Blop, und zwar so, dass es
779      erst zum Schluss gemalt wird. */      in Ebene ebene gemalt wird. */
780  void Blop::speichereBildRelativ(int xx, int yy, int ebene) {  void Blop::speichereBildFremd(Ort & ort, int ebene) {
781    CASSERT(mDaten);    CASSERT(mDaten);
   if (!mMalenErlaubt)  
     throw Fehler(_("Drawing is not allowed at the moment."));  
782    
783    /* Die Koordinatenberechnung ist aus Variable::getX / getY abgeschrieben    ort_absolut ziel = ort.berechne(mOrt,*this);
784       und sollte irgendwo zentral sein. */    if (ziel.korrekt()) {
785    int x = mX + xx;      Blop & b = ziel.finde();
786    int y = mY + (ld->mSpiegeln ? -yy : yy)  
787                        - (ld->mSechseck && (mX & 1) && (xx & 1));      if (!b.mMalenErlaubt)
788          throw Fehler(_("Drawing is not allowed at the moment."));
789    
   if (mBesitzer && mBesitzer->koordOK(x, y)) {  
     Blop & b = mBesitzer->getFeld(x, y);  
790      /* Ggf. gelazyten initStapel()-Aufruf nachholen. An dieser Stelle      /* Ggf. gelazyten initStapel()-Aufruf nachholen. An dieser Stelle
791         ist das wichtig, weil der bemalte Blop evtl. noch nicht animiert()         ist das wichtig, weil der bemalte Blop evtl. noch nicht animiert()
792         wurde. */         wurde. */

Legend:
Removed from v.1.57  
changed lines
  Added in v.1.58

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26