Ok, here's one that is a mashup of stuff. What this does is allow a door token to be selected and have the player interact with the door in any number of different ways; Find and remove traps, unlock, open and close, as well as force open. They can do all of this in game without (theoretically) any interaction from the GM at all with a little setup. You will need the following APIs: Scriptcards (duh), SmartAOE (for traps set off), Door Knocker (to open and close doors), Token-Mod (to set up door tokens. I have a token that I place on any door a character can interact with. That token is associated with a character named "Door" cause I'm creative like that. Then run this macro to set up the door properties. !token-mod {{ --set bar2|?{Is this door locked?|No,0|Yes,1} bar2_max|?{What is the open lock DC?|0} bar1|?{Is this door trapped?|No,0|Yes,1|Yes & Resets,2} bar1_max|?{What is the find trap DC?|0} bar3|?{What is the remove trap DC?|0} bar3_max|?{What is the force open DC?|0} aura1_radius|?{What skill is needed to remove a trap?|No Trap,0|Computer,1|Engineering,2|Computer or Engineering} aura2_radius|?{What skill is needed to unlock this door?|No Trap,0|Computer,1|Engineering,2|Computer or Engineering} }} Other trap status for bar1_value are 0,None|3,Triggered|4,Disabled. I'll use these in the scriptcard. Also, make sure your auras are transparent on your default token unless you want the aura to show. This just sets up the token with what the script needs to interact with the door. You can change the skills required based on the game you are running. This is setup for a Starfinder campaign. Now for the Door Knocker script, just create an unlocked door line on the Dynamic Lighting layer where the door is. This is the easiest way I've found to open and close a door. Now on your Door character, place the scriptcard on the character as a token action with whatever name you want. I've added comments throughout so you can kinda see my logic flow. !script {{ --/|If you want to use the Smart AOE script like I do when a trap is triggered, you will need the player ID of yourself so you can control the trap. --&PlayerID|Player ID here --#sourceToken|@{selected|token_id} --#emoteState|Hidden --#whisper|self --/|This allows your player to have the door selected and not themselves. They will need to have the chat dropdown set to their character --~Character|string;after;|;[&SendingPlayerSpeakingAs] --#title|[*[&Character]:character_name] - Door Interaction --#leftsub|What would you like to do? --/|These are for starting to track repeat attempts in each sub-section --=RemoveAttempt|0 --=UnlockAttempt|0 --=FindAttempt|0 --=ForceAttempt|0 --=TrapFound|0 --/|Creates the initial menu. We will loop back to this a ton as a player interacts with the door token. --:DoorMenu| --+|[c][rbutton]Find Traps::FindTraps[/rbutton] [rbutton]Remove Traps::RemoveTraps[/rbutton] [rbutton]Unlock Door::UnlockDoor[/rbutton] [rbutton]Open Door::OpenDoor[/rbutton] [rbutton]Close Door::CloseDoor[/rbutton] [rbutton]Force Door::ForceDoor[/rbutton][/c] --X| --:FindTraps| --#title|[*[&Character]:character_name] - Find Traps --#whisper| --#leftsub| --/|I use a -2 cumuluative penalty for each find trap attempt. You can delete the next line if you don't --=FindRepeat|[$FindAttempt] * 2 --=TrapStatus|[*S:t-bar1_value] --=PerceptionRoll|1d20 [Base] + [*[&Character]:perception] [Perception] - [$FindRepeat] [Repeated Attempt] --/|Send the roll to the GM for funsies --*|Perception roll is [$PerceptionRoll] --?[$TrapStatus] -eq 0 -or [$TrapStatus] -eq 3 -or [$TrapStatus] -eq 4|NoTrapsApparent --=FindTrapDC|[*S:t-bar1_max] --?[$TrapStatus] -eq 1 -and [$PerceptionRoll] -ge [$FindTrapDC]|TrapFound --:NoTrapsApparent| --+Looks Clear|[i][*[&Character]:character_name] does not detect any active traps on this door. [/i] --/|Delete attempt line below if no repeated attempt penalty --=FindAttempt|[$FindAttempt] + 1 --/|TrapFound variable to insure players must search for traps before attempting to remove --=TrapFound|1 --^DoorMenu| --:TrapFound| --+Danger!|[i][*[&Character]:character_name] detects a trap on this door. [/i] --/|Delete attempt line below if no repeated attempt penalty --=FindAttempt|[$FindAttempt] + 1 --/|TrapFound variable to insure players must search for traps before attempting to remove --=TrapFound|1 --^DoorMenu| --:RemoveTraps| --#title|[*[&Character]:character_name] - Remove Traps --#whisper| --#leftsub| --?[$TrapFound] -eq 0|SearchFirst --=TrapStatus|[*S:t-bar1_value] --?[$TrapStatus] -eq 0 -or [$TrapStatus] -eq 3 -or [$TrapStatus] -eq 4|NoTrapsActive --/|What skill is required to remove a trap for your game. Change as needed. --=RemoveSkillRequired|[*S:t-aura1_radius] --?[$RemoveSkillRequired] -eq 0|NoTrapsActive --?[$RemoveSkillRequired] -eq 1 -and [*[&Character]:computers_ranks] -eq undefined|>NoRemoveSkill; Computer --?[$RemoveSkillRequired] -eq 2 -and [*[&Character]:engineering_ranks] -eq undefined|>NoRemoveSkill; Engineering --?[$RemoveSkillRequired] -eq 3 -and [*[&Character]:engineering_ranks] -eq undefined -and [*[&Character]:computers_ranks] -eq undefined|>NoRemoveSkill; Computer or Engineering --=RemoveRepeat|[$RemoveAttempt] * 2 --=RemoveDC|[*S:t-bar3_value] --/|DC increase by 5 for subtlety --IAre you trying to hide any ; signs of tampering?|q;Tamper;Are you trying to hide any signs of tampering?|No|Yes --?"[&Tamper]" -eq "Yes"|=RemoveDC;[$RemoveDC] + 5 --/|May not be needed based on skill(s) required --~HighestScore|math;max;[*[&Character]:computers];[*[&Character]:engineering] --?[*[&Character]:computers] -eq [*[&Character]:engineering]|=HighestScore;[*[&Character]:engineering] --?[$RemoveSkillRequired] -eq 1|=HighestScore;[*[&Character]:computers] --?[$RemoveSkillRequired] -eq 2|=HighestScore;[*[&Character]:engineering] --=RemoveCheck|1d20 [Base] + [$HighestScore] [Skill] - [$RemoveRepeat] [Repeated Attempt] --=CritFailDC|[$RemoveDC] - 5 --?[$RemoveCheck] -lt [$CritFailDC]|TrapTriggered --?[$RemoveCheck] -ge [$RemoveDC]|TrapRemoved --+Not Quite|[i]With a roll of [$RemoveCheck], [*[&Character]:character_name] fails to remove the trap on this door. They may try again with a cumuluative -2 penalty.[/i] --=RemoveAttempt|[$RemoveAttempt] + 1 --^DoorMenu| --:TrapRemoved| --+Good work!|[i]With a roll of [$RemoveCheck], [*[&Character]:character_name] removes the trap on this door.[/i] --!t:[*S:t-id]|bar1_value:4 --^DoorMenu| --:TrapTriggered| --+Whoops!|[i]With a roll of [$RemoveCheck], [*[&Character]:character_name] triggers the trap on this door.[/i] --?[$TrapStatus] -eq 2|=Reset;2|=Reset;3 --!t:[*S:t-id]|bar1_value:[$Reset] --/|Smart AOE script commands go in the Name field of the token --@smartaoe|[*S:t-name] --^DoorMenu| --:NoTrapsActive| --+Looks Clear|[i]There do not appear to be any active traps on this door. [/i] --^DoorMenu| --:NoRemoveSkill| --+Too Complex|[i][*[&Character]:character_name] does not have the required [%1%] skill to remove this trap.[/i] --^DoorMenu| --:SearchFirst| --+Not Yet|[i]You must first search for traps before you can remove them.[/i] --^DoorMenu| --:UnlockDoor| --#title|[*[&Character]:character_name] - Unlock Door --#whisper| --#leftsub| --=UnlockSkillRequired|[*S:t-aura2_radius] --?[*S:t-bar2_value] -eq 0|DoorNotLocked --/|Required Skill --?[$UnlockSkillRequired] -eq 1 -and [*[&Character]:computers_ranks] -eq undefined|>NoUnlockSkill; Computer --?[$UnlockSkillRequired] -eq 2 -and [*[&Character]:engineering_ranks] -eq undefined|>NoUnlockSkill; Engineering --?[$UnlockSkillRequired] -eq 3 -and [*[&Character]:engineering_ranks] -eq undefined -and [*[&Character]:computers_ranks] -eq undefined|>NoUnlockSkill; Computer or Engineering --=UnlockDC|[*S:t-bar2_max] --=UnlockRepeat|[$UnlockAttempt] * 2 --IAre you trying to hide any ; signs of tampering?|q;Tamper;Are you trying to hide any signs of tampering?|No|Yes --?"[&Tamper]" -eq "Yes"|=UnlockDC;[$UnlockDC] + 5 --~HighestScore|math;max;[*[&Character]:computers];[*[&Character]:engineering] --?[*[&Character]:computers] -eq [*[&Character]:engineering]|=HighestScore;[*[&Character]:engineering] --?[$UnlockSkillRequired] -eq 1|=HighestScore;[*[&Character]:computers] --?[$UnlockSkillRequired] -eq 2|=HighestScore;[*[&Character]:engineering] --=UnlockCheck|1d20 [Base] + [$HighestScore] [Skill] - [$UnlockRepeat] [Repeated Attempt] --?[$UnlockCheck] -ge [$UnlockDC]|DoorUnlocked --+Not Quite|[i]With a roll of [$UnlockCheck], [*[&Character]:character_name] fails to unlock this door. They may try again with a cumuluative -2 penalty.[/i] --=UnlockAttempt|[$UnlockAttempt] + 1 --^DoorMenu| --:DoorUnlocked| --+Success|[i]With a roll of [$UnlockCheck], [*[&Character]:character_name] unlocks this door.[/i] --!t:[*S:t-id]|bar2_value:0 --^DoorMenu| --:DoorNotLocked| --+Congratulations!|[i]You have unlocked an unlocked door.[/i] --^DoorMenu| --:NoUnlockSkill| --+Too Complex|[i][*[&Character]:character_name] does not have the required [%1%] skill to unlock this door.[/i] --^DoorMenu| --:OpenDoor| --#title|[*[&Character]:character_name] - Open Door --#whisper| --#leftsub| --/|Have to unlock before opening --?[*S:t-bar2_value] -eq 1|LockedDoor --/|Trigger trap on open if not removed --=TrapStatus|[*S:t-bar1_value] --?[$TrapStatus] -eq 1 -or [$TrapStatus] -eq 2|SetOffTrap --/|This is where the Door Knocker script comes into play. --@knock|_push|toggle --^DoorMenu| --:LockedDoor| --+Not yet|[i]This door is still locked. You will have to unlock it first. [/i] --^DoorMenu| --:SetOffTrap| --+Whoops!|[i]Trying to unlock it, [*[&Character]:character_name] triggers the trap on this door.[/i] --?[$TrapStatus] -eq 2|=Reset;2|=Reset;3 --!t:[*S:t-id]|bar1_value:[$Reset] --/|Smart AOE script commands go in the Name field of the token --@smartaoe|[*S:t-name] --^DoorMenu| --:CloseDoor| --#title|[*[&Character]:character_name] - Close Door --#whisper| --#leftsub| --@knock|_push|toggle --^DoorMenu| --:ForceDoor| --#title|[*[&Character]:character_name] - Force Door --#whisper| --#leftsub| --=TrapStatus|[*S:t-bar1_value] --?[$TrapStatus] -eq 1 -or [$TrapStatus] -eq 2|ForcedTrap --=ForceDC|[*S:t-bar3_max] --=ForceRepeat|[$ForceAttempt] * 2 --=ForceCheck|1d20 [Base] + [*[&Character]:athletics] [Athletics] - [$ForceRepeat] [Repeated Attempt] --?[$ForceCheck] -gt [$ForceDC]|ForcedOpen --+Not Quite|[i]With a roll of [$ForceCheck], [*[&Character]:character_name] fails to force this door open. They may try again with a cumuluative -2 penalty.[/i] --=ForceAttempt|[$ForceAttempt] + 1 --^DoorMenu| --:ForcedOpen| --+Success|[i]With a roll of [$ForceCheck], [*[&Character]:character_name] forces this door open.[/i] --!t:[*S:t-id]|bar2_value:0 --@knock|_push|toggle --^DoorMenu| --:ForcedTrap| --+Whoops!|[i]Trying to force the door open, [*[&Character]:character_name] triggers the trap on this door.[/i] --?[$TrapStatus] -eq 2|=Reset;2|=Reset;3 --!t:[*S:t-id]|bar1_value:[$Reset] --/|Smart AOE script commands go in the Name field of the token --@smartaoe|[*S:t-name] --^DoorMenu| }} For the SmartAOE command, just write those into the name field of the token like you would into the card. For example, a 10' radius Explosive Blast Trap would read like: _selectedID|[*S:t-id] _playerID|[&PlayerID] _title|Explosive Blast _leftsub|Trap! _rightsub|DC 20 _radius|10ft _aoetype|PFcircle, float _instant|yes _origin|nearest _forceIntersection|1 _mingridarea|0.25 _fx|burst-fire _dc|20 _saveformula|<<1d20+a{ref}>> _damageformula1|[[4d6]] _damagesaverule|*0.5 _damageType1|fire _bar|1,3 _autoapply|true Let me know if you have any questions or enhancements!