1
0
Fork 0

(svn r14267) [0.6] -Backport from trunk:

- Fix: Make the 'Transfer Credit' display aware of the entire consist, not only the first vehicle (r14098)
- Fix: Do not flood a NewGRF industry when it implicitly tells that it wants to be build on water (land shape flags bit 5) [FS#2230] (r14093)
- Fix: The vehicle window of articulated road vehicles would show the clone/refit button when the vehicle was not completely stopped in the depot (r14090)
- Fix: Flawed parsing of words (as in 2 bytes) in GRF strings due to sign extension [FS#2228] (r14087)
- Fix: Division by 0 in NewAI [FS#2226] (r14062)
- Fix: NewGRF callback 23 did not use the NewGRF compatible text stack [FS#2224] (r14058)
- Fix: NewGRF text stack's "push word" didn't move the data around properly (r14057)
- Fix: Long strings in the edit box would cause OpenTTD to stop drawing the string. This is especially noticable with low resolutions and the chat input box (r14054)
- Fix: [OSX] changed the condition for selecting 8 or 32 bpp blitter by default. Now we will pick 32 bpp if no 8 bpp fullscreen resolutions are available on the main display (the one with the dock) (r14032)
release/0.6
rubidium 2008-09-07 21:41:47 +00:00
parent c9d52ddeff
commit 09cf61b466
12 changed files with 67 additions and 33 deletions

View File

@ -881,6 +881,7 @@ static int AiNew_HowManyVehicles(Player *p)
length = _players_ainew[p->index].path_info.route_length; length = _players_ainew[p->index].path_info.route_length;
// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done! // Calculating tiles a day a vehicle moves is not easy.. this is how it must be done!
tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16; tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16;
if (tiles_a_day == 0) tiles_a_day = 1;
// We want a vehicle in a station once a month at least, so, calculate it! // We want a vehicle in a station once a month at least, so, calculate it!
// (the * 2 is because we have 2 stations ;)) // (the * 2 is because we have 2 stations ;))
amount = length * 2 * 2 / tiles_a_day / 30; amount = length * 2 * 2 / tiles_a_day / 30;
@ -897,6 +898,7 @@ static int AiNew_HowManyVehicles(Player *p)
length = _players_ainew[p->index].path_info.route_length; length = _players_ainew[p->index].path_info.route_length;
// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done! // Calculating tiles a day a vehicle moves is not easy.. this is how it must be done!
tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16; tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16;
if (tiles_a_day == 0) tiles_a_day = 1;
if (_players_ainew[p->index].from_deliver) { if (_players_ainew[p->index].from_deliver) {
max_cargo = GetIndustry(_players_ainew[p->index].from_ic)->last_month_production[0]; max_cargo = GetIndustry(_players_ainew[p->index].from_ic)->last_month_production[0];
} else { } else {

View File

@ -28,6 +28,7 @@
void DrawAircraftDetails(const Vehicle *v, int x, int y) void DrawAircraftDetails(const Vehicle *v, int x, int y)
{ {
int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0; int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;
Money feeder_share = 0;
for (const Vehicle *u = v ; u != NULL ; u = u->Next()) { for (const Vehicle *u = v ; u != NULL ; u = u->Next()) {
if (IsNormalAircraft(u)) { if (IsNormalAircraft(u)) {
@ -53,11 +54,12 @@ void DrawAircraftDetails(const Vehicle *v, int x, int y)
SetDParam(1, cargo_count); SetDParam(1, cargo_count);
SetDParam(2, u->cargo.Source()); SetDParam(2, u->cargo.Source());
DrawString(x, y + 21 + y_offset, STR_8813_FROM, TC_FROMSTRING); DrawString(x, y + 21 + y_offset, STR_8813_FROM, TC_FROMSTRING);
feeder_share += u->cargo.FeederShare();
} }
} }
} }
SetDParam(0, v->cargo.FeederShare()); SetDParam(0, feeder_share);
DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING); DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
} }

View File

@ -9,6 +9,10 @@
#include <string> #include <string>
#include <map> #include <map>
#if defined(WITH_COCOA)
bool QZ_CanDisplay8bpp();
#endif /* defined(WITH_COCOA) */
/** /**
* The base factory, keeping track of all blitters. * The base factory, keeping track of all blitters.
*/ */
@ -65,13 +69,15 @@ public:
{ {
const char *default_blitter = "8bpp-optimized"; const char *default_blitter = "8bpp-optimized";
#if defined(__APPLE__) #if defined(WITH_COCOA)
/* MacOS X 10.5 removed 8bpp fullscreen support. /* Some people reported lack of fullscreen support in 8 bpp mode.
* Because of this we will pick 32bpp by default */ * While we prefer 8 bpp since it's faster, we will still have to test for support. */
if (MacOSVersionIsAtLeast(10, 5, 0)) { if (!QZ_CanDisplay8bpp()) {
/* The main display can't go to 8 bpp fullscreen mode.
* We will have to switch to 32 bpp by default. */
default_blitter = "32bpp-anim"; default_blitter = "32bpp-anim";
} }
#endif /* defined(__APPLE__) */ #endif /* defined(WITH_COCOA) */
if (GetBlitters().size() == 0) return NULL; if (GetBlitters().size() == 0) return NULL;
const char *bname = (StrEmpty(name)) ? default_blitter : name; const char *bname = (StrEmpty(name)) ? default_blitter : name;

View File

@ -568,8 +568,8 @@ Dimension GetStringBoundingBox(const char *str)
/** Draw a string at the given coordinates with the given colour /** Draw a string at the given coordinates with the given colour
* @param string the string to draw * @param string the string to draw
* @param x offset from left side of the screen, if negative offset from the right side * @param x offset from left side of the screen
* @param y offset from top side of the screen, if negative offset from the bottom * @param y offset from top side of the screen
* @param real_color colour of the string, see _string_colormap in * @param real_color colour of the string, see _string_colormap in
* table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h
* @return the x-coordinates where the drawing has finished. If nothing is drawn * @return the x-coordinates where the drawing has finished. If nothing is drawn
@ -585,11 +585,7 @@ int DoDrawString(const char *string, int x, int y, uint16 real_color)
byte previous_color = color; byte previous_color = color;
if (color != 0xFE) { if (color != 0xFE) {
if (x >= dpi->left + dpi->width || if (x >= dpi->left + dpi->width || y >= dpi->top + dpi->height) return x;
x + _screen.width * 2 <= dpi->left ||
y >= dpi->top + dpi->height ||
y + _screen.height <= dpi->top)
return x;
if (color != 0xFF) { if (color != 0xFF) {
switch_color:; switch_color:;

View File

@ -407,7 +407,9 @@ static CommandCost ClearTile_Industry(TileIndex tile, byte flags)
if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR && if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR &&
!_cheats.magic_bulldozer.value) || !_cheats.magic_bulldozer.value) ||
((flags & DC_AUTO) != 0) || ((flags & DC_AUTO) != 0) ||
(_current_player == OWNER_WATER && (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER))) { (_current_player == OWNER_WATER &&
((indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) ||
HasBit(GetIndustryTileSpec(GetIndustryGfx(tile))->slopes_refused, 5)))) {
SetDParam(0, indspec->name); SetDParam(0, indspec->name);
return_cmd_error(STR_4800_IN_THE_WAY); return_cmd_error(STR_4800_IN_THE_WAY);
} }

View File

@ -238,8 +238,8 @@ char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
case 0x80: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD + c - 0x7B); break; case 0x80: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD + c - 0x7B); break;
case 0x81: { case 0x81: {
StringID string; StringID string;
string = *str++; string = ((uint8)*str++);
string |= *str++ << 8; string |= ((uint8)*str++) << 8;
d += Utf8Encode(d, SCC_STRING_ID); d += Utf8Encode(d, SCC_STRING_ID);
d += Utf8Encode(d, MapGRFStringID(grfid, string)); d += Utf8Encode(d, MapGRFStringID(grfid, string));
break; break;
@ -270,14 +270,22 @@ char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
case 0x9A: case 0x9A:
switch (*str++) { switch (*str++) {
case 0: /* FALL THROUGH */ case 0: /* FALL THROUGH */
case 1: d += Utf8Encode(d, SCC_NEWGRF_PRINT_QWORD_CURRENCY); break; case 1:
d += Utf8Encode(d, SCC_NEWGRF_PRINT_QWORD_CURRENCY);
break;
case 3: { case 3: {
uint16 tmp = *str++; uint16 tmp = ((uint8)*str++);
tmp |= (*str++) << 8; tmp |= ((uint8)*str++) << 8;
d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD); d += Utf8Encode(d, tmp); d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD);
d += Utf8Encode(d, tmp);
} break; } break;
case 4: d += Utf8Encode(d, SCC_NEWGRF_UNPRINT); d += Utf8Encode(d, *str++); break; case 4:
default: grfmsg(1, "missing handler for extended format code"); break; d += Utf8Encode(d, SCC_NEWGRF_UNPRINT);
d += Utf8Encode(d, *str++);
break;
default:
grfmsg(1, "missing handler for extended format code");
break;
} }
break; break;
@ -543,8 +551,8 @@ struct TextRefStack {
if (this->position >= 2) { if (this->position >= 2) {
this->position -= 2; this->position -= 2;
} else { } else {
for (uint i = lengthof(stack) - 3; i >= this->position; i--) { for (int i = lengthof(stack) - 1; i >= this->position + 2; i--) {
this->stack[this->position + 2] = this->stack[this->position]; this->stack[i] = this->stack[i - 2];
} }
} }
this->stack[this->position] = GB(word, 0, 8); this->stack[this->position] = GB(word, 0, 8);

View File

@ -74,6 +74,7 @@ struct RoadVehicle : public Vehicle {
int GetDisplayMaxSpeed() const { return this->max_speed * 10 / 32; } int GetDisplayMaxSpeed() const { return this->max_speed * 10 / 32; }
Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * GetPriceByIndex(RoadVehInfo(this->engine_type)->running_cost_class); } Money GetRunningCost() const { return RoadVehInfo(this->engine_type)->running_cost * GetPriceByIndex(RoadVehInfo(this->engine_type)->running_cost_class); }
bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; } bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; }
bool IsStoppedInDepot() const;
void Tick(); void Tick();
void OnNewDay(); void OnNewDay();
}; };

View File

@ -334,14 +334,14 @@ void ClearSlot(Vehicle *v)
DEBUG(ms, 3, "Clearing slot at 0x%X", rs->xy); DEBUG(ms, 3, "Clearing slot at 0x%X", rs->xy);
} }
static bool CheckRoadVehInDepotStopped(const Vehicle *v) bool RoadVehicle::IsStoppedInDepot() const
{ {
TileIndex tile = v->tile; TileIndex tile = this->tile;
if (!IsTileDepotType(tile, TRANSPORT_ROAD)) return false; if (!IsTileDepotType(tile, TRANSPORT_ROAD)) return false;
if (IsRoadVehFront(v) && !(v->vehstatus & VS_STOPPED)) return false; if (IsRoadVehFront(this) && !(this->vehstatus & VS_STOPPED)) return false;
for (; v != NULL; v = v->Next()) { for (const Vehicle *v = this; v != NULL; v = v->Next()) {
if (v->u.road.state != RVSB_IN_DEPOT || v->tile != tile) return false; if (v->u.road.state != RVSB_IN_DEPOT || v->tile != tile) return false;
} }
return true; return true;
@ -365,7 +365,7 @@ CommandCost CmdSellRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE); if (HASBITS(v->vehstatus, VS_CRASHED)) return_cmd_error(STR_CAN_T_SELL_DESTROYED_VEHICLE);
if (!CheckRoadVehInDepotStopped(v)) { if (!v->IsStoppedInDepot()) {
return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
} }
@ -2150,7 +2150,7 @@ CommandCost CmdRefitRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v = GetVehicle(p1); v = GetVehicle(p1);
if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
if (!CheckRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); if (!v->IsStoppedInDepot()) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE);
if (v->vehstatus & VS_CRASHED) return_cmd_error(STR_CAN_T_REFIT_DESTROYED_VEHICLE); if (v->vehstatus & VS_CRASHED) return_cmd_error(STR_CAN_T_REFIT_DESTROYED_VEHICLE);
if (new_cid >= NUM_CARGO) return CMD_ERROR; if (new_cid >= NUM_CARGO) return CMD_ERROR;

View File

@ -25,6 +25,7 @@ void DrawRoadVehDetails(const Vehicle *v, int x, int y)
{ {
uint y_offset = RoadVehHasArticPart(v) ? 15 : 0; uint y_offset = RoadVehHasArticPart(v) ? 15 : 0;
StringID str; StringID str;
Money feeder_share = 0;
SetDParam(0, v->engine_type); SetDParam(0, v->engine_type);
SetDParam(1, v->build_year); SetDParam(1, v->build_year);
@ -70,6 +71,7 @@ void DrawRoadVehDetails(const Vehicle *v, int x, int y)
SetDParam(1, u->cargo.Count()); SetDParam(1, u->cargo.Count());
SetDParam(2, u->cargo.Source()); SetDParam(2, u->cargo.Source());
str = STR_8813_FROM; str = STR_8813_FROM;
feeder_share += u->cargo.FeederShare();
} }
DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING); DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING);
@ -88,12 +90,13 @@ void DrawRoadVehDetails(const Vehicle *v, int x, int y)
SetDParam(1, v->cargo.Count()); SetDParam(1, v->cargo.Count());
SetDParam(2, v->cargo.Source()); SetDParam(2, v->cargo.Source());
str = STR_8813_FROM; str = STR_8813_FROM;
feeder_share += v->cargo.FeederShare();
} }
DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING); DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING);
} }
/* Draw Transfer credits text */ /* Draw Transfer credits text */
SetDParam(0, v->cargo.FeederShare()); SetDParam(0, feeder_share);
DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING); DrawString(x, y + 33 + y_offset, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
} }

View File

@ -231,6 +231,7 @@ void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vs
} else { } else {
AcceptedCargo act_cargo; AcceptedCargo act_cargo;
AcceptedCargo max_cargo; AcceptedCargo max_cargo;
Money feeder_share = 0;
memset(max_cargo, 0, sizeof(max_cargo)); memset(max_cargo, 0, sizeof(max_cargo));
memset(act_cargo, 0, sizeof(act_cargo)); memset(act_cargo, 0, sizeof(act_cargo));
@ -238,6 +239,7 @@ void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vs
for (const Vehicle *u = v; u != NULL ; u = u->Next()) { for (const Vehicle *u = v; u != NULL ; u = u->Next()) {
act_cargo[u->cargo_type] += u->cargo.Count(); act_cargo[u->cargo_type] += u->cargo.Count();
max_cargo[u->cargo_type] += u->cargo_cap; max_cargo[u->cargo_type] += u->cargo_cap;
feeder_share += u->cargo.FeederShare();
} }
/* draw total cargo tab */ /* draw total cargo tab */
@ -253,7 +255,7 @@ void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vs
DrawString(x, y + 2, FreightWagonMult(i) > 1 ? STR_TOTAL_CAPACITY_MULT : STR_TOTAL_CAPACITY, TC_FROMSTRING); DrawString(x, y + 2, FreightWagonMult(i) > 1 ? STR_TOTAL_CAPACITY_MULT : STR_TOTAL_CAPACITY, TC_FROMSTRING);
} }
} }
SetDParam(0, v->cargo.FeederShare()); SetDParam(0, feeder_share);
DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING); DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
} }
} }

View File

@ -486,7 +486,10 @@ uint ShowAdditionalText(int x, int y, uint w, EngineID engine)
/* STR_02BD is used to start the string with {BLACK} */ /* STR_02BD is used to start the string with {BLACK} */
SetDParam(0, GetGRFStringID(GetEngineGRFID(engine), 0xD000 + callback)); SetDParam(0, GetGRFStringID(GetEngineGRFID(engine), 0xD000 + callback));
return DrawStringMultiLine(x, y, STR_02BD, w); PrepareTextRefStackUsage(0);
uint result = DrawStringMultiLine(x, y, STR_02BD, w);
StopTextRefStackUsage();
return result;
} }
/** Display list of cargo types of the engine, for the purchase information window */ /** Display list of cargo types of the engine, for the purchase information window */

View File

@ -155,6 +155,15 @@ uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_i
return count; return count;
} }
/* Small function to test if the main display can display 8 bpp in fullscreen */
bool QZ_CanDisplay8bpp()
{
OTTD_Point p;
/* We want to know if 8 bpp is possible in fullscreen and not anything about resolutions.
* Because of this we want to fill a list of 1 resolution of 8 bpp on display 0 (main) and return if we found one. */
return QZ_ListModes(&p, 1, 0, 8);
}
class FullscreenSubdriver: public CocoaSubdriver { class FullscreenSubdriver: public CocoaSubdriver {
int display_width; int display_width;