# HG changeset patch # User Wuzzy # Date 1520529306 -3600 # Node ID de07c8423bebbfdb75488f94fa173ab699072af3 # Parent be5d9fd2c56ab74eca1a7d6e66888944bc101b0f Lua API: Add SetSoundMask to disable playing certain sounds diff -r be5d9fd2c56a -r de07c8423beb ChangeLog.txt --- a/ChangeLog.txt Thu Mar 08 17:07:14 2018 +0100 +++ b/ChangeLog.txt Thu Mar 08 18:15:06 2018 +0100 @@ -92,6 +92,7 @@ + New call: SpawnSupplyCrate(x, y, content, [, amount]): Spawn ammo or utility crate, depending on content + New call: HealHog(gearUid, healthBoost[, showMessage[, tint]]): Heal hedgehog with graphical effects and message + New call: SetTeamLabel(teamname[, label]): Set an arbitrary label for a team, will be displayed next to the team bar + + New call: SetSoundMask(soundId, isMasked): Allows to disable playing a sound effect from engine + New callback: onEndTurn(): Called at the end of a turn (when gears have settled) + New hedgehog effect: heArtillery: Per-hedgehog artillery mode (can't walk). Values: 1 = permanently active. 2 = temporarily active (sniper rifle). 0 = not active * AddAmmo now automatically unselects weapon if it would remove current ammo from current hedgehog diff -r be5d9fd2c56a -r de07c8423beb hedgewars/uScript.pas --- a/hedgewars/uScript.pas Thu Mar 08 17:07:14 2018 +0100 +++ b/hedgewars/uScript.pas Thu Mar 08 18:15:06 2018 +0100 @@ -2059,18 +2059,37 @@ begin // no gear specified if n = 1 then - PlaySound(TSound(s)) + PlaySound(TSound(s), false, true) else begin gear:= GearByUID(Trunc(lua_tonumber(L, 2))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - AddVoice(TSound(s),gear^.Hedgehog^.Team^.Voicepack) + AddVoice(TSound(s), gear^.Hedgehog^.Team^.Voicepack, true) end; end; end; lc_playsound:= 0; end; +function lc_setsoundmask(L : Plua_State) : LongInt; Cdecl; +var s: LongInt; + soundState: boolean; +const + call = 'SetSoundMasked'; + params = 'soundId, isMasked]'; +begin + if CheckLuaParamCount(L, 2, call, params) then + begin + s:= LuaToSoundOrd(L, 1, call, params); + if s <> Ord(sndNone) then + begin + soundState:= lua_toboolean(L, 2); + MaskedSounds[TSound(s)]:= soundState; + end; + end; + lc_setsoundmask:= 0; +end; + function lc_addteam(L : Plua_State) : LongInt; Cdecl; var np: LongInt; begin @@ -3785,6 +3804,7 @@ lua_register(luaState, _P'SetAmmo', @lc_setammo); lua_register(luaState, _P'SetAmmoDelay', @lc_setammodelay); lua_register(luaState, _P'PlaySound', @lc_playsound); +lua_register(luaState, _P'SetSoundMask', @lc_setsoundmask); lua_register(luaState, _P'GetTeamName', @lc_getteamname); lua_register(luaState, _P'GetTeamIndex', @lc_getteamindex); lua_register(luaState, _P'GetTeamClan', @lc_getteamclan); diff -r be5d9fd2c56a -r de07c8423beb hedgewars/uSound.pas --- a/hedgewars/uSound.pas Thu Mar 08 17:07:14 2018 +0100 +++ b/hedgewars/uSound.pas Thu Mar 08 18:15:06 2018 +0100 @@ -63,8 +63,10 @@ // then the sound's playback won't be interrupted if asked to play again. procedure PlaySound(snd: TSound); procedure PlaySound(snd: TSound; keepPlaying: boolean); +procedure PlaySound(snd: TSound; keepPlaying: boolean; ignoreMask: boolean); procedure PlaySoundV(snd: TSound; voicepack: PVoicepack); procedure PlaySoundV(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean); +procedure PlaySoundV(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean; ignoreMask: boolean); // Plays sound snd [of voicepack] in a loop, but starts with fadems milliseconds of fade-in. // Returns sound channel of the looped sound. @@ -80,6 +82,7 @@ procedure StopSoundChan(chn, fadems: LongInt); procedure AddVoice(snd: TSound; voicepack: PVoicepack); +procedure AddVoice(snd: TSound; voicepack: PVoicepack; ignoreMask: boolean); procedure PlayNextVoice; @@ -414,20 +417,30 @@ procedure PlaySound(snd: TSound); begin - PlaySoundV(snd, nil, false); + PlaySoundV(snd, nil, false, false); end; procedure PlaySound(snd: TSound; keepPlaying: boolean); begin - PlaySoundV(snd, nil, keepPlaying); + PlaySoundV(snd, nil, keepPlaying, false); +end; + +procedure PlaySound(snd: TSound; keepPlaying: boolean; ignoreMask: boolean); +begin + PlaySoundV(snd, nil, keepPlaying, ignoreMask); end; procedure PlaySoundV(snd: TSound; voicepack: PVoicepack); begin - PlaySoundV(snd, voicepack, false); + PlaySoundV(snd, voicepack, false, false); end; procedure PlaySoundV(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean); +begin + PlaySoundV(snd, voicepack, keepPlaying, false); +end; + +procedure PlaySoundV(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean; ignoreMask: boolean); var s:shortstring; rwops: PSDL_RWops; begin @@ -437,6 +450,9 @@ if keepPlaying and (lastChan[snd] <> -1) and (Mix_Playing(lastChan[snd]) <> 0) then exit; + if (ignoreMask = false) and (MaskedSounds[snd] = true) then + exit; + if (voicepack <> nil) then begin if (voicepack^.chunks[snd] = nil) and (Soundz[snd].Path = ptVoices) and (Soundz[snd].FileName <> '') then @@ -486,10 +502,19 @@ end; procedure AddVoice(snd: TSound; voicepack: PVoicepack); +begin + AddVoice(snd, voicepack, false); +end; + +procedure AddVoice(snd: TSound; voicepack: PVoicepack; ignoreMask: boolean); var i : LongInt; begin + if (not isSoundEnabled) or fastUntilLag or ((LastVoice.snd = snd) and (LastVoice.voicepack = voicepack)) then exit; + if (ignoreMask = false) and (MaskedSounds[snd] = true) then + exit; + if (snd = sndVictory) or (snd = sndFlawless) then begin Mix_FadeOutChannel(-1, 800); diff -r be5d9fd2c56a -r de07c8423beb hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Thu Mar 08 17:07:14 2018 +0100 +++ b/hedgewars/uVariables.pas Thu Mar 08 18:15:06 2018 +0100 @@ -254,6 +254,8 @@ LuaEndTurnRequested: boolean; LuaNoEndTurnTaunts: boolean; + MaskedSounds : array[TSound] of boolean; + LastVoice : TVoice; mobileRecord: TMobileRecord; @@ -2640,6 +2642,7 @@ procedure initModule; var s: shortstring; i: integer; + t: TSound; begin // init LastVoice LastVoice.snd:= sndNone; @@ -2901,6 +2904,9 @@ LuaEndTurnRequested:= false; LuaNoEndTurnTaunts:= false; + for t:= Low(TSound) to High(TSound) do + MaskedSounds[t]:= false; + UIDisplay:= uiAll; LocalMessage:= 0;