Making an industry

Discuss, get help with, or post new graphics for TTDPatch and OpenTTD, using the NewGRF system, here. Graphics for plain TTD also acceptable here.

Moderator: Graphics Moderators

Post Reply
User avatar
FulliAutomatix
Engineer
Engineer
Posts: 119
Joined: 24 Aug 2014 12:20
Location: Kaon Prison, Cybertron

Making an industry

Post by FulliAutomatix »

I've been having a crack at making an industry, and so far I've got this code
[+] Spoiler

Code: Select all

item(FEAT_INDUSTRIES, nuclear_reprocessing_site, 0){
	property{
		substitute            :  ;
		override              :  ;
		layouts               :  ;
		life_type             : IND_LIFE_TYPE_BLACK_HOLE ;
		fund_cost_multiplier  : 37 ;
		prod_cargo_types      : [] ;
		accept_cargo_types    : [NWST] ;
		conflicting_ind_types : industry_type(0x01) ;
		prob_random           :  ;
		prob_in_game          :  ;
		map_colour            :  ;
		spec_flags            :  ;
		new_ind_msg           : string(TTD_STR_NEWS_INDUSTRY_CONSTRUCTION) ;
		name                  : string(STR_NUCPROC_NAME) ;
		nearby_station_name   : string(STR_NUCPROC_STATION_NAME) ;
	}
	graphics{
		
	}
}
I've been referencing the NML documentation and a very basic and not very useful OpenGFX Industries file, but I can't figure out really where to go from here. I've got graphics for it ready.

Could some please explain how industries work in NML or give me a reference to a fully defined (preferebly new) industry already or source code to a GRF? Thanks in advance
rowdog
Engineer
Engineer
Posts: 67
Joined: 24 May 2017 12:51
Location: East Texas

Re: Making an industry

Post by rowdog »

I posted a sample industry that might help you get started at viewtopic.php?f=68&t=76669#p1188871
User avatar
acs121
Tycoon
Tycoon
Posts: 1957
Joined: 03 Nov 2017 18:57
Location: Courbevoie, near Paris, France

Re: Making an industry

Post by acs121 »

I was about to post the same thing. How do i link the graphics from my GRF file ?
Here's my code yet :

Code: Select all

grf {
	grfid: "gb\01\05";
	name: string(STR_GRF_NAME);
	desc: string(STR_GRF_DESC);
	version: 0;
	min_compatible_version: 0;
}

cargotable {PASSENGERS}

switch(FEAT_INDUSTRIES, SELF, indu_transported_switch, transported_last_month_pct_1) {
	0: return CB_RESULT_IND_PROD_NO_CHANGE;
	1..44: return CB_RESULT_IND_PROD_DECREMENT_BY_1;
	45..64: return CB_RESULT_IND_PROD_NO_CHANGE;
	return CB_RESULT_IND_PROD_INCREMENT_BY_1;
}

item(FEAT_INDUSTRIES, indu_hotel) {
	property {
		substitute: ;
		override: ;
		accept_cargo_types: [cargotype("PASSENGERS", "GOODS"];
		prod_cargo_types: [cargotype("PASSENGERS", "GOODS")];
		prod_multiplier: [30];
		prob_in_game: 0;
		prob_random: 7;
		life_type: IND_LIFE_TYPE_PROCESSING;
		nearby_station_name: string(STR_HOTEL_STATION_NAME);
		spec_flags: 0;
	}
	graphics {
		monthly_prod_change: indu_transported_switch;
		random_prod_change: CB_RESULT_IND_PROD_NO_CHANGE;
		build_prod_change: return 4;
	}
}
User avatar
PikkaBird
Graphics Moderator
Graphics Moderator
Posts: 5602
Joined: 13 Sep 2004 13:21
Location: The Moon

Re: Making an industry

Post by PikkaBird »

Industries don't generally have graphics. Industry tiles do, and then the layouts property of the industry provides the tile arrangement(s) to be built.
User avatar
acs121
Tycoon
Tycoon
Posts: 1957
Joined: 03 Nov 2017 18:57
Location: Courbevoie, near Paris, France

Re: Making an industry

Post by acs121 »

How do i then link the industry tiles code to the industry properties code ?
User avatar
PikkaBird
Graphics Moderator
Graphics Moderator
Posts: 5602
Joined: 13 Sep 2004 13:21
Location: The Moon

Re: Making an industry

Post by PikkaBird »

Use the layouts property of the industry to tell it which tiles to build as part of the industry.
User avatar
FulliAutomatix
Engineer
Engineer
Posts: 119
Joined: 24 Aug 2014 12:20
Location: Kaon Prison, Cybertron

Re: Making an industry

Post by FulliAutomatix »

I've got this to compile, but it won't place anywhere in game.
As in, it always pops up as "Site unsuitable".

Any ideas?
[+] Spoiler

Code: Select all

grf{
	grfid                  : "RTNA" ;
	name                   : string(STR_GRF_NAME) ;
	desc                   : string(STR_GRF_DESC) ;
	version                : 0 ;
	min_compatible_version : 0 ;
}

//Cargo table

cargotable {
//Default cargos
   PASS, MAIL, COAL, FOOD, GOLD, GOOD, GRAI, IORE, LVST, OIL_, PAPR, STEL, VALU, WHEA, WOOD,

//Tropical cargos
   CORE, DIAM, FRUT, MAIZ, RUBR, WATR, 

//ECS
   AORE, BDMT, BRCK, CERA, CERE, CMNT, DYES, FERT, FICR, FISH, GLAS, LIME, OLSD, PETR, PLAS, POTA, RFPR, SAND, SULP, TOUR, VEHI, WDPR, WOOL, 
   
//FIRS
   BEER, CLAY, ENSP, FMSP, FRVG, GRVL, MILK, MNSP, PHOS, PORE, RCYC, SCMT, SGBT, SGCN, JAVA, COPR, SUGR,
   
//Nuclear stuff
	URAN, NWST
}




//Nuclear waste cargo

spriteset(gfx_nwst_cargo_icon, "gfx/nuclear_reprocessing_site.png"){[69, 186, 10, 10, -5, -5]}

item(FEAT_CARGOS, cargo_nuclear_waste, 0){
	property{
		type_name                 : string(STR_NWST_NAME) ;
		unit_name                 : string(STR_NWST_NAME) ;
		units_of_cargo            : TTD_STR_TONS ;
		items_of_cargo            : string(STR_NWST_ITEMS_OF_CARGO) ;
		type_abbreviation         : string(STR_NWST_ABBREV) ;
		sprite                    : NEW_CARGO_SPRITE ;
		weight                    : 1 ;
		penalty_lowerbound        : 255 ;
		single_penalty_length     : 255 ;
		price_factor              : 30000 ;
		station_list_colour       : 239 ;
		cargo_payment_list_colour : 239 ;
		is_freight                : 1 ;
		cargo_classes             : bitmask(CC_HAZARDOUS) ;
		cargo_label               : "NWST" ;
		capacity_multiplier       : 1 ;
	}
	graphics{
		default : gfx_nwst_cargo_icon ;
	}
}




//Graphics

spriteset(gfx_nucrep_empty_tile       , "gfx/nuclear_reprocessing_site.png"){[ 0  , 208, 64, 40, -32, -15 ]}
spriteset(gfx_nucrep_empty_tile_loaded, "gfx/nuclear_reprocessing_site.png"){[ 66 , 208, 64, 40, -32, -15 ]}
spriteset(gfx_nucrep_forklift         , "gfx/nuclear_reprocessing_site.png"){[ 156, 124, 64, 41, -32, -26 ]}
spriteset(gfx_nucrep_forklift_loaded  , "gfx/nuclear_reprocessing_site.png"){[ 156, 167, 64, 41, -32, -26 ]}
spriteset(gfx_nucrep_overpass         , "gfx/nuclear_reprocessing_site.png"){[ 69 , 124, 85, 60, -53, -45 ]}
spriteset(gfx_nucrep_shed             , "gfx/nuclear_reprocessing_site.png"){[ 0  , 155, 67, 51, -33, -35 ]}
spriteset(gfx_nucrep_sphere_tank      , "gfx/nuclear_reprocessing_site.png"){[ 66 , 58 , 64, 64, -32, -49 ]}
spriteset(gfx_nucrep_road_overlay     , "gfx/nuclear_reprocessing_site.png"){[ 111, 0  , 96, 47, -64, -32 ]}
spriteset(gfx_nucrep_cooling_tower    , "gfx/nuclear_reprocessing_site.png"){[ 66 , 0  , 43, 56, -21, -46 ]}
spriteset(gfx_nucrep_chimney_building , "gfx/nuclear_reprocessing_site.png"){[ 0  , 0  , 64, 85, -32, -70 ]}
spriteset(gfx_nucrep_generic_building , "gfx/nuclear_reprocessing_site.png"){[ 0  , 87 , 64, 66, -32, -51 ]}


//Sprite layouts

spritelayout spritelayout_cooling_tower {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_cooling_tower ; }
}

spritelayout spritelayout_empty_tile {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_empty_tile ; }
}

spritelayout spritelayout_empty_tile_cargo {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_empty_tile_loaded ; }
}

spritelayout spritelayout_forklift {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_forklift ; }
}

spritelayout spritelayout_forklift_cargo {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_forklift_loaded ; }
}

spritelayout spritelayout_overpass {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_overpass ; }
}

spritelayout spritelayout_shed {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_shed ; }
}

spritelayout spritelayout_sphere_tank {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_sphere_tank ; }
}

spritelayout spritelayout_road_overlay {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_road_overlay ; }
}

spritelayout spritelayout_chimney_building {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_chimney_building ; }
}

spritelayout spritelayout_generic_building {
	ground { sprite : gfx_nucrep_empty_tile ; }
	building { sprite : gfx_nucrep_generic_building ; }
}

//Cargo switches

switch(FEAT_INDUSTRYTILES, PARENT, sw_nucrep_empty_cargo_decider, waiting_cargo_1 > 0){
	1 : spritelayout_empty_tile_cargo ;
	spritelayout_empty_tile ;
}

switch(FEAT_INDUSTRYTILES, PARENT, sw_nucrep_forklift_cargo_decider, waiting_cargo_1 > 0){
	1 : spritelayout_forklift_cargo ;
	spritelayout_forklift ;
}





//Tile graphics decider

switch(FEAT_INDUSTRYTILES, SELF, nucrep_tile_gfx_decider, relative_pos){
	relative_coord(0,0) : spritelayout_cooling_tower ;
	relative_coord(1,0) : spritelayout_sphere_tank ;
	relative_coord(2,0) : spritelayout_generic_building ;
	relative_coord(3,0) : spritelayout_generic_building ;
	relative_coord(4,0) : spritelayout_generic_building ;
	relative_coord(5,0) : spritelayout_sphere_tank ;
	
	relative_coord(0,1) : spritelayout_cooling_tower ;
	relative_coord(1,1) : spritelayout_shed ;
	relative_coord(2,1) : spritelayout_shed ;
	relative_coord(3,1) : spritelayout_shed ;
	relative_coord(4,1) : spritelayout_shed ;
	relative_coord(5,1) : spritelayout_forklift ;
	//Skip a row
	relative_coord(0,3) : spritelayout_cooling_tower ;
	relative_coord(1,3) : spritelayout_chimney_building ;
	relative_coord(2,3) : spritelayout_forklift ;
	relative_coord(3,3) : spritelayout_overpass ;
	relative_coord(4,3) : spritelayout_empty_tile ;
	relative_coord(5,3) : spritelayout_empty_tile ;
	
	relative_coord(0,4) : spritelayout_cooling_tower ;
	relative_coord(1,4) : spritelayout_chimney_building ;
	relative_coord(2,4) : spritelayout_empty_tile ;
	relative_coord(3,4) : spritelayout_shed ;
	relative_coord(4,4) : spritelayout_chimney_building ;
	relative_coord(5,4) : spritelayout_forklift ;
	//Skip a row
	relative_coord(0,6) : spritelayout_road_overlay ;
	relative_coord(1,6) : spritelayout_road_overlay ;
	relative_coord(2,6) : spritelayout_road_overlay ;
	relative_coord(3,6) : spritelayout_road_overlay ;
	relative_coord(4,6) : spritelayout_road_overlay ;
	relative_coord(5,6) : spritelayout_road_overlay ;
}


//Industry tile

item(FEAT_INDUSTRYTILES, nucrep_tile){
	property{
		substitute      : 0x07 ;
		accepted_cargos : [[NWST, 8]] ;
	}
	graphics{
		default    : nucrep_tile_gfx_decider ;
	}
}



//Tile layout

tilelayout tilelayout_nucrep_site{
	0,0 : nucrep_tile ;
	1,0 : nucrep_tile ;
	2,0 : nucrep_tile ;
	3,0 : nucrep_tile ;
	4,0 : nucrep_tile ;
	5,0 : nucrep_tile ;

	0,1 : nucrep_tile ;
	1,1 : nucrep_tile ;
	2,1 : nucrep_tile ;
	3,1 : nucrep_tile ;
	4,1 : nucrep_tile ;
	5,1 : nucrep_tile ;

	0,2 : clear ;
	1,2 : clear ;
	2,2 : clear ;
	3,2 : clear ;
	4,2 : clear ;
	5,2 : clear ;

	0,3 : nucrep_tile ;
	1,3 : nucrep_tile ;
	2,3 : nucrep_tile ;
	3,3 : nucrep_tile ;
	4,3 : nucrep_tile ;
	5,3 : nucrep_tile ;

	0,4 : nucrep_tile ;
	1,4 : nucrep_tile ;
	2,4 : nucrep_tile ;
	3,4 : nucrep_tile ;
	4,4 : nucrep_tile ;
	5,4 : nucrep_tile ;

	0,5 : clear ;
	1,5 : clear ;
	2,5 : clear ;
	3,5 : clear ;
	4,5 : clear ;
	5,5 : clear ;

	0,6 : nucrep_tile ;
	1,6 : nucrep_tile ;
	2,6 : nucrep_tile ;
	3,6 : nucrep_tile ;
	4,6 : nucrep_tile ;
	5,6 : nucrep_tile ;
}


//Power plant modification and nuclear reprocessing site definition

item(FEAT_INDUSTRIES, power_plant, 0x01){
	property {
		prod_cargo_types    : [NWST] ;
		nearby_station_name : string(STR_POWER_STATION_STATION_NAME) ;
		prod_multiplier     : [1] ;
	}	
}

item(FEAT_INDUSTRIES, nuclear_reprocessing_site, 0){
	property {
		substitute            : 0 ;
		override              : 0 ;
		layouts               : [tilelayout_nucrep_site] ;
		life_type             : IND_LIFE_TYPE_BLACK_HOLE ;
		fund_cost_multiplier  : 37 ;
		prod_cargo_types      : [] ;
		accept_cargo_types    : [NWST] ;
		conflicting_ind_types : [0x01] ;
		prob_random           : 3 ;
		prob_in_game          : 2 ;
		map_colour            : 255 ;
		spec_flags            : bitmask(IND_FLAG_BUILT_ONLY_AFTER_1960) ;
		new_ind_msg           : TTD_STR_NEWS_INDUSTRY_CONSTRUCTION ;
		name                  : string(STR_NUCPROC_NAME) ;
		nearby_station_name   : string(STR_NUCPROC_STATION_NAME) ;
	}
}
Post Reply

Return to “Graphics Development”

Who is online

Users browsing this forum: No registered users and 27 guests