Difference between revisions of "Technology modding"

From Hearts of Iron 4 Wiki
Jump to navigation Jump to search
(Adding background for small items)
(Adding the Folder: (spelling of always))
 
Line 344: Line 344:
 
                 spriteType = "GFX_infantry_techtree_bg"
 
                 spriteType = "GFX_infantry_techtree_bg"
 
                 position = { x=0 y=0 }
 
                 position = { x=0 y=0 }
                 allwaystransparent = yes
+
                 alwaystransparent = yes
 
             }
 
             }
 
              
 
              

Latest revision as of 17:12, 10 June 2019

Technology[edit]

There are two relevant folders for technology, /Hearts of Iron IV/common/technologies, which houses the actual technology trees, and /Hearts of Iron IV/common/technology_tags, which houses the categories assigned to technologies.

The generic format for a technology is as follows:

technologies = {
    <technology> = {
        # Any country-level modifier can be used here.
        <modifier>
        
        doctrine = yes          # Consider this technology a doctrine technology.
        research_cost = <float> # Cost in time, where 1 is the default research time length.
        start_year = <year>     # Which year this technology stops receiving ahead-of-time penalities.
        
        # Effects to apply on technology completion
        on_research_complete = {
            <effects>
        }
        show_effect_as_desc = yes   # Displays effects in description.
        
        # Alter unit attributes and sub-attributes
        <unit> = {
            <attribute> = <value> # Required!
            
            <terrain> = {
                <attribute> <value>
            }
        }
        
        # Alter unit attribute for category
        <category> = {
            <attribute> <value>
        }
        
        # Enable subunits
        enable_subunits = {
            <unit>
        }
        
        # Enables equipment.
        enable_equipments = {
            <equipment name>
        }
        show_equipment_icon = yes   # Show the equipment icon that is unlocked
        
        # Enable building
        enable_building = {
            building = <name>
            level = 1
        }
        
        # Links technologies in corner. Used for variant technologies of base technology
        sub_technologies = {
            <technology>
        }
        
        # Technologies taking this technology is dependant on (other than previous technology.)
        dependencies = {
            <technology> = 1
        }
        
        # Limits technology visibility if trigger is false. Used for DLC checks. Used for focus-only technologies.
        allow = {
            <triggers>
        }
        
        # Limits technology (and linked technologies) visibility if trigger is false. Used for DLC checks.
        allow_branch = {
            <triggers>
        }
        
        # Multiple allowed. Controls the links between technologies.
        path = {
            leads_to_tech = <technology>
            research_cost_coeff = <float>
        }
        
        # Used to either-or with other technologies. 
        XOR = {
            <technology>
        }
        
        # Controls which folder (tab) the technology appears under.
        folder = {
            name = <folder name> # Found in countrytechtreeview.gui
            
            # Position in the tech tree interface
            position = { 
                x = 0 
                y = 0 
            }
        }
        
        # Which technology categories apply to this technology.
        categories = {
            <categories>
        }
        
        # Weighting for the AI to pick the technology
        ai_will_do = {
            factor = <float>
            
            # Conditional modifier to the factor.
            modifier = {
                factor = <float>
                
                <triggers>
            }
        }
        
        # Adjusts weighting depending on taken technology (uses technology tags)
        ai_research_weights = {
            <type> = <float>
        }
    }
}

Effects[edit]

on_research_complete is used to execute effects upon the completion of a taken technology. This is often used to add divisions of a new subunit or to display custom tooltips.

Here is an example of adding a new division:

on_research_complete = {
    limit = {
        NOT = {    has_template_containing_unit = light_armor }
        NOT = {    has_template_containing_unit = heavy_armor }
        NOT = {    has_template_containing_unit = medium_armor }
    }
    hidden_effect = {
        if = {
            limit = {
                has_tech = motorised_infantry
            }

            load_oob = "unlock_tanks_mot"
        }
        if = {
            limit = {
                NOT = { has_tech = motorised_infantry }
            }

            load_oob = "unlock_tanks"
        }
    }

    custom_effect_tooltip = UNLOCK_DIVISION_TEMPLATE
}

Equipment[edit]

To enable new equipment, you need to use enable_equipments. Here is an example:

enable_equipments = {
    infantry_equipment_0
}

Units[edit]

To enable new subunits, you need to use enable_subunits. Here is an example:

enable_subunits = {
    infantry
}

To modify unit attributes, you need to either scope to a unit category like so:

category_all_infantry = {
    hard_attack = 0.25
    ap_attack = 1
}

Or scope to the exact unit:

cavalry = {
    soft_attack = 0.05
}

Buildings[edit]

To enable new buildings, you need to use enable_building. Here is an example:

enable_building = {
    building = radar_station
    level = 1
}

Sub-technologies[edit]

To add sub-technologies to a technology, you need to include sub_technologies in the technology you want them to appear on. Here is an example:

sub_technologies = {
    motorized_rocket_unit
}

Can only be added to equipment technologies.

UI[edit]

Technologies appear within technology folders (or tabs). The folder scope is used to place technology within a specified folder. A technology can be present in multiple folder by including multiple folder scopes, like so:

folder = {
    name = infantry_folder
    position = { x = 0 y = 4 }
}

folder = {
    name = support_folder
    position = { x = 7 y = 9 }
}

The position of the technology is defined by the position scope within a folder scope. The x co-ordinate controls the vertical position, and the y co-ordinate controls the horizontal position.

Typically, you will want to increase the x co-ordinate by 2 to place technology a unit lower, likewise with the y co-ordinate.

Technology Icons[edit]

The icon used for a technology must be defined in a .gfx file, such as /Hearts of Iron IV/interface/Technologies.gfx.

The format for a icon definition is:

spriteType = {
    name = "GFX_<technology>_medium"
    texturefile = "gfx/interface/technologies/<image>.dds"
}    

For tag-specific icons:

spriteType = {
    name = "GFX_<tag>_<technology>_medium"
    texturefile = "gfx/interface/technologies/<image>.dds"
}    

Technology Folders[edit]

Often the most confusing aspect of technology modding, technology folders are a combination of /Hearts of Iron IV/interface/countrytechtreeview.gui and /Hearts of Iron IV/interface/countrytechtreeview.gfx.

Adding the Folder Tab[edit]

To add a new folder tab, you need to start by going to the folder_tabs windowtype in countrytechtreeview.gui and adding a new button and icon for your folder.

containerWindowType = {
    name = "folder_tabs"
    position = { x=0 y=7 }
    size = { width = 100%% height = 30 }
            
    # Required for the folder to appear.
    buttonType = {
        name = "<folder>_tab"
        position = { x = 22 y = 0 }                     # Used to place the tab button
        quadTextureSprite = "GFX_<folder>_tab"   # Controls the tab active and inactive images
        frame = 1 
        clicksound = click_default
    }
    
    # ... other folders ...
}

The GFX_<folder>_tab here would be added to a .gfx file:

spriteType = {
    name = "GFX_<folder>_tab"
    textureFile = "gfx//interface//techtree//techtree_infantry_tab.dds"
    noOfFrames = 2        
}

This adds the folder tab button.

Adding the Folder[edit]

To add a new folder, you need to start by going to the countrytechtreeview windowtype in countrytechtreeview.gui and adding a new containerWindowType for your folder.

containerWindowType = {
    name = "countrytechtreeview"
    position = { x=-3 y=78 }
    size = { width = 100%% height = 100%% }
    fade_time = 400
    fade_type = linear

    # ... 

    containerWindowType = {
        name = "<folder>"           # Name you added to technology_folders
        position = { x=0 y=47 }
        size = { width = 100%% height = 100%% }
        margin = { top = 13 left = 13 bottom = 24 right = 25}
        drag_scroll = { left middle }
        verticalScrollbar = "right_vertical_slider"
        horizontalScrollbar = "bottom_horizontal_slider"

        background = {
            name = "Background"
            quadTextureSprite ="GFX_tiled_window_2b_border"
        }

        # Controls the graphical elements, such as the dates and the faded image background.
        containerWindowType = {
            name = "techtree_stripes"
            position = { x= 0 y= 0 }
            size = { 
                width = 1400 height = 1275
                min = { width = 100%% height = 100%% }
            }
            clipping = no

            # This is the background you see in the technology folders. 
            # Make sure the actual image is less than 100% alpha, so it fades into the regular background.
            iconType = {
                name ="<folder>_techtree_bg"
                spriteType = "GFX_infantry_techtree_bg"
                position = { x=0 y=0 }
                alwaystransparent = yes
            }
            
            # All the other elements are optional, refer to the actual file for details.
        }

        # These display the technology trees.
        # Each tree must start the the initial technology that starts the tree.
        # i.e. support_weapons_tree will display ALL technologies that are linked to the initial support_weapons technology.
        # You only need to specific the INITIAL (i.e. TOP) technologies for each tree.
        gridboxtype = {
            name = "<technology>_tree"
            position = { x = 140 y = 210 }
            slotsize = { width = 70 height = 70 }
            format = "LEFT"
        }
        
        # Add as many gridboxtype's as you have initial technologies.
    }
}

To further detail the gridboxtype, consider the Infantry Weapons technologies. The technology tree for them is as follows:

  • infantry_weapons
  • infantry_weapons1
  • infantry_weapons2
  • improved_infantry_weapons
  • improved_infantry_weapons_2 and infantry_at
  • advanced_infantry_weapons
  • advanced_infantry_weapons2
  • infantry_at
  • infantry_at2

To display this tree, you just need to add a gridbox with the name infantry_weapons_tree.

Adding the Technology Items[edit]

Each folder has it's own definition for each technology icon type. It is these that create the different type of technology "look and feel" between say the Infantry and Air Doctrine technologies.

There are two items:

  • techtree_<folder>_small_item: used for the non-equipment technologies.
  • techtree_<folder>_item: used for the equipment technologies.

Small Item[edit]

Used for non-equipment technologies.

containerWindowType = {
    name = "techtree_<folder>_small_item"
    position = { x=0 y=0 }
    size = { width = 72 height = 72 }
    clipping = no

    # This controls the unavailable icon for the non-equipment technology
    background = {
        name = "bg"
        quadTextureSprite ="GFX_technology_unavailable_item_bg"
    }

    # This grabs the GFX_<technology>_medium for the technology dynamically
    iconType = {
        name = "Icon"
        position = { x=3 y=3 }
        spriteType = "GFX_technology_medium"
        alwaystransparent = yes
    }    
        
    iconType = {
        name = "bonus_icon"
        position = { x=3 y=-22 }
        spriteType = "GFX_tech_bonus"
    }
    instantTextBoxType = {
        name = "bonus"
        position = { x = 17 y = -22 }
        textureFile = ""
        font = "hoi_16mbs"
        borderSize = {x = 4 y = 4}
        text = "lol boat"
        maxWidth = 50
        maxHeight = 20
        format = right
    }
}

Item[edit]

Used for equipment technologies, and sub-equipment technologies.

containerWindowType = {
    name = "techtree_<folder>_item"
    position = { x=-56 y=-7 }
    size = { width = 183 height = 84 }
    clipping = no

    # This controls the unavailable icon for the equipment technology
    background = {
        name = "Background"
        quadTextureSprite ="GFX_technology_unavailable_item_bg"
    }

    # This grabs the GFX_<technology>_medium for the technology dynamically
    iconType = {
        name = "Icon"
        position = { x=91 y=50 }
        spriteType = "GFX_technology_medium"
        centerposition = yes
        alwaystransparent = yes
    }

    instantTextBoxType = {
        name = "Name"
        position = { x = 3 y = -3 }
        textureFile = ""
        font = "hoi_20bs"
        borderSize = {x = 4 y = 4}
        text = "Happy-Go-Lucky-Tank"
        maxWidth = 160
        maxHeight = 20
        fixedsize = yes
        format = left
    }

    iconType = {
        name = "bonus_icon"
        position = { x=115 y=-22 }
        spriteType = "GFX_tech_bonus"
    }
    
    instantTextBoxType = {
        name = "bonus"
        position = { x = 129 y = -22 }
        textureFile = ""
        font = "hoi_16mbs"
        borderSize = {x = 4 y = 4}
        text = "lol boat"
        maxWidth = 50
        maxHeight = 20
        format = right
    }
        
    # Controls the sub-technology icon.
    containerWindowType = {
        name = "sub_technology_slot_0"
        position = { x=141 y=1 }
        size = { width = 35 height = 26 }
        clipping = no
            
        background = {
            name = "Background"
            spriteType ="GFX_subtechnology_unavailable_item_bg"
        }
            
        iconType = {
            name = "picture"
            position = { x=2 y=2 }
            spriteType = "GFX_subtech_rocket"
            alwaystransparent = yes
        }
    }        
}

Adding background for small items[edit]

If you see big (like equipment) icons even on non-equipment technologies you will also need to add item backround records to file countrytechtreeview.gfx. As you can see in next example most base game technologies (industry, infantry, etc.) actually use tech_doctrine background images, which may seem a little confusing.

	spriteType = {
		name = "GFX_technology_<folder>_folder_small_unavailable_item_bg"
		textureFile = "gfx//interface//techtree//tech_doctrine_unavailable_item_bg.dds"
	}	
	
	spriteType = {
		name = "GFX_technology_<folder>_folder_small_available_item_bg"
		textureFile = "gfx//interface//techtree//tech_doctrine_available_item_bg.dds"
	}

	spriteType = {
		name = "GFX_technology_<folder>_folder_small_researched_item_bg"
		textureFile = "gfx//interface//techtree//tech_landdoctrine_researched_item_bg.dds"
	}	

	spriteType = {
		name = "GFX_technology_<folder>_folder_small_branch_item_bg"
		textureFile = "gfx/interface/techtree/tech_doctrine_branch_item_bg.dds"
	}	
	
	frameAnimatedSpriteType = {
		name = "GFX_technology_<folder>_folder_small_currently_researching_item_bg"
		texturefile = "gfx//interface//techtree//tech_doctrine_researching_anim_strip.dds"
		noOfFrames = 9
		loadType = "INGAME"
		transparencecheck = yes
		animation_rate_fps = 15
		looping = yes
		play_on_show = yes
		pause_on_loop = 0.0
	}

Localization[edit]

Technologies and technology folders use the following localization keys:

 <technology>: "Name of technology"
 <technology>_desc: "Description of technology."
 <folder>: "Name of folder"
 <folder>_desc: "Description of folder."

Technology Categories[edit]

The /Hearts of Iron IV/common/technology_tags/00_technology.txt controls the technology categories (tags) a technology can belong to.

The categories here are used to refer to technologies in a broad sense, for example, in AI focuses, a technology category can be referred to, altering the AI weighting towards technologies that belong to the specified category.

Here is where technology categories are used:

  • ai_focuses: used with the research scope to alter AI weighting.
  • ideas: used with the research_bonus scope to apply research time bonuses.
  • national_focus: used with the add_tech_bonus effect to apply research time bonuses.
  • technologies: applied to technologies.
  • technology_sharing: applied to technology sharing groups.
  • technology_tags: defined here.

Technology Folders[edit]

The /Hearts of Iron IV/common/technology_tags/00_technology.txt controls the available technology folders. Be sure to define new folders here if you want them to appear.