src/engine.cpp
changeset 9061 fe9f2555d02e
parent 9005 d4f2f08337db
child 9068 ae69d946347e
equal deleted inserted replaced
9060:3bc3c707719b 9061:fe9f2555d02e
   189 		SetBit(p->avail_railtypes, rvi->railtype);
   189 		SetBit(p->avail_railtypes, rvi->railtype);
   190 	} else if (e->type == VEH_ROAD) {
   190 	} else if (e->type == VEH_ROAD) {
   191 		SetBit(p->avail_roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
   191 		SetBit(p->avail_roadtypes, HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
   192 	}
   192 	}
   193 
   193 
   194 	e->preview_player = INVALID_PLAYER;
   194 	e->preview_player_rank = 0xFF;
   195 	if (player == _local_player) {
   195 	if (player == _local_player) {
   196 		AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
   196 		AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
   197 	}
   197 	}
   198 }
   198 }
   199 
   199 
   200 static PlayerID GetBestPlayer(PlayerID pp)
   200 static PlayerID GetBestPlayer(uint8 pp)
   201 {
   201 {
   202 	const Player *p;
   202 	const Player *p;
   203 	int32 best_hist;
   203 	int32 best_hist;
   204 	PlayerID best_player;
   204 	PlayerID best_player;
   205 	uint mask = 0;
   205 	uint mask = 0;
   206 
   206 
   207 	do {
   207 	for (; pp != 0; pp--) {
   208 		best_hist = -1;
   208 		best_hist = -1;
   209 		best_player = PLAYER_SPECTATOR;
   209 		best_player = PLAYER_SPECTATOR;
   210 		FOR_ALL_PLAYERS(p) {
   210 		FOR_ALL_PLAYERS(p) {
   211 			if (p->is_active && p->block_preview == 0 && !HasBit(mask, p->index) &&
   211 			if (p->is_active && p->block_preview == 0 && !HasBit(mask, p->index) &&
   212 					p->old_economy[0].performance_history > best_hist) {
   212 					p->old_economy[0].performance_history > best_hist) {
   216 		}
   216 		}
   217 
   217 
   218 		if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR;
   218 		if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR;
   219 
   219 
   220 		SetBit(mask, best_player);
   220 		SetBit(mask, best_player);
   221 	} while (pp--, pp != 0);
   221 	}
   222 
   222 
   223 	return best_player;
   223 	return best_player;
   224 }
   224 }
   225 
   225 
   226 void EnginesDailyLoop()
   226 void EnginesDailyLoop()
   232 	for (i = 0; i != lengthof(_engines); i++) {
   232 	for (i = 0; i != lengthof(_engines); i++) {
   233 		Engine *e = &_engines[i];
   233 		Engine *e = &_engines[i];
   234 
   234 
   235 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) {
   235 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) {
   236 			if (e->flags & ENGINE_OFFER_WINDOW_OPEN) {
   236 			if (e->flags & ENGINE_OFFER_WINDOW_OPEN) {
   237 				if (e->preview_player != 0xFF && !--e->preview_wait) {
   237 				if (e->preview_player_rank != 0xFF && !--e->preview_wait) {
   238 					e->flags &= ~ENGINE_OFFER_WINDOW_OPEN;
   238 					e->flags &= ~ENGINE_OFFER_WINDOW_OPEN;
   239 					DeleteWindowById(WC_ENGINE_PREVIEW, i);
   239 					DeleteWindowById(WC_ENGINE_PREVIEW, i);
   240 					e->preview_player++;
   240 					e->preview_player_rank++;
   241 				}
   241 				}
   242 			} else if (e->preview_player != 0xFF) {
   242 			} else if (e->preview_player_rank != 0xFF) {
   243 				PlayerID best_player = GetBestPlayer(e->preview_player);
   243 				PlayerID best_player = GetBestPlayer(e->preview_player_rank);
   244 
   244 
   245 				if (best_player == PLAYER_SPECTATOR) {
   245 				if (best_player == PLAYER_SPECTATOR) {
   246 					e->preview_player = INVALID_PLAYER;
   246 					e->preview_player_rank = 0xFF;
   247 					continue;
   247 					continue;
   248 				}
   248 				}
   249 
   249 
   250 				if (!IsHumanPlayer(best_player)) {
   250 				if (!IsHumanPlayer(best_player)) {
   251 					/* XXX - TTDBUG: TTD has a bug here ???? */
   251 					/* XXX - TTDBUG: TTD has a bug here ???? */
   271 {
   271 {
   272 	Engine *e;
   272 	Engine *e;
   273 
   273 
   274 	if (!IsEngineIndex(p1)) return CMD_ERROR;
   274 	if (!IsEngineIndex(p1)) return CMD_ERROR;
   275 	e = GetEngine(p1);
   275 	e = GetEngine(p1);
   276 	if (GetBestPlayer(e->preview_player) != _current_player) return CMD_ERROR;
   276 	if (GetBestPlayer(e->preview_player_rank) != _current_player) return CMD_ERROR;
   277 
   277 
   278 	if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_player);
   278 	if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_player);
   279 
   279 
   280 	return CommandCost();
   280 	return CommandCost();
   281 }
   281 }
   359 				/* Introduction date has passed.. show introducing dialog to one player. */
   359 				/* Introduction date has passed.. show introducing dialog to one player. */
   360 				e->flags |= ENGINE_EXCLUSIVE_PREVIEW;
   360 				e->flags |= ENGINE_EXCLUSIVE_PREVIEW;
   361 
   361 
   362 				/* Do not introduce new rail wagons */
   362 				/* Do not introduce new rail wagons */
   363 				if (!IsWagon(e - _engines))
   363 				if (!IsWagon(e - _engines))
   364 					e->preview_player = (PlayerID)1; // Give to the player with the highest rating.
   364 					e->preview_player_rank = 1; // Give to the player with the highest rating.
   365 			}
   365 			}
   366 		}
   366 		}
   367 	}
   367 	}
   368 }
   368 }
   369 
   369 
   611 	    SLE_VAR(Engine, duration_phase_2,    SLE_UINT16),
   611 	    SLE_VAR(Engine, duration_phase_2,    SLE_UINT16),
   612 	    SLE_VAR(Engine, duration_phase_3,    SLE_UINT16),
   612 	    SLE_VAR(Engine, duration_phase_3,    SLE_UINT16),
   613 
   613 
   614 	    SLE_VAR(Engine, lifelength,          SLE_UINT8),
   614 	    SLE_VAR(Engine, lifelength,          SLE_UINT8),
   615 	    SLE_VAR(Engine, flags,               SLE_UINT8),
   615 	    SLE_VAR(Engine, flags,               SLE_UINT8),
   616 	    SLE_VAR(Engine, preview_player,      SLE_UINT8),
   616 	    SLE_VAR(Engine, preview_player_rank, SLE_UINT8),
   617 	    SLE_VAR(Engine, preview_wait,        SLE_UINT8),
   617 	    SLE_VAR(Engine, preview_wait,        SLE_UINT8),
   618 	SLE_CONDNULL(1, 0, 44),
   618 	SLE_CONDNULL(1, 0, 44),
   619 	    SLE_VAR(Engine, player_avail,        SLE_UINT8),
   619 	    SLE_VAR(Engine, player_avail,        SLE_UINT8),
   620 	SLE_CONDSTR(Engine, name,                SLE_STR, 0,                 84, SL_MAX_VERSION),
   620 	SLE_CONDSTR(Engine, name,                SLE_STR, 0,                 84, SL_MAX_VERSION),
   621 
   621