Start voicepacks implementation
authorunc0rr
Mon, 12 Jan 2009 21:49:10 +0000
changeset 1654 9cfa6f23e767
parent 1653 34c1d1e3f04e
child 1655 16f687fc18e3
Start voicepacks implementation
hedgewars/CCHandlers.inc
hedgewars/uConsole.pas
hedgewars/uConsts.pas
hedgewars/uSound.pas
hedgewars/uTeams.pas
--- a/hedgewars/CCHandlers.inc	Mon Jan 12 18:51:37 2009 +0000
+++ b/hedgewars/CCHandlers.inc	Mon Jan 12 21:49:10 2009 +0000
@@ -74,7 +74,9 @@
 
    AddTeam(Color);
    CurrentTeam^.TeamName:= ts;
-   if GameType in [gmtDemo, gmtSave] then CurrentTeam^.ExtDriven:= true
+   if GameType in [gmtDemo, gmtSave] then CurrentTeam^.ExtDriven:= true;
+
+   CurrentTeam^.voicepack:= AskForVoicepack('Default')
    end
 end;
 
@@ -101,6 +103,14 @@
 CurrentTeam^.FortName:= s
 end;
 
+procedure chVoicepack(var s: shortstring);
+begin
+if CurrentTeam = nil then OutError(errmsgIncorrectUse + ' "/voicepack"', true);
+if s[1]='"' then Delete(s, 1, 1);
+if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1);
+CurrentTeam^.voicepack:= AskForVoicepack(s)
+end;
+
 procedure chAddHH(var id: shortstring);
 var s: shortstring;
     Gear: PGear;
--- a/hedgewars/uConsole.pas	Mon Jan 12 18:51:37 2009 +0000
+++ b/hedgewars/uConsole.pas	Mon Jan 12 21:49:10 2009 +0000
@@ -35,7 +35,7 @@
 implementation
 {$J+}
 uses uMisc, uStore, Types, uConsts, uGears, uTeams, uIO, uKeys, uWorld, uLand,
-     uRandom, uAmmos, uTriggers, uStats, uGame, uChat, SDLh;
+     uRandom, uAmmos, uTriggers, uStats, uGame, uChat, SDLh, uSound;
 
 const cLineWidth: LongInt = 0;
       cLinesCount = 256;
@@ -243,6 +243,7 @@
 RegisterVariable('gmflags' , vtLongInt, @GameFlags      , false);
 RegisterVariable('turntime', vtLongInt, @cHedgehogTurnTime, false);
 RegisterVariable('fort'    , vtCommand, @chFort         , false);
+RegisterVariable('voicepack',vtCommand, @chVoicepack    , false);
 RegisterVariable('grave'   , vtCommand, @chGrave        , false);
 RegisterVariable('bind'    , vtCommand, @chBind         , true );
 RegisterVariable('addhh'   , vtCommand, @chAddHH        , false);
--- a/hedgewars/uConsts.pas	Mon Jan 12 18:51:37 2009 +0000
+++ b/hedgewars/uConsts.pas	Mon Jan 12 21:49:10 2009 +0000
@@ -474,54 +474,53 @@
 			FileName: String[19];
 			Path    : TPathType;
 			id      : PMixChunk;
-			lastChan: LongInt;
 			end = (
-			(FileName: 'grenadeimpact.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndGrenadeImpact
-			(FileName:     'explosion.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndExplosion
-			(FileName:  'throwpowerup.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndThrowPowerUp
-			(FileName:  'throwrelease.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndThrowRelease
-			(FileName:        'splash.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndSplash
-			(FileName: 'shotgunreload.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndShotgunReload
-			(FileName:   'shotgunfire.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndShotgunFire
-			(FileName:   'graveimpact.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndGraveImpact
-			(FileName:      'minetick.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndMineTicks
-			(FileName:    'pickhammer.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndPickhammer
-			(FileName:           'gun.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndGun
-			(FileName:           'ufo.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndUFO
-			(FileName:         'Jump1.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndJump1
-			(FileName:         'Jump2.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndJump2
-			(FileName:         'Jump3.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndJump3
-			(FileName:        'Yessir.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndYesSir
-			(FileName:         'Laugh.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndLaugh
-			(FileName:     'Illgetyou.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndIllGetYou
-			(FileName:      'Incoming.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndIncoming
-			(FileName:        'Missed.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndMissed
-			(FileName:        'Stupid.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndStupid
-			(FileName:    'Firstblood.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndFirstBlood
-			(FileName:        'Boring.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndBoring
-			(FileName:        'Byebye.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndByeBye
-			(FileName:      'Sameteam.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndSameTeam
-			(FileName:        'Nutter.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndNutter
-			(FileName:'Reinforcements.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndReinforce
-			(FileName:       'Traitor.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndTraitor
-			(FileName:'Youllregretthat.ogg';Path: ptVoices; id: nil; lastChan: 0),// sndRegret
-			(FileName:     'Enemydown.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndEnemyDown
-			(FileName:        'Coward.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndCoward
-			(FileName:         'Hurry.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndHurry
-			(FileName:       'Watchit.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndWatchIt
-			(FileName:      'Kamikaze.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndKamikaze
-			(FileName:         'cake2.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndCake
-			(FileName:           'Ow1.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndOw1
-			(FileName:           'Ow4.ogg'; Path: ptVoices; id: nil; lastChan: 0),// sndOw4
-			(FileName:    'Firepunch1.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch1
-			(FileName:    'Firepunch2.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch2
-			(FileName:    'Firepunch3.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch3
-			(FileName:    'Firepunch4.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch4
-			(FileName:    'Firepunch5.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch5
-			(FileName:    'Firepunch6.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndFirepunch6
-			(FileName:         'Melon.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndMelon
-			(FileName:       'Hellish.ogg'; Path: ptSounds; id: nil; lastChan: 0),// sndHellish
-			(FileName:        'Yoohoo.ogg'; Path: ptSounds; id: nil; lastChan: 0) // sndYoohoo
+			(FileName: 'grenadeimpact.ogg'; Path: ptSounds; id: nil),// sndGrenadeImpact
+			(FileName:     'explosion.ogg'; Path: ptSounds; id: nil),// sndExplosion
+			(FileName:  'throwpowerup.ogg'; Path: ptSounds; id: nil),// sndThrowPowerUp
+			(FileName:  'throwrelease.ogg'; Path: ptSounds; id: nil),// sndThrowRelease
+			(FileName:        'splash.ogg'; Path: ptSounds; id: nil),// sndSplash
+			(FileName: 'shotgunreload.ogg'; Path: ptSounds; id: nil),// sndShotgunReload
+			(FileName:   'shotgunfire.ogg'; Path: ptSounds; id: nil),// sndShotgunFire
+			(FileName:   'graveimpact.ogg'; Path: ptSounds; id: nil),// sndGraveImpact
+			(FileName:      'minetick.ogg'; Path: ptSounds; id: nil),// sndMineTicks
+			(FileName:    'pickhammer.ogg'; Path: ptSounds; id: nil),// sndPickhammer
+			(FileName:           'gun.ogg'; Path: ptSounds; id: nil),// sndGun
+			(FileName:           'ufo.ogg'; Path: ptSounds; id: nil),// sndUFO
+			(FileName:         'Jump1.ogg'; Path: ptVoices; id: nil),// sndJump1
+			(FileName:         'Jump2.ogg'; Path: ptVoices; id: nil),// sndJump2
+			(FileName:         'Jump3.ogg'; Path: ptVoices; id: nil),// sndJump3
+			(FileName:        'Yessir.ogg'; Path: ptVoices; id: nil),// sndYesSir
+			(FileName:         'Laugh.ogg'; Path: ptVoices; id: nil),// sndLaugh
+			(FileName:     'Illgetyou.ogg'; Path: ptVoices; id: nil),// sndIllGetYou
+			(FileName:      'Incoming.ogg'; Path: ptVoices; id: nil),// sndIncoming
+			(FileName:        'Missed.ogg'; Path: ptVoices; id: nil),// sndMissed
+			(FileName:        'Stupid.ogg'; Path: ptVoices; id: nil),// sndStupid
+			(FileName:    'Firstblood.ogg'; Path: ptVoices; id: nil),// sndFirstBlood
+			(FileName:        'Boring.ogg'; Path: ptVoices; id: nil),// sndBoring
+			(FileName:        'Byebye.ogg'; Path: ptVoices; id: nil),// sndByeBye
+			(FileName:      'Sameteam.ogg'; Path: ptVoices; id: nil),// sndSameTeam
+			(FileName:        'Nutter.ogg'; Path: ptVoices; id: nil),// sndNutter
+			(FileName:'Reinforcements.ogg'; Path: ptVoices; id: nil),// sndReinforce
+			(FileName:       'Traitor.ogg'; Path: ptVoices; id: nil),// sndTraitor
+			(FileName:'Youllregretthat.ogg';Path: ptVoices; id: nil),// sndRegret
+			(FileName:     'Enemydown.ogg'; Path: ptVoices; id: nil),// sndEnemyDown
+			(FileName:        'Coward.ogg'; Path: ptVoices; id: nil),// sndCoward
+			(FileName:         'Hurry.ogg'; Path: ptVoices; id: nil),// sndHurry
+			(FileName:       'Watchit.ogg'; Path: ptVoices; id: nil),// sndWatchIt
+			(FileName:      'Kamikaze.ogg'; Path: ptVoices; id: nil),// sndKamikaze
+			(FileName:         'cake2.ogg'; Path: ptSounds; id: nil),// sndCake
+			(FileName:           'Ow1.ogg'; Path: ptVoices; id: nil),// sndOw1
+			(FileName:           'Ow4.ogg'; Path: ptVoices; id: nil),// sndOw4
+			(FileName:    'Firepunch1.ogg'; Path: ptSounds; id: nil),// sndFirepunch1
+			(FileName:    'Firepunch2.ogg'; Path: ptSounds; id: nil),// sndFirepunch2
+			(FileName:    'Firepunch3.ogg'; Path: ptSounds; id: nil),// sndFirepunch3
+			(FileName:    'Firepunch4.ogg'; Path: ptSounds; id: nil),// sndFirepunch4
+			(FileName:    'Firepunch5.ogg'; Path: ptSounds; id: nil),// sndFirepunch5
+			(FileName:    'Firepunch6.ogg'; Path: ptSounds; id: nil),// sndFirepunch6
+			(FileName:         'Melon.ogg'; Path: ptSounds; id: nil),// sndMelon
+			(FileName:       'Hellish.ogg'; Path: ptSounds; id: nil),// sndHellish
+			(FileName:        'Yoohoo.ogg'; Path: ptSounds; id: nil) // sndYoohoo
 			);
 
 	Ammoz: array [TAmmoType] of record
--- a/hedgewars/uSound.pas	Mon Jan 12 18:51:37 2009 +0000
+++ b/hedgewars/uSound.pas	Mon Jan 12 21:49:10 2009 +0000
@@ -1,6 +1,6 @@
 (*
  * Hedgewars, a free turn based strategy game
- * Copyright (c) 2005, 2007 Andrey Korotaev <unC0Rr@gmail.com>
+ * Copyright (c) 2005, 2007, 2009 Andrey Korotaev <unC0Rr@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,6 +21,12 @@
 uses SDLh, uConsts;
 {$INCLUDE options.inc}
 
+type PVoicepack = ^TVoicepack;
+	TVoicepack = record
+		name: shortstring;
+		chunks: array [TSound] of PMixChunk;
+		end;
+
 procedure InitSound;
 procedure ReleaseSound;
 procedure SoundLoad;
@@ -28,6 +34,7 @@
 procedure PlayMusic;
 procedure StopSound(snd: TSound);
 function  ChangeVolume(voldelta: LongInt): LongInt;
+function  AskForVoicepack(name: shortstring): Pointer;
 
 var MusicFN: shortstring = '';
 
@@ -36,7 +43,23 @@
 
 const chanTPU = 12;
 var Mus: PMixMusic = nil;
-    Volume: LongInt;
+	Volume: LongInt;
+	lastChan: array [TSound] of LongInt;
+	voicepacks: array[0..cMaxTeams] of TVoicepack;
+
+function  AskForVoicepack(name: shortstring): Pointer;
+var i: Longword;
+begin
+i:= 0;
+while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') do
+	begin
+	inc(i);
+	TryDo(i <= cMaxTeams, 'Engine bug: AskForVoicepack i > cMaxTeams', true)
+	end;
+
+voicepacks[i].name:= name;
+AskForVoicepack:= @voicepacks[i]
+end;
 
 procedure InitSound;
 begin
@@ -70,14 +93,16 @@
     s: shortstring;
 begin
 if not isSoundEnabled then exit;
+AskForVoicepack('Default');
+
 for i:= Low(TSound) to High(TSound) do
-    begin
-    s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName;
-    WriteToConsole(msgLoading + s + ' ');
-    Soundz[i].id:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1);
-    TryDo(Soundz[i].id <> nil, msgFailed, true);
-    WriteLnToConsole(msgOK);
-    end;
+	begin
+	s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName;
+	WriteToConsole(msgLoading + s + ' ');
+	Soundz[i].id:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1);
+	TryDo(Soundz[i].id <> nil, msgFailed, true);
+	WriteLnToConsole(msgOK);
+	end;
 end;
 
 procedure PlaySound(snd: TSound; infinite: boolean);
@@ -85,14 +110,14 @@
 begin
 if (not isSoundEnabled) or fastUntilLag then exit;
 if infinite then loops:= -1 else loops:= 0;
-Soundz[snd].lastChan:= Mix_PlayChannelTimed(-1, Soundz[snd].id, loops, -1)
+lastChan[snd]:= Mix_PlayChannelTimed(-1, Soundz[snd].id, loops, -1)
 end;
 
 procedure StopSound(snd: TSound);
 begin
 if not isSoundEnabled then exit;
-if Mix_Playing(Soundz[snd].lastChan) <> 0 then
-   Mix_HaltChannel(Soundz[snd].lastChan)
+if Mix_Playing(lastChan[snd]) <> 0 then
+	Mix_HaltChannel(lastChan[snd])
 end;
 
 procedure PlayMusic;
@@ -115,7 +140,7 @@
 function ChangeVolume(voldelta: LongInt): LongInt;
 begin
 if not isSoundEnabled then
-   exit(0);
+	exit(0);
 
 inc(Volume, voldelta);
 if Volume < 0 then Volume:= 0;
--- a/hedgewars/uTeams.pas	Mon Jan 12 18:51:37 2009 +0000
+++ b/hedgewars/uTeams.pas	Mon Jan 12 21:49:10 2009 +0000
@@ -18,7 +18,7 @@
 
 unit uTeams;
 interface
-uses SDLh, uConsts, uKeys, uGears, uRandom, uFloat, uStats, GL;
+uses SDLh, uConsts, uKeys, uGears, uRandom, uFloat, uStats, GL, uSound;
 {$INCLUDE options.inc}
 
 type PHHAmmo = ^THHAmmo;
@@ -66,6 +66,7 @@
 			AttackBar: LongWord;
 			HedgehogsNumber: Longword;
 			hasGone: boolean;
+			voicepack: PVoicepack;
 			end;
 			
 	TClan = record
@@ -97,7 +98,7 @@
 procedure TeamGone(s: shortstring);
 
 implementation
-uses uMisc, uWorld, uAI, uLocale, uConsole, uAmmos, uSound, uChat;
+uses uMisc, uWorld, uAI, uLocale, uConsole, uAmmos, uChat;
 const MaxTeamHealth: LongInt = 0;
 
 procedure FreeTeamsList; forward;