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), |
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), |
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), |
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 |
|
|
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 |
} |
} |
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 |
|
|
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 |
|
|
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. */ |
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); |
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). |
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); |
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. */ |