const SMARTTARGET_MODULE_NAME = "smarttarget"; Hooks.on("init", () => { game.smartTarget = { altModifier : false, }; game.settings.register(SMARTTARGET_MODULE_NAME, "targetingMode", { name: game.i18n.localize("smarttarget.settings.targetingMode.name"), hint: game.i18n.localize("smarttarget.settings.targetingMode.hint"), scope: "client", config: true, default: 1, type: Number, choices: { 0: game.i18n.localize("smarttarget.settings.targetingMode.opt0"), 1: game.i18n.localize("smarttarget.settings.targetingMode.opt1"), 2: game.i18n.localize("smarttarget.settings.targetingMode.opt2"), }, }); game.settings.register(SMARTTARGET_MODULE_NAME, "release", { name: game.i18n.localize("smarttarget.settings.releaseBehaviour.name"), hint: game.i18n.localize("smarttarget.settings.releaseBehaviour.hint"), scope: "client", config: true, default: 0, type: Number, choices: { 0: game.i18n.localize("smarttarget.settings.releaseBehaviour.choice0.Standard"), 1: game.i18n.localize("smarttarget.settings.releaseBehaviour.choice0.Sticky") } }); game.settings.register(SMARTTARGET_MODULE_NAME, "portraitPips", { name: game.i18n.localize("smarttarget.settings.portraitPips.name"), hint: game.i18n.localize("smarttarget.settings.portraitPips.hint"), scope: "world", config: true, default: false, type: Boolean, }); game.settings.register(SMARTTARGET_MODULE_NAME, "useToken", { name: game.i18n.localize("smarttarget.settings.useToken.name"), hint: game.i18n.localize("smarttarget.settings.useToken.hint"), scope: "world", config: true, default: false, type: Boolean, }); game.settings.register(SMARTTARGET_MODULE_NAME, "useTokenGm", { name: game.i18n.localize("smarttarget.settings.useTokenGm.name"), hint: game.i18n.localize("smarttarget.settings.useTokenGm.hint"), scope: "world", config: true, default: 0, type: Number, choices: { 0: game.i18n.localize("smarttarget.settings.useTokenGm.opt0"), 1: game.i18n.localize("smarttarget.settings.useTokenGm.opt1"), 2: game.i18n.localize("smarttarget.settings.useTokenGm.opt2"), }, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipPosition", { name: game.i18n.localize("smarttarget.settings.pipPosition.name"), hint: game.i18n.localize("smarttarget.settings.pipPosition.hint"), scope: "world", config: true, default: "topleft", type: String, choices: { "topleft": game.i18n.localize("smarttarget.settings.pipPosition.topleft"), "topright": game.i18n.localize("smarttarget.settings.pipPosition.topright"), "bottomleft": game.i18n.localize("smarttarget.settings.pipPosition.bottomleft"), "bottomright": game.i18n.localize("smarttarget.settings.pipPosition.bottomright"), "centertop": game.i18n.localize("smarttarget.settings.pipPosition.centertop"), "centerbottom": game.i18n.localize("smarttarget.settings.pipPosition.centerbottom"), "random": game.i18n.localize("smarttarget.settings.pipPosition.random"), }, }); game.settings.register(SMARTTARGET_MODULE_NAME, "insidePips", { name: game.i18n.localize("smarttarget.settings.insidePips.name"), hint: game.i18n.localize("smarttarget.settings.insidePips.hint"), scope: "world", config: true, default: false, type: Boolean, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipImgScale", { name: game.i18n.localize("smarttarget.settings.pipImgScale.name"), hint: game.i18n.localize("smarttarget.settings.pipImgScale.hint"), scope: "world", config: true, type: Number, range: { min: 0.05, max: 10, step: 0.05, }, default: 1, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffsetManualY", { name: game.i18n.localize("smarttarget.settings.pipOffsetManualY.name"), hint: game.i18n.localize("smarttarget.settings.pipOffsetManualY.hint"), scope: "world", config: true, type: Number, range: { min: 0, max: 100, step: 0.05, }, default: 0, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffsetManualX", { name: game.i18n.localize("smarttarget.settings.pipOffsetManualX.name"), hint: game.i18n.localize("smarttarget.settings.pipOffsetManualX.hint"), scope: "world", config: true, type: Number, range: { min: 0, max: 100, step: 0.05, }, default: 0, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipScale", { name: game.i18n.localize("smarttarget.settings.pipScale.name"), hint: game.i18n.localize("smarttarget.settings.pipScale.hint"), scope: "world", config: true, type: Number, range: { min: 0.05, max: 100, step: 0.05, }, default: 12, }); game.settings.register(SMARTTARGET_MODULE_NAME, "pipOffset", { name: game.i18n.localize("smarttarget.settings.pipOffset.name"), hint: game.i18n.localize("smarttarget.settings.pipOffset.hint"), scope: "world", config: true, type: Number, range: { min: 0.05, max: 100, step: 0.05, }, default: 16, }); game.settings.register(SMARTTARGET_MODULE_NAME, "borderThicc", { name: game.i18n.localize("smarttarget.settings.borderThicc.name"), hint: game.i18n.localize("smarttarget.settings.borderThicc.hint"), scope: "world", config: true, type: Number, range: { min: 0, max: 10, step: 1, }, default: 2, }); game.settings.register(SMARTTARGET_MODULE_NAME, "crossairColor", { name: game.i18n.localize("smarttarget.settings.crossairColor.name"), hint: game.i18n.localize("smarttarget.settings.crossairColor.hint"), scope: "client", config: true, type: String, default: "", }); game.settings.register(SMARTTARGET_MODULE_NAME, "target-indicator", { name: game.i18n.localize("smarttarget.settings.target-indicator.name"), hint: game.i18n.localize("smarttarget.settings.target-indicator.hint"), scope: "client", config: true, default: "0", type: String, choices: { 0: game.i18n.localize("smarttarget.settings.target-indicator-choices-0"), 1: game.i18n.localize("smarttarget.settings.target-indicator-choices-1"), 2: game.i18n.localize("smarttarget.settings.target-indicator-choices-2"), 3: game.i18n.localize("smarttarget.settings.target-indicator-choices-3"), 4: game.i18n.localize("smarttarget.settings.target-indicator-choices-4"), 5: game.i18n.localize("smarttarget.settings.target-indicator-choices-5"), }, }); game.settings.register(SMARTTARGET_MODULE_NAME, "use-player-color", { name: game.i18n.localize("smarttarget.settings.use-player-color.name"), hint: game.i18n.localize("smarttarget.settings.use-player-color.hint"), scope: "world", config: true, default: false, type: Boolean, }); libWrapper.register(SMARTTARGET_MODULE_NAME,"Token.prototype._refreshTarget", SmartTarget._refreshTarget, "OVERRIDE"); libWrapper.register(SMARTTARGET_MODULE_NAME, "Token.prototype._onClickLeft", SmartTarget._tokenOnClickLeft, "MIXED"); libWrapper.register(SMARTTARGET_MODULE_NAME, "Canvas.prototype._onClickLeft", SmartTarget.canvasOnClickLeft, "WRAPPER"); libWrapper.register(SMARTTARGET_MODULE_NAME, "Token.prototype._canControl", SmartTarget._canControl, "MIXED"); Hooks.on("getSceneControlButtons", function(controls) { let control = controls.find(c => c.name === 'token') || controls[0]; control.tools.push({ name: 'clearTargets', title: game.i18n.localize("smarttarget.controls.cleartargets.name"), icon:'fa fa-times-circle', button:true, onClick: () => { canvas.tokens.placeables[0]?.setTarget(false, { releaseOthers: true }); }, layer: 'TokenLayer' }); },); const {SHIFT, CONTROL, ALT} = KeyboardManager.MODIFIER_KEYS; game.keybindings.register(SMARTTARGET_MODULE_NAME, "altKey", { name: game.i18n.localize("smarttarget.keybindings.altkey"), editable: [ {key: "AltLeft"}, {key: "AltRight"}, ], onDown: () => {game.smartTarget.altModifier = true;}, onUp: () => {game.smartTarget.altModifier = false;}, }); game.keybindings.register(SMARTTARGET_MODULE_NAME, "clearAllTargets", { name: game.i18n.localize("smarttarget.keybindings.clearAllTargets"), editable: [ {key: "KeyC", modifiers: [ ALT ]} ], onDown: () => {canvas.tokens.placeables[0]?.setTarget(false, { releaseOthers: true });}, }); });