diff -r 0135e64c6c66 -r c4fd2813b127 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Wed May 16 18:22:28 2018 +0200 +++ b/hedgewars/uConsts.pas Wed Jul 31 23:14:27 2019 +0200 @@ -29,25 +29,26 @@ HDPIScaleFactor = 1; // application return codes - HaltNoError = 0; + HaltNoError = 0; // Hedgewars quits normally // error codes are placed in range 50-99 because that way then don't overlap with run-time errors of pascal // see https://www.freepascal.org/docs-html/user/userap4.html - HaltUsageError = 51; - HaltFatalError = 52; - HaltStartupError = 53; - HaltFatalErrorNoIPC = 54; + HaltUsageError = 51; // Hedgewars was invoked incorrectly (e.g. bad command-line parameter) + HaltFatalError = 52; // Fatal internal error. See logs for more. Also reports error to frontend + HaltStartupError = 53; // Failure loading critical resources + HaltFatalErrorNoIPC = 54; // Fatal internal error, IPC socket is not available // for automatic tests - HaltTestSuccess = 0; - HaltTestFailed = 60; - HaltTestLuaError = 61; - HaltTestUnexpected = 62; + HaltTestSuccess = 0; // Test result: success + HaltTestFailed = 60; // Test result: failed + HaltTestLuaError = 61; // Lua runtime error + HaltTestUnexpected = 62; // Unexpected error + // maximum ScreenFadeValue sfMax = 1000; - // message constants + // log message constants errmsgCreateSurface = 'Error creating SDL surface'; errmsgTransparentSet = 'Error setting transparent color'; errmsgUnknownCommand = 'Unknown command'; @@ -64,15 +65,23 @@ msgGettingConfig = 'Getting game config...'; // camera movement multipliers - cameraKeyboardSpeed : ShortInt = 10; + cameraKeyboardSpeed : LongInt = 10; + cameraKeyboardSpeedSlow : LongInt = 3; // color constants cWhiteColorChannels : TSDL_Color = (r:$FF; g:$FF; b:$FF; a:$FF); cNearBlackColorChannels : TSDL_Color = (r:$00; g:$00; b:$10; a:$FF); + cInvertTextColorAt : Byte = 64; - cWhiteColor : Longword = $FFFFFFFF; - cYellowColor : Longword = $FFFFFF00; - cNearBlackColor : Longword = $FF000010; + cWhiteColor : Longword = $FFFFFFFF; // white + cNearBlackColor : Longword = $FF000010; // nearly black + + capcolDefault : Longword = $FFFFFFFF; // default caption color + capcolSetting : Longword = $FFCCCCCC; // caption color for changing client setting like volume or auto camera + capcolDefaultLua : Longword = $FFFFFFFF; // capcolDefault for Lua + capcolSettingLua : Longword = $CCCCCCFF; // capcolSetting for Lua + + cCentralMessageColor : Longword = $FFFFFF00; // color of message in center of screen like quit or pause {$WARNINGS OFF} cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue: 3006477107); // 1.4 @@ -112,16 +121,16 @@ // To allow these to layer, going to treat them as masks. The bottom byte is reserved for objects // TODO - set lfBasic for all solid land, ensure all uses of the flags can handle multiple flag bits // lfObject and lfBasic are only to be different *graphically* in all other ways they should be treated the same - lfBasic = $8000; // black - lfIndestructible = $4000; // red - lfObject = $2000; // white + lfBasic = $8000; // normal destructible terrain (mask.png: black) + lfIndestructible = $4000; // indestructible terrain (mask.png: red) + lfObject = $2000; // destructible terrain, land object (mask.png: white) lfDamaged = $1000; // - lfIce = $0800; // blue - lfBouncy = $0400; // green + lfIce = $0800; // icy terrain (mask.png: blue) + lfBouncy = $0400; // bouncy terrain (mask.png: green) lfLandMask = $FF00; // upper byte is used for terrain, not objects. - lfCurrentHog = $0080; // CurrentHog. It is also used to flag crates, for convenience of AI. Since an active hog would instantly collect the crate, this does not impact play - lfNotCurrentMask = $FF7F; // inverse of above. frequently used + lfCurHogCrate = $0080; // CurrentHedgehog, and crates, for convenience of AI. Since an active hog would instantly collect the crate, this does not impact playj + lfNotCurHogCrate = $FF7F; // inverse of above. frequently used lfObjMask = $007F; // lower 7 bits used for hogs and explosives and mines lfNotObjMask = $FF80; // inverse of above. @@ -136,16 +145,19 @@ // lower byte is for objects. // consists of 0-127 counted for object checkins and $80 as a bit flag for current hog. - lfAllObjMask = $00FF; // lfCurrentHog or lfObjMask + lfAllObjMask = $00FF; // lfCurHogCrate or lfObjMask + + lfAll = $FFFF; // everything - cMaxPower = 1500; - cMaxAngle = 2048; + cMaxPower = 1500; // maximum power value for ammo that powers up + cMaxAngle = 2048; // maximum positive value for Gear angle cPowerDivisor = 1500; MAXNAMELEN = 192; MAXROPEPOINTS = 3840; + MAXROPELAYERS = 16; {$IFNDEF PAS2C} // some opengl headers do not have these macros @@ -157,6 +169,7 @@ cVisibleWater : LongInt = 128; cTeamHealthWidth : LongInt = 128; + cGearContourThreshold : LongInt = 179; // if water opacity is higher than this, draw contour for some gears when in water cifRandomize = $00000001; cifTheme = $00000002; @@ -167,33 +180,53 @@ RGB_LUMINANCE_GREEN = 0.715160; RGB_LUMINANCE_BLUE = 0.072169; - cMaxTeams = 8; - cMaxHHIndex = 7; - cMaxHHs = 48; + // hedgehog info + cMaxTeams = 8; // maximum number of teams + cMaxHHIndex = 7; // maximum hedgehog index (counting starts at 0) + // NOTE: If you change cMaxHHIndex, also change cMaxHogHealth! + cMaxHHs = cMaxTeams * (cMaxHHIndex+1); // maximum number of hogs + + cClanColors = 9; // number of possible clan colors cMaxEdgePoints = 32768; - cHHRadius = 9; + cBorderWidth = 6; // width of indestructible border + // width of 3 allowed hogs to be knocked through with grenade + + cHHRadius = 9; // hedgehog radius cHHStepTicks = 29; + cMaxHogHealth = 268435455; // maximum hedgehog health + // cMaxHogHealth was calculated by: High(LongInt) div (cMaxHHIndex+1); + + ouchDmg = 55; // least amount of damage a hog must take in one blow for sndOuch to play + + // Z levels cHHZ = 1000; cCurrHHZ = Succ(cHHZ); - cBarrelHealth = 60; - cShotgunRadius = 22; - cBlowTorchC = 6; - cakeDmg = 75; + // some gear constants + cBarrelHealth = 60; // initial barrel health + cShotgunRadius = 22; // radius of land a shotgun shot destroys + cBlowTorchC = 6; // blow torch gear radius component (added to cHHRadius to get the full radius) + cakeDmg = 75; // default cake damage + // key stuff cKeyMaxIndex = 1600; cKbdMaxIndex = 65536;//need more room for the modifier keys + // font stuff cFontBorder = 2 * HDPIScaleFactor; cFontPadding = 2 * HDPIScaleFactor; - cDefaultBuildMaxDist = 256; + cDefaultBuildMaxDist = 256; // default max. building distance with girder/rubber + cResurrectorDist = 100; // effect distance of resurrector + cSeductionDist = 250; // effect distance of seduction + + ExtraTime = 30000; // amount of time (ms) given for using Extra Time // do not change this value - cDefaultZoomLevel = 2.0; + cDefaultZoomLevel = 2.0; // 100% zoom cBaseChatFontHeight = 12; cChatScaleRelDelta = 0.1; @@ -203,141 +236,165 @@ cDefaultUIScaleLevel = 1.0; // game flags - gfAny = $FFFFFFFF; - gfOneClanMode = $00000001; // used in trainings - gfMultiWeapon = $00000002; // used in trainings - gfSolidLand = $00000004; - gfBorder = $00000008; - gfDivideTeams = $00000010; - gfLowGravity = $00000020; - gfLaserSight = $00000040; - gfInvulnerable = $00000080; - gfResetHealth = $00000100; - gfVampiric = $00000200; - gfKarma = $00000400; - gfArtillery = $00000800; - gfSwitchHog = $00001000; - gfRandomOrder = $00002000; - gfKing = $00004000; - gfPlaceHog = $00008000; - gfSharedAmmo = $00010000; - gfDisableGirders = $00020000; - gfDisableLandObjects = $00040000; - gfAISurvival = $00080000; - gfInfAttack = $00100000; - gfResetWeps = $00200000; - gfPerHogAmmo = $00400000; - gfDisableWind = $00800000; - gfMoreWind = $01000000; - gfTagTeam = $02000000; - gfBottomBorder = $04000000; - gfShoppaBorder = $08000000; + gfAny = $FFFFFFFF; // mask for all possible gameflags + gfOneClanMode = $00000001; // Game does not end if there's only one clan in play. For missions + gfMultiWeapon = $00000002; // Enter multishoot mode after attack with infinite shots. For target practice + gfSolidLand = $00000004; // (almost) indestrutible land + gfBorder = $00000008; // border at top, left and right + gfDivideTeams = $00000010; // each clan spawns their hogs on own side of terrain + gfLowGravity = $00000020; // low gravity + gfLaserSight = $00000040; // laser sight for all + gfInvulnerable = $00000080; // invulerable for all + gfResetHealth = $00000100; // heal hogs health up to InitialHealth each turn + gfVampiric = $00000200; // vampirism for all + gfKarma = $00000400; // receive damage you deal + gfArtillery = $00000800; // hogs can't walk + gfSwitchHog = $00001000; // free switch hog at turn start + gfRandomOrder = $00002000; // hogs play in random order + gfKing = $00004000; // King Mode + gfPlaceHog = $00008000; // place all hogs at game start + gfSharedAmmo = $00010000; // ammo is shared per-clan + gfDisableGirders = $00020000; // disable land girders + gfDisableLandObjects = $00040000; // disable land objects + gfAISurvival = $00080000; // AI is revived + gfInfAttack = $00100000; // infinite attack + gfResetWeps = $00200000; // reset weapons each turn + gfPerHogAmmo = $00400000; // each hog has its own ammo + gfDisableWind = $00800000; // don't automatically change wind + gfMoreWind = $01000000; // wind influences most gears + gfTagTeam = $02000000; // hogs of same clan share their turn time + gfBottomBorder = $04000000; // border at bottom + gfShoppaBorder = $08000000; // Surround terrain with fancy "security border". Pure eye candy // NOTE: When adding new game flags, ask yourself // if a "game start notice" would be useful. If so, // add one in uWorld.pas - look for "AddGoal". // gear states - gstDrowning = $00000001; - gstHHDriven = $00000002; - gstMoving = $00000004; - gstAttacked = $00000008; - gstAttacking = $00000010; - gstCollision = $00000020; - gstChooseTarget = $00000040; - gstHHJumping = $00000100; - gsttmpFlag = $00000200; - gstHHThinking = $00000800; - gstNoDamage = $00001000; - gstHHHJump = $00002000; - gstAnimation = $00004000; - gstHHDeath = $00008000; - gstWinner = $00010000; // this, along with gstLoser, is good for indicating hedgies know they screwed up + gstDrowning = $00000001; // drowning + gstHHDriven = $00000002; // hog is controlled by current player + gstMoving = $00000004; // moving + gstAttacked = $00000008; // after attack + gstAttacking = $00000010; // while attacking + gstCollision = $00000020; // it has *just* collided + gstChooseTarget = $00000040; // choosing target + gstHHJumping = $00000100; // hog is doing long jump + gsttmpFlag = $00000200; // temporary wildcard flag, use it for anything you want + gstHHThinking = $00000800; // AI hog is thinking + gstNoDamage = $00001000; // gear is immune to damage + gstHHHJump = $00002000; // hog is doing high jump + gstAnimation = $00004000; // hog is playing an animation + gstHHDeath = $00008000; // hog is dying + gstWinner = $00010000; // indicates if hog did well gstWait = $00020000; - gstNotKickable = $00040000; - gstLoser = $00080000; - gstHHGone = $00100000; - gstInvisible = $00200000; - gstSubmersible = $00400000; - gstFrozen = $00800000; - gstNoGravity = $01000000; + gstNotKickable = $00040000; // gear cannot be pushed by forces + gstLoser = $00080000; // indicates if hog screwed up + gstHHGone = $00100000; // hog is gone (teamgone event) + gstInvisible = $00200000; // invisible + gstSubmersible = $00400000; // can survive in water + gstFrozen = $00800000; // frozen + gstNoGravity = $01000000; // ignores gravity + gstInBounceEdge = $02000000; // spawned in bounce edge // gear messages - gmLeft = $00000001; - gmRight = $00000002; - gmUp = $00000004; - gmDown = $00000008; - gmSwitch = $00000010; - gmAttack = $00000020; - gmLJump = $00000040; - gmHJump = $00000080; - gmDestroy = $00000100; - gmSlot = $00000200; // with param - gmWeapon = $00000400; // with param - gmTimer = $00000800; // with param - gmAnimate = $00001000; // with param - gmPrecise = $00002000; + gmLeft = $00000001; // left + gmRight = $00000002; // right + gmUp = $00000004; // up + gmDown = $00000008; // down + gmSwitch = $00000010; // switch hedgehog + gmAttack = $00000020; // attack + gmLJump = $00000040; // long jump + gmHJump = $00000080; // high jump + gmDestroy = $00000100; // request to self-destruct + gmSlot = $00000200; // slot key; with param + gmWeapon = $00000400; // direct weapon selection (SetWeapon); with param + gmTimer = $00000800; // set timer; with param + gmAnimate = $00001000; // start animation; with param + gmPrecise = $00002000; // precise aim - gmRemoveFromList = $00004000; - gmAddToList = $00008000; - gmDelete = $00010000; + // gmAddToList and gmRemoveFromList are used when changing order of gears in the gear list. They are used together when changing a gear's Z (drawing order) + gmRemoveFromList = $00004000; // remove gear from gear list + gmAddToList = $00008000; // add gear to gear list + + gmDelete = $00010000; // delete gear gmAllStoppable = gmLeft or gmRight or gmUp or gmDown or gmAttack or gmPrecise; - cMaxSlotIndex = 10; + // ammo slots + cMaxSlotIndex = 10; // maximum slot index (including hidden slot) (row in ammo menu) cHiddenSlotIndex = cMaxSlotIndex; // slot for hidden ammo types, not visible and has no key - cMaxSlotAmmoIndex = 6; + cMaxSlotAmmoIndex = 5; // maximum index for ammos per slot (column in ammo menu) - // ai hints - aihUsualProcessing = $00000000; - aihDoesntMatter = $00000001; + // AI hints to be set for any gear + aihUsualProcessing = $00000000; // treat gear as usual + aihDoesntMatter = $00000001; // ignore gear in attack calculations and don't intentionally attack it // ammo properties - ammoprop_Timerable = $00000001; - ammoprop_Power = $00000002; - ammoprop_NeedTarget = $00000004; - ammoprop_ForwMsgs = $00000008; - ammoprop_AttackInMove = $00000010; + ammoprop_Timerable = $00000001; // can set timer + ammoprop_Power = $00000002; // can power up fire strength + ammoprop_NeedTarget = $00000004; // must select target + ammoprop_ForwMsgs = $00000008; // received gear messages are forwarded to the spawned gear + ammoprop_AttackInMove = $00000010; // can attack while moving / in mid-air ammoprop_DoesntStopTimerWhileAttacking - = $00000020; - ammoprop_NoCrosshair = $00000040; - ammoprop_AttackingPut = $00000080; - ammoprop_DontHold = $00000100; - ammoprop_AltAttack = $00000200; - ammoprop_AltUse = $00000400; - ammoprop_NotBorder = $00000800; - ammoprop_Utility = $00001000; - ammoprop_Effect = $00002000; - ammoprop_SetBounce = $00004000; - ammoprop_NeedUpDown = $00008000;//Used by TouchInterface to show or hide up/down widgets - ammoprop_OscAim = $00010000; - ammoprop_NoMoveAfter = $00020000; - ammoprop_Track = $00040000; + = $00000020; // doesn't stop timer while attacker is attacking + ammoprop_NoCrosshair = $00000040; // no crosshair rendered + ammoprop_AttackingPut = $00000080; // selecting a target is considered an attack + ammoprop_DontHold = $00000100; // don't keep ammo selected in next turn + ammoprop_AltAttack = $00000200; // ammo can equip alternate ammo (ammoprop_AltUse) + ammoprop_AltUse = $00000400; // ammo can be equipped by an ammo with ammoprop_AltAttack + ammoprop_NotBorder = $00000800; // ammo is not available if map has border + ammoprop_Utility = $00001000; // ammo is considered an utility instead of a weapon + ammoprop_Effect = $00002000; // ammo is considered an effect like extra time or vampirism + ammoprop_SetBounce = $00004000; // can set bounciness + ammoprop_NeedUpDown = $00008000; // used by TouchInterface to show or hide up/down widgets + ammoprop_OscAim = $00010000; // oscillating aim + ammoprop_NoMoveAfter = $00020000; // can't move after attacking + ammoprop_Track = $00040000; // ammo follows the landscape, used by AI ammoprop_DoesntStopTimerInMultiShoot - = $00080000; + = $00080000; // doesn't stop timer after entering multi-shoot mode ammoprop_DoesntStopTimerWhileAttackingInInfAttackMode - = $00100000; - ammoprop_ForceTurnEnd = $00200000; - ammoprop_NoTargetAfter= $00400000; - ammoprop_NoRoundEnd = $10000000; + = $00100000; // doesn't stop timer while Attacking gear msg is set and inf. attack mode is on + ammoprop_ForceTurnEnd = $00200000; // always ends turn after usage, ignoring inf. attack + ammoprop_NoTargetAfter= $00400000; // disable target selection after attack + ammoprop_NoWrapTarget = $00800000; // allow to select target beyond wrap world edge limits + ammoprop_ShowSelIcon = $01000000; // show icon when selected + ammoprop_NoRoundEnd = $10000000; // ammo doesn't end turn + + AMMO_INFINITE = 100; // internal representation of infinite ammo count + AMMO_FINITE_MAX = 99; // maximum possible finite ammo count - AMMO_INFINITE = 100; - AMMO_FINITE_MAX = 99; + JETPACK_FUEL_INFINITE : LongInt = Low(LongInt); // internal representation of infinite jetpack fuel + BIRDY_ENERGY_INFINITE : LongInt = Low(LongInt); // as above, but for Birdy + + // Special msgParam value used internally for invalid/non-existing value + // Must not be sent over the network! + MSGPARAM_INVALID = High(LongWord); + + // raw probability values for crate drops + probabilityLevels: array [0..8] of LongWord = (0,20,30,60,100,200,400,600,800); + + // raw bounciness values for each of the player-selectable bounciness levels + defaultBounciness = 1000; + bouncinessLevels: array [0..4] of LongWord = (350, 700, defaultBounciness, 2000, 4000); // explosion flags + // By default, an explosion removes land, damages and pushes gears, + // spawns an explosion animation and plays no sound. //EXPLAllDamageInRadius = $00000001; Completely unused for ages - EXPLAutoSound = $00000002; - EXPLNoDamage = $00000004; - EXPLDoNotTouchHH = $00000008; - EXPLDontDraw = $00000010; - EXPLNoGfx = $00000020; - EXPLPoisoned = $00000040; - EXPLDoNotTouchAny = $00000080; + EXPLAutoSound = $00000002; // enable sound (if appropriate) + EXPLNoDamage = $00000004; // don't damage gears + EXPLDoNotTouchHH = $00000008; // don't push hogs + EXPLDontDraw = $00000010; // don't remove land + EXPLNoGfx = $00000020; // don't spawn visual effects + EXPLPoisoned = $00000040; // poison hogs in effect radius + EXPLDoNotTouchAny = $00000080; // don't push anything + EXPLForceDraw = $00000100; // remove land even with gfSolidLand - posCaseAmmo = $00000001; - posCaseHealth = $00000002; - posCaseUtility = $00000004; - posCaseDummy = $00000008; - posCaseExplode = $00000010; - posCasePoison = $00000020; + // Pos flags for gtCase + posCaseAmmo = $00000001; // ammo crate + posCaseHealth = $00000002; // health crate + posCaseUtility = $00000004; // utility crate + posCaseDummy = $00000008; // dummy crate + posCaseExplode = $00000010; // crate explodes when touched + posCasePoison = $00000020; // crate poisons hog when touched cCaseHealthRadius = 14; @@ -348,7 +405,7 @@ htHealth = $04; htTransparent = $08; - NoPointX = Low(LongInt); + NoPointX = Low(LongInt); // special value for CursorX/CursorY if cursor's disabled cTargetPointRef : TPoint = (x: NoPointX; y: 0); kSystemSoundID_Vibrate = $00000FFF; @@ -356,6 +413,10 @@ cMinPlayWidth = 200; cWorldEdgeDist = 200; + cMaxLaserSightWraps = 1; // maximum number of world wraps of laser sight + + cMaxTurnTime = Pred(High(LongInt)); // maximum possible turn time + implementation end.