|  |  |  | @@ -781,13 +781,40 @@ static const NIVariable _niv_industries[] = { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | class NIHIndustry : public NIHelper { | 
		
	
		
			
				|  |  |  |  | 	bool IsInspectable(uint index) const override        { return true; } | 
		
	
		
			
				|  |  |  |  | 	bool ShowExtraInfoOnly(uint index) const override    { return GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile == nullptr; } | 
		
	
		
			
				|  |  |  |  | 	bool ShowSpriteDumpButton(uint index) const override { return true; } | 
		
	
		
			
				|  |  |  |  | 	uint GetParent(uint index) const override            { return GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); } | 
		
	
		
			
				|  |  |  |  | 	const void *GetInstance(uint index)const override    { return Industry::Get(index); } | 
		
	
		
			
				|  |  |  |  | 	const void *GetSpec(uint index) const override       { return GetIndustrySpec(Industry::Get(index)->type); } | 
		
	
		
			
				|  |  |  |  | 	void SetStringParameters(uint index) const override  { this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); } | 
		
	
		
			
				|  |  |  |  | 	uint32 GetGRFID(uint index) const override           { return (!this->ShowExtraInfoOnly(index)) ? GetIndustrySpec(Industry::Get(index)->type)->grf_prop.grffile->grfid : 0; } | 
		
	
		
			
				|  |  |  |  | 	uint GetParent(uint index) const override            { return HasBit(index, 26) ? UINT32_MAX : GetInspectWindowNumber(GSF_FAKE_TOWNS, Industry::Get(index)->town->index); } | 
		
	
		
			
				|  |  |  |  | 	const void *GetInstance(uint index)const override    { return HasBit(index, 26) ? nullptr : Industry::Get(index); } | 
		
	
		
			
				|  |  |  |  | 	uint32 GetGRFID(uint index) const override           { return (!this->ShowExtraInfoOnly(index)) ? ((const IndustrySpec *)this->GetSpec(index))->grf_prop.grffile->grfid : 0; } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	bool ShowExtraInfoOnly(uint index) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		const IndustrySpec *spec = (const IndustrySpec *)this->GetSpec(index); | 
		
	
		
			
				|  |  |  |  | 		return spec == nullptr || spec->grf_prop.grffile == nullptr; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	bool ShowExtraInfoIncludingGRFIDOnly(uint index) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		return HasBit(index, 26); | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	const void *GetSpec(uint index) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (HasBit(index, 26)) { | 
		
	
		
			
				|  |  |  |  | 			return GetIndustrySpec(GB(index, 0, 16)); | 
		
	
		
			
				|  |  |  |  | 		} else { | 
		
	
		
			
				|  |  |  |  | 			Industry *i = Industry::Get(index); | 
		
	
		
			
				|  |  |  |  | 			return i != nullptr ? GetIndustrySpec(i->type) : nullptr; | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	void SetStringParameters(uint index) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (HasBit(index, 26)) { | 
		
	
		
			
				|  |  |  |  | 			SetDParam(0, GetIndustrySpec(GB(index, 0, 16))->name); | 
		
	
		
			
				|  |  |  |  | 		} else { | 
		
	
		
			
				|  |  |  |  | 			this->SetSimpleStringParameters(STR_INDUSTRY_NAME, index); | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	uint Resolve(uint index, uint var, uint param, GetVariableExtra *extra) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
	
		
			
				
					
					|  |  |  | @@ -814,47 +841,52 @@ class NIHIndustry : public NIHelper { | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		char buffer[1024]; | 
		
	
		
			
				|  |  |  |  | 		output.print("Debug Info:"); | 
		
	
		
			
				|  |  |  |  | 		seprintf(buffer, lastof(buffer), "  Index: %u", index); | 
		
	
		
			
				|  |  |  |  | 		output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 		const Industry *ind = Industry::GetIfValid(index); | 
		
	
		
			
				|  |  |  |  | 		if (ind) { | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  Location: %ux%u (%X), w: %u, h: %u", TileX(ind->location.tile), TileY(ind->location.tile), ind->location.tile, ind->location.w, ind->location.h); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			if (ind->neutral_station) { | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "  Neutral station: %u: %s", ind->neutral_station->index, ind->neutral_station->GetCachedName()); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  Nearby stations: %u", (uint) ind->stations_near.size()); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			for (const Station *st : ind->stations_near) { | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "    %u: %s", st->index, st->GetCachedName()); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			output.print("  Produces:"); | 
		
	
		
			
				|  |  |  |  | 			for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { | 
		
	
		
			
				|  |  |  |  | 				if (ind->produced_cargo[i] != CT_INVALID) { | 
		
	
		
			
				|  |  |  |  | 					seprintf(buffer, lastof(buffer), "    %s: waiting: %u, rate: %u, this month: production: %u, transported: %u, last month: production: %u, transported: %u, (%u/255)", | 
		
	
		
			
				|  |  |  |  | 							GetStringPtr(CargoSpec::Get(ind->produced_cargo[i])->name), ind->produced_cargo_waiting[i], ind->production_rate[i], ind->this_month_production[i], | 
		
	
		
			
				|  |  |  |  | 							ind->this_month_transported[i], ind->last_month_production[i], ind->last_month_transported[i], ind->last_month_pct_transported[i]); | 
		
	
		
			
				|  |  |  |  | 					output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			output.print("  Accepts:"); | 
		
	
		
			
				|  |  |  |  | 			for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) { | 
		
	
		
			
				|  |  |  |  | 				if (ind->accepts_cargo[i] != CT_INVALID) { | 
		
	
		
			
				|  |  |  |  | 					seprintf(buffer, lastof(buffer), "    %s: waiting: %u", | 
		
	
		
			
				|  |  |  |  | 							GetStringPtr(CargoSpec::Get(ind->accepts_cargo[i])->name), ind->incoming_cargo_waiting[i]); | 
		
	
		
			
				|  |  |  |  | 					output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 			const IndustrySpec *indsp = GetIndustrySpec(ind->type); | 
		
	
		
			
				|  |  |  |  | 		if (!HasBit(index, 26)) { | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  Index: %u", index); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			const Industry *ind = Industry::GetIfValid(index); | 
		
	
		
			
				|  |  |  |  | 			if (ind) { | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "  Location: %ux%u (%X), w: %u, h: %u", TileX(ind->location.tile), TileY(ind->location.tile), ind->location.tile, ind->location.w, ind->location.h); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				if (ind->neutral_station) { | 
		
	
		
			
				|  |  |  |  | 					seprintf(buffer, lastof(buffer), "  Neutral station: %u: %s", ind->neutral_station->index, ind->neutral_station->GetCachedName()); | 
		
	
		
			
				|  |  |  |  | 					output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "  Nearby stations: %u", (uint) ind->stations_near.size()); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				for (const Station *st : ind->stations_near) { | 
		
	
		
			
				|  |  |  |  | 					seprintf(buffer, lastof(buffer), "    %u: %s", st->index, st->GetCachedName()); | 
		
	
		
			
				|  |  |  |  | 					output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				output.print("  Produces:"); | 
		
	
		
			
				|  |  |  |  | 				for (uint i = 0; i < lengthof(ind->produced_cargo); i++) { | 
		
	
		
			
				|  |  |  |  | 					if (ind->produced_cargo[i] != CT_INVALID) { | 
		
	
		
			
				|  |  |  |  | 						seprintf(buffer, lastof(buffer), "    %s: waiting: %u, rate: %u, this month: production: %u, transported: %u, last month: production: %u, transported: %u, (%u/255)", | 
		
	
		
			
				|  |  |  |  | 								GetStringPtr(CargoSpec::Get(ind->produced_cargo[i])->name), ind->produced_cargo_waiting[i], ind->production_rate[i], ind->this_month_production[i], | 
		
	
		
			
				|  |  |  |  | 								ind->this_month_transported[i], ind->last_month_production[i], ind->last_month_transported[i], ind->last_month_pct_transported[i]); | 
		
	
		
			
				|  |  |  |  | 						output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 					} | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				output.print("  Accepts:"); | 
		
	
		
			
				|  |  |  |  | 				for (uint i = 0; i < lengthof(ind->accepts_cargo); i++) { | 
		
	
		
			
				|  |  |  |  | 					if (ind->accepts_cargo[i] != CT_INVALID) { | 
		
	
		
			
				|  |  |  |  | 						seprintf(buffer, lastof(buffer), "    %s: waiting: %u", | 
		
	
		
			
				|  |  |  |  | 								GetStringPtr(CargoSpec::Get(ind->accepts_cargo[i])->name), ind->incoming_cargo_waiting[i]); | 
		
	
		
			
				|  |  |  |  | 						output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 					} | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "  Counter: %u", ind->counter); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		const IndustrySpec *indsp = (const IndustrySpec *)this->GetSpec(index); | 
		
	
		
			
				|  |  |  |  | 		if (indsp) { | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  CBM_IND_PRODUCTION_CARGO_ARRIVAL: %s", HasBit(indsp->callback_mask, CBM_IND_PRODUCTION_CARGO_ARRIVAL) ? "yes" : "no"); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  CBM_IND_PRODUCTION_256_TICKS: %s", HasBit(indsp->callback_mask, CBM_IND_PRODUCTION_256_TICKS) ? "yes" : "no"); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			seprintf(buffer, lastof(buffer), "  Counter: %u", ind->counter); | 
		
	
		
			
				|  |  |  |  | 			output.print(buffer); | 
		
	
		
			
				|  |  |  |  | 			if ((_settings_game.economy.industry_cargo_scale_factor != 0) && HasBit(indsp->callback_mask, CBM_IND_PRODUCTION_256_TICKS)) { | 
		
	
		
			
				|  |  |  |  | 				seprintf(buffer, lastof(buffer), "  Counter production interval: %u", ScaleQuantity(INDUSTRY_PRODUCE_TICKS, -_settings_game.economy.industry_cargo_scale_factor)); | 
		
	
		
			
				|  |  |  |  | 				output.print(buffer); | 
		
	
	
		
			
				
					
					|  |  |  | @@ -870,10 +902,10 @@ class NIHIndustry : public NIHelper { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	/* virtual */ void SpriteDump(uint index, DumpSpriteGroupPrinter print) const override | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		const Industry *ind = Industry::GetIfValid(index); | 
		
	
		
			
				|  |  |  |  | 		if (ind) { | 
		
	
		
			
				|  |  |  |  | 		const IndustrySpec *spec = (const IndustrySpec *)this->GetSpec(index); | 
		
	
		
			
				|  |  |  |  | 		if (spec) { | 
		
	
		
			
				|  |  |  |  | 			extern void DumpIndustrySpriteGroup(const IndustrySpec *spec, DumpSpriteGroupPrinter print); | 
		
	
		
			
				|  |  |  |  | 			DumpIndustrySpriteGroup(GetIndustrySpec(ind->type), std::move(print)); | 
		
	
		
			
				|  |  |  |  | 			DumpIndustrySpriteGroup(spec, std::move(print)); | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
	
		
			
				
					
					|  |  |  |   |