Closed Captions / Subtitles for Vintage Story.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Refactor ChannelGuides into a general caption metadata system.

We're gonna need a bigger boat.

+897 -376
.DS_Store

This is a binary file and will not be displayed.

+50 -49
ClosedCaptions/Caption.cs
··· 1 1 using System.Collections.Generic; 2 + using System.Diagnostics; 3 + using System.Linq; 2 4 using System.Reflection; 3 5 using Vintagestory.API.Client; 4 6 using Vintagestory.API.Config; 5 7 using Vintagestory.API.MathTools; 6 - using Channel = (string Name, int Priority); 7 8 8 9 namespace ClosedCaptions; 9 10 10 11 public class Caption 11 12 { 12 13 private const double AudibilityThreshold = 0.1; 13 - private static CaptionsChannelGuide _channelGuide; 14 + private static Dictionary<string, LoadedCaptionData> _metadata; 14 15 private static ICoreClientAPI _api; 15 16 private static Queue<ILoadedSound> _activeSounds; 16 17 public static List<Caption> Captions = []; ··· 18 19 public static void Initialize(ICoreClientAPI api) 19 20 { 20 21 _api = api; 21 - 22 - _channelGuide = new CaptionsChannelGuide(api); 22 + 23 + ReloadMetadata(); 23 24 24 25 var field = api.World.GetType().GetField("ActiveSounds", BindingFlags.NonPublic | BindingFlags.Instance); 25 26 _activeSounds = (Queue<ILoadedSound>)field?.GetValue(api.World); 26 27 } 28 + 29 + // Reloads caption metadata from assets. 30 + public static void ReloadMetadata() 31 + { 32 + var dataFiles = _api.World.AssetManager.GetMany<Dictionary<string, LoadedCaptionData>>(_api.Logger, "captions/"); 33 + _metadata = new Dictionary<string, LoadedCaptionData>(); 34 + foreach (var dataFile in dataFiles) 35 + dataFile.Value.ToList().ForEach(i => _metadata[i.Key] = i.Value); 36 + } 37 + 38 + private static LoadedCaptionData GetData(string id) 39 + { 40 + return _metadata.GetValueOrDefault(id) ?? new LoadedCaptionData(); 41 + } 27 42 28 43 // Synchronizes the internal caption list with the currently active sounds. 29 44 public static void SyncCaptions() ··· 57 72 58 73 // Unnamed sounds use ID as fallback. 59 74 var name = Lang.GetIfExists("captions:" + id) ?? id; 60 - if (name == "") return; // Ignore empty stringed sounds. 61 - 62 - var alertLevel = AlertLevel.Normal; 63 - if (name.StartsWith('?')) name = name[1..]; 64 - if (name.StartsWith('!')) 65 - { 66 - name = name[1..]; 67 - alertLevel = AlertLevel.Warning; 68 - } 69 - if (name.StartsWith('+')) 70 - { 71 - name = name[1..]; 72 - alertLevel = AlertLevel.Notice; 73 - } 74 - if (name.StartsWith('~')) 75 - { 76 - name = name[1..]; 77 - alertLevel = AlertLevel.Environmental; 78 - } 75 + if (name == "") return; // Ignore empty-stringed sounds. 79 76 80 77 var position = sound.Position; 81 78 var dist = 0.0f; ··· 91 88 // Ignore sounds that are out of earshot. 92 89 var audibility = (1 - (dist / sound.Range)) * sound.Volume; 93 90 if (audibility < AudibilityThreshold) return; 94 - 95 - 96 - var channel = _channelGuide.GetChannel(id); 97 - channel.Name ??= name; 91 + 92 + // Ignore configured tags. 93 + var captionData = GetData(id); 94 + foreach (var ignoredTag in CaptionsSystem.Config.IgnoredTags) 95 + { 96 + if (captionData.Tags?.Contains(ignoredTag) ?? false) 97 + return; 98 + } 99 + 98 100 AddCaption(new Caption 99 101 { 102 + Name = name, 103 + Channel = captionData.Channel ?? name, 104 + Priority = captionData.Priority, 105 + Tags = captionData.Tags, 100 106 LastHeard = _api.ElapsedMilliseconds, 101 - Name = name, 102 - Channel = channel, 103 107 Position = sound.Position, 104 108 Audibility = audibility, 105 - AlertLevel = alertLevel 106 109 }); 107 110 } 108 111 109 112 private static void AddCaption(Caption newCaption) 110 113 { 111 114 // Refresh existing slot if it's already present. 112 - foreach (var oldCaption in Captions) 115 + for (var i = 0; i < Captions.Count; i++) //var oldCaption in Captions) 113 116 { 117 + var oldCaption = Captions[i]; 118 + 114 119 // Only update this caption if it has the same name or if it's on the same channel. 115 - if (oldCaption.Name != newCaption.Name && oldCaption.Channel.Name != newCaption.Channel.Name) continue; 120 + if (oldCaption.Name != newCaption.Name && oldCaption.Channel != newCaption.Channel) 121 + continue; 122 + 116 123 oldCaption.LastHeard = newCaption.LastHeard; 117 124 118 - if (newCaption.Channel.Priority < oldCaption.Channel.Priority || 119 - (newCaption.Channel.Priority == oldCaption.Channel.Priority && newCaption.Audibility > oldCaption.Audibility)) 125 + // If this caption has a higher priority, or the same priority but is louder, replace it. 126 + if (newCaption.Priority > oldCaption.Priority || 127 + (newCaption.Priority == oldCaption.Priority && newCaption.Audibility > oldCaption.Audibility)) 120 128 { 121 - oldCaption.Name = newCaption.Name; 122 - oldCaption.Channel = newCaption.Channel; 123 - oldCaption.Position = newCaption.Position; 124 - oldCaption.Audibility = newCaption.Audibility; 125 - oldCaption.AlertLevel = newCaption.AlertLevel; 129 + Captions[i] = newCaption; 126 130 } 127 131 128 132 return; 129 133 } 134 + 135 + _api.Logger.Debug("[CAPTION] New caption: " + newCaption.Name + " in channel " + newCaption.Channel + " with tags " + string.Join(", ", newCaption.Tags)); 130 136 131 137 // No existing caption, add a new one. 132 138 Captions.Add(newCaption); ··· 135 141 public long LastHeard; 136 142 public double Age => (_api.ElapsedMilliseconds-LastHeard) / 1000.0; 137 143 public string Name; 138 - public Channel Channel; 144 + public string Channel = null; 145 + public int Priority = 1; 146 + public List<string> Tags = []; 139 147 public Vec3f Position; 140 148 public float Audibility; 141 - public AlertLevel AlertLevel = AlertLevel.Normal; 142 - } 143 - 144 - public enum AlertLevel 145 - { 146 - Environmental, 147 - Normal, 148 - Notice, 149 - Warning 149 + 150 + public bool HasTag(string tag) => Tags?.Contains(tag) ?? false; 150 151 }
-30
ClosedCaptions/CaptionsChannelGuide.cs
··· 1 - using System.Collections.Generic; 2 - using Vintagestory.API.Common; 3 - using System.Linq; 4 - using Channel = (string Name, int Priority); 5 - 6 - namespace ClosedCaptions; 7 - 8 - public class CaptionsChannelGuide 9 - { 10 - private Dictionary<string, Channel> _channels; 11 - private ICoreAPI _api; 12 - public CaptionsChannelGuide(ICoreAPI api) 13 - { 14 - _api = api; 15 - ReloadChannels(); 16 - } 17 - public void ReloadChannels() 18 - { 19 - var guides = _api.World.AssetManager.GetMany<Dictionary<string, Channel>>(_api.Logger, "channelguides/"); 20 - _channels = new Dictionary<string, Channel>(); 21 - foreach (var g in guides) 22 - { 23 - g.Value.ToList().ForEach(c => _channels[c.Key] = c.Value); 24 - } 25 - } 26 - public Channel GetChannel(string id) 27 - { 28 - return _channels.GetValueOrDefault(id); 29 - } 30 - }
+4 -1
ClosedCaptions/CaptionsConfig.cs
··· 1 + using System.Collections.Generic; 1 2 using System.ComponentModel; 2 3 using System.ComponentModel.DataAnnotations; 3 4 using Vintagestory.API.Client; ··· 11 12 public bool ShowSymbols = false; 12 13 [Description("Make warnings use a bright background with dark text.")] 13 14 public bool InvertedWarnings = false; 15 + [Description("Which types of captions to ignore. Normal tags are \"player\", \"ambient\", \"warning\", and \"notice\".")] 16 + public List<string> IgnoredTags = []; 14 17 [Description("How long to persist captions after the sound stops.")] 15 18 [Range(0, 10)] 16 19 public float Duration = 4.0f; ··· 30 33 [Description("Set the height of each caption line in pixels.")] 31 34 [Category("Position/Size")] 32 35 [Range(16, 64)] 33 - public int Height = 34; 36 + public int Height = 36; 34 37 [Description("Set the padding between the captions box and the screen edges in pixels.")] 35 38 [Category("Position/Size")] 36 39 [Range(0, 64)]
+41 -45
ClosedCaptions/CaptionsList.cs
··· 92 92 var soundName = GetDisplayName(caption); 93 93 94 94 // Modify colors for special sound types. 95 - if (caption.AlertLevel == AlertLevel.Warning) 95 + if (caption.HasTag("notice")) 96 + { 97 + fg = _notice; 98 + stroke = _notice; 99 + } 100 + else if (caption.HasTag("warning")) 96 101 { 97 102 fg = _warning; 98 103 stroke = _warning; ··· 102 107 stroke = bg; 103 108 bg = _warning; 104 109 } 105 - } 106 - else if (caption.AlertLevel == AlertLevel.Notice) 107 - { 108 - fg = _notice; 109 - stroke = _notice; 110 110 } 111 111 112 112 // Set alpha values. ··· 144 144 // ±4 is directly left/right of the player, respectively 145 145 // ±8 is directly behind the player 146 146 var direction = GameMath.Mod((yaw + api.World.Player.CameraYaw) / GameMath.TWOPI * 16 + 4, 16) - 8; 147 - 148 - // BEHIND YOU 149 - if (Math.Abs(direction) > 6) 150 - { 151 - ctx.NewPath(); 152 - ctx.Arc(1+Cfg.Width*.1, y+midHeight, Cfg.Height/8.0, 0, GameMath.TWOPI); 153 - ctx.Fill(); 154 - ctx.NewPath(); 155 - ctx.Arc(1+Cfg.Width*.9, y+midHeight, Cfg.Height/8.0, 0, GameMath.TWOPI); 156 - ctx.Fill(); 157 - } 158 - // >> 159 - else if (direction > 3) 160 - { 161 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth), y+midHeight, arrowWidth, arrowHeight); 162 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth*.2), y+midHeight, arrowWidth, arrowHeight); 163 - } 164 - // > 165 - else if (direction > 1) 166 - { 167 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth*.2), y+midHeight, arrowWidth, arrowHeight); 168 - } 169 - // << 170 - else if (direction < -3) 171 - { 172 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth), y+midHeight, -arrowWidth, arrowHeight); 173 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth*.2), y+midHeight, -arrowWidth, arrowHeight); 174 - } 175 - // < 176 - else if (direction < -1) 147 + 148 + switch (direction) 177 149 { 178 - RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth*.55), y+midHeight, -arrowWidth, arrowHeight); 150 + // BEHIND YOU 151 + case > 6: 152 + case < -6: 153 + ctx.NewPath(); 154 + ctx.Arc(1+Cfg.Width*.1, y+midHeight, Cfg.Height/8.0, 0, GameMath.TWOPI); 155 + ctx.Fill(); 156 + ctx.NewPath(); 157 + ctx.Arc(1+Cfg.Width*.9, y+midHeight, Cfg.Height/8.0, 0, GameMath.TWOPI); 158 + ctx.Fill(); 159 + break; 160 + // >> 161 + case > 3: 162 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth), y+midHeight, arrowWidth, arrowHeight); 163 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth*.2), y+midHeight, arrowWidth, arrowHeight); 164 + break; 165 + // > 166 + case > 1: 167 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.9+arrowWidth*.2), y+midHeight, arrowWidth, arrowHeight); 168 + break; 169 + // << 170 + case < -3: 171 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth), y+midHeight, -arrowWidth, arrowHeight); 172 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth*.2), y+midHeight, -arrowWidth, arrowHeight); 173 + break; 174 + // < 175 + case < -1: 176 + RenderTriangle(ctx, 1+Math.Round(Cfg.Width*.1-arrowWidth*.55), y+midHeight, -arrowWidth, arrowHeight); 177 + break; 179 178 } 180 179 } 181 180 } 182 181 183 - private string GetDisplayName(Caption caption) 182 + private static string GetDisplayName(Caption caption) 184 183 { 185 184 if (!Cfg.ShowSymbols) return caption.Name; 186 - return caption.AlertLevel switch 187 - { 188 - AlertLevel.Warning => "! " + caption.Name + " !", 189 - AlertLevel.Notice => "+ " + caption.Name + " +", 190 - _ => caption.Name 191 - }; 185 + if (caption.HasTag("warning")) return "! " + caption.Name + " !"; 186 + if (caption.HasTag("notice")) return "+ " + caption.Name + " +"; 187 + return caption.Name; 192 188 } 193 189 194 - private void RenderTriangle(Context ctx, double x, double y, double w, double h) 190 + private static void RenderTriangle(Context ctx, double x, double y, double w, double h) 195 191 { 196 192 ctx.NewPath(); 197 193 ctx.MoveTo(x, y);
+7
ClosedCaptions/CaptionsSystem.cs
··· 9 9 private static CaptionsDialog _dialog; 10 10 public static CaptionsConfig Config; 11 11 private static ICoreClientAPI _api; 12 + private static AssetCategory Category; 13 + 14 + public override void StartPre(ICoreAPI api) 15 + { 16 + base.StartPre(api); 17 + Category = new AssetCategory("captions", false, EnumAppSide.Client); 18 + } 12 19 13 20 public override void StartClientSide(ICoreClientAPI capi) 14 21 {
+10
ClosedCaptions/LoadedCaptionData.cs
··· 1 + using System.Collections.Generic; 2 + 3 + namespace ClosedCaptions; 4 + 5 + public class LoadedCaptionData 6 + { 7 + public readonly string Channel = null; 8 + public readonly int Priority = 1; 9 + public readonly List<string> Tags = []; 10 + }
ClosedCaptions/assets/captions/.DS_Store

This is a binary file and will not be displayed.

+6
ClosedCaptions/assets/captions/captions/culinaryartillery.json
··· 1 + { 2 + "lock": {}, 3 + "block/mixing": {}, 4 + "player/eggcrack": {}, 5 + "player/gulp": {} 6 + }
+57
ClosedCaptions/assets/captions/captions/pantherinae.json
··· 1 + { 2 + "sounds/creature/pantherinae/unciaroar": { 3 + "channel": "", 4 + "priority": 1, 5 + "tags": ["warning"] 6 + }, 7 + "sounds/creature/pantherinae/tigrisroar": { 8 + "channel": "", 9 + "priority": 1, 10 + "tags": ["warning"] 11 + }, 12 + "sounds/creature/pantherinae/spelaearoar": { 13 + "channel": "", 14 + "priority": 1, 15 + "tags": ["warning"] 16 + }, 17 + "sounds/creature/pantherinae/pardusroar": { 18 + "channel": "", 19 + "priority": 1, 20 + "tags": ["warning"] 21 + }, 22 + "sounds/creature/pantherinae/pantheraidle": { 23 + "channel": "", 24 + "priority": 1, 25 + "tags": ["warning"] 26 + }, 27 + "sounds/creature/pantherinae/pantheracharge": { 28 + "channel": "", 29 + "priority": 1, 30 + "tags": ["warning"] 31 + }, 32 + "sounds/creature/pantherinae/oncaroar": { 33 + "channel": "", 34 + "priority": 1, 35 + "tags": ["warning"] 36 + }, 37 + "sounds/creature/pantherinae/neofelisroar": { 38 + "channel": "", 39 + "priority": 1, 40 + "tags": ["warning"] 41 + }, 42 + "sounds/creature/pantherinae/lick": { 43 + "channel": "", 44 + "priority": 1, 45 + "tags": ["warning"] 46 + }, 47 + "sounds/creature/pantherinae/leoroar": { 48 + "channel": "", 49 + "priority": 1, 50 + "tags": ["warning"] 51 + }, 52 + "sounds/creature/pantherinae/atroxroar": { 53 + "channel": "", 54 + "priority": 1, 55 + "tags": ["warning"] 56 + } 57 + }
+12
ClosedCaptions/assets/captions/captions/primitivesurvival.json
··· 1 + { 2 + "grunting": {}, 3 + "entity/livingdead/breathe": {}, 4 + "entity/livingdead/growl": {}, 5 + "entity/livingdead/rattle": {}, 6 + "entity/livingdead/screech": {}, 7 + "fireworks/bamboobarrage": {}, 8 + "fireworks/beehive": {}, 9 + "fireworks/cherrybomb": {}, 10 + "fireworks/fountain": {}, 11 + "fireworks/whistlebang": {} 12 + }
+642
ClosedCaptions/assets/captions/captions/survival.json
··· 1 + { 2 + "environment/creek": { 3 + "tags": ["ambient"] 4 + }, 5 + "environment/drip": { 6 + "tags": ["ambient"] 7 + }, 8 + "environment/fire": { 9 + "tags": ["ambient"] 10 + }, 11 + "environment/fireplace": { 12 + "tags": ["ambient"] 13 + }, 14 + "environment/lava": { 15 + "tags": ["ambient"] 16 + }, 17 + "environment/smallsplash": { 18 + "channel": "splash", 19 + "priority": 1 20 + }, 21 + "environment/mediumsplash": { 22 + "channel": "splash", 23 + "priority": 1 24 + }, 25 + "environment/largesplash": { 26 + "channel": "splash", 27 + "priority": 1 28 + }, 29 + 30 + "environment/rainwindow": { 31 + "channel": "rain", 32 + "priority": 1, 33 + "tags": ["ambient"] 34 + }, 35 + "weather/tracks/rain-leafless": { 36 + "channel": "rain", 37 + "priority": 1, 38 + "tags": ["ambient"] 39 + }, 40 + "weather/tracks/rain-leafy": { 41 + "channel": "rain", 42 + "priority": 1, 43 + "tags": ["ambient"] 44 + }, 45 + 46 + "environment/underwater": { 47 + "tags": ["ambient"] 48 + }, 49 + "environment/waterfall": { 50 + "tags": ["ambient"] 51 + }, 52 + "environment/waterwaves": { 53 + "tags": ["ambient"] 54 + }, 55 + 56 + "player/build": { 57 + "tags": ["player"] 58 + }, 59 + "player/buildhigh": { 60 + "tags": ["player"] 61 + }, 62 + "player/clayform": { 63 + "tags": ["player"] 64 + }, 65 + "player/clayformhi": { 66 + "tags": ["player"] 67 + }, 68 + "player/collect": { 69 + "tags": ["player"] 70 + }, 71 + "player/death": {}, 72 + "player/destruct": { 73 + "tags": ["player"] 74 + }, 75 + "player/eat": { 76 + "tags": ["player"] 77 + }, 78 + "player/eat_crunchy": { 79 + "tags": ["player"] 80 + }, 81 + "player/hurt": { 82 + "tags": ["player"] 83 + }, 84 + "player/jump": { 85 + "tags": ["player"] 86 + }, 87 + "player/knap": { 88 + "tags": ["player"] 89 + }, 90 + "player/projectilehit": { 91 + "tags": ["player"] 92 + }, 93 + "player/quickthrow": { 94 + "tags": ["player"] 95 + }, 96 + "player/slap": { 97 + "tags": ["player"] 98 + }, 99 + "player/swim": { 100 + "tags": ["player"] 101 + }, 102 + "player/throw": { 103 + "tags": ["player"] 104 + }, 105 + 106 + "voice/accordion": {}, 107 + "voice/altoflute": {}, 108 + "voice/clarinet": {}, 109 + "voice/harmonica": {}, 110 + "voice/oboe": {}, 111 + "voice/sax": {}, 112 + "voice/trumpet": {}, 113 + "voice/tuba": {}, 114 + "voice/saxophone": {}, 115 + 116 + "arrow-impact": {}, 117 + "bow-draw": { 118 + "tags": ["player"] 119 + }, 120 + "bow-release": { 121 + "tags": ["player"] 122 + }, 123 + "moltenmetal": {}, 124 + "pourmetal": {}, 125 + "raft-idle": { 126 + "tags": ["ambient"] 127 + }, 128 + "raft-moving": {}, 129 + "sizzle": {}, 130 + "thud": {}, 131 + "torch-ignite": {}, 132 + "tutorialstepsuccess": { 133 + "tags": ["notice"] 134 + }, 135 + "block/creak/woodcreak_": {}, 136 + "block/creak/woodcreak_long": {}, 137 + "block/anvil": {}, 138 + "block/barrelclose": {}, 139 + "block/barrelopen": {}, 140 + "block/basketclose": {}, 141 + "block/basketopen": {}, 142 + "block/ceramicbreak": {}, 143 + "block/ceramichit": {}, 144 + "block/ceramicplace": {}, 145 + "block/chandelier-break": {}, 146 + "block/chandelier-hit": {}, 147 + "block/charcoal": {}, 148 + "block/chestclose": {}, 149 + "block/chestopen": {}, 150 + "block/chop": {}, 151 + "block/chute": {}, 152 + "block/cloth": {}, 153 + "block/cokeovendoor-close": {}, 154 + "block/cokeovendoor-open": {}, 155 + "block/dirt": {}, 156 + "block/door": {}, 157 + "block/glass": {}, 158 + "block/gravel": {}, 159 + "block/heavyice": {}, 160 + "block/heavymetal": {}, 161 + "block/hewnfencegate": {}, 162 + "block/hopperopen": {}, 163 + "block/hoppertumble": {}, 164 + "block/ice": {}, 165 + "block/ingot": {}, 166 + "block/largechestclose": {}, 167 + "block/largechestopen": {}, 168 + "block/largedoor-close": {}, 169 + "block/largedoor-open": {}, 170 + "block/lava": {}, 171 + "block/leafy-picking": {}, 172 + "block/leather": {}, 173 + "block/loosestick": {}, 174 + "block/loosestone": {}, 175 + "block/metaldoor-place": {}, 176 + "block/metaldoor": {}, 177 + "block/meteoriciron-hit-pickaxe": {}, 178 + "block/planks": { 179 + "tags": ["player"] 180 + }, 181 + "block/plant": { 182 + "tags": ["player"] 183 + }, 184 + "block/plate": {}, 185 + "block/pump": {}, 186 + "block/pumpkin": {}, 187 + "block/quern": {}, 188 + "block/rock-break-pickaxe": {}, 189 + "block/rock-hit-pickaxe": {}, 190 + "block/sand": {}, 191 + "block/snow": {}, 192 + "block/stickbreak": {}, 193 + "block/stickhit": {}, 194 + "block/stickplace": {}, 195 + "block/teleporter": {}, 196 + "block/torch": {}, 197 + "block/vesselclose": {}, 198 + "block/vesselopen": {}, 199 + "block/vinyl": {}, 200 + "block/water": {}, 201 + "block/wood-tool": {}, 202 + "block/woodcreak_": {}, 203 + 204 + "creature/bear/aggro": { 205 + "tags": ["warning"] 206 + }, 207 + "creature/bear/attack": {}, 208 + "creature/bear/flee": {}, 209 + "creature/bear/growl": { 210 + "tags": ["warning"] 211 + }, 212 + "creature/bear/hurt": {}, 213 + 214 + "creature/animal-eat-small": {}, 215 + "creature/animal-eat": {}, 216 + 217 + "creature/beehive": {}, 218 + "creature/beehive-wild": { 219 + "tags": ["notice"] 220 + }, 221 + "creature/beemob": {}, 222 + "creature/beesting": {}, 223 + "creature/cicada-short-loop": {}, 224 + "creature/cicada": {}, 225 + "creature/coqui": {}, 226 + "creature/grasshopper": {}, 227 + 228 + "creature/hare-hurt": {}, 229 + "creature/hare-idle": {}, 230 + 231 + "creature/strawdummy-hit": {}, 232 + 233 + "creature/drifter-aggro": { 234 + "tags": ["warning"] 235 + }, 236 + "creature/drifter-death": {}, 237 + "creature/drifter-hurt": {}, 238 + "creature/drifter-hit": {}, 239 + "creature/drifter-idle": { 240 + "tags": ["warning"] 241 + }, 242 + 243 + "creature/bell/alarm": { 244 + "tags": ["warning"] 245 + }, 246 + "creature/bell/bell": { 247 + "tags": ["warning"] 248 + }, 249 + "creature/bell/death": {}, 250 + "creature/bell/hurt": {}, 251 + "creature/bell/listen": { 252 + "tags": ["warning"] 253 + }, 254 + "creature/bell/walk": { 255 + "tags": ["warning"] 256 + }, 257 + 258 + "creature/bowtorn/death": {}, 259 + "creature/bowtorn/draw": {}, 260 + "creature/bowtorn/hurt": {}, 261 + "creature/bowtorn/idle": { 262 + "tags": ["warning"] 263 + }, 264 + "creature/bowtorn/release": { 265 + "tags": ["warning"] 266 + }, 267 + "creature/bowtorn/reload": {}, 268 + 269 + "creature/eidolon/awake": {}, 270 + "creature/eidolon/awaken": { 271 + "tags": ["warning"] 272 + }, 273 + "creature/eidolon/death": {}, 274 + "creature/eidolon/hit": {}, 275 + "creature/eidolon/rockfallslam": {}, 276 + "creature/eidolon/throw": {}, 277 + 278 + "creature/erel/alive": {}, 279 + "creature/erel/annoyed": { 280 + "tags": ["warning"] 281 + }, 282 + "creature/erel/call": {}, 283 + "creature/erel/fire": {}, 284 + "creature/erel/flap": {}, 285 + "creature/erel/glide": {}, 286 + "creature/erel/hurt": {}, 287 + 288 + "creature/locust/death": {}, 289 + "creature/locust/hurt": {}, 290 + "creature/locust/idle": { 291 + "tags": ["ambient"] 292 + }, 293 + "creature/locust/saw": {}, 294 + 295 + "creature/shiver/aggro": { 296 + "tags": ["warning"] 297 + }, 298 + "creature/shiver/death": {}, 299 + "creature/shiver/hurt": {}, 300 + "creature/shiver/idle": { 301 + "tags": ["warning"] 302 + }, 303 + "creature/shiver/shock": { 304 + "tags": ["notice"] 305 + }, 306 + "creature/shiver/thump": { 307 + "tags": ["warning"] 308 + }, 309 + 310 + "creature/chicken/chick": {}, 311 + "creature/chicken/hen-flee": {}, 312 + "creature/chicken/hen-idle": {}, 313 + "creature/chicken/hen-lay": {}, 314 + "creature/chicken/hurt": {}, 315 + "creature/chicken/rooster-alarm": {}, 316 + "creature/chicken/rooster-call": {}, 317 + 318 + "creature/fox/attack": {}, 319 + "creature/fox/die": {}, 320 + "creature/fox/growl": { 321 + "tags": ["warning"] 322 + }, 323 + "creature/fox/hurt": {}, 324 + "creature/fox/yip": {}, 325 + 326 + "creature/goat/large/adult-attack": {}, 327 + "creature/goat/large/adult-death": {}, 328 + "creature/goat/large/adult-hurt": {}, 329 + "creature/goat/large/adult-idle": {}, 330 + 331 + "creature/goat/bleat": {}, 332 + "creature/goat/bleatweird": {}, 333 + "creature/goat/death": {}, 334 + "creature/goat/goatkidbleat": {}, 335 + "creature/goat/goatkidhurt": {}, 336 + "creature/goat/hurt": {}, 337 + 338 + "creature/hooved/gallop": {}, 339 + "creature/hooved/trot": {}, 340 + 341 + "creature/hooved/generic/call": {}, 342 + "creature/hooved/generic/sniff": {}, 343 + 344 + "creature/hooved/large/elk/bellow": {}, 345 + "creature/hooved/large/elk/bellowafter": {}, 346 + "creature/hooved/large/elk/bugle": {}, 347 + 348 + "creature/hooved/large/redstag/bellow": {}, 349 + "creature/hooved/large/redstag/roar": {}, 350 + 351 + "creature/hooved/medium/buck-bellow": {}, 352 + "creature/hooved/medium/deer-call": {}, 353 + 354 + "creature/hooved/small/fawn/fawn": {}, 355 + 356 + "creature/hooved/small/strange/mew": {}, 357 + 358 + "creature/hooved/small/callsmall": {}, 359 + "creature/hooved/small/smallscream": {}, 360 + 361 + "creature/hyena/attack": {}, 362 + "creature/hyena/death": {}, 363 + "creature/hyena/growl": { 364 + "tags": ["warning"] 365 + }, 366 + "creature/hyena/hurt": {}, 367 + "creature/hyena/laugh": { 368 + "tags": ["warning"] 369 + }, 370 + 371 + "creature/pig/attack": {}, 372 + "creature/pig/hurt": {}, 373 + "creature/pig/idle": {}, 374 + "creature/pig/piglet-hurt": {}, 375 + "creature/pig/piglet-idle": {}, 376 + 377 + "creature/raccoon/aggro": { 378 + "tags": ["warning"] 379 + }, 380 + "creature/raccoon/death": {}, 381 + "creature/raccoon/hurt": {}, 382 + "creature/raccoon/idle": {}, 383 + "creature/raccoon/pup-death": {}, 384 + "creature/raccoon/pup-hurt": {}, 385 + "creature/raccoon/pup-idle": {}, 386 + 387 + "creature/sheep/hurt": {}, 388 + "creature/sheep/idle": {}, 389 + "creature/sheep/lamb-hurt": {}, 390 + "creature/sheep/milking": {}, 391 + 392 + "creature/wolf/attack": {}, 393 + "creature/wolf/growl": { 394 + "tags": ["warning"] 395 + }, 396 + "creature/wolf/howl": { 397 + "tags": ["warning"] 398 + }, 399 + "creature/wolf/hurt": {}, 400 + "creature/wolf/pup-bark": {}, 401 + "creature/wolf/pup-flop": {}, 402 + "creature/wolf/pup-howl": {}, 403 + "creature/wolf/pup-hurt": {}, 404 + 405 + "effect/anvilhit": {}, 406 + "effect/anvilmergehit": {}, 407 + "effect/cashregister": {}, 408 + "effect/clothrip": {}, 409 + "effect/cooking": {}, 410 + "effect/crusher-impact": {}, 411 + "effect/deepbell": { 412 + "tags": ["notice"] 413 + }, 414 + "effect/echochamber": {}, 415 + "effect/embers": {}, 416 + "effect/extinguish": {}, 417 + "effect/fuse": {}, 418 + "effect/gearbox_turn": {}, 419 + "effect/gears": {}, 420 + "effect/gliding": {}, 421 + "effect/largeexplosion": { 422 + "tags": ["warning"] 423 + }, 424 + "effect/latch": {}, 425 + "effect/longfuse": {}, 426 + "effect/mediumexplosion": { 427 + "tags": ["warning"] 428 + }, 429 + "effect/moltenmetal": {}, 430 + "effect/planetary_gears": {}, 431 + "effect/portal": {}, 432 + "effect/receptionbell": {}, 433 + "effect/rift": {}, 434 + "effect/rockslide": {}, 435 + "effect/roperip": { 436 + "tags": ["warning"] 437 + }, 438 + "effect/ropestretch": {}, 439 + "effect/smallexplosion": { 440 + "tags": ["warning"] 441 + }, 442 + "effect/squish": {}, 443 + "effect/stonecrush": {}, 444 + "effect/swoosh": {}, 445 + "effect/tempstab-drain": {}, 446 + "effect/tempstab-low": {}, 447 + "effect/tempstab-verylow": { 448 + "tags": ["warning"] 449 + }, 450 + "effect/timeswitch": {}, 451 + "effect/toolbreak": {}, 452 + "effect/translocate-active": {}, 453 + "effect/translocate-breakdimension": {}, 454 + "effect/translocate-idle": {}, 455 + "effect/treefell": {}, 456 + "effect/water-fill": {}, 457 + "effect/water-pour": {}, 458 + "effect/watering": {}, 459 + "effect/watering-loop": {}, 460 + "effect/woodgrind": {}, 461 + "effect/woodswitch": {}, 462 + "effect/writing": {}, 463 + "held/bookclose": {}, 464 + "held/bookturn": {}, 465 + "held/shieldblock-metal-heavy": {}, 466 + "held/shieldblock-metal-light": {}, 467 + "held/shieldblock-wood-heavy": {}, 468 + "held/shieldblock-wood-light": {}, 469 + "held/torch-attack": {}, 470 + "held/torch-equip": {}, 471 + "held/torch-idle": {}, 472 + "held/torch-unequip": {}, 473 + 474 + "instrument/elk-call": {}, 475 + 476 + "player/chalkdraw": {}, 477 + "player/clothrepair": {}, 478 + "player/coin": {}, 479 + "player/gluerepair": { 480 + "tags": ["wip"] 481 + }, 482 + "player/hackingspearhit": { 483 + "tags": ["notice"] 484 + }, 485 + "player/handdrill": {}, 486 + "player/messycraft": {}, 487 + "player/panning": {}, 488 + "player/poultice-applied": {}, 489 + "player/poultice": {}, 490 + "player/scrape": {}, 491 + "player/seal": {}, 492 + "player/squeezehoneycomb": {}, 493 + "player/stab": {}, 494 + "player/strike": {}, 495 + "player/wetclothsqueeze": {}, 496 + "tool/breakreinforced": {}, 497 + "tool/padlock": {}, 498 + "tool/reinforce": {}, 499 + "tool/scythe": {}, 500 + "tool/slash": {}, 501 + "tool/sling": {}, 502 + 503 + "walk/cloth": { 504 + "channel": "movement", 505 + "priority": 1, 506 + "tags": ["player"] 507 + }, 508 + "walk/deepsnow": { 509 + "channel": "movement", 510 + "priority": 1, 511 + "tags": ["player"] 512 + }, 513 + "walk/default": { 514 + "channel": "movement", 515 + "priority": 1, 516 + "tags": ["player"] 517 + }, 518 + "walk/glass": { 519 + "channel": "movement", 520 + "priority": 1, 521 + "tags": ["player"] 522 + }, 523 + "walk/grass": { 524 + "channel": "movement", 525 + "priority": 1, 526 + "tags": ["player"] 527 + }, 528 + "walk/gravel": { 529 + "channel": "movement", 530 + "priority": 1, 531 + "tags": ["player"] 532 + }, 533 + "walk/ice": { 534 + "channel": "movement", 535 + "priority": 1, 536 + "tags": ["player"] 537 + }, 538 + "walk/lava": { 539 + "channel": "movement", 540 + "priority": 1, 541 + "tags": ["player"] 542 + }, 543 + "walk/sand": { 544 + "channel": "movement", 545 + "priority": 1, 546 + "tags": ["player"] 547 + }, 548 + "walk/sludge": { 549 + "channel": "movement", 550 + "priority": 1, 551 + "tags": ["player"] 552 + }, 553 + "walk/snow": { 554 + "channel": "movement", 555 + "priority": 1, 556 + "tags": ["player"] 557 + }, 558 + "walk/stone": { 559 + "channel": "movement", 560 + "priority": 1, 561 + "tags": ["player"] 562 + }, 563 + "walk/water": { 564 + "channel": "movement", 565 + "priority": 1, 566 + "tags": ["player"] 567 + }, 568 + "walk/wood": { 569 + "channel": "movement", 570 + "priority": 1, 571 + "tags": ["player"] 572 + }, 573 + "walk/inside/leafy/bushrustle": { 574 + "channel": "movement", 575 + "priority": 1, 576 + "tags": ["player"] 577 + }, 578 + "wearable/brigandine": { 579 + "tags": ["player"] 580 + }, 581 + "wearable/chain": { 582 + "tags": ["player"] 583 + }, 584 + "wearable/leather": { 585 + "tags": ["player"] 586 + }, 587 + "wearable/plate": { 588 + "tags": ["player"] 589 + }, 590 + "wearable/scale": { 591 + "tags": ["player"] 592 + }, 593 + 594 + "weather/tracks/verylowtremble": { 595 + "channel": "thunder", 596 + "priority": 1, 597 + "tags": ["ambient"] 598 + }, 599 + "weather/tracks/lowtremble": { 600 + "channel": "thunder", 601 + "priority": 1, 602 + "tags": ["ambient"] 603 + }, 604 + "weather/lowgrumble": { 605 + "channel": "thunder", 606 + "priority": 1, 607 + "tags": ["ambient"] 608 + }, 609 + "weather/lightning-distant": { 610 + "channel": "thunder", 611 + "priority": 2 612 + }, 613 + "weather/lightning-near": { 614 + "channel": "thunder", 615 + "priority": 3, 616 + "tags": ["warning"] 617 + }, 618 + "weather/lightning-verynear": { 619 + "channel": "thunder", 620 + "priority": 4, 621 + "tags": ["warning"] 622 + }, 623 + "weather/lightning-nodistance": { 624 + "channel": "thunder", 625 + "priority": 5, 626 + "tags": ["warning"] 627 + }, 628 + "weather/tracks/hail": { 629 + "tags": ["warning"] 630 + }, 631 + "weather/wind-leafless": { 632 + "channel": "wind", 633 + "priority": 1, 634 + "tags": ["ambient"] 635 + }, 636 + "weather/wind-leafy": { 637 + "channel": "wind", 638 + "priority": 1, 639 + "tags": ["ambient"] 640 + }, 641 + "environment/wind": {} 642 + }
-183
ClosedCaptions/assets/captions/channelguides/vanilla.json
··· 1 - { 2 - "weather/tracks/verylowtremble": { 3 - "name": "thunder", 4 - "priority": 1 5 - }, 6 - "weather/tracks/lowtremble": { 7 - "name": "thunder", 8 - "priority": 1 9 - }, 10 - "weather/lowgrumble": { 11 - "name": "thunder", 12 - "priority": 1 13 - }, 14 - "weather/lightning-distant": { 15 - "name": "thunder", 16 - "priority": 2 17 - }, 18 - "weather/lightning-near": { 19 - "name": "thunder", 20 - "priority": 3 21 - }, 22 - "weather/lightning-verynear": { 23 - "name": "thunder", 24 - "priority": 4 25 - }, 26 - "weather/lightning-nodistance": { 27 - "name": "thunder", 28 - "priority": 5 29 - }, 30 - 31 - "weather/wind-leafless": { 32 - "name": "wind", 33 - "priority": 1 34 - }, 35 - "weather/wind-leafy": { 36 - "name": "wind", 37 - "priority": 1 38 - }, 39 - 40 - "bow-draw": { 41 - "name": "bow", 42 - "priority": 1 43 - }, 44 - "bow-release": { 45 - "name": "bow", 46 - "priority": 2 47 - }, 48 - 49 - "moltenmetal": { 50 - "name": "metal", 51 - "priority": 1 52 - }, 53 - "pourmetal": { 54 - "name": "metal", 55 - "priority": 2 56 - }, 57 - 58 - "raft-idle": { 59 - "name": "water", 60 - "priority": 1 61 - }, 62 - "raft-moving": { 63 - "name": "water", 64 - "priority": 2 65 - }, 66 - 67 - "environment/rainwindow": { 68 - "name": "rain", 69 - "priority": 1 70 - }, 71 - "weather/tracks/rain-leafless": { 72 - "name": "rain", 73 - "priority": 1 74 - }, 75 - "weather/tracks/rain-leafy": { 76 - "name": "rain", 77 - "priority": 1 78 - }, 79 - 80 - "environment/largesplash": { 81 - "name": "splash", 82 - "priority": 1 83 - }, 84 - "environment/mediumsplash": { 85 - "name": "splash", 86 - "priority": 1 87 - }, 88 - "environment/smallsplash": { 89 - "name": "splash", 90 - "priority": 1 91 - }, 92 - 93 - "effect/tempstab-drain": { 94 - "name": "time", 95 - "priority": 1 96 - }, 97 - "effect/tempstab-low": { 98 - "name": "time", 99 - "priority": 2 100 - }, 101 - "effect/tempstab-verylow": { 102 - "name": "time", 103 - "priority": 3 104 - }, 105 - 106 - "walk/cloth": { 107 - "name": "movement", 108 - "priority": 1 109 - }, 110 - "walk/deepsnow": { 111 - "name": "movement", 112 - "priority": 1 113 - }, 114 - "walk/default": { 115 - "name": "movement", 116 - "priority": 1 117 - }, 118 - "walk/glass": { 119 - "name": "movement", 120 - "priority": 1 121 - }, 122 - "walk/grass": { 123 - "name": "movement", 124 - "priority": 1 125 - }, 126 - "walk/gravel": { 127 - "name": "movement", 128 - "priority": 1 129 - }, 130 - "walk/ice": { 131 - "name": "movement", 132 - "priority": 1 133 - }, 134 - "walk/lava": { 135 - "name": "movement", 136 - "priority": 1 137 - }, 138 - "walk/sand": { 139 - "name": "movement", 140 - "priority": 1 141 - }, 142 - "walk/sludge": { 143 - "name": "movement", 144 - "priority": 1 145 - }, 146 - "walk/snow": { 147 - "name": "movement", 148 - "priority": 1 149 - }, 150 - "walk/stone": { 151 - "name": "movement", 152 - "priority": 1 153 - }, 154 - "walk/water": { 155 - "name": "movement", 156 - "priority": 1 157 - }, 158 - "walk/wood": { 159 - "name": "movement", 160 - "priority": 1 161 - }, 162 - 163 - "wearable/brigandine": { 164 - "name": "clothes", 165 - "priority": 1 166 - }, 167 - "wearable/chain": { 168 - "name": "clothes", 169 - "priority": 1 170 - }, 171 - "wearable/leather": { 172 - "name": "clothes", 173 - "priority": 1 174 - }, 175 - "wearable/plate": { 176 - "name": "clothes", 177 - "priority": 1 178 - }, 179 - "wearable/scale": { 180 - "name": "clothes", 181 - "priority": 1 182 - } 183 - }
+68 -68
ClosedCaptions/assets/captions/lang/en.json
··· 9 9 "captions:tick": "", 10 10 "captions:toggleswitch": "", 11 11 12 - "captions:environment/creek": "~Creek flows", 13 - "captions:environment/drip": "~Water drips", 14 - "captions:environment/fire": "~Fire crackles", 15 - "captions:environment/fireplace": "~Fire roars", 16 - "captions:environment/largesplash": "~Big splash", 17 - "captions:environment/lava": "~Lava bubbles", 18 - "captions:environment/mediumsplash": "~Medium splash", 19 - "captions:environment/rainwindow": "~Rain patters", 20 - "captions:environment/smallsplash": "~Small splash", 21 - "captions:environment/underwater": "~Water flows", 22 - "captions:environment/waterfall": "~Water falls", 23 - "captions:environment/waterwaves": "~Waves crash", 12 + "captions:environment/creek": "Creek flows", 13 + "captions:environment/drip": "Water drips", 14 + "captions:environment/fire": "Fire crackles", 15 + "captions:environment/fireplace": "Fire roars", 16 + "captions:environment/largesplash": "Big splash", 17 + "captions:environment/lava": "Lava bubbles", 18 + "captions:environment/mediumsplash": "Medium splash", 19 + "captions:environment/rainwindow": "Rain patters", 20 + "captions:environment/smallsplash": "Small splash", 21 + "captions:environment/underwater": "Water flows", 22 + "captions:environment/waterfall": "Water falls", 23 + "captions:environment/waterwaves": "Waves crash", 24 24 "captions:environment/wind": "Wind whips", 25 25 26 26 "captions:player/build": "Block placed", ··· 35 35 "captions:player/hurt": "Player hurt", 36 36 "captions:player/jump": "Player jumps", 37 37 "captions:player/knap": "Stone chips", 38 - "captions:player/projectilehit": "+Enemy hit", 38 + "captions:player/projectilehit": "Enemy hit", 39 39 "captions:player/quickthrow": "Item thrown", 40 40 "captions:player/slap": "Slap", 41 41 "captions:player/swim": "Swimming", ··· 62 62 "captions:sizzle": "Sizzling", 63 63 "captions:thud": "Thud", 64 64 "captions:torch-ignite": "Torch lights", 65 - "captions:tutorialstepsuccess": "+Tutorial tinkles", 65 + "captions:tutorialstepsuccess": "Tutorial tinkles", 66 66 67 67 "captions:block/creak/woodcreak_": "Wood creaks", 68 68 "captions:block/creak/woodcreak_long": "Wood creaks", ··· 130 130 "captions:block/wood-tool": "Wooden thwack", 131 131 "captions:block/woodcreak_": "Wood creaks", 132 132 133 - "captions:creature/bear/aggro": "!Bear roars", 133 + "captions:creature/bear/aggro": "Bear roars", 134 134 "captions:creature/bear/attack": "Bear attacks", 135 135 "captions:creature/bear/flee": "Bear groans", 136 - "captions:creature/bear/growl": "!Bear growls", 136 + "captions:creature/bear/growl": "Bear growls", 137 137 "captions:creature/bear/hurt": "Bear hit", 138 138 139 139 "captions:creature/animal-eat-small": "Small munching", 140 140 "captions:creature/animal-eat": "Quiet munching", 141 141 "captions:creature/beehive": "Bees buzz", 142 - "captions:creature/beehive-wild": "+Bees buzz", 143 - "captions:creature/beemob": "!Angry buzzing", 142 + "captions:creature/beehive-wild": "Bees buzz", 143 + "captions:creature/beemob": "Angry buzzing", 144 144 "captions:creature/beesting": "Bees sting", 145 145 "captions:creature/cicada-short-loop": "Cicadas chirp", 146 146 "captions:creature/cicada": "Cicadas sing", ··· 152 152 153 153 "captions:creature/strawdummy-hit": "Dummy hit", 154 154 155 - "captions:creature/drifter-aggro": "!Drifter growls", 155 + "captions:creature/drifter-aggro": "Drifter growls", 156 156 "captions:creature/drifter-death": "Drifter dies", 157 157 "captions:creature/drifter-hurt": "Drifter hit", 158 158 "captions:creature/drifter-hit": "Drifter hit", 159 - "captions:creature/drifter-idle": "!Drifter groans", 159 + "captions:creature/drifter-idle": "Drifter groans", 160 160 161 - "captions:creature/bell/alarm": "!Bell screams", 162 - "captions:creature/bell/bell": "!Bell rings", 161 + "captions:creature/bell/alarm": "Bell screams", 162 + "captions:creature/bell/bell": "Bell rings", 163 163 "captions:creature/bell/death": "Bell dies", 164 164 "captions:creature/bell/hurt": "Bell hit", 165 - "captions:creature/bell/listen": "!Bell creaks", 166 - "captions:creature/bell/walk": "!Bell thuds", 165 + "captions:creature/bell/listen": "Bell creaks", 166 + "captions:creature/bell/walk": "Bell thuds", 167 167 168 168 "captions:creature/bowtorn/death": "Bowtorn dies", 169 169 "captions:creature/bowtorn/draw": "Bowtorn creaks", 170 170 "captions:creature/bowtorn/hurt": "Bowtorn hit", 171 - "captions:creature/bowtorn/idle": "!Bowtorn coughs", 172 - "captions:creature/bowtorn/release": "!Bowtorn fires", 171 + "captions:creature/bowtorn/idle": "Bowtorn coughs", 172 + "captions:creature/bowtorn/release": "Bowtorn fires", 173 173 "captions:creature/bowtorn/reload": "Bowtorn squeaks", 174 174 175 175 "captions:creature/eidolon/awake": "Metal grinds", 176 - "captions:creature/eidolon/awaken": "!Alarm blares", 176 + "captions:creature/eidolon/awaken": "Alarm blares", 177 177 "captions:creature/eidolon/death": "Eidolon winds down", 178 178 "captions:creature/eidolon/hit": "Metal thud", 179 179 "captions:creature/eidolon/rockfallslam": "Ceiling collapses", 180 180 "captions:creature/eidolon/throw": "Eidolon attacks", 181 181 182 182 "captions:creature/erel/alive": "Gears grumble", 183 - "captions:creature/erel/annoyed": "!Metal shrieking", 183 + "captions:creature/erel/annoyed": "Metal shrieking", 184 184 "captions:creature/erel/call": "Erel screeches", 185 185 "captions:creature/erel/fire": "Erel attacks", 186 186 "captions:creature/erel/flap": "Erel flaps", ··· 189 189 190 190 "captions:creature/locust/death": "Locust dies", 191 191 "captions:creature/locust/hurt": "Locust hit", 192 - "captions:creature/locust/idle": "!Locust hums", 192 + "captions:creature/locust/idle": "Locust hums", 193 193 "captions:creature/locust/saw": "Sawblade attacks", 194 194 195 - "captions:creature/shiver/aggro": "!Shiver chokes", 195 + "captions:creature/shiver/aggro": "Shiver chokes", 196 196 "captions:creature/shiver/death": "Shiver dies", 197 197 "captions:creature/shiver/hurt": "Shiver hit", 198 - "captions:creature/shiver/idle": "!Shiver clicks", 198 + "captions:creature/shiver/idle": "Shiver clicks", 199 199 "captions:creature/shiver/shock": "Shiver chokes", 200 - "captions:creature/shiver/thump": "!Shiver thumps", 200 + "captions:creature/shiver/thump": "Shiver thumps", 201 201 202 202 "captions:creature/chicken/chick": "Chick cheeps", 203 203 "captions:creature/chicken/hen-flee": "Hen startles", ··· 209 209 210 210 "captions:creature/fox/attack": "Fox attacks", 211 211 "captions:creature/fox/die": "Fox dies", 212 - "captions:creature/fox/growl": "!Fox growls", 212 + "captions:creature/fox/growl": "Fox growls", 213 213 "captions:creature/fox/hurt": "Fox hit", 214 214 "captions:creature/fox/yip": "Fox calls", 215 215 ··· 250 250 251 251 "captions:creature/hyena/attack": "Hyena attacks", 252 252 "captions:creature/hyena/death": "Hyena dies", 253 - "captions:creature/hyena/growl": "!Hyena growls", 253 + "captions:creature/hyena/growl": "Hyena growls", 254 254 "captions:creature/hyena/hurt": "Hyena hit", 255 - "captions:creature/hyena/laugh": "!Hyena laughs", 255 + "captions:creature/hyena/laugh": "Hyena laughs", 256 256 257 257 "captions:creature/pig/attack": "Pig attacks", 258 258 "captions:creature/pig/hurt": "Pig squeals", ··· 260 260 "captions:creature/pig/piglet-hurt": "Piglet squeals", 261 261 "captions:creature/pig/piglet-idle": "Piglet snorts", 262 262 263 - "captions:creature/raccoon/aggro": "!Raccoon growls", 263 + "captions:creature/raccoon/aggro": "Raccoon growls", 264 264 "captions:creature/raccoon/death": "Raccoon dies", 265 265 "captions:creature/raccoon/hurt": "Raccoon hit", 266 266 "captions:creature/raccoon/idle": "Raccoon chatters", ··· 274 274 "captions:creature/sheep/milking": "Sheep milking", 275 275 276 276 "captions:creature/wolf/attack": "Wolf attacks", 277 - "captions:creature/wolf/growl": "!Wolf growls", 278 - "captions:creature/wolf/howl": "!Wolf howls", 277 + "captions:creature/wolf/growl": "Wolf growls", 278 + "captions:creature/wolf/howl": "Wolf howls", 279 279 "captions:creature/wolf/hurt": "Wolf hit", 280 280 "captions:creature/wolf/pup-bark": "Wolf pup barks", 281 281 "captions:creature/wolf/pup-flop": "Wolf pup flops", ··· 288 288 "captions:effect/clothrip": "Cloth rips", 289 289 "captions:effect/cooking": "Food cooks", 290 290 "captions:effect/crusher-impact": "Crusher hits", 291 - "captions:effect/deepbell": "+Lore drops", 291 + "captions:effect/deepbell": "Lore drops", 292 292 "captions:effect/echochamber": "Eerie drone", 293 293 "captions:effect/embers": "Embers pop", 294 294 "captions:effect/extinguish": "Embers fizzle", ··· 296 296 "captions:effect/gearbox_turn": "Gearbox clanks", 297 297 "captions:effect/gears": "Gears clank", 298 298 "captions:effect/gliding": "Air flutters", 299 - "captions:effect/largeexplosion": "!Large Detonation", 299 + "captions:effect/largeexplosion": "Large Detonation", 300 300 "captions:effect/latch": "Latch clicks", 301 301 "captions:effect/longfuse": "Fuse hisses", 302 - "captions:effect/mediumexplosion": "!Explosion", 302 + "captions:effect/mediumexplosion": "Explosion", 303 303 "captions:effect/moltenmetal": "Metal bubbles", 304 304 "captions:effect/planetary_gears": "Gears rattle", 305 305 "captions:effect/portal": "Portal shrieks", 306 306 "captions:effect/receptionbell": "Bell rings", 307 307 "captions:effect/rift": "Rift grinds", 308 308 "captions:effect/rockslide": "Rocks falling", 309 - "captions:effect/roperip": "!Rope snaps", 309 + "captions:effect/roperip": "Rope snaps", 310 310 "captions:effect/ropestretch": "Rope creaks", 311 - "captions:effect/smallexplosion": "!Small Explosion", 311 + "captions:effect/smallexplosion": "Small Explosion", 312 312 "captions:effect/squish": "Wet slap", 313 313 "captions:effect/stonecrush": "Stone breaks", 314 314 "captions:effect/swoosh": "Swoosh", 315 315 "captions:effect/tempstab-drain": "Reality echoes", 316 316 "captions:effect/tempstab-low": "Reality groans", 317 - "captions:effect/tempstab-verylow": "!Reality grinds", 317 + "captions:effect/tempstab-verylow": "Reality grinds", 318 318 "captions:effect/timeswitch": "Time jumps", 319 319 "captions:effect/toolbreak": "Tool breaks", 320 320 "captions:effect/translocate-active": "Translocator activates", ··· 333 333 "captions:held/bookturn": "Pages flutter", 334 334 "captions:held/shieldblock-metal-heavy": "Shield bangs", 335 335 "captions:held/shieldblock-metal-light": "Shield clangs", 336 - "captions:held/shieldblock-wood-heavy": "Shield thuds", 337 - "captions:held/shieldblock-wood-light": "Shield knocks", 336 + "captions:held/shieldblock-wood-heavy": "Shield thuds", 337 + "captions:held/shieldblock-wood-light": "Shield knocks", 338 338 "captions:held/torch-attack": "Torch whooshes", 339 339 "captions:held/torch-equip": "", 340 340 "captions:held/torch-idle": "Torch crackles", ··· 345 345 "captions:player/chalkdraw": "", 346 346 "captions:player/clothrepair": "", 347 347 "captions:player/coin": "Coin clinks", 348 - "captions:player/gluerepair": "?Brushing noises", 349 - "captions:player/hackingspearhit": "+Locust hacked", 348 + "captions:player/gluerepair": "Brushing noises", 349 + "captions:player/hackingspearhit": "Locust hacked", 350 350 "captions:player/handdrill": "Firestarting", 351 351 "captions:player/messycraft": "Scrap kit clatters", 352 352 "captions:player/panning": "Pan sloshes", ··· 388 388 "captions:wearable/plate": "Armor clatters", 389 389 "captions:wearable/scale": "Armor clatters", 390 390 391 - "captions:weather/tracks/hail": "!Hail falls", 392 - "captions:weather/tracks/lowtremble": "~Distant thunder", 393 - "captions:weather/tracks/rain-leafless": "~Rain patters", 394 - "captions:weather/tracks/rain-leafy": "~Rain pours", 395 - "captions:weather/tracks/verylowtremble": "~Distant thunder", 391 + "captions:weather/tracks/hail": "Hail falls", 392 + "captions:weather/tracks/lowtremble": "Distant thunder", 393 + "captions:weather/tracks/rain-leafless": "Rain patters", 394 + "captions:weather/tracks/rain-leafy": "Rain pours", 395 + "captions:weather/tracks/verylowtremble": "Distant thunder", 396 396 397 397 "captions:weather/lightning-distant": "Thunder rolls", 398 - "captions:weather/lightning-near": "!Lightning booms", 399 - "captions:weather/lightning-verynear": "!Lightning cracks", 400 - "captions:weather/lightning-nodistance": "!Lightning strikes", 401 - "captions:weather/lowgrumble": "~Distant thunder", 402 - "captions:weather/wind-leafless": "~Wind blows", 403 - "captions:weather/wind-leafy": "~Wind rustles", 398 + "captions:weather/lightning-near": "Lightning booms", 399 + "captions:weather/lightning-verynear": "Lightning cracks", 400 + "captions:weather/lightning-nodistance": "Lightning strikes", 401 + "captions:weather/lowgrumble": "Distant thunder", 402 + "captions:weather/wind-leafless": "Wind blows", 403 + "captions:weather/wind-leafy": "Wind rustles", 404 404 405 405 "PRIMITIVE SURVIVAL": "", 406 406 "captions:grunting": "Grunting", ··· 423 423 "FIREARMS": "You know, this one's on hold. Can't find where in the HELL !!! the ramrod sounds are used", 424 424 425 425 "FAUNA OF THE STONE AGE: PANTHERINAE": "", 426 - "captions:sounds/creature/pantherinae/unciaroar": "!Leopard roars", 426 + "captions:sounds/creature/pantherinae/unciaroar": "Leopard roars", 427 427 "captions:sounds/creature/pantherinae/unciaattack": "Leopard attacks", 428 - "captions:sounds/creature/pantherinae/tigrisroar": "!Tiger roars", 428 + "captions:sounds/creature/pantherinae/tigrisroar": "Tiger roars", 429 429 "captions:sounds/creature/pantherinae/tigrisattack": "Tiger attacks", 430 - "captions:sounds/creature/pantherinae/spelaearoar": "!Steppe lion roars", 430 + "captions:sounds/creature/pantherinae/spelaearoar": "Steppe lion roars", 431 431 "captions:sounds/creature/pantherinae/spelaeattack": "Steppe lion attacks", 432 - "captions:sounds/creature/pantherinae/pardusroar": "!Leopard roars", 432 + "captions:sounds/creature/pantherinae/pardusroar": "Leopard roars", 433 433 "captions:sounds/creature/pantherinae/pardusattack": "Leopard attacks", 434 - "captions:sounds/creature/pantherinae/pantheraidle": "!Big cat growls", 434 + "captions:sounds/creature/pantherinae/pantheraidle": "Big cat growls", 435 435 "captions:sounds/creature/pantherinae/pantherahurt": "Big cat hit", 436 436 "captions:sounds/creature/pantherinae/pantheradeath": "Big cat dies", 437 437 "captions:sounds/creature/pantherinae/pantheracharge": "Big cat charges", 438 - "captions:sounds/creature/pantherinae/oncaroar": "!Jaguar roars", 438 + "captions:sounds/creature/pantherinae/oncaroar": "Jaguar roars", 439 439 "captions:sounds/creature/pantherinae/oncattack": "Jaguar attacks", 440 - "captions:sounds/creature/pantherinae/neofelisroar": "!Leopard roars", 440 + "captions:sounds/creature/pantherinae/neofelisroar": "Leopard roars", 441 441 "captions:sounds/creature/pantherinae/neofelisattack": "Leopard attacks", 442 442 "captions:sounds/creature/pantherinae/lick": "Big cat slurps", 443 - "captions:sounds/creature/pantherinae/leoroar": "!Lion roars", 443 + "captions:sounds/creature/pantherinae/leoroar": "Lion roars", 444 444 "captions:sounds/creature/pantherinae/leoattack": "Lion attacks", 445 445 "captions:sounds/creature/pantherinae/cubidle": "Cub mews", 446 446 "captions:sounds/creature/pantherinae/cubhurt": "Cub hit", 447 447 "captions:sounds/creature/pantherinae/cubdeath": "Cub dies", 448 - "captions:sounds/creature/pantherinae/atroxroar": "!Lion roars", 448 + "captions:sounds/creature/pantherinae/atroxroar": "Lion roars", 449 449 "captions:sounds/creature/pantherinae/atroxattack": "Lion attacks" 450 450 }