Micropolis
power.cpp
Go to the documentation of this file.
1
/* power.cpp
2
*
3
* Micropolis, Unix Version. This game was released for the Unix platform
4
* in or about 1990 and has been modified for inclusion in the One Laptop
5
* Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If
6
* you need assistance with this program, you may contact:
7
* http://wiki.laptop.org/go/Micropolis or email micropolis@laptop.org.
8
*
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation, either version 3 of the License, or (at
12
* your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful, but
15
* WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* General Public License for more details. You should have received a
18
* copy of the GNU General Public License along with this program. If
19
* not, see <http://www.gnu.org/licenses/>.
20
*
21
* ADDITIONAL TERMS per GNU GPL Section 7
22
*
23
* No trademark or publicity rights are granted. This license does NOT
24
* give you any right, title or interest in the trademark SimCity or any
25
* other Electronic Arts trademark. You may not distribute any
26
* modification of this program using the trademark SimCity or claim any
27
* affliation or association with Electronic Arts Inc. or its employees.
28
*
29
* Any propagation or conveyance of this program must include this
30
* copyright notice and these terms.
31
*
32
* If you convey this program (or any modifications of it) and assume
33
* contractual liability for the program to recipients of it, you agree
34
* to indemnify Electronic Arts for any liability that those contractual
35
* assumptions impose on Electronic Arts.
36
*
37
* You may not misrepresent the origins of this program; modified
38
* versions of the program must be marked as such and not identified as
39
* the original program.
40
*
41
* This disclaimer supplements the one included in the General Public
42
* License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
43
* PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
44
* OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF
45
* SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS
46
* DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
47
* INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
48
* FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
49
* RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
50
* USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST
51
* INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
52
* MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
53
* UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
54
* WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
55
* CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
56
* ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME
57
* JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
58
* WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
59
* CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
60
* NOT APPLY TO YOU.
61
*/
62
77
78
79
#include "
micropolis.h
"
80
#include "
text.h
"
81
83
// Constants
84
86
static
const
Quad
COAL_POWER_STRENGTH
= 700L;
87
89
static
const
Quad
NUCLEAR_POWER_STRENGTH
= 2000L;
90
91
93
94
104
bool
Micropolis::testForConductive
(
const
Position
& pos,
Direction2
testDir)
105
{
106
Position
movedPos(pos);
107
108
if
(movedPos.
move
(testDir)) {
109
if
((
map
[movedPos.
posX
][movedPos.
posY
] &
CONDBIT
) ==
CONDBIT
) {
110
if
(!
powerGridMap
.
worldGet
(movedPos.
posX
, movedPos.
posY
)) {
111
return
true
;
112
}
113
}
114
}
115
116
return
false
;
117
}
118
119
125
void
Micropolis::doPowerScan
()
126
{
127
Direction2
anyDir,dir;
128
int
conNum;
129
130
// Clear power map.
131
powerGridMap
.
clear
();
132
133
// Power that the combined coal and nuclear power plants can deliver.
134
Quad maxPower =
coalPowerPop
*
COAL_POWER_STRENGTH
+
135
nuclearPowerPop
*
NUCLEAR_POWER_STRENGTH
;
136
137
Quad numPower = 0;
// Amount of power used.
138
139
while
(
powerStackPointer
> 0) {
140
Position
pos =
pullPowerStack
();
141
anyDir =
DIR2_INVALID
;
142
do
{
143
numPower++;
144
if
(numPower > maxPower) {
145
sendMessage
(
MESSAGE_NOT_ENOUGH_POWER
);
146
return
;
147
}
148
if
(anyDir !=
DIR2_INVALID
) {
149
pos.
move
(anyDir);
150
}
151
powerGridMap
.
worldSet
(pos.
posX
, pos.
posY
, 1);
152
conNum = 0;
153
dir =
DIR2_BEGIN
;
154
while
(dir <
DIR2_END
&& conNum < 2) {
155
if
(
testForConductive
(pos, dir)) {
156
conNum++;
157
anyDir = dir;
158
}
159
dir =
increment90
(dir);
160
}
161
if
(conNum > 1) {
162
pushPowerStack
(pos);
163
}
164
}
while
(conNum);
165
}
166
}
167
168
173
void
Micropolis::pushPowerStack
(
const
Position
&pos)
174
{
175
if
(
powerStackPointer
< (
POWER_STACK_SIZE
- 2)) {
176
powerStackPointer
++;
177
powerStackXY
[
powerStackPointer
] = pos;
178
}
179
}
180
181
187
Position
Micropolis::pullPowerStack
()
188
{
189
assert(
powerStackPointer
> 0);
190
powerStackPointer
--;
191
return
powerStackXY
[
powerStackPointer
+ 1];
192
}
193
194
Map::worldGet
DATA worldGet(int x, int y) const
Definition:
map_type.h:316
Map::clear
void clear()
Definition:
map_type.h:222
Map::worldSet
void worldSet(int x, int y, DATA val)
Definition:
map_type.h:297
Micropolis::pullPowerStack
Position pullPowerStack()
Definition:
power.cpp:187
Micropolis::powerStackPointer
int powerStackPointer
Stack counter, points to top-most item.
Definition:
micropolis.h:1993
Micropolis::powerGridMap
MapByte1 powerGridMap
Definition:
micropolis.h:1281
Micropolis::powerStackXY
Position powerStackXY[POWER_STACK_SIZE]
Definition:
micropolis.h:1996
Micropolis::pushPowerStack
void pushPowerStack(const Position &pos)
Definition:
power.cpp:173
Micropolis::map
unsigned short * map[WORLD_W]
Definition:
micropolis.h:1120
Micropolis::coalPowerPop
short coalPowerPop
Definition:
micropolis.h:1040
Micropolis::testForConductive
bool testForConductive(const Position &pos, Direction2 testDir)
Definition:
power.cpp:104
Micropolis::sendMessage
void sendMessage(short Mnum, short x=NOWHERE, short y=NOWHERE, bool picture=false, bool important=false)
Definition:
message.cpp:390
Micropolis::nuclearPowerPop
short nuclearPowerPop
Definition:
micropolis.h:1045
Micropolis::doPowerScan
void doPowerScan()
Definition:
power.cpp:125
Position
Definition:
position.h:154
Position::posY
int posY
Vertical coordnate of the position.
Definition:
position.h:169
Position::posX
int posX
Horizontal coordinate of the position.
Definition:
position.h:168
Position::move
bool move(Direction2 dir)
Definition:
position.cpp:161
micropolis.h
Header file for Micropolis game engine.
POWER_STACK_SIZE
static const int POWER_STACK_SIZE
Definition:
micropolis.h:226
Direction2
Direction2
Definition:
position.h:86
DIR2_BEGIN
@ DIR2_BEGIN
First valid direction.
Definition:
position.h:97
DIR2_END
@ DIR2_END
End-condition for directions.
Definition:
position.h:98
DIR2_INVALID
@ DIR2_INVALID
Invalid direction.
Definition:
position.h:87
increment90
static Direction2 increment90(Direction2 dir)
Definition:
position.h:117
NUCLEAR_POWER_STRENGTH
static const Quad NUCLEAR_POWER_STRENGTH
Definition:
power.cpp:89
COAL_POWER_STRENGTH
static const Quad COAL_POWER_STRENGTH
Definition:
power.cpp:86
text.h
Defines string identification numbers for texts used in the Micropolis game engine.
MESSAGE_NOT_ENOUGH_POWER
@ MESSAGE_NOT_ENOUGH_POWER
40: Brownouts, build another Power Plant.
Definition:
text.h:152
CONDBIT
@ CONDBIT
bit 14. tile can conduct electricity.
Definition:
tool.h:121
MicropolisEngine
src
power.cpp
Generated by
1.9.1