From 2627a5bb393790901751683c2d51f22945148494 Mon Sep 17 00:00:00 2001 From: MaxED <j.maxed@gmail.com> Date: Sun, 19 Jun 2016 21:17:46 +0000 Subject: [PATCH] Added partial "LightMode" MAPINFO property support. Currently only "Standard" and "Doom" light modes are supported. Updated Zandronum acc. Updated Zandronum_ACS.cfg. --- Build/Compilers/Zandronum/acc.exe | Bin 60973 -> 70656 bytes Build/Compilers/Zandronum/zdefs.acs | 127 +++- Build/Compilers/Zandronum/zspecial.acs | 108 ++- Build/Scripting/ZDoom_ACS.cfg | 42 +- Build/Scripting/Zandronum_ACS.cfg | 957 ++++++++++++++++--------- Source/Core/GZBuilder/Data/MapInfo.cs | 18 + Source/Core/Rendering/Renderer.cs | 12 +- Source/Core/ZDoom/MapinfoParser.cs | 36 +- 8 files changed, 913 insertions(+), 387 deletions(-) diff --git a/Build/Compilers/Zandronum/acc.exe b/Build/Compilers/Zandronum/acc.exe index 005a7147a044ad4b144afeab724420e6b2c4fb4f..6286906eecb17c6212e24da3a8341a38f766a83b 100644 GIT binary patch literal 70656 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 TXVT{LI8UNj|MUD`Y=Qp`FySAb literal 60973 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 U%wHHdTx7AKuZnxeQgtr)zsacXbN~PV diff --git a/Build/Compilers/Zandronum/zdefs.acs b/Build/Compilers/Zandronum/zdefs.acs index d9f26379..d9bfd495 100644 --- a/Build/Compilers/Zandronum/zdefs.acs +++ b/Build/Compilers/Zandronum/zdefs.acs @@ -1,4 +1,3 @@ - //************************************************************************** //** //** zdefs.acs @@ -214,6 +213,12 @@ // HUD message. #define HUDMSG_ADDBLEND 0x20000000 +// OR this with one of the above to use the extra alpha parameter +#define HUDMSG_ALPHA 0x10000000 + +// Or this with one of the above to not wrap lines +#define HUDMSG_NOWRAP 0x08000000 + // HUD message layers; these are not flags #define HUDMSG_LAYER_OVERHUD 0x00000000 #define HUDMSG_LAYER_UNDERHUD 0x00001000 @@ -277,6 +282,13 @@ #define APROP_Mass 32 #define APROP_Accuracy 33 #define APROP_Stamina 34 +#define APROP_Height 35 +#define APROP_Radius 36 +#define APROP_Reactiontime 37 +#define APROP_MeleeRange 38 +#define APROP_ViewHeight 39 +#define APROP_AttackZOffset 40 +#define APROP_StencilColor 41 // Render Styles ------------------------------------------------------------ @@ -284,12 +296,14 @@ #define STYLE_Normal 1 // Normal; just copy the image to the screen #define STYLE_Fuzzy 2 // Draw silhouette using "fuzz" effect #define STYLE_SoulTrans 3 // Draw translucent with amount in r_transsouls -#define STYLE_OptFuzzy 4 // Draw as fuzzy or translucent, based on user preference +#define STYLE_OptFuzzy 4 // Draw as fuzzy, translucent or shadow, based on user preference #define STYLE_Stencil 5 // Draw as solid color #define STYLE_Translucent 64 // Draw translucent #define STYLE_Add 65 // Draw additive #define STYLE_Shaded 66 // #define STYLE_TranslucentStencil 67 +#define STYLE_Shadow 68 // Draw dark translucent stencil +#define STYLE_Subtract 69 // Draw subtractive // Properties you can use with GetLevelInfo() ------------------------------- @@ -666,6 +680,46 @@ #define SECSEQ_FULLHEIGHT 3 #define SECSEQ_INTERIOR 4 +// Channels for PlaySound and StopSound + +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 + +// Modifier flags for PlaySound + +#define CHAN_LISTENERZ 8 +#define CHAN_MAYBE_LOCAL 16 +#define CHAN_UI 32 +#define CHAN_NOPAUSE 64 + +// Standard attenuation values for PlaySound + +#define ATTN_NONE 0 // full volume the entire level +#define ATTN_NORM 1.0 +#define ATTN_IDLE 1.001 +#define ATTN_STATIC 3.0 // dimish very rapidly with distance + +// Identifiers for PlayActorSound + +#define SOUND_See 0 +#define SOUND_Attack 1 +#define SOUND_Pain 2 +#define SOUND_Death 3 +#define SOUND_Active 4 +#define SOUND_Use 5 +#define SOUND_Bounce 6 +#define SOUND_WallBounce 7 +#define SOUND_CrushPain 8 +#define SOUND_Howl 9 + +// Flags for SpawnDecal + +#define SDF_ABSANGLE 1 +#define SDF_PERMANENT 2 + // Actor pointer selectors #DEFINE AAPTR_DEFAULT 0 @@ -694,6 +748,22 @@ #DEFINE PTROP_UNSAFEMASTER 2 #DEFINE PTROP_NOSAFEGUARDS PTROP_UNSAFETARGET |PTROP_UNSAFEMASTER +// Line activation flags + +#define SPAC_Cross 1 // when player crosses line +#define SPAC_Use 2 // when player uses line +#define SPAC_MCross 4 // when monster crosses line +#define SPAC_Impact 8 // when projectile hits line +#define SPAC_Push 16 // when player pushes line +#define SPAC_PCross 32 // when projectile crosses line +#define SPAC_UseThrough 64 // when player uses line (doesn't block) +#define SPAC_AnyCross 128 // when anything without the TELEPORT flag crosses the line +#define SPAC_MUse 256 // monsters can use +#define SPAC_MPush 512 // monsters can push +#define SPAC_UseBack 1024 // can be used from the back side + +#define SPAC_None 0 + // ========================================================================== // Skulltag Definitions // ========================================================================== @@ -703,6 +773,26 @@ #define TEAM_RED 1 #define NO_TEAM 2 +// Team properties ---------------------------------------------------------- +#define TPROP_Name 0 +#define TPROP_Score 1 +#define TPROP_IsValid 2 +#define TPROP_NumPlayers 3 +#define TPROP_NumLivePlayers 4 +#define TPROP_TextColor 5 +#define TPROP_PlayerStartNum 6 +#define TPROP_Spread 7 +#define TPROP_Carrier 8 +#define TPROP_Assister 9 +#define TPROP_FragCount 10 +#define TPROP_DeathCount 11 +#define TPROP_WinCount 12 +#define TPROP_PointCount 13 +#define TPROP_ReturnTics 14 +#define TPROP_TeamItem 15 +#define TPROP_WinnerTheme 16 +#define TPROP_LoserTheme 17 + // Skulltag Invasion -------------------------------------------------------- #define IS_WAITINGFORPLAYERS 0 #define IS_FIRSTCOUNTDOWN 1 @@ -766,6 +856,9 @@ #define T_HIGHJUMP 188 #define T_HASTE 189 +// Zandronum database additions --------------------------------------------- +#define DB_ORDER_ASC 0 +#define DB_ORDER_DESC 1 // Events when you have input grabbed @@ -840,6 +933,7 @@ #define CHANGELEVEL_CHANGESKILL 8 #define CHANGELEVEL_NOINTERMISSION 16 #define CHANGELEVEL_RESETHEALTH 32 +#define CHANGELEVEL_PRERAISEWEAPON 64 #define NO_CHANGE 32767.0 @@ -857,6 +951,7 @@ #define BLOCKF_RAILING 64 #define BLOCKF_USE 128 #define BLOCKF_SIGHT 256 +#define BLOCKF_HITSCAN 512 #define FOGP_DENSITY 0 #define FOGP_OUTSIDEDENSITY 1 @@ -869,21 +964,13 @@ #define CSF_NOFAKEFLOORS 1 #define CSF_NOBLOCKALL 2 -#define TPROP_Name 0 -#define TPROP_Score 1 -#define TPROP_IsValid 2 -#define TPROP_NumPlayers 3 -#define TPROP_NumLivePlayers 4 -#define TPROP_TextColor 5 -#define TPROP_PlayerStartNum 6 -#define TPROP_Spread 7 -#define TPROP_Carrier 8 -#define TPROP_Assister 9 -#define TPROP_FragCount 10 -#define TPROP_DeathCount 11 -#define TPROP_WinCount 12 -#define TPROP_PointCount 13 -#define TPROP_ReturnTics 14 -#define TPROP_TeamItem 15 -#define TPROP_WinnerTheme 16 -#define TPROP_LoserTheme 17 \ No newline at end of file +#define FHF_NORANDOMPUFFZ 1 + +// [TP] For GetTimeProperty +#define TM_SECOND 0 +#define TM_MINUTE 1 +#define TM_HOUR 2 +#define TM_DAY 3 +#define TM_MONTH 4 +#define TM_YEAR 5 +#define TM_WEEKDAY 6 diff --git a/Build/Compilers/Zandronum/zspecial.acs b/Build/Compilers/Zandronum/zspecial.acs index 85d10582..cb974485 100644 --- a/Build/Compilers/Zandronum/zspecial.acs +++ b/Build/Compilers/Zandronum/zspecial.acs @@ -14,11 +14,11 @@ special 7:Polyobj_DoorSwing(4), 8:Polyobj_DoorSlide(5), 9:Line_Horizon(0), - 10:Door_Close(2), + 10:Door_Close(2,3), 11:Door_Open(2,3), 12:Door_Raise(3,4), 13:Door_LockedRaise(4,5), - 14:Door_Animated(3), + 14:Door_Animated(3,4), 15:Autosave(0), // 16:Transfer_WallLight 17:Thing_Raise(1), @@ -75,7 +75,7 @@ special 68:Floor_MoveToValueTimes8(4), 69:Ceiling_MoveToValueTimes8(4), 70:Teleport(1,3), - 71:Teleport_NoFog(1,3), + 71:Teleport_NoFog(1,4), 72:ThrustThing(2,4), 73:DamageThing(1,2), 74:Teleport_NewMap(2,3), @@ -83,12 +83,12 @@ special 76:TeleportOther(3), 77:TeleportGroup(5), 78:TeleportInSector(4,5), - + 79:Thing_SetConversation(2), 80:ACS_Execute(2,5), 81:ACS_Suspend(2), 82:ACS_Terminate(2), 83:ACS_LockedExecute(5), - 84:ACS_ExecuteWithResult(1,4), + 84:ACS_ExecuteWithResult(1,5), 85:ACS_LockedExecuteDoor(5), 86:Polyobj_MoveToSpot(3), 87:Polyobj_Stop(1), @@ -101,7 +101,9 @@ special 94:Pillar_BuildAndCrush(4,5), 95:FloorAndCeiling_LowerByValue(3), 96:FloorAndCeiling_RaiseByValue(3), - + 97:Ceiling_LowerAndCrushDist(3,5), + 98:Sector_SetTranslucent(3,4), + 99:Floor_RaiseAndCrushDoom(3,4), // 100:Scroll_Texture_Left // 101:Scroll_Texture_Right // 102:Scroll_Texture_Up @@ -129,7 +131,7 @@ special 130:Thing_Activate(1), 131:Thing_Deactivate(1), 132:Thing_Remove(1), - 133:Thing_Destroy(1,2), + 133:Thing_Destroy(1,3), 134:Thing_Projectile(5), 135:Thing_Spawn(3,4), 136:Thing_ProjectileGravity(5), @@ -146,11 +148,12 @@ special 154:Teleport_NoStop(2, 3), 157:SetGlobalFogParameter(2), // GZDoom only! - 158:FS_Execute(1,4), // GZDoom only! + 158:FS_Execute(1,4), 159:Sector_SetPlaneReflection(3), // GZDoom only! -// 160:Sector_Set3DFloor // GZDoom/Vavoom -// 161:Sector_SetContents // Vavoom +// 160:Sector_Set3DFloor +// 161:Sector_SetContents + 168:Ceiling_CrushAndRaiseDist(3,5), 169:Generic_Crusher2(5), 170:Sector_SetCeilingScale2(3), 171:Sector_SetFloorScale2(3), @@ -209,7 +212,7 @@ special // 225:Scroll_Texture_Offsets, 226:ACS_ExecuteAlways(2,5), // 227:PointPush_SetForce, - 228:Plat_RaiseAndStayTx0(2), + 228:Plat_RaiseAndStayTx0(2,3), 229:Thing_SetGoal(3,4), 230:Plat_UpByValueStayTx(3), 231:Plat_ToggleCeiling(1), @@ -223,7 +226,7 @@ special 239:Floor_RaiseByValueTxTy(3), 240:Floor_RaiseByTexture(2), 241:Floor_LowerToLowestTxTy(2), - 242:Floor_LowerToHighest(3), + 242:Floor_LowerToHighest(3,4), 243:Exit_Normal(1), 244:Exit_Secret(1), 245:Elevator_RaiseToNearest(2), @@ -232,7 +235,7 @@ special 248:HealThing(1,2), 249:Door_CloseWaitOpen(3, 4), 250:Floor_Donut(3), - 251:FloorAndCeiling_LowerRaise(3), + 251:FloorAndCeiling_LowerRaise(3,4), 252:Ceiling_RaiseToNearest(2), 253:Ceiling_LowerToLowest(2), 254:Ceiling_LowerToFloor(2), @@ -250,7 +253,7 @@ special -9:GetActorVelX(1), -10:GetActorVelY(1), -11:GetActorVelZ(1), - -12:SetActivator(1), + -12:SetActivator(1,2), -13:SetActivatorToTarget(1), -14:GetActorViewHeight(1), -15:GetChar(2), @@ -273,7 +276,53 @@ special -32:SoundSequenceOnPolyobj(2), -33:GetPolyobjX(1), -34:GetPolyobjY(1), + -35:CheckSight(3), + -36:SpawnForced(4,6), + -37:AnnouncerSound(2), + -38:SetPointer(2,4), + -39:ACS_NamedExecute(2,5), + -40:ACS_NamedSuspend(2), + -41:ACS_NamedTerminate(2), + -42:ACS_NamedLockedExecute(5), + -43:ACS_NamedLockedExecuteDoor(5), + -44:ACS_NamedExecuteWithResult(1,5), -45:ACS_NamedExecuteAlways(2,5), + -46:UniqueTID(0,2), + -47:IsTIDUsed(1), + -48:Sqrt(1), + -49:FixedSqrt(1), + -50:VectorLength(2), + -51:SetHUDClipRect(4,5), + -52:SetHUDWrapWidth(1), + -53:SetCVar(2), + -54:GetUserCVar(2), + -55:SetUserCVar(3), + -56:GetCVarString(1), + -57:SetCVarString(2), + -58:GetUserCVarString(2), + -59:SetUserCVarString(3), + -60:LineAttack(4,8), + -61:PlaySound(2,6), + -62:StopSound(1,2), + -63:strcmp(2,3), + -64:stricmp(2,3), + -64:strcasecmp(2,3), // an alias for stricmp + -65:StrLeft(2), + -66:StrRight(2), + -67:StrMid(3), + -68:GetActorClass(1), + -69:GetWeapon(0), + -70:SoundVolume(3), + -71:PlayActorSound(2,6), + -72:SpawnDecal(2,6), + -73:CheckFont(1), + -74:DropItem(2,4), + -75:CheckFlag(2), + -76:SetLineActivation(2), + -77:GetLineActivation(1), + -78:GetActorPowerupTics(2), + + // Zandronum's -100:ResetMap(0), -101:PlayerIsSpectator(1), -102:ConsolePlayerNumber(0), @@ -281,6 +330,33 @@ special -104:GetPlayerLivesLeft(1), -105:SetPlayerLivesLeft(2), -106:KickFromGame(2), - -19620:GetTeamScore(1), //Zdaemon + -107:GetGamemodeState(0), + -108:SetDBEntry(3), + -109:GetDBEntry(2), + -110:SetDBEntryString(3), + -111:GetDBEntryString(2), + -112:IncrementDBEntry(3), + -113:PlayerIsLoggedIn(1), + -114:GetPlayerAccountName(1), + -115:SortDBEntries(4), + -116:CountDBResults(1), + -117:FreeDBResults(1), + -118:GetDBResultKeyString(2), + -119:GetDBResultValueString(2), + -120:GetDBResultValue(2), + -121:GetDBEntryRank(3), + -122:RequestScriptPuke(1,5), + -123:BeginDBTransaction(0), + -124:EndDBTransaction(0), + -125:GetDBEntries(1), + -126:NamedRequestScriptPuke(1,5), + -127:SystemTime(0), + -128:GetTimeProperty(2,3), + -129:Strftime(2,3), + + // ZDaemon's + -19260:GetTeamScore(1), + -19261:SetTeamScore(2), + -100000:__EndOfList__(10); - //-1000:__EndOfList__(10); \ No newline at end of file + diff --git a/Build/Scripting/ZDoom_ACS.cfg b/Build/Scripting/ZDoom_ACS.cfg index 618c40c6..5b008f76 100644 --- a/Build/Scripting/ZDoom_ACS.cfg +++ b/Build/Scripting/ZDoom_ACS.cfg @@ -57,16 +57,16 @@ keywords ACS_Suspend = "ACS_Suspend(script, map)"; ACS_Terminate = "ACS_Terminate(script, map)"; ActivatorSound = "void ActivatorSound(str sound, int volume)"; - ActivatorTID = "int ActivatorTID(void)"; + ActivatorTID = "int ActivatorTID()"; AmbientSound = "void AmbientSound(str sound, int volume)"; //AnnouncerSound = "void AnnouncerSound(str sound, int flags)"; - Autosave = "Autosave(void)"; + Autosave = "Autosave()"; //BlueCount = "BlueCount()"; //BlueReturn = "Script expression BlueReturn"; //BlueScore = "BlueScore()"; //BlueTeamCount = "BlueTeamCount()"; //BlueTeamScore = "BlueTeamScore()"; - CancelFade = "void CancelFade(void)\nIf either FadeTo or FadeRange is currently in progress,\nCancelFade stops it and turns off the palette flash."; + CancelFade = "void CancelFade()\nIf either FadeTo or FadeRange is currently in progress,\nCancelFade stops it and turns off the palette flash."; CanRaiseActor = "bool CanRaiseActor(int tid)\nChecks to see if the actor or actors with the specified tid are viable for resurrection.\nIf tid is 0, the check is done on the activator of the script."; Ceiling_CrushAndRaise = "Ceiling_CrushAndRaise(tag, speed, crush, crushmode)"; Ceiling_CrushAndRaiseA = "Ceiling_CrushAndRaiseA(tag, dspeed, uspeed, crush, crushmode)"; @@ -116,8 +116,8 @@ keywords ClassifyActor = "int ClassifyActor(int tid)"; ClearActorInventory = "void ClearActorInventory(int tid)\nThis function clears the specified actor's inventory."; ClearForceField = "ClearForceField(tag)"; - ClearInventory = "void ClearInventory(void)\nClears the player's inventory of weapons, ammo, armor and usable items."; - ClearLineSpecial = "void ClearLineSpecial(void)\nClears the special of the line that activated the script."; + ClearInventory = "void ClearInventory()\nClears the player's inventory of weapons, ammo, armor and usable items."; + ClearLineSpecial = "void ClearLineSpecial()\nClears the special of the line that activated the script."; //ConsoleCommand = "void ConsoleCommand(str command)"; Cos = "fixed Cos(int angle)"; CreateTranslation = "void CreateTranslation(int transnumber, a:b=c:d, ...)"; @@ -168,10 +168,10 @@ keywords FloorAndCeiling_LowerByValue = "FloorAndCeiling_LowerByValue(tag, speed, height)"; FloorAndCeiling_LowerRaise = "FloorAndCeiling_LowerRaise(tag, fspeed, cspeed, boomemu)"; FloorAndCeiling_RaiseByValue = "FloorAndCeiling_RaiseByValue(tag, speed, height)"; - ForceField = "ForceField(void)"; + ForceField = "ForceField()"; FS_Execute = "FS_Execute(script, side, keynum, message)"; - GameSkill = "int GameSkill(void)"; - GameType = "int GameType(void)"; + GameSkill = "int GameSkill()"; + GameType = "int GameType()"; Generic_Ceiling = "Generic_Ceiling(tag, speed, height, target, flag)"; Generic_Crusher = "Generic_Crusher(tag, dspeed, uspeed, silent, crush)"; Generic_Crusher2 = "Generic_Crusher2(tag, dspeed, uspeed, silent, crush)"; @@ -206,7 +206,7 @@ keywords //GetInvasionWave = "GetInvasionWave()"; GetLevelInfo = "int GetLevelInfo(int levelinfo)"; GetLineActivation = "int GetLineActivation(int lineid)\nlineid: The id of the line of which to get the activation flags.\nReturns SPAC flags as a bitfield"; - GetLineRowOffset = "int GetLineRowOffset(void)"; + GetLineRowOffset = "int GetLineRowOffset()"; GetLineUDMFFixed = "fixed GetLineUDMFFixed(int lineid, str key)"; GetLineUDMFInt = "int GetLineUDMFInt(int lineid, str key)"; GetMaxInventory = "int GetMaxInventory(int tid, str inventory)"; @@ -214,8 +214,8 @@ keywords GetPlayerInput = "int GetPlayerInput(int player, int input)"; GetPolyobjX = "fixed GetPolyobjX(int polyid)"; GetPolyobjY = "fixed GetPolyobjY(int polyid)"; - GetScreenHeight = "int GetScreenHeight(void)"; - GetScreenWidth = "int GetScreenWidth(void)"; + GetScreenHeight = "int GetScreenHeight()"; + GetScreenWidth = "int GetScreenWidth()"; GetSectorCeilingZ = "int GetSectorCeilingZ(int tag, int x, int y)"; GetSectorFloorZ = "fixed GetSectorFloorZ(int tag, int x, int y)"; GetSectorLightLevel = "int GetSectorLightLevel(int tag)"; @@ -223,22 +223,22 @@ keywords GetSectorUDMFInt = "int GetSectorUDMFInt(int tag, str key)"; GetSideUDMFFixed = "fixed GetSideUDMFFixed(int lineid, bool side, str key)"; GetSideUDMFInt = "int GetSideUDMFInt(int lineid, bool side, str key)"; - GetSigilPieces = "int GetSigilPieces(void)\nReturns the number of Sigil pieces that are held by the player"; + GetSigilPieces = "int GetSigilPieces()\nReturns the number of Sigil pieces that are held by the player"; GetThingUDMFFixed = "fixed GetThingUDMFFixed(int thingid, str key)"; GetThingUDMFInt = "int GetThingUDMFInt(int thingid, str key)"; GetUserArray = "void GetUserArray(int tid, str name, int pos)"; GetUserCVar = "int GetUserCVar(int playernumber, str cvar)"; GetUserCVarString = "str GetUserCVarString(int playernumber, str cvar)"; GetUserVariable = "int GetUserVariable(int tid, str name)"; - GetWeapon = "str GetWeapon(void)\nReturns the class name of the weapon currently equipped by the player as a string"; + GetWeapon = "str GetWeapon()\nReturns the class name of the weapon currently equipped by the player as a string"; GiveActorInventory = "void GiveActorInventory(int tid, str inventory_item, int amount)\nThis function will give the amount of items to the specifed actor.\nThis function does not treat tid 0 as the activator of the script"; GiveInventory = "void GiveInventory(str inventory_item, int amount)\nThis function will give the number of items specified to the activator."; GlassBreak = "GlassBreak(dontspawnjunk)"; HealThing = "HealThing(amount)"; HudMessage = "void hudmessage(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)"; HudMessageBold = "void HudMessageBold(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)"; - //IsMultiplayer = "int IsMultiplayer(void)"; - //IsOneFlagCTF = "int IsOneFlagCTF(void)"; + //IsMultiplayer = "int IsMultiplayer()"; + //IsOneFlagCTF = "int IsOneFlagCTF()"; IsPointerEqual = "bool IsPointerEqual(int ptr_select1, int ptr_select2[, int tid1[, int tid2]])"; IsTIDUsed = "bool IsTIDUsed(int tid)"; Light_ChangeToValue = "Light_ChangeToValue(tag, value)"; @@ -260,7 +260,7 @@ keywords Line_SetPortalTarget = "Line_SetPortalTarget(sourcelineid, targetlineid)"; Line_SetTextureOffset = "Line_SetTextureOffset(lineid, x, y, side, flags)"; Line_SetTextureScale = "Line_SetTextureScale(lineid, x, y, side, flags)"; - LineSide = "int LineSide(void)"; + LineSide = "int LineSide()"; LocalAmbientSound = "void LocalAmbientSound(str sound, int volume)"; LocalSetMusic = "void LocalSetMusic(str song[, int order[, int unused]])"; Log = "void Log(type:expression)\nLog will print something in the log area of the screen (top left), as well as logging it to the console.\nIt uses the same parameter format as the Print function."; @@ -286,11 +286,11 @@ keywords Plat_UpWaitDownStay = "Plat_UpWaitDownStay(tag, speed, delay)"; PlayActorSound = "void PlayActorSound(int tid, int sound, int channel, fixed volume, bool looping, fixed attenuation)"; PlayerClass = "int PlayerClass(int playernumber)"; - PlayerCount = "int PlayerCount(void)\nReturns the number of players currently in the game"; - PlayerFrags = "int PlayerFrags(void)"; + PlayerCount = "int PlayerCount()\nReturns the number of players currently in the game"; + PlayerFrags = "int PlayerFrags()"; PlayerInGame = "bool PlayerInGame(int playernumber)\nReturns true if the player [0..7] is in the game"; PlayerIsBot = "bool PlayerIsBot(int playernumber)\nReturns TRUE if the player [0..7] is a bot and FALSE if not"; - PlayerNumber = "int PlayerNumber(void)\nReturns the player number for the player who activated the script, starting at 0.\nFor scripts that were not activated by a player, PlayerNumber will return -1."; + PlayerNumber = "int PlayerNumber()\nReturns the player number for the player who activated the script, starting at 0.\nFor scripts that were not activated by a player, PlayerNumber will return -1."; PlaySound = "void PlaySound(int tid, str sound[, int channel = CHAN_BODY[, fixed volume = 1.0[, bool looping = false[, fixed attenuation = ATTN_NORM]]]])"; Polyobj_DoorSlide = "Polyobj_DoorSlide(po, speed, angle, dist, delay)"; Polyobj_DoorSwing = "Polyobj_DoorSwing(po, speed, angle, delay)"; @@ -425,7 +425,7 @@ keywords TakeActorInventory = "void TakeActorInventory(int tid, str inventory_item, int amount)\nThis function will take the amount of items from the specified actor.\nTakeActorInventory can remove items that are flagged as undroppable."; TakeInventory = "void TakeInventory(str inventory_item, int amount)\nThis function will take the number of items specified from the activator.\nTakeInventory can remove items that are flagged as undroppable."; Teleport = "Teleport(tid, tag, nosourcefog)"; - Teleport_EndGame = "Teleport_EndGame(void)"; + Teleport_EndGame = "Teleport_EndGame()"; Teleport_NewMap = "Teleport_NewMap(map, pos, face)"; Teleport_NoFog = "Teleport_NoFog(tid, useangle, tag)"; Teleport_NoStop = "Teleport_NoStop(tid, tag, nofog)"; @@ -463,7 +463,7 @@ keywords ThingSound = "void ThingSound(int tid, str sound, int volume)\nPlays a sound at a thing.\nThis is a point sound, so anyone far away will not hear it as loudly"; ThrustThing = "ThrustThing(angle, force, nolimit, tid)"; ThrustThingZ = "ThrustThingZ(tid, speed, up_or_down, add_or_set)"; - Timer = "int Timer(void)"; + Timer = "int Timer()"; TranslucentLine = "TranslucentLine(lineid, amount, additive, moreflags)"; UniqueTID = "int UniqueTID([int tid[, int limit]])"; UnMorphActor = "int UnMorphActor(int tid[, bool force])"; diff --git a/Build/Scripting/Zandronum_ACS.cfg b/Build/Scripting/Zandronum_ACS.cfg index cbb4c53d..903f6340 100644 --- a/Build/Scripting/Zandronum_ACS.cfg +++ b/Build/Scripting/Zandronum_ACS.cfg @@ -22,51 +22,65 @@ arrayopen = "["; arrayclose = "]"; argumentdelimiter = ","; terminator = ";"; +extrawordchars = "#"; // Extra characters to be treated as a part of a word by the Script Editor keywordhelp = "http://www.zdoom.org/wiki/index.php?title=%K"; snippetsdir = "acs"; scripttype = 1; //0 = unknown script, 1 = acc, 2 = modeldef, 3 = decorate keywords { - #Define = "#Define identifier expression"; - #EncryptStrings = "#EncryptStrings"; - #Import = "#Import"; - #Include = "#Include"; - #Library = "#Library"; - #LibDefine = "#LibDefine identifier expression"; + #define = "#Define identifier expression"; + #encryptstrings = "#EncryptStrings"; + #import = "#Import"; + #include = "#Include"; + #libdefine = "#LibDefine identifier expression"; + #library = "#Library"; #NoCompact = "#NoCompact"; #NoWadAuthor = "#NoWadAuthor"; #WadAuthor = "#WadAuthor"; + #region = "#region block"; + #endregion = "end of #region block"; ACS_Execute = "ACS_Execute(script, map, arg1, arg2, arg3)"; ACS_ExecuteAlways = "ACS_ExecuteAlways(script, map, arg1, arg2, arg3)"; - ACS_ExecuteWait = "ACS_ExecuteWait(script, map, arg1, arg2, arg3)"; - ACS_ExecuteWithResult = "ACS_ExecuteWithResult(script, s_arg1, s_arg2, s_arg3)"; + ACS_ExecuteWait = "void ACS_ExecuteWait(int script, int unused, int arg1, int arg2, int arg3)"; + ACS_ExecuteWithResult = "ACS_ExecuteWithResult(script, arg1, arg2, arg3)"; ACS_LockedExecute = "ACS_LockedExecute(script, map, arg1, arg2, lock)"; ACS_LockedExecuteDoor = "ACS_LockedExecuteDoor(script, map, arg1, arg2, lock)"; + ACS_NamedExecute = "bool ACS_NamedExecute(str script, int map, int arg1, int arg2, int arg3)"; + ACS_NamedExecuteAlways = "bool ACS_NamedExecuteAlways(str script, int map, int arg1, int arg2, int arg3)"; + ACS_NamedExecuteWait = "void ACS_NamedExecuteWait(str script, int unused, int arg1, int arg2, int arg3)"; + ACS_NamedExecuteWithResult = "int ACS_NamedExecuteWithResult(str script, int arg1, int arg2, int arg3, int arg4)"; + ACS_NamedLockedExecute = "bool ACS_NamedLockedExecute(str script, int map, int arg1, int arg2, int lock)"; + ACS_NamedLockedExecuteDoor = "bool ACS_NamedLockedExecuteDoor(str script, int map, int arg1, int arg2, int lock)"; + ACS_NamedSuspend = "bool ACS_NamedSuspend(str script, int map)"; + ACS_NamedTerminate = "bool ACS_NamedTerminate(str script, int map)"; ACS_Suspend = "ACS_Suspend(script, map)"; ACS_Terminate = "ACS_Terminate(script, map)"; - ActivatorSound = "ActivatorSound(name, volume)"; - ActivatorTID = "ActivatorTID()"; - AmbientSound = "AmbientSound(name, volume)"; + ActivatorSound = "void ActivatorSound(str sound, int volume)"; + ActivatorTID = "int ActivatorTID()"; + AmbientSound = "void AmbientSound(str sound, int volume)"; + AnnouncerSound = "void AnnouncerSound(str sound, int flags)"; Autosave = "Autosave()"; - BlueTeamCount = "BlueTeamCount()"; - BlueTeamScore = "BlueTeamScore()"; - Bool = "Bool expression"; - Break = "Break"; - Return = "Return"; - CancelFade = "CancelFade()"; - Case = "Case expression:"; - Ceiling_CrushAndRaise = "Ceiling_CrushAndRaise(tag, speed, crush)"; - Ceiling_CrushAndRaiseA = "Ceiling_CrushAndRaiseA(tag, dspeed, uspeed, crush)"; - Ceiling_CrushAndRaiseSilentA = "Ceiling_CrushAndRaiseSilentA(tag, dspeed, uspeed, crush)"; - Ceiling_CrushRaiseAndStay = "Ceiling_CrushRaiseAndStay(tag, speed, crush)"; - Ceiling_CrushRaiseAndStayA = "Ceiling_CrushRaiseAndStayA(tag, dspeed, uspeed, crush)"; - Ceiling_CrushRaiseAndStaySilA = "Ceiling_CrushRaiseAndStaySilA(tag, dspeed, uspeed, crush)"; + BeginDBTransaction = "void BeginDBTransaction()"; + //BlueCount = "BlueCount()"; + //BlueReturn = "Script expression BlueReturn"; + //BlueScore = "BlueScore()"; + //BlueTeamCount = "BlueTeamCount()"; + //BlueTeamScore = "BlueTeamScore()"; + CancelFade = "void CancelFade()\nIf either FadeTo or FadeRange is currently in progress,\nCancelFade stops it and turns off the palette flash."; + Ceiling_CrushAndRaise = "Ceiling_CrushAndRaise(tag, speed, crush, crushmode)"; + Ceiling_CrushAndRaiseA = "Ceiling_CrushAndRaiseA(tag, dspeed, uspeed, crush, crushmode)"; + Ceiling_CrushAndRaiseDist = "Ceiling_CrushAndRaiseDist(tag, dist, speed, damage, crushmode)"; + Ceiling_CrushAndRaiseSilentA = "Ceiling_CrushAndRaiseSilentA(tag, dspeed, uspeed, crush, crushmode)"; + Ceiling_CrushRaiseAndStay = "Ceiling_CrushRaiseAndStay(tag, speed, crush, crushmode)"; + Ceiling_CrushRaiseAndStayA = "Ceiling_CrushRaiseAndStayA(tag, dspeed, uspeed, crush, crushmode)"; + Ceiling_CrushRaiseAndStaySilA = "Ceiling_CrushRaiseAndStaySilA(tag, dspeed, uspeed, crush, crushmode)"; Ceiling_CrushStop = "Ceiling_CrushStop(tag)"; - Ceiling_LowerAndCrush = "Ceiling_LowerAndCrush(tag, speed, crush)"; + Ceiling_LowerAndCrush = "Ceiling_LowerAndCrush(tag, speed, crush, crushmode)"; + Ceiling_LowerAndCrushDist = "Ceiling_LowerAndCrushDist(tag, speed, crush, dist, crushmode)"; Ceiling_LowerByValue = "Ceiling_LowerByValue(tag, speed, height)"; Ceiling_LowerByValueTimes8 = "Ceiling_LowerByValueTimes8(tag, speed, height)"; - Ceiling_LowerInstant = "Ceiling_LowerInstant(tag, arg1, height)"; + Ceiling_LowerInstant = "Ceiling_LowerInstant(tag, unused, height)"; Ceiling_LowerToFloor = "Ceiling_LowerToFloor(tag, speed)"; Ceiling_LowerToHighestFloor = "Ceiling_LowerToHighestFloor(tag, speed)"; Ceiling_LowerToLowest = "Ceiling_LowerToLowest(tag, speed)"; @@ -74,72 +88,74 @@ keywords Ceiling_MoveToValueTimes8 = "Ceiling_MoveToValueTimes8(tag, speed, height, neg)"; Ceiling_RaiseByValue = "Ceiling_RaiseByValue(tag, speed, height)"; Ceiling_RaiseByValueTimes8 = "Ceiling_RaiseByValueTimes8(tag, speed, height)"; - Ceiling_RaiseInstant = "Ceiling_RaiseInstant(tag, arg1, height)"; + Ceiling_RaiseInstant = "Ceiling_RaiseInstant(tag, unused, height)"; Ceiling_RaiseToNearest = "Ceiling_RaiseToNearest(tag, speed)"; Ceiling_Waggle = "Ceiling_Waggle(tag, amp, freq, offset, time)"; ChangeCamera = "ChangeCamera(tid, who, revert)"; - ChangeCeiling = "ChangeCeiling(tag, flat)"; - ChangeFloor = "ChangeFloor(tag, flat)"; - ChangeLevel = "ChangeLevel(mapname, position, flags, skill)"; + ChangeCeiling = "void ChangeCeiling(int tag, str flatname)"; + ChangeFloor = "void ChangeFloor(int tag, str flatname)"; + ChangeLevel = "void ChangeLevel(str mapname, int position, int flags[, int skill])\nChanges to a new map, places the player at the specified start spot, and optionally changes the skill level at the same time."; ChangeSkill = "ChangeSkill(skill)"; - CheckActorCeilingTexture = "CheckActorCeilingTexture(tid, texture)"; - CheckActorClass = "CheckActorClass(tid, class)"; - CheckActorFloorTexture = "CheckActorFloorTexture(tid, texture)"; - CheckActorInventory = "CheckActorInventory(tid, type)"; - CheckActorProperty = "CheckActorProperty(tid, property, value)"; - CheckInventory = "CheckInventory(type)"; - CheckPlayerCamera = "CheckPlayerCamera(player)"; - CheckWeapon = "CheckWeapon(weapon)"; - ClassifyActor = "ClassifyActor(tid)"; - ClearActorInventory = "ClearActorInventory(tid)"; - ClearForceField = "ClearForceField()"; - ClearInventory = "ClearInventory()"; - ClearLineSpecial = "ClearLineSpecial()"; - ConsoleCommand = "ConsoleCommand(command)"; - Const = "Const"; - Continue = "Continue"; - cos = "cos(angle)"; - CreateTranslation = "CreateTranslation(transnumber, translation, translation, translation, ...)"; - DamageThing = "DamageThing(amount)"; - Death = "Script expression Death"; - Default = "Default:"; - Delay = "Delay(tics)"; - Disconnect = "Script expression Disconnect"; - Do = "Do"; - Door_Animated = "Door_Animated(tag, speed, delay)"; - Door_Close = "Door_Close(tag, speed)"; - Door_CloseWaitOpen = "Door_CloseWaitOpen(tag, speed, delay)"; - Door_LockedRaise = "Door_LockedRaise(tag, speed, delay, lock)"; - Door_Open = "Door_Open(tag, speed)"; - Door_Raise = "Door_Raise(tag, speed, delay)"; + ChangeSky = "void ChangeSky(str sky1, str sky2)\nChanges the sky texture to sky1 and the second sky texture to sky2.\nBoth textures must be the same height if doublesky is enabled.\nYou may also use any flat, pname, sprite or internal graphic (such as TITLEPIC) in place of an actual texture.\nUseful in conjunction with SetSkyScrollSpeed."; + CheckActorCeilingTexture = "bool CheckActorCeilingTexture(int tid, str texture)"; + CheckActorClass = "bool CheckActorClass(int tid, str class)"; + CheckActorFloorTexture = "bool CheckActorFloorTexture(int tid, str texture)"; + CheckActorInventory = "int CheckActorInventory(int tid, str inventory_item)\nChecks the given actor's inventory for the item specified by inventory_item"; + CheckActorProperty = "bool CheckActorProperty(int tid, int property, [int|float|str] value)"; + CheckFlag = "bool CheckFlag(int tid, str flag)\nChecks to see if the actor with the matching tid has the specified actor flag set.\nIf tid is 0, the check is performed on the activator of the script."; + CheckFont = "bool CheckFont(str fontname)"; + CheckInventory = "int CheckInventory(str inventory_item)\nChecks the inventory of the actor who activated the script for the item specified by inventory_item"; + CheckPlayerCamera = "int CheckPlayerCamera(int player)"; + CheckSight = "bool CheckSight(int source, int dest, int flags)"; + CheckWeapon = "bool CheckWeapon(str weapon)\nChecks if player's active weapon is the weapon with specified class name."; + ClassifyActor = "int ClassifyActor(int tid)"; + ClearActorInventory = "void ClearActorInventory(int tid)\nThis function clears the specified actor's inventory."; + ClearForceField = "ClearForceField(tag)"; + ClearInventory = "void ClearInventory()\nClears the player's inventory of weapons, ammo, armor and usable items."; + ClearLineSpecial = "void ClearLineSpecial()\nClears the special of the line that activated the script."; + //ConsoleCommand = "void ConsoleCommand(str command)"; + ConsolePlayerNumber = "int ConsolePlayerNumber()"; + Cos = "fixed Cos(int angle)"; + CountDBResults = "int CountDBResults(resource results)"; + CreateTranslation = "void CreateTranslation(int transnumber, a:b=c:d, ...)"; + DamageThing = "DamageThing(amount, mod)"; + Delay = "void Delay(int tics)"; + Door_Animated = "Door_Animated(tag, speed, delay, lock)"; + Door_Close = "Door_Close(tag, speed, lighttag)"; + Door_CloseWaitOpen = "Door_CloseWaitOpen(tag, speed, delay, lighttag)"; + Door_LockedRaise = "Door_LockedRaise(tag, speed, delay, lock, lighttag)"; + Door_Open = "Door_Open(tag, speed, lighttag)"; + Door_Raise = "Door_Raise(tag, speed, delay, lighttag)"; + DropItem = "int DropItem(int tid, str item[, int dropamount = -1[, int chance = 256]])\nCauses actors with the matching tid to drop the specified item.\nIf tid is 0, the activator of the script is considered to be the dropper of the item.\nThis works in a similar way to the DropItem actor property.\nThe return value of the function is the number of dropped items."; Elevator_LowerToNearest = "Elevator_LowerToNearest(tag, speed)"; Elevator_MoveToFloor = "Elevator_MoveToFloor(tag, speed)"; Elevator_RaiseToNearest = "Elevator_RaiseToNearest(tag, speed)"; - Else = "Else"; - Enter = "Script expression Enter"; + EndDBTransaction = "void EndDBTransaction()"; Exit_Normal = "Exit_Normal(pos)"; Exit_Secret = "Exit_Secret(pos)"; - FadeRange = "FadeRange(red1, green1, blue1, red2, green2, blue2, amount, seconds)"; - FadeTo = "FadeTo(red, green, blue, amount, seconds)"; - FixedDiv = "FixedDiv(fa, fb)"; - FixedMul = "FixedMul(fa, fb)"; + FadeRange = "void FadeRange(int red1, int green1, int blue1, fixed amount1, int red2, int green2, int blue2, fixed amount2, fixed seconds)\nSets the current flash to the first color set and then fades it to the second color set over the specified number of seconds."; + FadeTo = "void FadeTo(int red, int green, int blue, fixed amount, fixed seconds)\nFades the activator's view from the current palette flash to another one.\nThis will also work if the activator is looking through another viewpoint (using a camera, etc.)."; + FixedDiv = "fixed FixedDiv(int a, int b)"; + FixedMul = "fixed FixedMul(int a, int b)"; + FixedSqrt = "fixed FixedSqrt(fixed number)"; Floor_CrushStop = "Floor_CrushStop(tag)"; Floor_Donut = "Floor_Donut(ptag, pspeed, sspeed)"; Floor_LowerByValue = "Floor_LowerByValue(tag, speed, height)"; Floor_LowerByValueTimes8 = "Floor_LowerByValueTimes8(tag, speed, height)"; - Floor_LowerInstant = "Floor_LowerInstant(tag, arg1, height)"; - Floor_LowerToHighest = "Floor_LowerToHighest(tag, speed, adjust)"; + Floor_LowerInstant = "Floor_LowerInstant(tag, unused, height)"; + Floor_LowerToHighest = "Floor_LowerToHighest(tag, speed, adjust, force_adjust)"; Floor_LowerToLowest = "Floor_LowerToLowest(tag, speed)"; Floor_LowerToLowestTxTy = "Floor_LowerToLowestTxTy(tag, speed)"; Floor_LowerToNearest = "Floor_LowerToNearest(tag, speed)"; Floor_MoveToValue = "Floor_MoveToValue(tag, speed, height, neg)"; Floor_MoveToValueTimes8 = "Floor_MoveToValueTimes8(tag, speed, height, neg)"; - Floor_RaiseAndCrush = "Floor_RaiseAndCrush(tag, speed, crush)"; + Floor_RaiseAndCrush = "Floor_RaiseAndCrush(tag, speed, crush, crushmode)"; + Floor_RaiseAndCrushDoom = "Floor_RaiseAndCrushDoom(tag, speed, crush, crushmode)"; Floor_RaiseByTexture = "Floor_RaiseByTexture(tag, speed)"; Floor_RaiseByValue = "Floor_RaiseByValue(tag, speed, height)"; Floor_RaiseByValueTimes8 = "Floor_RaiseByValueTimes8(tag, speed, height)"; Floor_RaiseByValueTxTy = "Floor_RaiseByValueTxTy(tag, speed, height)"; - Floor_RaiseInstant = "Floor_RaiseInstant(tag, arg1, height)"; + Floor_RaiseInstant = "Floor_RaiseInstant(tag, unused, height)"; Floor_RaiseToHighest = "Floor_RaiseToHighest(tag, speed)"; Floor_RaiseToLowestCeiling = "Floor_RaiseToLowestCeiling(tag, speed)"; Floor_RaiseToNearest = "Floor_RaiseToNearest(tag, speed)"; @@ -147,77 +163,96 @@ keywords Floor_TransferTrigger = "Floor_TransferTrigger(tag)"; Floor_Waggle = "Floor_Waggle(tag, amp, freq, offset, time)"; FloorAndCeiling_LowerByValue = "FloorAndCeiling_LowerByValue(tag, speed, height)"; - FloorAndCeiling_LowerRaise = "FloorAndCeiling_LowerRaise(tag, fspeed, cspeed)"; + FloorAndCeiling_LowerRaise = "FloorAndCeiling_LowerRaise(tag, fspeed, cspeed, boomemu)"; FloorAndCeiling_RaiseByValue = "FloorAndCeiling_RaiseByValue(tag, speed, height)"; - For = "For(initialization, condition, iteration)"; ForceField = "ForceField()"; - Function = "Function Void expression (Void)"; - GameSkill = "GameSkill()"; - GameType = "GameType()"; + FreeDBResults = "void FreeDBResults(int set)"; + FS_Execute = "FS_Execute(script, side, keynum, message)"; + GameSkill = "int GameSkill()"; + GameType = "int GameType()"; Generic_Ceiling = "Generic_Ceiling(tag, speed, height, target, flag)"; Generic_Crusher = "Generic_Crusher(tag, dspeed, uspeed, silent, crush)"; + Generic_Crusher2 = "Generic_Crusher2(tag, dspeed, uspeed, silent, crush)"; Generic_Door = "Generic_Door(tag, speed, kind, delay, lock)"; Generic_Floor = "Generic_Floor(tag, speed, height, target, flags)"; Generic_Lift = "Generic_Lift(tag, speed, delay, type, height)"; Generic_Stairs = "Generic_Stairs(tag, speed, height, flags, reset)"; - GetLevelInfo = "GetLevelInfo(infotype)"; - GetActorAngle = "GetActorAngle(tid)"; - GetActorCeilingZ = "GetActorCeilingZ(tid)"; - GetActorFloorZ = "GetActorFloorZ(tid)"; - GetActorLightLevel = "GetActorLightLevel(tid)"; - GetActorPitch = "GetActorPitch(tid)"; - GetActorProperty = "GetActorProperty(tid, property)"; - GetActorVelX = "GetActorVelX(tid)"; - GetActorVelY = "GetActorVelY(tid)"; - GetActorVelZ = "GetActorVelZ(tid)"; - GetActorViewHeight = "GetActorViewHeight(tid)"; - GetActorX = "GetActorX(tid)"; - GetActorY = "GetActorY(tid)"; - GetActorZ = "GetActorZ(tid)"; - GetAirSupply = "GetAirSupply(playernumber)"; - GetAmmoCapacity = "GetAmmoCapacity(classname)"; - GetArmorType = "GetArmorType(armortype, playernumber)"; - GetChar = "GetChar(string, index)"; - GetCVar = "GetCVar(name)"; - GetInvasionState = "GetInvasionState()"; - GetInvasionWave = "GetInvasionWave()"; - GetPlayerInfo = "GetPlayerInfo(playernumber, infotype)"; - GetLevelInfo = "GetLevelInfo(infotype)"; - GetLineRowOffset = "GetLineRowOffset()"; - GetLineUDMFInt = "GetLineUDMFInt(lineid, fieldname)"; - GetLineUDMFFixed = "GetLineUDMFFixed(lineid, fieldname)"; - GetPlayerInput = "GetPlayerInput(player, input)"; - GetPolyobjX = "GetPolyobjX(po)"; - GetPolyobjY = "GetPolyobjY(po)"; - GetScreenHeight = "GetScreenHeight()"; - GetScreenWidth = "GetScreenWidth()"; - GetSectorCeilingZ = "GetSectorCeilingZ(tag, x, y)"; - GetSectorFloorZ = "GetSectorFloorZ(tag, x, y)"; - GetSectorLightLevel = "GetSectorLightLevel(tag)"; - GetSectorUDMFInt = "GetSectorUDMFInt(tag, fieldname)"; - GetSectorUDMFFixed = "GetSectorUDMFFixed(tag, fieldname)"; - GetSideUDMFInt = "GetSideUDMFInt(lineid, side, fieldname)"; - GetSideUDMFFixed = "GetSideUDMFFixed(lineid, side, fieldname)"; - GetThingUDMFInt = "GetThingUDMFInt(tid, fieldname)"; - GetThingUDMFFixed = "GetThingUDMFFixed(tid, fieldname)"; - GetUserArray = "GetUserArray(tid, name, pos)"; - GetUserVariable = "GetUserVariable(tid, name)"; - GiveActorInventory = "GiveActorInventory(tid, type, amount)"; - GiveInventory = "GiveInventory(type, amount)"; + GetActorAngle = "fixed GetActorAngle(int tid)"; + GetActorCeilingZ = "fixed GetActorCeilingZ(int tid)"; + GetActorClass = "str GetActorClass(int tid)"; + GetActorFloorZ = "fixed GetActorFloorZ(int tid)"; + GetActorLightLevel = "int GetActorLightLevel(int tid)"; + GetActorPitch = "fixed GetActorPitch(int tid)"; + GetActorPowerupTics = "int GetActorPowerupTics(int tid, str powerup)"; + GetActorProperty = "int GetActorProperty(int tid, int property)"; + GetActorVelX = "fixed GetActorVelX(int tid)"; + GetActorVelY = "fixed GetActorVelY(int tid)"; + GetActorVelZ = "fixed GetActorVelZ(int tid)"; + GetActorViewHeight = "fixed GetActorViewHeight(int tid)"; + GetActorX = "fixed GetActorX(int tid)"; + GetActorY = "fixed GetActorY(int tid)"; + GetActorZ = "fixed GetActorZ(int tid)"; + GetAirSupply = "int GetAirSupply(int playernum)"; + GetAmmoCapacity = "int GetAmmoCapacity(str classname)"; + GetArmorType = "int GetArmorType(str armortype, int playernum)"; + GetChar = "int GetChar(str string, int index)"; + GetCVar = "int GetCVar(str cvar)"; + GetCVarString = "str GetCVarString(str cvar)"; + GetDBEntries = "resource GetDBEntries(str namespace)"; + GetDBEntry = "int GetDBEntry(table, variable)"; + GetDBEntryRank = "int GetDBEntryRank(str namespace, str key, int order)"; + GetDBEntryString = "str GetDBEntryString(str namespace, str key)"; + GetDBResultKeyString = "str GetDBResultKeyString(int set, int record)"; + GetDBResultValue = "int GetDBResultValue(int set, int record)"; + GetDBResultValueString = "str GetDBResultValueString(int set, int record)"; + GetGameModeState = "int GetGameModeState()"; + GetInvasionState = "int GetInvasionState()"; + GetInvasionWave = "int GetInvasionWave()"; + GetLevelInfo = "int GetLevelInfo(int levelinfo)"; + GetLineActivation = "int GetLineActivation(int lineid)\nlineid: The id of the line of which to get the activation flags.\nReturns SPAC flags as a bitfield"; + GetLineRowOffset = "int GetLineRowOffset()"; + GetLineUDMFFixed = "fixed GetLineUDMFFixed(int lineid, str key)"; + GetLineUDMFInt = "int GetLineUDMFInt(int lineid, str key)"; + GetPlayerAccountName = "str GetPlayerAccountName(int player)"; + GetPlayerInfo = "int GetPlayerInfo(int playernumber, int playerinfo)"; + GetPlayerInput = "int GetPlayerInput(int player, int input)"; + GetPlayerLivesLeft = "int GetPlayerLivesLeft(int player)"; + GetPolyobjX = "fixed GetPolyobjX(int polyid)"; + GetPolyobjY = "fixed GetPolyobjY(int polyid)"; + GetScreenHeight = "int GetScreenHeight()"; + GetScreenWidth = "int GetScreenWidth()"; + GetSectorCeilingZ = "int GetSectorCeilingZ(int tag, int x, int y)"; + GetSectorFloorZ = "fixed GetSectorFloorZ(int tag, int x, int y)"; + GetSectorLightLevel = "int GetSectorLightLevel(int tag)"; + GetSectorUDMFFixed = "fixed GetSectorUDMFFixed(int tag, str key)"; + GetSectorUDMFInt = "int GetSectorUDMFInt(int tag, str key)"; + GetSideUDMFFixed = "fixed GetSideUDMFFixed(int lineid, bool side, str key)"; + GetSideUDMFInt = "int GetSideUDMFInt(int lineid, bool side, str key)"; + GetSigilPieces = "int GetSigilPieces()\nReturns the number of Sigil pieces that are held by the player"; + GetTeamProperty = "int GetTeamProperty(int team, int prop)"; + GetTimeProperty = "int GetTimeProperty(int timestamp, int which[, bool utc])"; + GetThingUDMFFixed = "fixed GetThingUDMFFixed(int thingid, str key)"; + GetThingUDMFInt = "int GetThingUDMFInt(int thingid, str key)"; + GetUserArray = "void GetUserArray(int tid, str name, int pos)"; + GetUserCVar = "int GetUserCVar(int playernumber, str cvar)"; + GetUserCVarString = "str GetUserCVarString(int playernumber, str cvar)"; + GetUserVariable = "int GetUserVariable(int tid, str name)"; + GetWeapon = "str GetWeapon()\nReturns the class name of the weapon currently equipped by the player as a string"; + GiveActorInventory = "void GiveActorInventory(int tid, str inventory_item, int amount)\nThis function will give the amount of items to the specifed actor.\nThis function does not treat tid 0 as the activator of the script"; + GiveInventory = "void GiveInventory(str inventory_item, int amount)\nThis function will give the number of items specified to the activator."; GlassBreak = "GlassBreak(dontspawnjunk)"; - Global = "Global Int expression:identifier"; - Goto = "Goto"; HealThing = "HealThing(amount)"; - HudMessage = "HudMessage(text; type, id, color, x, y, holdtime)"; - HudMessageBold = "HudMessageBold(text; type, id, color, x, y, holdtime)"; - If = "If(expression)"; - Int = "Int expression"; - IsMultiplayer = "IsMultiplayer()"; - IsOneFlagCTF = "IsOneFlagCTF()"; + HudMessage = "void hudmessage(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)"; + HudMessageBold = "void HudMessageBold(s:text; int type, int id, int color, fixed x, fixed y, fixed holdTime)"; + IsMultiplayer = "bool IsMultiplayer()"; + IsOneFlagCTF = "bool IsOneFlagCTF()"; + IncrementDBEntry = "void IncrementDBEntry(str namespace, str key, int amount)"; + IsTIDUsed = "bool IsTIDUsed(int tid)"; + KickFromGame = "bool KickFromGame(int player, str reason)"; Light_ChangeToValue = "Light_ChangeToValue(tag, value)"; Light_Fade = "Light_Fade(tag, value, tics)"; Light_Flicker = "Light_Flicker(tag, upper, lower)"; - Light_ForceLightning = "Light_ForceLightning()"; + Light_ForceLightning = "Light_ForceLightning(mode)"; Light_Glow = "Light_Glow(tag, upper, lower, tics)"; Light_LowerByValue = "Light_LowerByValue(tag, value)"; Light_MaxNeighbor = "Light_MaxNeighbor(tag)"; @@ -226,260 +261,359 @@ keywords Light_Stop = "Light_Stop(tag)"; Light_Strobe = "Light_Strobe(tag, upper, lower, u-tics, l-tics)"; Light_StrobeDoom = "Light_StrobeDoom(tag, u-tics, l-tics)"; - Lightning = "Script expression Lightning"; + LineAttack = "LineAttack(int tid, fixed angle, fixed pitch, int damage[, str pufftype = 'BulletPuff'[, str damagetype = 'None'[, fixed range = 2048[, int flags = 0]]]])\nFires a hitscan attack. If tid is 0, the activator of the script is the source of the attack."; Line_AlignCeiling = "Line_AlignCeiling(lineid, side)"; Line_AlignFloor = "Line_AlignFloor(lineid, side)"; Line_SetBlocking = "Line_SetBlocking(lineid, setflags, clearflags)"; - Line_SetTextureScale = "Line_SetTextureScale(lineid, x, y, side, flags)"; Line_SetTextureOffset = "Line_SetTextureOffset(lineid, x, y, side, flags)"; - LineSide = "LineSide()"; - LocalAmbientSound = "LocalAmbientSound(name, volume)"; - LocalSetMusic = "LocalSetMusic(song, pattern, transition)"; - Log = "Log(type:expression)"; - MorphActor = "MorphActor(tid, playerclass, monsterclass, duration, style, morphflash, unmorphflash)"; - Net = "Script expression Net"; + Line_SetTextureScale = "Line_SetTextureScale(lineid, x, y, side, flags)"; + LineSide = "int LineSide()"; + LocalAmbientSound = "void LocalAmbientSound(str sound, int volume)"; + LocalSetMusic = "void LocalSetMusic(str song[, int order[, int unused]])"; + Log = "void Log(type:expression)\nLog will print something in the log area of the screen (top left), as well as logging it to the console.\nIt uses the same parameter format as the Print function."; + MorphActor = "int MorphActor(int tid, [str playerclass, [str monsterclass, [int duration, [int style, [str morphflash, [str unmorphflash]]]]]])"; + NamedRequestScriptPuke = "int NamedRequestScriptPuke(str script[, int arg0[, int arg1[, int arg2[, int arg3]]]])"; + NamedScriptWait = "void NamedScriptWait(str script)"; NoiseAlert = "NoiseAlert(target_tid, emiter_tid)"; - Open = "Script expression Open"; Pillar_Build = "Pillar_Build(tag, speed, height)"; - Pillar_BuildAndCrush = "Pillar_BuildAndCrush(tag, speed, height, crush)"; + Pillar_BuildAndCrush = "Pillar_BuildAndCrush(tag, speed, height, crush, crushmode)"; Pillar_Open = "Pillar_Open(tag, speed, fdist, cdist)"; - Plane_Align = "Plane_Align(floor, ceiling)"; Plat_DownByValue = "Plat_DownByValue(tag, speed, delay, height)"; Plat_DownWaitUpStay = "Plat_DownWaitUpStay(tag, speed, delay)"; - Plat_DownWaitUpStayLip = "Plat_DownWaitUpStayLip(tag, speed, delay, lip)"; + Plat_DownWaitUpStayLip = "Plat_DownWaitUpStayLip(tag, speed, delay, lip, sound)"; Plat_PerpetualRaise = "Plat_PerpetualRaise(tag, speed, delay)"; Plat_PerpetualRaiseLip = "Plat_PerpetualRaiseLip(tag, speed, delay, lip)"; - Plat_RaiseAndStayTx0 = "Plat_RaiseAndStayTx0(tag, speed)"; + Plat_RaiseAndStayTx0 = "Plat_RaiseAndStayTx0(tag, speed, lockout)"; Plat_Stop = "Plat_Stop(tag)"; Plat_ToggleCeiling = "Plat_ToggleCeiling(tag)"; Plat_UpByValue = "Plat_UpByValue(tag, speed, delay, height)"; Plat_UpByValueStayTx = "Plat_UpByValueStayTx(tag, speed, height)"; Plat_UpNearestWaitDownStay = "Plat_UpNearestWaitDownStay(tag, speed, delay)"; Plat_UpWaitDownStay = "Plat_UpWaitDownStay(tag, speed, delay)"; - Player_GiveItem = "Player_GiveItem(item, message)"; - Player_RemoveItem = "Player_RemoveItem(item, message)"; - Player_SetTeam = "Player_SetTeam(team)"; - PlayerArmorPoints = "PlayerArmorPoints()"; - PlayerBlueSkull = "PlayerBlueSkull()"; - PlayerClass = "PlayerClass(player_number)"; - PlayerCount = "PlayerCount()"; - PlayerFrags = "PlayerFrags()"; - PlayerHealth = "PlayerHealth()"; - PlayerInGame = "PlayerInGame(player_number)"; - PlayerIsBot = "PlayerIsBot(player_number)"; - PlayerNumber = "PlayerNumber()"; - PlayerOnTeam = "PlayerOnTeam()"; - PlayerRedSkull = "PlayerRedSkull()"; - PlayerTeam = "PlayerTeam()"; - PlayerYellowSkull = "PlayerYellowSkull()"; - PlayMovie = "PlayMovie(moviename)"; + PlayActorSound = "void PlayActorSound(int tid, int sound, int channel, fixed volume, bool looping, fixed attenuation)"; + PlayerArmorpoints = "int PlayerArmorpoints()"; + PlayerClass = "int PlayerClass(int playernumber)"; + PlayerCount = "int PlayerCount()\nReturns the number of players currently in the game"; + PlayerFrags = "int PlayerFrags()"; + PlayerHealth = "int PlayerHealth()"; + PlayerIsLoggedIn = "int PlayerIsLoggedIn(int playernumber)"; + PlayerInGame = "bool PlayerInGame(int playernumber)\nReturns true if the player [0..7] is in the game"; + PlayerIsBot = "bool PlayerIsBot(int playernumber)\nReturns TRUE if the player [0..7] is a bot and FALSE if not"; + PlayerIsSpectator = "int PlayerIsSpectator(int player)"; + PlayerNumber = "int PlayerNumber()\nReturns the player number for the player who activated the script, starting at 0.\nFor scripts that were not activated by a player, PlayerNumber will return -1."; + PlayerTeam = "int PlayerTeam()"; + PlaySound = "void PlaySound(int tid, str sound[, int channel = CHAN_BODY[, fixed volume = 1.0[, bool looping = false[, fixed attenuation = ATTN_NORM]]]])"; Polyobj_DoorSlide = "Polyobj_DoorSlide(po, speed, angle, dist, delay)"; Polyobj_DoorSwing = "Polyobj_DoorSwing(po, speed, angle, delay)"; Polyobj_Move = "Polyobj_Move(po, speed, angle, dist)"; Polyobj_MoveTimes8 = "Polyobj_MoveTimes8(po, speed, angle, dist)"; + Polyobj_MoveTo = "Polyobj_MoveTo(po, speed, pos_x, pos_y)"; + Polyobj_MoveToSpot = "Polyobj_MoveToSpot(po, speed, target)"; Polyobj_OR_Move = "Polyobj_OR_Move(po, speed, angle, distance)"; Polyobj_OR_MoveTimes8 = "Polyobj_OR_MoveTimes8(po, speed, angle, distance)"; - Polyobj_OR_RotateLeft = "Polyobj_OR_RotateLeft(po, speed)"; + Polyobj_OR_MoveTo = "Polyobj_OR_MoveTo(po, speed, pos_x, pos_y)"; + Polyobj_OR_MoveToSpot = "Polyobj_OR_MoveToSpot(po, speed, target)"; + Polyobj_OR_RotateLeft = "Polyobj_OR_RotateLeft(po, speed, angle)"; Polyobj_OR_RotateRight = "Polyobj_OR_RotateRight(po, speed, angle)"; Polyobj_RotateLeft = "Polyobj_RotateLeft(po, speed, angle)"; Polyobj_RotateRight = "Polyobj_RotateRight(po, speed, angle)"; - PolyWait = "PolyWait(po)"; - Print = "Print(type:expression)"; - PrintBold = "PrintBold(type:expression)"; - PointPush_SetForce = "PointPush_SetForce(tag, tid, amount, useline)"; + Polyobj_Stop = "Polyobj_Stop(po)"; + PolyWait = "void PolyWait(int polyid)"; + Print = "void Print(type:expression)\nPrint will print something to the screen.\nPrint will only display for the activator of the script\nFor printing to all players, use PrintBold."; + PrintBold = "void PrintBold(type:expression)\nThis is exactly the same as Print, except all players will see the printed text\non the screen instead of just the activator of the script."; Radius_Quake = "Radius_Quake(intensity, duration, damrad, tremrad, tid)"; - Random = "Random(low, high)"; - ReplaceTextures = "ReplaceTextures(oldtexture, newtexture, flags)"; - RedTeamCount = "RedTeamCount()"; - RedTeamScore = "RedTeamScore()"; - Respawn = "Script expression Respawn"; - Restart = "Restart"; - Script = "Script expression (Void)"; - ScriptWait = "ScriptWait(scriptid)"; - Scroll_Ceiling = "Scroll_Ceiling(tag, scrollbits, 0, xmove, ymove)"; - Scroll_Floor = "Scroll_Floor(tag, scrollbits, method xmove, ymove)"; + Radius_Quake2 = "void Radius_Quake2(int tid, int intensity, int duration, int damrad, int tremrad, str sound)"; + Random = "int Random(int min, int max)"; + ReplaceTextures = "void ReplaceTextures(str oldtexturename, str newtexturename[, int flags])\nReplaces all occurences of oldtexturename with newtexturename.\nNOT_ flags can be used."; + RequestScriptPuke = "int RequestScriptPuke(int script[, int arg0[, int arg1[, int arg2[, int arg3]]]])"; + ResetMap = "int ResetMap()"; + ScriptWait = "void ScriptWait(int script)"; + Scroll_Ceiling = "Scroll_Ceiling(tag, x-move, y-move, unused)"; + Scroll_Floor = "Scroll_Floor(tag, x-move, y-move, type)"; Scroll_Texture_Both = "Scroll_Texture_Both(lineid, left, right, down, up)"; - Scroll_Texture_Model = "Scroll_Texture_Model(lineid, scrollbits)"; - Scroll_Texture_Offsets = "Scroll_Texture_Offsets"; Scroll_Wall = "Scroll_Wall(lineid, x, y, side, flags)"; + Sector_ChangeFlags = "Sector_ChangeFlags(tag, setflags, clearflags)"; Sector_ChangeSound = "Sector_ChangeSound(tag, newsequence)"; Sector_SetCeilingPanning = "Sector_SetCeilingPanning(tag, u-int, u-frac, v-int, v-frac)"; Sector_SetCeilingScale = "Sector_SetCeilingScale(tag, u-int, u-frac, v-int, v-frac)"; - Sector_SetColor = "Sector_SetColor(tag, r, g, b)"; + Sector_SetCeilingScale2 = "Sector_SetCeilingScale2(tag, u-fixed, v-fixed)"; + Sector_SetColor = "Sector_SetColor(tag, red, green, blue, desaturation)"; + Sector_SetCurrent = "Sector_SetCurrent(tag, amount, angle, useline)"; Sector_SetDamage = "Sector_SetDamage(tag, amount, mod)"; - Sector_SetFade = "Sector_SetFade(tag, r, g, b)"; + Sector_SetFade = "Sector_SetFade(tag, red, green, blue)"; Sector_SetFloorPanning = "Sector_SetFloorPanning(tag, u-int, u-frac, v-int, v-frac)"; Sector_SetFloorScale = "Sector_SetFloorScale(tag, u-int, u-frac, v-int, v-frac)"; + Sector_SetFloorScale2 = "Sector_SetFloorScale2(tag, u-fixed, v-fixed)"; Sector_SetFriction = "Sector_SetFriction(tag, amount)"; Sector_SetGravity = "Sector_SetGravity(tag, ipart, fpart)"; Sector_SetLink = "Sector_SetLink(controltag, tag, surface, movetype)"; Sector_SetPlaneReflection = "Sector_SetPlaneReflection(tag, floor, ceiling)"; - Sector_SetRotation = "Sector_SetRotation(tag, floor-angle, ceiling-angle)"; - SectorDamage = "SectorDamage(tag, amount, type, protection-item, flags)"; - SectorSound = "SectorSound(name, volume)"; + Sector_SetRotation = "Sector_SetRotation(tag, floorangle, ceilingangle)"; + Sector_SetTranslucent = "Sector_SetTranslucent(tag, plane, amount, type)"; + Sector_SetWind = "Sector_SetWind(tag, amount, angle, useline)"; + SectorDamage = "void SectorDamage(int tag, int amount, str type, str protection_item, int flags)\nDoes the damage only when the function is called,\nand damages everything in the tagged sector.\nUses DAMAGE_ flags."; + SectorSound = "void SectorSound(str sound, int volume)"; SendToCommunicator = "SendToCommunicator(voc_id, front_only, indentify, nolog)"; - SetActorAngle = "SetActorAngle(tid, angle)"; - SetAirControl = "SetAirControl(amount)"; - SetActorPitch = "SetActorPitch(tid, angle)"; - SetActorPosition = "SetActorPosition(tid, x, y, z, fog)"; - SetActorProperty = "SetActorProperty(tid, property, value)"; - SetActorState = "SetActorState(tid, state, exact)"; - SetActorVelocity = "SetActorVelocity(tid, velx, vely, velz, add, setbob)"; - SetAirSupply = "SetAirSupply(playernumber, tics)"; - SetCameraToTexture = "SetCameraToTexture(tag, texture, fov)"; - SetCeilingTrigger = "SetCeilingTrigger(tag, height, special, arg1, arg2, arg3, arg4, arg5)"; + SetActivator = "int SetActivator(int tid[, int pointer_selector])\nThis changes the activator of the script to the first actor found with the specified tid.\ntid: TID of the new activator.\npointer_selector: the pointer of the TID to set as the new activator (use AAPTR_ flags)."; + SetActivatorToTarget = "bool SetActivatorToTarget(int tid)\nThis changes the activator of the script to the current target\nof the first actor found with the specified tid.\nUsing a tid of 0 uses the current activator's target."; + SetActorAngle = "void SetActorAngle(int tid, fixed angle)\nSets the actor's angle.\nangle: a fixed point angle in the range of 0.0 to 1.0 (N = 0.25, W = 0.5, S = 0.75, E = 1.0)."; + SetActorPitch = "void SetActorPitch(int tid, int pitch)\nSets the actor's Pitch.\npitch: a fixed point angle in the range of 0.0 to 1.0."; + SetActorPosition = "bool SetActorPosition(int tid, fixed x, fixed y, fixed z, bool fog)\nThis function sets the x, y, and z coordinates of the specified actor, with or without teleport fog.\nReturns TRUE if the actor position was changed successfully."; + SetActorProperty = "void SetActorProperty(int tid, int property, [int|float|str] value)\nproperty: one of the APROP_ properties."; + SetActorRoll = "void SetActorRoll(int tid, fixed angle)"; + SetActorState = "int SetActorState(int tid, str statename[, bool exact])\nForces the actor(s) with the matching tid into the specified state, as defined in Decorate.\nIf tid is 0, the activator is affected.\nThe exact parameter specifies whether or not partial state name matches are accepted."; + SetActorVelocity = "bool SetActorVelocity(int tid, fixed velx, fixed vely, fixed velz, bool add, bool setbob)\nChanges actor velocity.\ntid: TID of things to affect. If 0, the activator is used.\nvelx, vely, velz: The desired velocity for the affected things.\nadd: If true, each affected actor's velocity is modified by the velx, vely\nand velz parameters, rather than replaced by them.\nsetbob: If true, the speed adjustment influences the bobbing of any concerned player actor."; + SetAirControl = "void SetAirControl(fixed amount)\nSets how well the player can move while in the air.\nThe default amount is 0.00390625."; + SetAirSupply = "bool SetAirSupply(int playernum, int tics)\nSets the amount of tics remaining in a player's air supply."; + SetAmmoCapacity = "void SetAmmoCapacity(str typename, int maxamount)\nSets the maximum amount of a type of ammo the player can carry."; + SetCameraToTexture = "void SetCameraToTexture(int cameratid, str texturename, int fov)\nBinds the named texture to the specified camera\n(which does not have to be an actual camera thing).\nThe texture used must be defined as a �cameratexture� in the ANIMDEFS lump."; + SetCeilingTrigger = "void SetCeilingTrigger(int tag, int height, int special[, int arg1[, int arg2[, int arg3[, int arg4[, int arg5]]]]])\nWhen the ceiling specified by tag moves the specified height,\nspecial(arg1, arg2, arg3, arg4, arg5) will be activated."; + SetCVar = "bool SetCVar(str cvar, int value)\nSets the value of a particular console variable.\nOnly mod-defined console variables through CVARINFO can be changed by using this function.\nReturns FALSE if cvar is invalid, or it is not writable."; + SetCVarString = "bool SetCVarString(str cvar, str value)\nSets the value of a particular console variable.\nOnly mod-defined console variables through CVARINFO can be changed by using this function.\nReturns FALSE if cvar is invalid, or it is not writable."; + SetDBEntry = "int SetDBEntry(table, variable, value)"; + SetDBEntryString = "void SetDBEntryString(str namespace, str key, str value)"; SetFloorTrigger = "SetFloorTrigger(tag, height, special, arg1, arg2, arg3, arg4, arg5)"; - SetFont = "SetFont(fontname)"; - SetGravity = "SetGravity(amount)"; - SetHudSize = "SetHudSize(width, height, statusbar)"; - SetLineBlocking = "SetLineBlocking(line, blocking)"; - SetLineMonsterBlocking = "SetLineMonsterBlocking(line, blocking)"; - SetLineSpecial = "SetLineSpecial(line, special, arg1, arg2, arg3, arg4, arg5)"; - SetLineTexture = "SetLineTexture(line, side, position, texture)"; - SetMarineSprite = "SetMarineSprite(tid, actorclass)"; - SetMarineWeapon = "SetMarineWeapon(tid, weapon)"; - SetMugShotState = "SetMugShotState(state)"; - SetMusic = "SetMusic(song, pattern, transition)"; + SetFont = "void SetFont(str fontlump)\nSets the current font (only within the script) to fontlump"; + SetGlobalFogParameter = "SetGlobalFogParameter(property, value)"; + SetGravity = "void SetGravity(fixed amount)\nThis function sets the global gravity of an entire level.\nDefault is 800.0"; + SetHUDClipRect = "void SetHUDClipRect(int x, int y, int width, int height[, int wrapwidth = 0])\nSets the clipping rectangle for future HUD messages."; + SetHudSize = "void SetHudSize(int width, int height, bool statusbar)\nCauses text messages to be stretched or shrunk to match the size\nthey would appear if the user's resolution was width by height."; + SetHUDWrapWidth = "void SetHudWrapWidth(int wrapwidth)\nSets the wrapping width for future HUD messages without altering the clipping rectangle.\nIf you set the wrapping width to 0, messages will wrap\nto the full width of the HUD, as normal."; + SetLineActivation = "void SetLineActivation(int lineid, int activation)\nSets the line activation flags of the line with the specified id.\nlineid: The id of the line of which to set the activation flags\nactivation: SPAC_ flags to set. Multiple flags can be set by using the pipe character | between the constant names."; + SetLineBlocking = "void SetLineBlocking(int lineid, int blocking)\nDEPRECATED!\nUse Line_SetBlocking instead!"; + SetLineMonsterBlocking = "void SetLineMonsterBlocking(int lineid, int setting)\nDEPRECATED!\nUse Line_SetBlocking instead!"; + SetLineSpecial = "void SetLineSpecial(int lineid, int special[, int arg0[, int arg1[, int arg2[, int arg3[, int arg4]]]]])\nSetLineSpecial will change the special on all lines with the line id number specified."; + SetLineTexture = "void SetLineTexture(int lineid, int line_side, int sidedef_texture, str texturename)\nSetLineTexture will change the specified texture on all lines with the line id number specified\nline_side: SIDE_ flags can be used.\nsidedef_texture: TEXTURE_ flags can be used.\ntexturename: the texture that will be set on the line. Use '-' to remove a texture."; + SetMarineSprite = "void SetMarineSprite(int tid, str actorclass)\nChanges a Scripted Marine's sprite to match the sprite\nused in the specified actor's spawn state."; + SetMarineWeapon = "void SetMarineWeapon(int tid, int weapon)\nSets a Scripted Marine's weapon on the fly.\nweapon: one of MARINEWEAPON_ flags"; + SetMugShotState = "void SetMugShotState(str state)\nSets the state of the mug shot in SBARINFO status bars.\nThe state you set will only be interrupted by damage or if the player\npicks up a weapon, provided the mugshot supports it."; + SetMusic = "void SetMusic(str song[, int order[, int unused]])"; + SetPlayerLivesLeft = "int SetPlayerLivesLeft(int player, int amount)"; SetPlayerProperty = "SetPlayerProperty(who, set, which)"; - SetResultValue = "SetResultValue(value)"; - SetSkyScrollSpeed = "SetSkyScrollSpeed(skynumber, speed)"; - SetThingSpecial = "SetThingSpecial(tid, special, arg1, arg2, arg3, arg4, arg5)"; - SetWeapon = "SetWeapon(weaponname)"; - sin = "sin(angle)"; - SinglePlayer = "SinglePlayer()"; - SoundSequence = "SoundSequence(name)"; - SoundSequenceOnActor = "SoundSequenceOnActor(tid, sndseq)"; - SoundSequenceOnSector = "SoundSequenceOnSector(tag, sndseq, location)"; - SoundSequenceOnPolyObj = "SoundSequenceOnPolyObj(tag, sndseq)"; - Spawn = "Spawn(type, x, y, z, thingid, angle)"; - SpawnProjectile = "SpawnProjectile(tid, type, angle, speed, vspeed, gravity, newtid)"; - SpawnSpot = "SpawnSpot(type, spotid, thingid, angle)"; - SpawnSpotFacing = "SpawnSpotFacing(type, spotid, thingid)"; + SetPointer = "bool SetPointer(int assign_slot, int tid[, int pointer_selector[, int flags]])\nSet the value of one of the caller's stored pointers."; + SetResultValue = "void SetResultValue(int value)"; + SetSkyScrollSpeed = "void SetSkyScrollSpeed(int sky, fixed skyspeed)\nChanges the scrolling speed of a sky.\nThis is useful in conjunction with ChangeSky.\nsky: either 1 or 2.\nskyspeed: the desired scrolling speed."; + SetThingSpecial = "void SetThingSpecial(int tid, int special[, int arg0[, int arg1[, int arg2[, int arg3[, int arg4]]]]])\nSets the special for any things with the same TID.\nThis is similar to Thing_SetSpecial, except it can only be used from ACS,\nand it can set all of a thing's special arguments.\nIf tid is 0, then the activator is used."; + SetUserArray = "void SetUserArray(int tid, str name, int pos, int value)\nSets one of the affected actor's user array-bound variables."; + SetUserCVar = "bool SetUserCVar(int playernumber, str cvar, int value)\nSets the console variable of a particular player.\nOnly mod-defined console variables through CVARINFO can be changed by using this function.\nReturns FALSE if cvar is invalid, it is not writable, or the player doesn't exist."; + SetUserCVarString = "bool SetUserCVarString(int playernumber, str cvar, str value)\nSets the console variable of a particular player.\nOnly mod-defined console variables through CVARINFO can be changed by using this function.\nReturns FALSE if cvar is invalid, it is not writable, or the player doesn't exist."; + SetUserVariable = "void SetUserVariable(int tid, str name, int value)\nSets one of the affected actor's user variables."; + SetWeapon = "bool SetWeapon(str weaponname)\nSets the player's current weapon to weaponname.\nReturns TRUE if the weapon was set successfully, and FALSE if not."; + Sin = "fixed Sin(int angle)"; + SortDBEntries = "int SortDBEntries(str namespace, int limit, int offset, bool order)"; + SoundSequence = "void SoundSequence(str sndseq)\nPlays a sound sequence defined in SNDSEQ lump."; + SoundSequenceOnActor = "void SoundSequenceOnActor(int tid, str sndseq)\nPlays a sound sequence defined in SNDSEQ lump."; + SoundSequenceOnPolyObj = "void SoundSequenceOnPolyobj(int polynum, str sndseq)\nPlays a sound sequence defined in SNDSEQ lump."; + SoundSequenceOnSector = "void SoundSequenceOnSector(int tag, str sndseq, int location)\nPlays a sound sequence defined in SNDSEQ lump."; + SoundVolume = "void SoundVolume(int tid, int channel, fixed volume)\nChanges the volume of the currently playing sound by the actor(s) with the specified tid.\nIf tid is 0, the sound volume change is done to the sound being played by the activator of the script."; + Spawn = "int Spawn(str classname, fixed x, fixed y, fixed z[, int tid[, int angle]])\nSpawns an actor at the given X, Y and Z coordinates.\nOptionally a TID and a byte angle can be specified."; + SpawnForced = "int SpawnForced(str classname, fixed x, fixed y, fixed z[, int tid[, int angle]])\nForces the actor to spawn, even in conditions where the spawning would normally fail.\nThe return value is the number of things spawned."; + SpawnDecal = "int SpawnDecal(int tid, str decalname, int flags[, fixed angle = 0.0[, fixed zoffset = 0.0[, fixed distance = 64.0]]])\nCreates a decal on a wall by tracing a line from the actor with the\nspecified tid until hitting said wall, on which the decal is then created.\nIf tid is 0, the tracing is done from the activator of the script.\ndecalname: The name of the decal to create, as defined in DECALDEF.\nflags: use SDF_ flags\nThe return value of the function is the number of decals spawned."; + SpawnProjectile = "void SpawnProjectile(int tid, str type, int angle, int speed, int vspeed, int gravity, int newtid)"; + SpawnSpot = "int SpawnSpot(str classname, int spottid[, int tid[, int angle]])\nRequires a MapSpot at the location where you want the Actor to spawn.\nThe return value is the number of things spawned."; + SpawnSpotFacing = "int SpawnSpotFacing(str classname, int spottid[, int tid])\nRequires a MapSpot at the location where you want the Actor to spawn.\nThe thing will assume the angle of the mapspot it is spawned to.\nThe return value is the number of things spawned."; + SpawnSpotFacingForced = "int SpawnSpotFacingForced(str classname, int spottid[, int tid])\nRequires a MapSpot at the location where you want the Actor to spawn.\nForces the actor to spawn, even in conditions where the spawning would normally fail.\nThe thing will assume the angle of the mapspot it is spawned to.\nThe return value is the number of things spawned."; + SpawnSpotForced = "int SpawnSpotForced(str classname, int spottid[, int tid[, int angle]])\nRequires a MapSpot at the location where you want the Actor to spawn.\nForces the actor to spawn, even in conditions where the spawning would normally fail.\nThe return value is the number of things spawned."; Special = "Special"; + Sqrt = "int Sqrt(int number)"; Stairs_BuildDown = "Stairs_BuildDown(tag, speed, height, delay, reset)"; Stairs_BuildDownSync = "Stairs_BuildDownSync(tag, speed, height, reset)"; Stairs_BuildUp = "Stairs_BuildUp(tag, speed, height, delay, reset)"; Stairs_BuildUpDoom = "Stairs_BuildUpDoom(tag, speed, height, delay, reset)"; Stairs_BuildUpSync = "Stairs_BuildUpSync(tag, speed, height, reset)"; - StartConversation = "StartConversation(tid, facing)"; - Str = "Str expression"; - strlen = "strlen(string)"; - Suspend = "Suspend"; - Switch = "Switch(expression)"; - TagWait = "TagWait(tag)"; - TakeActorInventory = "TakeActorInventory(tid, type, amount)"; - TakeInventory = "TakeInventory(type, amount)"; - Team_GivePoints = "Team_GivePoints(team, amount, announce)"; - Team_Score = "Team_Score(amount, nogrin)"; + StartConversation = "StartConversation(talker_tid, facetalker)"; + StopSound = "void StopSound(int tid, int channel)\nStops the sound currently playing on the specified channel for the actor with matching tid"; + StrCmp = "int StrCmp(str string1, str string2[, int maxcomparenum])\nCompares the two strings passed in arguments string1 and string2 character by character.\nIf maxcomparenum is specified, it only compares up to maxcomparenum characters of each string."; + StrCpy = "bool StrCpy(a:destination, str source[, int source_index])\nCopy a source string to a destination array as a series of characters.\nOptionally, the copy can start from a given index in the source string.\nReturns TRUE if the entire string (or substring) was successfully copied to the array;\nFALSE if the copy ran out of room or if a negative source_index was given."; + Strftime = "str Strftime(int timestamp, str format[, bool utc])"; + StrIcmp = "int StrCmp(str string1, str string2[, int maxcomparenum])\nStrIcmp is case-insensitive version of StrCmp"; + StrLeft = "str StrLeft(str string, int length)\nCreates a new string containing the length first characters of string.\nIf string does not exist, an empty string is returned.\nIf string is shorter than length characters, the entire string is returned."; + StrLen = "int StrLen(str string)"; + StrMid = "str StrMid(str string, int start, int length)\nCreates a new string containing the length characters of string starting from the one at position start.\nIf string does not exist or is shorter than start characters, an empty string is returned. \nIf string is shorter than start + length characters, the entire substring beginning at start is returned."; + StrParam = "int StrParam(type:expression)\nStrParam will create a new string formatted based upon the same method for Print or Log.\nThe return value is the string table index of the new string."; + StrRight = "str StrRight(str string, int length)\nCreates a new string containing the length last characters of string.\nIf string does not exist, an empty string is returned.\nIf string is shorter than length characters, the entire string is returned."; + SystemTime = "int SystemTime()"; + TagWait = "void TagWait(int tag)"; + TakeActorInventory = "void TakeActorInventory(int tid, str inventory_item, int amount)\nThis function will take the amount of items from the specified actor.\nTakeActorInventory can remove items that are flagged as undroppable."; + TakeInventory = "void TakeInventory(str inventory_item, int amount)\nThis function will take the number of items specified from the activator.\nTakeInventory can remove items that are flagged as undroppable."; Teleport = "Teleport(tid, tag, nosourcefog)"; Teleport_EndGame = "Teleport_EndGame()"; - Teleport_Line = "Teleport_Line(thisid, destid, flip)"; - Teleport_NewMap = "Teleport_NewMap(map, pos)"; - Teleport_NoFog = "Teleport_NoFog(tid)"; - Teleport_NoStop = "Teleport_NoStop(tid, sector, nofog)"; + Teleport_NewMap = "Teleport_NewMap(map, pos, face)"; + Teleport_NoFog = "Teleport_NoFog(tid, useangle, tag)"; + Teleport_NoStop = "Teleport_NoStop(tid, tag, nofog)"; Teleport_ZombieChanger = "Teleport_ZombieChanger(tid, tag)"; TeleportGroup = "TeleportGroup(groupid, sourceid, destinationid, movesource, fog)"; TeleportInSector = "TeleportInSector(tag, sourceid, destinationid, fog, groupid)"; TeleportOther = "TeleportOther(tid, destinationid, fog)"; - Terminate = "Terminate"; Thing_Activate = "Thing_Activate(tid)"; Thing_ChangeTID = "Thing_ChangeTID(oldtid, newtid)"; Thing_Damage = "Thing_Damage(tid, amount, mod)"; - Thing_Damage2 = "Thing_Damage2(tid, amount, type)"; + Thing_Damage2 = "int Thing_Damage2(int tid, int amount, str type)\nDamages the specified actor.\nDamage type is specified by name."; Thing_Deactivate = "Thing_Deactivate(tid)"; - Thing_Destroy = "Thing_Destroy(tid, extreme)"; + Thing_Destroy = "Thing_Destroy(tid, extreme, tag)"; Thing_Hate = "Thing_Hate(hater, hatee, type)"; Thing_Move = "Thing_Move(tid, destid, nofog)"; Thing_Projectile = "Thing_Projectile(tid, type, angle, speed, vspeed)"; - Thing_Projectile2 = "Thing_Projectile2(tid, type, angle, speed, vspeed, gravity, newtid)"; + Thing_Projectile2 = "void Thing_Projectile2(int tid, int type, int angle, int speed, int vspeed, int gravity, int newtid)"; Thing_ProjectileAimed = "Thing_ProjectileAimed(tid, type, speed, target, newtid)"; Thing_ProjectileGravity = "Thing_ProjectileGravity(tid, type, angle, speed, vspeed)"; Thing_ProjectileIntercept = "Thing_ProjectileIntercept(tid, type, speed, target, newtid)"; Thing_Raise = "Thing_Raise(tid)"; Thing_Remove = "Thing_Remove(tid)"; - Thing_SetFrame = "Thing_SetFrame(tid, frame)"; - Thing_SetGoal = "Thing_SetGoal(tid, goal, delay, ignore)"; + Thing_SetConversation = "Thing_SetConversation(tid, conversationid)"; + Thing_SetGoal = "Thing_SetGoal(tid, goal, delay, dontchasetarget)"; Thing_SetSpecial = "Thing_SetSpecial(tid, special, arg1, arg2, arg3)"; Thing_SetTranslation = "Thing_SetTranslation(tid, translation)"; Thing_Spawn = "Thing_Spawn(tid, type, angle, newtid)"; Thing_SpawnFacing = "Thing_SpawnFacing(tid, type, nofog, newtid)"; Thing_SpawnNoFog = "Thing_SpawnNoFog(tid, type, angle, newtid)"; Thing_Stop = "Thing_Stop(tid)"; - ThingCount = "ThingCount(type, id)"; - ThingCountName = "ThingCountName(type, tid)"; - ThingCountNameSector = "ThingCountNameSector(class, tid, tag)"; - ThingCountSector = "ThingCountSector(type, tid, tag)"; - ThingSound = "ThingSound(thingid, name, volume)"; - ThrustThing = "ThrustThing(angle, force, limit, tid)"; - ThrustThingZ = "ThrustThingZ(tid, speed, upordown, addorset)"; - Timer = "Timer()"; - Transfer_Heights = "Transfer_Heights(tag, flags)"; - Transfer_WallLight = "Transfer_WallLight(lineid, flags)"; - Transfer_CeilingLight = "Transfer_CeilingLight(tag)"; - Transfer_FloorLight = "Transfer_FloorLight(tag)"; - TranslucentLine = "TranslucentLine(lineid, amount, additive)"; - Unloading = "Script expression Unloading"; - UnmorphActor = "UnmorphActor(tid, force)"; - Until = "Until(expression)"; - UsePuzzleItem = "UsePuzzleItem(item, script)"; - UseActorInventory = "UseActorInventory(tid, item)"; - VectorAngle = "VectorAngle(x, y)"; - Void = "Void"; - While = "While(expression)"; - World = "World Int expression:identifier"; + ThingCount = "int ThingCount(int type, int tid)"; + ThingCountName = "int ThingCountName(str classname, int tid)"; + ThingCountNameSector = "int ThingCountNameSector(str classname, int tid, int tag)"; + ThingCountSector = "int ThingCountSector(int type, int tid, int tag)"; + ThingSound = "void ThingSound(int tid, str sound, int volume)\nPlays a sound at a thing.\nThis is a point sound, so anyone far away will not hear it as loudly"; + ThrustThing = "ThrustThing(angle, force, nolimit, tid)"; + ThrustThingZ = "ThrustThingZ(tid, speed, up_or_down, add_or_set)"; + Timer = "int Timer()"; + TranslucentLine = "TranslucentLine(lineid, amount, additive, moreflags)"; + UniqueTID = "int UniqueTID([int tid[, int limit]])"; + UnMorphActor = "int UnMorphActor(int tid[, bool force])"; + UseActorInventory = "int UseActorInventory(int tid, str classname)\nForces the actor(s) with the specified tid to use an item from their inventory, if they have one.\nReturns TRUE if the item was used successfully."; + UseInventory = "int UseInventory(str classname)\nForces the activator to use the specified inventory item, if he has it.\nReturns TRUE if the item was used successfully."; + UsePuzzleItem = "UsePuzzleItem(item, script, arg1, arg2, arg3)"; + VectorAngle = "fixed VectorAngle(int x, int y)"; + VectorLength = "int VectorLength(int x, int y)"; + //WHITERETURN = "Script expression WhiteReturn"; +} + +properties +{ + bool; + break; + case; + CLIENTSIDE; + const; + continue; + DEATH; + default; + DISCONNECT; + do; + else; + ENTER; + EVENT; + for; + function; + global; + if; + int; + LIGHTNING; + NET; + OPEN; + PICKUP; + RESPAWN; + Restart; + return; + script; + str; + Suspend; + switch; + Terminate; + UNLOADING; + until; + void; + while; + world; } constants { - TRUE; - FALSE; - ON; - OFF; - YES; - NO; - CARRY; - SCROLL; - SCROLL_AND_CARRY; - ACTOR_NONE; - ACTOR_WORLD; - ACTOR_PLAYER; - ACTOR_BOT; - ACTOR_VOODOODOLL; - ACTOR_MONSTER; + AAPTR_DEFAULT; + AAPTR_FRIENDPLAYER; + AAPTR_MASTER; + AAPTR_NULL; + AAPTR_PLAYER_GETCONVERSATION; + AAPTR_PLAYER_GETTARGET; + AAPTR_PLAYER1; + AAPTR_PLAYER2; + AAPTR_PLAYER3; + AAPTR_PLAYER4; + AAPTR_PLAYER5; + AAPTR_PLAYER6; + AAPTR_PLAYER7; + AAPTR_PLAYER8; + AAPTR_TARGET; + AAPTR_TRACER; ACTOR_ALIVE; + ACTOR_BOT; ACTOR_DEAD; - ACTOR_MISSILE; ACTOR_GENERIC; + ACTOR_MISSILE; + ACTOR_MONSTER; + ACTOR_NONE; + ACTOR_PLAYER; + ACTOR_VOODOODOLL; + ACTOR_WORLD; + APROP_Accuracy; APROP_ActiveSound; APROP_Alpha; APROP_Ambush; - APROP_AttackSoun; + APROP_AttackSound; + APROP_AttackZOffset; APROP_ChaseGoal; APROP_Damage; + APROP_DamageFactor; APROP_DeathSound; + APROP_Dormant; APROP_Dropped; APROP_Friendly; APROP_Frightened; APROP_Gravity; APROP_Health; + APROP_Height; APROP_Invulnerable; APROP_JumpZ; + APROP_Mass; + APROP_MasterTID; + APROP_MeleeRange; + APROP_Nametag; APROP_Notarget; + APROP_Notrigger; APROP_PainSound; + APROP_Radius; + APROP_Reactiontime; APROP_RenderStyle; + APROP_ScaleX; + APROP_ScaleY; + APROP_Score; APROP_SeeSound; APROP_SpawnHealth; + APROP_Species; APROP_Speed; + APROP_Stamina; + APROP_StencilColor; + APROP_TargetTID; + APROP_TracerTID; + APROP_ViewHeight; + APROP_Waterlevel; + ATTN_IDLE; + ATTN_NONE; + ATTN_NORM; + ATTN_STATIC; BLOCK_CREATURES; BLOCK_EVERYTHING; BLOCK_NOTHING; BLOCK_PLAYERS; + BLOCK_RAILING; + BLOCKF_CREATURES; + BLOCKF_EVERYTHING; + BLOCKF_FLOATERS; + BLOCKF_HITSCAN; BLOCKF_MONSTERS; BLOCKF_PLAYERS; - BLOCKF_FLOATERS; BLOCKF_PROJECTILES; - BLOCKF_EVERYTHING; BLOCKF_RAILING; + BLOCKF_SIGHT; BLOCKF_USE; BT_ALTATTACK; BT_ATTACK; @@ -506,17 +640,36 @@ constants BT_USER3; BT_USER4; BT_ZOOM; + CARRY; + CHAN_AUTO; + CHAN_BODY; + CHAN_ITEM; + CHAN_LISTENERZ; + CHAN_MAYBE_LOCAL; + CHAN_NOPAUSE; + CHAN_UI; + CHAN_VOICE; + CHAN_WEAPON; + CHANGELEVEL_CHANGESKILL; + CHANGELEVEL_KEEPFACING; + CHANGELEVEL_NOINTERMISSION; + CHANGELEVEL_NOMONSTERS; + CHANGELEVEL_PRERAISEWEAPON; + CHANGELEVEL_RESETHEALTH; + CHANGELEVEL_RESETINVENTORY; CLASS_CLERIC; CLASS_FIGHTER; CLASS_MAGE; - CR_BLACK; + CR_BLACK; CR_BLUE; CR_BRICK; CR_BROWN; CR_CREAM; + CR_CYAN; CR_DARKBROWN; - CR_DARKGRAY; + CR_DARKGRAY; CR_DARKGREEN; + CR_DARKGREY; CR_DARKRED; CR_GOLD; CR_GRAY; @@ -531,33 +684,114 @@ constants CR_UNTRANSLATED; CR_WHITE; CR_YELLOW; + CSF_NOBLOCKALL; + CSF_NOFAKEFLOORS; DAMAGE_IN_AIR; DAMAGE_NONPLAYERS; DAMAGE_PLAYERS; DAMAGE_SUBCLASSES_PROTECT; + DB_ORDER_ASC; + DB_ORDER_DESC; + EV_Char; + EV_KeyDown; + EV_KeyRepeat; + EV_KeyUp; + EV_LButtonDblClick; + EV_LButtonDown; + EV_LButtonUp; + EV_MButtonDblClick; + EV_MButtonDown; + EV_MButtonUp; + EV_MouseMove; + EV_RButtonDblClick; + EV_RButtonDown; + EV_RButtonUp; + EV_WheelDown; + EV_WheelUp; + FALSE; + FHF_NORANDOMPUFFZ; + FOGP_DENSITY; + FOGP_OUTSIDEDENSITY; + FOGP_SKYFOG; + GAMESTATE_COUNTDOWN; + GAMESTATE_INPROGRESS; + GAMESTATE_INRESULTSEQUENCE; + GAMESTATE_UNSPECIFIED; + GAMESTATE_WAITFORPLAYERS; GAME_NET_COOPERATIVE; GAME_NET_DEATHMATCH; GAME_NET_TEAMGAME; GAME_SINGLE_PLAYER; + GAME_TITLE_MAP; + GK_ALERT; + GK_BACKSPACE; + GK_CESCAPE; + GK_DEL; + GK_DOWN; + GK_END; + GK_ESCAPE; + GK_F1; + GK_F10; + GK_F11; + GK_F12; + GK_F2; + GK_F3; + GK_F4; + GK_F5; + GK_F6; + GK_F7; + GK_F8; + GK_F9; + GK_FORMFEED; + GK_FREE1; + GK_FREE2; + GK_FREE3; + GK_HOME; + GK_LEFT; + GK_LINEFEED; + GK_PGDN; + GK_PGUP; + GK_RETURN; + GK_RIGHT; + GK_TAB; + GK_UP; + GK_VTAB; + GKM_ALT; + GKM_CTRL; + GKM_LBUTTON; + GKM_MBUTTON; + GKM_RBUTTON; + GKM_SHIFT; + HUDMSG_ADDBLEND; + HUDMSG_ALPHA; HUDMSG_COLORSTRING; HUDMSG_FADEINOUT; HUDMSG_FADEOUT; + HUDMSG_LAYER_OVERHUD; + HUDMSG_LAYER_OVERMAP; + HUDMSG_LAYER_UNDERHUD; HUDMSG_LOG; + HUDMSG_NOTWITH3DVIEW; + HUDMSG_NOTWITHFULLMAP; + HUDMSG_NOTWITHOVERLAYMAP; + HUDMSG_NOWRAP; HUDMSG_PLAIN; HUDMSG_TYPEON; - IS_COUNTDOWN; - IS_FIRSTCOUNTDOWN; - IS_INPROGRESS; - IS_WAITINGFORPLAYERS; - IS_WAVECOMPLETE; INPUT_BUTTONS; INPUT_FORWARDMOVE; INPUT_OLDBUTTONS; INPUT_PITCH; - INPUT_ROW; + INPUT_ROLL; INPUT_SIDEMOVE; INPUT_UPMOVE; INPUT_YAW; + IS_BOSSFIGHT; + IS_COUNTDOWN; + IS_FIRSTCOUNTDOWN; + IS_INPROGRESS; + IS_MISSIONFAILED; + IS_WAITINGFORPLAYERS; + IS_WAVECOMPLETE; LEVELINFO_CLUSTERNUM; LEVELINFO_FOUND_ITEMS; LEVELINFO_FOUND_SECRETS; @@ -570,34 +804,35 @@ constants LEVELINFO_TOTAL_SECRETS; LINE_BACK; LINE_FRONT; - MARINEWEAPON_BerserkFis; + MARINEWEAPON_BerserkFist; MARINEWEAPON_BFG; MARINEWEAPON_Chaingun; MARINEWEAPON_Chainsaw; MARINEWEAPON_Dummy; MARINEWEAPON_Fist; MARINEWEAPON_Pistol; - MARINEWEAPON_PlasmaRifl; + MARINEWEAPON_PlasmaRifle; MARINEWEAPON_Railgun; - MARINEWEAPON_RocketLaunche; + MARINEWEAPON_RocketLauncher; MARINEWEAPON_Shotgun; - MARINEWEAPON_SuperShotgu; + MARINEWEAPON_SuperShotgun; MOD_BARREL; MOD_BFG_BOOM; MOD_BFG_SPLASH; - MOD_CHAINGUN; MOD_CHAINSAW; MOD_CRUSH; + MOD_DISINTEGRATE; + MOD_ELECTRIC; MOD_EXIT; MOD_FALLING; - MOD_FIST; MOD_HIT; + MOD_ICE; MOD_LAVA; - MOD_PISTOL; MOD_PLASMARIFLE; + MOD_POISON; MOD_R_SPLASH; + MOD_RAILGUN; MOD_ROCKET; - MOD_SHOTGUN; MOD_SLIME; MOD_SPLASH; MOD_SSHOTGUN; @@ -609,7 +844,7 @@ constants MODINPUT_FORWARDMOVE; MODINPUT_OLDBUTTONS; MODINPUT_PITCH; - MODINPUT_ROW; + MODINPUT_ROLL; MODINPUT_SIDEMOVE; MODINPUT_UPMOVE; MODINPUT_YAW; @@ -617,25 +852,72 @@ constants MOVIE_Played; MOVIE_Played_Aborted; MOVIE_Played_NoVideo; + MRF_ADDSTAMINA; + MRF_FAILNOLAUGH; + MRF_FAILNOTELEFRAG; + MRF_FULLHEALTH; + MRF_LOSEACTUALWEAPON; + MRF_NEWTIDBEHAVIOUR; + MRF_OLDEFFECTS; + MRF_UNDOBYCHAOSDEVICE; + MRF_UNDOBYDEATH; + MRF_UNDOBYDEATHFORCED; + MRF_UNDOBYDEATHSAVES; + MRF_UNDOBYTOMEOFPOWER; + MRF_WHENINVULNERABLE; + NO; + NO_CHANGE; NO_TEAM; NOT_BOTTOM; NOT_CEILING; NOT_FLOOR; NOT_MIDDLE; NOT_TOP; + OFF; + ON; PLAYERINFO_AIMDIST; PLAYERINFO_COLOR; + PLAYERINFO_DESIREDFOV; + PLAYERINFO_FOV; PLAYERINFO_GENDER; PLAYERINFO_MOVEBOB; PLAYERINFO_NEVERSWITCH; PLAYERINFO_PLAYERCLASS; PLAYERINFO_STILLBOB; PLAYERINFO_TEAM; + PRINTNAME_LEVEL; + PRINTNAME_LEVELNAME; + PRINTNAME_SKILL; + PROP_ALLMAP; + PROP_BUDDHA; + PROP_FLIGHT; PROP_FLY; PROP_FROZEN; + PROP_INFRARED; PROP_INSTANTWEAPONSWITCH; + PROP_INVISIBILITY; + PROP_INVULNERABILITY; PROP_NOTARGET; + PROP_RADIATIONSUIT; + PROP_SPEED; + PROP_STRENGTH; PROP_TOTALLYFROZEN; + PROP_WEAPONLEVEL2; + PTROP_NOSAFEGUARDS; + PTROP_UNSAFEMASTER; + PTROP_UNSAFETARGET; + SCROLL; + SCROLL_AND_CARRY; + SDF_ABSANGLE; + SDF_PERMANENT; + SECF_FLOORDROP; + SECF_NOFALLINGDAMAGE; + SECF_NORESPAWN; + SECF_SILENT; + SECSEQ_CEILING; + SECSEQ_FLOOR; + SECSEQ_FULLHEIGHT; + SECSEQ_INTERIOR; SIDE_BACK; SIDE_FRONT; SKILL_EASY; @@ -643,13 +925,40 @@ constants SKILL_NORMAL; SKILL_VERY_EASY; SKILL_VERY_HARD; + SOUND_Active; + SOUND_Attack; + SOUND_Bounce; + SOUND_CrushPain; + SOUND_Death; + SOUND_Howl; + SOUND_Pain; + SOUND_See; + SOUND_Use; + SOUND_WallBounce; + SPAC_AnyCross; + SPAC_Cross; + SPAC_Impact; + SPAC_MCross; + SPAC_MPush; + SPAC_MUse; + SPAC_None; + SPAC_PCross; + SPAC_Push; + SPAC_Use; + SPAC_UseBack; + SPAC_UseThrough; STYLE_Add; STYLE_Fuzzy; STYLE_None; STYLE_Normal; STYLE_OptFuzzy; + STYLE_Shaded; + STYLE_Shadow; STYLE_SoulTrans; + STYLE_Stencil; + STYLE_Subtract; STYLE_Translucent; + STYLE_TranslucentStencil; T_ABADDON; T_ABADDONSHOT; T_AMMOBOX; @@ -657,14 +966,12 @@ constants T_ANTIGRAVBELT; T_ARACHNOTRON; T_ARACHNOTRONPLASMA; - T_ARCHSTATUE; T_ARMORBONUS; T_ARROW; T_AXEKEY; T_BACKPACK; T_BARON; T_BARONBALL; - T_BARONSTATUE; T_BARREL; T_BATTERY; T_BEAST; @@ -689,7 +996,6 @@ constants T_BLUEKEYCARD; T_BLUESKULLKEY; T_BLUETELEGLITTER; - T_BOBBINGSKULLINFLAMES; T_BOUNCYMACEBALL; T_BRAINS; T_BRIDGE; @@ -717,17 +1023,14 @@ constants T_CROSSBOWMINIBLAST; T_CROSSBOWPOWERBLAST; T_CYBERDEMON; - T_CYBERDEMONSTATUE; T_DARKIMP; T_DARKIMPFIREBALL; T_DART; - T_DEADCYBERDEMON; T_DEATHBALL; T_DEMON; T_DEMON_MASH; T_DEMON1; T_DEMON2_MASH; - T_DEMONSTATUE; T_DIRT1; T_DIRT2; T_DIRT3; @@ -761,13 +1064,10 @@ constants T_FLESH_DRIP1; T_FLESH_DRIP2; T_GAUNTLETS; - T_GOTHICPILLAR; T_GREENARMOR; T_GREENKEY; T_GRENADE; T_GRENADELAUNCHER; - T_GREYPILLARHEART; - T_GREYSTALAGMITE; T_GUTS; T_HASTE; T_HEALTHBONUS; @@ -780,20 +1080,13 @@ constants T_HEFTYSKULLRODAMMO; T_HEFTYWANDAMMO; T_HELLKNIGHT; - T_HELLPILLAR; T_HIGHJUMP; - T_HISSY; T_HORNKEY; T_ICEGOLEM; T_ICESHARD; T_IMP; - T_IMPALINGSPIKE; - T_IMPALINGSPIKECGUN; - T_IMPALINGSPIKEZOMB; T_IMPFIREBALL; - T_IMPHEAD; T_IMPLEADER; - T_IMPSTATUE; T_INFRAGOGGLES; T_INFRATRACKER; T_INVISIBILITY; @@ -814,6 +1107,7 @@ constants T_ITEMHEALTHPOTION; T_ITEMINVISIBILITY; T_ITEMINVULNERABILITY; + T_ITEMPORK; T_ITEMREPULSION; T_ITEMSUMMON; T_ITEMTELEPORT; @@ -825,7 +1119,6 @@ constants T_KNIGHTAXE; T_KNIGHTBLOODAXE; T_KNIGHTGHOST; - T_LABORTORYPILLAR; T_LIGHTAMP; T_LOSTSOUL; T_MACE; @@ -839,14 +1132,12 @@ constants T_MANA3; T_MANCUBUS; T_MANCUBUSSHOT; - T_MASARMORBONUS; - T_MASSMOUTHSTATUE; + T_MAXARMORBONUS; T_MAXHEALTHBONUS; T_MEDKIT; T_MEGASPHERE; T_MESHARMOR; T_METALKEY; - T_MILITARYPILLAR; T_MINIGUN; T_MORPHBLAST; T_MUMMY; @@ -893,7 +1184,6 @@ constants T_REGENERATION; T_RESISTANCE; T_REVENANT; - T_REVENANTHAND; T_RIPPER; T_RIPPERBALL; T_ROCK1; @@ -904,8 +1194,6 @@ constants T_ROCKETBOX; T_ROCKETLAUNCHER; T_RUSTYKEY; - T_SAUSAGEHEAD; - T_SAUSAGESPITTER; T_SCRIPTEDMARINE; T_SERPENTFIREBALL; T_SERPENTKEY; @@ -913,7 +1201,6 @@ constants T_SHELLS; T_SHIELD1; T_SHIELD2; - T_SHORTGREYPILLAR; T_SHOTGUN; T_SHOTGUY; T_SILVERKEY; @@ -941,7 +1228,6 @@ constants T_STAINEDGLASS7; T_STAINEDGLASS8; T_STAINEDGLASS9; - T_STARBASEPILLAR; T_STEALTHARACHNOTRON; T_STEALTHBARON; T_STEALTHCACODEMON; @@ -957,8 +1243,6 @@ constants T_STIMPACK; T_STRENGTH; T_SUPERSHOTGUN; - T_TALLGOTHICPILLAR; - T_TALLGREYPILLAR; T_TEMPLARGEFLAME; T_TEMPSMALLFLAME; T_THRUSTSPIKEDOWN; @@ -993,7 +1277,38 @@ constants T_ZOMBIE; TEAM_BLUE; TEAM_RED; + TEXFLAG_ADDOFFSET; + TEXFLAG_BOTTOM; + TEXFLAG_MIDDLE; + TEXFLAG_TOP; TEXTURE_BOTTOM; TEXTURE_MIDDLE; TEXTURE_TOP; -} + TM_SECOND; + TM_MINUTE; + TM_HOUR; + TM_DAY; + TM_MONTH; + TM_YEAR; + TM_WEEKDAY; + TPROP_Assister; + TPROP_Carrier; + TPROP_DeathCount; + TPROP_FragCount; + TPROP_IsValid; + TPROP_LoserTheme; + TPROP_Name; + TPROP_NumLivePlayers; + TPROP_NumPlayers; + TPROP_PlayerStartNum; + TPROP_PointCount; + TPROP_ReturnTics; + TPROP_Score; + TPROP_Spread; + TPROP_TeamItem; + TPROP_TextColor; + TPROP_WinCount; + TPROP_WinnerTheme; + TRUE; + YES; +} \ No newline at end of file diff --git a/Source/Core/GZBuilder/Data/MapInfo.cs b/Source/Core/GZBuilder/Data/MapInfo.cs index 0b404c10..a4cc03e4 100644 --- a/Source/Core/GZBuilder/Data/MapInfo.cs +++ b/Source/Core/GZBuilder/Data/MapInfo.cs @@ -8,6 +8,21 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data { public sealed class MapInfo { + #region ================== Enums + + public enum GZDoomLightMode + { + STANDARD, + BRIGHT, + DOOM, + DARK, + LEGACY, + SOFTWARE, + UNDEFINED + } + + #endregion + #region ================== Variables private bool isdefined; @@ -27,6 +42,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data private bool evenlighting; private bool smoothlighting; + private GZDoomLightMode lightmode; private int vertwallshade; private int horizwallshade; @@ -51,6 +67,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data public bool EvenLighting { get { return evenlighting; } internal set { evenlighting = value; isdefined = true; } } public bool SmoothLighting { get { return smoothlighting; } internal set { smoothlighting = value; isdefined = true; } } + public GZDoomLightMode LightMode { get { return lightmode; } internal set { lightmode = value; isdefined = true; } } public int VertWallShade { get { return vertwallshade; } internal set { vertwallshade = value; isdefined = true; } } public int HorizWallShade { get { return horizwallshade; } internal set { horizwallshade = value; isdefined = true; } } @@ -64,6 +81,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Data horizwallshade = -16; fogdensity = 255; outsidefogdensity = 255; + lightmode = GZDoomLightMode.UNDEFINED; } #endregion diff --git a/Source/Core/Rendering/Renderer.cs b/Source/Core/Rendering/Renderer.cs index 9a2f85bb..b2fd83c4 100644 --- a/Source/Core/Rendering/Renderer.cs +++ b/Source/Core/Rendering/Renderer.cs @@ -17,6 +17,7 @@ #region ================== Namespaces using System; +using CodeImp.DoomBuilder.GZBuilder.Data; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Geometry; @@ -89,7 +90,16 @@ namespace CodeImp.DoomBuilder.Rendering public int CalculateBrightness(int level) { // Simulate doom light levels - if((level < 192) && General.Map.Config.DoomLightLevels) + bool usedoomlightlevels = General.Map.Config.DoomLightLevels; //mxd + + //mxd. Very limited LightMode support... + switch(General.Map.Data.MapInfo.LightMode) + { + case MapInfo.GZDoomLightMode.DOOM: usedoomlightlevels = true; break; + case MapInfo.GZDoomLightMode.STANDARD: usedoomlightlevels = false; break; + } + + if(level < 192 && usedoomlightlevels) level = (int)(192.0f - (192 - level) * 1.5f); byte blevel = (byte)General.Clamp(level, 0, 255); diff --git a/Source/Core/ZDoom/MapinfoParser.cs b/Source/Core/ZDoom/MapinfoParser.cs index 74a2a673..7d6ddb99 100644 --- a/Source/Core/ZDoom/MapinfoParser.cs +++ b/Source/Core/ZDoom/MapinfoParser.cs @@ -464,6 +464,10 @@ namespace CodeImp.DoomBuilder.ZDoom mapinfo.SmoothLighting = true; break; + case "lightmode": + if(!ParseLightMode()) return false; + break; + case "}": return true; // Block end case "{": // Skip inner blocks @@ -652,16 +656,11 @@ namespace CodeImp.DoomBuilder.ZDoom private bool ParseFogDensity(string densitytype) { + SkipWhitespace(true); + if(!NextTokenIs("=")) return false; // New format only SkipWhitespace(true); string token = ReadToken(); - // New format - if(token == "=") - { - SkipWhitespace(true); - token = ReadToken(); - } - int val; if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out val)) { @@ -670,7 +669,6 @@ namespace CodeImp.DoomBuilder.ZDoom return false; } - val = Math.Max(0, val); if(densitytype == "fogdensity") mapinfo.FogDensity = val; else mapinfo.OutsideFogDensity = val; @@ -678,6 +676,28 @@ namespace CodeImp.DoomBuilder.ZDoom return true; } + private bool ParseLightMode() + { + SkipWhitespace(true); + if(!NextTokenIs("=")) return false; // New format only + SkipWhitespace(true); + string token = ReadToken(); + + int val; + if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out val)) + { + // Not numeric! + ReportError("Expected LightMode value, but got \"" + token + "\""); + return false; + } + + // Store + mapinfo.LightMode = (MapInfo.GZDoomLightMode)val; + + // All done here + return true; + } + #endregion }