From 571d28281bf2d41ad534eaed302fb9588c17f557 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 11 May 2009 21:05:40 +0000 Subject: [PATCH] - Added handling for UDMF user keys. - Added support for ACS functions that can be defined without recompiling ACC. - Fixed: The short lump name for embedded files must be cleared so that they are not found by a normal lump search. - Added AProp_Notarget actor property. - Fixed: TraceBleed was missing a NULL pointer check, - Fixed: P_RandomChaseDir could crash for friendly monsters that belong to a player which left the game. - Changed A_PodGrow so that it plays the generator's attack sound instead of "misc/podgrow". SVN r1575 (trunk) --- docs/README.Carmack | 283 ------- docs/classes.txt | 303 -------- docs/colors.txt | 756 ------------------- docs/rh-log.txt | 14 + src/g_heretic/a_hereticmisc.cpp | 2 +- src/p_acs.cpp | 97 +++ src/p_acs.h | 5 + src/p_enemy.cpp | 96 +-- src/p_map.cpp | 11 +- src/p_saveg.cpp | 2 + src/p_setup.cpp | 3 + src/p_setup.h | 3 + src/p_udmf.cpp | 383 +++++++--- src/r_defs.h | 65 ++ src/resourcefiles/resourcefile.cpp | 9 + wadsrc/static/actors/heretic/hereticmisc.txt | 1 + 16 files changed, 540 insertions(+), 1493 deletions(-) delete mode 100644 docs/README.Carmack delete mode 100644 docs/classes.txt delete mode 100644 docs/colors.txt diff --git a/docs/README.Carmack b/docs/README.Carmack deleted file mode 100644 index cabddef7d..000000000 --- a/docs/README.Carmack +++ /dev/null @@ -1,283 +0,0 @@ - -README - DOOM assembly code - -Okay, I add the DOS assembly module for the historically -inclined here (may rec.games.programmer suffer). If anyone -feels the urge to port these to GNU GCC; either inline or -as separate modules including Makefile support, be my guest. - -Module tmap.S includes the inner loops for texture mapping, -the interesting one being the floor/ceiling span rendering. - -There was another module in the source dump, fpfunc.S, that -had both texture mapping and fixed point functions. It -contained implementations both for i386 and M68k. For -brevity, I include only the i386 fixed point stuff below. - -//==================================================== -// tmap.S as of January 10th, 1997 - -//================ -// -// R_DrawColumn -// -//================ - - .data -loopcount .long 0 -pixelcount .long 0 - - .text - - .align 16 -.globl _R_DrawColumn -_R_DrawColumn: - - pushad - - movl ebp,[_dc_yl] - movl ebx,ebp - movl edi,[_ylookup+ebx*4] - movl ebx,[_dc_x] - addl edi,[_columnofs + ebx*4] - - movl eax,[_dc_yh] - incl eax - subl eax,ebp // pixel count - movl [pixelcount],eax // save for final pixel - js done // nothing to scale - shrl eax,1 // double pixel count - movl [loopcount],eax - - movl ecx,[_dc_iscale] - - movl eax,[_centery] - subl eax,ebp - imull ecx - movl ebp,[_dc_texturemid] - subl ebp,eax - shll ebp,9 // 7 significant bits, 25 frac - - movl esi,[_dc_source] - - - movl ebx,[_dc_iscale] - shll ebx,9 - movl eax,OFFSET patch1+2 // convice tasm to modify code... - movl [eax],ebx - movl eax,OFFSET patch2+2 // convice tasm to modify code... - movl [eax],ebx - -// eax aligned colormap -// ebx aligned colormap -// ecx,edx scratch -// esi virtual source -// edi moving destination pointer -// ebp frac - - movl ecx,ebp // begin calculating first pixel - addl ebp,ebx // advance frac pointer - shrl ecx,25 // finish calculation for first pixel - movl edx,ebp // begin calculating second pixel - addl ebp,ebx // advance frac pointer - shrl edx,25 // finish calculation for second pixel - movl eax,[_dc_colormap] - movl ebx,eax - movb al,[esi+ecx] // get first pixel - movb bl,[esi+edx] // get second pixel - movb al,[eax] // color translate first pixel - movb bl,[ebx] // color translate second pixel - - testl [pixelcount],0fffffffeh - jnz doubleloop // at least two pixels to map - jmp checklast - - .align 16 -doubleloop: - movl ecx,ebp // begin calculating third pixel -patch1: - addl ebp,12345678h // advance frac pointer - movb [edi],al // write first pixel - shrl ecx,25 // finish calculation for third pixel - movl edx,ebp // begin calculating fourth pixel -patch2: - addl ebp,12345678h // advance frac pointer - movl [edi+SCREENWIDTH],bl // write second pixel - shrl edx,25 // finish calculation for fourth pixel - movb al,[esi+ecx] // get third pixel - addl edi,SCREENWIDTH*2 // advance to third pixel destination - movb bl,[esi+edx] // get fourth pixel - decl [loopcount] // done with loop? - movb al,[eax] // color translate third pixel - movb bl,[ebx] // color translate fourth pixel - jnz doubleloop - -// check for final pixel -checklast: - testl [pixelcount],1 - jz done - movb [edi],al // write final pixel - -done: - popad - ret - - - -//================ -// -// R_DrawSpan -// -// Horizontal texture mapping -// -//================ - - - .align 16 -.globl _R_DrawSpan -_R_DrawSpan: - pushad - -// -// find loop count -// - movl eax,[_ds_x2] - incl eax - subl eax,[_ds_x1] // pixel count - movl [pixelcount],eax // save for final pixel - js hdone // nothing to scale - shrl eax,1 // double pixel count - movl [loopcount],eax - -// -// build composite position -// - movl ebp,[_ds_xfrac] - shll ebp,10 - andl ebp,0ffff0000h - movl eax,[_ds_yfrac] - shrl eax,6 - andl eax,0ffffh - orl ebp,eax - - movl esi,[_ds_source] - -// -// calculate screen dest -// - movl edi,[_ds_y] - movl edi,[_ylookup+edi*4] - movl eax,[_ds_x1] - addl edi,[_columnofs+eax*4] - -// -// build composite step -// - movl ebx,[_ds_xstep] - shll ebx,10 - andl ebx,0ffff0000h - movl eax,[_ds_ystep] - shrl eax,6 - andl eax,0ffffh - orl ebx,eax - - movl eax,OFFSET hpatch1+2 // convice tasm to modify code... - movl [eax],ebx - movl eax,OFFSET hpatch2+2 // convice tasm to modify code... - movl [eax],ebx - -// eax aligned colormap -// ebx aligned colormap -// ecx,edx scratch -// esi virtual source -// edi moving destination pointer -// ebp frac - - shldl ecx,ebp,22 // begin calculating third pixel (y units) - shldl ecx,ebp,6 // begin calculating third pixel (x units) - addl ebp,ebx // advance frac pointer - andl ecx,4095 // finish calculation for third pixel - shldl edx,ebp,22 // begin calculating fourth pixel (y units) - shldl edx,ebp,6 // begin calculating fourth pixel (x units) - addl ebp,ebx // advance frac pointer - andl edx,4095 // finish calculation for fourth pixel - movl eax,[_ds_colormap] - movl ebx,eax - movb al,[esi+ecx] // get first pixel - movb bl,[esi+edx] // get second pixel - movb al,[eax] // color translate first pixel - movb bl,[ebx] // color translate second pixel - - testl [pixelcount],0fffffffeh - jnz hdoubleloop // at least two pixels to map - jmp hchecklast - - - .align 16 -hdoubleloop: - shldl ecx,ebp,22 // begin calculating third pixel (y units) - shldl ecx,ebp,6 // begin calculating third pixel (x units) -hpatch1: - addl ebp,12345678h // advance frac pointer - movb [edi],al // write first pixel - andl ecx,4095 // finish calculation for third pixel - shldl edx,ebp,22 // begin calculating fourth pixel (y units) - shldl edx,ebp,6 // begin calculating fourth pixel (x units) -hpatch2: - addl ebp,12345678h // advance frac pointer - movb [edi+1],bl // write second pixel - andl edx,4095 // finish calculation for fourth pixel - movb al,[esi+ecx] // get third pixel - addl edi,2 // advance to third pixel destination - movb bl,[esi+edx] // get fourth pixel - decl [loopcount] // done with loop? - movb al,[eax] // color translate third pixel - movb bl,[ebx] // color translate fourth pixel - jnz hdoubleloop - -// check for final pixel -hchecklast: - testl [pixelcount],1 - jz hdone - movb [edi],al // write final pixel - -hdone: - popad - ret - - - - -//==================================================== -// fpfunc.S as of January 10th, 1997 (parts) - -#ifdef i386 - -.text - .align 4 -.globl _FixedMul -_FixedMul: - pushl %ebp - movl %esp,%ebp - movl 8(%ebp),%eax - imull 12(%ebp) - shrdl $16,%edx,%eax - popl %ebp - ret - - - .align 4 -.globl _FixedDiv2 -_FixedDiv2: - pushl %ebp - movl %esp,%ebp - movl 8(%ebp),%eax - cdq - shldl $16,%eax,%edx - sall $16,%eax - idivl 12(%ebp) - popl %ebp - ret - -#endif - diff --git a/docs/classes.txt b/docs/classes.txt deleted file mode 100644 index 543d7490d..000000000 --- a/docs/classes.txt +++ /dev/null @@ -1,303 +0,0 @@ -ZDoom 1.19 offers a partial conversion of the Doom code to C++. As such, some -functions and classes have been encapsulated in classes. This document tries -to give an overview of those classes and how to use them. - -Command line parameters -======================= - -Previous versions of ZDoom kept the command line in the myargv and myargc -global variables. This version uses a single variable, Args, of type DArgs. -This class is defined in m_argv.h and implemented in m_argv.cpp. The three -most important functions are: - - int DArgs::CheckParm (const char *check) const; - - Checks to see if a parameter exists. If it does, it's index number is - returned. Use the GetArg() method to retrieve an arguments specified - after it. - - char *DArgs::CheckValue (const char *check) const; - - This is similar to CheckParm(), but it returns the value of the argument - immediately following parameter. If the parameter is not present, or it - has no argument, NULL is returned. - - char *DArgs::GetArg (int index) const; - - Retrieves the value of an argument. This is similar to argv[index]. - -For the other functions, check the implementation in m_argv.cpp to see what -they do. - -Error messages -============== - -There are two functions for reporting error conditions: I_Error() and -I_FatalError(). Use the first for errors that can be recovered from. It will -drop the user to the fullscreen console and print the message. Use the -second for error conditions that are much harder to recover from. It will -terminate the program and display the message. - -Console commands -================ - -Adding new console commands is now very simple, compared to previous -versions of ZDoom. Registration is now completely automatic if you use the -BEGIN_COMMAND and END_COMMAND macros defined in c_dispatch.h. A simple -command could be implemented like this: - - #include "c_dispatch.h" - - BEGIN_COMMAND(hello) - { - Printf (PRINT_HIGH, "Hello, world!\n"); - } - END_COMMAND(hello) - -The parameter to the BEGIN_COMMAND and END_COMMAND macros is the name of -the command, as typed at the console (in this case, "hello"). You should use -the same name for both BEGIN_ and END_. You can access the arguments to the -command using argc and argv. If you want to know who activated the command, -m_Instigator is a pointer to the actor of the player who called it. - -Console variables -================= - -Adding new console variables is also similar. The c_cvars.h file contains -four macros related to using cvars: - - CVAR (name, default, flags) - - Declares a new console variable with the name "name" and default - value "default" and flags "flags". (See c_cvars.h for the different - flags). An example: - - CVAR (var_friction, "1", CVAR_SERVERINFO); - - EXTERN_CVAR (name) - - Imports a cvar defined elsewhere. This just generates the code - "extern cvar_t name;", but you should still use this macro. - - BEGIN_CUSTOM_CVAR (name, default, flags) - END_CUSTOM_CVAR (name) - - Declares a cvar that performs some special action each time its value - changes. You should use a compound statement between the BEGIN_ and - END_ macros, just like with commands above. Any code between these - two macros can use "var" to access the associated cvar. Example: - - BEGIN_CUSTOM_CVAR (splashfactor, "1.0", CVAR_SERVERINFO) - { - if (var.value <= 0.0f) - var.Set (1.0f); - else - selfthrustscale = 1.0f / var.value; - } - END_CUSTOM_CVAR (splashfactor) - - This example also illustrates bounds checking for cvars. The basic - idea is: - - if (variable is within range) - - else - - - Calling Set() will automatically execute the code block again, so you - must make sure that you do nothing but reset the value of the cvar if - it's out of range. The code block will also be executed at program - startup when the cvar is constructed. - -The DObject class hierarchy -=========================== - -Most classes in ZDoom 1.18 are descendants of the DObject class. This class -provides basic typechecking and serialization functionality. In a future -version of ZDoom, it will also provide a means to interface C++ code with -DoomScript. If you want to be able to perform type-checking on a class, save -it to disk, or access it from DoomScript (in a later version), it should be -a descendant of DObject. - -The basic features of DObject require that you use some of the macros in -dobject.h: DECLARE_CLASS, IMPLEMENT_CLASS, DECLARE_SERIAL, and -IMPLEMENT_SERIAL. For a class that won't be saved to disk, do this: - - class MyClass : public DObject - { - DECLARE_CLASS (MyClass, DObject) - public: - ... - Rest of class definition - ... - } - - Then someplace else, where you define the class, add this line: - - IMPLEMENT_CLASS (MyClass, DObject) - - (You should be sure to replace MyClass with the actual name of your class - and DObject with the name of your class's superclass.) - - For a class that can be saved to disk (ie, a serializable class), use - DECLARE_SERIAL and IMPLEMENT_SERIAL instead. Serializable classes require - default constructors. If you don't want anybody to be able to create an - instance of the class using the default constructor, you can hide it - inside the private portion of the class definition: - - ... - private: - MyClass () {} - ... - - Serializable classes also require that you define a Serialize() method. - This function should call the superclass's Serialize() method and then - either store or extract the fields for the class. (Whenever you change - the contents of a class, be sure to change its accompanying Serialize() - method.) A generic Serialize() looks like this: - - void MyClass::Serialize (FArchive &arc) - { - Super::Serialize (arc); - if (arc.IsStoring ()) - { - arc << m_field1 << m_field2 << m_field3 << ... ; - } - else - { - arc >> m_field1 >> m_field2 >> m_field3 >> ... ; - } - } - - There are also some structs that use some serialization code that you - should be sure to change if you change the structs. The code for - serializing sector_t and line_t can be found in P_SerializeWorld() in - p_saveg.cpp. The code for serializing player_t is in p_user.cpp as - player_t::Serialize(). - - To determine the type of an object, you can use the IsA() and IsKindOf() - methods of DObject. IsA() tests if the object is an instance of a - specific type of class, and is probably not what you want. IsKindOf() - checks if an object is a specific type of class or one of its - descendants. Example: Suppose anActor points to an instance of AActor. - (anActor->IsA (RUNTIME_CLASS(DThinker))) will return false because AActor - is not the same as DThinker, but (anActor->IsKindOf - (RUNTIME_CLASS(DThinker))) will return true because AActor is a - descendant of DThinker. - -Pointer cleanup -=============== - -Whenever an object is destroyed, ZDoom will attempt to NULL any pointers that -pointed to that object. This eliminates various anomalies caused by trying to -reference stale pointers. This mechanism is not entirely transparent and -requires some work on your part. When you create a subclass of DObject that -contains pointers, you should use the IMPLEMENT_POINTY_SERIAL or -IMPLEMENT_POINTY_CLASS macros instead of IMPLEMENT_SERIAL or IMPLEMENT_CLASS. -Following the macro, you list each element of the class that points to a -DObject (or a subclass of it). If the pointer points to something that is not -a DObject (such as a char *), you do not need to include it in this list. -After you list all the pointers, use the END_POINTERS macro. - -The implementation for the AActor class looks like this: - -IMPLEMENT_POINTY_SERIAL (AActor, DThinker) - DECLARE_POINTER (target) - DECLARE_POINTER (lastenemy) - DECLARE_POINTER (tracer) - DECLARE_POINTER (goal) -END_POINTERS - -If you add pointers to any class, you need to update this list accordingly. -The player class uses a hack, because it is not derived from DObject, to -clear pointers. See player_t::FixPointers() in p_user.cpp if you add any -pointers to player_t. - -When you want to destroy any object derived from DThinker (this includes all -actors), call that object's Destroy() method. Do not use delete, because it -is not guaranteed to perform all necessary cleanup. If the object is not -derived from DThinker, however, you can safely call delete on it. - -As an example, if you have an instance of AActor called actor, and you want -to get rid of it, use: - actor->Destroy (); - -If you have an instance of DCanvas called canvas and want to get rid of it, -either of the following will work (but not both): - canvas->Destroy (); or - delete canvas; - -Thinkers -======== - -Almost everything that can affect the appearance of the world is implemented -as a subclass of DThinker. The important base classes are: - - DPolyAction - - A polyobject that is doing something (DRotatePoly, DMovePoly, or - DPolyDoor). - - DSectorEffect - - An effect that occurs inside a certain sector. This is further broken - up into DLighting (for lighting changes) and DMover (for floor/ - ceiling movement). DMover is also subclassed into DMovingFloor (for - moving floors only) and DMovingCeiling (for moving ceilings only). - For effects that move both the floor and ceiling, subclass DMover - and have a look at either DPillar or DElevator. - - AActor - - This is probably the most important. All players, monsters, items, - ammo, weapons, and anything else that appears as a sprite in the - world is an instance of AActor. This is nowhere near as encapsulated - as I would like it to be because of the necessity to maintain - compatibility with DeHackEd patches until DoomScript is done. This - means that there is no easy way to subclass AActor and spawn an - instance of the subclass in the map. I don't like it, but it's a step - in the right direction. - -To find all instances of a specific type of thinker in a map, you can use the -TThinkerIterator template class. It's usage is simple: - - TThinkerIterator iterator; - TypeOfClass *object; - - while ( (object = iterator.Next ()) ) - { - // do something with the object - } - -AActor methods -============== - -A few of the functions that operate on actors have been moved inside the -AActor class: - - P_ClearTidHashes() -> AActor::ClearTIDHashes() - P_AddMobjToHash() -> AActor::AddToHash() - P_RemoveMobjFromHash() -> AActor::RemoveFromHash() - P_FindMobjByTid() -> AActor::FindByTID() - P_FindGoal() -> AActor::FindGoal() - - P_UnsetThingPosition() -> AActor::UnlinkFromWorld() - P_SetThingPosition() -> AActor::LinkToWorld() - -AActor::SetOrigin() has also been introduced. It simply moves the actor to -a specific location on the map without performing any collision detection. - -A bit more on serialization -=========================== - -The serialization mechanism is a fairly standard, yet powerful, framework -that can save a bunch of objects to disk and properly maintain pointers -between them. When you store a pointer to an object, the object will also be -stored to disk if it hasn't been already. When you read the pointer, the -object it points to will also be read from disk if it hasn't been already. -This allows pointers to objects to be preserved without any extra effort on -your part. Pointers to something other than a DObject or one of its -descendents need to be implemented specially by overloading operator << (see -info.h for a few of these). If you're not sure how serialization works, take -a look at some of the serialization functions for the existing classes by -grepping through the source for "::Serialize" (without the quotes). diff --git a/docs/colors.txt b/docs/colors.txt deleted file mode 100644 index b4c43c72f..000000000 --- a/docs/colors.txt +++ /dev/null @@ -1,756 +0,0 @@ -! $XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp $ - -255 250 250 snow -248 248 255 ghost white -248 248 255 GhostWhite -245 245 245 white smoke -245 245 245 WhiteSmoke -220 220 220 gainsboro -255 250 240 floral white -255 250 240 FloralWhite -253 245 230 old lace -253 245 230 OldLace -250 240 230 linen -250 235 215 antique white -250 235 215 AntiqueWhite -255 239 213 papaya whip -255 239 213 PapayaWhip -255 235 205 blanched almond -255 235 205 BlanchedAlmond -255 228 196 bisque -255 218 185 peach puff -255 218 185 PeachPuff -255 222 173 navajo white -255 222 173 NavajoWhite -255 228 181 moccasin -255 248 220 cornsilk -255 255 240 ivory -255 250 205 lemon chiffon -255 250 205 LemonChiffon -255 245 238 seashell -240 255 240 honeydew -245 255 250 mint cream -245 255 250 MintCream -240 255 255 azure -240 248 255 alice blue -240 248 255 AliceBlue -230 230 250 lavender -255 240 245 lavender blush -255 240 245 LavenderBlush -255 228 225 misty rose -255 228 225 MistyRose -255 255 255 white - 0 0 0 black - 47 79 79 dark slate gray - 47 79 79 DarkSlateGray - 47 79 79 dark slate grey - 47 79 79 DarkSlateGrey -105 105 105 dim gray -105 105 105 DimGray -105 105 105 dim grey -105 105 105 DimGrey -112 128 144 slate gray -112 128 144 SlateGray -112 128 144 slate grey -112 128 144 SlateGrey -119 136 153 light slate gray -119 136 153 LightSlateGray -119 136 153 light slate grey -119 136 153 LightSlateGrey -190 190 190 gray -190 190 190 grey -211 211 211 light grey -211 211 211 LightGrey -211 211 211 light gray -211 211 211 LightGray - 25 25 112 midnight blue - 25 25 112 MidnightBlue - 0 0 128 navy - 0 0 128 navy blue - 0 0 128 NavyBlue -100 149 237 cornflower blue -100 149 237 CornflowerBlue - 72 61 139 dark slate blue - 72 61 139 DarkSlateBlue -106 90 205 slate blue -106 90 205 SlateBlue -123 104 238 medium slate blue -123 104 238 MediumSlateBlue -132 112 255 light slate blue -132 112 255 LightSlateBlue - 0 0 205 medium blue - 0 0 205 MediumBlue - 65 105 225 royal blue - 65 105 225 RoyalBlue - 0 0 255 blue - 30 144 255 dodger blue - 30 144 255 DodgerBlue - 0 191 255 deep sky blue - 0 191 255 DeepSkyBlue -135 206 235 sky blue -135 206 235 SkyBlue -135 206 250 light sky blue -135 206 250 LightSkyBlue - 70 130 180 steel blue - 70 130 180 SteelBlue -176 196 222 light steel blue -176 196 222 LightSteelBlue -173 216 230 light blue -173 216 230 LightBlue -176 224 230 powder blue -176 224 230 PowderBlue -175 238 238 pale turquoise -175 238 238 PaleTurquoise - 0 206 209 dark turquoise - 0 206 209 DarkTurquoise - 72 209 204 medium turquoise - 72 209 204 MediumTurquoise - 64 224 208 turquoise - 0 255 255 cyan -224 255 255 light cyan -224 255 255 LightCyan - 95 158 160 cadet blue - 95 158 160 CadetBlue -102 205 170 medium aquamarine -102 205 170 MediumAquamarine -127 255 212 aquamarine - 0 100 0 dark green - 0 100 0 DarkGreen - 85 107 47 dark olive green - 85 107 47 DarkOliveGreen -143 188 143 dark sea green -143 188 143 DarkSeaGreen - 46 139 87 sea green - 46 139 87 SeaGreen - 60 179 113 medium sea green - 60 179 113 MediumSeaGreen - 32 178 170 light sea green - 32 178 170 LightSeaGreen -152 251 152 pale green -152 251 152 PaleGreen - 0 255 127 spring green - 0 255 127 SpringGreen -124 252 0 lawn green -124 252 0 LawnGreen - 0 255 0 green -127 255 0 chartreuse - 0 250 154 medium spring green - 0 250 154 MediumSpringGreen -173 255 47 green yellow -173 255 47 GreenYellow - 50 205 50 lime green - 50 205 50 LimeGreen -154 205 50 yellow green -154 205 50 YellowGreen - 34 139 34 forest green - 34 139 34 ForestGreen -107 142 35 olive drab -107 142 35 OliveDrab -189 183 107 dark khaki -189 183 107 DarkKhaki -240 230 140 khaki -238 232 170 pale goldenrod -238 232 170 PaleGoldenrod -250 250 210 light goldenrod yellow -250 250 210 LightGoldenrodYellow -255 255 224 light yellow -255 255 224 LightYellow -255 255 0 yellow -255 215 0 gold -238 221 130 light goldenrod -238 221 130 LightGoldenrod -218 165 32 goldenrod -184 134 11 dark goldenrod -184 134 11 DarkGoldenrod -188 143 143 rosy brown -188 143 143 RosyBrown -205 92 92 indian red -205 92 92 IndianRed -139 69 19 saddle brown -139 69 19 SaddleBrown -160 82 45 sienna -205 133 63 peru -222 184 135 burlywood -245 245 220 beige -245 222 179 wheat -244 164 96 sandy brown -244 164 96 SandyBrown -210 180 140 tan -210 105 30 chocolate -178 34 34 firebrick -165 42 42 brown -233 150 122 dark salmon -233 150 122 DarkSalmon -250 128 114 salmon -255 160 122 light salmon -255 160 122 LightSalmon -255 165 0 orange -255 140 0 dark orange -255 140 0 DarkOrange -255 127 80 coral -240 128 128 light coral -240 128 128 LightCoral -255 99 71 tomato -255 69 0 orange red -255 69 0 OrangeRed -255 0 0 red -255 105 180 hot pink -255 105 180 HotPink -255 20 147 deep pink -255 20 147 DeepPink -255 192 203 pink -255 182 193 light pink -255 182 193 LightPink -219 112 147 pale violet red -219 112 147 PaleVioletRed -176 48 96 maroon -199 21 133 medium violet red -199 21 133 MediumVioletRed -208 32 144 violet red -208 32 144 VioletRed -255 0 255 magenta -238 130 238 violet -221 160 221 plum -218 112 214 orchid -186 85 211 medium orchid -186 85 211 MediumOrchid -153 50 204 dark orchid -153 50 204 DarkOrchid -148 0 211 dark violet -148 0 211 DarkViolet -138 43 226 blue violet -138 43 226 BlueViolet -160 32 240 purple -147 112 219 medium purple -147 112 219 MediumPurple -216 191 216 thistle -255 250 250 snow1 -238 233 233 snow2 -205 201 201 snow3 -139 137 137 snow4 -255 245 238 seashell1 -238 229 222 seashell2 -205 197 191 seashell3 -139 134 130 seashell4 -255 239 219 AntiqueWhite1 -238 223 204 AntiqueWhite2 -205 192 176 AntiqueWhite3 -139 131 120 AntiqueWhite4 -255 228 196 bisque1 -238 213 183 bisque2 -205 183 158 bisque3 -139 125 107 bisque4 -255 218 185 PeachPuff1 -238 203 173 PeachPuff2 -205 175 149 PeachPuff3 -139 119 101 PeachPuff4 -255 222 173 NavajoWhite1 -238 207 161 NavajoWhite2 -205 179 139 NavajoWhite3 -139 121 94 NavajoWhite4 -255 250 205 LemonChiffon1 -238 233 191 LemonChiffon2 -205 201 165 LemonChiffon3 -139 137 112 LemonChiffon4 -255 248 220 cornsilk1 -238 232 205 cornsilk2 -205 200 177 cornsilk3 -139 136 120 cornsilk4 -255 255 240 ivory1 -238 238 224 ivory2 -205 205 193 ivory3 -139 139 131 ivory4 -240 255 240 honeydew1 -224 238 224 honeydew2 -193 205 193 honeydew3 -131 139 131 honeydew4 -255 240 245 LavenderBlush1 -238 224 229 LavenderBlush2 -205 193 197 LavenderBlush3 -139 131 134 LavenderBlush4 -255 228 225 MistyRose1 -238 213 210 MistyRose2 -205 183 181 MistyRose3 -139 125 123 MistyRose4 -240 255 255 azure1 -224 238 238 azure2 -193 205 205 azure3 -131 139 139 azure4 -131 111 255 SlateBlue1 -122 103 238 SlateBlue2 -105 89 205 SlateBlue3 - 71 60 139 SlateBlue4 - 72 118 255 RoyalBlue1 - 67 110 238 RoyalBlue2 - 58 95 205 RoyalBlue3 - 39 64 139 RoyalBlue4 - 0 0 255 blue1 - 0 0 238 blue2 - 0 0 205 blue3 - 0 0 139 blue4 - 30 144 255 DodgerBlue1 - 28 134 238 DodgerBlue2 - 24 116 205 DodgerBlue3 - 16 78 139 DodgerBlue4 - 99 184 255 SteelBlue1 - 92 172 238 SteelBlue2 - 79 148 205 SteelBlue3 - 54 100 139 SteelBlue4 - 0 191 255 DeepSkyBlue1 - 0 178 238 DeepSkyBlue2 - 0 154 205 DeepSkyBlue3 - 0 104 139 DeepSkyBlue4 -135 206 255 SkyBlue1 -126 192 238 SkyBlue2 -108 166 205 SkyBlue3 - 74 112 139 SkyBlue4 -176 226 255 LightSkyBlue1 -164 211 238 LightSkyBlue2 -141 182 205 LightSkyBlue3 - 96 123 139 LightSkyBlue4 -198 226 255 SlateGray1 -185 211 238 SlateGray2 -159 182 205 SlateGray3 -108 123 139 SlateGray4 -202 225 255 LightSteelBlue1 -188 210 238 LightSteelBlue2 -162 181 205 LightSteelBlue3 -110 123 139 LightSteelBlue4 -191 239 255 LightBlue1 -178 223 238 LightBlue2 -154 192 205 LightBlue3 -104 131 139 LightBlue4 -224 255 255 LightCyan1 -209 238 238 LightCyan2 -180 205 205 LightCyan3 -122 139 139 LightCyan4 -187 255 255 PaleTurquoise1 -174 238 238 PaleTurquoise2 -150 205 205 PaleTurquoise3 -102 139 139 PaleTurquoise4 -152 245 255 CadetBlue1 -142 229 238 CadetBlue2 -122 197 205 CadetBlue3 - 83 134 139 CadetBlue4 - 0 245 255 turquoise1 - 0 229 238 turquoise2 - 0 197 205 turquoise3 - 0 134 139 turquoise4 - 0 255 255 cyan1 - 0 238 238 cyan2 - 0 205 205 cyan3 - 0 139 139 cyan4 -151 255 255 DarkSlateGray1 -141 238 238 DarkSlateGray2 -121 205 205 DarkSlateGray3 - 82 139 139 DarkSlateGray4 -127 255 212 aquamarine1 -118 238 198 aquamarine2 -102 205 170 aquamarine3 - 69 139 116 aquamarine4 -193 255 193 DarkSeaGreen1 -180 238 180 DarkSeaGreen2 -155 205 155 DarkSeaGreen3 -105 139 105 DarkSeaGreen4 - 84 255 159 SeaGreen1 - 78 238 148 SeaGreen2 - 67 205 128 SeaGreen3 - 46 139 87 SeaGreen4 -154 255 154 PaleGreen1 -144 238 144 PaleGreen2 -124 205 124 PaleGreen3 - 84 139 84 PaleGreen4 - 0 255 127 SpringGreen1 - 0 238 118 SpringGreen2 - 0 205 102 SpringGreen3 - 0 139 69 SpringGreen4 - 0 255 0 green1 - 0 238 0 green2 - 0 205 0 green3 - 0 139 0 green4 -127 255 0 chartreuse1 -118 238 0 chartreuse2 -102 205 0 chartreuse3 - 69 139 0 chartreuse4 -192 255 62 OliveDrab1 -179 238 58 OliveDrab2 -154 205 50 OliveDrab3 -105 139 34 OliveDrab4 -202 255 112 DarkOliveGreen1 -188 238 104 DarkOliveGreen2 -162 205 90 DarkOliveGreen3 -110 139 61 DarkOliveGreen4 -255 246 143 khaki1 -238 230 133 khaki2 -205 198 115 khaki3 -139 134 78 khaki4 -255 236 139 LightGoldenrod1 -238 220 130 LightGoldenrod2 -205 190 112 LightGoldenrod3 -139 129 76 LightGoldenrod4 -255 255 224 LightYellow1 -238 238 209 LightYellow2 -205 205 180 LightYellow3 -139 139 122 LightYellow4 -255 255 0 yellow1 -238 238 0 yellow2 -205 205 0 yellow3 -139 139 0 yellow4 -255 215 0 gold1 -238 201 0 gold2 -205 173 0 gold3 -139 117 0 gold4 -255 193 37 goldenrod1 -238 180 34 goldenrod2 -205 155 29 goldenrod3 -139 105 20 goldenrod4 -255 185 15 DarkGoldenrod1 -238 173 14 DarkGoldenrod2 -205 149 12 DarkGoldenrod3 -139 101 8 DarkGoldenrod4 -255 193 193 RosyBrown1 -238 180 180 RosyBrown2 -205 155 155 RosyBrown3 -139 105 105 RosyBrown4 -255 106 106 IndianRed1 -238 99 99 IndianRed2 -205 85 85 IndianRed3 -139 58 58 IndianRed4 -255 130 71 sienna1 -238 121 66 sienna2 -205 104 57 sienna3 -139 71 38 sienna4 -255 211 155 burlywood1 -238 197 145 burlywood2 -205 170 125 burlywood3 -139 115 85 burlywood4 -255 231 186 wheat1 -238 216 174 wheat2 -205 186 150 wheat3 -139 126 102 wheat4 -255 165 79 tan1 -238 154 73 tan2 -205 133 63 tan3 -139 90 43 tan4 -255 127 36 chocolate1 -238 118 33 chocolate2 -205 102 29 chocolate3 -139 69 19 chocolate4 -255 48 48 firebrick1 -238 44 44 firebrick2 -205 38 38 firebrick3 -139 26 26 firebrick4 -255 64 64 brown1 -238 59 59 brown2 -205 51 51 brown3 -139 35 35 brown4 -255 140 105 salmon1 -238 130 98 salmon2 -205 112 84 salmon3 -139 76 57 salmon4 -255 160 122 LightSalmon1 -238 149 114 LightSalmon2 -205 129 98 LightSalmon3 -139 87 66 LightSalmon4 -255 165 0 orange1 -238 154 0 orange2 -205 133 0 orange3 -139 90 0 orange4 -255 127 0 DarkOrange1 -238 118 0 DarkOrange2 -205 102 0 DarkOrange3 -139 69 0 DarkOrange4 -255 114 86 coral1 -238 106 80 coral2 -205 91 69 coral3 -139 62 47 coral4 -255 99 71 tomato1 -238 92 66 tomato2 -205 79 57 tomato3 -139 54 38 tomato4 -255 69 0 OrangeRed1 -238 64 0 OrangeRed2 -205 55 0 OrangeRed3 -139 37 0 OrangeRed4 -255 0 0 red1 -238 0 0 red2 -205 0 0 red3 -139 0 0 red4 -255 20 147 DeepPink1 -238 18 137 DeepPink2 -205 16 118 DeepPink3 -139 10 80 DeepPink4 -255 110 180 HotPink1 -238 106 167 HotPink2 -205 96 144 HotPink3 -139 58 98 HotPink4 -255 181 197 pink1 -238 169 184 pink2 -205 145 158 pink3 -139 99 108 pink4 -255 174 185 LightPink1 -238 162 173 LightPink2 -205 140 149 LightPink3 -139 95 101 LightPink4 -255 130 171 PaleVioletRed1 -238 121 159 PaleVioletRed2 -205 104 137 PaleVioletRed3 -139 71 93 PaleVioletRed4 -255 52 179 maroon1 -238 48 167 maroon2 -205 41 144 maroon3 -139 28 98 maroon4 -255 62 150 VioletRed1 -238 58 140 VioletRed2 -205 50 120 VioletRed3 -139 34 82 VioletRed4 -255 0 255 magenta1 -238 0 238 magenta2 -205 0 205 magenta3 -139 0 139 magenta4 -255 131 250 orchid1 -238 122 233 orchid2 -205 105 201 orchid3 -139 71 137 orchid4 -255 187 255 plum1 -238 174 238 plum2 -205 150 205 plum3 -139 102 139 plum4 -224 102 255 MediumOrchid1 -209 95 238 MediumOrchid2 -180 82 205 MediumOrchid3 -122 55 139 MediumOrchid4 -191 62 255 DarkOrchid1 -178 58 238 DarkOrchid2 -154 50 205 DarkOrchid3 -104 34 139 DarkOrchid4 -155 48 255 purple1 -145 44 238 purple2 -125 38 205 purple3 - 85 26 139 purple4 -171 130 255 MediumPurple1 -159 121 238 MediumPurple2 -137 104 205 MediumPurple3 - 93 71 139 MediumPurple4 -255 225 255 thistle1 -238 210 238 thistle2 -205 181 205 thistle3 -139 123 139 thistle4 - 0 0 0 gray0 - 0 0 0 grey0 - 3 3 3 gray1 - 3 3 3 grey1 - 5 5 5 gray2 - 5 5 5 grey2 - 8 8 8 gray3 - 8 8 8 grey3 - 10 10 10 gray4 - 10 10 10 grey4 - 13 13 13 gray5 - 13 13 13 grey5 - 15 15 15 gray6 - 15 15 15 grey6 - 18 18 18 gray7 - 18 18 18 grey7 - 20 20 20 gray8 - 20 20 20 grey8 - 23 23 23 gray9 - 23 23 23 grey9 - 26 26 26 gray10 - 26 26 26 grey10 - 28 28 28 gray11 - 28 28 28 grey11 - 31 31 31 gray12 - 31 31 31 grey12 - 33 33 33 gray13 - 33 33 33 grey13 - 36 36 36 gray14 - 36 36 36 grey14 - 38 38 38 gray15 - 38 38 38 grey15 - 41 41 41 gray16 - 41 41 41 grey16 - 43 43 43 gray17 - 43 43 43 grey17 - 46 46 46 gray18 - 46 46 46 grey18 - 48 48 48 gray19 - 48 48 48 grey19 - 51 51 51 gray20 - 51 51 51 grey20 - 54 54 54 gray21 - 54 54 54 grey21 - 56 56 56 gray22 - 56 56 56 grey22 - 59 59 59 gray23 - 59 59 59 grey23 - 61 61 61 gray24 - 61 61 61 grey24 - 64 64 64 gray25 - 64 64 64 grey25 - 66 66 66 gray26 - 66 66 66 grey26 - 69 69 69 gray27 - 69 69 69 grey27 - 71 71 71 gray28 - 71 71 71 grey28 - 74 74 74 gray29 - 74 74 74 grey29 - 77 77 77 gray30 - 77 77 77 grey30 - 79 79 79 gray31 - 79 79 79 grey31 - 82 82 82 gray32 - 82 82 82 grey32 - 84 84 84 gray33 - 84 84 84 grey33 - 87 87 87 gray34 - 87 87 87 grey34 - 89 89 89 gray35 - 89 89 89 grey35 - 92 92 92 gray36 - 92 92 92 grey36 - 94 94 94 gray37 - 94 94 94 grey37 - 97 97 97 gray38 - 97 97 97 grey38 - 99 99 99 gray39 - 99 99 99 grey39 -102 102 102 gray40 -102 102 102 grey40 -105 105 105 gray41 -105 105 105 grey41 -107 107 107 gray42 -107 107 107 grey42 -110 110 110 gray43 -110 110 110 grey43 -112 112 112 gray44 -112 112 112 grey44 -115 115 115 gray45 -115 115 115 grey45 -117 117 117 gray46 -117 117 117 grey46 -120 120 120 gray47 -120 120 120 grey47 -122 122 122 gray48 -122 122 122 grey48 -125 125 125 gray49 -125 125 125 grey49 -127 127 127 gray50 -127 127 127 grey50 -130 130 130 gray51 -130 130 130 grey51 -133 133 133 gray52 -133 133 133 grey52 -135 135 135 gray53 -135 135 135 grey53 -138 138 138 gray54 -138 138 138 grey54 -140 140 140 gray55 -140 140 140 grey55 -143 143 143 gray56 -143 143 143 grey56 -145 145 145 gray57 -145 145 145 grey57 -148 148 148 gray58 -148 148 148 grey58 -150 150 150 gray59 -150 150 150 grey59 -153 153 153 gray60 -153 153 153 grey60 -156 156 156 gray61 -156 156 156 grey61 -158 158 158 gray62 -158 158 158 grey62 -161 161 161 gray63 -161 161 161 grey63 -163 163 163 gray64 -163 163 163 grey64 -166 166 166 gray65 -166 166 166 grey65 -168 168 168 gray66 -168 168 168 grey66 -171 171 171 gray67 -171 171 171 grey67 -173 173 173 gray68 -173 173 173 grey68 -176 176 176 gray69 -176 176 176 grey69 -179 179 179 gray70 -179 179 179 grey70 -181 181 181 gray71 -181 181 181 grey71 -184 184 184 gray72 -184 184 184 grey72 -186 186 186 gray73 -186 186 186 grey73 -189 189 189 gray74 -189 189 189 grey74 -191 191 191 gray75 -191 191 191 grey75 -194 194 194 gray76 -194 194 194 grey76 -196 196 196 gray77 -196 196 196 grey77 -199 199 199 gray78 -199 199 199 grey78 -201 201 201 gray79 -201 201 201 grey79 -204 204 204 gray80 -204 204 204 grey80 -207 207 207 gray81 -207 207 207 grey81 -209 209 209 gray82 -209 209 209 grey82 -212 212 212 gray83 -212 212 212 grey83 -214 214 214 gray84 -214 214 214 grey84 -217 217 217 gray85 -217 217 217 grey85 -219 219 219 gray86 -219 219 219 grey86 -222 222 222 gray87 -222 222 222 grey87 -224 224 224 gray88 -224 224 224 grey88 -227 227 227 gray89 -227 227 227 grey89 -229 229 229 gray90 -229 229 229 grey90 -232 232 232 gray91 -232 232 232 grey91 -235 235 235 gray92 -235 235 235 grey92 -237 237 237 gray93 -237 237 237 grey93 -240 240 240 gray94 -240 240 240 grey94 -242 242 242 gray95 -242 242 242 grey95 -245 245 245 gray96 -245 245 245 grey96 -247 247 247 gray97 -247 247 247 grey97 -250 250 250 gray98 -250 250 250 grey98 -252 252 252 gray99 -252 252 252 grey99 -255 255 255 gray100 -255 255 255 grey100 -169 169 169 dark grey -169 169 169 DarkGrey -169 169 169 dark gray -169 169 169 DarkGray -0 0 139 dark blue -0 0 139 DarkBlue -0 139 139 dark cyan -0 139 139 DarkCyan -139 0 139 dark magenta -139 0 139 DarkMagenta -139 0 0 dark red -139 0 0 DarkRed -144 238 144 light green -144 238 144 LightGreen - - diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 8974d892b..4233bb38f 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -2,6 +2,20 @@ - Added Species property for actors and separated Hexen's Demon1 and Demon2 into different species. +May 10, 2009 (Changes by Graf Zahl) +- Added handling for UDMF user keys. +- Added support for ACS functions that can be defined without recompiling ACC. +- Fixed: The short lump name for embedded files must be cleared so that they + are not found by a normal lump search. + +May 9, 2009 (Changes by Graf Zahl) +- Added AProp_Notarget actor property. +- Fixed: TraceBleed was missing a NULL pointer check, +- Fixed: P_RandomChaseDir could crash for friendly monsters that belong to + a player which left the game. +- Changed A_PodGrow so that it plays the generator's attack sound instead of + "misc/podgrow". + May 8, 2009 - Added transference of a select few flags from PowerProtection to its owner. - Added actor type parameters to A_PodPain() and A_MakePod(). diff --git a/src/g_heretic/a_hereticmisc.cpp b/src/g_heretic/a_hereticmisc.cpp index 2f76a566a..d4ffc8798 100644 --- a/src/g_heretic/a_hereticmisc.cpp +++ b/src/g_heretic/a_hereticmisc.cpp @@ -116,7 +116,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_MakePod) } mo->SetState (mo->FindState("Grow")); P_ThrustMobj (mo, pr_makepod()<<24, (fixed_t)(4.5*FRACUNIT)); - S_Sound (mo, CHAN_BODY, "world/podgrow", 1, ATTN_IDLE); + S_Sound (mo, CHAN_BODY, self->AttackSound, 1, ATTN_IDLE); self->special1++; // Increment generated pod count mo->master = self; // Link the generator to the pod return; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index fa9a66136..edd90bf17 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -70,6 +70,7 @@ #include "sbarinfo.h" #include "cmdlib.h" #include "m_png.h" +#include "p_setup.h" extern FILE *Logfile; @@ -2405,6 +2406,7 @@ enum APROP_Friendly = 16, APROP_SpawnHealth = 17, APROP_Dropped = 18, + APROP_Notarget = 19, }; // These are needed for ACS's APROP_RenderStyle @@ -2492,6 +2494,10 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) if (value) actor->flags2 |= MF2_INVULNERABLE; else actor->flags2 &= ~MF2_INVULNERABLE; break; + case APROP_Notarget: + if (value) actor->flags3 |= MF3_NOTARGET; else actor->flags3 &= ~MF3_NOTARGET; + break; + case APROP_JumpZ: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn))) static_cast(actor)->JumpZ = value; @@ -2595,6 +2601,7 @@ int DLevelScript::GetActorProperty (int tid, int property) case APROP_ChaseGoal: return !!(actor->flags5 & MF5_CHASEGOAL); case APROP_Frightened: return !!(actor->flags4 & MF4_FRIGHTENED); case APROP_Friendly: return !!(actor->flags & MF_FRIENDLY); + case APROP_Notarget: return !!(actor->flags3 & MF3_NOTARGET); case APROP_SpawnHealth: if (actor->IsKindOf (RUNTIME_CLASS (APlayerPawn))) { return static_cast(actor)->MaxHealth; @@ -2772,8 +2779,80 @@ int DLevelScript::DoClassifyActor(int tid) return classify; } +enum EACSFunctions +{ + GetLineUDMFInt=1, + GetLineUDMFFixed, + GetThingUDMFInt, + GetThingUDMFFixed, + GetSectorUDMFInt, + GetSectorUDMFFixed, + GetSideUDMFInt, + GetSideUDMFFixed, +}; + +int DLevelScript::SideFromID(int id, int side) +{ + if (side != 0 && side != 1) return -1; + + if (id == 0) + { + if (activationline == NULL) return -1; + if (activationline->sidenum[side] == NO_SIDE) return -1; + return sides[activationline->sidenum[side]].Index; + } + else + { + int line = P_FindLineFromID(id, -1); + if (line == -1) return -1; + if (lines[line].sidenum[side] == NO_SIDE) return -1; + return sides[lines[line].sidenum[side]].Index; + } +} + +int DLevelScript::LineFromID(int id) +{ + if (id == 0) + { + if (activationline == NULL) return -1; + return int(activationline - lines); + } + else + { + return P_FindLineFromID(id, -1); + } +} + +int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args) +{ + switch(funcIndex) + { + case GetLineUDMFInt: + return GetUDMFInt(UDMF_Line, LineFromID(args[0]), FBehavior::StaticLookupString(args[1])); + case GetLineUDMFFixed: + return GetUDMFFixed(UDMF_Line, LineFromID(args[0]), FBehavior::StaticLookupString(args[1])); + case GetThingUDMFInt: + case GetThingUDMFFixed: + return 0; // Not implemented yet + case GetSectorUDMFInt: + return GetUDMFInt(UDMF_Sector, P_FindSectorFromTag(args[0], -1), FBehavior::StaticLookupString(args[1])); + case GetSectorUDMFFixed: + return GetUDMFFixed(UDMF_Sector, P_FindSectorFromTag(args[0], -1), FBehavior::StaticLookupString(args[1])); + case GetSideUDMFInt: + return GetUDMFInt(UDMF_Side, SideFromID(args[0], args[1]), FBehavior::StaticLookupString(args[2])); + case GetSideUDMFFixed: + return GetUDMFFixed(UDMF_Side, SideFromID(args[0], args[1]), FBehavior::StaticLookupString(args[2])); + default: + break; + } + + return 0; +} + + #define NEXTWORD (LittleLong(*pc++)) #define NEXTBYTE (fmt==ACS_LittleEnhanced?getbyte(pc):NEXTWORD) +#define NEXTSHORT (fmt==ACS_LittleEnhanced?getshort(pc):NEXTWORD) #define STACK(a) (Stack[sp - (a)]) #define PushToStack(a) (Stack[sp++] = (a)) @@ -2784,6 +2863,13 @@ inline int getbyte (int *&pc) return res; } +inline int getshort (int *&pc) +{ + int res = LittleShort( *(SWORD *)pc); + pc = (int *)((BYTE *)pc+2); + return res; +} + int DLevelScript::RunScript () { DACSThinker *controller = DACSThinker::ActiveThinker; @@ -3064,6 +3150,17 @@ int DLevelScript::RunScript () pc = (int *)((BYTE *)pc + 6); break; + case PCD_CALLFUNC: + { + int argCount = NEXTBYTE; + int funcIndex = NEXTSHORT; + + int retval = CallFunction(argCount, funcIndex, &STACK(argCount)); + sp -= argCount-1; + STACK(1) = retval; + } + break; + case PCD_CALL: case PCD_CALLDISCARD: { diff --git a/src/p_acs.h b/src/p_acs.h index 59ff1274e..365277b29 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -586,6 +586,7 @@ public: PCD_CLASSIFYACTOR, PCD_PRINTBINARY, /*350*/ PCD_PRINTHEX, + PCD_CALLFUNC, /*351*/ PCODE_COMMAND_COUNT }; @@ -715,6 +716,7 @@ protected: static int DoSpawnSpot (int type, int spot, int tid, int angle); static int DoSpawnSpotFacing (int type, int spot, int tid); int DoClassifyActor (int tid); + int CallFunction(int argCount, int funcIndex, SDWORD *args); void DoFadeTo (int r, int g, int b, int a, fixed_t time); void DoFadeRange (int r1, int g1, int b1, int a1, @@ -725,6 +727,9 @@ protected: int GetActorProperty (int tid, int property); int GetPlayerInput (int playernum, int inputnum); + int LineFromID(int id); + int SideFromID(int id, int side); + private: DLevelScript (); diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 0da62486f..933f5e9e1 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -846,60 +846,62 @@ void P_RandomChaseDir (AActor *actor) } player = players[i].mo; } - - if (pr_newchasedir() & 1 || !P_CheckSight (actor, player)) + if (player != NULL && playeringame[i]) { - deltax = player->x - actor->x; - deltay = player->y - actor->y; - - if (deltax>128*FRACUNIT) - d[1]= DI_EAST; - else if (deltax<-128*FRACUNIT) - d[1]= DI_WEST; - else - d[1]=DI_NODIR; - - if (deltay<-128*FRACUNIT) - d[2]= DI_SOUTH; - else if (deltay>128*FRACUNIT) - d[2]= DI_NORTH; - else - d[2]=DI_NODIR; - - // try direct route - if (d[1] != DI_NODIR && d[2] != DI_NODIR) + if (pr_newchasedir() & 1 || !P_CheckSight (actor, player)) { - actor->movedir = diags[((deltay<0)<<1) + (deltax>0)]; - if (actor->movedir != turnaround && P_TryWalk(actor)) - return; - } + deltax = player->x - actor->x; + deltay = player->y - actor->y; - // try other directions - if (pr_newchasedir() > 200 || abs(deltay) > abs(deltax)) - { - swap (d[1], d[2]); - } + if (deltax>128*FRACUNIT) + d[1]= DI_EAST; + else if (deltax<-128*FRACUNIT) + d[1]= DI_WEST; + else + d[1]=DI_NODIR; - if (d[1] == turnaround) - d[1] = DI_NODIR; - if (d[2] == turnaround) - d[2] = DI_NODIR; - - if (d[1] != DI_NODIR) - { - actor->movedir = d[1]; - if (P_TryWalk (actor)) + if (deltay<-128*FRACUNIT) + d[2]= DI_SOUTH; + else if (deltay>128*FRACUNIT) + d[2]= DI_NORTH; + else + d[2]=DI_NODIR; + + // try direct route + if (d[1] != DI_NODIR && d[2] != DI_NODIR) { - // either moved forward or attacked - return; + actor->movedir = diags[((deltay<0)<<1) + (deltax>0)]; + if (actor->movedir != turnaround && P_TryWalk(actor)) + return; } - } - if (d[2] != DI_NODIR) - { - actor->movedir = d[2]; - if (P_TryWalk (actor)) - return; + // try other directions + if (pr_newchasedir() > 200 || abs(deltay) > abs(deltax)) + { + swap (d[1], d[2]); + } + + if (d[1] == turnaround) + d[1] = DI_NODIR; + if (d[2] == turnaround) + d[2] = DI_NODIR; + + if (d[1] != DI_NODIR) + { + actor->movedir = d[1]; + if (P_TryWalk (actor)) + { + // either moved forward or attacked + return; + } + } + + if (d[2] != DI_NODIR) + { + actor->movedir = d[2]; + if (P_TryWalk (actor)) + return; + } } } } diff --git a/src/p_map.cpp b/src/p_map.cpp index a953700ab..30c3b4946 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -3393,11 +3393,14 @@ void P_TraceBleed (int damage, AActor *target, AActor *missile) void P_TraceBleed (int damage, AActor *target) { - fixed_t one = pr_tracebleed() << 24; - fixed_t two = (pr_tracebleed()-128) << 16; + if (target != NULL) + { + fixed_t one = pr_tracebleed() << 24; + fixed_t two = (pr_tracebleed()-128) << 16; - P_TraceBleed (damage, target->x, target->y, target->z + target->height/2, - target, one, two); + P_TraceBleed (damage, target->x, target->y, target->z + target->height/2, + target, one, two); + } } // diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index b4168e729..ca443b3df 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -382,6 +382,8 @@ void P_SerializeWorld (FArchive &arc) << si->Flags << si->LeftSide << si->RightSide; + if (SaveVersion >= 1575) + arc << si->Index; DBaseDecal::SerializeChain (arc, &si->AttachedDecals); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 13df61e97..3a5d451e5 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -69,6 +69,7 @@ void P_SpawnSlopeMakers (FMapThing *firstmt, FMapThing *lastmt); void P_SetSlopes (); void BloodCrypt (void *data, int key, int len); +void P_ClearUDMFKeys(); extern AActor *P_SpawnMapThing (FMapThing *mthing, int position); extern bool P_LoadBuildMap (BYTE *mapdata, size_t len, FMapThing **things, int *numthings); @@ -2331,6 +2332,7 @@ void P_LoadSideDefs2 (MapData * map) sd->SetTextureYOffset(LittleShort(msd->rowoffset)<linenum = NO_INDEX; sd->Flags = 0; + sd->Index = i; // killough 4/4/98: allow sidedef texture names to be overloaded // killough 4/11/98: refined to allow colormaps to work as wall @@ -3281,6 +3283,7 @@ void P_FreeLevelData () delete[] level.Scrolls; level.Scrolls = NULL; } + P_ClearUDMFKeys(); } extern msecnode_t *headsecnode; diff --git a/src/p_setup.h b/src/p_setup.h index 03b9dfc88..c751c989c 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -108,4 +108,7 @@ void P_LoadTranslator(const char *lumpname); void P_TranslateLineDef (line_t *ld, maplinedef_t *mld); int P_TranslateSectorSpecial (int); +int GetUDMFInt(int type, int index, const char *key); +fixed_t GetUDMFFixed(int type, int index, const char *key); + #endif diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 92bb3227d..52e93b693 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -123,6 +123,116 @@ extern TArray linemap; #define CHECK_N(f) if (!(namespace_bits&(f))) break; + +//=========================================================================== +// +// Storage of UDMF user properties +// +//=========================================================================== + +typedef TMap FUDMFKeyMap; + + +static FUDMFKeyMap UDMFKeys[4]; +// Things must be handled differently + +void P_ClearUDMFKeys() +{ + for(int i=0;i<4;i++) + { + UDMFKeys[i].Clear(); + } +} + +static int STACK_ARGS udmfcmp(const void *a, const void *b) +{ + FUDMFKey *A = (FUDMFKey*)a; + FUDMFKey *B = (FUDMFKey*)b; + + return int(A->Key) - int(B->Key); +} + +void FUDMFKeys::Sort() +{ + qsort(&(*this)[0], Size(), sizeof(FUDMFKey), udmfcmp); +} + +FUDMFKey *FUDMFKeys::Find(FName key) +{ + int min = 0, max = Size()-1; + + while (min <= max) + { + int mid = (min + max) / 2; + if ((*this)[mid].Key == key) + { + return &(*this)[mid]; + } + else if ((*this)[mid].Key <= key) + { + min = mid + 1; + } + else + { + max = mid - 1; + } + } + return NULL; +} + +//=========================================================================== +// +// Retrieves UDMF user properties +// +//=========================================================================== + +int GetUDMFInt(int type, int index, const char *key) +{ + assert(type >=0 && type <=3); + + if (index > 0) + { + FUDMFKeys *pKeys = UDMFKeys[type].CheckKey(index); + + if (pKeys != NULL) + { + FUDMFKey *pKey = pKeys->Find(key); + if (pKey != NULL) + { + return FLOAT2FIXED(pKey->IntVal); + } + } + } + return 0; +} + +fixed_t GetUDMFFixed(int type, int index, const char *key) +{ + assert(type >=0 && type <=3); + + if (index > 0) + { + FUDMFKeys *pKeys = UDMFKeys[type].CheckKey(index); + + if (pKeys != NULL) + { + FUDMFKey *pKey = pKeys->Find(key); + if (pKey != NULL) + { + return FLOAT2FIXED(pKey->FloatVal); + } + } + } + return 0; +} + + +//=========================================================================== +// +// UDMF parser +// +//=========================================================================== + struct UDMFParser { FScanner sc; @@ -131,6 +241,7 @@ struct UDMFParser bool isTranslated; bool isExtended; bool floordrop; + FString parsedString; TArray ParsedLines; TArray ParsedSides; @@ -148,7 +259,7 @@ struct UDMFParser //=========================================================================== // - // Parses a 'key = value' line of the map but doesn't read the semicolon + // Parses a 'key = value' line of the map // //=========================================================================== @@ -176,6 +287,13 @@ struct UDMFParser sc.Float = -sc.Float; } } + if (sc.TokenType == TK_StringConst) + { + parsedString = sc.String; + } + int savedtoken = sc.TokenType; + sc.MustGetToken(';'); + sc.TokenType = savedtoken; return key; } @@ -227,7 +345,7 @@ struct UDMFParser { sc.ScriptMessage("String value expected for key '%s'", key); } - return sc.String; + return parsedString; } void Flag(DWORD &value, int mask, const char *key) @@ -236,6 +354,61 @@ struct UDMFParser else value &= ~mask; } + + void AddUserKey(FName key, int kind, int index) + { + FUDMFKeys &keyarray = UDMFKeys[kind][index]; + + for(unsigned i=0; i < keyarray.Size(); i++) + { + if (keyarray[i].Key == key) + { + switch (sc.TokenType) + { + case TK_Int: + keyarray[i] = sc.Number; + break; + case TK_Float: + keyarray[i] = sc.Float; + break; + default: + case TK_String: + keyarray[i] = parsedString; + break; + case TK_True: + keyarray[i] = 1; + break; + case TK_False: + keyarray[i] = 0; + break; + } + return; + } + } + FUDMFKey ukey; + ukey.Key = key; + switch (sc.TokenType) + { + case TK_Int: + ukey = sc.Number; + break; + case TK_Float: + ukey = sc.Float; + break; + default: + case TK_String: + ukey = parsedString; + break; + case TK_True: + ukey = 1; + break; + case TK_False: + ukey = 0; + break; + } + keyarray.Push(ukey); + } + //=========================================================================== // // Parse a thing block @@ -377,9 +550,12 @@ struct UDMFParser break; default: + if (!strnicmp("user_", key.GetChars(), 5)) + { + // Custom user key - handle later + } break; } - sc.MustGetToken(';'); } // Thing specials are only valid in namespaces with Hexen-type specials // and in ZDoomTranslated - which will use the translator on them. @@ -412,7 +588,7 @@ struct UDMFParser // //=========================================================================== - void ParseLinedef(line_t *ld) + void ParseLinedef(line_t *ld, int index) { bool passuse = false; bool strifetrans = false; @@ -435,11 +611,11 @@ struct UDMFParser { case NAME_V1: ld->v1 = (vertex_t*)(intptr_t)CheckInt(key); // must be relocated later - break; + continue; case NAME_V2: ld->v2 = (vertex_t*)(intptr_t)CheckInt(key); // must be relocated later - break; + continue; case NAME_Special: ld->special = CheckInt(key); @@ -449,19 +625,19 @@ struct UDMFParser ld->special = 0; // NULL all specials which don't exist in Hexen } - break; + continue; case NAME_Id: ld->id = CheckInt(key); - break; + continue; case NAME_Sidefront: ld->sidenum[0] = CheckInt(key); - break; + continue; case NAME_Sideback: ld->sidenum[1] = CheckInt(key); - break; + continue; case NAME_Arg0: case NAME_Arg1: @@ -469,63 +645,63 @@ struct UDMFParser case NAME_Arg3: case NAME_Arg4: ld->args[int(key)-int(NAME_Arg0)] = CheckInt(key); - break; + continue; case NAME_Blocking: Flag(ld->flags, ML_BLOCKING, key); - break; + continue; case NAME_Blockmonsters: Flag(ld->flags, ML_BLOCKMONSTERS, key); - break; + continue; case NAME_Twosided: Flag(ld->flags, ML_TWOSIDED, key); - break; + continue; case NAME_Dontpegtop: Flag(ld->flags, ML_DONTPEGTOP, key); - break; + continue; case NAME_Dontpegbottom: Flag(ld->flags, ML_DONTPEGBOTTOM, key); - break; + continue; case NAME_Secret: Flag(ld->flags, ML_SECRET, key); - break; + continue; case NAME_Blocksound: Flag(ld->flags, ML_SOUNDBLOCK, key); - break; + continue; case NAME_Dontdraw: Flag(ld->flags, ML_DONTDRAW, key); - break; + continue; case NAME_Mapped: Flag(ld->flags, ML_MAPPED, key); - break; + continue; case NAME_Jumpover: CHECK_N(St | Zd | Zdt | Va) Flag(ld->flags, ML_RAILING, key); - break; + continue; case NAME_Blockfloating: CHECK_N(St | Zd | Zdt | Va) Flag(ld->flags, ML_BLOCK_FLOATERS, key); - break; + continue; case NAME_Transparent: CHECK_N(St | Zd | Zdt | Va) strifetrans = CheckBool(key); - break; + continue; case NAME_Passuse: CHECK_N(Dm | Zd | Zdt | Va) passuse = CheckBool(key); - break; + continue; default: break; @@ -536,39 +712,39 @@ struct UDMFParser { case NAME_Playercross: Flag(ld->activation, SPAC_Cross, key); - break; + continue; case NAME_Playeruse: Flag(ld->activation, SPAC_Use, key); - break; + continue; case NAME_Monstercross: Flag(ld->activation, SPAC_MCross, key); - break; + continue; case NAME_Impact: Flag(ld->activation, SPAC_Impact, key); - break; + continue; case NAME_Playerpush: Flag(ld->activation, SPAC_Push, key); - break; + continue; case NAME_Missilecross: Flag(ld->activation, SPAC_PCross, key); - break; + continue; case NAME_Monsteruse: Flag(ld->activation, SPAC_MUse, key); - break; + continue; case NAME_Monsterpush: Flag(ld->activation, SPAC_MPush, key); - break; + continue; case NAME_Repeatspecial: Flag(ld->flags, ML_REPEAT_SPECIAL, key); - break; + continue; default: break; @@ -579,7 +755,7 @@ struct UDMFParser { case NAME_Alpha: ld->Alpha = CheckFixed(key); - break; + continue; case NAME_Renderstyle: { @@ -587,61 +763,65 @@ struct UDMFParser if (!stricmp(str, "translucent")) ld->flags &= ~ML_ADDTRANS; else if (!stricmp(str, "add")) ld->flags |= ML_ADDTRANS; else sc.ScriptMessage("Unknown value \"%s\" for 'renderstyle'\n", str); - break; + continue; } case NAME_Anycross: Flag(ld->activation, SPAC_AnyCross, key); - break; + continue; case NAME_Monsteractivate: Flag(ld->flags, ML_MONSTERSCANACTIVATE, key); - break; + continue; case NAME_Blockplayers: Flag(ld->flags, ML_BLOCK_PLAYERS, key); - break; + continue; case NAME_Blockeverything: Flag(ld->flags, ML_BLOCKEVERYTHING, key); - break; + continue; case NAME_Zoneboundary: Flag(ld->flags, ML_ZONEBOUNDARY, key); - break; + continue; case NAME_Clipmidtex: Flag(ld->flags, ML_CLIP_MIDTEX, key); - break; + continue; case NAME_Wrapmidtex: Flag(ld->flags, ML_WRAP_MIDTEX, key); - break; + continue; case NAME_Midtex3d: Flag(ld->flags, ML_3DMIDTEX, key); - break; + continue; case NAME_Checkswitchrange: Flag(ld->flags, ML_CHECKSWITCHRANGE, key); - break; + continue; case NAME_Firstsideonly: Flag(ld->flags, ML_FIRSTSIDEONLY, key); - break; + continue; case NAME_blockprojectiles: Flag(ld->flags, ML_BLOCKPROJECTILE, key); - break; + continue; case NAME_blockuse: Flag(ld->flags, ML_BLOCKUSE, key); - break; + continue; default: break; } - sc.MustGetToken(';'); + + if (!strnicmp("user_", key.GetChars(), 5)) + { + AddUserKey(key, UDMF_Line, index); + } } if (isTranslated) @@ -671,7 +851,7 @@ struct UDMFParser // //=========================================================================== - void ParseSidedef(side_t *sd, mapsidedef_t *sdt) + void ParseSidedef(side_t *sd, mapsidedef_t *sdt, int index) { fixed_t texofs[2]={0,0}; @@ -688,27 +868,27 @@ struct UDMFParser { case NAME_Offsetx: texofs[0] = CheckInt(key) << FRACBITS; - break; + continue; case NAME_Offsety: texofs[1] = CheckInt(key) << FRACBITS; - break; + continue; case NAME_Texturetop: strncpy(sdt->toptexture, CheckString(key), 8); - break; + continue; case NAME_Texturebottom: strncpy(sdt->bottomtexture, CheckString(key), 8); - break; + continue; case NAME_Texturemiddle: strncpy(sdt->midtexture, CheckString(key), 8); - break; + continue; case NAME_Sector: sd->sector = (sector_t*)(intptr_t)CheckInt(key); - break; + continue; default: break; @@ -718,53 +898,55 @@ struct UDMFParser { case NAME_offsetx_top: sd->SetTextureXOffset(side_t::top, CheckFixed(key)); - break; + continue; case NAME_offsety_top: sd->SetTextureYOffset(side_t::top, CheckFixed(key)); - break; + continue; case NAME_offsetx_mid: sd->SetTextureXOffset(side_t::mid, CheckFixed(key)); - break; + continue; case NAME_offsety_mid: sd->SetTextureYOffset(side_t::mid, CheckFixed(key)); - break; + continue; case NAME_offsetx_bottom: sd->SetTextureXOffset(side_t::bottom, CheckFixed(key)); - break; + continue; case NAME_offsety_bottom: sd->SetTextureYOffset(side_t::bottom, CheckFixed(key)); - break; + continue; case NAME_light: sd->SetLight(CheckInt(key)); - break; + continue; case NAME_lightabsolute: if (CheckBool(key)) sd->Flags |= WALLF_ABSLIGHTING; else sd->Flags &= ~WALLF_ABSLIGHTING; - break; + continue; case NAME_nofakecontrast: if (CheckBool(key)) sd->Flags |= WALLF_NOFAKECONTRAST; else sd->Flags &= WALLF_NOFAKECONTRAST; - break; + continue; case NAME_smoothlighting: if (CheckBool(key)) sd->Flags |= WALLF_SMOOTHLIGHTING; else sd->Flags &= ~WALLF_SMOOTHLIGHTING; - break; + continue; default: break; } - - sc.MustGetToken(';'); + if (!strnicmp("user_", key.GetChars(), 5)) + { + AddUserKey(key, UDMF_Side, index); + } } // initialization of these is delayed to allow separate offsets and add them with the global ones. sd->AddTextureXOffset(side_t::top, texofs[0]); @@ -818,23 +1000,23 @@ struct UDMFParser { case NAME_Heightfloor: sec->SetPlaneTexZ(sector_t::floor, CheckInt(key) << FRACBITS); - break; + continue; case NAME_Heightceiling: sec->SetPlaneTexZ(sector_t::ceiling, CheckInt(key) << FRACBITS); - break; + continue; case NAME_Texturefloor: SetTexture(sec, index, sector_t::floor, CheckString(key)); - break; + continue; case NAME_Textureceiling: SetTexture(sec, index, sector_t::ceiling, CheckString(key)); - break; + continue; case NAME_Lightlevel: sec->lightlevel = (BYTE)clamp(CheckInt(key), 0, 255); - break; + continue; case NAME_Special: sec->special = (short)CheckInt(key); @@ -844,11 +1026,11 @@ struct UDMFParser if (sec->special < 0 || sec->special > 255 || !HexenSectorSpecialOk[sec->special]) sec->special = 0; // NULL all unknown specials } - break; + continue; case NAME_Id: sec->tag = (short)CheckInt(key); - break; + continue; default: break; @@ -858,99 +1040,102 @@ struct UDMFParser { case NAME_Xpanningfloor: sec->SetXOffset(sector_t::floor, CheckFixed(key)); - break; + continue; case NAME_Ypanningfloor: sec->SetYOffset(sector_t::floor, CheckFixed(key)); - break; + continue; case NAME_Xpanningceiling: sec->SetXOffset(sector_t::ceiling, CheckFixed(key)); - break; + continue; case NAME_Ypanningceiling: sec->SetYOffset(sector_t::ceiling, CheckFixed(key)); - break; + continue; case NAME_Xscalefloor: sec->SetXScale(sector_t::floor, CheckFixed(key)); - break; + continue; case NAME_Yscalefloor: sec->SetYScale(sector_t::floor, CheckFixed(key)); - break; + continue; case NAME_Xscaleceiling: sec->SetXScale(sector_t::ceiling, CheckFixed(key)); - break; + continue; case NAME_Yscaleceiling: sec->SetYScale(sector_t::ceiling, CheckFixed(key)); - break; + continue; case NAME_Rotationfloor: sec->SetAngle(sector_t::floor, CheckAngle(key)); - break; + continue; case NAME_Rotationceiling: sec->SetAngle(sector_t::ceiling, CheckAngle(key)); - break; + continue; case NAME_Lightfloor: sec->SetPlaneLight(sector_t::floor, CheckInt(key)); - break; + continue; case NAME_Lightceiling: sec->SetPlaneLight(sector_t::ceiling, CheckInt(key)); - break; + continue; case NAME_Lightfloorabsolute: if (CheckBool(key)) sec->ChangeFlags(sector_t::floor, 0, SECF_ABSLIGHTING); else sec->ChangeFlags(sector_t::floor, SECF_ABSLIGHTING, 0); - break; + continue; case NAME_Lightceilingabsolute: if (CheckBool(key)) sec->ChangeFlags(sector_t::ceiling, 0, SECF_ABSLIGHTING); else sec->ChangeFlags(sector_t::ceiling, SECF_ABSLIGHTING, 0); - break; + continue; case NAME_Gravity: sec->gravity = float(CheckFloat(key)); - break; + continue; case NAME_Lightcolor: lightcolor = CheckInt(key); - break; + continue; case NAME_Fadecolor: fadecolor = CheckInt(key); - break; + continue; case NAME_Desaturation: desaturation = int(255*CheckFloat(key)); - break; + continue; case NAME_Silent: Flag(sec->Flags, SECF_SILENT, key); - break; + continue; case NAME_NoRespawn: Flag(sec->Flags, SECF_NORESPAWN, key); - break; + continue; case NAME_Nofallingdamage: Flag(sec->Flags, SECF_NOFALLINGDAMAGE, key); - break; + continue; case NAME_Dropactors: Flag(sec->Flags, SECF_FLOORDROP, key); - break; + continue; default: break; } - sc.MustGetToken(';'); + if (!strnicmp("user_", key.GetChars(), 5)) + { + AddUserKey(key, UDMF_Sector, index); + } } sec->floorplane.d = -sec->GetPlaneTexZ(sector_t::floor); @@ -1196,14 +1381,14 @@ struct UDMFParser else if (sc.Compare("linedef")) { line_t li; - ParseLinedef(&li); + ParseLinedef(&li, ParsedLines.Size()); ParsedLines.Push(li); } else if (sc.Compare("sidedef")) { side_t si; mapsidedef_t st; - ParseSidedef(&si, &st); + ParseSidedef(&si, &st, ParsedSides.Size()); ParsedSides.Push(si); ParsedSideTextures.Push(st); } diff --git a/src/r_defs.h b/src/r_defs.h index 5b70cdc31..f28d22ad6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -85,6 +85,70 @@ class FBitmap; struct FCopyInfo; class DInterpolation; +enum +{ + UDMF_Line, + UDMF_Side, + UDMF_Sector, + UDMF_Thing +}; + + +struct FUDMFKey +{ + enum + { + UDMF_Int, + UDMF_Float, + UDMF_String + }; + + FName Key; + int Type; + int IntVal; + double FloatVal; + FString StringVal; + + FUDMFKey() + { + } + + FUDMFKey& operator =(int val) + { + Type = UDMF_Int; + IntVal = val; + FloatVal = val; + StringVal = ""; + return *this; + } + + FUDMFKey& operator =(double val) + { + Type = UDMF_Float; + IntVal = int(val); + FloatVal = val; + StringVal = ""; + return *this; + } + + FUDMFKey& operator =(const FString &val) + { + Type = UDMF_String; + IntVal = strtol(val, NULL, 0); + FloatVal = strtod(val, NULL); + StringVal = val; + return *this; + } + +}; + +class FUDMFKeys : public TArray +{ +public: + void Sort(); + FUDMFKey *Find(FName key); +}; + // // The SECTORS record, at runtime. // Stores things/mobjs. @@ -663,6 +727,7 @@ struct side_t WORD TexelLength; SWORD Light; BYTE Flags; + int Index; // needed to access custom UDMF fields which are stored in loading order. int GetLightLevel (bool foggy, int baselight) const; diff --git a/src/resourcefiles/resourcefile.cpp b/src/resourcefiles/resourcefile.cpp index 4960ce51b..da3f54003 100644 --- a/src/resourcefiles/resourcefile.cpp +++ b/src/resourcefiles/resourcefile.cpp @@ -147,6 +147,12 @@ void FResourceLump::LumpNameSetup(char *iname) } } +//========================================================================== +// +// Checks for embedded resource files +// +//========================================================================== + void FResourceLump::CheckEmbedded() { // Checks for embedded archives @@ -155,6 +161,7 @@ void FResourceLump::CheckEmbedded() { // Mark all embedded WADs Flags |= LUMPF_EMBEDDED; + memset(Name, 0, 8); } /* later else @@ -162,10 +169,12 @@ void FResourceLump::CheckEmbedded() if (c==NULL) c = strstr(Name, ".zip"); if (c==NULL) c = strstr(Name, ".pk3"); if (c==NULL) c = strstr(Name, ".7z"); + if (c==NULL) c = strstr(Name, ".pak"); if (c && strlen(c) <= 4) { // Mark all embedded archives in any directory Flags |= LUMPF_EMBEDDED; + memset(Name, 0, 8); } } */ diff --git a/wadsrc/static/actors/heretic/hereticmisc.txt b/wadsrc/static/actors/heretic/hereticmisc.txt index 01d0ac771..b3ed44c8e 100644 --- a/wadsrc/static/actors/heretic/hereticmisc.txt +++ b/wadsrc/static/actors/heretic/hereticmisc.txt @@ -68,6 +68,7 @@ ACTOR PodGenerator 43 +NOBLOCKMAP +NOSECTOR +DONTSPLASH + AttackSound "misc/podgrow" action native A_MakePod (class podtype = "Pod");