# HG changeset patch # User unc0rr # Date 1233503924 0 # Node ID dfe9bafb4590b3ec4efe7c9611d5a1816472de9b # Parent 169ebeefd7ab360e78e40ed93b896008a9944f93 Apply nemo's patch polished by me: - Upto 48 hhs in game - Option for border - Disable some weapons on cavern maps diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/frameTeam.cpp --- a/QTfrontend/frameTeam.cpp Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/frameTeam.cpp Sun Feb 01 15:58:44 2009 +0000 @@ -25,7 +25,7 @@ #include "hwconsts.h" FrameTeams::FrameTeams(QWidget* parent) : - QFrame(parent), maxHedgehogsPerGame(18), overallHedgehogs(0), mainLayout(this), nonInteractive(false) + QFrame(parent), maxHedgehogsPerGame(48), overallHedgehogs(0), mainLayout(this), nonInteractive(false) { QPalette newPalette = palette(); newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/gamecfgwidget.cpp --- a/QTfrontend/gamecfgwidget.cpp Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/gamecfgwidget.cpp Sun Feb 01 15:58:44 2009 +0000 @@ -55,15 +55,19 @@ CB_solid->setText(QCheckBox::tr("Solid land")); GBoxOptionsLayout->addWidget(CB_solid, 2, 0, 1, 2); + CB_border = new QCheckBox(GBoxOptions); + CB_border->setText(QCheckBox::tr("Add Border")); + GBoxOptionsLayout->addWidget(CB_border, 3, 0, 1, 2); + L_TurnTime = new QLabel(QLabel::tr("Turn time"), GBoxOptions); L_InitHealth = new QLabel(QLabel::tr("Initial health"), GBoxOptions); L_SuddenDeath = new QLabel(QLabel::tr("Turns before SD"), GBoxOptions); L_CaseProb = new QLabel(QLabel::tr("Bonus factor"), GBoxOptions); - GBoxOptionsLayout->addWidget(L_TurnTime, 3, 0); - GBoxOptionsLayout->addWidget(L_InitHealth, 4, 0); - GBoxOptionsLayout->addWidget(L_SuddenDeath, 5, 0); - GBoxOptionsLayout->addWidget(L_CaseProb, 6, 0); - GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Weapons"), GBoxOptions), 7, 0); + GBoxOptionsLayout->addWidget(L_TurnTime, 4, 0); + GBoxOptionsLayout->addWidget(L_InitHealth, 5, 0); + GBoxOptionsLayout->addWidget(L_SuddenDeath, 6, 0); + GBoxOptionsLayout->addWidget(L_CaseProb, 7, 0); + GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Weapons"), GBoxOptions), 8, 0); SB_TurnTime = new QSpinBox(GBoxOptions); SB_TurnTime->setRange(1, 99); @@ -84,13 +88,13 @@ SB_CaseProb->setRange(0, 9); SB_CaseProb->setValue(5); - GBoxOptionsLayout->addWidget(SB_TurnTime, 3, 1); - GBoxOptionsLayout->addWidget(SB_InitHealth, 4, 1); - GBoxOptionsLayout->addWidget(SB_SuddenDeath, 5, 1); - GBoxOptionsLayout->addWidget(SB_CaseProb, 6, 1); + GBoxOptionsLayout->addWidget(SB_TurnTime, 4, 1); + GBoxOptionsLayout->addWidget(SB_InitHealth, 5, 1); + GBoxOptionsLayout->addWidget(SB_SuddenDeath, 6, 1); + GBoxOptionsLayout->addWidget(SB_CaseProb, 7, 1); WeaponsName = new QComboBox(GBoxOptions); - GBoxOptionsLayout->addWidget(WeaponsName, 7, 1); + GBoxOptionsLayout->addWidget(WeaponsName, 8, 1); connect(SB_InitHealth, SIGNAL(valueChanged(int)), this, SIGNAL(initHealthChanged(int))); connect(SB_TurnTime, SIGNAL(valueChanged(int)), this, SIGNAL(turnTimeChanged(int))); @@ -99,6 +103,7 @@ connect(CB_mode_Forts, SIGNAL(toggled(bool)), this, SIGNAL(fortsModeChanged(bool))); connect(CB_teamsDivide, SIGNAL(toggled(bool)), this, SIGNAL(teamsDivideChanged(bool))); connect(CB_solid, SIGNAL(toggled(bool)), this, SIGNAL(solidChanged(bool))); + connect(CB_border, SIGNAL(toggled(bool)), this, SIGNAL(borderChanged(bool))); connect(WeaponsName, SIGNAL(currentIndexChanged(int)), this, SLOT(ammoChanged(int))); connect(pMapContainer, SIGNAL(seedChanged(const QString &)), this, SIGNAL(seedChanged(const QString &))); @@ -116,6 +121,8 @@ result |= 0x10; if (CB_solid->isChecked()) result |= 0x04; + if (CB_border->isChecked()) + result |= 0x08; return result; } @@ -221,6 +228,11 @@ CB_solid->setChecked(value); } +void GameCFGWidget::setBorder(bool value) +{ + CB_border->setChecked(value); +} + void GameCFGWidget::setNetAmmo(const QString& name, const QString& ammo) { if (ammo.size() != cDefaultAmmoStore->size()) diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/gamecfgwidget.h --- a/QTfrontend/gamecfgwidget.h Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/gamecfgwidget.h Sun Feb 01 15:58:44 2009 +0000 @@ -81,6 +81,7 @@ void setFortsMode(bool value); void setTeamsDivide(bool value); void setSolid(bool value); + void setBorder(bool value); void setNetAmmo(const QString& name, const QString& ammo); signals: @@ -94,6 +95,7 @@ void fortsModeChanged(bool value); void teamsDivideChanged(bool value); void solidChanged(bool value); + void borderChanged(bool value); void newWeaponScheme(const QString & name, const QString & ammo); private slots: @@ -103,6 +105,7 @@ QCheckBox * CB_mode_Forts; QCheckBox * CB_teamsDivide; QCheckBox * CB_solid; + QCheckBox * CB_border; QGridLayout mainLayout; HWMapContainer* pMapContainer; QSpinBox * SB_TurnTime; diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/hedgehogerWidget.cpp --- a/QTfrontend/hedgehogerWidget.cpp Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/hedgehogerWidget.cpp Sun Feb 01 15:58:44 2009 +0000 @@ -34,7 +34,7 @@ void CHedgehogerWidget::incItems() { - if (pOurFrameTeams->overallHedgehogs < 18) { + if (pOurFrameTeams->overallHedgehogs < pOurFrameTeams->maxHedgehogsPerGame) { numItems++; pOurFrameTeams->overallHedgehogs++; emit hedgehogsNumChanged(); diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/hwform.cpp Sun Feb 01 15:58:44 2009 +0000 @@ -528,6 +528,7 @@ connect(ui.pageNetGame->pGameCFG, SIGNAL(fortsModeChanged(bool)), hwnet, SLOT(onFortsModeChanged(bool))); connect(ui.pageNetGame->pGameCFG, SIGNAL(teamsDivideChanged(bool)), hwnet, SLOT(onTeamsDivideChanged(bool))); connect(ui.pageNetGame->pGameCFG, SIGNAL(solidChanged(bool)), hwnet, SLOT(onSolidChanged(bool))); + connect(ui.pageNetGame->pGameCFG, SIGNAL(borderChanged(bool)), hwnet, SLOT(onBorderChanged(bool))); connect(ui.pageNetGame->pGameCFG, SIGNAL(newWeaponScheme(const QString &, const QString &)), hwnet, SLOT(onWeaponsNameChanged(const QString &, const QString &))); @@ -542,6 +543,7 @@ connect(hwnet, SIGNAL(fortsModeChanged(bool)), ui.pageNetGame->pGameCFG, SLOT(setFortsMode(bool))); connect(hwnet, SIGNAL(teamsDivideChanged(bool)), ui.pageNetGame->pGameCFG, SLOT(setTeamsDivide(bool))); connect(hwnet, SIGNAL(solidChanged(bool)), ui.pageNetGame->pGameCFG, SLOT(setSolid(bool))); + connect(hwnet, SIGNAL(borderChanged(bool)), ui.pageNetGame->pGameCFG, SLOT(setBorder(bool))); connect(hwnet, SIGNAL(hhnumChanged(const HWTeam&)), ui.pageNetGame->pNetTeamsWidget, SLOT(changeHHNum(const HWTeam&))); connect(hwnet, SIGNAL(teamColorChanged(const HWTeam&)), diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/newnetclient.cpp --- a/QTfrontend/newnetclient.cpp Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/newnetclient.cpp Sun Feb 01 15:58:44 2009 +0000 @@ -488,6 +488,10 @@ emit solidChanged(lst[2].toInt() != 0); return; } + if (lst[1] == "BORDER") { + emit borderChanged(lst[2].toInt() != 0); + return; + } if (lst[1] == "AMMO") { if(lst.size() < 4) return; emit ammoChanged(lst[3], lst[2]); @@ -562,6 +566,7 @@ onFortsModeChanged(m_pGameCFGWidget->getGameFlags() & 0x1); onTeamsDivideChanged(m_pGameCFGWidget->getGameFlags() & 0x10); onSolidChanged(m_pGameCFGWidget->getGameFlags() & 0x04); + onBorderChanged(m_pGameCFGWidget->getGameFlags() & 0x08); // always initialize with default ammo (also avoiding complicated cross-class dependencies) QString name = m_pGameCFGWidget->WeaponsName->currentText(); QString ammo = m_pGameCFGWidget->WeaponsName->itemData( @@ -643,6 +648,11 @@ if (isChief) RawSendNet(QString("CONFIG_PARAM%1SOLIDLAND%1%2").arg(delimeter).arg(value)); } +void HWNewNet::onBorderChanged(bool value) +{ + if (isChief) RawSendNet(QString("CONFIG_PARAM%1BORDER%1%2").arg(delimeter).arg(value)); +} + void HWNewNet::onWeaponsNameChanged(const QString& name, const QString& ammo) { if (isChief) RawSendNet(QString("CONFIG_PARAM%1AMMO%1%2%1%3").arg(delimeter).arg(ammo).arg(name)); diff -r 169ebeefd7ab -r dfe9bafb4590 QTfrontend/newnetclient.h --- a/QTfrontend/newnetclient.h Sat Jan 31 15:44:07 2009 +0000 +++ b/QTfrontend/newnetclient.h Sun Feb 01 15:58:44 2009 +0000 @@ -111,6 +111,7 @@ void fortsModeChanged(bool value); void teamsDivideChanged(bool value); void solidChanged(bool value); + void borderChanged(bool value); void hhnumChanged(const HWTeam&); void teamColorChanged(const HWTeam&); void chatStringLobby(const QString&); @@ -143,6 +144,7 @@ void onFortsModeChanged(bool value); void onTeamsDivideChanged(bool value); void onSolidChanged(bool value); + void onBorderChanged(bool value); void onHedgehogsNumChanged(const HWTeam& team); void onTeamColorChanged(const HWTeam& team); void onWeaponsNameChanged(const QString& name, const QString& ammo); diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/GSHandlers.inc Sun Feb 01 15:58:44 2009 +0000 @@ -616,7 +616,7 @@ Gear^.dX, Gear^.dY, cHHRadius * 5, cHHRadius * 2 + 7); -if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then +if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) or (Land[hwRound(HHGear^.Y), hwRound(HHGear^.X + Gear^.dX * 32)] = COLOR_INDESTRUCTIBLE) then begin HHGear^.Message:= 0; HHGear^.State:= HHGear^.State and (not gstNotKickable); @@ -1379,7 +1379,7 @@ Gear^.X:= int2hwFloat(LAND_WIDTH + 1024); end; -Gear^.Y:= -_300; // TODO - consider making this proportional to topY to reduce spread on low maps +Gear^.Y:= int2hwFloat(topY-300); Gear^.dX:= int2hwFloat(TargetPoint.X - 5 * Gear^.Tag * 15); if int2hwFloat(TargetPoint.Y) - Gear^.Y > _0 then @@ -1930,7 +1930,8 @@ if (Gear^.Timer = 0) or (t^.Count <> 0) or (not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) -and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) then +and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) +or (Land[hwRound(Gear^.Y), hwRound(Gear^.X)] = COLOR_INDESTRUCTIBLE) then begin //out of time or exited ground doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); DeleteGear(Gear); diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/hwengine.dpr --- a/hedgewars/hwengine.dpr Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/hwengine.dpr Sun Feb 01 15:58:44 2009 +0000 @@ -76,6 +76,7 @@ GameState:= gsStart; end; gsStart: begin + if HasBorder then DisableSomeWeapons; AddClouds; AssignHHCoords; AddMiscGears; diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uAmmos.pas Sun Feb 01 15:58:44 2009 +0000 @@ -30,6 +30,7 @@ procedure ApplyAmmoChanges(var Hedgehog: THedgehog); procedure SwitchNotHoldedAmmo(var Hedgehog: THedgehog); procedure SetWeapon(weap: TAmmoType); +procedure DisableSomeWeapons; implementation uses uMisc, uGears, uWorld, uLocale, uConsole; @@ -227,4 +228,22 @@ ParseCommand('/setweap ' + char(weap), true) end; +procedure DisableSomeWeapons; +var i, slot, a: Longword; + t: TAmmoType; +begin +for i:= 0 to Pred(StoreCnt) do + for slot:= 0 to cMaxSlotIndex do + begin + for a:= 0 to cMaxSlotAmmoIndex do + with StoresList[i]^[slot, a] do + if (Propz and ammoprop_NotBorder) <> 0 then Count:= 0; + + PackAmmo(StoresList[i], slot) + end; + +for t:= Low(TAmmoType) to High(TAmmoType) do + if (Ammoz[t].Ammo.Propz and ammoprop_NotBorder) <> 0 then Ammoz[t].Probability:= 0 +end; + end. diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uConsts.pas Sun Feb 01 15:58:44 2009 +0000 @@ -157,7 +157,7 @@ cMaxTeams = 6; cMaxHHIndex = 7; - cMaxHHs = 30; + cMaxHHs = 48; cMaxSpawnPoints = 1024; cMaxEdgePoints = 16384; @@ -181,6 +181,7 @@ gfForts = $00000001; gfMultiWeapon = $00000002; gfSolidLand = $00000004; + gfBorder = $00000008; gfDivideTeams = $00000010; gfOneClanMode = $10000000; @@ -231,6 +232,7 @@ ammoprop_DontHold = $00000100; ammoprop_AltAttack = $00000200; ammoprop_AltUse = $00000400; + ammoprop_NotBorder = $00000800; AMMO_INFINITE = 9; @@ -852,7 +854,8 @@ Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or ammoprop_AttackingPut or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_NotBorder; Count: 1; NumPerTurn: 0; Timer: 0; @@ -873,7 +876,8 @@ Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or ammoprop_AttackingPut or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_NotBorder; Count: 1; NumPerTurn: 0; Timer: 0; @@ -1089,7 +1093,8 @@ Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or ammoprop_AttackingPut or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_NotBorder; Count: 1; NumPerTurn: 0; Timer: 0; diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uGears.pas Sun Feb 01 15:58:44 2009 +0000 @@ -1347,7 +1347,7 @@ FindPlace(Gear, false, t, t + LAND_WIDTH div 2);// could make Gear == nil if Gear <> nil then begin - Gear^.Pos:= GetRandom(19); + Gear^.Pos:= GetRandom(49); Gear^.dX.isNegative:= p = 1; end end; diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uLand.pas Sun Feb 01 15:58:44 2009 +0000 @@ -41,7 +41,7 @@ procedure RealLandTexUpdate; implementation -uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, uSHA, uIO; +uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, uSHA, uIO, uAmmos; type TPixAr = record Count: Longword; @@ -584,9 +584,9 @@ procedure MakeFortsMap; var tmpsurf: PSDL_Surface; begin -// For now, defining a fort's playable area as 4096x1536 - there are no tall forts. The extra height is to avoid triggering border with current code, also if user turns on a border, it'll give a bit more maneuvering room. -playHeight:= 1536; -playWidth:= 4096; +// For now, defining a fort's playable area as 3072x1200 - there are no tall forts. The extra height is to avoid triggering border with current code, also if user turns on a border, it'll give a bit more maneuvering room. +playHeight:= 1200; +playWidth:= 3072; leftX:= (LAND_WIDTH - playWidth) div 2; rightX:= ((playWidth + (LAND_WIDTH - playWidth) div 2) - 1); topY:= LAND_HEIGHT - playHeight; @@ -594,11 +594,11 @@ WriteLnToConsole('Generating forts land...'); tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[0]^.Teams[0]^.FortName + 'L', true, true, true); -BlitImageAndGenerateCollisionInfo(0, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); +BlitImageAndGenerateCollisionInfo(leftX+150, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); SDL_FreeSurface(tmpsurf); tmpsurf:= LoadImage(Pathz[ptForts] + '/' + ClansArray[1]^.Teams[0]^.FortName + 'R', true, true, true); -BlitImageAndGenerateCollisionInfo(LAND_WIDTH - tmpsurf^.w, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); +BlitImageAndGenerateCollisionInfo(rightX - 150 - tmpsurf^.w, LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); SDL_FreeSurface(tmpsurf); end; @@ -628,8 +628,7 @@ end; procedure GenMap; -var i, j, t: LongInt; - x, y, w, c: Longword; +var x, y, w, c: Longword; begin hasBorder:= false; hasGirders:= true; @@ -644,59 +643,54 @@ {$IFDEF DEBUGFILE}LogLandDigest;{$ENDIF} // check for land near top -for y:= topY to topY + 5 do - for x:= leftX to rightX do - if Land[y, x] <> 0 then - begin - hasBorder:= true; - break; - end; +c:= 0; +if (GameFlags and gfBorder) <> 0 then + hasBorder:= true +else + for y:= topY to topY + 5 do + for x:= leftX to rightX do + if Land[y, x] <> 0 then + begin + inc(c); + if c > 200 then // avoid accidental triggering + begin + hasBorder:= true; + break; + end; + end; if hasBorder then begin - for y:= 0 to LAND_HEIGHT - 1 do - for x:= 0 to LAND_WIDTH - 1 do - if (y < topY) or (x < leftX) or (x > rightX) then - Land[y, x]:= COLOR_INDESTRUCTIBLE; + for y:= 0 to LAND_HEIGHT - 1 do + for x:= 0 to LAND_WIDTH - 1 do + if (y < topY) or (x < leftX) or (x > rightX) then + Land[y, x]:= COLOR_INDESTRUCTIBLE; // experiment hardcoding cave - // also try basing cave dimensions on map/template dimensions, if they exist - for w:= 0 to 5 do // width of 3 allowed worms to be knocked through with grenade - begin - for y:= topY to LAND_HEIGHT - 1 do - begin - Land[y, leftX + w]:= COLOR_INDESTRUCTIBLE; - Land[y, rightX - w]:= COLOR_INDESTRUCTIBLE; - if y mod 32 < 16 then c:= $FF000000 - else c:= $FF00FFFF; - LandPixels[y, leftX + w]:= c; - LandPixels[y, rightX - w]:= c; - end; + // also try basing cave dimensions on map/template dimensions, if they exist + for w:= 0 to 5 do // width of 3 allowed worms to be knocked through with grenade + begin + for y:= topY to LAND_HEIGHT - 1 do + begin + Land[y, leftX + w]:= COLOR_INDESTRUCTIBLE; + Land[y, rightX - w]:= COLOR_INDESTRUCTIBLE; + if (y + w) mod 32 < 16 then + c:= $FF000000 + else + c:= $FF00FFFF; + LandPixels[y, leftX + w]:= c; + LandPixels[y, rightX - w]:= c; + end; - for x:= leftX to rightX do - begin - Land[topY + w, x]:= COLOR_INDESTRUCTIBLE; - if x mod 32 < 16 then c:= $FF000000 - else c:= $FF00FFFF; - LandPixels[topY + w, x]:= c; - end; - end; - // This is almost certainly not the right place to do this - // I just want it to be disabled after a border is added, which could by by map constraints as well as player desire - t:= 0; - while (t < cMaxTeams) and (TeamsArray[t] <> nil) do - begin - for i:= 0 to cMaxHHIndex do - if TeamsArray[t]^.Hedgehogs[i].Gear <> nil then - begin - for j:= 0 to cMaxSlotAmmoIndex do - begin - TeamsArray[t]^.Hedgehogs[i].Ammo^[Ammoz[amAirAttack].Slot, j].Count:= 0; - TeamsArray[t]^.Hedgehogs[i].Ammo^[Ammoz[amMineStrike].Slot, j].Count:= 0; - TeamsArray[t]^.Hedgehogs[i].Ammo^[Ammoz[amNapalm].Slot, j].Count:= 0; - end; - end; - inc(t); - end; + for x:= leftX to rightX do + begin + Land[topY + w, x]:= COLOR_INDESTRUCTIBLE; + if (x + w) mod 32 < 16 then + c:= $FF000000 + else + c:= $FF00FFFF; + LandPixels[topY + w, x]:= c; + end; + end; end; if ((GameFlags and gfForts) = 0) and (Pathz[ptMapCurrent] = '') then AddObjects; diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uLandTemplates.pas --- a/hedgewars/uLandTemplates.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uLandTemplates.pas Sun Feb 01 15:58:44 2009 +0000 @@ -35,6 +35,7 @@ TemplateHeight, TemplateWidth: Longword; canMirror, canFlip, isNegative, canInvert: boolean; hasGirders: boolean; + MaxHedgeHogs: Longword; end; ////////////////////////////////////////////////////////////////////////////// @@ -85,6 +86,7 @@ TemplateHeight: 1024; TemplateWidth: 4096; canMirror: true; canFlip: false; isNegative: true; canInvert: false; hasGirders: false; // this map, and some other caves, are cramped enough and have plenty of ceiling. Maybe not all caves though + MaxHedgehogs: 24; ) ); diff -r 169ebeefd7ab -r dfe9bafb4590 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Sat Jan 31 15:44:07 2009 +0000 +++ b/hedgewars/uMisc.pas Sun Feb 01 15:58:44 2009 +0000 @@ -37,7 +37,7 @@ GameType : TGameType = gmtLocal; GameFlags : Longword = 0; TurnTimeLeft : Longword = 0; - cSuddenDTurns : Longword = 15; + cSuddenDTurns : LongInt = 15; cHedgehogTurnTime: Longword = 45000; cMaxAIThinkTime : Longword = 9000; diff -r 169ebeefd7ab -r dfe9bafb4590 netserver/HWProto.hs --- a/netserver/HWProto.hs Sat Jan 31 15:44:07 2009 +0000 +++ b/netserver/HWProto.hs Sun Feb 01 15:58:44 2009 +0000 @@ -399,7 +399,7 @@ difficulty = fromMaybe 0 (maybeRead difStr :: Maybe Int) hhsList [] = [] hhsList (n:h:hhs) = HedgehogInfo n h : hhsList hhs - canAddNumber = 18 - (sum . map hhnum $ teams clRoom) + canAddNumber = 48 - (sum . map hhnum $ teams clRoom) newTeamHHNum = min 4 canAddNumber handleCmd_inRoom client clients rooms ("ADD_TEAM" : name : color : grave : fort : difStr : hhsInfo) = @@ -420,7 +420,7 @@ team = fromJust findTeam findTeam = find (\t -> teamName == teamname t) $ teams clRoom clRoom = roomByName (room client) rooms - canAddNumber = 18 - (sum . map hhnum $ teams clRoom) + canAddNumber = 48 - (sum . map hhnum $ teams clRoom) handleCmd_inRoom client _ rooms ["TEAM_COLOR", teamName, newColor] = if not $ isMaster client then