{ "key.categories.psi": "Psi", "itemGroup.psi": "Psi", "psi.desc": "This is a joke that breaks the 4th wall, enjoy.", "psimisc.shift_for_info": "\u00a77Hold \u00a7bSHIFT\u00a77 for more info", "psimisc.ctrl_for_stats": "\u00a77Hold \u00a7bCTRL\u00a77 for piece stats", "psimisc.component_type": "\u00a7aComponent Type\u00a77: %s", "psimisc.none": "(none)", "psimisc.stats": "Stats", "psimisc.socketing": "Socketing", "psimisc.keybind": "Psi Master Keybind", "psimisc.selected": "Selected", "psimisc.spell_selected": "\u00a7dSpell Selected\u00a77: %s", "psimisc": "Name:", "psimisc.compiled": "Compilation Successful", "psimisc.errored": "Compilation Errored", "psimisc.weak_cad": "Your CAD's Stats are too weak to cast this Spell.", "psimisc.canceled_spell": "Something prevented you from casting that Spell.", "psimisc.cancelled_cad_take": "Something prevented you from crafting the CAD.", "psimisc.constant": "Constant", "psimisc.next_page": "Next Page", "psimisc.prev_page": "Previous Page", "psimisc.config": "Config", "psimisc.not_your_programmer": "It seems like someone else is using this. Probably better not to mess with it.", "psimisc.cant_use_programmer": "You have no idea how to operate this.", "psimisc.level_display": "Level %d", "psimisc.level_info": "Level %d - Level Points: %d", "psimisc.level_info_creative": "Level %d (Creative) - Level Points: %d", "psimisc.locked": "Locked", "psimisc.requirements": "Requirements", "psimisc.learn": "Learn", "psimisc.levelup": "Level Up", "psimisc.wip": "Psi Beta | Not final!", "psimisc.bullet_type": "\u00a7bType\u00a77: %s", "psimisc.bullet_cost": "\u00a7bCost Multiplier\u00a77: %s%%", "psimisc.level_up_info1": "You have completed this group tutorial!", "psimisc.level_up_info2": "Unequip your CAD and press [%s] to go look at the next one!", "psimisc.import_from_clipboard": "Import from Clipboard", "psimisc.export_to_clipboard": "Export to Clipboard", "psimisc.must_hold_shift": "(Must be holding SHIFT)", "psimisc.malformed_json": "Import error: Malformed String: %s", "psimisc.missing_pieces": "Import error: Missing spell pieces used for import.", "psimisc.disabled_piece": "Import error: The piece %s is disabled.", "psimisc.locked_piece": "Import error: The piece %s is locked.", "psimisc.load_prompt": "Load?", "psimisc.spectator": "[Spectator Mode]", "psimisc.multiple_cads": "The other CAD in your inventory is interfering with your cast. You can only have one CAD on you at a time.", "psimisc.provider_mod": "\u00a77Addon: \u00a79%s", "psimisc.trick_pattern": "^Trick: (.+)$", "psimisc.programmer_help": "\u00a7aProgrammer Help", "psimisc.ctrl_windows": "Ctrl", "psimisc.ctrl_mac": "Cmd", "psimisc.enter_commit": "Press Enter to commit", "psimisc.semicolon_line": "Use ; to change line", "psimisc.programmer_coords": "Selected: [%d, %d] | Cursor: [%d, %d]", "psimisc.programmer_coords_no_cursor": "Selected: [%d, %d]", "psimisc.name": "Name", "psimisc.requiredaddons": "Required Addons: ", "psimisc.modnotfound": "The spell you tried to import will not be imported in its entirety, since it uses pieces from the non-installed mod %d", "psimisc.spellonnewerversion": "This spell was created on a newer version of Psi; it may or may not work as intended.", "psi.container.socketable": "Sockets", "psi.subtitle.bullet_create": "Spell stored", "psi.subtitle.cad_create": "CAD assembled", "psi.subtitle.spell_cast": "CAD casts", "psi.subtitle.loopcast": "CAD loopcasts", "attribute.psi.total_psi": "Total Psi", "attribute.psi.regen": "Psi Regeneration", "entity.psi.spell_projectile": "Spell Projectile", "entity.psi.spell_circle": "Spell Circle", "entity.psi.spell_grenade": "Spell Grenade", "entity.psi.spell_charge": "Spell Charge", "entity.psi.spell_mine": "Spell Mine", "block.psi.cad_assembler": "CAD Assembler", "block.psi.programmer": "Spell Programmer", "block.psi.psidust_block": "Psidust Block", "block.psi.psimetal_block": "Psimetal Block", "block.psi.psigem_block": "Psigem Block", "block.psi.black_psimetal_plate": "Dark Psimetal Plate", "block.psi.lit_black_psimetal_plate": "Dark Psimetal Flow Plate", "block.psi.white_psimetal_plate": "Bright Psimetal Plate", "block.psi.lit_white_psimetal_plate": "Bright Psimetal Flow Plate", "block.psi.ebony_psimetal_block": "Ebony Psimetal Block", "block.psi.ivory_psimetal_block": "Ivory Psimetal Block", "block.psi.conjured": "Conjured Block", "item.psi.psidust": "Psidust", "item.psi.psimetal": "Psimetal Ingot", "item.psi.psigem": "Psigem", "item.psi.ebony_psimetal": "Ebony Psimetal Ingot", "item.psi.ivory_psimetal": "Ivory Psimetal Ingot", "item.psi.ebony_substance": "Ebony Substance", "item.psi.ivory_substance": "Ivory Substance", "item.psi.cad": "Casting Assistant Device", "item.psi.cad_assembly_iron": "Iron CAD Assembly", "item.psi.cad_assembly_gold": "Gold CAD Assembly", "item.psi.cad_assembly_psimetal": "Psimetal CAD Assembly", "item.psi.cad_assembly_ebony_psimetal": "Ebony Psimetal CAD Assembly", "item.psi.cad_assembly_ivory_psimetal": "Ivory Psimetal CAD Assembly", "item.psi.cad_assembly_creative": "Creative CAD Assembly", "item.psi.cad_core_basic": "Basic CAD Core", "item.psi.cad_core_overclocked": "Overclocked CAD Core", "item.psi.cad_core_conductive": "Conductive CAD Core", "item.psi.cad_core_hyperclocked": "Hyperclocked CAD Core", "item.psi.cad_core_radiative": "Radiative CAD Core", "item.psi.cad_socket_basic": "Basic CAD Socket", "item.psi.cad_socket_signaling": "Signaling CAD Socket", "item.psi.cad_socket_large": "Large CAD Socket", "item.psi.cad_socket_transmissive": "Transmissive CAD Socket", "item.psi.cad_socket_huge": "Huge CAD Socket", "item.psi.cad_battery_basic": "Basic CAD Battery", "item.psi.cad_battery_extended": "Extended CAD Battery", "item.psi.cad_battery_ultradense": "Ultradense CAD Battery", "item.psi.cad_colorizer_white": "White CAD Colorizer", "item.psi.cad_colorizer_orange": "Orange CAD Colorizer", "item.psi.cad_colorizer_magenta": "Magenta CAD Colorizer", "item.psi.cad_colorizer_light_blue": "Light Blue CAD Colorizer", "item.psi.cad_colorizer_yellow": "Yellow CAD Colorizer", "item.psi.cad_colorizer_lime": "Lime CAD Colorizer", "item.psi.cad_colorizer_pink": "Pink CAD Colorizer", "item.psi.cad_colorizer_gray": "Gray CAD Colorizer", "item.psi.cad_colorizer_light_gray": "Light Gray CAD Colorizer", "item.psi.cad_colorizer_cyan": "Cyan CAD Colorizer", "item.psi.cad_colorizer_purple": "Purple CAD Colorizer", "item.psi.cad_colorizer_blue": "Blue CAD Colorizer", "item.psi.cad_colorizer_brown": "Brown CAD Colorizer", "item.psi.cad_colorizer_green": "Green CAD Colorizer", "item.psi.cad_colorizer_red": "Red CAD Colorizer", "item.psi.cad_colorizer_black": "Black CAD Colorizer", "item.psi.cad_colorizer_rainbow": "Full-Spectrum CAD Colorizer", "item.psi.cad_colorizer_psi": "Psi CAD Colorizer", "item.psi.cad_colorizer_empty": "Drained CAD Colorizer", "item.psi.flash_ring": "Flash Ring", "item.psi.spell_bullet": "Spell Bullet", "item.psi.spell_bullet_projectile": "Projectile Spell Bullet", "item.psi.spell_bullet_loop": "Loopcast Spell Bullet", "item.psi.spell_bullet_circle": "Circle Spell Bullet", "item.psi.spell_bullet_grenade": "Grenade Spell Bullet", "item.psi.spell_bullet_charge": "Charge Spell Bullet", "item.psi.spell_bullet_mine": "Mine Spell Bullet", "item.psi.spell_drive": "Spell Drive", "item.psi.psimetal_shovel": "Psimetal Shovel", "item.psi.psimetal_pickaxe": "Psimetal Pickaxe", "item.psi.psimetal_axe": "Psimetal Axe", "item.psi.psimetal_sword": "Psimetal Sword", "item.psi.psimetal_shovel.broken": "Damaged Psimetal Shovel", "item.psi.psimetal_pickaxe.broken": "Damaged Psimetal Pickaxe", "item.psi.psimetal_axe.broken": "Damaged Psimetal Axe", "item.psi.psimetal_sword.broken": "Damaged Psimetal Sword", "item.psi.detonator": "Spell Detonator", "item.psi.psimetal_exosuit_helmet": "Psimetal Exosuit Helmet", "item.psi.psimetal_exosuit_chestplate": "Psimetal Exosuit Chestplate", "item.psi.psimetal_exosuit_leggings": "Psimetal Exosuit Leggings", "item.psi.psimetal_exosuit_boots": "Psimetal Exosuit Boots", "item.psi.psimetal_exosuit_helmet.broken": "Damaged Psimetal Exosuit Helmet", "item.psi.psimetal_exosuit_chestplate.broken": "Damaged Psimetal Exosuit Chestplate", "item.psi.psimetal_exosuit_leggings.broken": "Damaged Psimetal Exosuit Leggings", "item.psi.psimetal_exosuit_boots.broken": "Damaged Psimetal Exosuit Boots", "item.psi.exosuit_controller": "Exosuit Controller", "item.psi.exosuit_sensor_light": "Exosuit Light Sensor", "item.psi.exosuit_sensor_water": "Exosuit Water Sensor", "item.psi.exosuit_sensor_heat": "Exosuit Heat Sensor", "item.psi.exosuit_sensor_stress": "Exosuit Stress Sensor", "item.psi.exosuit_sensor_trigger": "Exosuit Detonation Sensor", "item.psi.vector_ruler": "Vector Ruler", "death.attack.psi_overload": "%s overflowed their Psionic Energy", "psi.component.assembly": "Assembly", "psi.component.core": "Core", "psi.component.socket": "Socket", "psi.component.battery": "Battery", "psi.component.dye": "Colorizer", "psi.cadstat.efficiency": "Efficiency", "psi.cadstat.potency": "Potency", "psi.cadstat.complexity": "Complexity", "psi.cadstat.projection": "Projection", "psi.cadstat.bandwidth": "Bandwidth", "psi.cadstat.sockets": "Sockets", "psi.cadstat.saved_vectors": "Memory", "psi.cadstat.overflow": "Overflow", "psi.spellstat.complexity": "Complexity", "psi.spellstat.complexity.desc": "Amount of actions", "psi.spellstat.potency": "Potency", "psi.spellstat.potency.desc": "Power of the spell", "psi.spellstat.cost": "Cost", "psi.spellstat.cost.desc": "Psi cost on casting", "psi.spellstat.projection": "Projection", "psi.spellstat.projection.desc": "Amount of tricks", "psi.spellstat.bandwidth": "Bandwidth", "psi.spellstat.bandwidth.desc": "Spell width or height (largest)", "psi.bullet_type_basic": "Normal", "psi.bullet_type_projectile": "Projectile", "psi.bullet_type_loopcast": "Loopcast", "psi.bullet_type_circle": "Spell Circle", "psi.bullet_type_grenade": "Grenade", "psi.bullet_type_charge": "Charge", "psi.bullet_type_mine": "Mine", "psi.event.none": "(No Event Handler)", "psi.event.damage": "\u00a7bEvent\u00a77: Damage", "psi.event.tick": "\u00a7bEvent\u00a77: Tick", "psi.event.jump": "\u00a7bEvent\u00a77: Jump", "psi.event.low_light": "\u00a7bEvent\u00a77: Low Light", "psi.event.underwater": "\u00a7bEvent\u00a77: Underwater", "psi.event.on_fire": "\u00a7bEvent\u00a77: On Fire", "psi.event.low_hp": "\u00a7bEvent\u00a77: Low Health", "psi.event.spell_detonate": "\u00a7bEvent\u00a77: Detonation", "psi.programmer_reference0": "\u00a7bKeybinds", "psi.programmer_reference1": "Delete Piece: \u00a7bDelete", "psi.programmer_reference2": "Clear Grid: \u00a7b%1$s-Shift-Delete", "psi.programmer_reference3": "Shift Grid: \u00a7b%1$s + Arrow Keys", "psi.programmer_reference4": "Rotate Grid: \u00a7b%1$s-Shift-Left/Right", "psi.programmer_reference5": "Mirror Grid Vertically: \u00a7b%1$s-Shift-Down", "psi.programmer_reference6": "Copy/Cut/Paste: \u00a7b%1$s-C/%1$s-X/%1$s-V", "psi.programmer_reference7": "Undo/Redo: \u00a7b%1$s-Z/%1$s-Y", "psi.programmer_reference8": "Open Panel/Select Piece: \u00a7bEnter", "psi.programmer_reference9": "Set Parameter: \u00a7bNumber Keys + Arrow Keys", "psi.programmer_reference10": "Set Comment: \u00a7b%1$s-D", "psi.programmer_reference11": "Switch Focus: \u00a7bTab", "psi.programmer_reference12": "Show Tooltip: \u00a7bAlt", "psi.programmer_reference13": "Move Cursor: \u00a7bArrow Keys", "psi.programmer_reference14": "Upload To Imgur: \u00a7b%1$s-Shift-Alt-G", "psi.programmer_reference15": "Share To Reddit: \u00a7b%1$s-Shift-Alt-R", "psi.programmer_reference16": "", "psi.programmer_reference17": "\u00a7bSearch Terms", "psi.programmer_reference18": "Accepting Type: \u00a7bin:(type)", "psi.programmer_reference19": "Outputting Type: \u00a7bout:(type)", "psi.programmer_reference20": "Name Begins With: \u00a7b(name)_", "psi.programmer_reference21": "Name Ends With: \u00a7b_(name)", "psi.programmer_reference22": "From Mod: \u00a7b@(name)", "psi.spellpiece.selector_caster": "Selector: Caster", "psi.spellpiece.selector_caster.desc": "Selects the person casting the spell", "psi.spellpiece.selector_focal_point": "Selector: Focal Point", "psi.spellpiece.selector_focal_point.desc": "Selects the Focal Point Entity of this spell", "psi.spellpiece.selector_nearby_items": "Selector: Nearby Items", "psi.spellpiece.selector_nearby_items.desc": "Selects items near the given position", "psi.spellpiece.selector_nearby_living": "Selector: Nearby Living", "psi.spellpiece.selector_nearby_living.desc": "Selects living beings near the given position", "psi.spellpiece.selector_nearby_enemies": "Selector: Nearby Enemies", "psi.spellpiece.selector_nearby_enemies.desc": "Selects enemies near the given position", "psi.spellpiece.selector_nearby_animals": "Selector: Nearby Animals", "psi.spellpiece.selector_nearby_animals.desc": "Selects animals near the given position", "psi.spellpiece.selector_nearby_projectiles": "Selector: Nearby Projectiles", "psi.spellpiece.selector_nearby_projectiles.desc": "Selects projectiles near the given position", "psi.spellpiece.selector_nearby_smeltables": "Selector: Nearby Smeltables", "psi.spellpiece.selector_nearby_smeltables.desc": "Selects smeltable items near the given position", "psi.spellpiece.selector_loopcast_index": "Selector: Loopcast Index", "psi.spellpiece.selector_loopcast_index.desc": "Selects the amount of loopcast executions done", "psi.spellpiece.selector_block_broken": "Selector: Block Broken", "psi.spellpiece.selector_block_broken.desc": "Selects the Block Broken (for Tools)", "psi.spellpiece.selector_block_side_broken": "Selector: Block Broken Side", "psi.spellpiece.selector_block_side_broken.desc": "Selects the side in which a Block was broken (for Tools)", "psi.spellpiece.selector_attack_target": "Selector: Attack Target", "psi.spellpiece.selector_attack_target.desc": "Selects the entity attacked by a caster", "psi.spellpiece.selector_sneak_status": "Selector: Sneak Status", "psi.spellpiece.selector_sneak_status.desc": "Selects if the caster is sneaking (1 if no, 0 if yes)", "psi.spellpiece.selector_time": "Selector: Time", "psi.spellpiece.selector_time.desc": "Selects the CAD's internal time (in ticks)", "psi.spellpiece.selector_attacker": "Selector: Attacker", "psi.spellpiece.selector_attacker.desc": "Selects the entity that attacked the caster", "psi.spellpiece.selector_damage_taken": "Selector: Damage Taken", "psi.spellpiece.selector_damage_taken.desc": "Selects the amount of damage the caster took", "psi.spellpiece.selector_ruler_vector": "Selector: Ruler Vector", "psi.spellpiece.selector_ruler_vector.desc": "Selects the vector defined by a Vector Ruler", "psi.spellpiece.selector_item_presence": "Selector: Item Presence", "psi.spellpiece.selector_item_presence.desc": "Selects the size of an inventory item stack", "psi.spellpiece.selector_block_presence": "Selector: Block Presence", "psi.spellpiece.selector_block_presence.desc": "Selects a block's presence and solidity", "psi.spellpiece.selector_saved_vector": "Selector: Saved Vector", "psi.spellpiece.selector_saved_vector.desc": "Selects a saved vector from CAD Memory", "psi.spellpiece.selector_eidos_changelog": "Selector: Eidos Changelog", "psi.spellpiece.selector_eidos_changelog.desc": "Selects a position from the Eidos Changelog", "psi.spellpiece.selector_nearby_charges": "Selector: Charge Count", "psi.spellpiece.selector_nearby_charges.desc": "Selects the number of charges near a given position", "psi.spellpiece.selector_nearby_players": "Selector: Nearby Players", "psi.spellpiece.selector_nearby_players.desc": "Selects players near a given position", "psi.spellpiece.selector_nearby_vehicles": "Selector: Nearby Rideables", "psi.spellpiece.selector_nearby_vehicles.desc": "Selects rideable entities near a given position", "psi.spellpiece.selector_nearby_falling_blocks": "Selector: Nearby Falling Blocks", "psi.spellpiece.selector_nearby_falling_blocks.desc": "Selects falling blocks near a given position", "psi.spellpiece.selector_nearby_glowing": "Selector: Glowing", "psi.spellpiece.selector_nearby_glowing.desc": "Selects entities that glow or emit light near a given position", "psi.spellpiece.selector_caster_energy": "Selector: Caster Energy", "psi.spellpiece.selector_caster_energy.desc": "Selects the caster's Psi energy level", "psi.spellpiece.selector_caster_battery": "Selector: Caster Battery", "psi.spellpiece.selector_caster_battery.desc": "Selects the caster's CAD battery level", "psi.spellpiece.selector_sucession_counter": "Selector: Success Counter", "psi.spellpiece.selector_sucession_counter.desc": "Selects the number of times a spell has executed from this piece of armor", "psi.spellpiece.selector_is_elytra_flying": "Selector: Elytra Deployed", "psi.spellpiece.selector_is_elytra_flying.desc": "Returns 1 if the caster has their elytra deployed", "psi.spellpiece.selector_transmission": "Selector: Last Transmission", "psi.spellpiece.selector_transmission.desc": "Gets the last message this CAD received in a given channel", "psi.spellpiece.selector_item_count": "Selector: Item Count", "psi.spellpiece.selector_item_count.desc": "Counts the items in your inventory identical to the one in your target slot", "psi.spellpiece.selector_tick_time": "Selector: Tick Time", "psi.spellpiece.selector_tick_time.desc": "Returns the mean of tick times for the focal point dimension", "psi.spellpiece.selector_tps": "Selector: TPS", "psi.spellpiece.selector_tps.desc": "Returns the mean of ticks per second for the focal point dimension", "psi.spellpiece.operator_sum": "Operator: Sum", "psi.spellpiece.operator_sum.desc": "A + B (+ C)", "psi.spellpiece.operator_subtract": "Operator: Subtract", "psi.spellpiece.operator_subtract.desc": "A - B (- C)", "psi.spellpiece.operator_multiply": "Operator: Multiply", "psi.spellpiece.operator_multiply.desc": "A * B (* C)", "psi.spellpiece.operator_divide": "Operator: Divide", "psi.spellpiece.operator_divide.desc": "A / B", "psi.spellpiece.operator_absolute": "Operator: Absolute", "psi.spellpiece.operator_absolute.desc": "Calculates the absolute value of a number", "psi.spellpiece.operator_inverse": "Operator: Inverse", "psi.spellpiece.operator_inverse.desc": "Calculates a number's inverse", "psi.spellpiece.operator_modulus": "Operator: Modulus", "psi.spellpiece.operator_modulus.desc": "A %% B (Integer)", "psi.spellpiece.operator_integer_divide": "Operator: Integer Divide", "psi.spellpiece.operator_integer_divide.desc": "A / B (Integer)", "psi.spellpiece.operator_random": "Operator: Random", "psi.spellpiece.operator_random.desc": "Random between 0 and the given number (exclusive)", "psi.spellpiece.operator_sin": "Operator: Sine", "psi.spellpiece.operator_sin.desc": "sin(A)", "psi.spellpiece.operator_cos": "Operator: Cosine", "psi.spellpiece.operator_cos.desc": "cos(A)", "psi.spellpiece.operator_asin": "Operator: Arc Sine", "psi.spellpiece.operator_asin.desc": "asin(A)", "psi.spellpiece.operator_acos": "Operator: Arc Cosine", "psi.spellpiece.operator_acos.desc": "acos(A)", "psi.spellpiece.operator_max": "Operator: Max", "psi.spellpiece.operator_max.desc": "Gets the largest value of those passed in", "psi.spellpiece.operator_min": "Operator: Min", "psi.spellpiece.operator_min.desc": "Gets the smallest value of those passed in", "psi.spellpiece.operator_square": "Operator: Square", "psi.spellpiece.operator_square.desc": "A^2", "psi.spellpiece.operator_cube": "Operator: Cube", "psi.spellpiece.operator_cube.desc": "A^3", "psi.spellpiece.operator_power": "Operator: Power", "psi.spellpiece.operator_power.desc": "A^B", "psi.spellpiece.operator_square_root": "Operator: Square Root", "psi.spellpiece.operator_square_root.desc": "sqrt(A)", "psi.spellpiece.operator_log": "Operator: Logarithm", "psi.spellpiece.operator_log.desc": "log(A) or logB(A)", "psi.spellpiece.operator_ceiling": "Operator: Ceiling", "psi.spellpiece.operator_ceiling.desc": "Rounds up a number to an integer", "psi.spellpiece.operator_floor": "Operator: Floor", "psi.spellpiece.operator_floor.desc": "Rounds down a number to an integer", "psi.spellpiece.operator_round": "Operator: Round", "psi.spellpiece.operator_round.desc": "Rounds a number to an integer", "psi.spellpiece.operator_entity_position": "Operator: Entity Position", "psi.spellpiece.operator_entity_position.desc": "Gets an Entity's position", "psi.spellpiece.operator_entity_look": "Operator: Entity Look", "psi.spellpiece.operator_entity_look.desc": "Gets an Entity's look vector", "psi.spellpiece.operator_entity_motion": "Operator: Entity Motion", "psi.spellpiece.operator_entity_motion.desc": "Gets an Entity's motion vector", "psi.spellpiece.operator_entity_axial_look": "Operator: Entity Axial Look", "psi.spellpiece.operator_entity_axial_look.desc": "Gets an Entity's look vector, aligned to an axis", "psi.spellpiece.operator_focused_entity": "Operator: Focused Entity", "psi.spellpiece.operator_focused_entity.desc": "Gets the entity the target entity is looking at", "psi.spellpiece.operator_vector_raycast": "Operator: Vector Raycast", "psi.spellpiece.operator_vector_raycast.desc": "Gets a localized raycast's result (max 32)", "psi.spellpiece.operator_vector_raycast_axis": "Operator: Vector Axis Raycast", "psi.spellpiece.operator_vector_raycast_axis.desc": "Gets a localized raycast's side axis (max 32)", "psi.spellpiece.operator_vector_sum": "Operator: Vector Sum", "psi.spellpiece.operator_vector_sum.desc": "A + B (+ C)", "psi.spellpiece.operator_vector_subtract": "Operator: Vector Subtract", "psi.spellpiece.operator_vector_subtract.desc": "A - B (- C)", "psi.spellpiece.operator_vector_multiply": "Operator: Vector Multiply", "psi.spellpiece.operator_vector_multiply.desc": "A * B", "psi.spellpiece.operator_vector_divide": "Operator: Vector Divide", "psi.spellpiece.operator_vector_divide.desc": "A / B", "psi.spellpiece.operator_vector_cross_product": "Operator: Vector Cross Product", "psi.spellpiece.operator_vector_cross_product.desc": "A x B", "psi.spellpiece.operator_vector_normalize": "Operator: Vector Normalize", "psi.spellpiece.operator_vector_normalize.desc": "Normalizes a Vector so its magnitude is 1", "psi.spellpiece.operator_vector_negate": "Operator: Vector Negate", "psi.spellpiece.operator_vector_negate.desc": "Negates a vector", "psi.spellpiece.operator_vector_magnitude": "Operator: Vector Magnitude", "psi.spellpiece.operator_vector_magnitude.desc": "Gets a vector's Magnitude", "psi.spellpiece.operator_vector_construct": "Operator: Vector Construct", "psi.spellpiece.operator_vector_construct.desc": "Constructs a Vector from XYZ parameters", "psi.spellpiece.operator_vector_extract_x": "Operator: Vector Extract X", "psi.spellpiece.operator_vector_extract_x.desc": "Extracts the X coordinate from a Vector", "psi.spellpiece.operator_vector_extract_y": "Operator: Vector Extract Y", "psi.spellpiece.operator_vector_extract_y.desc": "Extracts the Y coordinate from a Vector", "psi.spellpiece.operator_vector_extract_z": "Operator: Vector Extract Z", "psi.spellpiece.operator_vector_extract_z.desc": "Extracts the Z coordinate from a Vector", "psi.spellpiece.operator_vector_project": "Operator: Vector Project", "psi.spellpiece.operator_vector_project.desc": "Projects Vector A onto Vector B", "psi.spellpiece.operator_vector_dot_product": "Operator: Vector Dot Product", "psi.spellpiece.operator_vector_dot_product.desc": "A . B", "psi.spellpiece.operator_closest_to_point": "Operator: Closest to Point", "psi.spellpiece.operator_closest_to_point.desc": "Gets the closest entity in a list to a point", "psi.spellpiece.operator_random_entity": "Operator: Random Entity", "psi.spellpiece.operator_random_entity.desc": "Gets a random entity from a list", "psi.spellpiece.operator_list_add": "Operator: Add To List", "psi.spellpiece.operator_list_add.desc": "Adds target entity to a list", "psi.spellpiece.operator_list_remove": "Operator: Remove From List", "psi.spellpiece.operator_list_remove.desc": "Removes target entity from a list", "psi.spellpiece.operator_planar_normal_vector": "Operator: Planar Normal Vector", "psi.spellpiece.operator_planar_normal_vector.desc": "Creates a perpendicular vector to a given axial vector. Equivalent to rotating 2\u03c0/3 around <1,1,1>", "psi.spellpiece.operator_vector_rotate": "Operator: Rotate Vector", "psi.spellpiece.operator_vector_rotate.desc": "Rotates a vector around an axis", "psi.spellpiece.operator_gamma_function": "Operator: Gamma Function", "psi.spellpiece.operator_gamma_function.desc": "\u0393(x), equivalent to (x-1)!", "psi.spellpiece.operator_list_size": "Operator: List Size", "psi.spellpiece.operator_list_size.desc": "Gets the number of entities in a list", "psi.spellpiece.operator_list_union": "Operator: List Concatenation", "psi.spellpiece.operator_list_union.desc": "Makes a list with all items from either list", "psi.spellpiece.operator_list_intersection": "Operator: List Intersection", "psi.spellpiece.operator_list_intersection.desc": "Makes a list with all items that are in both lists", "psi.spellpiece.operator_list_exclusion": "Operator: List Exclusion", "psi.spellpiece.operator_list_exclusion.desc": "Makes a list with all items that are in the first list but not the second", "psi.spellpiece.operator_list_index": "Selector: Indexed Element", "psi.spellpiece.operator_list_index.desc": "Selects an entity from an entity list with a given index", "psi.spellpiece.operator_root": "Operator: Root", "psi.spellpiece.operator_root.desc": "Takes the nth root of the number", "psi.spellpiece.operator_extract_sign": "Operator: Signum", "psi.spellpiece.operator_extract_sign.desc": "Extracts the sign from the input", "psi.spellpiece.operator_vector_extract_sign": "Operator: Vector", "psi.spellpiece.operator_vector_extract_sign.desc": "Returns a new vector with the corresponding sign of each vector component", "psi.spellpiece.operator_closest_to_line": "Operator: Closest To Line", "psi.spellpiece.operator_closest_to_line.desc": "Select the closest entity to the line segment", "psi.spellpiece.operator_entity_health": "Operator: Entity Health", "psi.spellpiece.operator_entity_health.desc": "Gets an entity's current health percentage", "psi.spellpiece.operator_vector_absolute": "Operator: Vector Absolute", "psi.spellpiece.operator_vector_absolute.desc": "Takes the absolute value of all vector values and returns a new vector", "psi.spellpiece.operator_entity_raycast": "Operator: Entity Raycast", "psi.spellpiece.operator_entity_raycast.desc": "Raycasts from a given position and returns the first entity it finds", "psi.spellpiece.operator_block_light": "Operator: Block Light", "psi.spellpiece.operator_block_light.desc": "Gets the light value of a block", "psi.spellpiece.operator_block_hardness.desc": "Gets the hardness value of a block", "psi.spellpiece.operator_block_hardness": "Operator: Block Hardness", "psi.spellpiece.operator_block_comparator_strength": "Operator: Block Comparator", "psi.spellpiece.operator_block_comparator_strength.desc": "Gets the comparator strength a block has", "psi.spellpiece.operator_block_side_solidity": "Operator: Block Side Solidity", "psi.spellpiece.operator_block_side_solidity.desc": "Gets whether the side of a block is solid", "psi.spellpiece.operator_block_mining_level": "Operator: Block Mining Level", "psi.spellpiece.operator_block_mining_level.desc": "Gets the mining level of the block at the specified position", "psi.spellpiece.operator_vector_piecewise_maximum": "Operator: Vector Piecewise Maximum", "psi.spellpiece.operator_vector_piecewise_maximum.desc": "Constructs a vector from the biggest of each component of the inputs", "psi.spellpiece.operator_vector_piecewise_minimum": "Operator: Vector Piecewise Minimum", "psi.spellpiece.operator_vector_piecewise_minimum.desc": "Constructs a vector from the smallest of each component of the inputs", "psi.spellpiece.operator_entity_height": "Operator: Entity Height", "psi.spellpiece.operator_entity_height.desc": "Gets an entity's height", "psi.spellpiece.constant_number": "Constant: Number", "psi.spellpiece.constant_number.desc": "Select and type to set value", "psi.spellpiece.constant_pi": "Constant: Pi", "psi.spellpiece.constant_pi.desc": "Returns the value of Pi", "psi.spellpiece.constant_e": "Constant: e", "psi.spellpiece.constant_e.desc": "Returns the value of e", "psi.spellpiece.constant_tau": "Constant: Tau", "psi.spellpiece.constant_tau.desc": "Returns the value of Tau", "psi.spellpiece.constant_wrapper": "Constant: Wrapper", "psi.spellpiece.constant_wrapper.desc": "A wrapper for a constant for stat calculation", "psi.spellpiece.connector": "Connector", "psi.spellpiece.connector.desc": "Connects stuff and things", "psi.spellpiece.cross_connector": "Cross Connector", "psi.spellpiece.cross_connector.desc": "Can connect two paths", "psi.spellpiece.error_suppressor": "Error Suppressor", "psi.spellpiece.error_suppressor.desc": "Suppresses errors thrown by the spell", "psi.spellpiece.error_catch": "Error catcher", "psi.spellpiece.error_catch.desc": "Replaces errors with another value", "psi.spellpiece.trick_debug": "Trick: Debug", "psi.spellpiece.trick_debug.desc": "For testing. Prints out the target", "psi.spellpiece.trick_delay": "Trick: Sleep", "psi.spellpiece.trick_delay.desc": "Delays the spell for the amount of ticks passed in", "psi.spellpiece.trick_die": "Trick: Die", "psi.spellpiece.trick_die.desc": "Stops spell execution if target is within (-1, 1) exclusive", "psi.spellpiece.trick_evaluate": "Trick: Evaluate", "psi.spellpiece.trick_evaluate.desc": "Evaluates a value. Does nothing with it", "psi.spellpiece.trick_add_motion": "Trick: Add Motion", "psi.spellpiece.trick_add_motion.desc": "Adds motion to target Entity", "psi.spellpiece.trick_explode": "Trick: Explode", "psi.spellpiece.trick_explode.desc": "Goes boom", "psi.spellpiece.trick_break_block": "Trick: Break Block", "psi.spellpiece.trick_break_block.desc": "Breaks a block", "psi.spellpiece.trick_break_in_sequence": "Trick: Break Block Sequence", "psi.spellpiece.trick_break_in_sequence.desc": "Breaks a sequence of blocks along the direction of the given Vector", "psi.spellpiece.trick_place_block": "Trick: Place Block", "psi.spellpiece.trick_place_block.desc": "Places a block", "psi.spellpiece.trick_place_in_sequence": "Trick: Place Block Sequence", "psi.spellpiece.trick_place_in_sequence.desc": "Places a sequence of blocks along the direction of the given Vector", "psi.spellpiece.trick_infusion": "Trick: Infusion", "psi.spellpiece.trick_infusion.desc": "Infuses Gold into Psimetal, as well as Redstone into Psidust", "psi.spellpiece.trick_blink": "Trick: Blink", "psi.spellpiece.trick_blink.desc": "Blinks forward", "psi.spellpiece.trick_mass_blink": "Trick: Mass Blink", "psi.spellpiece.trick_mass_blink.desc": "Blinks everybody forward", "psi.spellpiece.trick_mass_add_motion": "Trick: Mass Add Motion", "psi.spellpiece.trick_mass_add_motion.desc": "Adds motion to all entities in target Entity List", "psi.spellpiece.trick_mass_exodus": "Trick: Mass Exodus", "psi.spellpiece.trick_mass_exodus.desc": "Moves all entities in target Entity List to target position", "psi.spellpiece.trick_move_block": "Trick: Move Block", "psi.spellpiece.trick_move_block.desc": "Moves a block by along a given unit axial vector", "psi.spellpiece.trick_move_block_sequence": "Trick: Move Block Sequence", "psi.spellpiece.trick_move_block_sequence.desc": "Moves a sequence of blocks along a given unit axial vector", "psi.spellpiece.trick_collapse_block": "Trick: Collapse Block", "psi.spellpiece.trick_collapse_block.desc": "Collapses a block, as if it were sand", "psi.spellpiece.trick_smite": "Trick: Smite", "psi.spellpiece.trick_smite.desc": "Calls down lightning at the given point", "psi.spellpiece.trick_blaze": "Trick: Blaze", "psi.spellpiece.trick_blaze.desc": "Creates fire at the given point", "psi.spellpiece.trick_torrent": "Trick: Torrent", "psi.spellpiece.trick_torrent.desc": "Creates water at the given point", "psi.spellpiece.trick_overgrow": "Trick: Overgrow", "psi.spellpiece.trick_overgrow.desc": "Fertilizes a block at the given point", "psi.spellpiece.trick_greater_infusion": "Trick: Greater Infusion", "psi.spellpiece.trick_greater_infusion.desc": "Infuses Diamonds into Psigems, as well as infusing Redstone and Gold", "psi.spellpiece.trick_ebony_ivory": "Trick: Ebony & Ivory", "psi.spellpiece.trick_ebony_ivory.desc": "Infuses Coal and Quartz while in the End, while still infusing Redstone, Gold, and Diamonds", "psi.spellpiece.trick_speed": "Trick: Speed", "psi.spellpiece.trick_speed.desc": "Applies a Speed effect", "psi.spellpiece.trick_haste": "Trick: Haste", "psi.spellpiece.trick_haste.desc": "Applies a Haste effect", "psi.spellpiece.trick_strength": "Trick: Strength", "psi.spellpiece.trick_strength.desc": "Applies a Strength effect", "psi.spellpiece.trick_jump_boost": "Trick: Jump Boost", "psi.spellpiece.trick_jump_boost.desc": "Applies a Jump Boost effect", "psi.spellpiece.trick_water_breathing": "Trick: Water Breathing", "psi.spellpiece.trick_water_breathing.desc": "Applies a Water Breathing effect", "psi.spellpiece.trick_fire_resistance": "Trick: Fire Resistance", "psi.spellpiece.trick_fire_resistance.desc": "Applies a Fire Resistance effect", "psi.spellpiece.trick_invisibility": "Trick: Invisibility", "psi.spellpiece.trick_invisibility.desc": "Applies an Invisibility effect", "psi.spellpiece.trick_regeneration": "Trick: Regeneration", "psi.spellpiece.trick_regeneration.desc": "Applies a Regeneration effect", "psi.spellpiece.trick_resistance": "Trick: Resistance", "psi.spellpiece.trick_resistance.desc": "Applies a Resistance effect", "psi.spellpiece.trick_slowness": "Trick: Slowness", "psi.spellpiece.trick_slowness.desc": "Applies a Slowness effect", "psi.spellpiece.trick_weakness": "Trick: Weakness", "psi.spellpiece.trick_weakness.desc": "Applies a Weakness effect", "psi.spellpiece.trick_wither": "Trick: Wither", "psi.spellpiece.trick_wither.desc": "Applies a Wither effect", "psi.spellpiece.trick_ignite": "Trick: Ignite", "psi.spellpiece.trick_ignite.desc": "Sets an entity on fire", "psi.spellpiece.trick_eidos_anchor": "Trick: Eidos Anchor", "psi.spellpiece.trick_eidos_anchor.desc": "Returns the caster to current position after target Time", "psi.spellpiece.trick_eidos_reversal": "Trick: Eidos Reversal", "psi.spellpiece.trick_eidos_reversal.desc": "Takes the caster back in time", "psi.spellpiece.trick_smelt_item": "Trick: Smelt Item", "psi.spellpiece.trick_smelt_item.desc": "Smelts an item entity into its smelted counterpart", "psi.spellpiece.trick_smelt_block": "Trick: Smelt Block", "psi.spellpiece.trick_smelt_block.desc": "Smelts a block into its smelted counterpart", "psi.spellpiece.trick_conjure_block": "Trick: Conjure Block", "psi.spellpiece.trick_conjure_block.desc": "Conjures a fragile block", "psi.spellpiece.trick_conjure_light": "Trick: Conjure Light", "psi.spellpiece.trick_conjure_light.desc": "Conjures a fragile light", "psi.spellpiece.trick_conjure_block_sequence": "Trick: Conjure Block Sequence", "psi.spellpiece.trick_conjure_block_sequence.desc": "Conjures a sequence of fragile blocks along the given Vector", "psi.spellpiece.trick_switch_target_slot": "Trick: Switch Focus Slot (Hotbar)", "psi.spellpiece.trick_switch_target_slot.desc": "Changes the focused slot of this spell, to anywhere in the hotbar", "psi.spellpiece.trick_save_vector": "Trick: Save Vector", "psi.spellpiece.trick_save_vector.desc": "Saves a vector to CAD Memory", "psi.spellpiece.trick_play_sound": "Trick: Play Note", "psi.spellpiece.trick_play_sound.desc": "Plays a note block sound", "psi.spellpiece.trick_break_loop": "Trick: Break Loop", "psi.spellpiece.trick_break_loop.desc": "Stops loop if target is within (-1, 1) exclusive", "psi.spellpiece.trick_detonate": "Trick: Detonate", "psi.spellpiece.trick_detonate.desc": "Detonates all Spell Charges within 32 blocks of the Focal Point", "psi.spellpiece.trick_till": "Trick: Till", "psi.spellpiece.trick_till.desc": "Tills a block", "psi.spellpiece.trick_till_sequence": "Trick: Till Sequence", "psi.spellpiece.trick_till_sequence.desc": "Tills a sequence of blocks along the given vector", "psi.spellpiece.trick_broadcast": "Trick: Broadcast", "psi.spellpiece.trick_broadcast.desc": "Broadcasts a number in a given channel to nearby CADs", "psi.spellpiece.trick_change_slot": "Trick: Slot Change (Inventory)", "psi.spellpiece.trick_change_slot.desc": "Changes the building slot to one of the 36 inventory slots.", "psi.spellpiece.trick_smelt_block_sequence": "Trick: Smelt Block Sequence", "psi.spellpiece.trick_smelt_block_sequence.desc": "Smelts blocks in a defined direction starting in a given position", "psi.spellpiece.trick_collapse_block_sequence": "Trick: Collapse Block Sequence", "psi.spellpiece.trick_collapse_block_sequence.desc": "Collapses a sequence of blocks, as if they were sand", "psi.spellpiece.trick_debug_spamless": "Trick: Channeled Debug", "psi.spellpiece.trick_debug_spamless.desc": "Prints out the target, replacing any previous prints with the same number", "psi.spellpiece.trick_night_vision": "Trick: Night Vision", "psi.spellpiece.trick_night_vision.desc": "Applies a Night Vision effect", "psi.spellpiece.trick_particle_trail": "Trick: Particle Trail", "psi.spellpiece.trick_particle_trail.desc": "Makes a particle trail from a position along a ray", "psi.spellpiece.trick_spin_chamber": "Trick: Spin Chamber", "psi.spellpiece.trick_spin_chamber.desc": "Selects the next or previous bullet depending on the sign of the input", "psi.spellpiece.trick_russian_roulette": "Trick: Russian Roulette", "psi.spellpiece.trick_russian_roulette.desc": "Selects a random bullet", "psi.spellpiece.trick_conjure_circle": "Trick: Conjure Circle", "psi.spellpiece.trick_conjure_circle.desc": "Conjures a spell circle at the given position", "psi.spellparam.target": "Target", "psi.spellparam.number": "Number", "psi.spellparam.root": "Root", "psi.spellparam.list1": "List A", "psi.spellparam.list2": "List B", "psi.spellparam.list": "List", "psi.spellparam.from1": "From", "psi.spellparam.from2": "From", "psi.spellparam.to1": "To", "psi.spellparam.to2": "To", "psi.spellparam.toggle": "Toggle", "psi.spellparam.number1": "Number A", "psi.spellparam.number2": "Number B", "psi.spellparam.number3": "Number C", "psi.spellparam.number4": "Number D", "psi.spellparam.vector1": "Vector A", "psi.spellparam.vector2": "Vector B", "psi.spellparam.vector3": "Vector C", "psi.spellparam.vector4": "Vector D", "psi.spellparam.position": "Position", "psi.spellparam.ray": "Ray", "psi.spellparam.max": "Max", "psi.spellparam.min": "Min", "psi.spellparam.power": "Power", "psi.spellparam.direction": "Direction", "psi.spellparam.speed": "Speed", "psi.spellparam.x": "X", "psi.spellparam.y": "Y", "psi.spellparam.z": "Z", "psi.spellparam.radius": "Radius", "psi.spellparam.distance": "Distance", "psi.spellparam.time": "Time", "psi.spellparam.constant": "Constant", "psi.spellparam.shift": "Shift", "psi.spellparam.slot": "Slot", "psi.spellparam.base": "Base", "psi.spellparam.vector": "Vector", "psi.spellparam.axis": "Axis", "psi.spellparam.angle": "Angle", "psi.spellparam.channel": "Channel", "psi.spellparam.instrument": "Instrument", "psi.spellparam.volume": "Volume", "psi.spellparam.pitch": "Pitch", "psi.spellparam.mask": "Pattern", "psi.spellparam.ray_end": "Ray End", "psi.spellparam.ray_start": "Ray Start", "psi.spellparam.fallback": "Fallback", "psi.datatype.void": "None", "psi.datatype.any": "Any", "psi.datatype.double": "Number", "psi.datatype.integer": "Number", "psi.datatype.number": "Number", "psi.datatype.vector3": "Vector", "psi.datatype.entity": "Entity", "psi.datatype.living_entity": "Entity (Living)", "psi.datatype.living_entity_base": "Entity (Living)", "psi.datatype.player": "Entity (Player, Living)", "psi.datatype.entity_list_wrapper": "Entity List", "psi.spellerror.nospell": "No Spell to compile", "psi.spellerror.script": "Script piece %s failed: %s", "psi.spellerror.script_return_type": "Script piece %s returned %s, expected %s", "psi.spellerror.invalid_base": "ERROR: Cannot interpret bases below 2", "psi.spellerror.nthroot": "ERROR: Even numbered roots can't accept negative numbers", "psi.spellerror.noname": "Spell is Unnamed", "psi.spellerror.notricks": "Spell has no Tricks", "psi.spellerror.unsetparam": "A required Parameter is not set", "psi.spellerror.nullparam": "A Parameter is facing an empty cell", "psi.spellerror.invalidparam": "A Parameter is facing an invalid piece", "psi.spellerror.samesideparams": "Two or more Parameters are sharing a side", "psi.spellerror.loop": "Can't resolve due to endless loop", "psi.spellerror.nonpositivevalue": "A Number Parameter that needs to be positive isn't", "psi.spellerror.noninteger": "A Number Parameter that needs to an integer isn't", "psi.spellerror.nonpositiveinteger": "A Number Parameter that needs to be a positive integer isn't", "psi.spellerror.statoverflow": "Spell Stats overflow past maximum possible integer", "psi.spellerror.exclusiveparams": "Two mutually exclusive parameters are set", "psi.spellerror.position": "Error Position: [%d, %d].", "psi.spellerror.dividebyzero": "ERROR: Divide by zero.", "psi.spellerror.nulltarget": "ERROR: Spell Entity target is non existent.", "psi.spellerror.nullvector": "ERROR: Spell Operation Vector is non existent or null.", "psi.spellerror.outsideradius": "ERROR: Spell target is outside maximum 32 block radius.", "psi.spellerror.outsidetrigdomain": "ERROR: Value is outside inverse trignometric function's domain.", "psi.spellerror.bossimmune": "ERROR: Attempted to cast a spell on an immune entity or a boss.", "psi.spellerror.nocad": "ERROR: Caster has no CAD.", "psi.spellerror.memoryoutofbounds": "ERROR: Memory access out of bounds.", "psi.spellerror.lockedmemory": "ERROR: Memory slot is locked.", "psi.spellerror.immunetarget": "ERROR: Target entity is immune or a boss.", "psi.spellerror.negativenumber": "ERROR: Target number is negative in a piece where it can't be.", "psi.spellerror.nonaxial": "ERROR: Vector cannot be non-axial", "psi.spellerror.volume": "ERROR: Volume must be between [0,1]", "psi.spellerror.instruments": "ERROR: Instrument value must be between [0,15]", "psi.spellerror.pitch": "ERROR: Pitch value must be between [0,24]", "psi.spellerror.out_of_bounds": "ERROR: The provided index is not within the range of the list", "psi.levelskip": "Psi has found save data from a previous world.
Would you like to load it?

If you choose to load it, you'll be taken instantly to Level %d. Otherwise, this message won't show up again this session.", "psi.spellerror.armor": "ERROR: Selector only works when cast from armor", "psi.spellerror.no_message": "ERROR: CAD has not picked up a broadcasted message", "psi.spellerror.disabled_piece": "The piece %s is disabled", "psi.spellerror.locked_piece": "The piece %s is locked", "psi.spellerror.comparator": "ERROR: Comparators can only measure in the 4 cardinal directions", "psi.spellerror.cad_casting_only": "ERROR: This trick must be cast from a CAD", "psi.spellerror.nan": "ERROR: %s parameter is not a number.", "command.psi.learn.usage": "/psi-learn [player]", "command.psi.learn.success": "Successfully taught %s %s", "command.psi.learn.success.all": "Successfully taught %s all of Psi", "command.psi.learn.should_not": "%s already knows %s", "command.psi.learn.players": "%s isn't a player, only players can have Psi knowledge", "command.psi.learn.console": "The console can't learn Psi. Try specifying a player! /psi-learn [player]", "command.psi.learn.not_a_group": "'%s' is not a valid Psi piece group", "command.psi.learn.unknown": "This player has no Psi data. Report this to the mod author.", "command.psi.unlearn.usage": "/psi-unlearn [player]", "command.psi.unlearn.success": "Successfully made %s forget %s", "command.psi.unlearn.success.all": "Successfully made %s forget all of Psi", "command.psi.unlearn.should_not": "%s doesn't know %s", "command.psi.unlearn.players": "%s isn't a player, only players can have Psi knowledge", "command.psi.unlearn.console": "The console can't learn Psi. Try specifying a player! /psi-unlearn [player]", "command.psi.unlearn.not_a_group": "'%s' is not a valid Psi piece group", "command.psi.unlearn.unknown": "This player has no Psi data. Report this to the mod author.", "jei.psi.category.trick": "Spell Infusion", "jei.psi.spell_copy": "Copies spell", "psi.subtitle.book": "Sweet Alexum plays in the distance", "tag.item.psi.cad_component.assembly": "CAD Assemblies", "tag.item.psi.cad_component.battery": "CAD Batteries", "tag.item.psi.cad_component.core": "CAD Cores", "tag.item.psi.cad_component.dye": "CAD Colorizers", "tag.item.psi.cad_component.socket": "CAD Sockets", "tag.item.psi.ebony_substance": "Ebony Substance", "tag.item.psi.ivory_substance": "Ivory Substance", "tag.item.psi.psidust": "Psidust", "_comment": "Book stuff", "advancement.psi:iron_cad_pickup": "Sweet Bod", "advancement.psi:iron_cad_pickup.desc": "Craft an Iron CAD Assembly", "advancement.psi:gold_assembly_pickup": "Worth Its Weight In Gold", "advancement.psi:gold_assembly_pickup.desc": "Craft a Gold CAD Assembly", "advancement.psi:psimetal_assembly_pickup": "Psightly Better", "advancement.psi:psimetal_assembly_pickup.desc": "Craft a Psimetal CAD Assembly", "advancement.psi:ebony_assembly_pickup": "Strong and Thick", "advancement.psi:ebony_assembly_pickup.desc": "Craft an Ebony CAD Assembly", "advancement.psi:ivory_assembly_pickup": "Sleeker and Sexier", "advancement.psi:ivory_assembly_pickup.desc": "Craft an Ivory CAD Assembly", "advancement.psi:psidust": "...Uncraftable?", "advancement.psi:psidust.desc": "Craft your first piece of Psidust", "advancement.psi:psimetal_pickup": "The Alloy Of Awe", "advancement.psi:psimetal_pickup.desc": "Infuse your first piece of Psimetal", "advancement.psi:psigem_pickup": "Thought Crystal", "advancement.psi:psigem_pickup.desc": "Infuse your first Psigem out of diamonds", "advancement.psi:ebony_pickup": "High Value", "advancement.psi:ebony_pickup.desc": "Infuse your first Ebony substance out of Coal", "advancement.psi:ivory_pickup": "Differently Valued", "advancement.psi:ivory_pickup.desc": "Infuse your first Ivory substance out of Quartz", "advancement.psi:encyclopaedia_psionica": "Put It On My Tablet", "advancement.psi:encyclopaedia_psionica.desc": "Craft the Encyclopaedia Psionica, your guide for all things Psi", "psi.book.subtitle": "Spellslinging 101", "psi.statlabel.is_last": "isLast", "psi.book.name": "Encyclopaedia Psionica", "psi.book.landing_text": "$(thing)Psi$(0) is a mod about creating $(thing)Spells$(0) whose limits are only defined by your own ingenuity. This book contains all the knowledge you need to become an expert spellslinger.$(p)(This book is a work in progress. You can find the old tutorial entries under the Legacy Entries Section.)", "psi.book.category.basics": "Basics", "psi.book.category.basics.desc": "If you're new to $(thing)Psi$(0), I advise that you take a read through each and every entry here. All of them contain vital information.", "psi.book.entry.introduction": "Introduction", "psi.book.page.introduction.0": "Welcome to $(thing)Psi$(0), the greatest spell-program-based magitech mod this side of the universe!$(p)$(thing)Psi$(0) is a mod (inspired by the Mahouka series) about creating and casting $(thing)Spells$(0) to do your bidding.$(p)To begin your journey to become a spellslinging mage, you'll first need some $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l)-- however, one does not simply craft the stuff.", "psi.book.page.introduction.1": "Instead, start by crafting a $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l) and an $(l:components/assembly#iron)$(o)$(item)Iron CAD Assembly$(0)$(/l).$(p)Place the $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l), open it, and insert the $(l:components/assembly#iron)$(o)$(item)Iron CAD Assembly$(0)$(/l) to construct a very bare-bones $(thing)Casting Assistant Device$(0) ($(thing)CAD$(0), for short).$(p)From there, drop some $(item)Redstone Dust$(0) on the ground, point your new $(thing)CAD$(0) at the dust, and cast ($(k:use)) to create some $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l).", "psi.book.entry.cadAssembler": "CAD Assembler", "psi.book.page.cadAssembler.0": "The $(item)CAD Assembler$(0) is the heart of $(thing)Psi$(0), serving two essential functions.$(p)First, it assembles a $(thing)CAD$(0) from its component parts. Second, it loads $(o)non-empty$() $(item)Spell Bullets$(0) into $(thing)CADs$(0) (as well as other things that hold $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l), such as $(l:items/tools)$(o)$(thing)Psimetal Tools$(0)$(/l)).", "psi.book.page.cadAssembler.1": "Build-a-CAD Workshop", "psi.book.page.cadAssembler.2": "The simplest CAD that can cast", "psi.book.page.cadAssembler.3": "A $(thing)CAD$(0) is built from up to five components; the simplest $(thing)CAD$(0) only uses one component, an $(l:components/assembly)$(o)$(item)Assembly$(0)$(/l), though this is only useful for crafting $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l).$(p)A $(thing)CAD$(0) capable of casting $(thing)Spells$(0) requires a $(l:components/core)$(o)$(item)Core$(0)$(/l) and a $(l:components/socket)$(o)$(item)Socket$(0)$(/l) as well.$(p)Adding a $(l:components/battery)$(o)$(item)Battery$(0)$(/l) slightly increases a user's maximum $(thing)Psi energy$(0), and adding a $(l:components/colorizer)$(o)$(item)Colorizer$(0)$(/l) changes the color of cast $(thing)Spells$(0), which is purely cosmetic.", "psi.book.page.cadAssembler.4": "Once a $(thing)CAD$(0) is created, it can be placed in the leftmost panel of the $(item)CAD Assembler$(0).$(p)When placed there, the slots below open; $(item)Spell Bullets$(0) can be placed in these slots to be loaded into the $(thing)CAD$(0).$(p)Once the $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) are loaded, the $(thing)CAD$(0) is removed and held, and the $(thing)Psi master keybind$(0) ($(k:psimisc.keybind)) is held, the $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l)' $(thing)Spells$(0) will be displayed on a radial menu, ready to be selected and cast.", "psi.book.page.cadAssembler.5": "A CAD with one bullet loaded", "psi.book.entry.spellProgrammer": "Spell Programmer", "psi.book.page.spellProgrammer.0": "If the $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l) is the heart of $(thing)Psi$(0), then the $(item)Spell Programmer$(0) is the brains of the mod. It's where $(thing)Spells$(0) are written and compiled, and eventually copied into $(item)Spell Bullets$(0) to be cast.$(p)When placed and opened ($(k:use)), it displays a large 9x9 grid; see $(l:basics/tutorial_1)the tutorial entries$(/l) for more in-depth knowledge on using this grid.", "psi.book.page.spellProgrammer.1": "Hour Of Code", "psi.book.entry.vectorPrimer": "A Primer On Vectors", "psi.book.page.vectorPrimer.0": "$(thing)Psi$(0) uses the concept of a Vector extensively. Therefore, if you haven't the foggiest idea what a vector is, I strongly recommend you watch the video below.$(p)The explanation in the next few pages is $(l)simplified$() for beginners. Don't take it as definitive.", "psi.book.page.vectorPrimer.1": "In the world of $(thing)Psi$(0) (and indeed in a $(thing)Minecraft$(0) world), all vectors are three-dimensional. In essence, they're just lists of three coordinates: $(o)x$(), $(o)y$(), $(o)z$().$(p)The $(o)x$()-coordinate represents east when positive and west when negative, the $(o)y$()-direction up and down, and the $(o)z$()-direction south and north.$(p)If this doesn't make sense yet, open the debug screen (F3) and run around, paying attention to the row labeled \"XYZ:\".$(br)You'll understand.", "psi.book.page.vectorPrimer.2": "That list of three numbers on the debug screen is, in fact, the first type of vector you'll meet: a $(l)position vector$().$(p)A position vector simply represents the location of a block, or an entity, or perhaps some empty space in the world. A single fixed location, represented by a list [$(o)x$(), $(o)y$(), $(o)z$()].$(p)However, not all vectors represent positions-- and it's important to note that $(l)any three numbers in a list constitute a vector$().", "psi.book.page.vectorPrimer.3": "An interesting fact about vectors is that they're extremely easy to add.$(p)For example, say we have a grass block at some location, which we choose to represent as [$(o)x$(), $(o)y$(), $(o)z$()].$(p)If we wish to add another vector (e.g. [0, 1, 0]) to this one, all we would have to do is add corresponding numbers:$(br)our vector sum would be [$(o)x$()+0, $(o)y$()+1, $(o)z$()+0], or just [$(o)x$(), $(o)y$()+1, $(o)z$()].", "psi.book.page.vectorPrimer.4": "Since the $(o)y$()-component of our new vector has increased by one, and positive-$(o)y$() means up, this new vector simply represents the block above our grass block.$(p)The vector [0, 1, 0] represents the $(o)difference$() in position between our original and new vector, and it's our second type of vector: an $(l)offset vector$().", "psi.book.page.vectorPrimer.5": "Offset vectors are what most spellslingers spend the majority of their time manipulating, so a mastery over them is key.$(p)Usually, a mage starts with a single position vector, then adds, subtracts, or otherwise combines offset vectors with this position vector in order to target their desired point in the world.", "psi.book.page.vectorPrimer.6": "It's important to note that the idea \"offset\" and \"position\" vectors is conceptual; the terms are unique to the terminology of this tablet.$(p)Again: all $(thing)Psi$(0) vectors are just lists of three numbers, and there's nothing stopping you from pretending the distinction doesn't exist.$(p)Indeed, in some contexts outside the scope of this book, the distinction doesn't even make $(o)sense$().", "psi.book.page.vectorPrimer.7": "Offset vectors have $(l)magnitudes$().$(p)You can think of an offset vector's magnitude as its \"length,\" or the distance between a position in the world, and that same position when the offset vector is added to it.$(p)For example, our earlier offset vector [0, 1, 0] simply moved the position one block-length up, so it had a length, and therefore a magnitude, of 1.", "psi.book.page.vectorPrimer.8": "Since a distance is always positive, so are vectors' magnitudes.$(p)Consider the vector [0, -3, 0] as an example: it represents down, three blocks-- yet the total distance moved is three blocks, and the \"down\" bit doesn't matter.$(p)Therefore, the magnitude of this vector is $(l)positive$() 3.", "psi.book.page.vectorPrimer.9": "Almost all vectors also have $(l)directions$().$(p)An offset vector's direction is, well, the direction something would move if it followed the vector in a straight line.$(p)For example, the direction of [0, 1, 0] is simply straight up.$(p)The vector [1, 0, -1], on the other hand, represents one block east and one block north, so its direction is just straight ahead, due northeast.", "psi.book.page.vectorPrimer.10": "(Most directions aren't so nice, usually looking like \"36.86 degrees north of west, 22.62 degrees below the horizon.\")$(p)Note that the only vector without a direction is [0, 0, 0] (the $(l)zero vector$()), since you have to be going somewhere $(o)else$() to have a direction.$(p)Note that the direction of a position vector is almost as meaningless as its magnitude-- most $(thing)Spells$(0) don't need to know \"where should I go to get away from bedrock at world spawn.\"", "psi.book.page.vectorPrimer.11": "As a matter of fact, you can reconstruct any vector, given only its magnitude and direction, into a list of three numbers (which are known as the $(l)components$() of the vector).$(p)For example, the direction \"up\" and the magnitude 1 correspond to the vector [0, 1, 0].$(p)This isn't as surprising as it may seem: after all, if someone tells you which direction to go, and how far, you should know they want you to be.", "psi.book.page.vectorPrimer.12": "There are several simple ways to manipulate position and offset vectors.$(p)First, we can add a position and an offset vector to get another position vector, as we did earlier with the grass block example.$(p)On the other hand, we can of course $(o)subtract$() two position vectors to get the offset vector representing the offset from one to the other:$(br)[$(o)x$(), $(o)y$()+1, $(o)z$()] \u2212 [$(o)x$(), $(o)y$(), $(o)z$()] = [0, 1, 0].", "psi.book.page.vectorPrimer.13": "Perhaps more interestingly, we can add two offset vectors, to get a single offset representing their combination.$(p)Adding this offset to a position vector would be equivalent to first adding one of its components to that position vector, then adding the other.", "psi.book.page.vectorPrimer.14": "And last, but most certainly not least, of the simple operations: we can $(l)scale$() a vector, by multiplying it by a number.$(p)Note that we're multiplying it by a number, and $(o)not$() another vector.$(p)If we wish to scale an vector [$(o)p$(), $(o)q$(), $(o)r$()] by a factor $(o)n$(), we simply multiply each of the vector's components by $(o)n$():$(br)$(o)n$()\u00b7[$(o)p$(), $(o)q$(), $(o)r$()] = [$(o)n$()\u00b7$(o)p$(), $(o)n$()\u00b7$(o)q$(), $(o)n$()\u00b7$(o)r$()].", "psi.book.page.vectorPrimer.15": "This final operation relates nicely indeed to the concepts of magnitude and direction.$(p)When you scale a vector by a number $(o)n$(), you:$(li)multiply its magnitude by the absolute value of $(o)n$(), and$(li)don't change its direction if $(o)n$() is positive, but reverse its direction if $(o)n$() is negative.$(p)If $(o)n$()=0, then of course the resulting vector is the zero vector.", "psi.book.page.vectorPrimer.16": "On the other hand, if we set $(o)n$()=-1, then we get a vector with the same magnitude (the absolute value of -1 is 1), but pointing the opposite way (since -1 is negative)!$(p)This vector is known as the $(l)negative$() of the original, and when the two are added we get the zero vector.$(p)This makes sense, since if we go in a direction, then go in the opposite direction for the same distance, our net movement is zero.", "psi.book.page.vectorPrimer.17": "If, instead of multiplying, we $(o)divide$() a (nonzero) vector by its magnitude, we get a vector with magnitude 1 (since anything divided by itself is 1), but the same direction (since magnitudes are always positive).$(p)This is an important and well-known operation, known as $(l)normalizing$() a vector; the vector that results (and, in fact, any vector with magnitude 1) is called a $(l)unit vector$().", "psi.book.page.vectorPrimer.18": "Unit vectors have a fixed magnitude, so they only represent direction.$(p)Many $(thing)Spell Pieces$(0) related to direction return unit vectors, like $(piece)Operator: Vector Axis Raycast$(0) and $(piece)Operator: Entity Look$(0).$(p)Indeed, there are $(thing)Operators$(0) to do $(o)most$() of the vector operations laid out in this article, usually with self-explanatory names.", "psi.book.page.vectorPrimer.19": "The operations and their corresponding $(thing)Operators$(0) are as follows:$(li)Negating is $(piece)Operator: Vector Negate$(0);$(li)Normalizing is $(piece)Operator: Vector Normalize$(0);$(li)Scaling is $(piece)Operator: Vector Multiply$(0) and $(piece)Operator: Vector Divide$(0);$(li)Taking the magnitude is $(piece)Operator: Vector Magnitude$(0);$(li)Adding is $(piece)Operator: Vector Sum$(0);$(li)Subtracting is $(piece)Operator: Vector Subtract$(0).", "psi.book.page.vectorPrimer.20": "Finally: vectors are still lists of three numbers. Don't lose sight of that.$(p)In a $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l), they can be constructed from up to three numbers with $(piece)Operator: Vector Construct$(0).$(p)Conversely, a vector can also be broken back down into numbers with $(piece)Operator: Extract X$(0), $(piece)Operator: Extract Y$(0), and $(piece)Operator: Extract Z$(0).", "psi.book.page.vectorPrimer.21": "Congratulations on making it through this tutorial!$(p)Again, this is just an introduction to vectors-- I've not said anything about dot or cross products, or vector projections, for example.$(p)But this should be more than enough to put together some quite interesting $(thing)Spells$(0) already.$(p)That's all-- now go forth and spellsling!", "psi.book.entry.tutorial1": "Tutorial (1): Writing A Spell", "psi.book.page.tutorial1.0": "Congratulations on getting acquainted with your brand-new $(thing)CAD$(0)!$(p)This tablet will serve as a reference manual for this mod, but certain entries (like this one) are tutorials, introducing you to the concepts and terms of a proper spellslinger.$(p)Don't worry, this is the longest tutorial, as it covers all the basics.", "psi.book.page.tutorial1.1": "$(o)Note that many keywords in $(item)colored$(0) $(thing)italicized$(0) $(piece)text$(0) are links, and can be clicked on to learn more about their respective items or concepts.$()$(p)To get started with $(thing)Spell$(0) programming, you'll need (duh) a $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l).$(p)Additionally, to actually execute your $(thing)Spells$(0), you'll need a better $(thing)CAD$(0) than the one you have right now-- you can construct one in your $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l).", "psi.book.page.tutorial1.2": "To that end, you probably want to make a $(l:components/core#basic)$(o)$(item)Basic CAD Core$(0)$(/l) and $(l:components/socket#basic)$(o)$(item)Basic CAD Socket$(0)$(/l).$(p)You don't have to make another $(l:components/assembly)$(o)$(item)Assembly$(0)$(/l); you can put your current $(thing)CAD$(0) in a crafting grid to revert it back to one (since it's pretty much just an $(l:components/assembly)$(o)$(item)Assembly$(0)$(/l) anyway).$(p)Additionally, $(thing)Spells$(0) can't be cast directly out of a $(thing)CAD$(0); instead they're stored in $(item)Spell Bullets$(0), so to get rolling you'll need a small handful of those as well.", "psi.book.page.tutorial1.3": "Once all your materials are gathered, the standard workflow for $(thing)Spell$(0) creation goes as follows:$(li)Construct a $(thing)Spell$(0) in the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l);$(li)Copy the $(thing)Spell$(0) into a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l);$(li)Load the $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) into your $(thing)CAD$(0) using the $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l);$(li)Hold your $(thing)CAD$(0), point, and cast.$(p)In this tutorial and the next, we'll walk you through this process.", "psi.book.page.tutorial1.4": "When you open up your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l), you'll see a large grid-- this is where $(thing)Spells$(0) are made, and where the magic happens.$(p)$(thing)Psi$(0)'s programming system isn't $(o)exactly$() a traditional, complex one; instead, $(thing)Spells$(0) are composed of simple actions, called $(thing)Tricks$(0), executed in sequence.$(p)The whole mod centers around simply getting $(thing)Tricks$(0) to do what you want them to.", "psi.book.page.tutorial1.5": "$(thing)Psi$(0)'s $(thing)Spells$(0) are all created on the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l)'s grid from $(thing)Spell Pieces$(0); you can add as many pieces of as many types to a grid as you want, though not all arrangements of $(thing)Spell Pieces$(0) will produce valid $(thing)Spells$(0).$(p)To add a piece to the grid, right-click where you want the piece to go, and select from the menu of pieces that pops up.", "psi.book.page.tutorial1.6": "When selecting from the menu of $(thing)Spell Pieces$(0), you can hover over one to see its name, and click on it to place it in the grid.$(p)Don't worry about the myriad of pieces that appear for you; you can simply type to search for specific pieces, and press Enter to place the first search result.$(p)You can hold Shift and hover over the \"?\" button on the bottom-right to see the full list of shortcuts.", "psi.book.page.tutorial1.7": "Start by placing the piece called $(piece)Trick: Debug$(0) anywhere on the grid.$(p)As mentioned before, $(thing)Tricks$(0) like this one are the $(thing)Spell Pieces$(0) responsible for interacting with the world.$(p)This is the simplest $(thing)Trick$(0); all it does is say something in your chat. Yet $(thing)Tricks$(0) can use your $(thing)Psi energy$(0) to do a huge variety of things.", "psi.book.page.tutorial1.8": "Select a grid piece $(l)adjacent$() to your $(piece)Trick: Debug$(0), and place the piece called $(piece)Selector: Caster$(0) there.$(p)$(thing)Selectors$(0) are the $(thing)Spell Pieces$(0) that provide information about the surrounding world to $(thing)Spells$(0).$(p)This particular piece represents you, the eventual caster of this $(thing)Spell$(0). You'll probably use this one rather often, as it's a natural starting-point for your $(thing)Spells$(0).", "psi.book.page.tutorial1.9": "Nearly all $(thing)Spell Pieces$(0) need $(l)parameters$(), which tell the pieces what to perform their actions on.$(p)For example, we know that $(piece)Trick: Debug$(0) sends something to chat; its first parameter tells it $(o)what$() to say.$(p)$(o)Parameters also have $(l)data types$()$(o), or $(l)types$()$(o) for short, but we'll worry about those in a later tutorial.$()", "psi.book.page.tutorial1.10": "Left-click your $(piece)Trick: Debug$(0) piece; you should see a panel appear on the left-hand side with two rows. Each row should have a label and several small arrows.$(p)These two rows represent the two parameters that $(piece)Trick: Debug$(0) takes.$(p)Ignore the row labeled \"Number\" for now; just know that the dot in the center means it's optional. For a $(thing)Spell$(0) to function, all $(o)non$()-optional parameters must be filled.", "psi.book.page.tutorial1.11": "Look at the arrows labeled \"Target,\" and select the one corresponding to where you placed $(piece)Selector: Caster$(0) (for example, if you placed it to the right of $(piece)Trick: Debug$(0), select the rightmost arrow that points left), so it appears that the $(thing)Selector$(0) piece is pointing towards the $(thing)Trick$(0) piece.", "psi.book.page.tutorial1.12": "This will make the $(thing)Trick$(0) use the $(thing)Selector$(0) as its \"Target\" parameter.$(p)We say that $(piece)Trick: Debug$(0) $(l)accepts$() or $(l)takes$() $(piece)Selector: Caster$(0) as its \"Target\" parameter.$(p)Parameters are also known as $(l)arguments$(), or simply $(l)inputs$().$(p)$(o)Technical note: In programming-vocabulary there's a subtle difference in the terms, but it's beyond the scope of this tablet.$()", "psi.book.page.tutorial1.13": "Your final $(thing)Spell$(0) should look something like this", "psi.book.page.tutorial1.14": "At this point, the X in the upper-left hand corner of the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) should have turned into a check-mark.$(p)A check-mark means that the $(thing)Spell$(0) $(l)compiled successfully$() (which is a compact way of saying \"the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) made sure that all the $(thing)Spell Pieces$(0) you've placed fit together correctly\"). ", "psi.book.page.tutorial1.15": "If at any time the X is present (which means that the compilation $(l)failed$() or $(l)errored$()), you can hover over it to see the problem with your $(thing)Spell$(0) and correct that problem.$(p)Once your $(thing)Spell$(0) compiles successfully, it can be copied into a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) and cast. And that's exactly what we'll do in $(l:basics/tutorial_2)the next tutorial$(/l)!", "psi.book.entry.tutorial2": "Tutorial (2): Casting A Spell", "psi.book.page.tutorial2.0": "So, you've written your first $(thing)Spell$(0)! Actually casting it, though, will take a few extra steps.$(p)First, close out your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l), hold a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) (which you should have prepared in the last tutorial), and use ($(k:use)) the bullet on the Programmer. You should hear a chime, and the bullet should rename itself to \"Debug.\"", "psi.book.page.tutorial2.1": "The bullet now contains a copy of the $(thing)Spell$(0) you've written, and is ready to be loaded into your $(thing)CAD$(0).$(p)To load a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) into your $(thing)CAD$(0), open your $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l) and insert your $(thing)CAD$(0) into the leftmost slot. Some of the slots below it should open; place the bullet with the $(thing)Spell$(0) you've written in one of these slots. Take your $(thing)CAD$(0) back out.", "psi.book.page.tutorial2.2": "$(s$(0) can hold multiple $(item)Spell Bullets$(0), and therefore multiple $(thing)Spells$(0); the active $(thing)Spell$(0) to be cast can be switched on-the-fly.$(p)To select a $(thing)Spell$(0) to cast, hold your $(thing)CAD$(0) in either hand and hold down the $(thing)Psi master keybind$(0) ($(k:psimisc.keybind)).$(p)A radial menu should appear; hover over the $(thing)Spell$(0) labeled \"Debug\" (the one you just wrote) and release the key to select it.", "psi.book.page.tutorial2.3": "When you cast the $(thing)Spell$(0) ($(k:use)), you should see displayed in chat a long block of text that includes your username and coordinates. If so: congratulations! You've managed to write and cast your first $(thing)Spell$(0)!$(p)If you need to craft more $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l), re-open the radial menu and select a slot without a $(thing)Spell$(0) stored, then cast at $(item)Redstone Dust$(0) as you normally would.", "psi.book.page.tutorial2.4": "$(l)A sidenote: you should carry only one $(thing)CAD$(0) at a time.$()$(p)If more than one is carried, their channeled $(thing)Psi$(0) energies interfere, shorting out any $(thing)Spells$(0) cast. This phenomenon, known as \"cast jamming,\" is best avoided by simply keeping to one-$(thing)CAD$(0)-per-mage.$(p)Once you've successfully cast your Debug $(thing)Spell$(0), you can move on to $(l:basics/tutorial_3)the next tutorial$(/l).", "psi.book.entry.tutorial3": "Tutorial (3): Types & Numbers", "psi.book.page.tutorial3.0": "Open up your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) and take a look at your \"Debug\" $(thing)Spell$(0) again.$(p)Remember the \"Number\" parameter on $(piece)Trick: Debug$(0) that we saw in $(l:basics/tutorial_1)the first tutorial$(/l)? We mentioned previously that that parameter has an extra dot in the center, meaning it can be disabled. But this time, we $(o)won't$() disable it.", "psi.book.page.tutorial3.1": "The \"Number\" parameter of $(piece)Trick: Debug$(0), when used, is printed as a label of sorts, so that multiple copies of $(piece)Trick: Debug$(0) in a complex $(thing)Spell$(0) can be differentiated.$(p)The $(l)type$() of this parameter is \"Number,\" which means that the parameter will only accept arguments that output (or $(l)return$()) Numbers.$(p)The first parameter, \"Target,\" accepts the special type \"Any,\" which means it can accept anything.", "psi.book.page.tutorial3.2": "If you hold Shift and hover over a Spell Piece, it'll tell you the types of all its parameters, as well as its output's type. For example, we can see that the $(piece)Selector: Caster$(0) piece returns an Entity, which isn't a Number. So we'll need some other piece to represent one.", "psi.book.page.tutorial3.3": "Tooltip for $(piece)Selector: Caster$(0); it returns an Entity", "psi.book.page.tutorial3.4": "Choose an empty grid piece adjacent to $(piece)Trick: Debug$(0), and place the piece called $(piece)Constant: Number$(0).$(p)If you Shift-hover over this piece, you'll see that it $(o)does$() return a Number (actually, it returns a Number Constant, which is a Number but more specific).$(p)Therefore, if you left-click your $(piece)Trick: Debug$(0) again and point its Number parameter at the $(piece)Constant: Number$(0), your $(thing)Spell$(0) should compile.", "psi.book.page.tutorial3.5": "To run your new-and-improved Debug $(thing)Spell$(0), you might believe that you need to unload the bullet, re-copy the $(thing)Spell$(0), reload the bullet, and re-select the $(thing)Spell$(0).$(p)Luckily, your $(thing)CAD$(0) comes with a shortcut: simply select your Debug $(thing)Spell$(0) on your $(thing)CAD$(0) and crouch and swipe ($(k:use)) your $(thing)CAD$(0) over your $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l), and the $(thing)Spell$(0) stored in the corresponding bullet will update itself to the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l)'s version.", "psi.book.page.tutorial3.6": "If you cast your Debug $(thing)Spell$(0) now, you'll notice that you get the same long block of text as before, but with a bracketed zero in front: in fact, the same zero that was displayed in the $(piece)Constant: Number$(0) piece when you placed it.$(p)So the logical next question is: How do we display a number $(o)other$() than zero?", "psi.book.page.tutorial3.7": "Well, the $(piece)Constant: Number$(0) piece is special: to set its stored constant, all you have to do is select the piece and simply type a new number.$(p)All other $(thing)Spell Pieces$(0) are configured only from the left-hand parameter panel.$(p)$(o)Technical wayside: all Number Constants count as Numbers, but plain Numbers don't count as Number Constants. Only $(thing)Constant$(0) $(thing)Spell Pieces$(0) return Number Constants.$()", "psi.book.page.tutorial3.8": "Try editing the number stored in the $(piece)Constant: Number$(0), updating the $(thing)Spell$(0) stored in your $(thing)CAD$(0), and re-casting. You should see that the prefixed number has, in fact, changed! Neat!", "psi.book.page.tutorial3.9": "Now, here's the thing: we've hooked $(piece)Trick: Debug$(0) up to two different inputs at once.$(p)Truth be told, $(o)most$() $(thing)Spell Pieces$(0) take two (or even three) inputs. And when it comes right down to it, your $(thing)Spell$(0)'s inputs might end up adjacent to one another.$(p)That's where $(piece)Connectors$(0) come in.", "psi.book.page.tutorial3.10": "Connectors are simple pieces, yet powerful: They take one input, of any type, and return that same input. Thus, if a certain $(thing)Spell Piece$(0) requires as input another piece that's two grid-spaces away, you can connect them with a $(piece)Connector$(0).", "psi.book.page.tutorial3.11": "Bridge to Terabithia", "psi.book.page.tutorial3.12": "Of course, the true power of a $(piece)Connector$(0) is that they can connect to each $(o)other$(): so you can of course daisy-chain them together to connect $(thing)Spell Pieces$(0) from as far-away as you please.$(p)Play around with some $(piece)Connectors$(0), and as soon as you feel comfortable with them you can move on to $(l:basics/tutorial_4)the next tutorial$(/l)!", "psi.book.page.tutorial3.13": "The long way around", "psi.book.entry.tutorial4": "Tutorial (4): Move It", "psi.book.page.tutorial4.0": "Okay, okay. I know what you're thinking: \"This is boring. When do we start doing cool stuff?\" Well... now!$(p)Let's introduce a $(thing)Trick$(0) that actually interacts with the world-- introducing: $(piece)Trick: Add Motion$(0).$(p)This $(thing)Trick$(0) takes an entity, and adds motion to it (i.e. gives it a push) in a certain direction.", "psi.book.page.tutorial4.1": "Examples of entities include: you, the caster; a chicken; a zombie; a minecart; a falling sand block; an arrow; the Wither.$(p)This $(thing)Trick$(0) takes as parameters an Entity (which represents the entity to move), a Vector (the direction to push it in), and a Number Constant (how hard the $(thing)Trick$(0) should push the entity).$(p)$(o)Note: If you don't understand what the word \"vector\" means, $(l:basics/vector_primer)this entry$(/l) should serve as a good introduction.$()", "psi.book.page.tutorial4.2": "Let's write a $(thing)Spell$(0) that, when cast, simply boosts its caster forwards, using $(piece)Trick: Add Motion$(0).$(p)As mentioned before, $(piece)Selector: Caster$(0) returns an Entity (namely: you, the caster), so we can use that as the first parameter to $(piece)Trick: Add Motion$(0).$(p)We'd like the $(thing)Trick$(0) to boost you $(o)forward$()-- that is, $(o)in the direction you're looking$(). To do that, let's introduce our next piece: $(piece)Operator: Entity Look$(0).", "psi.book.page.tutorial4.3": "No $(thing)Operator$(0) pieces change the world around them in any way, nor do they pull information from it (with a few exceptions). Instead, they merely $(o)transform$() information into more useful forms.$(p)In particular, $(piece)Operator: Entity Look$(0) accepts an Entity, and returns a unit Vector: the direction the Entity is looking.$(p)Thus, one of these, hooked up to a $(piece)Selector: Caster$(0), will return a Vector that points wherever you're looking at.", "psi.book.page.tutorial4.4": "Finally, for the last parameter of $(piece)Trick: Add Motion$(0), a simple $(piece)Constant: Number$(0) will do.$(p)Let's put this $(thing)Spell$(0) all together: first, open up your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) and clear any $(thing)Spell$(0) currently on it. Then, place a $(piece)Trick: Add Motion$(0) near the middle of the grid.", "psi.book.page.tutorial4.5": "Place a $(piece)Selector: Caster$(0) directly above the $(thing)Trick$(0), an $(piece)Operator: Entity Look$(0) to its right, and a $(piece)Constant: Number$(0) to its left.$(p)Fill in the number 3 for the $(thing)Constant$(0) (you can tinker with this later).$(p)Place a $(piece)Connector$(0) between the $(thing)Operator$(0) and the $(thing)Selector$(0), and then set up all the parameters for the $(thing)Operator$(0) and $(thing)Trick$(0) so the $(thing)Spell$(0) compiles-- it should look something like the image on the next page.", "psi.book.page.tutorial4.6": "When push comes to shove", "psi.book.page.tutorial4.7": "Copy the $(thing)Spell$(0) into your $(thing)CAD$(0), look straight ahead, and cast. If you get thrown forward, then congratulations! You've just finished writing your first real $(thing)Spell$(0)!$(p)$(o)Note: Casting your new $(thing)Spell$(0) too many times in a row might be bad for your health. More on this in $(l:basics/tutorial_5)the next tutorial$(/l).$()", "psi.book.entry.tutorial5": "Tutorial (5): Limits", "psi.book.page.tutorial5.0": "Open your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) again, and review the $(thing)Spell$(0) you wrote in $(l:basics/tutorial_4)the last tutorial$(/l).$(p)When it compiled correctly, you should have seen five icons appear to the right of the grid, each with two numbers. These numerical stats define the practical limits on exactly what $(thing)Spells$(0) you're able to cast.", "psi.book.page.tutorial5.1": "The stats for your Add Motion $(thing)Spell$(0) (assuming your constant was 2)", "psi.book.subsec.tutorial5.2": "Complexity", "psi.book.page.tutorial5.2": "The first stat is $(thing)Complexity$(0), the total number of $(thing)Operators$(0), $(thing)Selectors$(0), and non-debug $(thing)Tricks$(0) in the $(thing)Spell$(0).$(p)Its maximum value is determined by the $(l:components/core)$(o)$(item)CAD Core$(0)$(/l) you have installed; if a $(thing)Spell$(0)'s $(thing)Complexity$(0) exceeds your $(thing)CAD$(0)'s capacity, it won't be castable.", "psi.book.subsec.tutorial5.3": "Potency", "psi.book.page.tutorial5.3": "The second is $(thing)Potency$(0), capped by your $(l:components/assembly)$(o)$(item)Assembly$(0)$(/l) component; the approximate total power draw of all $(thing)Tricks$(0) used in the $(thing)Spell$(0).$(p)Some $(thing)Tricks$(0) have a fixed $(thing)Potency$(0) cost per-use. However, most $(thing)Tricks$(0) that have a Number Constant-type parameter use it to determine their $(thing)Potency$(0); the higher the constant, the greater the $(thing)Potency$(0).", "psi.book.subsec.tutorial5.4": "Cost", "psi.book.page.tutorial5.4": "The third stat, $(thing)Cost$(0), is unique in that your $(thing)CAD$(0) sets no limits on it. Instead, each time a $(thing)Spell$(0) is cast, it consumes its $(thing)Cost$(0) from your own body's $(thing)Psi energy$(0).$(p)The first number shown is the $(o)ideal$() $(thing)Cost$(0) of the $(thing)Spell$(0)-- all $(l:components/assembly)$(o)$(item)CAD Assemblies$(0)$(/l) have flaws that increase it.", "psi.book.page.tutorial5.5": "The true $(thing)Cost$(0) of casting with your $(thing)CAD$(0) is the parenthesized number on the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) display, and the higher an $(l:components/assembly)$(o)$(item)Assembly$(0)$(/l)'s $(thing)Efficiency$(0), the closer to ideal the actual $(thing)Cost$(0) of casting from your $(thing)CAD$(0) becomes.", "psi.book.page.tutorial5.6": "Your $(thing)Psi energy$(0) regenerates at around 500 units per second, limiting the speed at which you can cast $(thing)Spells$(0).$(p)Your current level of $(thing)Psi energy$(0) can be accessed from within a $(thing)Spell$(0) with $(piece)Selector: Caster Energy$(0).", "psi.book.page.tutorial5.7": "Note that if you cast a $(thing)Spell$(0) without enough $(thing)Psi energy$(0) available (known as $(l)overdrawing$()), your $(thing)CAD$(0) will draw the excess cost from your own health, and promptly disable itself until your $(thing)Psi energy$(0) fully regenerates, for your own protection.$(p)A $(l:components/battery)$(o)$(item)Battery$(0)$(/l) added to a $(thing)CAD$(0) can guard against this.$(p)Be careful-- overdrawing has consequences that are painful, and maybe even lethal!", "psi.book.subsec.tutorial5.8": "Projection", "psi.book.page.tutorial5.8": "The fourth stat displayed on the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) is $(thing)Projection$(0): the total number of non-debug $(thing)Tricks$(0) in the $(thing)Spell$(0).$(p)Your $(thing)CAD$(0)'s $(l:components/core)$(o)$(item)Core$(0)$(/l) determines your maximum $(thing)Projection$(0) per-$(thing)Spell$(0); too many $(thing)Tricks$(0) and the $(thing)Spell$(0) is uncastable.", "psi.book.subsec.tutorial5.9": "Bandwidth", "psi.book.page.tutorial5.9": "And the fifth and final stat is $(thing)Bandwidth$(0), capped by your $(l:components/socket)$(o)$(item)CAD Socket$(0)$(/l): the width or height of the $(thing)Spell$(0), measured in grid spaces-- whichever is larger.$(p)This is, with a bit of ingenuity, one of the more interesting stats to work with; if your $(thing)Spell$(0) is too big, the technique of moving some pieces around and eliminating others to pack it into a smaller space is known as $(l)compression$().", "psi.book.page.tutorial5.10": "There's one final limitation on $(thing)Spells$(0): no $(thing)Trick$(0) can affect anything more than 32 blocks away from its $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) (for a plain $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l), that's just you, the caster), excepting the caster of the $(thing)Spell$(0) themself.$(p)A $(thing)Spell$(0) that attempts to do so will display an error in chat, then $(l)fizzle$().$(p)When a $(thing)Spell$(0) fizzles, it harmlessly disperses its stored $(thing)Psi energy$(0), and any remaining $(thing)Tricks$(0) it would otherwise execute don't happen.", "psi.book.page.tutorial5.11": "To clarify the earlier exception mentioned:$(br)Certain types of $(item)Spell Bullets$(0) have $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Points$(0)$(/l) that $(o)aren't$() their casters-- yet in these cases, their stored $(thing)Spells$(0) can still affect their casters through $(piece)Selector: Caster$(0), no matter how far away their $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Points$(0)$(/l) are.$(p)There's $(l:basics/tutorial_6)one final tutorial$(/l) lined up, putting most of what we've learned together, and then we'll cut you loose into the wider world of $(thing)Psi$(0). Good luck!", "psi.book.entry.tutorial6": "Tutorial (6): EXPLOSION", "psi.book.page.tutorial6.0": "Do you like explosions?$(p)Of course you do. Everyone loves explosions!$(p)So let's make a $(thing)Spell$(0) that blows up whatever you're looking at when you cast it.$(p)What could possibly go wrong?", "psi.book.page.tutorial6.1": "To write this $(thing)Spell$(0), let's start with the $(thing)Trick$(0) we'll use to cause an explosion, and work backwards.$(p)Conveniently, it's named $(piece)Trick: Explode$(0)-- so open up your $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l), clear out the grid, and place a $(piece)Trick: Explode$(0) near the middle.$(p)Shift-hovering over it reveals that it accepts a Vector and a Number Constant as parameters.", "psi.book.page.tutorial6.2": "The Number Constant parameter represents the explosion's power-- easy enough to fill with a $(piece)Constant: Number$(0) piece.$(p)The Vector, on the other hand, accepts the position vector of the location you want the explosion to go off at. This is what'll take a bit more effort to calculate.", "psi.book.page.tutorial6.3": "$(l:basics/tutorial_5)Last tutorial$(/l), we used $(piece)Operator: Entity Look$(0).$(p)However, that $(thing)Operator$(0) returns a unit vector, and $(piece)Trick: Explode$(0) needs a position, so feeding that piece directly into the $(thing)Trick$(0) would probably not produce the results we want.$(p)So let's introduce another $(thing)Operator$(0): namely, $(piece)Operator: Entity Position$(0).", "psi.book.page.tutorial6.4": "$(piece)Operator: Entity Position$(0) accepts an Entity (like the caster of the $(thing)Spell$(0)), and returns that entity's position (to be more precise: for a player like you, it returns your position at eye-level).$(p)However, we don't want to pass this directly into $(piece)Trick: Explode$(0), either-- because it would literally explode in your face when cast.", "psi.book.page.tutorial6.5": "What we $(o)could$() do here is simply scale up the vector we got from $(piece)Operator: Entity Look$(0) by a factor of, say, 10, and then add this to $(piece)Operator: Entity Position$(0)'s output.$(p)When fed into $(piece)Trick: Explode$(0), this would create a $(thing)Spell$(0) that, when cast, would create an explosion $(o)exactly ten blocks away from you, in the direction you're looking$().", "psi.book.page.tutorial6.6": "But the limitations of this $(thing)Spell$(0) seem obvious: if you want to blow something up that's closer or further than ten blocks away, you'll have to do some awkward moving-around and guesstimating of distances.$(p)Not very practical, all things considered.$(p)Instead, let's use a smarter operator: $(piece)Operator: Vector Raycast$(0).", "psi.book.page.tutorial6.7": "This $(thing)Operator$(0)'s function is intuitively simple; it accepts a position vector and a \"ray\" vector (which is just a vector to represent direction).$(p)Its return value pretty much represents \"if I stood there and looked in that direction, what position would I be looking at?\", which makes it perfect for our purposes.$(p)For more details, including what the \"Max\" argument does, read the page about $(piece)Operator: Vector Raycast$(0).", "psi.book.page.tutorial6.8": "So! To build this $(thing)Spell$(0), let's work backwards.$(p)If you haven't done so already, place a $(piece)Constant: Number$(0) near the $(piece)Trick: Explode$(0) (if you're still using the $(thing)CAD$(0) you built in $(l:basics/tutorial_1)the first tutorial$(/l), 1.4 would be a good number to set it to).$(p)Then, place a $(piece)Operator: Vector Raycast$(0) next to the $(thing)Trick$(0) as well, and hook the $(thing)Trick$(0) up to the other two $(thing)Spell Pieces$(0).", "psi.book.page.tutorial6.9": "Next, place an $(piece)Operator: Entity Position$(0) and an $(piece)Operator: Entity Look$(0), then connect your $(piece)Operator: Vector Raycast$(0) to the two.$(p)Make sure to hook \"Position\" up to Entity Position and \"Ray\" up to Entity Look, and not the other way around, or else you'll get some odd results/errors when you cast the $(thing)Spell$(0).$(p)Finally, place a $(piece)Selector: Caster$(0), and hook this up to the two Entity $(thing)Operators$(0).", "psi.book.page.tutorial6.10": "Something along these lines", "psi.book.page.tutorial6.11": "Once your $(thing)Spell$(0) compiles successfully, load it into your $(thing)CAD$(0), take careful aim at something (preferably something you don't care much about), and cast.$(p)If that thing you're looking at explodes, take a moment to savor your newfound power.$(p)Just, er, try not to cast it at your own two feet.", "psi.book.page.tutorial6.12": "One final note: Try casting your new \"Explode\" $(thing)Spell$(0) at something that's more than 32 blocks away (or at nothing, like the sky).$(p)You should see no explosion, and an error should pop up in chat, telling you \"$(c)Spell Target is outside maximum 32 block radius.$(0)\" (this limit was discussed last tutorial).$(p)These sorts of errors popping up in chat can get rather annoying.", "psi.book.page.tutorial6.13": "To fix this, simply place an $(piece)Error Suppressor$(0) piece anywhere on the grid, and the resulting $(thing)Spell$(0) will instead fail silently, when cast.$(p)You might want to remove the piece when debugging, though. Errors $(o)can$() be useful sometimes.", "psi.book.page.tutorial6.14": "This concludes this set of tutorials!$(p)Have a read through the rest of this book for an idea of exactly what you can do with this mod. Experienced mages can do terrifying things, after all.$(p)It's up to you to experiment with your $(thing)CAD$(0) and $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l), and to create your own unique $(thing)Spells$(0).$(p)Good luck, and welcome to the wide world of $(thing)Psi$(0)!", "psi.book.entry.evalOrder": "Evaluation Order", "psi.book.page.evalOrder.0": "Nearly all $(thing)Tricks$(0) execute simultaneously with the $(thing)Spell$(0) containing them. Nonetheless, to use $(piece)flow control tricks$(0), you'll need a basic knowledge of evaluation order; that is, the order that $(thing)Spell Pieces$(0) get evaluated in.", "psi.book.page.evalOrder.1": "There are three basic rules to evaluation order; they're explained in more detail in the following pages, but a brief summary follows:$(li)When a $(thing)Spell$(0) is executed, its $(thing)Tricks$(0) are each evaluated (and then executed) left-to-right, then top-to-bottom;$(li)Any $(thing)Spell Piece$(0) being evaluated will evaluate all of its inputs first;$(li)A $(thing)Spell Piece$(0) is evaluated at most once per $(thing)Spell$(0) execution, when its value is first required.", "psi.book.page.evalOrder.2": "The first rule should be rather self-explanatory: a $(thing)Trick$(0) placed higher on the grid is executed earlier than a $(thing)Trick$(0) placed lower, and when two or more $(thing)Tricks$(0) are in the same row, the leftmost one executes first.$(p)Thus, the $(thing)Spell$(0) shown on the next page should display \"1.0\", \"2.0\", \"3.0\", and \"4.0\" in chat, in that exact order.", "psi.book.page.evalOrder.3": "Make it count", "psi.book.page.evalOrder.4": "The second rule is just as simple; a $(thing)Spell Piece$(0) is only evaluated when its value is required.$(p)However, notably, the converse is $(o)also$() true-- namely: if a $(thing)Spell Piece$(0) $(o)isn't$() required for a $(thing)Trick$(0), directly or indirectly, it's never evaluated when the $(thing)Spell$(0) executes.$(p)Any $(thing)Spell Piece$(0) that isn't connected to a $(thing)Trick$(0) causes $(l)undefined behavior$()-- no guarantees on $(thing)Spell$(0) behavior in those cases.", "psi.book.page.evalOrder.5": "Not suggested", "psi.book.page.evalOrder.6": "The third and final rule is a bit more subtle, and is best illustrated in the $(thing)Spell$(0) on the next page:$(p)A $(thing)Spell Piece$(0) only evaluates once, and returns $(o)the exact same value$() for subsequent evaluations. Therefore, the four copies of $(piece)Trick: Debug$(0) displayed will all output the $(o)same$() number, since the $(piece)Operator: Random$(0) only gets evaluated once.$(p)$(piece)Trick: Evaluate$(0) can be used to evaluate a $(thing)Spell Piece$(0) \"early.\"", "psi.book.page.evalOrder.7": "First-come first-serve", "psi.book.category.components": "Materials & Components", "psi.book.category.components.desc": "This section of the book details all the new raw materials $(thing)Psi$(0) adds to the game, as well as all the components you need to construct a proper $(thing)CAD$(0).", "psi.book.entry.psidust": "Psidust", "psi.book.page.psidust.0": "$(item)Psidust$(0) is a material transmuted from $(item)Redstone Dust$(0) by an unfocused burst of $(thing)Psi energy$(0), and is, as such, a good conductor of said energies.$(p)Therefore, it's a critical component in low-tier $(s$(0), since it's used in simple $(l:components/core#basic)$(item)CAD Cores$(0)$(/l), $(l:components/socket#basic)$(item)Sockets$(0)$(/l), and $(l:components/battery#basic)$(item)Batteries$(0)$(/l), as well as all $(l:components/colorizer)$(o)$(item)CAD Colorizers$(0)$(/l).$(p)It's also used in $(item)Spell Bullets$(0).", "psi.book.page.psidust.1": "To create $(item)Psidust$(0), first throw some $(item)Redstone Dust$(0) on the ground. Then stand nearby and cast ($(k:use)) with a $(thing)CAD$(0) $(l)that has no $(thing)Spell$(0) selected$() to convert the redstone into $(item)Psidust$(0).$(p)$(item)Psidust$(0) can also be created with any of the $(piece)infusion tricks$(0).", "psi.book.entry.psimetal": "Psimetal", "psi.book.page.psimetal.0": "$(item)Psimetal$(0) is a material transmuted from $(item)Gold Ingots$(0) that conducts, stores, and transfers $(thing)Psi energy$(0) $(o)much$() better than $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l) does.$(p)In addition to being a component in more powerful $(l:components/core)$(o)$(item)CAD Cores$(0)$(/l), $(l:components/socket)$(o)$(item)Sockets$(0)$(/l), and $(l:components/battery#extended)$(item)Batteries$(0)$(/l), it can be fashioned into a superior $(l:components/assembly#psimetal)$(item)CAD Assembly$(0)$(/l). It's also used to craft $(l:items/tools)$(o)$(thing)Psimetal Tools$(0)$(/l) and $(l:items/exosuit)$(o)$(thing)Armor$(0)$(/l), as well as $(l:components/ebony_ivory)$(o)$(item)Ebony & Ivory Ingots$(0)$(/l).", "psi.book.page.psimetal.1": "To create $(item)Psimetal$(0), first drop $(item)Gold Ingots$(0) on the ground.$(p)Then, stand nearby, and cast a $(thing)Spell$(0) with $(piece)Trick: Infusion$(0) (or any other $(piece)infusion trick$(0)) as one of its $(thing)Tricks$(0) to convert the gold into $(item)Psimetal$(0).", "psi.book.entry.psigem": "Psigem", "psi.book.page.psigem.0": "$(item)Psigems$(0) are crystals transmuted from $(item)Diamonds$(0) whose refractive properties make them extraordinarily good at conducting, transferring, and storing $(thing)Psi energy$(0).$(p)These are used to fashion top-of-the-line $(l:components/core)$(o)$(item)CAD Cores$(0)$(/l), $(l:components/socket)$(o)$(item)Sockets$(0)$(/l), and $(l:components/battery#ultradense)$(item)Batteries$(0)$(/l), and as essential components in $(l:items/tools)$(o)$(thing)Psimetal Tools$(0)$(/l) and $(l:items/exosuit)$(o)$(thing)Armor$(0)$(/l).", "psi.book.page.psigem.1": "To create a $(item)Psigem$(0), first throw a $(item)Diamond$(0) on the ground.$(p)Then, stand nearby, and cast a $(thing)Spell$(0) with $(piece)Trick: Greater Infusion$(0) (or $(piece)Trick: Ebony & Ivory$(0)) as one of its tricks to convert the $(item)Diamond$(0) into a $(item)Psigem$(0).", "psi.book.entry.ebonyIvory": "Ebony & Ivory", "psi.book.page.ebonyIvory.0": "The $(thing)End$(0) is much closer to a dimension of the mind than the $(thing)Overworld$(0). Therefore, its essences are much more conductive to $(thing)Psi energy$(0), which derives from the mind as well.$(p)$(piece)Trick: Ebony & Ivory$(0) can be used to capture these essences in $(item)Coal$(0) and $(item)Nether Quartz$(0), transmuting them into $(item)Ebony Substance$(0) and $(item)Ivory Substance$(0), respectively.", "psi.book.page.ebonyIvory.1": "Unfortunately, as it turns out, neither $(item)Ebony$(0) nor $(item)Ivory Substance$(0) plays nicely with $(thing)Overworld$(0)-y materials.$(p)This means that fashioning them into $(l:components/core)$(o)$(item)CAD Cores$(0)$(/l), $(l:components/socket)$(o)$(item)Sockets$(0)$(/l), and $(l:components/battery)$(o)$(item)Batteries$(0)$(/l) proves rather difficult.$(p)We $(o)can$(), however, coat $(l:components/psimetal)$(o)$(item)Psimetal Ingots$(0)$(/l) with the stuff, yielding $(item)Ebony$(0) and $(item)Ivory Psimetal Ingots$(0), respectively, which are just about stable enough to be shaped into $(l:components/assembly)$(o)$(item)CAD Assemblies$(0)$(/l).", "psi.book.page.ebonyIvory.2": "To create $(item)Ebony Substance$(0), first travel to the $(thing)End$(0), and drop $(item)Coal$(0) on the ground there.$(p)Then, stand nearby, and cast a $(thing)Spell$(0) with $(piece)Trick: Ebony & Ivory$(0) as one of its $(thing)Tricks$(0) to convert the $(item)Coal$(0) into $(item)Ebony Substance$(0).", "psi.book.page.ebonyIvory.3": "To create $(item)Ivory Substance$(0), first travel to the $(thing)End$(0), and drop $(item)Nether Quartz$(0) on the ground there.$(p)Then, stand nearby, and cast a $(thing)Spell$(0) with $(piece)Trick: Ebony & Ivory$(0) as one of its $(thing)Tricks$(0) to convert the $(item)Nether Quartz$(0) into $(item)Ivory Substance$(0).", "psi.book.page.ebonyIvory.4": "Dark'ness Dementia Raven Way", "psi.book.page.ebonyIvory.5": "No elephants were harmed in its creation", "psi.book.entry.assembly": "Assemblies", "psi.book.page.assembly.0": "The $(item)CAD Assembly$(0) is simple in structure, yet the single most important component of a $(thing)CAD$(0).$(p)An $(item)Assembly$(0) is responsible for channeling its user's $(thing)Psi energy$(0)-- it's simply a conveniently-shaped conduit for the task.$(p)All $(thing)Psi$(0) $(thing)CADs$(0) are crafted from four ingots of their component material in a crafting grid, shaped in a sideways L.$(p)", "psi.book.page.assembly.1": "The $(item)Assembly$(0) is the only $(thing)CAD$(0) component that's strictly necessary in an $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l)-- indeed, any $(thing)CAD$(0) consisting of just an $(item)Assembly$(0) can be reverted to one in a crafting grid.$(p)Every $(item)Assembly$(0) has a $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l): roughly, the maximum rate it can channel $(thing)Psi energy$(0) at.$(p)It also has an $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l), which is the percent of its user's $(thing)Psi energy$(0) that it can actually $(o)use$() in a $(thing)Spell$(0)-- a higher $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l) is better.", "psi.book.page.assembly.2": "The humble $(item)Iron CAD Assembly$(0) has the lowest $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l) and $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l) of any $(item)Assembly$(0) in this book.$(p)But it's relatively cheap, and crafts $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l) as well any other $(thing)CAD$(0), so it's the go-to $(item)Assembly$(0) for beginners.", "psi.book.page.assembly.3": "Sleek and simple", "psi.book.page.assembly.4": "The $(item)Gold CAD Assembly$(0) boasts a higher $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l) as well as a higher $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l) than its iron counterpart-- in fact, it's the best $(item)Assembly$(0) in the book that's made from mundane materials.", "psi.book.page.assembly.5": "A bit heavy to carry around, though", "psi.book.page.assembly.6": "The $(item)Psimetal CAD Assembly$(0) has a higher $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l) than an $(l:components/assembly#iron)$(item)Iron Assembly$(0)$(/l) as well as a higher $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l) than a $(l:components/assembly#gold)$(item)Gold Assembly$(0)$(/l), making it versatile indeed.$(p)Both $(piece)Trick: Greater Infusion$(0) and $(piece)Trick: Ebony & Ivory$(0) require a $(thing)CAD$(0) with an $(item)Assembly$(0) of this caliber or higher to cast.", "psi.book.page.assembly.7": "Best of both worlds", "psi.book.page.assembly.8": "The $(item)Ebony Psimetal CAD Assembly$(0) is a top-tier type of $(item)Assembly.$(0)$(p)It's slightly less efficient, but can handle more $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l), than its $(item)Ivory$(0) counterpart.", "psi.book.page.assembly.9": "The big guns (so to speak)", "psi.book.page.assembly.10": "The $(item)Ivory Psimetal CAD Assembly$(0) is a top-tier type of $(item)Assembly.$(0)$(p)It's slightly less potent, but has a greater $(l:basics/tutorial_5#cost)$(o)$(thing)Efficiency$(0)$(/l), than its $(item)Ebony$(0) counterpart.", "psi.book.page.assembly.11": "Go with the flow", "psi.book.entry.core": "Cores", "psi.book.page.core.0": "A $(thing)CAD$(0)'s $(item)Core$(0) is essentially its CPU-- it's responsible for reading a $(thing)Spell$(0) from the $(l:components/socket)$(o)$(item)Socket$(0)$(/l), running calculations, and using $(thing)Psi energy$(0) to create the effects of $(thing)Tricks$(0) in the world.$(p)$(item)CAD Cores$(0) are crafted with four of a $(thing)Psi$(0)-conductive material placed around a central piece of dust (as a processor).", "psi.book.page.core.1": "Every $(item)CAD Core$(0) has a $(l:basics/tutorial_5#complexity)$(o)$(thing)Complexity$(0)$(/l) value, which is the maximum number of computations ($(thing)Selectors$(0), $(thing)Operators$(0), non-debug $(thing)Tricks$(0)) the $(item)Core$(0) can perform per-$(thing)Spell$(0).$(p)A $(item)Core$(0) also has a $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l), which is simply the total number of non-debug $(thing)Tricks$(0) it can perform at once.", "psi.book.page.core.2": "Crafted from an $(item)Iron$(0) shell around a piece of $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l), the $(item)Basic CAD Core$(0) is often the first $(item)CAD Core$(0) a mage crafts.$(p)It's not fantastic (in particular, it can only cast one $(thing)Trick$(0) at a time), but it's quite sufficient for a beginner's needs.", "psi.book.page.core.3": "Spell it out", "psi.book.page.core.4": "Substituting $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l) for $(item)Iron$(0) around a $(item)CAD Core$(0) allows us to use a different dust component in the $(item)Core$(0)'s center.$(p)If $(item)Redstone Dust$(0) is used for the dust, we get a $(item)Overclocked CAD Core$(0), which boasts twice the $(l:basics/tutorial_5#complexity)$(o)$(thing)Complexity$(0)$(/l) of its $(l:components/core#basic)$(item)Basic$(0)$(/l) predecessor, and thrice the $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l).", "psi.book.page.core.5": "A hat trick", "psi.book.page.core.6": "If, instead, we place a piece of $(item)Glowstone Dust$(0) within a $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l) shell, we create a $(item)Conductive CAD Core$(0).$(p)This $(item)Core$(0) handles less $(l:basics/tutorial_5#complexity)$(o)$(thing)Complexity$(0)$(/l) than its $(item)Redstone Dust$(0)-based counterpart, but can handle four $(thing)Tricks$(0) at once, over the $(l:components/core#overclocked)$(item)Overclocked$(0)$(/l)'s three.", "psi.book.page.core.7": "Some real tricky business", "psi.book.page.core.8": "Embedding two $(l:components/psigem)$(o)$(item)Psigems$(0)$(/l) into the recipe for a $(item)CAD Core$(0) creates $(o)serious$() performance benefits.$(p)The $(item)Hyperclocked CAD Core$(0), with $(item)Redstone Dust$(0) at its center, has double the $(l:basics/tutorial_5#complexity)$(o)$(thing)Complexity$(0)$(/l) of a $(l:components/core#conductive)$(item)Conductive$(0)$(/l) core $(o)and$() double the $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l) of an $(l:components/core#overclocked)$(item)Overclocked$(0)$(/l) one.", "psi.book.page.core.9": "Won't tell the time, though", "psi.book.page.core.10": "If we use $(l:components/psigem)$(o)$(item)Psigems$(0)$(/l) in a $(item)CAD Core$(0) with $(item)Glowstone Dust$(0) at its center, we get a $(item)Radiative CAD Core$(0).$(p)This $(item)Core$(0) has a lesser $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l) than the $(l:components/core#hyperclocked)$(item)Hyperclocked$(0)$(/l) one, but has the capability to execute a staggering $(o)seven$() $(thing)Tricks$(0) per-cast.", "psi.book.page.core.11": "No technetium involved", "psi.book.entry.socket": "Sockets", "psi.book.page.socket.0": "A $(thing)CAD$(0)'s $(item)Socket$(0) is basically its bullet clip.$(p)It's what $(item)Spell Bullets$(0) are loaded into, and it's responsible for transferring the compiled $(thing)Spells$(0) contained within the $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) to the $(l:components/core)$(o)$(item)Core$(0)$(/l) for processing.$(p)$(item)Sockets$(0) are crafted with a piece of dust, which interfaces with the $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l), on a metallic substrate.", "psi.book.page.socket.1": "A $(item)Socket$(0) has a $(l:basics/tutorial_5#bandwidth)$(o)$(thing)Bandwidth$(0)$(/l), which is the maximum size (in grid spaces) of a $(thing)Spell$(0) that it can transfer to a $(l:components/core)$(o)$(item)Core$(0)$(/l), all at once-- for example, a $(item)Socket$(0) with bandwidth 5 could transfer a $(thing)Spell$(0) up to 5x5 in dimension.$(p)It also has, well, a number of $(item)Sockets$(0), which are compartments that can hold one $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) each.", "psi.book.page.socket.2": "The $(item)Basic CAD Socket$(0) is the simplest of $(item)Sockets$(0), crafted from $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l) on a substrate of $(item)Iron$(0).$(p)It holds up to four $(item)Spell Bullets$(0) at a time, and can transfer $(thing)Spells$(0) up to 5x5 in size.", "psi.book.page.socket.3": "Plug & chug", "psi.book.page.socket.4": "Replacing the $(item)Iron$(0) substrate in a $(item)Socket$(0) with a metal that's more conductive to $(thing)Psi energy$(0) (i.e. $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l)) allows us to choose a different dust to interface with the $(item)Spell Bullets$(0).$(p)Using $(item)Redstone Dust$(0) gets us a $(item)Signaling CAD Socket$(0), which holds up to six $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l), each with a $(thing)Spell$(0) up to 7x7 in size.", "psi.book.page.socket.5": "Do ya feel lucky, punk?", "psi.book.page.socket.6": "Placing $(item)Glowstone Dust$(0) on a $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l) substrate creates a $(item)Large CAD Socket$(0).$(p)This $(item)Socket$(0) can't handle $(thing)Spells$(0) as large as its $(l:components/socket#signaling)$(item)Signaling$(0)$(/l) counterpart can, only managing those up to 6x6 in size, but can hold up to eight $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) at a time.", "psi.book.page.socket.7": "Practically endless", "psi.book.page.socket.8": "Augmenting a $(item)Socket$(0) in its recipe with a $(l:components/psigem)$(o)$(item)Psigem$(0)$(/l) makes it transfer a lot more data, a lot faster.$(p)A $(l:components/socket#signaling)$(item)Signaling CAD Socket$(0)$(/l) with such an augmentation becomes a $(item)Transmissive CAD Socket$(0), which can hold up to ten $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l), and can in fact handle $(o)any$() $(thing)Spell$(0) that fits in a $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l).", "psi.book.page.socket.9": "Avaritia's Bane", "psi.book.page.socket.10": "A $(l:components/socket#large)$(item)Large CAD Socket$(0)$(/l), augmented with a $(l:components/psigem)$(o)$(item)Psigem$(0)$(/l), becomes the imaginatively-named $(item)Huge CAD Socket$(0).$(p)One of these doesn't have the $(l:basics/tutorial_5#bandwidth)$(o)$(thing)Bandwidth$(0)$(/l) of its $(l:components/socket#transmissive)$(item)Transmissive$(0)$(/l) counterpart (only $(thing)Spells$(0) that are 8x8 or smaller), but can store up to a full dozen $(item)Spell Bullets$(0).", "psi.book.page.socket.11": "Hope Ophiuchus doesn't mind", "psi.book.entry.battery": "Batteries", "psi.book.page.battery.0": "A $(item)CAD Battery$(0) is an optional attachment to a $(thing)CAD$(0), allowing it to indefinitely store a small amount of its user's $(thing)Psi energy$(0)-- its $(thing)Overflow$(0) represents how much.$(p)A $(item)Battery$(0) discharges after its user's main supply of $(thing)Psi energy$(0) runs out, but before the $(thing)CAD$(0) taps into its user's health.", "psi.book.page.battery.1": "In effect, a $(item)Battery$(0) is meant to be a small safety net of stored $(thing)Psi energy$(0).$(p)It's there so that you can overdraw a $(o)bit$(), without taking damage or having to wait for your $(thing)Psi energy$(0) to refill.$(p)All $(item)Batteries$(0) are crafted with a $(thing)Psi energy$(0)-conductive material enclosed between an $(item)Iron$(0) and a $(item)Gold Ingot$(0).$(p)A $(item)Battery$(0)'s current charge can be accessed from a $(thing)Spell$(0) with $(piece)Selector: Caster Battery$(0).", "psi.book.page.battery.2": "Not lithium-ion", "psi.book.page.battery.3": "It's pretty metal", "psi.book.page.battery.4": "Call 1-(800)-BATTERY", "psi.book.entry.colorizer": "Colorizers", "psi.book.page.colorizer.0": "A $(item)CAD Colorizer$(0) is an optional attachment to a $(thing)CAD$(0) that modifies the color of its user's $(thing)Psi energy$(0) as it manifests in the physical world.$(p)All $(item)Colorizers$(0) are crafted with a base of an $(item)Iron Ingot$(0), a piece of $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l) on top, two pieces of $(item)Glass$(0) (one on either side), and of course a color item to apply in the center. ", "psi.book.page.colorizer.1": "A $(item)Colorizer$(0) can be crafted with any of the sixteen vanilla $(item)Dyes$(0) for their respective colors.$(p)If $(item)Prismarine Crystals$(0) are used in place of a dye, the resulting $(item)Colorizer$(0) will shift through the colors of the rainbow.$(p)If, on the other hand, $(o)no$() color item is used, the resulting $(item)Colorizer$(0) will $(o)draw$() color $(o)out$() of the user's $(thing)Psi energy$(0), and the resulting particles will be nigh-invisible.", "psi.book.page.colorizer.2": "Using a piece of $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l) as the color item in the $(item)Colorizer$(0) seems to have no known effect for most people, though $(l:https://www.patreon.com/Vazkii)certain individuals have reported differently$(/l).$(p)A $(item)Colorizer$(0) in a $(thing)CAD$(0) affects:$(li)particles emitted by the $(thing)CAD$(0);$(li)projectiles and $(l:items/circle_bullet)$(o)$(thing)Spell Circles$(0)$(/l) cast;$(li)blocks and lights conjured by the $(piece)conjuration tricks$(0).", "psi.book.page.colorizer.3": "Taste the Rainbow", "psi.book.category.items": "Items", "psi.book.category.items.desc": "This section is filled to the brim with all sorts of items, tools, and utilities you can use to enhance your $(thing)Spell$(0)-casting experience.", "psi.book.entry.spellBullet": "Spell Bullet Types", "psi.book.page.spellBullet.0": "A $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) is a simple device-- when inserted into a $(thing)CAD$(0)'s $(l:components/socket)$(o)$(item)Socket$(0)$(/l), it simply provides its contained $(thing)Spell$(0)'s data (and metadata) to the $(thing)CAD$(0).$(p)But $(thing)Bullets$(0) come in several types, each with their own merits.$(p)Each entry linked on the next page has more detailed information on that type of $(thing)Bullet$(0).", "psi.book.page.spellBullet.1": "If you want a specific type of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l), here you go.", "psi.book.page.spellBullet.2": "Every type of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) is crafted with an $(item)Iron Ingot$(0) and a piece of $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l), horizontally placed in a crafting grid.$(p)If nothing else is added to the recipe, this yields the most basic type of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l), (somewhat confusingly) just called the $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l).$(p)Other types of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) require one more ingredient, placed horizontally adjacent to the $(item)Iron Ingot$(0).", "psi.book.page.spellBullet.3": "The ingredients for other types of $(item)Spell Bullets$(0) are as follows:$(li)a $(l:items/projectile_bullet)$(o)$(item)Projectile Spell Bullet$(0)$(/l) needs some kind of $(item)Arrow$(0),$(li)a $(l:items/loopcast_bullet)$(o)$(item)Loopcast Spell Bullet$(0)$(/l) needs a piece of $(item)String$(0),$(li)a $(l:items/circle_bullet)$(o)$(item)Circle Spell Bullet$(0)$(/l) needs, well, something circular (a $(item)Snowball$(0) or a $(item)Slimeball$(0)),$(li)a $(l:items/grenade_bullet)$(o)$(item)Grenade Spell Bullet$(0)$(/l) needs a piece of $(item)Gunpowder$(0),$(li)a $(l:items/charge_bullet)$(o)$(item)Charge Spell Bullet$(0)$(/l) needs a piece of $(item)Redstone Dust$(0), and$(li)a $(l:items/mine_bullet)$(o)$(item)Mine Spell Bullet$(0)$(/l) needs some kind of $(item)Button$(0).", "psi.book.page.spellBullet.4": "Before a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) can be loaded into a $(thing)CAD$(0), it needs to have a $(thing)Spell$(0) stored on it.$(p)To store a $(thing)Spell$(0) on a $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) in a $(thing)Bullet$(0), just swipe the $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) over the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) ($(k:use)).$(p)A $(thing)Spell$(0) stored in a $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) can be copied into an empty $(l:items/spell_drive)$(o)$(item)Spell Drive$(0)$(/l) in a crafting grid for storage purposes.", "psi.book.page.spellBullet.5": "A $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) displays a $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) for any $(thing)Spell$(0) it compiles successfully-- yet for different types of $(thing)Bullets$(0), this $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) can be different.$(p)The $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l)'s value is calibrated to the most basic type of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l), (somewhat confusingly) just called the $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l).", "psi.book.page.spellBullet.6": "All other types of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) display a $(thing)Cost Multiplier$(0) in percentage, which can simply be multiplied by the cost displayed on the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l) to determine the $(thing)Spell$(0)'s true $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) for that $(thing)Bullet$(0) type.$(p)For example, if a $(thing)Spell$(0) displays a final cost of 300 in a $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l), when copied into a $(l:items/projectile_bullet)$(o)$(item)Projectile Spell Bullet$(0)$(/l) (with a $(thing)Cost Multiplier$(0) of 102%%) it would have a true $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) of$(br)300 \u00d7 102%% = 306 $(thing)Psi energy$(0) per cast.", "psi.book.page.spellBullet.7": "Many $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) types introduce a delay between when the $(thing)Spell$(0) is cast, and when it actually gets executed.$(p)Thus, it's important to note that the $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) of a $(thing)Spell$(0) being cast is paid upfront in full, and is non-refundable-- even if the $(thing)Tricks$(0) in the $(thing)Spell$(0) don't actually get cast.", "psi.book.page.spellBullet.8": "Every $(thing)Spell$(0), when cast, has a $(thing)Focal Point$(0).$(p)A $(thing)Focal Point$(0) is where the caster's $(thing)Psi energy$(0) is projected into the world (as one or more $(thing)Tricks$(0)).$(p)Of course, a $(thing)Focal Point$(0) can't execute any $(thing)Tricks$(0) or evaluate any $(thing)Selectors$(0) from further than 32 blocks away (excepting those that affect its caster).$(p)A $(thing)Spell$(0) can access its $(thing)Focal Point$(0) using $(piece)Selector: Focal Point$(0).", "psi.book.page.spellBullet.9": "The location of a $(thing)Focal Point$(0) depends on the type of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) it's cast from.$(p)The basic $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l)'s $(thing)Focal Point$(0) is simply the caster of the $(thing)Spell$(0), but other types of $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) can create different $(thing)Focal Points$(0).$(p)For example, a $(l:items/projectile_bullet)$(o)$(item)Projectile Spell Bullet$(0)$(/l)'s $(thing)Focal Point$(0) is the projectile itself.$(p)For more info on each $(thing)Bullet$(0) type's $(thing)Focal Points$(0) and quirks, consult individual entries.", "psi.book.entry.basicBullet": "Spell Bullet", "psi.book.page.basicBullet.0": "The simplest type of $(item)Spell Bullet$(0) (and the namesake of the line of items), the humble $(item)Spell Bullet$(0) stores a $(thing)Spell$(0) that's ready for execution.$(p)When loaded into a $(thing)CAD$(0) by way of a $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l), it allows the $(thing)CAD$(0) to cast the $(thing)Spell$(0) stored within.", "psi.book.page.basicBullet.1": "Selecting the $(item)Spell Bullet$(0) from the $(thing)CAD$(0) and pressing $(k:use) will immediately execute the $(thing)Spell$(0) stored within. The $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) for this type of $(l:items/spell_bullet)$(o)$(thing)Bullet$(0)$(/l) is just the caster.$(p)Other, more advanced $(item)Spell Bullets$(0) can do interesting things, though! Check out $(l:items/spell_bullet)the list$(/l) for more info.", "psi.book.page.basicBullet.2": "No gunpowder necessary", "psi.book.entry.projectileBullet": "Projectile Spell Bullet", "psi.book.page.projectileBullet.0": "A $(thing)Spell$(0) cast from a $(item)Projectile Spell Bullet$(0) doesn't execute immediately.$(p)Instead, a fast-moving $(thing)Spell Projectile$(0) containing it is fired out the end of the $(thing)CAD$(0) from which it's cast.$(p)This projectile acts as the $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) for its $(thing)Spell$(0), executing it when the projectile collides with something.", "psi.book.page.projectileBullet.1": "Not quite high noon", "psi.book.page.projectileBullet.2": "A $(thing)Spell Projectile$(0) isn't physical; instead, it's a thin wrapper of $(thing)Psi energy$(0) around its contained $(thing)Spell$(0) (hence the extra cost in the $(l:items/spell_bullet)$(o)$(thing)Bullet$(0)$(/l)).$(p)As such, it can last for up to thirty seconds before dissipating.$(p)A $(thing)Spell Projectile$(0) moves quite swiftly, and can travel more than 200 blocks' distance without assistance in its lifespan.", "psi.book.page.projectileBullet.3": "The projectile's stored $(thing)Spell$(0) will activate if it collides with any blocks or entities.$(p)In the case of the latter, $(piece)Selector: Attack Target$(0) can be used to identify the entity that was hit.$(p)On the other hand, if the projectile hits $(o)nothing$() in that time, the $(thing)Spell$(0) will fizzle, wasting the $(thing)Psi energy$(0) invested into it-- so aim carefully!", "psi.book.entry.loopcastBullet": "Loopcast Spell Bullet", "psi.book.page.loopcastBullet.0": "A $(thing)Spell$(0) cast from a $(item)Loopcast Spell Bullet$(0) is executed as if from a plain $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l).$(p)Repeatedly.$(p)A $(thing)Spell$(0) cast from one of these $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) is executed over and over nonstop, four times a second, until the $(thing)CAD$(0) it was cast from stops being held in the same hand, or a different $(thing)Spell$(0) is selected.", "psi.book.page.loopcastBullet.1": "The definition of insanity", "psi.book.page.loopcastBullet.2": "The $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) for a $(thing)Spell$(0) cast from a $(item)Loopcast Spell Bullet$(0) is just the caster, and the full $(thing)Psi energy$(0) cost is incurred on each execution.$(p)The major advantage of using one of these $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) over just casting repeatedly really fast lies in the $(o)regeneration$() of your $(thing)Psi energy$(0).", "psi.book.page.loopcastBullet.3": "When you cast a $(thing)Spell$(0) (or when you take damage), your $(thing)Psi energy$(0) is momentarily left in a state of disequilibrium; it can't regenerate until you can focus inward and restabilize it.$(br)While not difficult, this restabilization takes a bit of time to achieve.$(p)But when you cast from a $(item)Loopcast Spell Bullet$(0), this delay only occurs $(o)initially$()-- afterwards, the $(l:items/spell_bullet)$(o)$(thing)Bullet$(0)$(/l) makes no disruptions in your $(thing)Psi energy$(0), allowing it to regenerate as normal.", "psi.book.page.loopcastBullet.4": "A $(thing)Spell$(0) cast from one of these $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) can do different things on each invocation.$(p)Specifically, $(piece)Selector: Loopcast Index$(0) returns the number of times the $(thing)Spell$(0) has been executed since you first cast it.$(p)Thus, it returns 1 the first time the $(thing)Spell$(0) executes, 2 the second time, and so on.", "psi.book.page.loopcastBullet.5": "When used with $(piece)Operator: Integer Divide$(0) and $(piece)Operator: Modulus$(0), these $(l:items/spell_bullet)$(o)$(thing)Bullets$(0)$(/l) can perform operations $(o)en masse$() over wide areas with ease.", "psi.book.entry.circleBullet": "Circle Spell Bullet", "psi.book.page.circleBullet.0": "A $(thing)Spell$(0) cast from a $(item)Circle Spell Bullet$(0) is executed consecutively exactly twenty times.$(p)When the $(thing)Spell$(0) is first cast, a $(thing)Spell Circle$(0) is conjured at the point the caster is looking at, which acts as the $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) for the $(thing)Spell$(0). This circle executes the $(thing)Spell$(0) four times a second until it runs out of $(thing)Psi energy$(0), five seconds later.", "psi.book.page.circleBullet.1": "The Costco of spellslinging", "psi.book.page.circleBullet.2": "A $(thing)Spell Circle$(0), when first cast, is conjured up to 32 blocks away from the caster's position or at the nearest block they look at (whichever is closer).$(p)Similarly to a $(l:items/loopcast_bullet)$(o)$(item)Loopcast Spell Bullet$(0)$(/l), a $(thing)Spell$(0) cast from a $(thing)Spell Circle$(0) can know which iteration it's on using $(piece)Selector: Loopcast Index$(0) (which will return a number from 1 to 20, inclusive).", "psi.book.page.circleBullet.3": "A $(thing)Spell Circle$(0) drains all the $(thing)Psi energy$(0) it needs when it's first cast, hence its $(thing)Cost Multiplier$(0) of a whopping 1500%%.$(p)However, its voracious $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l) is not without benefit; its compact, self-contained design makes it $(o)extremely$() efficient, allowing it to execute a $(thing)Spell$(0) 20 times for the cost of 15.$(p)For those of you keeping track, that's a full 25%% discount per-execution.", "psi.book.page.circleBullet.4": "$(item)Circle Spell Bullets$(0) are popular among spellslingers new and experienced both for their versatility and their conservation of $(thing)Psi energy$(0).$(p)As such, there are several relatively common $(thing)Tricks$(0) used with $(item)Circle Spell Bullets$(0) in particular that aren't seen elsewhere.", "psi.book.page.circleBullet.5": "The $(thing)Circlesync$(0) idiom, relatively simple to build, allows all twenty executions of the $(thing)Spell$(0) to happen at once, allowing them to accumulate into a much grander effect than a single execution would alone.$(p)The $(thing)20-Bit Tower$(0) idiom has a slightly more difficult setup involving a $(l:items/vector_ruler)$(o)$(item)Vector Ruler$(0)$(/l); but allows a $(thing)Spell$(0) to only do something on a subset of its twenty executions.", "psi.book.subsec.circleBullet.6": "Circlesync", "psi.book.page.circleBullet.6": "The $(thing)Circlesync$(0) idiom (pictured at right) uses $(piece)Trick: Sleep$(0) at its core.$(p)When placed in the $(thing)Spell$(0), it delays each execution corresponding exactly to the time left until the final $(thing)Trick$(0) activates.$(p)Any $(thing)Tricks$(0) placed after the $(piece)Trick: Sleep$(0), then, execute simultaneously.", "psi.book.page.circleBullet.7": "When the stars align... ", "psi.book.subsec.circleBullet.8": "20-Bit Tower", "psi.book.page.circleBullet.8": "The $(thing)20-Bit Tower$(0) idiom is a rather advanced technique, rather technical in design.$(p)To use it, select a block with a $(l:items/vector_ruler)$(o)$(item)Vector Ruler$(0)$(/l), then place some blocks (it doesn't matter what kind) in the twenty-block-high vertical space directly above the location you selected, then copy the code on the following page to the top of your $(thing)Spell$(0).", "psi.book.page.circleBullet.9": "Each block position in that vertical space represents one execution of the $(thing)Spell$(0); the bottommost location of the tower represents the first execution, the next location the second, and so on.$(p)An empty space in a tower represents \"$(o)DO$() execute on that iteration,\" and a block in that position tells the $(thing)Spell$(0) \"$(o)DON'T$().\"$(p)Finally, copy the code on the next page to the top of your $(thing)Spell$(0).", "psi.book.page.circleBullet.10": "Conditionally", "psi.book.entry.grenadeBullet": "Grenade Spell Bullet", "psi.book.page.grenadeBullet.0": "A $(thing)Spell$(0) cast from a $(item)Grenade Spell Bullet$(0), instead of executing immediately, is fired out the end of the $(thing)CAD$(0) it was cast as a $(thing)Spell Grenade$(0).$(p)Unlike a $(l:items/projectile_bullet)$(o)$(thing)Spell Projectile$(0)$(/l), though, a grenade $(o)is$() affected by gravity.$(p)It executes its contained $(thing)Spell$(0) after exactly three seconds, no sooner and no later.", "psi.book.page.grenadeBullet.1": "Pull the trigger, not the pin", "psi.book.page.grenadeBullet.2": "A $(thing)Spell Grenade$(0) is an intangible thin wrapper of $(thing)Psi energy$(0), created from the excess drawn by the $(item)Grenade Spell Bullet$(0).$(p)The conjured grenade also acts as the $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) for the $(thing)Spell$(0) when it executes.$(p)While its uses appear rather limited at first, a $(thing)Spell Grenade$(0) can reach places a $(l:items/projectile_bullet)$(o)$(thing)Spell Projectile$(0)$(/l) can't (e.g. over a wall, or inside a hole).", "psi.book.page.grenadeBullet.3": "A $(thing)Spell Grenade$(0) will record the last entity it comes into contact with.$(p)When its contained $(thing)Spell$(0) executes, this entity can be accessed from $(piece)Selector: Attack Target$(0), if applicable.", "psi.book.entry.chargeBullet": "Charge Spell Bullet", "psi.book.page.chargeBullet.0": "A $(thing)Spell$(0) cast from a $(item)Charge Spell Bullet$(0), rather than executing immediately, is fired out the end of the $(thing)CAD$(0) it's cast from in a $(thing)Spell Charge$(0), which obeys gravity just like a $(l:items/grenade_bullet)$(o)$(thing)Spell Grenade$(0)$(/l).$(p)However, unlike a $(l:items/grenade_bullet)$(o)$(thing)Spell Grenade$(0)$(/l), a $(thing)Spell Charge$(0) can last up to five minutes, and only executes its $(thing)Spell$(0) when specially told to do so by a $(l:items/detonator)$(o)$(item)Spell Detonator$(0)$(/l).", "psi.book.page.chargeBullet.1": "They build up", "psi.book.page.chargeBullet.2": "A $(thing)Spell Charge$(0) is a stable shell of $(thing)Psi energy$(0) around its contained $(thing)Spell$(0), acting as the $(thing)Spell$(0)'s $(l:items/spell_bullet#focal_point)$(o)$(thing)Focal Point$(0)$(/l) when executed.$(p)If the $(thing)Spell Charge$(0) is never activated within its lifetime, it simply dissipates, fizzling the $(thing)Spell$(0) within and wasting the invested $(thing)Psi energy$(0).", "psi.book.page.chargeBullet.3": "However, many $(thing)Spell Charges$(0) in close proximity can all be activated at once by a single $(l:items/detonator)$(o)$(item)Spell Detonator$(0)$(/l) (or $(piece)Trick: Detonate$(0)), making them quite useful for mass effect.$(p)A $(thing)Spell Charge$(0) will record the last entity it bumps into (or, as may occur, the last entity to step on it).$(p)When its contained $(thing)Spell$(0) executes, this entity can be accessed from $(piece)Selector: Attack Target$(0), if applicable.", "psi.book.entry.mineBullet": "Mine Spell Bullet", "psi.book.page.mineBullet.0": "A $(thing)Spell$(0) cast from a $(item)Mine Spell Bullet$(0) is fired out of the $(thing)CAD$(0) it was cast in a $(thing)Spell Mine$(0).$(p)A $(thing)Spell Mine$(0) obeys gravity and has a five-minute lifespan. It only executes its stored $(thing)Spell$(0) once stepped on by someone (or something).", "psi.book.page.mineBullet.1": "Country roads...", "psi.book.page.mineBullet.2": "A $(thing)Spell Mine$(0)'s conditions for execution are rather finicky; a mine begins by staying on the ground and waiting to be stepped on.$(p)When one or more entities step on it, the mine doesn't trigger right away; instead it merely primes itself.$(p)When it's primed and there are no longer any entities atop it, then and only then will it execute its contained $(thing)Spell$(0).", "psi.book.page.mineBullet.3": "The entity that triggered the $(thing)Spell$(0) (i.e. the last entity to step off the $(thing)Spell Mine$(0)) is accessible from $(piece)Selector: Attack Target$(0).$(p)However, if a $(thing)Spell Mine$(0)'s activation conditions are never met within its lifetime, the mine will simply dissipate, fizzling its stored energy.$(p)So if you end up landing on a $(thing)Spell Mine$(0), waiting it out might just be preferable to knowing what the caster has in store for you.", "psi.book.entry.detonator": "Spell Detonator", "psi.book.page.detonator.0": "A $(item)Spell Detonator$(0) is crafted from two $(item)Iron Ingots$(0), $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l), and a $(item)Button$(0).$(p)It serves exactly one function: when it's actuated ($(k:use)), it activates every single $(l:items/charge_bullet)$(o)$(thing)Spell Charge$(0)$(/l) (and $(l:items/exosuit_sensor#trigger)$(o)$(item)Exosuit Detonation Sensor$(0)$(/l)) cast by you in a 32-block radius, instructing them to simultaneously execute their contained $(thing)Spells$(0).", "psi.book.page.detonator.1": "The first bomb", "psi.book.entry.exosuit": "Psimetal Exosuit", "psi.book.page.exosuit.0": "A $(thing)Psimetal Exosuit$(0) is a suit of armor allowing you to seamlessly integrate $(thing)Spell$(0)-casting into your everyday adventuring!$(p)Each piece of the $(thing)Exosuit$(0) is crafted from two $(l:components/psigem)$(o)$(item)Psigems$(0)$(/l) and some $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l), and is capable of casting a $(thing)Spell$(0) when its respective trigger is activated.", "psi.book.page.exosuit.1": "The suits' $(thing)Spells$(0) are cast with your $(thing)CAD$(0) as a focus, so the usual $(thing)CAD$(0) limits apply.$(p)Each piece of the $(thing)Psimetal Exosuit$(0) can be loaded with up to three $(item)Spell Bullets$(0) in a $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l), though sadly, some $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) variants don't play well with the suit.$(p)A suit piece remembers the number of times it's successfully cast a $(thing)Spell$(0); this count can be accessed from $(piece)Selector: Success Counter$(0).", "psi.book.page.exosuit.2": "To select which $(thing)Spell$(0) to use for a suit piece, craft an $(item)Exosuit Controller$(0) from $(item)Redstone Dust$(0), $(item)Glass$(0), and $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l). To use the $(item)Controller$(0), hold it and press the $(thing)Psi master keybind$(0) ($(k:psimisc.keybind)).$(p)Use the right and left-mouse buttons to cycle through suit pieces.", "psi.book.page.exosuit.3": "It's no JARVIS, but it works", "psi.book.page.exosuit.4": "Once you've selected the suit piece you want to configure, choose one of the $(item)Spell Bullets$(0) that's displayed the same way you would with your $(thing)CAD$(0).$(p)Selecting the empty fourth slot disables that suit piece completely-- no $(thing)Spells$(0) will be cast even if its activation criteria are met.", "psi.book.page.exosuit.5": "A $(thing)Psimetal Exosuit$(0) is slightly better than $(thing)Iron Armor$(0) in strength and durability.$(p)All pieces of a suit will draw from their wearer's excess $(thing)Psi energy$(0) to repair damage to themselves, a feat made possible by the $(l:components/psigem)$(o)$(item)Psigems$(0)$(/l) used in their construction.", "psi.book.page.exosuit.6": "The $(item)Psimetal Exosuit Helmet$(0) is the most configurable of the bunch, casting its designated $(thing)Spell$(0) whenever its contained $(l:items/exosuit_sensor)$(o)$(thing)Exosuit Sensor$(0)$(/l) triggers.$(p)A $(l:items/exosuit_sensor)$(o)$(thing)Sensor$(0)$(/l) attaches to and detaches from a $(item)Helmet$(0) in a crafting grid; a $(item)Helmet$(0) can only have one $(l:items/exosuit_sensor)$(o)$(thing)Exosuit Sensor$(0)$(/l) attached at a time.", "psi.book.page.exosuit.7": "You hear a sound, turn around", "psi.book.page.exosuit.8": "The $(item)Psimetal Exosuit Chestplate$(0) casts its selected $(thing)Spell$(0) whenever its user takes any form of damage.$(p)$(piece)Selector: Attacker$(0) and $(piece)Selector: Damage Taken$(0) can be used to identify the source and amount of damage, respectively.", "psi.book.page.exosuit.9": "Explosive Thorns", "psi.book.page.exosuit.10": "$(item)Psimetal Exosuit Leggings$(0) $(o)never stop$() casting their selected $(thing)Spell$(0).$(p)In fact, they do so once per $(thing)CAD$(0) tick, which is a unit of time equal to 0.05 seconds.$(p)They're quite popular as \"better $(l:items/loopcast_bullet)$(o)$(item)Loopcast Spell Bullets$(0)$(/l).\"", "psi.book.page.exosuit.11": "while(true) {}", "psi.book.page.exosuit.12": "$(item)Psimetal Exosuit Boots$(0) simply cast their designated $(thing)Spell$(0) when their wearer jumps off the ground.$(p)No more, no less.", "psi.book.page.exosuit.13": "Jump Boost-- er, Boots", "psi.book.entry.exosuitSensor": "Exosuit Sensors", "psi.book.page.exosuitSensor.0": "$(thing)Exosuit Sensors$(0) are small devices designed to be embedded into larger pieces of armor (e.g. the $(l:items/exosuit#helmet)$(o)$(item)Psimetal Exosuit Helmet$(0)$(/l)), and to signal their containing armor when triggered.$(p)Each $(thing)Sensor$(0) has a different condition for what triggers it.", "psi.book.page.exosuitSensor.1": "All $(thing)Sensors$(0) are crafted from two $(item)Iron Ingots$(0) and two of $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l) around a reagent; the reagent used determines the resulting $(thing)Sensor$(0)'s effect:$(li)the $(item)Light Sensor$(0) uses $(item)Glowstone Dust$(0);$(li)the $(item)Heat Sensor$(0) uses a $(item)Fire Charge$(0);$(li)the $(item)Stress Sensor$(0) uses a slice of $(item)Glistering Melon$(0);$(li)the $(item)Water Sensor$(0) uses $(item)Prismarine Crystals$(0);$(li)the $(item)Detonation Sensor$(0) uses $(item)Gunpowder$(0).", "psi.book.page.exosuitSensor.2": "The $(item)Exosuit Light Sensor$(0) triggers once whenever its wearer moves into a dark area (i.e. an area that's dark enough to spawn monsters) from a non-dark area.$(p)It can be manually triggered in a dark area with a $(piece)Trick: Conjure Light$(0) on a timer.", "psi.book.page.exosuitSensor.3": "Who turned out the lights?", "psi.book.page.exosuitSensor.4": "The $(item)Exosuit Heat Sensor$(0) triggers whenever its wearer catches fire.$(p)$(piece)Trick: Fire Resistance$(0) or $(piece)Trick: Torrent$(0) are good responses to this $(thing)Sensor$(0) triggering, unless you $(o)really$() know what you're doing.", "psi.book.page.exosuitSensor.5": "We carry on", "psi.book.page.exosuitSensor.6": "The $(item)Exosuit Stress Sensor$(0) triggers when its wearer is low on health (specifically, if the wearer is at three hearts or less).$(p)$(piece)Trick: Regeneration$(0) might be a good response to this issue.", "psi.book.page.exosuitSensor.7": "Don't panic", "psi.book.page.exosuitSensor.8": "The $(item)Exosuit Water Sensor$(0) triggers when its wearer touches water.$(p)With a bit of ingenuity, it can be triggered manually via $(piece)Trick: Torrent$(0).", "psi.book.page.exosuitSensor.9": "Make a splash", "psi.book.page.exosuitSensor.10": "The $(item)Exosuit Detonation Sensor$(0) triggers whenever a $(l:items/detonator)$(o)$(item)Spell Detonator$(0)$(/l) is actuated within a 32-block radius, or when a $(piece)Trick: Detonate$(0) is cast in the same area.", "psi.book.page.exosuitSensor.11": "At the push of a button", "psi.book.entry.tools": "Psimetal Tools", "psi.book.page.tools.0": "The $(thing)Psimetal Tools$(0) are a set of tools, comparable to $(item)Diamond$(0)-tier in quality, each of which can cast a $(thing)Spell$(0) each time it performs its intended action.$(p)All $(thing)Psimetal Tools$(0) are crafted with $(item)Iron Ingots$(0) in place of $(item)Sticks$(0), one $(l:components/psigem)$(o)$(item)Psigem$(0)$(/l), and some $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l).", "psi.book.page.tools.1": "It's a bonus action", "psi.book.page.tools.2": "A $(thing)Psimetal Tool$(0) can be loaded with up to three $(item)Spell Bullets$(0) in a $(l:basics/cad_assembler)$(o)$(item)CAD Assembler$(0)$(/l) (though some $(item)Spell Bullets$(0) don't play well with the tools).$(p)To select the $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) to use for a tool, hold the $(thing)Psi master keybind$(0) ($(k:psimisc.keybind)) and select from the menu as usual.$(p)Picking an empty slot from the menu disables the tool from casting entirely.", "psi.book.page.tools.3": "All $(thing)Psimetal Tools$(0) except the $(item)Psimetal Sword$(0) cast their selected $(thing)Spell$(0) once each time they break a block.$(p)The $(item)Sword$(0) instead casts each time it hits a living being (though it should be noted for strategic purposes that once damaged, a living thing is invulnerable for half a second).$(p)$(thing)Psimetal Tools$(0) will draw from their wielder's excess $(thing)Psi energy$(0) to repair themselves.", "psi.book.page.tools.4": "$(thing)Psimetal Tools$(0) also get some convenient integration with $(thing)Spell Pieces$(0).$(p)When the $(item)Psimetal Sword$(0) casts a $(thing)Spell$(0), $(piece)Selector: Attack Target$(0) returns the mob you whacked to do so.$(p)When one of the other $(thing)Tools$(0) breaks a block, $(piece)Selector: Block Broken$(0) returns the position of the broken block, and $(piece)Selector: Block Broken Side$(0) returns the axial vector corresponding to the direction the block was broken from.", "psi.book.entry.vectorRuler": "Vector Ruler", "psi.book.page.vectorRuler.0": "A $(item)Vector Ruler$(0) can store an arbitrary vector, which can then be accessed from within a $(thing)Spell$(0) at your convenience.$(p)It's made from $(item)Iron Ingots$(0) and a tip of $(l:components/psidust)$(o)$(item)Psidust$(0)$(/l).", "psi.book.page.vectorRuler.1": "Vectors rule", "psi.book.page.vectorRuler.2": "Tapping a $(item)Ruler$(0) on a block ($(k:use)) while crouching stores that block's position in the $(item)Ruler$(0) as a vector.$(p)Once a block's position is stored, tapping the $(item)Ruler$(0) without crouching on another block will store the offset between the two blocks.$(p)A $(item)Ruler$(0)'s stored vector can be accessed with $(piece)Selector: Vector Ruler$(0).", "psi.book.page.vectorRuler.3": "If you happen to be carrying several $(item)Rulers$(0) at a time, $(piece)Selector: Vector Ruler$(0) will return the stored value of the leftmost $(item)Ruler$(0) in your hotbar, or the highest $(item)Ruler$(0) in your inventory if your hotbar has none.", "psi.book.entry.spellDrive": "Spell Drive", "psi.book.page.spellDrive.0": "A $(item)Spell Drive$(0), crafted from two ingots of $(l:components/psimetal)$(o)$(item)Psimetal$(0)$(/l) and a piece of $(item)Redstone Dust$(0), can store a single $(thing)Spell$(0) for later use.$(p)To store a $(thing)Spell$(0) in a $(l:basics/spell_programmer)$(o)$(item)Spell Programmer$(0)$(/l) onto a $(item)Drive$(0), crouch and swipe ($(k:use)) an empty $(item)Drive$(0) over it.$(p)To copy a $(thing)Spell$(0) back, crouch-swipe a $(item)Drive$(0) with a $(thing)Spell$(0) stored over the $(l:basics/spell_programmer)$(o)$(item)Programmer$(0)$(/l).", "psi.book.page.spellDrive.1": "Build yourself a library", "psi.book.page.spellDrive.2": "To clear a stored $(thing)Spell$(0), crouch-swipe the $(item)Drive$(0) over any other block.$(p)A $(item)Drive$(0) with a stored $(thing)Spell$(0) can be placed in a crafting grid with an empty $(item)Drive$(0) or $(l:items/basic_bullet)$(o)$(item)Spell Bullet$(0)$(/l) to copy its $(thing)Spell$(0) onto the latter.", "psi.book.category.legacy": "Legacy Entries", "psi.book.category.legacy.desc": "These entries are a holdover from the days of $(thing)Psi$(0) for 1.12 and below. As this book fills up with rewritten documentation, this section will shrink in size until all documentation is ported, when it'll vanish for good.", "psi.book.entry.vectors101": "Vectors 101", "psi.book.page.vectors101.0": "The manipulation of vectors is an essential component to $(thing)Spell$(0) programming. Most vector operations are outlined $(l:basics/vector_primer#ops)here$(/l); the only missing piece is $(piece)Operator: Vector Cross Product$(0).", "psi.book.page.vectors101.1": "The $(l)cross product$() of two vectors is a vector that is perpendicular to both. You can make use of this to get a vector that points to your side, by taking the cross product of the player's look vector and [0, 1, 0] (which you can create with $(piece)Operator: Vector Construct$(0)). ", "psi.book.entry.entities101": "Entities 101", "psi.book.page.entities101.0": "The manipulation of entities is an essential component to $(thing)Spell$(0) programming. The most obvious entity to manipulate is you, the caster, via $(piece)Selector: Caster$(0). Other pieces, however, allow you to target other entities in the world.$(p)You can make use of those pieces to create $(thing)Spells$(0) that affect other entities. Try using them with $(piece)Trick: Add Motion$(0) to fling around others.", "psi.book.entry.blockworks": "Blockworks", "psi.book.page.blockworks.0": "Working with blocks is an essential skill for a mage. You can, of course, refer to a block's position via a vector, so knowledge of vectors is important to understand how to work with blocks.$(p)Two of the most basic block pieces in this group are $(piece)Trick: Place Block$(0) and $(piece)Trick: Break Block$(0).", "psi.book.page.blockworks.1": "These both take a position vector, and respectively place and break a block at that position. $(piece)Trick: Place Block$(0) uses the block to the right of your $(thing)CAD$(0) in your hotbar for placing. Knowing the block position to break is easy; $(piece)Operator: Vector Raycast$(0) suffices.", "psi.book.page.blockworks.2": "However, placing a block is trickier: $(piece)Operator: Vector Raycast$(0) gives us the block the player is looking at. We can't place a block there-- there already $(o)is$() one! To remedy that, we can combine our $(piece)Operator: Vector Raycast$(0) with the $(piece)Operator: Vector Axis Raycast$(0) piece, which gives us a vector representing the side of the block we're looking at. ", "psi.book.page.blockworks.3": "For example, if we're looking at the top of the block, it'll give us the axial vector [0, 1, 0]. We can use $(piece)Operator: Vector Sum$(0) to add it to our plain Raycast to tell us where our block will go!$(p)$(piece)Operator: Entity Axial Look$(0) is similar to $(piece)Operator: Entity Look$(0), but returns a value snapped to one of the six axial vectors (e.g. if you're looking east, it returns [1, 0, 0]). Think of the \"Facing\" value in your F3 menu.", "psi.book.page.blockworks.4": "The other two $(thing)Tricks$(0) available here are $(piece)Trick: Place Block Sequence$(0) and $(piece)Trick: Break Block Sequence$(0). These $(thing)Tricks$(0) break or place a line of blocks. Similarly to the standard break and place $(thing)Tricks$(0), they require a position to start off, but they also require another Vector, \"Target\", that defines the direction to operate in. So if \"Target\" is [0, 1, 0], it'll place or break blocks starting from the value of \"Position\" upwards.", "psi.book.page.blockworks.5": "The last component to these $(thing)Tricks$(0) is \"Max\", this is a number constant for the maximum amount of blocks the $(thing)Trick$(0) is allowed to break or place. Since the vector requirements aren't constant, this works as means of calculating the Potency and Cost of the $(thing)Trick$(0). The higher you set it, the more the $(thing)Spell$(0) will cost.$(p)The last piece in this group is $(piece)Operator: Vector Project$(0).", "psi.book.page.blockworks.6": "Vector Projection is a somewhat complex topic, so we'll only explain a potential uses for it below.$(p)Say you want to make a $(thing)Spell$(0) that places blocks from your position in the world to the position you're looking at, but in a straight line aligned to the side of the block you're looking at (using $(piece)Operator: Vector Axis Raycast$(0)).", "psi.book.page.blockworks.7": "You start off by finding the vector that you want to place blocks along, so you can plug it into $(piece)Trick: Place Block Sequence$(0). If you're diagonal to the block, though, you may get something like [3, 2, 4]. That's not a straight line! We can use $(piece)Operator: Vector Project$(0) to project that into the axis of the side you're looking at, say, [0, 0, 1].", "psi.book.page.blockworks.8": "So our \"Vector A\" is [3, 2, 4] and our \"Vector B\" is [0, 0, 1]. Applying the projection leaves us with [0, 0, 4]. If our \"Vector B\", was, for example, [1, 0, 0], we'd get [3, 0, 0]. In general, when an axial vector is used for \"Vector B\", $(piece)Operator: Vector Project$(0) strips any components of A that are 0 in B, leaving you with a straight line.$(p)To put it all together, try making a $(thing)Spell$(0) that brings down an 8 block high column, so you can \"treecapitate\"!", "psi.book.entry.movementAdvances": "Movement Advances", "psi.book.page.movementAdvances.0": "The basics of movement $(thing)Tricks$(0) were covered when we talked about $(piece)Trick: Add Motion$(0). This group has pieces that improve on that idea.$(p)$(piece)Trick: Blink$(0) simply teleports the target entity forwards in the direction they're looking in. A negative value will teleport the entity backwards.", "psi.book.page.movementAdvances.1": "$(piece)Trick: Mass Blink$(0) does the same as $(piece)Trick: Blink$(0), but accepts an Entity List instead; each entity in the list is individually affected by the $(thing)Trick$(0).$(p)$(piece)Trick: Mass Add Motion$(0) is similar; it's the Entity List version of $(piece)Trick: Add Motion$(0).$(p)Finally, $(piece)Trick: Mass Exodus$(0) pulls every entity in an Entity List towards a given position, at the given speed. A negative speed will push them away instead. ", "psi.book.entry.blockMovement": "Block Movement", "psi.book.page.blockMovement.0": "The ability to move blocks isn't as important as the ability to break and place them, but happens to be quite useful nonetheless.$(p)$(piece)Trick: Move Block$(0) takes a position for a block in the world and moves it in the target vector's direction, as if it were pushed by a piston. The target vector must be axial; if it isn't, the $(thing)Trick$(0) will fail.", "psi.book.page.blockMovement.1": "On the other hand, $(piece)Trick: Collapse Block$(0) causes a block to fall as if it were sand or gravel.$(p)Both these $(thing)Tricks$(0) will fail to execute on complex blocks (those known as Tile Entities) and blocks that can't be harvested with Silk Touch. ", "psi.book.entry.elementalArts": "Elemental Arts", "psi.book.page.elementalArts.0": "What's a magic system without the ability to cast elemental $(thing)Spells$(0)?$(p)This group contains $(thing)Tricks$(0) for the four elements; for example, $(piece)Trick: Smite$(0) summons a lightning bolt at the position it's told to.", "psi.book.page.elementalArts.1": "The group also contains $(piece)Operator: Random$(0), a piece that will generate a random number between 0 (inclusive) and the number passed in (exclusive). This can be used alongside Loopcast or Spell Circle $(thing)Spells$(0) in many ways. For example, one can create a $(thing)Spell$(0) that would use $(piece)Trick: Overgrow$(0) to mass bone meal a plantation. ", "psi.book.entry.positiveEffects": "Positive Effects", "psi.book.page.positiveEffects.0": "The ability to apply magical effects to things and people is a must-have feature of any magical lexicon worth its weight. We're not writing $(thing)Spells$(0) from a spellbook, but you can apply effects to entities anyway.$(p)All of the pieces in this group will apply their respective potion effect to the target entity, for the given time (in seconds).", "psi.book.page.positiveEffects.1": "If the piece also has a Power parameter, it represents the level of the effect to apply.$(p)For example, $(piece)Trick: Speed$(0) with Time 20 and Power 2 would apply a Speed II effect for 20 seconds to the target entity. ", "psi.book.entry.negativeEffects": "Negative Effects", "psi.book.page.negativeEffects.0": "As one might expect, with $(l:legacy/positive_effects)Positive Effects$(/l) come Negative Effects.$(p)There isn't much to say here, really. All tricks in this group do exactly what they say on the tin.$(p)Have fun. ", "psi.book.entry.trigonometry": "Trigonometry", "psi.book.page.trigonometry.0": "This group includes $(thing)Operators$(0) relevant to trigonometric functions. $(piece)Constant: Pi$(0) is exactly what it says on the tin, a constant that gives you the value of \u03c0=3.1415\u2026.$(p)This group includes elementary trigonometric operations as well: the sine and cosine functions, as well as their inverses (arcsine and arccosine).", "psi.book.page.trigonometry.1": "Additionally, $(piece)Operator: Vector Dot Product$(0) returns the dot product of two vectors: the product of the two vectors' magnitudes times the cosine of the angle between them. Using $(piece)Operator: Arc Cosine$(0) on the result will allow you to get the angle between two vectors. ", "psi.book.entry.smeltery": "Smeltery", "psi.book.page.smeltery.0": "The pieces in this group are function quite simply; they all smelt things into other things as if they had been put in a furnace.$(p)$(piece)Trick: Smelt Item$(0) will cook a single dropped item in the world into its smelted counterpart.", "psi.book.page.smeltery.1": "$(piece)Trick: Smelt Block$(0) will smelt a block in the world into its smelted version, provided that that smelted form's also a block.$(p)So Cobblestone can be smelted into Stone, and then into Smooth Stone, but a log won't smelt into Charcoal. ", "psi.book.entry.flowControl": "Flow Control", "psi.book.page.flowControl.0": "Flow Control is a somewhat complex subject. All the pieces here included allow a $(thing)Spell$(0) to function in wildly different ways. However, understanding how to properly use these pieces requires knowledge of the very internals of the spellcasting system-- have a read through $(l:basics/eval_order)this article$(/l) for more information.", "psi.book.page.flowControl.1": "With that info under your belt, let's start off with $(piece)Trick: Sleep$(0). This piece causes the $(thing)Spell$(0) from which it's cast to delay its execution for the number of ticks it receives. (A tick is a span of 0.05 seconds.) So if you wish to delay further processing of a $(thing)Spell$(0) by half a second, you would use 10 as the \"Time\" parameter. $(piece)Trick: Sleep$(0) does not add any $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l) to your $(thing)Spell$(0), but does cost $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l).", "psi.book.page.flowControl.2": "$(piece)Trick: Evaluate$(0) is a $(thing)Trick$(0) that does absolutely nothing.$(p)Yes, you heard that right. This $(thing)Trick$(0) does nothing. It doesn't add to any stats on your $(thing)Spell$(0), either.$(p)Its only practical use is to evaluate a value before a $(piece)Trick: Sleep$(0) executes, allowing you to, for example, get the place an entity was before the $(piece)Trick: Sleep$(0) triggered, for use later in the $(thing)Spell$(0).", "psi.book.page.flowControl.3": "$(piece)Trick: Die$(0), on the other hand, is a Flow Control piece in the proper sense of the term.$(p)It takes a Number parameter, and if that number's absolute value lies strictly below 1 (also exclusive), it fizzles the $(thing)Spell$(0) right then and there. Any other values passed to the $(thing)Trick$(0) will allow the $(thing)Spell$(0) to continue on as usual.$(p)This piece doesn't cost $(l:basics/tutorial_5#projection)$(o)$(thing)Projection$(0)$(/l).", "psi.book.page.flowControl.4": "A very simple way to put $(piece)Trick: Die$(0) to use is to couple it to $(piece)Selector: Sneak Status$(0), which conveniently returns 0 if the caster is sneaking and 1 if they're not.$(p)Why, it's almost as if they were made to be used together!", "psi.book.page.flowControl.5": "$(piece)Constant: Wrapper$(0) allows you to use pieces that return Numbers for $(thing)Tricks$(0) that would otherwise require Number Constants.$(p)As you should know by now, Number Constants fed to $(thing)Tricks$(0) are used to calculate a $(thing)Spell$(0)'s stats (including $(l:basics/tutorial_5#cost)$(o)$(thing)Cost$(0)$(/l)) before the $(thing)Spell$(0)it's ever cast.$(p)Since these Constants are required at compile-time, simple Numbers that get evaluated at execution-time are clearly unusable here.", "psi.book.page.flowControl.6": "$(piece)Constant: Wrapper$(0) gets around this by accepting two Numbers, a Constant and a non-Constant.$(p)The Constant passed to the piece will be the one used for $(thing)Spell$(0) compilation calculations; but the non-Constant number will be the one used when the $(thing)Spell$(0) is actually executed.$(p)The non-Constant Number's value will be capped at the value of the Constant during $(thing)Spell$(0) execution, to prevent tomfoolery.", "psi.book.page.flowControl.7": "The execution-time Number has its sign changed to the sign of the Number Constant, so that the signs of both numbers match. If the Constant Number is 0, $(piece)Constant: Wrapper$(0) always returns 0, regardless of input.", "psi.book.entry.blockConjuration": "Block Conjuration", "psi.book.page.blockConjuration.0": "This group includes pieces that do exactly as advertised: they conjure blocks.$(p)$(piece)Trick: Conjure Block$(0) creates a Conjured Block, a semi-transparent solid block, at the given position. Conjured Blocks, if conjured with a \"Time\" parameter, can quietly break themselves after the specified time has elapsed.", "psi.book.page.blockConjuration.1": "If the \"Time\" parameter is used, it's specified in ticks (units of 0.05 seconds). Thus, if you want to make a block that disappears after half a second, set the \"Time\" parameter to 10 ticks.$(p)$(piece)Trick: Conjure Light$(0) conjures a light source instead, one that can't be collided against.", "psi.book.page.blockConjuration.2": "$(piece)Trick: Conjure Block Sequence$(0) functions much like $(piece)Trick: Place Block Sequence$(0), but creates Conjured Blocks instead. Both these pieces also include a \"Time\" parameter.$(p)Conjured Blocks are fragile, and will break instantly to any tool a player cares to swing at them.", "psi.book.entry.eidosManipulation": "Eidos Manpulation", "psi.book.page.eidosManipulation.0": "Eidos $(thing)Tricks$(0) allow their caster to manipulate the space-time continuum in their favor.$(p)$(piece)Trick: Eidos Reversal$(0) causes its caster to retrace their steps in reverse, at double speed, for the amount of time (in seconds) specified.", "psi.book.page.eidosManipulation.1": "Only one Eidos Reversal may be active at a time, and after a Reversal is cast, any subsequent Reversals can only reverse to the place where the last one ended. Sneaking will stop an ongoing Reversal.$(p)The other $(thing)Trick$(0) piece of the group, $(piece)Trick: Eidos Anchor$(0) creates an \"anchor\" for the caster.", "psi.book.page.eidosManipulation.2": "After the specified amount of time (in seconds), the caster will be warped back to their anchor's location. Multiple executions of $(piece)Trick: Eidos Anchor$(0) can happen in quick succession, but only the last created anchor will activate.", "psi.book.page.eidosManipulation.3": "Finally, $(piece)Selector: Eidos Changelog$(0) takes a single number parameter (let's call it n), and gives you the position in the n'th index of the Eidos Changelog starting from the end. In other words, it gives you a position vector to where you were n ticks ago.$(p)$(piece)Trick: Eidos Reversal$(0) takes you backwards in the changelog, wiping out any locations that occur \"afterward.\" $(piece)Trick: Eidos Anchor$(0) does not modify the changelog. ", "psi.book.entry.detectionDynamics": "Detection & Focus", "psi.book.page.detectionDynamics.0": "This group includes two types of pieces, as the title says: detection, and focus. To understand this, the concept of Slot Focus must be introduced.", "psi.book.page.detectionDynamics.1": "An already known example of Slot Focus is the family of Place Block style $(thing)Tricks$(0). These make use of the block directly to the right of your $(thing)CAD$(0). Slot Focus is the slot which $(thing)Tricks$(0) like these will use. It can be relative (to the position of your $(thing)CAD$(0)) or absolute, can only be in the hotbar and goes from 1 to 9.", "psi.book.page.detectionDynamics.2": "By default, whenever a $(thing)Spell$(0) is cast, its value is \"Relative 1\", so it's 1 slot to the right of your $(thing)CAD$(0). If it was \"Relative -1\" it would be 1 slot to the left of your $(thing)CAD$(0). \"Absolute 3\" would be the third slot in your hotbar. It also loops around, so if you have your $(thing)CAD$(0) on your last slot and the value is \"Relative 1\", it'll be your first slot.", "psi.book.page.detectionDynamics.3": "To set the focused slot, you can use $(piece)Trick: Switch Focus Slot$(0). This takes one of 2 parameters. Both are optional and mutually exclusive, and if you don't define any, it'll set the focus to the default of \"Relative 1\". If you choose to set the \"Position\" parameter, it'll set an Absolute value, whereas the \"Shift\" parameter will set a Relative value.", "psi.book.page.detectionDynamics.4": "This allows you to, for example, build things with different blocks based on the circumstance. This $(thing)Trick$(0) only works for the current $(thing)Spell$(0) cast, and the focus will reset the next time a $(thing)Spell$(0) is cast (even if it's the same $(thing)Spell$(0)).$(p)The other two pieces in the group are set in the \"detection\" area.", "psi.book.page.detectionDynamics.5": "First, $(piece)Selector: Item Presence$(0) takes an optional slot number (if not set it'll default to your Focused Slot), and returns the amount of items in that slot, 0 if it's empty, of course.", "psi.book.page.detectionDynamics.6": "Lastly, $(piece)Selector: Block Presence$(0) takes a vector, to be used as coordinates in the world, and finds the block there, the value returned is 0 if there's no block or a replaceable block (like tall grass), 1 if it's a non-solid block and 2 if it's a solid block. ", "psi.book.entry.memoryManagement": "Memory Management", "psi.book.page.memoryManagement.0": "This group introduces the ability for a $(thing)Spell$(0) to store information persistently inside a $(thing)CAD$(0). A $(thing)CAD$(0) can save vectors to be retrieved in future $(thing)Spell$(0) executions. A $(thing)CAD$(0) can store one vector for every three $(l:components/socket)$(o)$(item)Socket$(0)$(/l) slots it has.", "psi.book.page.memoryManagement.1": "The number of vectors a $(thing)CAD$(0) can store is known as the number of $(thing)Memory Slots$(0) it has.$(p)This piece group includes two $(thing)Spell Pieces$(0), which can save and load vectors to and from a $(thing)CAD$(0)'s $(thing)Memory Slots$(0).$(p)$(piece)Trick: Save Vector$(0) saves a vector to a designated $(thing)Memory Slot$(0), whereas $(piece)Selector: Saved Vector$(0) retrieves the vector saved in the designated $(thing)Memory Slot$(0).", "psi.book.page.memoryManagement.2": "A $(thing)CAD$(0)'s $(thing)Memory Slots$(0) are numbered starting from 1, so a $(thing)CAD$(0) with 3 memory slots can save to slots 1, 2, and 3.$(p)Both $(thing)Tricks$(0) in this group add $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l) to $(thing)Spells$(0) they're used in equal to the number of the slot used.$(p)For example, saving to or loading from slot 2 costs two $(l:basics/tutorial_5#potency)$(o)$(thing)Potency$(0)$(/l).", "psi.book.page.memoryManagement.3": "$(piece)Trick: Save Vector$(0) has an imperfection: it \"locks\" the $(thing)Memory Slot$(0) it saves to.$(p)This prevents either of the two pieces from interacting with that same $(thing)Memory Slot$(0) later in the $(thing)Spell$(0).$(p)So if you need to load the value saved in a slot before you save something new to it, remember the rules of Flow Control to ensure the load happens before the save.", "psi.book.entry.secondaryOperators": "Secondary Operators", "psi.book.page.secondaryOperators.0": "As its name implies, this group is composed of mathematical $(thing)Operators$(0) that aren't quite as important as the \"primary\" ones, like addition or subtraction. This group's just a mixed bag of all sorts of math or logic relates pieces that can be used to help with $(thing)Spell$(0) creation. We'll separate the pieces in two sets to make them easier to explain.", "psi.book.page.secondaryOperators.1": "The first set is related to raising numbers to power, including pieces like $(piece)Operator: Square$(0), $(piece)Operator: Power$(0), $(piece)Operator: Square Root$(0) and even $(piece)Operator: Logarithm$(0). Most of these operate exactly how you'd expect them to.$(p)Note that $(piece)Operator: Logarithm$(0) takes an optional Base argument; if no base is passed in, it'll default to base 10.$(p)$(piece)Constant: e$(0) can also be used to get a natural logarithm.", "psi.book.page.secondaryOperators.2": "The second set of $(thing)Operators$(0) are related to logic. They're pieces that do rounding (to an integer).$(p)$(piece)Operator: Ceiling$(0), $(piece)Operator: Floor$(0) and $(piece)Operator: Round$(0) round up, down, and to the closest integer, respectively.$(p)This group also includes $(piece)Operator: Min$(0) and $(piece)Operator: Max$(0). These get the smallest and largest, respectively, of their parameters.", "psimisc.spellmaynotfunctionasintended": "It appears you are importing a spell created in a previous version of Psi. This spell is not guaranteed to have the same functionality (and cost) as when it was created." }