hedgewars/uLocale.pas
author Xeli
Fri, 07 Oct 2011 14:17:07 +0200
branchhedgeroid
changeset 6035 bdd0528ee8a6
parent 4976 088d40d8aba2
child 6453 11c578d30bd3
permissions -rw-r--r--
Close a game without leaking memory. It should be noted that sending an SDL Quit event leaks memory
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     1
(*
1066
1f1b3686a2b0 Update copyright headers a bit
unc0rr
parents: 1063
diff changeset
     2
 * Hedgewars, a free turn based strategy game
4976
088d40d8aba2 Happy 2011 :)
koda
parents: 4807
diff changeset
     3
 * Copyright (c) 2004-2011 Andrey Korotaev <unC0Rr@gmail.com>
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     4
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     8
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    12
 * GNU General Public License for more details.
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    13
 *
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    14
 * You should have received a copy of the GNU General Public License
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    15
 * along with this program; if not, write to the Free Software
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    17
 *)
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    18
2630
079ef82eac75 revamped file access and debug display
koda
parents: 2457
diff changeset
    19
{$INCLUDE "options.inc"}
079ef82eac75 revamped file access and debug display
koda
parents: 2457
diff changeset
    20
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    21
unit uLocale;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    22
interface
4361
64ea345ab655 Move variables from uConsts to uVariables
unc0rr
parents: 4246
diff changeset
    23
uses uTypes;
2863
9eb53b1f1842 Engine:
smxx
parents: 2747
diff changeset
    24
2142
48ed98cfd119 Make code suck less
unc0rr
parents: 2140
diff changeset
    25
const MAX_EVENT_STRINGS = 100;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    26
2905
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
    27
procedure LoadLocale(FileName: shortstring);
3926
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
    28
function  Format(fmt: shortstring; var arg: shortstring): shortstring;
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
    29
function  Format(fmt: ansistring; var arg: ansistring): ansistring;
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
    30
function  GetEventString(e: TEventId): ansistring;
2140
75e5c4fcae2a Death messages thanks to Smaxx
nemo
parents: 2039
diff changeset
    31
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    32
implementation
4403
unc0rr
parents: 4390
diff changeset
    33
uses uRandom, uUtils, uVariables, uDebug;
2142
48ed98cfd119 Make code suck less
unc0rr
parents: 2140
diff changeset
    34
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    35
var trevt: array[TEventId] of array [0..Pred(MAX_EVENT_STRINGS)] of ansistring;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    36
    trevt_n: array[TEventId] of integer;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    37
2905
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
    38
procedure LoadLocale(FileName: shortstring);
2999
30c4d62cd0c3 Engine:
smxx
parents: 2948
diff changeset
    39
var s: ansistring;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    40
    f: textfile;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 351
diff changeset
    41
    a, b, c: LongInt;
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    42
    first: array[TEventId] of boolean;
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    43
    e: TEventId;
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    44
    loaded: boolean;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    45
begin
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    46
loaded:= false;
2144
c76a2f7bd452 - Fix some ugly code
unc0rr
parents: 2143
diff changeset
    47
for e:= Low(TEventId) to High(TEventId) do first[e]:= true;
2140
75e5c4fcae2a Death messages thanks to Smaxx
nemo
parents: 2039
diff changeset
    48
2716
b9ca1bfca24f complete the replacement of init/free wrappers for every unit
koda
parents: 2693
diff changeset
    49
{$I-} // iochecks off
2747
7889a3a9724f Server:
smxx
parents: 2722
diff changeset
    50
Assign(f, FileName);
2716
b9ca1bfca24f complete the replacement of init/free wrappers for every unit
koda
parents: 2693
diff changeset
    51
filemode:= 0; // readonly
2747
7889a3a9724f Server:
smxx
parents: 2722
diff changeset
    52
Reset(f);
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    53
if IOResult = 0 then loaded:= true;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    54
TryDo(loaded, 'Cannot load locale "' + FileName + '"', false);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    55
if loaded then
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    56
   begin
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    57
   while not eof(f) do
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    58
       begin
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    59
       readln(f, s);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    60
       if Length(s) = 0 then continue;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    61
       if not (s[1] in ['0'..'9']) then continue;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    62
       TryDo(Length(s) > 6, 'Load locale: empty string', true);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    63
       val(s[1]+s[2], a, c);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    64
       TryDo(c = 0, 'Load locale: numbers should be two-digit: ' + s, true);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    65
       TryDo(s[3] = ':', 'Load locale: ":" expected', true);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    66
       val(s[4]+s[5], b, c);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    67
       TryDo(c = 0, 'Load locale: numbers should be two-digit' + s, true);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    68
       TryDo(s[6] = '=', 'Load locale: "=" expected', true);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    69
       Delete(s, 1, 6);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    70
       case a of
4807
180dbfb13903 display caption for ammotype amNothing when switched to so that players know what just happened
sheepluva
parents: 4403
diff changeset
    71
           0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then trammo[TAmmoStrId(b)]:= s;
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    72
           1: if (b >=0) and (b <= ord(High(TMsgStrId))) then trmsg[TMsgStrId(b)]:= s;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    73
           2: if (b >=0) and (b <= ord(High(TEventId))) then begin
4374
bcefeeabaa33 Move some stuff from uMisc to uUtils
unC0Rr
parents: 4361
diff changeset
    74
               TryDo(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + IntToStr(a) + ':' + IntToStr(b), false);
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    75
               if first[TEventId(b)] then
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    76
                   begin
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    77
                   trevt_n[TEventId(b)]:= 0;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    78
                   first[TEventId(b)]:= false;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    79
                   end;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    80
               trevt[TEventId(b)][trevt_n[TEventId(b)]]:= s;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    81
               inc(trevt_n[TEventId(b)]);
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    82
               end;
4807
180dbfb13903 display caption for ammotype amNothing when switched to so that players know what just happened
sheepluva
parents: 4403
diff changeset
    83
           3: if (b >=0) and (b <= ord(High(TAmmoStrId))) then trammoc[TAmmoStrId(b)]:= s;
180dbfb13903 display caption for ammotype amNothing when switched to so that players know what just happened
sheepluva
parents: 4403
diff changeset
    84
           4: if (b >=0) and (b <= ord(High(TAmmoStrId))) then trammod[TAmmoStrId(b)]:= s;
2863
9eb53b1f1842 Engine:
smxx
parents: 2747
diff changeset
    85
           5: if (b >=0) and (b <= ord(High(TGoalStrId))) then trgoal[TGoalStrId(b)]:= s;
2722
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    86
           end;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    87
       end;
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    88
   Close(f)
d891285e500f IOResult is a special variable
nemo
parents: 2721
diff changeset
    89
   end;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    90
{$I+}
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    91
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
    92
2905
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
    93
function GetEventString(e: TEventId): ansistring;
2140
75e5c4fcae2a Death messages thanks to Smaxx
nemo
parents: 2039
diff changeset
    94
begin
2948
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    95
    if trevt_n[e] = 0 then // no messages for this event type?
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    96
        GetEventString:= '*missing translation*'
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    97
    else
3f21a9dc93d0 Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents: 2908
diff changeset
    98
        GetEventString:= trevt[e][GetRandom(trevt_n[e])]; // Pick a random message and return it
2140
75e5c4fcae2a Death messages thanks to Smaxx
nemo
parents: 2039
diff changeset
    99
end;
75e5c4fcae2a Death messages thanks to Smaxx
nemo
parents: 2039
diff changeset
   100
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   101
function Format(fmt: shortstring; var arg: shortstring): shortstring;
371
731ad6d27bd1 integer -> LongInt
unc0rr
parents: 351
diff changeset
   102
var i: LongInt;
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   103
begin
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   104
i:= Pos('%1', fmt);
351
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 302
diff changeset
   105
if i = 0 then Format:= fmt
29bc9c36ad5f Fixed-point arithmetics in engine.
unc0rr
parents: 302
diff changeset
   106
         else Format:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg)
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   107
end;
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   108
2905
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   109
function Format(fmt: ansistring; var arg: ansistring): ansistring;
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   110
var i: LongInt;
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   111
begin
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   112
i:= Pos('%1', fmt);
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   113
if i = 0 then Format:= fmt
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   114
         else Format:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg)
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   115
end;
f3c79f7193a9 Engine:
smxx
parents: 2904
diff changeset
   116
3926
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
   117
procedure LoadLocaleWrapper(str: pchar); cdecl; export;
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
   118
begin
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
   119
    LoadLocale(Strpas(str));
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
   120
end;
668b71f31e51 use dynamic data from engine instead of using hardcoded values
koda
parents: 3774
diff changeset
   121
184
f97a7a3dc8f6 - Update more headers
unc0rr
parents: 183
diff changeset
   122
end.