Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sounds to MapTool #615

Closed
Merudo opened this issue Aug 25, 2019 · 89 comments
Closed

Add sounds to MapTool #615

Merudo opened this issue Aug 25, 2019 · 89 comments
Assignees
Labels
feature Adding functionality that adds value macro changes This issue adds or changes macro functions. Extra work is required (testing, wiki, code editor)

Comments

@Merudo
Copy link
Member

Merudo commented Aug 25, 2019

Is your feature request related to a problem? Please describe.
Sounds and music are often requested for MapTool.

I think audio help wonderfully with ambiance, and would be an amazing feature to have.

Describe the solution you'd like
I suggest we expend the build-in sounds for MapTool beyond the current dink.mp3 and clink.mp3. A small library of open source sounds (such as footsteps, doors, rain, etc) would be wonderful, and would not increase the size of the download substantially.

I propose a function, playSound, that can play the build-in sounds on every client on demand.

Eventually, we can augment the function so that it can play files at an arbitrary location. The GM could therefore send a zip files of sounds to players, and play those sounds while playing.

Additional context
We might want to change our sound player to something better once the switch to FX occurs.

However as long as the playSound user function call is carefully defined, we can implement music and sounds now and later change how the sounds work.

Merudo added a commit to Merudo/maptool that referenced this issue Aug 25, 2019
- Add playSound(soundName) function to MapTool
- Currently 3 sounds available: "dink", "clink", and "door"
- Sounds only play on client's computer, but this could be easily changed
- Proof of concept that demonstrates how sounds could be implemented
- First step to fulfill RPTools#615
@Merudo
Copy link
Member Author

Merudo commented Aug 25, 2019

I added a branch that implements three sounds:

[playSound("Dink")]
[playSound("Clink")]
[playSound("Door")]

EDIT: Additionally, local sounds can be played by [playSound(fileName, filePath)], such as

[playSound("music.mp3", "C:/")]

@Phergus Phergus added the feature Adding functionality that adds value label Aug 25, 2019
@JamzTheMan
Copy link
Member

It really wasn't hard to add audio to the asset library (did it once back in Java 1.7 days) and even had a panel to control audio. But I didn't know mt that well or FX 1 and had (I believe now) threading issues.

Otherwise, letting MT recognize .mp3, .ogg, .wav files isn't too much work. It will cache then and transfer them just like images.

The "issue" I had with the design is, I don't want to have to drag and drop each audio onto the map so they can be synced so they can be played.

I think we need to implement streaming (which FX can do) at least as an option, maybe it needs both?

@Phergus
Copy link
Contributor

Phergus commented Aug 25, 2019

Some type of UI to manage sounds will be needed though it might be nice to actually drop them on a map and get an icon that could be used to play a sound. Not everyone wants to use macros and corresponding buttons to do everything.

There also needs to be GUI controls so that players can mute or stop sounds and a way to set volume.

Merudo added a commit to Merudo/maptool that referenced this issue Aug 25, 2019
- Add playSound(soundName) function to MapTool to play local sounds
- Currently 3 sounds available: "dink", "clink", and "door"
- Sounds only play on client's computer, but this could be easily changed
- Add command to play local sounds with playSound(fileName,filePath)
- Example: [playSound("music.mp3", "C:/")], assuming there is a music.mp3 in drive C:
- Proof of concept that demonstrates how sounds could be implemented
- First step to fulfill RPTools#615
@rkathey
Copy link
Contributor

rkathey commented Aug 25, 2019 via email

@dorpond
Copy link

dorpond commented Aug 25, 2019

There was a great discussion and mockups that I once provided, but are no longer there due to technological changes throughout RPTools history, but this could help with ideas:

http://forums.rptools.net/viewtopic.php?t=2417

If anyone can locate the mockups I made in some archive server of sorts, I’d love to see them again!

@Azhrei
Copy link
Member

Azhrei commented Aug 25, 2019

The images come from gallery.rptools.net and I think Craig archived that stuff somewhere; I didn't keep it.

Edit: Tried checking the Wayback Machine and they have the forum archived, but apparently not that specific thread for some reason. I also grabbed the first link in your post and searched for that in the gallery.rptools.net history and didn't find it either (the gallery might've had indexed turned off because of the size of the images).

@JamzTheMan
Copy link
Member

Honestly, we don't need mockups, it's not a UI issue, it's more of a technology and maybe UX issue...

@dorpond
Copy link

dorpond commented Aug 26, 2019

Yeah, probably right. I think the mockup I made for the sound tool, was basically just like lighting, where you would see the 'sound circles' of each sound object on the map, and when you entered the 'circle', you would start to hear the sound faintly, and as your moved closer to the center of the source, the volume would get louder. Of course, stuff like that would be a better fit for 2.0, and simply calling sounds via macro would suffice.

@dorpond
Copy link

dorpond commented Aug 26, 2019

I put a lot of thought into sound in the past, and while I don't have my visuals, I did find my notes. I will post them in here, if for anything, could be an outline for those who wish to think about implementing sound or even making their own sound tool:

  • Scenes (Battle of Evermore)
    o Made up of Events. Each event can be turned on and off individually.
     Music Event: Playlist X
     Loop Event: Wind Blowing
     Single Event: Clock Bell Rings
     Random Event: Thunder Rolling.
     Has a master on/off/pause switch that stops all events that may be playing.
     Upload photo that represents the Scene.

  • Events
    o Made up of Sounds. Can create 1 of the 4 following events:

 Music Event (Battle Music)
• Volume Control.
• Playlist
• Random Play – checkbox
• Delay Start – checkbox: time value
• Fade During Start / Stop – checkbox: fade in value, fade out value
• Pause Between Songs – checkbox: time value
• Fade Between Songs – checkbox: fade in value, fade out value

 Loop Event (Soft Wind Blowing)
• Volume Control
• Balance Control
• File Chooser
• Fade During Start / Stop – checkbox: fade in value, fade out value

 Single Event (Lightning)
• Advanced Volume Control (min and max setting)
• Advanced Balance Control (min and max setting)
• File Chooser
• Stop Another Event – checkbox: event chooser
• Fade During Start / Stop – checkbox: fade in value, fade out value

 Random Event (Rolling Thunder)
• Advanced Volume Control (min and max setting)
• Advanced Balance Control (min and max setting)
• File Chooser
• Delay Start – checkbox: time value
• Repeat Interval - checkbox: random time value between A & B
• Fade During Start / Stop – checkbox: fade in value, fade out value
• Stop Playing After – checkbox: time value (or) number of plays value.

@dorpond
Copy link

dorpond commented Aug 26, 2019

Ambient Sound Mixer.docx

Outline above didn't format well, so here is the Word file. Again, I was designing this to be it's own tool, so...

Merudo added a commit to Merudo/maptool that referenced this issue Aug 26, 2019
- Add playSound(soundName) function to MapTool to play local sounds
- Currently 3 sounds available: "dink", "clink", and "door"
- Sounds only play on client's computer, but this could be easily changed
- Add command to play local sounds with playSound(fileName,filePath)
- Example: [playSound("music.mp3", "C:/")], assuming there is a music.mp3 in drive C:
- Proof of concept that demonstrates how sounds could be implemented
- First step to fulfill RPTools#615
@rkathey
Copy link
Contributor

rkathey commented Aug 26, 2019

Adding a few right-click options to the resource library might be helpful as a beta. Right now there is only 1 option available 'New Map'. I can see

  • New Map - for image assets
  • Get Asset Path - for reference in Macros across all files
  • Play - for sound files

There may be others

@Merudo
Copy link
Member Author

Merudo commented Aug 27, 2019

Thank you for sharing your detailed thoughts on the subject, @dorpond !

I was thinking, maybe some sort of sound table (similar to the image table) would make sense?

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

Perhaps a sound explorer like Jagged’s Drawing Explorer where you could set sound type (ambient, looping, locational, etc.) with the ability to add sounds via file drop from the resource library or the file system.

Players would see the current sound playing and have volume/mute control.

@dorpond
Copy link

dorpond commented Aug 27, 2019

Thank you for sharing your detailed thoughts on the subject, @dorpond !
I was thinking, maybe some sort of sound table (similar to the image table) would make sense?

You're welcome, @Merudo!

It all depends on how elaborate you want to go with it. In my examples above, that was for an independent, full blown, ambient sound mixer tool, but in Maptool we have a few ways to approach sound, and I think each are needed and could be released in waves, if designed correctly:

Wave 1: Trigger via Macros. Easiest to do now, but if used extensively, the user would soon find out that sound control will get unwieldly - for example, imagine 7 loops playing, randoms playing, a musical score playing, and you want to turn off the random blacksmith hammering, or people are complaining about volume, and the DM is scrambling around trying to just stop or adjust things. So, macro control is OK for like the single events, but beyond that, probably not a single source solution for sound.

Wave 2: List of assets, like @rkathey stated, in a draw explorer fashion or library. So let say this is called Sound Explorer; in there we could have a nice list of sounds in the campaign, and next to each sound, we have sound controls, like volume, pan, repeat, etc. In this sound library, we also a master controls, so that we can immediately pause, stop, or adjust the volume of all things currently playing. This makes managing sound easy for the DM.

Wave 3. A visual approach, which is where I would ultimately love to see Maptool go - this is what would make Maptool different than any other media players out there for gaming, because the sound is actually in the environment. We would have an actual sound layer, much like the FOW, VBL, and Drawing layers. We would drop sound files right on the map, and they would act much like real sound in relationship to where the tokens are - move a token closer to that asset, and the volume goes up, and the same would go with panning and what-not, but I could see the panning option being an option because some DM's may not want the players knowing exactly what direction that Dragon is coming from until a roll was made. But just like we can see light auras, the DM could hit a key stroke, or go to the sound tool, to visually see sound auras around the assets on the map, so the DM can easily assess where sound is and how far it radiates out from the source. Also keep in mind, that VBL would probably need to be considered in wave 3, because we wouldn't want sound to go through cave walls, right? :)

But you can see now that even if we are shooting for Wave 3 at the end of the day, Wave 1 and 2 are still needed - we still need a place to see the assets in a list, and to be able to quickly control those sounds if needed, or turn them all off and such, and of course we need to slip them into macros too :)

But that is how I would approach sound, if I had my perfect Maptool. Now keep in mind I have wanted sound in MT since 1.1, so it is exciting to know that someone else wants sound also, but keep in mind that MT 1.X has its limitations (so I've been told), so working the whole wave 3 experience into MT 2.X might be a great goal.

Please feel free to brainstorm with me and ask questions - I have thought long and hard about sound on a usage perspective.

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

Wave 3. A visual approach, which is where I would ultimately love to see Maptool go - this is what would make Maptool different than any other media players out there for gaming, because the sound is actually in the environment. We would have an actual sound layer, much like the FOW, VBL, and Drawing layers. We would drop sound files right on the map, and they would act much like real sound in relationship to where the tokens are - move a token closer to that asset, and the volume goes up, and the same would go with panning and what-not, but I could see the panning option being an option because some DM's may not want the players knowing exactly what direction that Dragon is coming from until a roll was made. But just like we can see light auras, the DM could hit a key stroke, or go to the sound tool, to visually see sound auras around the assets on the map, so the DM can easily assess where sound is and how far it radiates out from the source. Also keep in mind, that VBL would probably need to be considered in wave 3, because we wouldn't want sound to go through cave walls, right? :)

By some miracle, @dorpond and I see eye-to-eye on this one. I was envisioning (enhearing?) much the same functionality for wave 3.

@dorpond
Copy link

dorpond commented Aug 27, 2019

@rkathey That is because Elves don't hear twice as well as humans. Oh wait... No!!!!

LOL. No worries, not going there! I don't want racial and perceptions skills to be any part of this! We are shooting for general ambiance, not "what would MY character hear?", although, I could see some Dorpond-like individual eventually dreaming about doing such a thing, so maybe we should at least consider that far out request, when the code is being written?

You know someone will be asking for it in like MT 2.9... LOL

@JamzTheMan
Copy link
Member

Well, technically to make #3 work it has to be based from some owned token(s) from the client. Don't ask me what it should sound like if they have 5 tokens all over the place.

And you will need to define distance a token can "hear" somewhere (could be a global default) but might as well define that on the token like sight. As Deafness will be a thing now as well.

But ya, I agree with the approach, #1 first.

But still doesn't answer the question. Do you expect to have the audio packed in the campaign file?

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

But still doesn't answer the question. Do you expect to have the audio packed in the campaign file?

My first thought is 'yes' but I would need to know the what the downsides are to having it in the campaign file.

Well, technically to make #3 work it has to be based from some owned token(s) from the client. Don't ask me what it should sound like if they have 5 tokens all over the place.

I would see it much like sight where you hear what the loudest would hear until you select a token then you hear what it hears.

@Azhrei
Copy link
Member

Azhrei commented Aug 27, 2019

It’s mostly a size issue (storing audio in a campaign). The DTS-MA audio for a single track of Avatar is 5GB. That’s about 40MB/minute. Of course, that’s high fidelity and you probably don’t need that for an RPG game. 🙂

I agree on audio working like sight. And ditto for things like an SBL (sound blocking layer) probably copied from the VBL layer, but able to be edited separately, maybe with a percentage number that specified how much the volume of the audio is reduced...

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

If the size is the issue then we may want to access via URL. That URL could be a server-based file if you don't use a web resource.

Better, you export the campaign repository file web site as you do now to improve performance for images.

@JamzTheMan
Copy link
Member

Have any of you guys used audio in there day to day games? In my experience, what I wanted or thought I needed and how I use it end up being a little different.

Static sounds are ok, door creaks, battle sounds (lots of NPC voice packs avail from games like Baldurs gate and NWN work great) and would store just fine.

Music not as much. I have a about 600mb of audio mp3 of music grouped by themes (dramatic, dungeon, city, action, combat, etc) and I would want/need all of that for ambient background music. I'm not storing that in my campaign file. And even at those sizes and collections, it's pretty repetitive and I should double to triple some of those groups.

Then there are the sounds on the spot that we may want. Maybe a dinosaur roar or a rock slide. But I suppose I could drag those to the campaign like an image, but IMO those are one shot and should be streamed...

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

I would likely use the one-shot noises much more often than music but I had a GM who wanted background music playing for ambiance. Most of the use cases I've stated are for the one-shot roars and creaks.

@dorpond
Copy link

dorpond commented Aug 27, 2019

Well, technically to make #3 work it has to be based from some owned token(s) from the client. Don't ask me what it should sound like if they have 5 tokens all over the place.
And you will need to define distance a token can "hear" somewhere (could be a global default) but might as well define that on the token like sight. As Deafness will be a thing now as well.
But ya, I agree with the approach, #1 first.
But still doesn't answer the question. Do you expect to have the audio packed in the campaign file?

All good points, @JamzTheMan

  • Good point about what it would sound like with 5 tokens. How about this for an idea? The DM would specify what the sound is, when it is dropped to the map. Music (battle music) events would have no involvement with token location, but looping, random, and single events would (dragon snoring, near the waterfall). Now, when selecting one or more tokens, it would simply continue to play the last current token playing (Token 1). You obviously own all 3 tokens (thinking player here), so music is playing, you grab your three and move them - sounds didn't change at all. But now you click on Token 2 - I would simply have the Looping, Random, and Single event gradually adjusting to those volumes. The gradual change would make it feel more organic and not suddenly go from soft to loud with everything, sending an ice pick into your forehead..

  • As far as hearing, spells, and other things to damper sound - I personally think this takes the tool and makes it much more complicated and video-gamish than needed. I think the idea here is that the PLAYER feels a little more immersed into the environment, not so much the character we are playing. I mean, does the PLAYER really need to not hear the waterfall and dragon snoring, because their token is in a magical field? Simply telling them they are deaf is good enough, right? It just seems like it will add so much more complexity, for the return we get from it. Or maybe just a token switch of 'No Sound', so all ambience just stops for that token? shrug

  • Packaged into the campaign? I think they would have to be. There is nothing worse than opening a 5 year old file and nothing loads correctly because those assets are no longer found in their original location, and now I have to scramble finding them and put them where they belong for everything to work as-it-once-did. I see that all the time with video editing software and even some older sound mixing apps, and it frustrates me to no end. Don't you think? I see where the concern is though - sound is heavy. I wonder if we should approach music playlists differently? Music playlists would be in the library, as will their files. They are not part of the Wave 3 at all - we don't drop them onto the map, and depending on the mood of the GM, they may want to play different playlists throughout the session, so being in the library makes more sense. In that case, those could all be in the library and executed there somehow - that music wouldn't be saved with the campaign, but ambient sounds would be saved in the campaign. It seems that ambient files are smaller files since they are loops, randoms and singles, whereas during a 4 hour battle campaign, you could easily fly through 48 Music tracks. 48 tracks @ 5Mb each is 240Mb. Yikes! Plus, with music files - those tend to be copywritten, and I don't know if the "worldly laws to be", would be fond of MT suddenly becoming a music sharing app. (oh, look there! I can open up this asset cache folder and wow! Free music!).

But we have to also think of how something like this would work, with Face to Face sessions (raises hand), and remote sessions. Obviously with face to face, all the music would play on the DM's computer only, but with remote play, music would have to be streamed and ambient would be passed along with the campaign file. A simple switch can determine that behavior I suppose...

Great stuff brought to the table with this, guys!

@dorpond
Copy link

dorpond commented Aug 27, 2019

Have any of you guys used audio in there day to day games? In my experience, what I wanted or thought I needed and how I use it end up being a little different.

Yeah, every session. I used to LOVE RPGSoundMixer, but they stopped supporting it at after Windows XP. sad face

So now, I struggle painfully, looking to do the same thing - play random sounds to my parameters, play looping files, and easily execute singles - in a tool that is easily manageable so that it doesn't take away from my narrative. I currently use a recording studio software for that atm, because I am also a musician, but it is painful, to be honest.

As far as music, I agree, there are GB's in my library, and because I play F2F, I just play those playlists, or I go to Youtube, and play some of those playlists up there.

So yeah, I don't even think we would need music in MT at all. I would be 100% satisfied if we only did Randoms, Loops, and Singles. I don't mind spending time to set all that up in the campaign ahead of time, if they just work without me thinking much during the session. Like all things MT :)

@dorpond
Copy link

dorpond commented Aug 27, 2019

This all seems so much easier for F2F games, but once remote play comes into the picture, I sense frustrations due to bandwidth limitations. around here, most services have 2 meg upload speeds - I couldn't imagine having to stream music to all the remote players. All the more reason to abandon Music from this equation, and sticking to Ambience, so that they get packaged and sent with the campaign file. Think?

@rkathey
Copy link
Contributor

rkathey commented Aug 27, 2019

The DM who wanted background music in our remote sessions would simply play it in the room he was gaming from. His mic picked it up and we all heard it.

We should probably have a way to stream music from the server to clients to keep from bloating the Campaign file. I don't see the music as intrinsic to the campaign. Door squeaks and dragon roars are.

Update: After reading the above content I would agree with dropping music.

@rkathey
Copy link
Contributor

rkathey commented Aug 30, 2019

But it doesn't list the audio files each user will be using. As I understand it, Napster's goal was to hook folks up based on available music files.

@JamzTheMan
Copy link
Member

Napster hosted the catalogue of files. Much like NZB sites get in trouble but Usenet servers that do the hosting do not.

Merudo added a commit to Merudo/maptool that referenced this issue Sep 6, 2019
- Add playSound(soundName) function to MapTool to play local sounds
- Currently 3 sounds available: "dink", "clink", and "door"
- Sounds only play on client's computer, but this could be easily changed
- Add command to play local sounds with playSound(fileName,filePath)
- Example: [playSound("music.mp3", "C:/")], assuming there is a music.mp3 in drive C:
- Proof of concept that demonstrates how sounds could be implemented
- First step to fulfill RPTools#615
@Merudo
Copy link
Member Author

Merudo commented Sep 6, 2019

I added playStream(url) and stopStream(url) to stream sounds from an online source.

Example:

[playStream("https://www.fesliyanstudios.com/musicfiles/2019-05-01_-_Undercover_Spy_Agent_-_David_Fesliyan.mp3")]

It works well enough. I quickly realize however how limiting our sound player javazoom is, with basically no feature beside playing and stopping a sound. For example there is currently no way to change the sound level.

Any idea of what a good replacement player might be? Once we decide on something I think I'll have enough to create a PR for playStream and stopStream.

Merudo added a commit to Merudo/maptool that referenced this issue Sep 7, 2019
- Add playSound(soundName) function to MapTool to play local sounds
- Currently 3 sounds available: "dink", "clink", and "door"
- Sounds only play on client's computer, but this could be easily changed
- Add command to play local sounds with playSound(fileName,filePath)
- Example: [playSound("music.mp3", "C:/")], assuming there is a music.mp3 in drive C:
- Proof of concept that demonstrates how sounds could be implemented
- First step to fulfill RPTools#615
@Merudo
Copy link
Member Author

Merudo commented Sep 8, 2019

I implemented playStream() (#667) to play music from a remote server. I'm quite excited about the feature and I'm happy with the implementation in JavaFX.

@Phergus Phergus added the macro changes This issue adds or changes macro functions. Extra work is required (testing, wiki, code editor) label Sep 10, 2019
Merudo added a commit to Merudo/maptool that referenced this issue Sep 10, 2019
- Add optional fadeout (in seconds) before closing a stream
- 0: no fadeout (default)
- Stream will stop once the fadeout period is over
- Suggested by @dorpond in RPTools#615
@Phergus
Copy link
Contributor

Phergus commented Sep 10, 2019

@Merudo Looks like something broke cycleCount in the current code. No longer loops correctly. 2 works but 3 only gives 2, 5 gives 3 and 10 gives 6.
"https://ia601701.us.archive.org/21/items/Laser_201304/laser.mp3"

Edit: Maybe it just doesn't like that one. Others seem to be counted accurately.

@Merudo
Copy link
Member Author

Merudo commented Sep 11, 2019

@Merudo Looks like something broke cycleCount in the current code. No longer loops correctly. 2 works but 3 only gives 2, 5 gives 3 and 10 gives 6.
"https://ia601701.us.archive.org/21/items/Laser_201304/laser.mp3"

Edit: Maybe it just doesn't like that one. Others seem to be counted accurately.

This is really weird. I checked with getStreamProperties and the currentCount goes 0, 1, 2, 4, 6, 8.

EDIT: Looks like a problem with setStopTime.

@Merudo
Copy link
Member Author

Merudo commented Sep 11, 2019

Posted issue on StackOverflow: https://stackoverflow.com/questions/57887596/javafx-mediaplayer-plays-half-as-many-times-it-should-when-setstoptime-is-used

Upvotes would help this getting more attention.

@rkathey
Copy link
Contributor

rkathey commented Sep 11, 2019 via email

@JamzTheMan
Copy link
Member

@Merudo is there a GitHub issue opened for this over at the JavaFX repo? Perhaps that is a better place to garner attention and a fix?

@Merudo
Copy link
Member Author

Merudo commented Sep 11, 2019

I guess this is a bug, isn't it? I will open a bug report.

Merudo added a commit to Merudo/maptool that referenced this issue Sep 11, 2019
- Add back,forward,next,pause,play,previous,record,record_on,repeat,shuffle,shuffle_on, and stop icons
- Move mute & volume icons to correct directory
- Icons will be used for RPTools#615
- Icons provided by @JamzTheMan

Co-Authored-By: Jamz <[email protected]>
@Phergus
Copy link
Contributor

Phergus commented Sep 21, 2019

New playStream, editStream, stopStream and getStreamProperties functions added for 1.5.5 via #667

Moving this issue out of 1.5.5 project and into backlog for further discussion/changes.

JamzTheMan added a commit that referenced this issue Oct 4, 2019
* Fix token ids reset on server start

- Fix so that token ids stay the same after server start
- Add javadocs info for Zone & Campaign constructors
- Close #619

* Fix cut & paste changes token id

- Fix so that Cut & paste doesn't change token id
- Subsequent pastes will result in different token ids
- Close #624

* Fix "paste" option remaining grayed out after Copy/Cut token

- Fix "Paste" menu not getting updated after performing the Copy/Cut action from popup menu
- Close #621

* Fix switching from/to the measure tool not updating cursor right away

- Change how the measurer tool cursor updates, now based on attach/detach instead on paintOverlay
- Fix cursor not updating right away when switching from measurer to pointer
- Fix cursor not updating right away when switching to measurer from label, fog or VBL tool
- Close #601

* Fix bug created by dragging token from library to map

- Fix token having duplicated ids if a cut was followed by dragging token to map then a paste (induced by #625)
- Fix dragging token from library to map not ungraying the "Paste" option (fully completes #630)

* Fix incorrect message for assert() when the second parameter is number

- New message: Second argument to "assert": "{second parameter}" must be of type String
- Close #637

* Translate a few UI elements in french

* Consolidate utility methods for macro functions in FunctionUtil

- New class FunctionUtil to handle checks and type conversions for macro functions
- New internal methods checkNumberParam, getTokenFromParam, paramAsBigDecimal, paramAsBoolean, paramAsInteger, paramAsDouble, paramAsFloat, paramAsJson, paramAsJsonObject and paramAsJsonArray
- Change TokenLightFunctions hasLightSource, clearLights, setLight, and getLights to use these new methods
- Methods tested: checkNumberParam, getTokenFromParam, and paramAsBigDecimal
- First step to solve #613

* Add parameter in FunctionUtil to allow/disallow text to BigDecimal

- Add parameter allowString: if set to false, raises exception when parameter is a string that could be converted to number( ex: "0", "5", etc).

* Change ZoomFunction to use FunctionUtil

- Functions getZoom, setZoom, getViewArea, setViewArea, and getViewCenter now use FunctionUtil
- Fix functions getZoom and setViewArea not displaying errors when given too many parameters
- Fix javadocs errors
- Remove extra delimiter at the end of getViewCenter

* Add translation support for "Select Map" button

- Select Map button (top right of screen) is now properly translated
- Tested for English and French

* Change wrong nb of parameters error messages to display function name

- Change wrong number of parameters error messages to always display name of function
- Builds on RPTools/parser#3 to work
- Close #629

* Change parser implementation to 1.5.4

* Add json.path.read function (based on jayway)

- Function takes a "json" and a "path" argument
- Path should be defined according to https://github.com/json-path/JsonPath
- Support inline predicates
- Errors are printed to chat but not according to our standards
- Progress on #612

* Add error handling for json.path.read

* Add json.path.add, json.path.add/put/set, and json.path.delete functions

- Functions can modify a nested json array
- Path should be defined according to https://github.com/json-path/JsonPath
- Closes #612
- Details:

1. json.path.add(json, path, value) adds an element to a jsonArray at the path
2. json.path.set(json, path, value) sets an element in a jsonArray or jsonObject at the path
3. json.path.put(json, path, key, value) adds or sets an element in a jsonObject at the path
4. json.path.delete(json, path) deletes an element in a jsonArray or jsonObject at the path

* Consolidate methods checkNumberOfParameters and getTokenFromParam

- Replace checkNumberOfParameters by FunctionUtil.checkNumberParam
- Replace getTokenFromParam by FunctionUtil.getTokenFromParam
- Fix #613

* Fix bring to front/send to back need to be done twice

- Add ZOrder sorting of the tokens on the server at the end of bringTokensToFront / sendTokensToBack

* Update build.gradle

compile is deprecated and replaced with implementation

* Fix for ConcurrentModificationException

 * Make partialPaths thread safe and Close #328

Signed-off-by: JamzTheMan <[email protected]>

* Spotless applied

* Add new Server Option for GM to Reveal FoW for Unowned Tokens

 * Closes #665 and Closes #663
 * Added abeille-maptool-forms.jfpr project file to buil-resources

* Add playStream, stopStream, and editStream functions to stream audio

- Add playStream(uri, cycleCount, volume) to play audio from url or local file.
- cycleCount: number of times to play the resource. -1 for infinite loop. Default: 1.
- volume: volume value from 0-1. Default: 1.
- Add stopStream(uri, remove) to stop a stream. If remove is set to 1, unload the stream from memory. Default: 1. If no uri specified, stop all sounds.
- Add editStream(uri, cycleCount, volume) to change the cycleCount or volume of stream.
- Add AppPreference playStreams to enable/disable playing streams
- Ex:

[playStream("https://www.fesliyanstudios.com/musicfiles/2019-05-01_-_Undercover_Spy_Agent_-_David_Fesliyan.mp3", -1, 0.8)]

* Fix disabling streams, and make stream functions thread-safe

- Fix access HashMap to be thread safe (now accessed solely from the JavaFX app single thread)
- Fix so that disabling streams in settings also stops all streams

* Add features to playStream functions

- Move streaming methods to class MediaPlayerAdapter, as discussed in #668
- Add new parameters: startTime and stopTime to playStream & editStream
- playStream with cycleCount 0 preloads the stream but does not play it
- Add function getStreamProperties as suggested in #667
- Add support for volume slider through setGlobalVolume, but the slider needs to be created

* Fix getStreamProperties wrongly returning "PLAYING" , change ms to secs

- Fix getStreamProperties to return status "STOPPED" after song finished playing
- Change parameters startTime and stopTime to take seconds instead of ms

* Add Volume Slider and Mute Button to Toolbar

- Icons provided by @JamzTheMan

Co-Authored-By: Jamz <[email protected]>

* Add "fadeout" parameter to stopStream

- Add optional fadeout (in seconds) before closing a stream
- 0: no fadeout (default)
- Stream will stop once the fadeout period is over
- Suggested by @dorpond in #615

* Add DebounceExecutor, update ZoneRenderer.java to use debounced repaint (#611)

dispatcher.

* Add sound icons to the github directory

- Add back,forward,next,pause,play,previous,record,record_on,repeat,shuffle,shuffle_on, and stop icons
- Move mute & volume icons to correct directory
- Icons will be used for #615
- Icons provided by @JamzTheMan

Co-Authored-By: Jamz <[email protected]>

* Add support for space in uri for stream functions

- Add conversion of string to uri, replacing space into %20
- Add "FILE/:" at the start of uri if it is missing
- Fix issues raised in #667

* Fix PRs automatically failed

- Change to using jitpack for clientserver
- Fix #679

* Fix bug: "*" stop working as path in stopStream, getStreamProperties (#682)

- Add special case so that "*" isn't modified
- Fix regression created by #678
- Fix #681

* Add propertyType option for getTokens(), improve getTokens() (#677)

- Add new option "propertyType" to conditions in getTokens()
- Value can be a single type as string, or an array of types
- Simplify getTokens() code by removing the second loop. Now include/exclude is a filter property ("match")
- Improve performance of getTokens() by trimming the list continuously instead of constantly filtering the list of all tokens
- Close #676

* Json, store "null" "false" and "true" as their revelant java type internally (#672)

* jsonify "null", "true" and "false" into null true and false

* fix null handling, using the library Null object

* jsonify should be static and public

* Change getTokens to be much faster with area option (#686)

- Change so overlap is computed explicitely instead of using A*
- Much better performance
- Solves #683 for "area" but not for "range"

* ImagePanel QOL improvements (#691)

- Request only images in view from ImageManager
- Trigger repaint() from paint-affecting properties only if property
actually changes
- Calculate truncated caption heuristically
- Improve spacing
- Include caption in mouse capture area
- Antialias text
- Use interpolation when rendering scaled images

* Fix Manhattan distance, metric distance parameter with iso maps (#690)

- Fix manhattan distance while moving tokens & in distance functions
- Fix getDistance, getDistanceToXY, getTokens ignoring metric parameter for isometric maps
- Close #688

* Fix json.path functions adding extra / and \ to json objects (#693)

- Fix issue raised in #612

* Resolve #694 -- Fix asset panel scaling (#695)

* #696 Implement dragTheshold in DefaultTool

* Fix NullPointer exception when closing maptool

Fix #700

* Change getDistance to use explicit closed-form

- Improve speed dramatically while using getTokens() with a distance option
- Previous walker-based approach kept as it could be extended to take VBL & terrain into account
- Distance returned tested to be the same as previous code
- Close #683

* Fix two issues from moving token when "Snap Token While Dragging" is off

- Fix token "jumping" to a different spot once Snap-to-Grid is disabled
- Fix getDistance returning incorrect distance with NO_GRID metric
- Close #699

* Fix to getDistanceToXY and getDistance with NO_GRID metric

- Change so that getDistanceToXY and getDistance now calculate the distance from the center of the token when the token is large
- Add new "pixel" parameter to getDistanceToXY. It indicates if the x,y are for a cell or pixel (pixel: false by default)
- pixel false: getDistanceToXY gets the distance from the center of the token to the center of the specified cell
- Close #684

* Fix bug in #699 (#711)

- Fix incorrect boolean check
- Fix missing CellPoint to ZonePoint conversion

* Change volume slider to affect system sounds

- Change system sounds to be affected by volume slider & mute button
- Change system sounds to use JavaFX
- Close #709

* Fix campaign macro changes not received when connecting to server

- Fix so macro changes are now properly updated to the server
- Close #713

* Fix bug introduced by #707 with default metrics

- Fix bug where the default metric is the user's preferred one instead of the server's.
- Function affected: getDistance, getDistanceToXY, getTokens
- Fix issue mentioned in #684

* Add option "gm-self", "self", & "all" to broadcast

Close #718

* Fix getViewArea and getViewCenter returning incorrect pixels

- Change so getViewArea and getViewCenter return the actual pixels as used in setViewArea, for example.
- Close #724

Co-Authored-By: Phergus <[email protected]>

* Add parameter "players" and "delim" to execLink (#721)

- Add new parameter "players" to execLink. All players specified will have the macro run for them. Default: self.
- The parameter "players" can be a string, a list, or json array. Use new delim parameter for list or array (defaults to ",").
- execLink also accepts "gm", "gm-self", "self", "all", and "none".
- Close #716

* Add scrolling to Select Map menu (#723)

- Add new class "JScrollPopupMenu" to handle scrolling
- Class is fully functional but not complete.  Other methods relying on indexes of the components should be reimplemented before they are used
- Maximum of maps displayed at a time: 20 (scrolling will reveal them all)
- Close #356

* Add function json.toVars to turn jsonObject into variables

- keys become variable names
- values become the content of the variables
- Close #591

* Improvement to json.toVars

- Change: parameter "suffixed" is now replaced by "prefix" and "suffix", which can add a prefix and/or suffix to the names.
- Change: spaces in keys are now turned into underscore
- Change: characters not alpha-numerical other than "." and "_" are deleted from var names
- Change: function now return a JSONArray with the variable names

* Fix javadocs errors

- Fix javadocs errors; it's now possible to generate the full javaDocs
- No actual code changed
- Warnings still present, but the errors should be fixed
- Close #731

* Update ChangeLog for 1.5.5 release (#736)

First pass.

* More updates to ChangeLog plus updated credits. (#737)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue #735

* Changed getInfo("server") macro to use ServerPolicy.toJSON directly (#738)

Updated getInfo("server") macro function to pull JSON object from ServerPolicy instead of having duplicated code.
Updated ServerPolicy.toJSON() to include isAutoRevealMovement and isUseIndividualFOW.

* Junit tests for Json function (#741)

* jsonify "null", "true" and "false" into null true and false

* fix null handling, using the library Null object

* jsonify should be static and public

* json unitary tests

* use a resource fiel for json rather that constructed within the test code

* spotless on json tests

* Updated with Issue #670 (#743)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue #735

* Add missing issue 670

Updated with issue 670.

* Update parser to 1.5.5

Removed self dependency in Parser project.

* Update build.gradle to pull dicelib v1.5.5 (#749)

build.gradle updated to pull in dicelib v1.5.5
Completes issue #746.

* Closes #751

Due to how the uberJar is packaged, we need to register JAI imageIO for jpeg2000
The same fix was applied to TokenTool for the same issue.

Signed-off-by: JamzTheMan <[email protected]>

* Updates to Change Log and Credits (#754)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue #735

* Add missing issue 670

Updated with issue 670.

* Update ChangeLog and Credits

Updated Change Log for issues 731, 746 & 751.  Updated MapTool credits  with recent contributor and missing `</td>` tags.
BearFather added a commit to BearFather/maptool that referenced this issue Nov 16, 2019
* Spotless applied

* Add new Server Option for GM to Reveal FoW for Unowned Tokens

 * Closes RPTools#665 and Closes RPTools#663
 * Added abeille-maptool-forms.jfpr project file to buil-resources

* Add playStream, stopStream, and editStream functions to stream audio

- Add playStream(uri, cycleCount, volume) to play audio from url or local file.
- cycleCount: number of times to play the resource. -1 for infinite loop. Default: 1.
- volume: volume value from 0-1. Default: 1.
- Add stopStream(uri, remove) to stop a stream. If remove is set to 1, unload the stream from memory. Default: 1. If no uri specified, stop all sounds.
- Add editStream(uri, cycleCount, volume) to change the cycleCount or volume of stream.
- Add AppPreference playStreams to enable/disable playing streams
- Ex:

[playStream("https://www.fesliyanstudios.com/musicfiles/2019-05-01_-_Undercover_Spy_Agent_-_David_Fesliyan.mp3", -1, 0.8)]

* Fix disabling streams, and make stream functions thread-safe

- Fix access HashMap to be thread safe (now accessed solely from the JavaFX app single thread)
- Fix so that disabling streams in settings also stops all streams

* Add features to playStream functions

- Move streaming methods to class MediaPlayerAdapter, as discussed in RPTools#668
- Add new parameters: startTime and stopTime to playStream & editStream
- playStream with cycleCount 0 preloads the stream but does not play it
- Add function getStreamProperties as suggested in RPTools#667
- Add support for volume slider through setGlobalVolume, but the slider needs to be created

* Fix getStreamProperties wrongly returning "PLAYING" , change ms to secs

- Fix getStreamProperties to return status "STOPPED" after song finished playing
- Change parameters startTime and stopTime to take seconds instead of ms

* Add Volume Slider and Mute Button to Toolbar

- Icons provided by @JamzTheMan

Co-Authored-By: Jamz <[email protected]>

* Add "fadeout" parameter to stopStream

- Add optional fadeout (in seconds) before closing a stream
- 0: no fadeout (default)
- Stream will stop once the fadeout period is over
- Suggested by @dorpond in RPTools#615

* Add DebounceExecutor, update ZoneRenderer.java to use debounced repaint (RPTools#611)

dispatcher.

* Add sound icons to the github directory

- Add back,forward,next,pause,play,previous,record,record_on,repeat,shuffle,shuffle_on, and stop icons
- Move mute & volume icons to correct directory
- Icons will be used for RPTools#615
- Icons provided by @JamzTheMan

Co-Authored-By: Jamz <[email protected]>

* Add support for space in uri for stream functions

- Add conversion of string to uri, replacing space into %20
- Add "FILE/:" at the start of uri if it is missing
- Fix issues raised in RPTools#667

* Fix PRs automatically failed

- Change to using jitpack for clientserver
- Fix RPTools#679

* Fix bug: "*" stop working as path in stopStream, getStreamProperties (RPTools#682)

- Add special case so that "*" isn't modified
- Fix regression created by RPTools#678
- Fix RPTools#681

* Add propertyType option for getTokens(), improve getTokens() (RPTools#677)

- Add new option "propertyType" to conditions in getTokens()
- Value can be a single type as string, or an array of types
- Simplify getTokens() code by removing the second loop. Now include/exclude is a filter property ("match")
- Improve performance of getTokens() by trimming the list continuously instead of constantly filtering the list of all tokens
- Close RPTools#676

* Json, store "null" "false" and "true" as their revelant java type internally (RPTools#672)

* jsonify "null", "true" and "false" into null true and false

* fix null handling, using the library Null object

* jsonify should be static and public

* Change getTokens to be much faster with area option (RPTools#686)

- Change so overlap is computed explicitely instead of using A*
- Much better performance
- Solves RPTools#683 for "area" but not for "range"

* ImagePanel QOL improvements (RPTools#691)

- Request only images in view from ImageManager
- Trigger repaint() from paint-affecting properties only if property
actually changes
- Calculate truncated caption heuristically
- Improve spacing
- Include caption in mouse capture area
- Antialias text
- Use interpolation when rendering scaled images

* Fix Manhattan distance, metric distance parameter with iso maps (RPTools#690)

- Fix manhattan distance while moving tokens & in distance functions
- Fix getDistance, getDistanceToXY, getTokens ignoring metric parameter for isometric maps
- Close RPTools#688

* Fix json.path functions adding extra / and \ to json objects (RPTools#693)

- Fix issue raised in RPTools#612

* Resolve RPTools#694 -- Fix asset panel scaling (RPTools#695)

* RPTools#696 Implement dragTheshold in DefaultTool

* Fix NullPointer exception when closing maptool

Fix RPTools#700

* Change getDistance to use explicit closed-form

- Improve speed dramatically while using getTokens() with a distance option
- Previous walker-based approach kept as it could be extended to take VBL & terrain into account
- Distance returned tested to be the same as previous code
- Close RPTools#683

* Fix two issues from moving token when "Snap Token While Dragging" is off

- Fix token "jumping" to a different spot once Snap-to-Grid is disabled
- Fix getDistance returning incorrect distance with NO_GRID metric
- Close RPTools#699

* Fix to getDistanceToXY and getDistance with NO_GRID metric

- Change so that getDistanceToXY and getDistance now calculate the distance from the center of the token when the token is large
- Add new "pixel" parameter to getDistanceToXY. It indicates if the x,y are for a cell or pixel (pixel: false by default)
- pixel false: getDistanceToXY gets the distance from the center of the token to the center of the specified cell
- Close RPTools#684

* Fix bug in RPTools#699 (RPTools#711)

- Fix incorrect boolean check
- Fix missing CellPoint to ZonePoint conversion

* Change volume slider to affect system sounds

- Change system sounds to be affected by volume slider & mute button
- Change system sounds to use JavaFX
- Close RPTools#709

* Fix campaign macro changes not received when connecting to server

- Fix so macro changes are now properly updated to the server
- Close RPTools#713

* Fix bug introduced by RPTools#707 with default metrics

- Fix bug where the default metric is the user's preferred one instead of the server's.
- Function affected: getDistance, getDistanceToXY, getTokens
- Fix issue mentioned in RPTools#684

* Add option "gm-self", "self", & "all" to broadcast

Close RPTools#718

* Fix getViewArea and getViewCenter returning incorrect pixels

- Change so getViewArea and getViewCenter return the actual pixels as used in setViewArea, for example.
- Close RPTools#724

Co-Authored-By: Phergus <[email protected]>

* Add parameter "players" and "delim" to execLink (RPTools#721)

- Add new parameter "players" to execLink. All players specified will have the macro run for them. Default: self.
- The parameter "players" can be a string, a list, or json array. Use new delim parameter for list or array (defaults to ",").
- execLink also accepts "gm", "gm-self", "self", "all", and "none".
- Close RPTools#716

* Add scrolling to Select Map menu (RPTools#723)

- Add new class "JScrollPopupMenu" to handle scrolling
- Class is fully functional but not complete.  Other methods relying on indexes of the components should be reimplemented before they are used
- Maximum of maps displayed at a time: 20 (scrolling will reveal them all)
- Close RPTools#356

* Add function json.toVars to turn jsonObject into variables

- keys become variable names
- values become the content of the variables
- Close RPTools#591

* Improvement to json.toVars

- Change: parameter "suffixed" is now replaced by "prefix" and "suffix", which can add a prefix and/or suffix to the names.
- Change: spaces in keys are now turned into underscore
- Change: characters not alpha-numerical other than "." and "_" are deleted from var names
- Change: function now return a JSONArray with the variable names

* Fix javadocs errors

- Fix javadocs errors; it's now possible to generate the full javaDocs
- No actual code changed
- Warnings still present, but the errors should be fixed
- Close RPTools#731

* Update ChangeLog for 1.5.5 release (RPTools#736)

First pass.

* More updates to ChangeLog plus updated credits. (RPTools#737)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue RPTools#735

* Changed getInfo("server") macro to use ServerPolicy.toJSON directly (RPTools#738)

Updated getInfo("server") macro function to pull JSON object from ServerPolicy instead of having duplicated code.
Updated ServerPolicy.toJSON() to include isAutoRevealMovement and isUseIndividualFOW.

* Junit tests for Json function (RPTools#741)

* jsonify "null", "true" and "false" into null true and false

* fix null handling, using the library Null object

* jsonify should be static and public

* json unitary tests

* use a resource fiel for json rather that constructed within the test code

* spotless on json tests

* Updated with Issue RPTools#670 (RPTools#743)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue RPTools#735

* Add missing issue 670

Updated with issue 670.

* Update parser to 1.5.5

Removed self dependency in Parser project.

* Update build.gradle to pull dicelib v1.5.5 (RPTools#749)

build.gradle updated to pull in dicelib v1.5.5
Completes issue RPTools#746.

* Closes RPTools#751

Due to how the uberJar is packaged, we need to register JAI imageIO for jpeg2000
The same fix was applied to TokenTool for the same issue.

Signed-off-by: JamzTheMan <[email protected]>

* Updates to Change Log and Credits (RPTools#754)

* Update ChangeLog for 1.5.5 release

First pass.

* Fix ChangeLog and update credits.html

Fixed typos and missing linkage in ChangeLog.
Updated credits.html file.

Issue RPTools#735

* Add missing issue 670

Updated with issue 670.

* Update ChangeLog and Credits

Updated Change Log for issues 731, 746 & 751.  Updated MapTool credits  with recent contributor and missing `</td>` tags.

* Fix prompt to "update" to old version when on pre-release (RPTools#757)

* Fix prompt to "update" to old release when on pre-release

- Fix so that a release candidate / alpha / beta no longer gives prompt to "update" to an older release
- Change: users on a pre-release now get a prompt to update to the newest version, such as a newer release candidate
- No change for those on releases
- Close RPTools#627

* Change pre-release detection to use github API

- Change so that pre-release status is detected by parsing the json of all releases and finding the one corresponding to the commit SHA

* blah

* Add Panel for GM macros

- Add a new panel to hold GM macros
- Macros in this panel are only visible to GMs
- Campaign panel left as-is
- Close RPTools#642

* Remove putTokens in macro functions

- Change so that many token functions now only update the relevant information instead of sending the whole token
- Close RPTools#761
- Function affected: addToInitiative, setInitiative, setInitiativeHold, setBar, setBarVisible, setName, setGMName, setHalo, setTokenOpacity, setImageAsset, setPortraitImage, setCharsheetImage, setLabel, resetProperty, setTerrainModifier, setVisible, setOwnerOnlyVisible, setAlwaysVisible, setTokenVBL

* Fix copyToken so copy can be modified in the same macro

- Fix: tokens created by copyToken no longer have their changes reverted at the end of the macro
- Exception: z order is reverted at end of macro
- Fix RPTools#769

* Add "light" option to getTokens and getTokenNames

- light option can be a JSONObject with "value", "category" and "name" fields
- value can be a 0 or a 1, determining if the tokens need to have a light or not
- category and name determine what type of lights the tokens need to have (or not, if value is 0)
- light can also be a 1 or 0 instead of a JSONObject, in which case all tokens with a light (or no lights) are returned
- Close RPTools#745

* Fix json.path.read returning bad JSON object from array

- Change json provider from JsonSmart to Gson
- Close RPTools#775

* Add options not-gm, not-self, and not-gm-self to broadcast

- Close RPTools#782

* Add json.toVars support for JSONArrays

- Change json.toVars to take the elements of a JSONArray and put them into a variable, using the method

json.toVars(jsonArray, variablePrefix)

- Variables will take the names variablePrefix0, variablePrefix1, ...
- Close RPTools#784

* Fix bar functions returning wrong values if bar not defined

- Change to throw exception if the name of the bar is not valid
- Change getBar to return an empty string instead of a null if the bar is defined but isn't visible
- Close RPTools#786

* Release 1.5.6 (RPTools#777)

* Emergency fix for NPE on Mac OS (RPTools#765)

* Update Change Log for 1.5.6

Added notes for 1.5.6 release.

* Added noise rendering to background textures

* Ability to add noise to background tiled textures

* Spoltess apply

* ignore .gradletasknamecache

* removed .gradletasknamecache

* removed unwated files

* Background texture noise (RPTools#791)

* blah

* Added noise rendering to background textures

* Ability to add noise to background tiled textures

* Spoltess apply

* ignore .gradletasknamecache

* removed .gradletasknamecache

* removed unwated files

* Added ability to turn off noise and comments

* Redraw background when noise toggled

* Renamed DrableNoise to make it clearer it doesnt subclass Pant

* Add preferences setting for frame rate cap used in debouncer

Preference setting Frame Rate Cap added for the debouncer. Default of 60 fps.  Issue RPTools#767

* Fix broken smileys

- Remove \b (word boundary) in regular expression as it doesn't work with non-word characters such as smileys
- Add negative lookbehind/ahead instead to prevent unwanted characters near smileys
- Only space, tab, and newline are allowed before/after smiley
- Close RPTools#529

* Update CHANGE_LOG.md

First pass on updating change log for 1.5.7 release.

* Update TaskBarFlasher.java

Chat notification flash now determines the flash color based on the brightness level of the task bar.  This will improve visibility on different color schemes.  Issue RPTools#804.

* Fix getStreamProps() returning malformed JSON

- Remove incorrect space in front of getStreamProperties values
- Close RPTools#803

* Update TaskBarFlasher.java

Spotless pass.

* Update CHANGE_LOG.md

More updates 800, 803, 804

* Add token & mapname parameters to getTokenStates

- New token parameter: if specified, getTokenStates returns the list of all states of the specified group that are enabled on the token
- Set group to "*" to get all states of the token
- If no token parameter specified, the function returns the list of all campaign states
- Close RPTools#801

* Fix Incorrect tooltip for Show Chat Notification Background

- Change tooltip to "If enabled, shows a background frame underneath the typing notification."
- Change name to "Typing Notification Background"
- Close RPTools#800

* Update CHANGE_LOG.md

Missed linkage for 800.

* Fix getTokenStates returning wrong list of states

- Fix issue disclosed by @Phergus in PR RPTools#809

* Add execFunction : functions can now be ran on clients

- Add execFunction(functionName,args,defer, targets, delim)
- args is a json array containing the arguments to the function
- defer, targets and delim work as in execLink
- Close RPTools#790

* Fix exception when copyToken is used

- Fix updates x, y, layer, tokenImage, portraitImage, & handoutImage so they no longer throw an exception
- Close RPTools#814

* Update CHANGE_LOG.md

Typo fixed.

Co-Authored-By: Guillaume F. <[email protected]>

* Update CHANGE_LOG.md

Typos, missing links and other tweaks.

* Change copyToken options to tokenHandout, tokenPortrait

- Change handoutImage update field to tokenHandout
- Change portraitImage update field to tokenPortrait
- Legacy: old values still work
- Fix null pointer exception to propert error message if the image token cannot be found
- Solve issues raised by @Phergus in RPTools#814

* Updating code style and guidelines

First past at incorporating updates and changes per issue RPTools#813.

* More updates

Dumped the ambiguous rule 3.
Allowed some slack on rule 2.

* Update CHANGE_LOG.md

Added issue RPTools#814 and changed list markers to dashes.

* Fix NPE thrown in MapToolFrame

Fixes issue RPTools#740.  ImagePanel getImageIDAt() wasn't checking return value of getIndex().

* Fix for issue RPTools#687

For Table functions `addTableEntry`, `createTable`,  `setTableImage` and `setTableEntry`,  passing an empty AssetID string will no longer apply the bad "Asset://" string to the relevant image entry.  Also fixed: getTableImage() was throwing an NPE if no table image was set.

* Update LookupTableFunction.java

spotlessApply pass

* Fix execLink / execFunction not running locally immediately

- Change so execLink / execFunction are ran immediately for the current player when defer is set to 0.
- Add target options "not-self", "not-gm", and "not-gm-self".
- Fix RPTools#820

* Add playClip, stopClip and getClipProperties functions

- playClip works much like playStream, but preloads the decompresssed sound in memory. This leads to better performances for short sounds.
- playCount of 0: preload the sound
- clips are "fire and forget", and can't be edited once played
- The same clip can be played multiple times simultaneously
- Close RPTools#810

* Change stopStream/getStreamProperties to work with clips

- Change names of stopStream and getStreamProperties to stopSound and getSoundProperties. The new functions work with both streams and clips.
- Add function "defineAudioSource". You can now define a nickname for an audio file, with defineAudioSource(nickname, uri).
- Add already included sounds Dink and Clink as defined audio sources. They can now be played with playClip("Dink") and playClip("Clink")
- Resolve issues discussed in RPTools#810

* Update CHANGE_LOG.md

Added issues 687, 740, 790, 810.

* Fix stream / clip issues

- Change so that playClip / playStream have their default parameter values be those used during the previous play of the clip/stream, or the values changed by editStream
- Add parameter "preload" to defineAudioSource. If set to "stream", preload the sound as stream; if set to "clip", preload the sound as clip.
- Add parameters to defineAudioSource: cycleCount, volume, start and stop. These parameters will be used as default until they are replaced by using playStream/playClip
- Add list of nicknames to getSoundProperties
- Internal change: start and stop are now defined in seconds everywhere
- Fix issues discussed in RPTools#810 and RPTools#822

* Fix incorrect Campaign Name in Title Bar for clients

- Fix so clients see the proper campaign name instead of the name of the last campaign file they loaded
- Close RPTools#788

* Update CHANGE_LOG.md

Add 788, 820, 822

* Added titleCase() macro function

* spotless apply

* Bump sentry from 1.7.5 to 1.7.28

Bumps sentry from 1.7.5 to 1.7.28.

Signed-off-by: dependabot-preview[bot] <[email protected]>

* Bump commons-net from 3.2 to 3.6

Bumps commons-net from 3.2 to 3.6.

Signed-off-by: dependabot-preview[bot] <[email protected]>

* Bump autocomplete from 3.0.0 to 3.0.2

Bumps [autocomplete](https://github.com/bobbylight/AutoComplete) from 3.0.0 to 3.0.2.
- [Release notes](https://github.com/bobbylight/AutoComplete/releases)
- [Commits](bobbylight/AutoComplete@3.0.0...3.0.2)

Signed-off-by: dependabot-preview[bot] <[email protected]>

* Bump gson from 2.8.5 to 2.8.6

Bumps [gson](https://github.com/google/gson) from 2.8.5 to 2.8.6.
- [Release notes](https://github.com/google/gson/releases)
- [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md)
- [Commits](google/gson@gson-parent-2.8.5...gson-parent-2.8.6)

Signed-off-by: dependabot-preview[bot] <[email protected]>

* Bump xstream from 1.4.9 to 1.4.11.1

Bumps [xstream](https://github.com/x-stream/xstream) from 1.4.9 to 1.4.11.1.
- [Release notes](https://github.com/x-stream/xstream/releases)
- [Commits](https://github.com/x-stream/xstream/commits)

Signed-off-by: dependabot-preview[bot] <[email protected]>

* renamed titleCase to capitalize

* Revert "Bump xstream from 1.4.9 to 1.4.11.1"

* Revert "Bump commons-net from 3.2 to 3.6"

* Update ServerPolicy.java (RPTools#847)

Set "hosting server" JSON returned by `toJSON()` to BigDecimal instead of Boolean for consistency with other settings and compatibility with parser.

* Closes RPTools#848

Add missing "file sync directory" to client info.develop.

Documentation/Wiki should be updated to reflect changes. *Side note: file sync directory preference technically can be ANY directory on the users system. It's used internally for HeroLab portfolio linking and but can be used for other uses such as streaming audio or exportData macro's*

Signed-off-by: JamzTheMan <[email protected]>

* Closes RPTools#850 - Add log.trace to log macro group

Add log.trace(message) to macro function log group.

Signed-off-by: JamzTheMan <[email protected]>

* Revert "Bump gson from 2.8.5 to 2.8.6" (RPTools#853)

* Revert "Bump sentry from 1.7.5 to 1.7.28" (RPTools#854)

* Added lastest commits. (RPTools#852)

Added 829, 846, 848 and 850.

* Workaround for RPTools#640 Error which would (previously) cause a bunch of scary errors to appear due to a bug in the jdk when using three monitors.

* Updated changelog

* Updated comments

* Add mapname parameter to getTokens and getTokenNames

- Add optional mapname parameters (defaults to current map)
- Add error message for incorrect number of parameters for FindToken functions
- Close RPTools#867

* Change getTokens "mapName" parameter to condition

- Change so that getTokens/getTokenNames parameter "mapName" added by RPTools#868 is instead specified as a condition
- Discussed in RPTools#867

* Add metadata to getMacroProps function, fixes RPTools#872

Signed-off-by: JamzTheMan <[email protected]>

* Changed REST.delete to follow post, patch, put format, fixes RPTools#874

It now accepts body/payload.

This changes the signature of the macro a bit so Wiki update is needed as it no long follows REST.get signature.
This fixes an issue where some API's (like GitHub API) require data to be posted in the body.

Signed-off-by: JamzTheMan <[email protected]>

* Add metadata to getMacroProps function, fixes RPTools#872

Signed-off-by: JamzTheMan <[email protected]>

* Applied Google Code Formatting

Signed-off-by: Lee Foster <[email protected]>

* Update CHANGE_LOG.md (RPTools#876)

Added RPTools#872, RPTools#874.

* Adds ISO Formatted time with UTC offset

Signed-off-by: JamzTheMan <[email protected]>

* Fix for strings being returned with quotes (RPTools#881)

Fixes RPTools#775.  Strings were being returned with quotes.

* Work around JDK bug https://bugs.openjdk.java.net/browse/JDK-8208712

* Add fix for introduced NPE on quit using accel key

* Phergus change log patch 3 (RPTools#889)

* Update CHANGE_LOG.md

* Update CHANGE_LOG.md

Added info on 831 and 883.  Cleanup.

* Fix for RPTools#831 - numbers being returned as strings. (RPTools#888)

* Fix for RPTools#831 - numbers being returned as strings.

json.path.read() was returning numbers as strings.  Fixed.

* Forgot to run spotless

Gotta have that space in there. lol

* Update Crowdin configuration file

* Added badge for localization.
@Phergus Phergus closed this as completed Jun 20, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Adding functionality that adds value macro changes This issue adds or changes macro functions. Extra work is required (testing, wiki, code editor)
Projects
None yet
Development

No branches or pull requests

7 participants