--- a/.hgignore Mon Aug 02 23:15:22 2010 +0200
+++ b/.hgignore Mon Aug 02 23:15:34 2010 +0200
@@ -22,3 +22,4 @@
glob:project_files/HedgewarsMobile/Data/
glob:project_files/HedgewarsMobile/build/
glob:project_files/HedgewarsMobile/Hedgewars.xcodeproj/vittorio.*
+glob:moc_*.cxx_parameters
--- a/CMakeLists.txt Mon Aug 02 23:15:22 2010 +0200
+++ b/CMakeLists.txt Mon Aug 02 23:15:34 2010 +0200
@@ -205,7 +205,7 @@
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Hedgewars ${HEDGEWARS_VERSION}")
if(WIN32 AND NOT UNIX)
- set(CPACK_NSIS_DISPLAY_NAME ${CPACK_PACKAGE_DESCRIPTION_SUMMARY})
+ set(CPACK_NSIS_DISPLAY_NAME "Hedgewars")
set(CPACK_NSIS_HELP_LINK "http://www.hedgewars.org/")
set(CPACK_NSIS_URL_INFO_ABOUT "http://www.hedgewars.org/")
set(CPACK_NSIS_CONTACT "unC0Rr@gmail.com")
--- a/QTfrontend/CMakeLists.txt Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/CMakeLists.txt Mon Aug 02 23:15:34 2010 +0200
@@ -31,6 +31,7 @@
if(WIN32 AND NOT UNIX)
set(HEDGEWARS_BINDIR ".")
set(HEDGEWARS_DATADIR "../share/")
+ add_definitions(-DUSE_XFIRE)
else()
set(HEDGEWARS_BINDIR ${CMAKE_INSTALL_PREFIX})
if(DEFINED DATA_INSTALL_DIR)
--- a/QTfrontend/game.cpp Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/game.cpp Mon Aug 02 23:15:34 2010 +0200
@@ -277,21 +277,16 @@
arguments << QString("%1").arg(ipc_port);
arguments << (config->vid_Fullscreen() ? "1" : "0");
arguments << (config->isSoundEnabled() ? "1" : "0");
-#ifdef _WIN32
- arguments << (config->isSoundHardware() ? "1" : "0");
-#else
- arguments << "0";
-#endif
- arguments << (config->isWeaponTooltip() ? "1" : "0");
- arguments << tr("en.txt");
+ arguments << (config->isMusicEnabled() ? "1" : "0");
arguments << QString::number(config->volume()); // sound volume
arguments << QString::number(config->timerInterval());
arguments << datadir->absolutePath();
arguments << (config->isShowFPSEnabled() ? "1" : "0");
arguments << (config->isAltDamageEnabled() ? "1" : "0");
arguments << config->netNick().toUtf8().toBase64();
- arguments << (config->isMusicEnabled() ? "1" : "0");
- arguments << (config->isReducedQuality() ? "1" : "0");
+ arguments << QString::number(config->translateQuality());
+ arguments << tr("en.txt");
+
return arguments;
}
--- a/QTfrontend/gameuiconfig.cpp Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/gameuiconfig.cpp Mon Aug 02 23:15:34 2010 +0200
@@ -47,13 +47,10 @@
bool ffscr=value("frontend/fullscreen", false).toBool();
Form->ui.pageOptions->CBFrontendFullscreen->setChecked(ffscr);
- Form->ui.pageOptions->CBReduceQuality->setChecked(value("video/reducequality", false).toBool());
+ Form->ui.pageOptions->SLQuality->setValue(value("video/quality", 5).toUInt());
Form->ui.pageOptions->CBFrontendEffects->setChecked(frontendEffects);
Form->ui.pageOptions->CBEnableSound->setChecked(value("audio/sound", true).toBool());
Form->ui.pageOptions->CBEnableFrontendSound->setChecked(value("frontend/sound", true).toBool());
-#ifdef _WIN32
-// Form->ui.pageOptions->CBHardwareSound->setChecked(value("audio/hardware", false).toBool());
-#endif
Form->ui.pageOptions->CBEnableMusic->setChecked(value("audio/music", true).toBool());
Form->ui.pageOptions->CBEnableFrontendMusic->setChecked(value("frontend/music", true).toBool());
Form->ui.pageOptions->volumeBox->setValue(value("audio/volume", 100).toUInt());
@@ -115,11 +112,11 @@
setValue("video/resolution", Form->ui.pageOptions->CBResolution->currentText());
setValue("video/fullscreen", vid_Fullscreen());
- setValue("video/reducequality", isReducedQuality());
+ setValue("video/quality", Form->ui.pageOptions->SLQuality->value());
setValue("frontend/effects", isFrontendEffects());
- setValue("misc/weaponTooltips", isWeaponTooltip());
+ setValue("misc/weaponTooltips", Form->ui.pageOptions->WeaponTooltip->isChecked());
bool ffscr = isFrontendFullscreen();
setValue("frontend/fullscreen", ffscr);
@@ -133,9 +130,6 @@
setValue("audio/sound", isSoundEnabled());
setValue("frontend/sound", isFrontendSoundEnabled());
-#ifdef _WIN32
-// setValue("audio/hardware", isSoundHardware());
-#endif
setValue("audio/music", isMusicEnabled());
setValue("frontend/music", isFrontendMusicEnabled());
setValue("audio/volume", Form->ui.pageOptions->volumeBox->value());
@@ -181,20 +175,59 @@
return Form->ui.pageOptions->CBFullscreen->isChecked();
}
-bool GameUIConfig::isReducedQuality() const
+quint32 GameUIConfig::translateQuality()
{
- return Form->ui.pageOptions->CBReduceQuality->isChecked();
+ quint32 rqNone = 0x00000000; // don't reduce quality
+ quint32 rqLowRes = 0x00000001; // use half land array
+ quint32 rqBlurryLand = 0x00000002; // downscaled terrain
+ quint32 rqNoBackground = 0x00000004; // don't draw background
+ quint32 rqSimpleRope = 0x00000008; // avoid drawing rope
+ quint32 rq2DWater = 0x00000010; // disabe 3D water effect
+ quint32 rqFancyBoom = 0x00000020; // no fancy explosion effects
+ quint32 rqKillFlakes = 0x00000040; // no flakes
+ quint32 rqSlowMenu = 0x00000080; // ammomenu appears with no animation
+ quint32 rqPlainSplash = 0x00000100; // no droplets
+ quint32 rqClampLess = 0x00000200; // don't clamp textures
+ quint32 rqTooltipsOff = 0x00000400; // tooltips are not drawn
+ quint32 rqDesyncVBlank = 0x00000800; // don't sync on vblank
+
+ quint32 result = (Form->ui.pageOptions->WeaponTooltip->isChecked()) ? rqNone : rqTooltipsOff;
+
+ switch (Form->ui.pageOptions->SLQuality->value()) {
+ case 5:
+ break;
+ case 4:
+ result |= rqBlurryLand;
+ break;
+ case 3:
+ result |= rqBlurryLand | rqKillFlakes | rqPlainSplash;
+ break;
+ case 2:
+ result |= rqBlurryLand | rqKillFlakes | rqPlainSplash | rq2DWater |
+ rqFancyBoom | rqSlowMenu;
+ break;
+ case 1:
+ result |= rqBlurryLand | rqKillFlakes | rqPlainSplash | rq2DWater |
+ rqFancyBoom | rqSlowMenu | rqSimpleRope | rqDesyncVBlank;
+ break;
+ case 0:
+ result |= rqBlurryLand | rqKillFlakes | rqPlainSplash | rq2DWater |
+ rqFancyBoom | rqSlowMenu | rqSimpleRope | rqDesyncVBlank |
+ rqNoBackground | rqClampLess;
+ break;
+ default:
+ fprintf(stderr,"unset value from slider");
+ break;
+ }
+
+ return result;
}
+
bool GameUIConfig::isFrontendEffects() const
{
return Form->ui.pageOptions->CBFrontendEffects->isChecked();
}
-bool GameUIConfig::isWeaponTooltip() const
-{
- return Form->ui.pageOptions->WeaponTooltip->isChecked();
-}
-
bool GameUIConfig::isFrontendFullscreen() const
{
return Form->ui.pageOptions->CBFrontendFullscreen->isChecked();
@@ -209,14 +242,6 @@
return Form->ui.pageOptions->CBEnableFrontendSound->isChecked();
}
-#ifdef _WIN32
-bool GameUIConfig::isSoundHardware()
-{
-// return Form->ui.pageOptions->CBHardwareSound->isChecked();
-return false;
-}
-#endif
-
bool GameUIConfig::isMusicEnabled()
{
return Form->ui.pageOptions->CBEnableMusic->isChecked();
--- a/QTfrontend/gameuiconfig.h Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/gameuiconfig.h Mon Aug 02 23:15:34 2010 +0200
@@ -35,12 +35,10 @@
QStringList GetTeamsList();
QRect vid_Resolution();
bool vid_Fullscreen();
+ quint32 translateQuality();
bool isSoundEnabled();
bool isFrontendSoundEnabled();
QString language();
-#ifdef _WIN32
- bool isSoundHardware();
-#endif
bool isMusicEnabled();
bool isFrontendMusicEnabled();
bool isShowFPSEnabled();
@@ -53,7 +51,6 @@
bool isReducedQuality() const;
bool isFrontendEffects() const;
bool isFrontendFullscreen() const;
- bool isWeaponTooltip() const;
void resizeToConfigValues();
#ifdef __APPLE__
--- a/QTfrontend/hwconsts.cpp.in Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/hwconsts.cpp.in Mon Aug 02 23:15:34 2010 +0200
@@ -31,10 +31,10 @@
QStringList * mapList;
QString * cDefaultAmmoStore = new QString(
- "9391929422199121032235111001201000000211110111"
- "0405040541600655546554464776576666666155510111"
- "0000000000000205500000040007004000000000200000"
- "1311110312111111123114111111111111111211111111"
+ "93919294221991210322351110012010000002111101110"
+ "04050405416006555465544647765766666661555101111"
+ "00000000000002055000000400070040000000002000000"
+ "13111103121111111231141111111111111112111111112"
);
int cAmmoNumber = cDefaultAmmoStore->size() / 4;
@@ -42,30 +42,30 @@
QList< QPair<QString, QString> >()
<< qMakePair(QString("Default"), *cDefaultAmmoStore)
<< qMakePair(QString("Crazy"), QString(
- "9999999999999999992999999999999999299999999999" // TODO: Remove Piano's unlimited uses!
- "1111110111111111111111111111111111111111111111"
- "0000000000000000000000000000000000000000000000"
- "1311110312111111123114111111111111111211110101"))
+ "99999999999999999929999999999999992999999999999" // TODO: Remove Piano's unlimited uses!
+ "11111101111111111111111111111111111111111111111"
+ "00000000000000000000000000000000000000000000000"
+ "13111103121111111231141111111111111112111101011"))
<< qMakePair(QString("Pro mode"), QString(
- "9090009000000000000009000000000000000000000900"
- "0000000000000000000000000000000000000000000000"
- "0000000000000205500000040007004000000000200000"
- "1111111111111111111111111111111111111111100111"))
+ "90900090000000000000090000000000000000000009000"
+ "00000000000000000000000000000000000000000000000"
+ "00000000000002055000000400070040000000002000000"
+ "11111111111111111111111111111111111111111001112"))
<< qMakePair(QString("Shoppa"), QString(
- "0000009900000000000000000000000000000000000000"
- "4444410044244402210112121222422000000002000400"
- "0000000000000000000000000000000000000000000000"
- "1111111111111111111111111111111111111111101111"))
+ "00000099000000000000000000000000000000000000000"
+ "44444100442444022101121212224220000000020004000"
+ "00000000000000000000000000000000000000000000000"
+ "11111111111111111111111111111111111111111011111"))
<< qMakePair(QString("Basketball"),QString(
- "0000009000000900000000000000000000000000000000"
- "0000000000000000000000000000000000000000000000"
- "0000000000000005500000040007004000000000200000"
- "1111111111111111111111111111111111111111111111"))
+ "00000090000009000000000000000000000000000000000"
+ "00000000000000000000000000000000000000000000000"
+ "00000000000000055000000400070040000000002000000"
+ "11111111111111111111111111111111111111111111111"))
<< qMakePair(QString("Minefield"), QString(
- "0000009900090000000300000000000000000000000000"
- "0000000000000000000000000000000000000000000000"
- "0000000000000205500000040007004000000000200000"
- "1111111111111111111111111111111111111111111111"))
+ "00000099000900000003000000000000000000000000000"
+ "00000000000000000000000000000000000000000000000"
+ "00000000000002055000000400070040000000002000000"
+ "11111111111111111111111111111111111111111111111"))
;
QColor * color1 = new QColor(221, 0, 0);
--- a/QTfrontend/pages.cpp Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/pages.cpp Mon Aug 02 23:15:34 2010 +0200
@@ -39,7 +39,7 @@
#include <QMenu>
#include <QDataWidgetMapper>
#include <QTime>
-
+#include <QSlider>
#include "ammoSchemeModel.h"
#include "pages.h"
@@ -573,6 +573,7 @@
QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox);
QHBoxLayout * GBAreslayout = new QHBoxLayout(0);
+ QHBoxLayout * GBAqualayout = new QHBoxLayout(0);
CBFrontendFullscreen = new QCheckBox(AGGroupBox);
CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen"));
@@ -608,9 +609,17 @@
CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
GBAlayout->addWidget(CBFullscreen);
- CBReduceQuality = new QCheckBox(AGGroupBox);
- CBReduceQuality->setText(QCheckBox::tr("Reduced quality"));
- GBAlayout->addWidget(CBReduceQuality);
+ QLabel * quality = new QLabel(AGGroupBox);
+ quality->setText(QLabel::tr("Quality"));
+ GBAqualayout->addWidget(quality);
+
+ SLQuality = new QSlider(Qt::Horizontal, AGGroupBox);
+ SLQuality->setTickPosition(QSlider::TicksBelow);
+ SLQuality->setMaximum(5);
+ SLQuality->setMinimum(0);
+ SLQuality->setFixedWidth(150);
+ GBAqualayout->addWidget(SLQuality);
+ GBAlayout->addLayout(GBAqualayout);
hr = new QFrame(AGGroupBox);
hr->setFrameStyle(QFrame::HLine);
--- a/QTfrontend/pages.h Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/pages.h Mon Aug 02 23:15:34 2010 +0200
@@ -48,6 +48,7 @@
class QDataWidgetMapper;
class QAbstractItemModel;
class QSettings;
+class QSlider;
class GameCFGWidget;
class TeamSelWidget;
@@ -221,9 +222,6 @@
QComboBox *CBResolution;
QCheckBox *CBEnableSound;
QCheckBox *CBEnableFrontendSound;
-#ifdef _WIN32
- QCheckBox *CBHardwareSound;
-#endif
QCheckBox *CBEnableMusic;
QCheckBox *CBEnableFrontendMusic;
QCheckBox *CBFullscreen;
@@ -240,7 +238,7 @@
QLabel *labelNN;
QSpinBox * volumeBox;
QLineEdit *editNetNick;
- QCheckBox *CBReduceQuality;
+ QSlider *SLQuality;
QCheckBox *CBFrontendEffects;
};
--- a/QTfrontend/xfire.h Mon Aug 02 23:15:22 2010 +0200
+++ b/QTfrontend/xfire.h Mon Aug 02 23:15:34 2010 +0200
@@ -19,10 +19,6 @@
#ifndef XFIRE_H
#define XFIRE_H
-#ifdef _WIN32
-// TODO: Move to CMAKE
-#define USE_XFIRE
-#endif
#ifdef USE_XFIRE
enum XFIRE_KEYS
--- a/hedgewars/ArgParsers.inc Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/ArgParsers.inc Mon Aug 02 23:15:34 2010 +0200
@@ -11,31 +11,20 @@
begin
val(ParamStr(2), cScreenWidth);
val(ParamStr(3), cScreenHeight);
- cBitsStr:= ParamStr(4);
- val(cBitsStr, cBits);
+ val(ParamStr(4), cBits);
val(ParamStr(5), ipcPort);
cFullScreen:= ParamStr(6) = '1';
isSoundEnabled:= ParamStr(7) = '1';
- //cVSyncInUse:= ParamStr(8) = '1'; //merged with rqFlags
- //cWeaponTooltips:= ParamStr(9) = '1'; //merged with rqFlags
- cLocaleFName:= ParamStr(10);
- val(ParamStr(11), cInitVolume);
- val(ParamStr(12), cTimerInterval);
- PathPrefix:= ParamStr(13);
- cShowFPS:= ParamStr(14) = '1';
- cAltDamage:= ParamStr(15) = '1';
- UserNick:= DecodeBase64(ParamStr(16));
- isMusicEnabled:= ParamStr(17) = '1';
+ isMusicEnabled:= ParamStr(8) = '1';
+ val(ParamStr(9), cInitVolume);
+ val(ParamStr(10), cTimerInterval);
+ PathPrefix:= ParamStr(11);
+ cShowFPS:= ParamStr(12) = '1';
+ cAltDamage:= ParamStr(13) = '1';
+ UserNick:= DecodeBase64(ParamStr(14));
+ val(ParamStr(15), cReducedQuality);
+ cLocaleFName:= ParamStr(16);
- if (ParamStr(18) = '1') then //HACK - always disable rqLowRes as it is a game breaker
- cReducedQuality:= $FFFFFFFF xor rqLowRes
- else
- val(ParamStr(18), cReducedQuality);
-
- if (ParamStr(8) = '0') then //HACK - ifcVSyncInUse not true, disable it
- cReducedQuality:= cReducedQuality xor rqDesyncVBlank;
- if (ParamStr(9) = '0') then //HACK - if cWeaponTooltips not true, disable it
- cReducedQuality:= cReducedQuality xor rqTooltipsOff;
end;
procedure setVideo(screenWidth: LongInt; screenHeight: LongInt; bitsStr: LongInt);
@@ -50,8 +39,7 @@
begin
val(screenWidthParam, screenWidthAsInt);
val(screenHeightParam, screenHeightAsInt);
- cBitsStr:= bitsParam;
- val(cBitsStr, bitsStrAsInt);
+ val(bitsParam, bitsStrAsInt);
setVideo(screenWidthAsInt,screenHeightAsInt,bitsStrAsInt);
end;
--- a/hedgewars/GSHandlers.inc Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/GSHandlers.inc Mon Aug 02 23:15:34 2010 +0200
@@ -1436,6 +1436,55 @@
end;
////////////////////////////////////////////////////////////////////////////////
+procedure doStepSMine(Gear: PGear);
+begin
+ if (Gear^.State and gstMoving) <> 0 then
+ begin
+ if ((Gear^.State and gstCollision) <> 0) and (Gear^.dX < _0_2) and (Gear^.dY < _0_2) then
+ begin
+ Gear^.dX := _0;
+ Gear^.dY := _0
+ // TODO: calc attach dir
+ end
+ else
+ CalcRotationDirAngle(Gear);
+
+ DeleteCI(Gear);
+ doStepFallingGear(Gear);
+ if (Gear^.State and gstMoving) = 0 then
+ AddGearCI(Gear);
+ AllInactive := false
+ end
+ else
+ begin
+ if ((GameTicks and $3F) = 25) then
+ doStepFallingGear(Gear);
+ end;
+
+ if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then
+ if ((Gear^.State and gstAttacking) = 0) then
+ begin
+ if ((GameTicks and $1F) = 0) then
+ if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State := Gear^.State or
+ gstAttacking
+ end
+ else // gstAttacking <> 0
+ begin
+ AllInactive := false;
+ if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick);
+ if Gear^.Timer = 0 then
+ begin
+ doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
+ DeleteGear(Gear);
+ exit
+ end;
+ dec(Gear^.Timer);
+ end
+ else // gsttmpFlag = 0
+ if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag;
+end;
+
+////////////////////////////////////////////////////////////////////////////////
procedure doStepDynamite(Gear: PGear);
begin
doStepFallingGear(Gear);
@@ -3547,6 +3596,7 @@
7: PlaySound(sndPiano7);
else PlaySound(sndPiano8);
end;
+ AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote);
CurrentHedgehog^.Gear^.MsgParam := 0;
CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and not gm_Slot;
end;
@@ -3593,6 +3643,8 @@
doMakeExplosion(hwRound(Gear^.X) - 30 - r0, hwRound(Gear^.Y) + 40, 40 + r1, 0);
doMakeExplosion(hwRound(Gear^.X) + 30 + r1, hwRound(Gear^.Y) + 40, 40 + r0, 0);
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 80 + r0, EXPLAutoSound);
+ for r0:= 0 to 4 do
+ AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote);
Gear^.dY := -_1;
Gear^.Pos := Gear^.Pos + 1;
end
--- a/hedgewars/GearDrawing.inc Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/GearDrawing.inc Mon Aug 02 23:15:34 2010 +0200
@@ -398,6 +398,7 @@
amHellishBomb: DrawRotated(sprHandHellish, hx, hy, hwSign(Gear^.dX), aangle);
amGasBomb: DrawRotated(sprHandCheese, hx, hy, hwSign(Gear^.dX), aangle);
amMine: DrawRotated(sprHandMine, hx, hy, hwSign(Gear^.dX), aangle);
+ amSMine: DrawRotated(sprHandSMine, hx, hy, hwSign(Gear^.dX), aangle);
amSeduction: DrawRotated(sprHandSeduction, hx, hy, hwSign(Gear^.dX), aangle);
amVampiric: DrawRotatedF(sprHandVamp, hx, hy, (RealTicks div 125) mod 4, hwSign(Gear^.dX), aangle);
amRCPlane: begin
@@ -692,6 +693,10 @@
DrawRotated(sprMineOff, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle)
else if Gear^.Health <> 0 then DrawRotated(sprMineOn, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle)
else DrawRotated(sprMineDead, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
+ gtSMine: if (((Gear^.State and gstAttacking) = 0)or((Gear^.Timer and $3FF) < 420)) and (Gear^.Health <> 0) then
+ DrawRotated(sprSMineOff, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle)
+ else if Gear^.Health <> 0 then DrawRotated(sprSMineOn, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle)
+ else DrawRotated(sprMineDead, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, Gear^.DirAngle);
gtCase: case Gear^.Pos of
posCaseAmmo : begin
i:= (GameTicks shr 6) mod 64;
--- a/hedgewars/HHHandlers.inc Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/HHHandlers.inc Mon Aug 02 23:15:34 2010 +0200
@@ -184,6 +184,7 @@
amSkip: ParseCommand('/skip', true);
amRope: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0);
amMine: AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000);
+ amSMine: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0);
amDEagle: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0);
amSineGun: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0);
amPortalGun: AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, 0);
--- a/hedgewars/VGSHandlers.inc Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/VGSHandlers.inc Mon Aug 02 23:15:34 2010 +0200
@@ -109,6 +109,24 @@
end;
////////////////////////////////////////////////////////////////////////////////
+procedure doStepNote(Gear: PVisualGear; Steps: Longword);
+begin
+Gear^.X:= Gear^.X + Gear^.dX * Steps;
+
+Gear^.Y:= Gear^.Y + Gear^.dY * Steps;
+Gear^.dY:= Gear^.dY + cGravityf * Steps / 2;
+
+Gear^.Angle:= Gear^.Angle + (Gear^.Frame + 1) * Steps / 10;
+while Gear^.Angle > cMaxAngle do
+ Gear^.Angle:= Gear^.Angle - cMaxAngle;
+
+if Gear^.FrameTicks <= Steps then
+ DeleteVisualGear(Gear)
+else
+ dec(Gear^.FrameTicks, Steps)
+end;
+
+////////////////////////////////////////////////////////////////////////////////
procedure doStepEgg(Gear: PVisualGear; Steps: Longword);
begin
Gear^.X:= Gear^.X + Gear^.dX * Steps;
--- a/hedgewars/hwengine.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/hwengine.pas Mon Aug 02 23:15:34 2010 +0200
@@ -315,7 +315,7 @@
begin
Randomize();
- uConsts.initModule;
+ // uConsts does not need initialization as they are all consts
uMisc.initModule;
uConsole.initModule; // MUST happen after uMisc
@@ -386,7 +386,6 @@
uConsole.freeModule;
uMisc.freeModule; // uMisc closes the debug log.
- uConsts.freeModule; //stub
end;
/////////////////////////
@@ -446,7 +445,7 @@
if (ParamCount = 3) then
internalSetGameTypeLandPreviewFromParameters()
else
- if (ParamCount = 18) then
+ if (ParamCount = cDefaultParamNum) then
internalStartGameWithParameters()
else
playReplayFileWithParameters();
--- a/hedgewars/uAIAmmoTests.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uAIAmmoTests.pas Mon Aug 02 23:15:34 2010 +0200
@@ -97,7 +97,8 @@
(proc: nil; flags: 0), // amPiano
(proc: @TestGrenade; flags: 0), // amGasBomb
(proc: @TestShotgun; flags: 0), // amSineGun
- (proc: nil; flags: 0) // amFlamethrower
+ (proc: nil; flags: 0), // amFlamethrower
+ (proc: @TestGrenade; flags: 0) // amSMine
);
const BadTurn = Low(LongInt) div 4;
--- a/hedgewars/uConsts.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uConsts.pas Mon Aug 02 23:15:34 2010 +0200
@@ -73,7 +73,8 @@
sprHandDynamite, sprHandHellish, sprHandMine, sprHandSeduction, sprHandVamp,
sprBigExplosion, sprSmokeRing, sprBeeTrace, sprEgg, sprTargetBee, sprHandBee,
sprFeather, sprPiano, sprHandSineGun, sprPortalGun, sprPortal,
- sprCheese, sprHandCheese, sprHandFlamethrower, sprChunk
+ sprCheese, sprHandCheese, sprHandFlamethrower, sprChunk, sprNote,
+ sprSMineOff, sprSMineOn, sprHandSMine
);
// Gears that interact with other Gears and/or Land
@@ -86,7 +87,8 @@
gtWhip, gtKamikaze, gtCake, gtSeduction, gtWatermelon, gtMelonPiece, // 34
gtHellishBomb, gtWaterUp, gtDrill, gtBallGun, gtBall, gtRCPlane, // 40
gtSniperRifleShot, gtJetpack, gtMolotov, gtExplosives, gtBirdy, // 45
- gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower); // 51
+ gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower, // 51
+ gtSMine);
// Gears that are _only_ of visual nature (e.g. background stuff, visual effects, speechbubbles, etc.)
TVisualGearType = (vgtFlake, vgtCloud, vgtExplPart, vgtExplPart2, vgtFire,
@@ -94,7 +96,7 @@
vgtSteam, vgtAmmo, vgtSmoke, vgtSmokeWhite, vgtHealth, vgtShell,
vgtDust, vgtSplash, vgtDroplet, vgtSmokeRing, vgtBeeTrace, vgtEgg,
vgtFeather, vgtHealthTag, vgtSmokeTrace, vgtEvilTrace, vgtExplosion,
- vgtBigExplosion, vgtChunk);
+ vgtBigExplosion, vgtChunk, vgtNote);
TGearsType = set of TGearType;
@@ -129,7 +131,7 @@
amSeduction, amWatermelon, amHellishBomb, amNapalm, amDrill, amBallgun,
amRCPlane, amLowGravity, amExtraDamage, amInvulnerable, amExtraTime,
amLaserSight, amVampiric, amSniperRifle, amJetpack, amMolotov, amBirdy, amPortalGun,
- amPiano, amGasBomb, amSineGun, amFlamethrower);
+ amPiano, amGasBomb, amSineGun, amFlamethrower, amSMine);
THWFont = (fnt16, fntBig, fntSmall, CJKfnt16, CJKfntBig, CJKfntSmall);
@@ -183,7 +185,9 @@
THogEffect = (heInvulnerable, hePoisoned);
TScreenFade = (sfNone, sfInit, sfToBlack, sfFromBlack, sfToWhite, sfFromWhite);
-const sfMax = 1000;
+const
+ sfMax = 1000;
+ cDefaultParamNum = 16;
// message constants
errmsgCreateSurface = 'Error creating SDL surface';
@@ -452,16 +456,6 @@
'Graphics/Flags' // ptFlags
);
-var PathPrefix: shortstring = './';
- Pathz: array[TPathType] of shortstring;
- CountTexz: array[1..Pred(AMMO_INFINITE)] of PTexture;
- LAND_WIDTH :longint;
- LAND_HEIGHT :longint;
- LAND_WIDTH_MASK :longWord;
- LAND_HEIGHT_MASK :longWord;
- cMaxCaptions : LongInt;
-
-const
cTagsMasks : array[0..15] of byte = (7, 0, 0, 0, 15, 6, 4, 5, 0, 0, 0, 0, 0, 14, 12, 13);
cTagsMasksNoHealth: array[0..15] of byte = (3, 2, 11, 1, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0);
@@ -799,7 +793,15 @@
(FileName: 'amFlamethrower'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandFlamethrower
(FileName: 'Chunk'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
- Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprChunk
+ Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprChunk
+ (FileName: 'Note'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprNote
+ (FileName: 'SMineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOff
+ (FileName: 'SMineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOn
+ (FileName: 'amSMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil;
+ Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprHandSMine
);
Wavez: array [TWave] of record
@@ -2150,7 +2152,31 @@
PosCount: 1;
PosSprite: sprWater;
ejectX: 0; //20;
- ejectY: -3)
+ ejectY: -3),
+
+// Mine
+ (NameId: sidSMine;
+ NameTex: nil;
+ Probability: 100;
+ NumberInCase: 1;
+ Ammo: (Propz: ammoprop_Power or ammoprop_AltUse;
+ Count: 2;
+ InitialCount: 0;
+ NumPerTurn: 0;
+ Timer: 0;
+ Pos: 0;
+ AmmoType: amSMine;
+ AttackVoice: sndLaugh);
+ Slot: 4;
+ TimeAfterTurn: 5000;
+ minAngle: 0;
+ maxAngle: 0;
+ isDamaging: true;
+ SkipTurns: 0;
+ PosCount: 1;
+ PosSprite: sprWater;
+ ejectX: 0;
+ ejectY: 0)
);
@@ -2181,47 +2207,6 @@
alpha : 255
);
-procedure initModule;
-procedure freeModule;
-
implementation
-uses uMisc;
-
-procedure initModule;
-begin
- Pathz:= cPathz;
- {* REFERENCE
- 4096 -> $FFFFF000
- 2048 -> $FFFFF800
- 1024 -> $FFFFFC00
- 512 -> $FFFFFE00 *}
- if (cReducedQuality and rqLowRes) <> 0 then
- begin
- LAND_WIDTH:= 2048;
- LAND_HEIGHT:= 1024;
- LAND_WIDTH_MASK:= $FFFFF800;
- LAND_HEIGHT_MASK:= $FFFFFC00;
- end
- else
- begin
- LAND_WIDTH:= 4096;
- LAND_HEIGHT:= 2048;
- LAND_WIDTH_MASK:= $FFFFF000;
- LAND_HEIGHT_MASK:= $FFFFF800
- end;
-
-{$IFDEF IPHONEOS}
- if isPhone() then
- cMaxCaptions:= 3
- else
-{$ENDIF}
- cMaxCaptions:= 4;
-
-end;
-
-procedure freeModule;
-begin
- PathPrefix := './';
-end;
end.
--- a/hedgewars/uGears.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uGears.pas Mon Aug 02 23:15:34 2010 +0200
@@ -201,7 +201,8 @@
@doStepPiano,
@doStepBomb,
@doStepSineGunShot,
- @doStepFlamethrower
+ @doStepFlamethrower,
+ @doStepSMine
);
procedure InsertGearToList(Gear: PGear);
@@ -354,6 +355,14 @@
else
gear^.Timer:= cMinesTime*1;
end;
+ gtSMine: begin
+ gear^.Health:= 10;
+ gear^.State:= gear^.State or gstMoving;
+ gear^.Radius:= 2;
+ gear^.Elasticity:= _0_55;
+ gear^.Friction:= _0_995;
+ gear^.Timer:= 500;
+ end;
gtCase: begin
gear^.ImpactSound:= sndGraveImpact;
gear^.nImpactSounds:= 1;
@@ -1211,6 +1220,7 @@
case Gear^.Kind of
gtHedgehog,
gtMine,
+ gtSMine,
gtCase,
gtTarget,
gtFlame,
@@ -1286,6 +1296,7 @@
case t^.Kind of
gtHedgehog,
gtMine,
+ gtSMine,
gtCase,
gtTarget,
gtExplosives: begin
@@ -1340,6 +1351,7 @@
case Gear^.Kind of
gtHedgehog,
gtMine,
+ gtSMine,
gtTarget,
gtCase,
gtExplosives: begin
--- a/hedgewars/uLocale.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uLocale.pas Mon Aug 02 23:15:34 2010 +0200
@@ -29,7 +29,8 @@
sidHellishBomb, sidDrill, sidBallgun, sidNapalm, sidRCPlane,
sidLowGravity, sidExtraDamage, sidInvulnerable, sidExtraTime,
sidLaserSight, sidVampiric, sidSniperRifle, sidJetpack,
- sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower);
+ sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower,
+ sidSMine);
TMsgStrId = (sidStartFight, sidDraw, sidWinner, sidVolume, sidPaused,
sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync,
--- a/hedgewars/uMisc.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uMisc.pas Mon Aug 02 23:15:34 2010 +0200
@@ -71,11 +71,19 @@
TimeTrialStartTime: Longword;
TimeTrialStopTime : Longword;
+ // originally from uConsts
+ Pathz: array[TPathType] of shortstring;
+ CountTexz: array[1..Pred(AMMO_INFINITE)] of PTexture;
+ LAND_WIDTH :longint;
+ LAND_HEIGHT :longint;
+ LAND_WIDTH_MASK :longWord;
+ LAND_HEIGHT_MASK :longWord;
+ cMaxCaptions : LongInt;
+
// init flags
cScreenWidth : LongInt = 1024;
cScreenHeight : LongInt = 768;
cBits : LongInt = 32;
- cBitsStr : string[2] = '32';
//ipcPort is in uIO
cFullScreen : boolean = false;
isSoundEnabled : boolean = true;
@@ -83,7 +91,7 @@
cLocaleFName : shortstring = 'en.txt';
cInitVolume : LongInt = 50;
cTimerInterval : LongInt = 8;
- //pathPrefix is in uConsts
+ PathPrefix: shortstring = './';
cShowFPS : boolean = false;
cAltDamage : boolean = true;
cReducedQuality : LongInt = rqNone;
@@ -672,6 +680,27 @@
procedure initModule;
{$IFDEF DEBUGFILE}{$IFNDEF IPHONEOS}var i: LongInt;{$ENDIF}{$ENDIF}
begin
+ Pathz:= cPathz;
+ {* REFERENCE
+ 4096 -> $FFFFF000
+ 2048 -> $FFFFF800
+ 1024 -> $FFFFFC00
+ 512 -> $FFFFFE00 *}
+ if (cReducedQuality and rqLowRes) <> 0 then
+ begin
+ LAND_WIDTH:= 2048;
+ LAND_HEIGHT:= 1024;
+ LAND_WIDTH_MASK:= $FFFFF800;
+ LAND_HEIGHT_MASK:= $FFFFFC00;
+ end
+ else
+ begin
+ LAND_WIDTH:= 4096;
+ LAND_HEIGHT:= 2048;
+ LAND_WIDTH_MASK:= $FFFFF000;
+ LAND_HEIGHT_MASK:= $FFFFF800
+ end;
+
cDrownSpeed.QWordValue := 257698038; // 0.06
cDrownSpeedf := 0.06;
cMaxWindSpeed.QWordValue:= 1073742; // 0.00025
@@ -747,6 +776,13 @@
ScreenFade := sfNone;
+{$IFDEF IPHONEOS}
+ if isPhone() then
+ cMaxCaptions:= 3
+ else
+{$ENDIF}
+ cMaxCaptions:= 4;
+
{$IFDEF SDL13}
SDLwindow := nil;
{$ENDIF}
@@ -757,7 +793,7 @@
Rewrite(f);
{$ELSE}
if (ParamStr(1) <> '') and (ParamStr(2) <> '') then
- if (ParamCount <> 3) and (ParamCount <> 18) then
+ if (ParamCount <> 3) and (ParamCount <> cDefaultParamNum) then
begin
for i:= 0 to 7 do
begin
@@ -796,11 +832,10 @@
close(f);
{$ENDIF}
- // re-init flags so they'll always contain safe values
+ // re-init flags so they will always contain safe values
cScreenWidth := 1024;
cScreenHeight := 768;
cBits := 32;
- cBitsStr := '32';
//ipcPort is in uIO
cFullScreen := false;
isSoundEnabled := true;
@@ -808,7 +843,7 @@
cLocaleFName := 'en.txt';
cInitVolume := 50;
cTimerInterval := 8;
- //pathPrefix is in uConsts
+ PathPrefix := './';
cShowFPS := false;
cAltDamage := true;
cReducedQuality := rqNone;
--- a/hedgewars/uVisualGears.pas Mon Aug 02 23:15:22 2010 +0200
+++ b/hedgewars/uVisualGears.pas Mon Aug 02 23:15:34 2010 +0200
@@ -116,7 +116,8 @@
@doStepSmokeTrace,
@doStepExplosion,
@doStepBigExplosion,
- @doStepChunk
+ @doStepChunk,
+ @doStepNote
);
function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType; State: LongWord = 0): PVisualGear;
@@ -139,7 +140,8 @@
vgtHealthTag,
vgtExplosion,
vgtSmokeTrace,
- vgtEvilTrace]) then
+ vgtEvilTrace,
+ vgtNote]) then
begin
AddVisualGear:= nil;
exit
@@ -305,9 +307,15 @@
t:= random(1024);
sp:= 0.001 * (random(85) + 47);
dx:= AngleSin(t).QWordValue/4294967296 * sp;
- dy:= AngleCos(t).QWordValue/4294967296 * sp;
+ dy:= AngleCos(t).QWordValue/4294967296 * sp * -2;
if random(2) = 0 then dx := -dx;
- (*if random(2) = 0 then*) dy := -2 * dy;
+ end;
+ vgtNote: begin
+ dx:= 0.005 * (random(15) + 10);
+ dy:= -0.001 * (random(40) + 20);
+ if random(2) = 0 then dx := -dx;
+ Frame:= random(4);
+ FrameTicks:= random(2000) + 1500;
end;
end;
@@ -466,6 +474,7 @@
DrawRotatedTextureF(SpritesData[sprSmokeRing].Texture, Gear^.scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 200, 200, Gear^.Angle);
end;
vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
+ vgtNote: DrawRotatedF(sprNote, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
end;
case Gear^.Kind of
vgtSmallDamageTag: DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amSMine.png has changed
Binary file share/hedgewars/Data/Graphics/Note.png has changed
Binary file share/hedgewars/Data/Graphics/SMineOff.png has changed
Binary file share/hedgewars/Data/Graphics/SMineOn.png has changed
--- a/share/hedgewars/Data/Locale/en.txt Mon Aug 02 23:15:22 2010 +0200
+++ b/share/hedgewars/Data/Locale/en.txt Mon Aug 02 23:15:34 2010 +0200
@@ -47,6 +47,7 @@
00:44=Old Limburger
00:45=Sine Gun
00:46=Flamethrower
+00:47=Sticky Mine
01:00=Let's fight!
01:01=Round draw
Binary file share/hedgewars/Data/Themes/Art/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Bamboo/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Bath/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Brick/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Castle/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Cheese/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/City/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Compost/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Desert/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/EarthRise/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Freeway/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Halloween/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Hell/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Island/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Nature/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Sheep/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Snow/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Stage/Chunk.png has changed