tile animation: use tiles.rc to control termination of coal plant smoke
when the coal plant is killed Also, this sets up a framework to handle industrial zones in the same way. git-svn-id: https://micropolis.googlecode.com/svn/trunk/micropolis-java@759 d9718cc8-9f43-0410-858b-315f434eb58c
This commit is contained in:
parent
a190bbf88b
commit
0c497aa434
5 changed files with 84 additions and 50 deletions
|
@ -944,22 +944,22 @@
|
||||||
914 misc_animation@0,1392 (conducts) (becomes=915)
|
914 misc_animation@0,1392 (conducts) (becomes=915)
|
||||||
915 misc_animation@0,1408 (conducts) (becomes=912)
|
915 misc_animation@0,1408 (conducts) (becomes=912)
|
||||||
# BEGIN COAL PLANT SMOKE #
|
# BEGIN COAL PLANT SMOKE #
|
||||||
916 misc_animation@0,1424 (conducts) (becomes=917)
|
916 misc_animation@0,1424 (conducts) (becomes=917)(onshutdown=747)
|
||||||
917 misc_animation@0,1440 (conducts) (becomes=918)
|
917 misc_animation@0,1440 (conducts) (becomes=918)(onshutdown=747)
|
||||||
918 misc_animation@0,1456 (conducts) (becomes=919)
|
918 misc_animation@0,1456 (conducts) (becomes=919)(onshutdown=747)
|
||||||
919 misc_animation@0,1472 (conducts) (becomes=916)
|
919 misc_animation@0,1472 (conducts) (becomes=916)(onshutdown=747)
|
||||||
920 misc_animation@0,1488 (conducts) (becomes=921)
|
920 misc_animation@0,1488 (conducts) (becomes=921)(onshutdown=748)
|
||||||
921 misc_animation@0,1504 (conducts) (becomes=922)
|
921 misc_animation@0,1504 (conducts) (becomes=922)(onshutdown=748)
|
||||||
922 misc_animation@0,1520 (conducts) (becomes=923)
|
922 misc_animation@0,1520 (conducts) (becomes=923)(onshutdown=748)
|
||||||
923 misc_animation@0,1536 (conducts) (becomes=920)
|
923 misc_animation@0,1536 (conducts) (becomes=920)(onshutdown=748)
|
||||||
924 misc_animation@0,1552 (conducts) (becomes=925)
|
924 misc_animation@0,1552 (conducts) (becomes=925)(onshutdown=751)
|
||||||
925 misc_animation@0,1568 (conducts) (becomes=926)
|
925 misc_animation@0,1568 (conducts) (becomes=926)(onshutdown=751)
|
||||||
926 misc_animation@0,1584 (conducts) (becomes=927)
|
926 misc_animation@0,1584 (conducts) (becomes=927)(onshutdown=751)
|
||||||
927 misc_animation@0,1600 (conducts) (becomes=924)
|
927 misc_animation@0,1600 (conducts) (becomes=924)(onshutdown=751)
|
||||||
928 misc_animation@0,1616 (conducts) (becomes=929)
|
928 misc_animation@0,1616 (conducts) (becomes=929)(onshutdown=752)
|
||||||
929 misc_animation@0,1632 (conducts) (becomes=930)
|
929 misc_animation@0,1632 (conducts) (becomes=930)(onshutdown=752)
|
||||||
930 misc_animation@0,1648 (conducts) (becomes=931)
|
930 misc_animation@0,1648 (conducts) (becomes=931)(onshutdown=752)
|
||||||
931 misc_animation@0,1664 (conducts) (becomes=928)
|
931 misc_animation@0,1664 (conducts) (becomes=928)(onshutdown=752)
|
||||||
# BEGIN STADIUM PLAYFIELD #
|
# BEGIN STADIUM PLAYFIELD #
|
||||||
# Note: the original source code made these unburnable, which doesn't make sense
|
# Note: the original source code made these unburnable, which doesn't make sense
|
||||||
932 misc_animation@0,1680 (conducts) (becomes=933)
|
932 misc_animation@0,1680 (conducts) (becomes=933)
|
||||||
|
|
|
@ -456,18 +456,25 @@ class MapScanner
|
||||||
cchr = city.map[ypos][xpos];
|
cchr = city.map[ypos][xpos];
|
||||||
cchr9 = (char) (cchr & LOMASK);
|
cchr9 = (char) (cchr & LOMASK);
|
||||||
|
|
||||||
if (cchr9 == NUCLEAR ||
|
boolean oldPower = (cchr & PWRBIT) == PWRBIT;
|
||||||
|
boolean newPower = (
|
||||||
|
cchr9 == NUCLEAR ||
|
||||||
cchr9 == POWERPLANT ||
|
cchr9 == POWERPLANT ||
|
||||||
city.hasPower(xpos,ypos))
|
city.hasPower(xpos,ypos)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (newPower && !oldPower)
|
||||||
{
|
{
|
||||||
city.setTile(xpos, ypos, (char) (cchr | PWRBIT));
|
city.setTile(xpos, ypos, (char) (cchr | PWRBIT));
|
||||||
return true;
|
city.powerZone(xpos, ypos, getZoneSizeFor(cchr));
|
||||||
}
|
}
|
||||||
else
|
else if (!newPower && oldPower)
|
||||||
{
|
{
|
||||||
city.setTile(xpos, ypos, (char) (cchr & (~PWRBIT)));
|
city.setTile(xpos, ypos, (char) (cchr & (~PWRBIT)));
|
||||||
return false;
|
city.shutdownZone(xpos, ypos, getZoneSizeFor(cchr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return newPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -528,7 +535,6 @@ class MapScanner
|
||||||
}
|
}
|
||||||
|
|
||||||
city.powerPlants.add(new CityLocation(xpos,ypos));
|
city.powerPlants.add(new CityLocation(xpos,ypos));
|
||||||
coalSmoke();
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case NUCLEAR:
|
case NUCLEAR:
|
||||||
|
@ -1322,26 +1328,6 @@ class MapScanner
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Process the coal powerplant animation.
|
|
||||||
* Note: pollution is not accumulated here; see ptlScan()
|
|
||||||
* instead.
|
|
||||||
*/
|
|
||||||
void coalSmoke()
|
|
||||||
{
|
|
||||||
for (int dx = -1; dx <= 2; dx++) {
|
|
||||||
for (int dy = -1; dy <= 2; dy++) {
|
|
||||||
int tile = city.getTile(xpos+dx, ypos+dy);
|
|
||||||
TileSpec ts = Tiles.get(tile & LOMASK);
|
|
||||||
if (ts != null && ts.onPower != null) {
|
|
||||||
city.setTile(xpos + dx, ypos + dy,
|
|
||||||
(char) (ts.onPower.tileNumber | (tile & ALLBITS))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Record a zone's population change to the rate-of-growth
|
* Record a zone's population change to the rate-of-growth
|
||||||
* map.
|
* map.
|
||||||
|
|
|
@ -2322,6 +2322,7 @@ public class Micropolis
|
||||||
* Should be called whenever the key zone tile of a zone is destroyed,
|
* Should be called whenever the key zone tile of a zone is destroyed,
|
||||||
* since otherwise the user would no longer have a way of destroying
|
* since otherwise the user would no longer have a way of destroying
|
||||||
* the zone.
|
* the zone.
|
||||||
|
* @see #shutdownZone
|
||||||
*/
|
*/
|
||||||
void killZone(int xpos, int ypos, int zoneTile)
|
void killZone(int xpos, int ypos, int zoneTile)
|
||||||
{
|
{
|
||||||
|
@ -2330,6 +2331,9 @@ public class Micropolis
|
||||||
int sz = TileConstants.getZoneSizeFor(zoneTile);
|
int sz = TileConstants.getZoneSizeFor(zoneTile);
|
||||||
int zoneBase = (zoneTile&LOMASK)-1-sz;
|
int zoneBase = (zoneTile&LOMASK)-1-sz;
|
||||||
|
|
||||||
|
// this will take care of stopping smoke animations
|
||||||
|
shutdownZone(xpos, ypos, sz);
|
||||||
|
|
||||||
for (int y = 0; y < sz; y++) {
|
for (int y = 0; y < sz; y++) {
|
||||||
for (int x = 0; x < sz; x++, zoneBase++) {
|
for (int x = 0; x < sz; x++, zoneBase++) {
|
||||||
int xtem = xpos - 1 + x;
|
int xtem = xpos - 1 + x;
|
||||||
|
@ -2338,14 +2342,6 @@ public class Micropolis
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int t = getTile(xtem, ytem);
|
int t = getTile(xtem, ytem);
|
||||||
if ((zoneTile & LOMASK) == POWERPLANT &&
|
|
||||||
(t & LOMASK) >= COALSMOKE1 &&
|
|
||||||
(t & LOMASK) < COALSMOKE4+4) {
|
|
||||||
// animated coal smoke
|
|
||||||
setTile(xtem, ytem, (char)(zoneBase | BULLBIT));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((t & LOMASK) >= ROADBASE) {
|
if ((t & LOMASK) >= ROADBASE) {
|
||||||
setTile(xtem, ytem, (char)(t | BULLBIT));
|
setTile(xtem, ytem, (char)(t | BULLBIT));
|
||||||
}
|
}
|
||||||
|
@ -2353,6 +2349,53 @@ public class Micropolis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a zone has a different image (animation) for when it is
|
||||||
|
* powered, switch to that different image here.
|
||||||
|
* Note: pollution is not accumulated here; see ptlScan()
|
||||||
|
* instead.
|
||||||
|
* @see #shutdownZone
|
||||||
|
*/
|
||||||
|
void powerZone(int xpos, int ypos, int zoneSize)
|
||||||
|
{
|
||||||
|
for (int dx = 0; dx < zoneSize; dx++) {
|
||||||
|
for (int dy = 0; dy < zoneSize; dy++) {
|
||||||
|
int x = xpos - 1 + dx;
|
||||||
|
int y = ypos - 1 + dy;
|
||||||
|
int tile = getTile(x, y);
|
||||||
|
TileSpec ts = Tiles.get(tile & LOMASK);
|
||||||
|
if (ts != null && ts.onPower != null) {
|
||||||
|
setTile(x, y,
|
||||||
|
(char) (ts.onPower.tileNumber | (tile & ALLBITS))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a zone has a different image (animation) for when it is
|
||||||
|
* powered, switch back to the original image.
|
||||||
|
* @see #powerZone
|
||||||
|
* @see #killZone
|
||||||
|
*/
|
||||||
|
void shutdownZone(int xpos, int ypos, int zoneSize)
|
||||||
|
{
|
||||||
|
for (int dx = 0; dx < zoneSize; dx++) {
|
||||||
|
for (int dy = 0; dy < zoneSize; dy++) {
|
||||||
|
int x = xpos - 1 + dx;
|
||||||
|
int y = ypos - 1 + dy;
|
||||||
|
int tile = getTile(x, y);
|
||||||
|
TileSpec ts = Tiles.get(tile & LOMASK);
|
||||||
|
if (ts != null && ts.onShutdown != null) {
|
||||||
|
setTile(x, y,
|
||||||
|
(char) (ts.onShutdown.tileNumber | (tile & ALLBITS))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void makeExplosion(int xpos, int ypos)
|
void makeExplosion(int xpos, int ypos)
|
||||||
{
|
{
|
||||||
makeExplosionAt(xpos*16+8, ypos*16+8);
|
makeExplosionAt(xpos*16+8, ypos*16+8);
|
||||||
|
|
|
@ -7,6 +7,7 @@ public class TileSpec
|
||||||
int tileNumber;
|
int tileNumber;
|
||||||
TileSpec animNext;
|
TileSpec animNext;
|
||||||
TileSpec onPower;
|
TileSpec onPower;
|
||||||
|
TileSpec onShutdown;
|
||||||
boolean canBurn;
|
boolean canBurn;
|
||||||
boolean canConduct;
|
boolean canConduct;
|
||||||
boolean zone;
|
boolean zone;
|
||||||
|
|
|
@ -49,6 +49,10 @@ public class Tiles
|
||||||
if (tmp != null) {
|
if (tmp != null) {
|
||||||
tiles[i].onPower = get(Integer.parseInt(tmp));
|
tiles[i].onPower = get(Integer.parseInt(tmp));
|
||||||
}
|
}
|
||||||
|
tmp = tiles[i].getAttribute("onshutdown");
|
||||||
|
if (tmp != null) {
|
||||||
|
tiles[i].onShutdown = get(Integer.parseInt(tmp));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue