<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.soldat.pl/index.php?action=history&amp;feed=atom&amp;title=Map_Specifications</id>
		<title>Map Specifications - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.soldat.pl/index.php?action=history&amp;feed=atom&amp;title=Map_Specifications"/>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Map_Specifications&amp;action=history"/>
		<updated>2026-05-26T03:20:46Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Map_Specifications&amp;diff=40&amp;oldid=prev</id>
		<title>Freeman: Created page with &quot;===Script by: Curt=== &lt;source lang=&quot;pascal&quot;&gt;//Script by Curt (DorkeyDear) //ReturnFlag modified by Curt; origonal author is J-Factor  type   tGroup = record     SpreadSpawn, D...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Map_Specifications&amp;diff=40&amp;oldid=prev"/>
				<updated>2012-08-14T16:49:22Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;===Script by: Curt=== &amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;//Script by Curt (DorkeyDear) //ReturnFlag modified by Curt; origonal author is J-Factor  type   tGroup = record     SpreadSpawn, D...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Script by: Curt===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;pascal&amp;quot;&amp;gt;//Script by Curt (DorkeyDear)&lt;br /&gt;
//ReturnFlag modified by Curt; origonal author is J-Factor&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  tGroup = record&lt;br /&gt;
    SpreadSpawn, DisableFlags, IgnoreWeapons: boolean;&lt;br /&gt;
    Command, Welcome: array of string;&lt;br /&gt;
    Map: array of record&lt;br /&gt;
      Style: byte;&lt;br /&gt;
      Name: string;&lt;br /&gt;
    end;&lt;br /&gt;
    Team: array[0..5] of record&lt;br /&gt;
      AllowPickup: boolean;&lt;br /&gt;
      Balance: byte;&lt;br /&gt;
      DealDmgMtp, RecvDmgMtp: single;&lt;br /&gt;
      Weapon: array[1..14] of boolean;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  AfterMapChange: boolean;&lt;br /&gt;
  GID: byte;&lt;br /&gt;
  Group: array of tGroup;&lt;br /&gt;
&lt;br /&gt;
function StrtoBool(Text: string; Default: boolean): boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := Default;&lt;br /&gt;
  case (LowerCase(Text)) of&lt;br /&gt;
    '1', 'true', 'enabled', 'enable', 'on': Result := true;&lt;br /&gt;
    '0', 'false', 'disabled', 'disable', 'off': Result := false;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function VnttoInt(Value: Variant): integer;&lt;br /&gt;
begin&lt;br /&gt;
  Result := Value;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function RealtoListWeapNum(Weapon: byte): byte;&lt;br /&gt;
begin&lt;br /&gt;
  if (Weapon = 0) then Result := 11 else if (Weapon &amp;lt;= 10) then Result := Weapon else if ((Weapon &amp;gt;= 14) and (Weapon &amp;lt;= 16)) then Result := Result - 2 else Result := 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure ReturnFlag(Team: byte);&lt;br /&gt;
var&lt;br /&gt;
  i: byte;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 1 to 254 do begin&lt;br /&gt;
    if ((GetObjectStat(i, 'Active') = true) and (GetObjectStat(i, 'Style') = Team)) then begin&lt;br /&gt;
      KillObject(i);&lt;br /&gt;
      break;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function ReadData(Filename: string): array of tGroup;&lt;br /&gt;
var&lt;br /&gt;
  i, j, k, HighA, HighB: byte;&lt;br /&gt;
  Weapons: string;&lt;br /&gt;
begin&lt;br /&gt;
  try&lt;br /&gt;
    HighA := StrtoInt(ReadINI(Filename, 'Groups', 'GHigh', ' '));&lt;br /&gt;
    SetArrayLength(Result, HighA + 1);&lt;br /&gt;
    for i := 0 to HighA do begin&lt;br /&gt;
      if (i &amp;lt;&amp;gt; 0) then begin&lt;br /&gt;
        HighB := StrtoInt(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'MHigh', ' '));&lt;br /&gt;
        SetArrayLength(Result[i].Map, HighB);&lt;br /&gt;
        if (HighB &amp;gt;= 0) then for j := 0 to HighB - 1 do begin&lt;br /&gt;
          case (LowerCase(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'M' + InttoStr(j + 1) + 'Style', ' '))) of&lt;br /&gt;
            '0', 'normal', 'regular', 'exact', 'match': Result[i].Map[j].Style := 0;&lt;br /&gt;
            '1', 'mask', 'maskcheck', 'wildcard', 'wildcards': Result[i].Map[j].Style := 1;&lt;br /&gt;
            '2', 'regular expressions', 'regular expression', 'reg exp', 'regularexpressions', 'regularexpression', 'regexp': Result[i].Map[j].Style := 2;&lt;br /&gt;
          end;&lt;br /&gt;
          Result[i].Map[j].Name := ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'M' + InttoStr(j + 1), '');&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
      Result[i].DisableFlags := StrtoBool(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'DisableFlags', ' '), false);&lt;br /&gt;
      Result[i].IgnoreWeapons := StrtoBool(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'IgnoreWeapons', ' '), false);&lt;br /&gt;
      for j := 0 to 5 do begin&lt;br /&gt;
        if (j &amp;lt;&amp;gt; 5) then begin&lt;br /&gt;
          if (Result[i].IgnoreWeapons = false) then begin&lt;br /&gt;
            Weapons := ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'T' + InttoStr(j) + 'Weapons', '');&lt;br /&gt;
            if (Length(Weapons) = 14) then for k := 1 to 14 do Result[i].Team[j].Weapon[k] := StrtoBool(Weapons[k], false) else begin&lt;br /&gt;
              WriteLn(' [*] [Error] ' + ScriptName + ' -&amp;gt; (ReadData): Invalid datatype');&lt;br /&gt;
              Result := Group;&lt;br /&gt;
              exit;&lt;br /&gt;
            end;&lt;br /&gt;
          end;&lt;br /&gt;
          Result[i].Team[j].AllowPickup := StrtoBool(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'T' + InttoStr(j) + 'AllowPickup', ' '), true);&lt;br /&gt;
          Result[i].Team[j].DealDmgMtp := StrtoFloat(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'T' + InttoStr(j) + 'DealDmgMtp', ' '));&lt;br /&gt;
          Result[i].Team[j].RecvDmgMtp := StrtoFloat(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'T' + InttoStr(j) + 'RecvDmgMtp', ' '));&lt;br /&gt;
        end;&lt;br /&gt;
        Result[i].Team[j].Balance := StrtoInt(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'T' + InttoStr(j) + 'Balance', ' '));&lt;br /&gt;
      end;&lt;br /&gt;
      HighB := StrtoInt(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'CHigh', ' '));&lt;br /&gt;
      SetArrayLength(Result[i].Command, HighB);&lt;br /&gt;
      if (HighB &amp;gt; 0) then for j := 0 to HighB - 1 do Result[i].Command[j] := ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'C' + InttoStr(j + 1), '');&lt;br /&gt;
      HighB := StrtoInt(ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'WHigh', ' '));&lt;br /&gt;
      SetArrayLength(Result[i].Welcome, HighB);&lt;br /&gt;
      if (HighB &amp;gt; 0) then for j := 0 to HighB - 1 do Result[i].Welcome[j] := ReadINI(Filename, 'Groups', 'G' + InttoStr(i) + 'W' + InttoStr(j + 1), '');&lt;br /&gt;
    end;&lt;br /&gt;
  except&lt;br /&gt;
    WriteLn(' [*] [Error] ' + ScriptName + ' -&amp;gt; (ReadData): Invalid datatype');&lt;br /&gt;
    Result := Group;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure ActivateServer();&lt;br /&gt;
var&lt;br /&gt;
  i, j: byte;&lt;br /&gt;
begin&lt;br /&gt;
  if (CurrentMap = '') then CurrentMap := GetPiece(ReadFile('mapslist.txt'), Chr(13) + Chr(10), 0);&lt;br /&gt;
  Group := ReadData('scripts/' + ScriptName + '/data.ini');&lt;br /&gt;
  AfterMapChange := true;&lt;br /&gt;
  GID := 0;&lt;br /&gt;
  for i := 1 to GetArrayLength(Group) - 1 do for j := 0 to GetArrayLength(Group[i].Map) - 1 do begin&lt;br /&gt;
    case (Group[i].Map[j].Style) of&lt;br /&gt;
      0: if (LowerCase(Group[i].Map[j].Name) = LowerCase(CurrentMap)) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
      1: if (MaskCheck(LowerCase(CurrentMap), LowerCase(Group[i].Map[j].Name))) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
      2: if (RegExpMatch(LowerCase(Group[i].Map[j].Name), LowerCase(CurrentMap))) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure AppOnIdle(Ticks: integer);&lt;br /&gt;
var&lt;br /&gt;
  i, j: byte;&lt;br /&gt;
begin&lt;br /&gt;
  if (AfterMapChange) then begin&lt;br /&gt;
    AfterMapChange := false;&lt;br /&gt;
    if (Group[GID].IgnoreWeapons = false) then for i := 1 to 32 do if (GetPlayerStat(i, 'Active') = true) then for j := 1 to 14 do SetWeaponActive(i, j, Group[GID].Team[VnttoInt(GetPlayerStat(i, 'Team'))].Weapon[j]);&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure OnMapChange(NewMap: string);&lt;br /&gt;
var&lt;br /&gt;
  i, j: byte;&lt;br /&gt;
begin&lt;br /&gt;
  AfterMapChange := true;&lt;br /&gt;
  GID := 0;&lt;br /&gt;
  for i := 1 to GetArrayLength(Group) - 1 do for j := 0 to GetArrayLength(Group[i].Map) - 1 do begin&lt;br /&gt;
    case (Group[i].Map[j].Style) of&lt;br /&gt;
      0: if (LowerCase(Group[i].Map[j].Name) = LowerCase(NewMap)) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
      1: if (MaskCheck(LowerCase(NewMap), LowerCase(Group[i].Map[j].Name))) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
      2: if (RegExpMatch(LowerCase(Group[i].Map[j].Name), LowerCase(NewMap))) then begin&lt;br /&gt;
        GID := i;&lt;br /&gt;
        break;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
  if (GetArrayLength(Group[GID].Command) &amp;gt; 0) then for i := 0 to GetArrayLength(Group[GID].Command) - 1 do Command('/' + Group[GID].Command[i]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure OnJoinGame(ID, Team: byte);&lt;br /&gt;
var&lt;br /&gt;
  i: byte;&lt;br /&gt;
begin&lt;br /&gt;
  if (GetArrayLength(Group[GID].Welcome) &amp;gt; 0) then for i := 0 to GetArrayLength(Group[GID].Welcome) - 1 do SaytoPlayer(ID, Group[GID].Welcome[i]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure OnJoinTeam(ID, Team: byte);&lt;br /&gt;
var&lt;br /&gt;
  i: byte;&lt;br /&gt;
  Players: array[0..4] of byte;&lt;br /&gt;
  Points: array[0..4] of integer;&lt;br /&gt;
  High: integer;&lt;br /&gt;
  HighTeams: string;&lt;br /&gt;
begin&lt;br /&gt;
  for i := 1 to 32 do if (GetPlayerStat(i, 'Team') &amp;lt;&amp;gt; 5) then Players[VnttoInt(GetPlayerStat(i, 'Team'))] := Players[VnttoInt(GetPlayerStat(i, 'Team'))] + 1;&lt;br /&gt;
  if (Team &amp;lt;&amp;gt; 5) then Players[Team] := Players[Team] - 1;&lt;br /&gt;
  for i := 0 to 4 do Points[i] := Group[GID].Team[i].Balance * Players[i];&lt;br /&gt;
  for i := 0 to 4 do if (Group[GID].Team[i].Balance &amp;lt;&amp;gt; 255) then if (Points[i] &amp;lt; High) then begin&lt;br /&gt;
    High := Points[i];&lt;br /&gt;
    HighTeams := InttoStr(i)&lt;br /&gt;
  end else if (Points[i] = High) then HighTeams := HighTeams + InttoStr(i);&lt;br /&gt;
  for i := 0 to 5 do if ((ContainsString(HighTeams, InttoStr(i)) = false) and (Group[GID].Team[i].Balance = 0)) then HighTeams := HighTeams + InttoStr(i);&lt;br /&gt;
  if (ContainsString(HighTeams, InttoStr(Team)) = false) then begin&lt;br /&gt;
    i := Random(0, 5);&lt;br /&gt;
    while (ContainsString(HighTeams, InttoStr(i)) = false) do i := Random(0, 5);&lt;br /&gt;
    Command('/setteam' + InttoStr(i) + ' ' + InttoStr(ID));&lt;br /&gt;
    SaytoPlayer(ID, 'That team is full with players.');&lt;br /&gt;
  end;&lt;br /&gt;
  if ((Group[GID].IgnoreWeapons = false) and (Team &amp;lt;&amp;gt; 5)) then for i := 1 to 14 do SetWeaponActive(ID, i, Group[GID].Team[Team].Weapon[i]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure OnWeaponChange(ID, PrimaryNum, SecondaryNum: byte);&lt;br /&gt;
begin&lt;br /&gt;
  PrimaryNum := RealtoListWeapNum(PrimaryNum);&lt;br /&gt;
  if ((PrimaryNum &amp;lt;&amp;gt; 0) and (Group[GID].Team[VnttoInt(GetPlayerStat(ID, 'Team'))].AllowPickup = false)) then if (Group[GID].Team[VnttoInt(GetPlayerStat(ID, 'Team'))].Weapon[PrimaryNum] = false) then ForceWeapon(ID, SecondaryNum, 255, 0);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function OnPlayerDamage(Victim, Shooter: byte; Damage: integer): integer;&lt;br /&gt;
begin&lt;br /&gt;
  Damage := Round(Damage * Group[GID].Team[VnttoInt(GetPlayerStat(Shooter, 'Team'))].DealDmgMtp * Group[GID].Team[VnttoInt(GetPlayerStat(Victim, 'Team'))].RecvDmgMtp);&lt;br /&gt;
  Result := Damage;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure OnFlagGrab(ID, TeamFlag: byte; GrabbedInBase: boolean);&lt;br /&gt;
begin&lt;br /&gt;
  if (Group[GID].DisableFlags) then ReturnFlag(TeamFlag);&lt;br /&gt;
end;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==data.ini example==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;[Groups]&lt;br /&gt;
GHigh=1&lt;br /&gt;
&lt;br /&gt;
G0DisableFlags=false&lt;br /&gt;
G0IgnoreWeapons=true&lt;br /&gt;
G0T0Weapons=11111111111111&lt;br /&gt;
G0T0AllowPickup=true&lt;br /&gt;
G0T0Balance=-1&lt;br /&gt;
G0T0DealDmgMtp=1&lt;br /&gt;
G0T0RecvDmgMtp=1&lt;br /&gt;
G0T1Weapons=11111111111111&lt;br /&gt;
G0T1AllowPickup=true&lt;br /&gt;
G0T1Balance=1&lt;br /&gt;
G0T1DealDmgMtp=1&lt;br /&gt;
G0T1RecvDmgMtp=1&lt;br /&gt;
G0T2Weapons=11111111111111&lt;br /&gt;
G0T2AllowPickup=true&lt;br /&gt;
G0T2Balance=1&lt;br /&gt;
G0T2DealDmgMtp=1&lt;br /&gt;
G0T2RecvDmgMtp=1&lt;br /&gt;
G0T3Weapons=11111111111111&lt;br /&gt;
G0T3AllowPickup=true&lt;br /&gt;
G0T3Balance=-1&lt;br /&gt;
G0T3DealDmgMtp=1&lt;br /&gt;
G0T3RecvDmgMtp=1&lt;br /&gt;
G0T4Weapons=11111111111111&lt;br /&gt;
G0T4AllowPickup=true&lt;br /&gt;
G0T4Balance=-1&lt;br /&gt;
G0T4DealDmgMtp=1&lt;br /&gt;
G0T4RecvDmgMtp=1&lt;br /&gt;
G0T5Balance=0&lt;br /&gt;
G0CHigh=2&lt;br /&gt;
G0C1=loadwep weapons&lt;br /&gt;
G0C2=say No mod available on this map&lt;br /&gt;
G0WHigh=1&lt;br /&gt;
G0W1=Welcome! No mod on this map.&lt;br /&gt;
&lt;br /&gt;
G1MHigh=1&lt;br /&gt;
G1M1=ctf_*&lt;br /&gt;
G1M1Style=mask&lt;br /&gt;
G1DisableFlags=true&lt;br /&gt;
G1IgnoreWeapons=false&lt;br /&gt;
G1T0Weapons=00000000001000&lt;br /&gt;
G1T0AllowPickup=false&lt;br /&gt;
G1T0Balance=-1&lt;br /&gt;
G1T0DealDmgMtp=0&lt;br /&gt;
G1T0RecvDmgMtp=10&lt;br /&gt;
G1T1Weapons=11111101101100&lt;br /&gt;
G1T1AllowPickup=false&lt;br /&gt;
G1T1Balance=0&lt;br /&gt;
G1T1DealDmgMtp=1&lt;br /&gt;
G1T1RecvDmgMtp=10&lt;br /&gt;
G1T2Weapons=00000000000010&lt;br /&gt;
G1T2AllowPickup=false&lt;br /&gt;
G1T2Balance=0&lt;br /&gt;
G1T2DealDmgMtp=10&lt;br /&gt;
G1T2RecvDmgMtp=0.25&lt;br /&gt;
G1T3Weapons=00000000001000&lt;br /&gt;
G1T3AllowPickup=false&lt;br /&gt;
G1T3Balance=-1&lt;br /&gt;
G1T3DealDmgMtp=0&lt;br /&gt;
G1T3RecvDmgMtp=10&lt;br /&gt;
G1T4Weapons=00000000001000&lt;br /&gt;
G1T4AllowPickup=false&lt;br /&gt;
G1T4Balance=-1&lt;br /&gt;
G1T4DealDmgMtp=0&lt;br /&gt;
G1T4RecvDmgMtp=10&lt;br /&gt;
G1T5Balance=0&lt;br /&gt;
G1CHigh=2&lt;br /&gt;
G1C1=loadwep zombies&lt;br /&gt;
G1C2=say Zombies! Alpha for humans; Bravo for zombies&lt;br /&gt;
G1WHigh=1&lt;br /&gt;
G1W1=Welcome to ZOMBIES! Alpha=humans; Bravo=zombies&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Script Templates]]&lt;/div&gt;</summary>
		<author><name>Freeman</name></author>	</entry>

	</feed>