mirror of https://github.com/OpenTTD/OpenTTD
(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
parent
c9d52ddeff
commit
09cf61b466
|
@ -881,6 +881,7 @@ static int AiNew_HowManyVehicles(Player *p)
|
|||
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!
|
||||
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!
|
||||
// (the * 2 is because we have 2 stations ;))
|
||||
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;
|
||||
// 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;
|
||||
if (tiles_a_day == 0) tiles_a_day = 1;
|
||||
if (_players_ainew[p->index].from_deliver) {
|
||||
max_cargo = GetIndustry(_players_ainew[p->index].from_ic)->last_month_production[0];
|
||||
} else {
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
void DrawAircraftDetails(const Vehicle *v, int x, int y)
|
||||
{
|
||||
int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;
|
||||
Money feeder_share = 0;
|
||||
|
||||
for (const Vehicle *u = v ; u != NULL ; u = u->Next()) {
|
||||
if (IsNormalAircraft(u)) {
|
||||
|
@ -53,11 +54,12 @@ void DrawAircraftDetails(const Vehicle *v, int x, int y)
|
|||
SetDParam(1, cargo_count);
|
||||
SetDParam(2, u->cargo.Source());
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#if defined(WITH_COCOA)
|
||||
bool QZ_CanDisplay8bpp();
|
||||
#endif /* defined(WITH_COCOA) */
|
||||
|
||||
/**
|
||||
* The base factory, keeping track of all blitters.
|
||||
*/
|
||||
|
@ -65,13 +69,15 @@ public:
|
|||
{
|
||||
const char *default_blitter = "8bpp-optimized";
|
||||
|
||||
#if defined(__APPLE__)
|
||||
/* MacOS X 10.5 removed 8bpp fullscreen support.
|
||||
* Because of this we will pick 32bpp by default */
|
||||
if (MacOSVersionIsAtLeast(10, 5, 0)) {
|
||||
#if defined(WITH_COCOA)
|
||||
/* Some people reported lack of fullscreen support in 8 bpp mode.
|
||||
* While we prefer 8 bpp since it's faster, we will still have to test for support. */
|
||||
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";
|
||||
}
|
||||
#endif /* defined(__APPLE__) */
|
||||
#endif /* defined(WITH_COCOA) */
|
||||
if (GetBlitters().size() == 0) return NULL;
|
||||
const char *bname = (StrEmpty(name)) ? default_blitter : name;
|
||||
|
||||
|
|
10
src/gfx.cpp
10
src/gfx.cpp
|
@ -568,8 +568,8 @@ Dimension GetStringBoundingBox(const char *str)
|
|||
|
||||
/** Draw a string at the given coordinates with the given colour
|
||||
* @param string the string to draw
|
||||
* @param x offset from left side of the screen, if negative offset from the right side
|
||||
* @param y offset from top side of the screen, if negative offset from the bottom
|
||||
* @param x offset from left side of the screen
|
||||
* @param y offset from top side of the screen
|
||||
* @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
|
||||
* @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;
|
||||
|
||||
if (color != 0xFE) {
|
||||
if (x >= dpi->left + dpi->width ||
|
||||
x + _screen.width * 2 <= dpi->left ||
|
||||
y >= dpi->top + dpi->height ||
|
||||
y + _screen.height <= dpi->top)
|
||||
return x;
|
||||
if (x >= dpi->left + dpi->width || y >= dpi->top + dpi->height) return x;
|
||||
|
||||
if (color != 0xFF) {
|
||||
switch_color:;
|
||||
|
|
|
@ -407,7 +407,9 @@ static CommandCost ClearTile_Industry(TileIndex tile, byte flags)
|
|||
if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR &&
|
||||
!_cheats.magic_bulldozer.value) ||
|
||||
((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);
|
||||
return_cmd_error(STR_4800_IN_THE_WAY);
|
||||
}
|
||||
|
|
|
@ -238,8 +238,8 @@ char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
|
|||
case 0x80: d += Utf8Encode(d, SCC_NEWGRF_PRINT_DWORD + c - 0x7B); break;
|
||||
case 0x81: {
|
||||
StringID string;
|
||||
string = *str++;
|
||||
string |= *str++ << 8;
|
||||
string = ((uint8)*str++);
|
||||
string |= ((uint8)*str++) << 8;
|
||||
d += Utf8Encode(d, SCC_STRING_ID);
|
||||
d += Utf8Encode(d, MapGRFStringID(grfid, string));
|
||||
break;
|
||||
|
@ -270,14 +270,22 @@ char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
|
|||
case 0x9A:
|
||||
switch (*str++) {
|
||||
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: {
|
||||
uint16 tmp = *str++;
|
||||
tmp |= (*str++) << 8;
|
||||
d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD); d += Utf8Encode(d, tmp);
|
||||
uint16 tmp = ((uint8)*str++);
|
||||
tmp |= ((uint8)*str++) << 8;
|
||||
d += Utf8Encode(d, SCC_NEWGRF_PUSH_WORD);
|
||||
d += Utf8Encode(d, tmp);
|
||||
} break;
|
||||
case 4: d += Utf8Encode(d, SCC_NEWGRF_UNPRINT); d += Utf8Encode(d, *str++); break;
|
||||
default: grfmsg(1, "missing handler for extended format code"); break;
|
||||
case 4:
|
||||
d += Utf8Encode(d, SCC_NEWGRF_UNPRINT);
|
||||
d += Utf8Encode(d, *str++);
|
||||
break;
|
||||
default:
|
||||
grfmsg(1, "missing handler for extended format code");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -543,8 +551,8 @@ struct TextRefStack {
|
|||
if (this->position >= 2) {
|
||||
this->position -= 2;
|
||||
} else {
|
||||
for (uint i = lengthof(stack) - 3; i >= this->position; i--) {
|
||||
this->stack[this->position + 2] = this->stack[this->position];
|
||||
for (int i = lengthof(stack) - 1; i >= this->position + 2; i--) {
|
||||
this->stack[i] = this->stack[i - 2];
|
||||
}
|
||||
}
|
||||
this->stack[this->position] = GB(word, 0, 8);
|
||||
|
|
|
@ -74,6 +74,7 @@ struct RoadVehicle : public Vehicle {
|
|||
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); }
|
||||
bool IsInDepot() const { return this->u.road.state == RVSB_IN_DEPOT; }
|
||||
bool IsStoppedInDepot() const;
|
||||
void Tick();
|
||||
void OnNewDay();
|
||||
};
|
||||
|
|
|
@ -334,14 +334,14 @@ void ClearSlot(Vehicle *v)
|
|||
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 (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;
|
||||
}
|
||||
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 (!CheckRoadVehInDepotStopped(v)) {
|
||||
if (!v->IsStoppedInDepot()) {
|
||||
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);
|
||||
|
||||
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 (new_cid >= NUM_CARGO) return CMD_ERROR;
|
||||
|
|
|
@ -25,6 +25,7 @@ void DrawRoadVehDetails(const Vehicle *v, int x, int y)
|
|||
{
|
||||
uint y_offset = RoadVehHasArticPart(v) ? 15 : 0;
|
||||
StringID str;
|
||||
Money feeder_share = 0;
|
||||
|
||||
SetDParam(0, v->engine_type);
|
||||
SetDParam(1, v->build_year);
|
||||
|
@ -70,6 +71,7 @@ void DrawRoadVehDetails(const Vehicle *v, int x, int y)
|
|||
SetDParam(1, u->cargo.Count());
|
||||
SetDParam(2, u->cargo.Source());
|
||||
str = STR_8813_FROM;
|
||||
feeder_share += u->cargo.FeederShare();
|
||||
}
|
||||
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(2, v->cargo.Source());
|
||||
str = STR_8813_FROM;
|
||||
feeder_share += v->cargo.FeederShare();
|
||||
}
|
||||
DrawString(x, y + 21 + y_offset, str, TC_FROMSTRING);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -231,6 +231,7 @@ void DrawTrainDetails(const Vehicle *v, int x, int y, int vscroll_pos, uint16 vs
|
|||
} else {
|
||||
AcceptedCargo act_cargo;
|
||||
AcceptedCargo max_cargo;
|
||||
Money feeder_share = 0;
|
||||
|
||||
memset(max_cargo, 0, sizeof(max_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()) {
|
||||
act_cargo[u->cargo_type] += u->cargo.Count();
|
||||
max_cargo[u->cargo_type] += u->cargo_cap;
|
||||
feeder_share += u->cargo.FeederShare();
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
SetDParam(0, v->cargo.FeederShare());
|
||||
SetDParam(0, feeder_share);
|
||||
DrawString(x, y + 15, STR_FEEDER_CARGO_VALUE, TC_FROMSTRING);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -486,7 +486,10 @@ uint ShowAdditionalText(int x, int y, uint w, EngineID engine)
|
|||
|
||||
/* STR_02BD is used to start the string with {BLACK} */
|
||||
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 */
|
||||
|
|
|
@ -155,6 +155,15 @@ uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_i
|
|||
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 {
|
||||
int display_width;
|
||||
|
|
Loading…
Reference in New Issue