engine.c
changeset 193 0a7025304867
parent 114 6a2af0c2d0db
child 205 49e96fd94d63
equal deleted inserted replaced
192:614bba52258d 193:0a7025304867
   122 	for(e=_engines, ei=_engine_info; e != endof(_engines); e++,ei++) {
   122 	for(e=_engines, ei=_engine_info; e != endof(_engines); e++,ei++) {
   123 		e->age = 0;
   123 		e->age = 0;
   124 		e->railtype = ei->railtype_climates >> 4;
   124 		e->railtype = ei->railtype_climates >> 4;
   125 		e->flags = 0;
   125 		e->flags = 0;
   126 		e->player_avail = 0;
   126 		e->player_avail = 0;
   127 		
   127 
   128 		r = Random();
   128 		r = Random();
   129 		e->intro_date = (uint16)((r & 0x1FF) + ei->base_intro);
   129 		e->intro_date = (uint16)((r & 0x1FF) + ei->base_intro);
   130 		if (e->intro_date <= _date) {
   130 		if (e->intro_date <= _date) {
   131 			e->age = (_date - e->intro_date) >> 5;
   131 			e->age = (_date - e->intro_date) >> 5;
   132 			e->player_avail = (byte)-1;
   132 			e->player_avail = (byte)-1;
   189 
   189 
   190 	wos = &_engine_wagon_overrides[engine];
   190 	wos = &_engine_wagon_overrides[engine];
   191 	wos->overrides_count++;
   191 	wos->overrides_count++;
   192 	wos->overrides = realloc(wos->overrides,
   192 	wos->overrides = realloc(wos->overrides,
   193 	                         wos->overrides_count * sizeof(struct WagonOverride));
   193 	                         wos->overrides_count * sizeof(struct WagonOverride));
   194 	
   194 
   195 	wo = &wos->overrides[wos->overrides_count - 1];
   195 	wo = &wos->overrides[wos->overrides_count - 1];
   196 	wo->superset = *superset;
   196 	wo->superset = *superset;
   197 	wo->trains = trains;
   197 	wo->trains = trains;
   198 	wo->train_id = malloc(trains);
   198 	wo->train_id = malloc(trains);
   199 	memcpy(wo->train_id, train_id, trains);
   199 	memcpy(wo->train_id, train_id, trains);
   244 		struct SpriteSuperSet *overset;
   244 		struct SpriteSuperSet *overset;
   245 
   245 
   246 		overset = GetWagonOverrideSpriteSet(engine, overriding_engine);
   246 		overset = GetWagonOverrideSpriteSet(engine, overriding_engine);
   247 		if (overset) superset = overset;
   247 		if (overset) superset = overset;
   248 	}
   248 	}
   249 	
   249 
   250 	if (!superset->sprites_per_set && cargo != 29) {
   250 	if (!superset->sprites_per_set && cargo != 29) {
   251 		// This superset is empty but perhaps there'll be a default one.
   251 		// This superset is empty but perhaps there'll be a default one.
   252 		superset = &_engine_custom_sprites[engine][29];
   252 		superset = &_engine_custom_sprites[engine][29];
   253 	}
   253 	}
   254 
   254 
   305 	Player *p;
   305 	Player *p;
   306 
   306 
   307 	SETBIT(e->player_avail, player);
   307 	SETBIT(e->player_avail, player);
   308 
   308 
   309 	p = DEREF_PLAYER(player);
   309 	p = DEREF_PLAYER(player);
   310 	
   310 
   311 	UPDATE_PLAYER_RAILTYPE(e,p);
   311 	UPDATE_PLAYER_RAILTYPE(e,p);
   312 
   312 
   313 	e->preview_player = 0xFF;
   313 	e->preview_player = 0xFF;
   314 	InvalidateWindowClasses(WC_BUILD_VEHICLE);
   314 	InvalidateWindowClasses(WC_BUILD_VEHICLE);
   315 }
   315 }
   331 			if (e->flags & ENGINE_PREVIEWING) {
   331 			if (e->flags & ENGINE_PREVIEWING) {
   332 				if (!--e->preview_wait) {
   332 				if (!--e->preview_wait) {
   333 					e->flags &= ~ENGINE_PREVIEWING;
   333 					e->flags &= ~ENGINE_PREVIEWING;
   334 					DeleteWindowById(WC_ENGINE_PREVIEW, i);
   334 					DeleteWindowById(WC_ENGINE_PREVIEW, i);
   335 					e->preview_player++;
   335 					e->preview_player++;
   336 				}	
   336 				}
   337 			} else if (e->preview_player != 0xFF) {
   337 			} else if (e->preview_player != 0xFF) {
   338 				num = e->preview_player;
   338 				num = e->preview_player;
   339 				mask = 0;
   339 				mask = 0;
   340 				do {
   340 				do {
   341 					best_hist = -1;
   341 					best_hist = -1;
   342 					best_player = -1;
   342 					best_player = -1;
   343 					FOR_ALL_PLAYERS(p) {
   343 					FOR_ALL_PLAYERS(p) {
   344 						if (p->is_active && p->block_preview == 0 && !HASBIT(mask,p->index) && 
   344 						if (p->is_active && p->block_preview == 0 && !HASBIT(mask,p->index) &&
   345 								p->old_economy[0].performance_history > best_hist) {
   345 								p->old_economy[0].performance_history > best_hist) {
   346 							best_hist = p->old_economy[0].performance_history;
   346 							best_hist = p->old_economy[0].performance_history;
   347 							best_player = p->index;
   347 							best_player = p->index;
   348 						}
   348 						}
   349 					}
   349 					}
   351 						e->preview_player = 0xFF;
   351 						e->preview_player = 0xFF;
   352 						goto next_engine;
   352 						goto next_engine;
   353 					}
   353 					}
   354 					mask |= (1 << best_player);
   354 					mask |= (1 << best_player);
   355 				} while (--num != 0);
   355 				} while (--num != 0);
   356 				
   356 
   357 				if (!IS_HUMAN_PLAYER(best_player)) {
   357 				if (!IS_HUMAN_PLAYER(best_player)) {
   358 					/* TTDBUG: TTD has a bug here */
   358 					/* TTDBUG: TTD has a bug here */
   359 					AcceptEnginePreview(e, best_player);
   359 					AcceptEnginePreview(e, best_player);
   360 				} else {
   360 				} else {
   361 					e->flags |= ENGINE_PREVIEWING;
   361 					e->flags |= ENGINE_PREVIEWING;
   362 					e->preview_wait = 20;
   362 					e->preview_wait = 20;
   363 					if (IS_INTERACTIVE_PLAYER(best_player)) {
   363 					if (IS_INTERACTIVE_PLAYER(best_player)) {
   364 						ShowEnginePreviewWindow(i);					
   364 						ShowEnginePreviewWindow(i);
   365 					}
   365 					}
   366 				}
   366 				}
   367 			}
   367 			}
   368 		}
   368 		}
   369 		next_engine:;
   369 		next_engine:;
   388 	// prevent that player from getting future intro periods for a while.
   388 	// prevent that player from getting future intro periods for a while.
   389 	if (e->flags&ENGINE_INTRODUCING) {
   389 	if (e->flags&ENGINE_INTRODUCING) {
   390 		FOR_ALL_PLAYERS(p) {
   390 		FOR_ALL_PLAYERS(p) {
   391 			if (!HASBIT(e->player_avail,p->index))
   391 			if (!HASBIT(e->player_avail,p->index))
   392 				continue;
   392 				continue;
   393 		
   393 
   394 			for(v=_vehicles;;) {
   394 			for(v=_vehicles;;) {
   395 				if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship ||
   395 				if (v->type == VEH_Train || v->type == VEH_Road || v->type == VEH_Ship ||
   396 						(v->type == VEH_Aircraft && v->subtype <= 2)) {
   396 						(v->type == VEH_Aircraft && v->subtype <= 2)) {
   397 					if (v->owner == p->index && v->engine_type == index) break;
   397 					if (v->owner == p->index && v->engine_type == index) break;
   398 				}
   398 				}
   464 	StringID str;
   464 	StringID str;
   465 
   465 
   466 	str = AllocateName((byte*)_decode_parameters, 0);
   466 	str = AllocateName((byte*)_decode_parameters, 0);
   467 	if (str == 0)
   467 	if (str == 0)
   468 		return CMD_ERROR;
   468 		return CMD_ERROR;
   469 	
   469 
   470 	if (flags & DC_EXEC) {
   470 	if (flags & DC_EXEC) {
   471 		StringID old_str = _engine_name_strings[p1];
   471 		StringID old_str = _engine_name_strings[p1];
   472 		_engine_name_strings[p1] = str;
   472 		_engine_name_strings[p1] = str;
   473 		DeleteName(old_str);
   473 		DeleteName(old_str);
   474 		_vehicle_design_names |= 3;
   474 		_vehicle_design_names |= 3;