• R/O
  • SSH

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

This is a fork of Zandronum used on servers hosted by The Sentinels Playground (TSPG), Euroboros (EB), and Down Under Doomers (DUD).


File Info

Rev. 477763320dea22694fb73db8c18b05b752805c56
Größe 6,283 Bytes
Zeit 2008-03-23 17:42:47
Autor Benjamin Berkels
Log Message

Upgraded the GZDoom renderer to 1.1.00.
Ported changes from ZDoom revision 710-748:
- Updated lempar.c to v1.31.
- Added .txt files to the list of types (wad, zip, and pk3) that can be loaded without listing them after -file.
- Fonts that are created by the ACS setfont command to wrap a texture now support animated textures.
- FON2 fonts can now use their full palette for CR_UNTRANSLATED when drawn with the hardware 2D path instead of being restricted to the game palette.
- Fixed: Toggling vid_vsync would reset the displayed fullscreen gamma to 1 on a Radeon 9000.
- Added back the off-by-one palette handling, but in a much more limited scope than before. The skipped entry is assumed to always be at 248, and it is assumed that all Shader Model 1.4 cards suffer from this. That's because all SM1.4 cards are based on variants of the ATI R200 core, and the RV250 in a Radeon 9000 craps up like this. I see no reason to assume that other flavors of the R200 are any different. (Interesting note: With the Radeon 9000, D3DTADDRESS_CLAMP is an invalid address mode when using the debug Direct3D 9 runtime, but it works perfectly fine with the retail Direct3D 9 runtime.) (Insight: The R200 probably uses bytes for all its math inside pixel shaders. That would explain perfectly why I can't use constants greater than 1 with PS1.4 and why it can't do an exact mapping to every entry in the color palette.
- Fixed: The software shaded drawer did not work for 2D, because its selected "color"map was replaced with the identitymap before being used.
- Fixed: I cannot use Printf to output messages before the framebuffer was completely setup, meaning that Shader Model 1.4 cards could not change resolution.
- I have decided to let remap palettes specify variable alpha values for their colors. D3DFB no longer forces them to 255.
- Updated re2c to version 0.12.3.
- Fixed: A_Wander used threshold as a timer, when it should have used reactiontime.
- Fixed: A_CustomRailgun would not fire at all for actors without a target when the aim parameter was disabled.
- Made the warp command work in multiplayer, again courtesy of Karate Chris.
- Fixed: Trying to spawn a bot while not in a game made for a crashing time. (Patch courtesy of Karate Chris.)
- Removed some floating point math from hu_scores.cpp that somebody's GCC gave warnings for (not mine, though).
- Fixed: The SBarInfo drawbar command crashed if the sprite image was unavailable.
- Fixed: FString::operator=(const char *) did not release its old buffer when being assigned to the null string.
- The scanner no longer has an upper limit on the length of strings it accepts, though short strings will be faster than long ones.
- Moved all the text scanning functions into a class. Mainly, this means that multiple script scanner states can be stored without being forced to do so recursively. I think I might be taking advantage of that in the near future. Possibly. Maybe.
- Removed some potential buffer overflows from the decal parser.
- Applied Blzut3's SBARINFO update #9:

  • Fixed: When using even length values in drawnumber it would cap to a 98 value instead of a 99 as intended.
  • The SBarInfo parser can now accept negatives for coordinates. This doesn't allow much right now, but later I plan to add better fullscreen hud support in which the negatives will be more useful. This also cleans up the source a bit since all calls for (x, y) coordinates are with the function getCoordinates().

- Added support for stencilling actors.
- Added support for non-black colors specified with DTA_ColorOverlay to the software renderer.
- Fixed: The inverse, gold, red, and green fixed colormaps each allocated space for 32 different colormaps, even though each only used the first one.
- Added two new blending flags to make reverse subtract blending more useful: STYLEF_InvertSource and STYLEF_InvertOverlay. These invert the color that gets blended with the background, since that seems like a good idea for reverse subtraction. They also work with the other two blending operations.
- Added subtract and reverse subtract blending operations to the renderer. Since the ERenderStyle enumeration was getting rather unwieldy, I converted it into a new FRenderStyle structure that lets each parameter of the blending equation be set separately. This simplified the set up for the blend quite a bit, and it means a number of new combinations are available by setting the parameters properly.
- Undid some of the changes from lempar.c v1.30->v1.31, because it broke error handling.
- Fixed: dehsupp/scanner.re defined "}" as the token RPAREN. dehsupp/parse.y also defined action_list_def as needing a RBARCE. I'm surprised it worked at all before. I guess Lemon really was too accepting.
- Changed the way that xlatcc handles include statements so that I don't need to modify the logic of lempar.c. I also discovered that the grammar was improperly defined and only accepted the first statement. It worked before because Lemon used to accept multiple times before reaching the EOF token. I have also verified that it is still generating the proper lumps.
- Removed some unused wadsrc files from the repository.
- Fixed my re2c upgrade.
- Updated lemon.c to v1.53.
- GCC cleanup.
- Fixed: ACS used incompatible values for APROP_RenderStyle. It needs to use the exact same values as previous ZDoom versions
- Added a DECORATE 'stencilcolor' property so that the stencil render style can be used.
- Added some NULL pointer checks to the font loading code.
- Added Karate Chris's patch for teamplay MAPINFO option.
- Added Karate Chris's patch for custom damage color per player class.
- Added Karate Chris's patch for respawnlimit skill property.
- Added Karate Chris's patch for Strife quit messages.
- Fixed: P_RailAttack ignored the puff's damage type.
- Got rid of most TexMan.AddPatch calls because they are no longer needed.
- Got rid of R_InitPatches because the new texture init code needs to preload everything to work correctly.
- Rewrote texture manager initialization to order textures primarily by WAD rather than by type. This way later textures will always override earlier ones. The only exception is that TEX_MiscPatch are only used as a fallback if nothing else can be found.
- Optimized the tryany case of FTextureManager::CheckForTexture. It is not necessary to scan the hash chain twice. The required information can be retrieved during the first pass as easily and even offers a little more control.
- Made FFont destructor virtual.
- Added 'Ice' translation to DECORATE.
- Fixed: P_RailAttack() crashed if you didn't specify a puff for a rail.
- Decided that allowing arbitrary alpha values for color remaps isn't so hot. Changed it back the way it was.
- Added preloading of fonts to reduce the chance that characters from a single font will require more than one hardware texture to display
- Changed license for r_data.cpp because there isn't anything of id's original code left in that file.
- Cleaned up r_data.cpp.
- Fixed: FTextureManager::FindTexture should not print error messages if it doesn't find the texture.
- Added Karate Chris's patch for fixing Strife quit messages.
- added a mastervolume CVAR for Timidity because for me its output is considerably louder than everything else.
- reverted removal of AddPatch call in crosshair initialization.
- Modified makewad.c so that it doesn't write file names with '[]' to the dependency file. Apparenly make can't handle these names and an incomplete list is still better than something that doesn't work at all.
- Added SnowKate709's APROP_MaxHealth submission.
- Fixed: FTexture::GetScaledWidth/Height always rounded down which could result in imprecisions (e.g. when scaling from 128 to 96.)
- Added a PrecacheTexture virtual function to DFrameBuffer because it's the renderer which should decide how to precache a texture.
- Added pixel-doubled and -quadrupled screen modes to D3DFB so that users with recent NVidia drivers can still use resolutions below 640x480, since NVidia saw fit to remove all support for them.
- I think GetScaledWidth/Height rounding should be correct now.
- Added support for AttackZOffset to P_RailAttack.
- Fixed: ParseDrawTextureTags read DTA_RenderStyle as ERenderStyle, not FRenderStyle.
- Fixed: The render style table for old decorations was missing STYLE_Stencil so STYLE_Translucent was mapped incorrectly.
- fixed DEHSUPP values for render styles.
- Fixed: The STYLEF_Alpha1 flag intended for STYLE_Normal was set for STYLE_Fuzzy.
- Removed support for numeric flags from sbarinfo's drawmugshot command since it was previously declared unrecommended and deprecated.
- Added Blzut3's sbarinfo update #10:

  • Fixed: drawmugshot now adjust to the player's max health like it should.
  • drawgem can now accept negative paddings.
  • Added: You can now specify a border on drawbar which will reserve x amount of pixels on each side of the fg image.
  • Added: weaponammo command which allows for determining what kind of ammo the current weapon uses.
  • Added: Drawkeybar to SBarInfo

- Applied a modified version of Karate Chris's screenshot naming patch.
- Sbarinfo optimization: Creating and destroying bar textures every frame is a relatively expensive operation. We can skip the custom texture entirely and just draw the bars directly to the screen, using the clipping parameters for DrawTexture(). This also means bars are no longer limited to the game palette, and the bar itself has the same resolution as the screen.
- Fixed: Morphed pig and chicken players made normal human *usefail sounds.
- G_DoSaveGame() now receives the filename and description from its arguments rather than global variables, so autosaves and manual saves can be done in close proximity to each other without overwriting the parameters for one of them.
- Fixed potential buffer overrun in G_SaveGame() and added a check so that you can't interfere with saves that are still pending.
- Fixed: P_LineAttack() creates temporary puffs to get damage types, but this had the side effect of creating particles for the puff.
- Fixed: The Heretic status bar tried to use the graphic "SELECTBOX" for the inventory selector. The correct name is "SELECTBO".
- Fixed: Using allowrespawn for a single-player map would fire off enter scripts instead of respawn script because the player wasn't assigned the state PST_REBORN.
- Fixed: P_CheckMissileSpawn() now passes the BlockingMobj to P_ExplodeMissile() so that it can select the appropriate death state.
- Added the manifest to MinGW-compiled builds of updaterevision so you can build under Vista with MinGW without needing administrative privileges. (But I still want to know why Vista thinks it needs elevated privileges without a manifest telling it otherwise.)
- Using four 0xFF bytes for the final note of an IMF song should signal the end of the song.
- Updated the GCC-targeted makefiles to turn off two optimizations that cause fmopl.cpp to compile incorrectly: tree-dominator-opts and tree-fre
- Fixed: D_ReadUserInfoString() parsed the final element of a compact string as the empty string. Since that was the player class, this meant that any games with more than one class would pick a random class in multiplayer.
- Fixed: FCanvasTexture::RenderView() should not have color 0 in its output.
- Applied Blzut3's sbarinfo update #11:

  • SBarInfo will also accept a '|' between flags for those who are really bothered by the indefinite "arguments" in the middle of the statement.
  • Added: completeBorder. When set to true SBarInfo will draw the border where the status bar normally goes.
  • Fixed: I forgot to accept TK_None on "base" and "statusbar".
  • Fixed: "base" was apparently broken when the SBarInfo init code was moved to d_main.cpp. Also, if "base Strife" was used then it would not use the default log message of "find help".

- Modified FLAC/share/alloc.h to define SIZE_T_MAX if it isn't defined already. For some reason, a stock install of MinGW doesn't define it, but if you compile your own GCC, it installs headers that do.
- Changed the way that the makefiles detect MSYS to a method that should be more foolproof, thanks to changes in MSYS.
- Fixed: G_StartTravel() inadvertantly removed players' TIDs.
- Fixed: Turning off follow mode with automap rotating enabled did not function in an easy-to-understand manner.
- Fixed: D_AddWildFile() blindly assumed that all matches were files.
- Added back the dead player check to CheckIfExitIsGood(), but now it applies only if the next map is part of the same hub. Otherwise, you can still exit the map while dead.
- Removed the SpawnedPuff global variable and made it a return value from P_LineAttack().
- Fixed: P_SpawnPuff() played sounds for temporary puffs.
- GCC declaration fix for AM_ToggleFollowPlayer
- Added the ACS script type "return". These are executed by players who return to a map they've previously been to. This is analagous to enter scripts, but whereas enter scripts execute only the first time a player enters a map, return scripts execute all but the first time.
- Improved map scrolling when rotation is on and follow mode is off.
- Removed most checks on vid_hw2d/test2d. This now gets checked only once per frame to avoid the remote possibility that it could change during the middle of drawing the frame and cause strange things to happen.
- Renamed test2d to vid_hw2d.
- Added Karate Chris's patch for 0-tid == activator in action specials Thing_SetSpecial and Thing_SetTranslation.
- -moved BUGS_FORUM_URL to version.h
- Added missing NULL pointer checks to Karate Chris's latest changes.
- Version bump to 2.2.0.
- Disabled console alpha when the console is fullscreen.
- Re-enabled maybedrawnow for the software renderer. This should be replaced with a different progress bar implementation at some point that can work with hardware graphics.

SVN r1254 (latestzdoom)

Content

#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "globals.h"
#include "substr.h"
#include "dfa.h"

namespace re2c
{

void prtChOrHex(std::ostream& o, uint c, bool useTalx)
{
	int oc = (int)(re2c::wFlag || !useTalx ? c : re2c::talx[c]);

	if ((oc < 256) && isprint(oc))
	{
		o << '\'';
		prtCh(o, c);
		o << '\'';
	}
	else
	{
		prtHex(o, c);
	}
}

void prtHex(std::ostream& o, uint c, bool useTalx)
{
	int oc = (int)(re2c::wFlag || !useTalx ? c : re2c::talx[c]);

	if (re2c::uFlag)
	{
		o << "0x"
		  << hexCh(oc >> 28)
		  << hexCh(oc >> 24)
		  << hexCh(oc >> 20)
		  << hexCh(oc >> 16)
		  << hexCh(oc >> 12)
		  << hexCh(oc >>  8)
		  << hexCh(oc >>  4)
		  << hexCh(oc);
	}
	else if (re2c::wFlag)
	{
		o << "0x"
		  << hexCh(oc >> 12)
		  << hexCh(oc >>  8)
		  << hexCh(oc >>  4)
		  << hexCh(oc);
	}
	else
	{
		o << "0x"
		  << hexCh(oc >>  4) 
		  << hexCh(oc);
	}
}

void prtCh(std::ostream& o, uint c, bool useTalx)
{
	int oc = (int)(re2c::wFlag || !useTalx ? c : re2c::talx[c]);

	switch (oc)
	{
		case '\'':
		o << "\\'";
		break;

		case '\n':
		o << "\\n";
		break;

		case '\t':
		o << "\\t";
		break;

		case '\v':
		o << "\\v";
		break;

		case '\b':
		o << "\\b";
		break;

		case '\r':
		o << "\\r";
		break;

		case '\f':
		o << "\\f";
		break;

		case '\a':
		o << "\\a";
		break;

		case '\\':
		o << "\\\\";
		break;

		default:

		if ((oc < 256) && isprint(oc))
		{
			o << (char) oc;
		}
		else if (re2c::uFlag)
		{
			o << "0x"
			  << hexCh(oc >> 20)
			  << hexCh(oc >> 16)
			  << hexCh(oc >> 12)
			  << hexCh(oc >>  8)
			  << hexCh(oc >>  4)
			  << hexCh(oc);
		}
		else if (re2c::wFlag)
		{
			o << "0x"
			  << hexCh(oc >> 12)
			  << hexCh(oc >>  8)
			  << hexCh(oc >>  4)
			  << hexCh(oc);
		}
		else
		{
			o << '\\' << octCh(oc / 64) << octCh(oc / 8) << octCh(oc);
		}
	}
}

void printSpan(std::ostream& o, uint lb, uint ub)
{
	if (lb > ub)
	{
		o << "*";
	}

	o << "[";

	if ((ub - lb) == 1)
	{
		prtCh(o, lb);
	}
	else
	{
		prtCh(o, lb);
		o << "-";
		prtCh(o, ub - 1);
	}

	o << "]";
}

uint Span::show(std::ostream &o, uint lb) const
{
	if (to)
	{
		printSpan(o, lb, ub);
		o << " " << to->label << "; ";
	}

	return ub;
}

std::ostream& operator<<(std::ostream &o, const State &s)
{
	o << "state " << s.label;

	if (s.rule)
	{
		o << " accepts " << s.rule->accept;
	}

	o << "\n";

	uint lb = 0;

	for (uint i = 0; i < s.go.nSpans; ++i)
	{
		lb = s.go.span[i].show(o, lb);
	}

	return o;
}

std::ostream& operator<<(std::ostream &o, const DFA &dfa)
{
	for (State *s = dfa.head; s; s = s->next)
	{
		o << s << "\n\n";
	}

	return o;
}

State::State()
	: label(0)
	, rule(NULL)
	, next(0)
	, link(NULL)
	, depth(0)
	, kCount(0)
	, kernel(NULL)
	, isPreCtxt(false)
	, isBase(false)
	, go()
	, action(NULL)
{
}

State::~State()
{
	delete action;
	delete [] kernel;
	delete [] go.span;
}

static Ins **closure(Ins **cP, Ins *i)
{
	while (!isMarked(i))
	{
		mark(i);
		*(cP++) = i;

		if (i->i.tag == FORK)
		{
			cP = closure(cP, i + 1);
			i = (Ins*) i->i.link;
		}
		else if (i->i.tag == GOTO || i->i.tag == CTXT)
		{
			i = (Ins*) i->i.link;
		}
		else
			break;
	}

	return cP;
}

struct GoTo
{
	Char	ch;
	void	*to;
};

DFA::DFA(Ins *ins, uint ni, uint lb, uint ub, Char *rep)
	: lbChar(lb)
	, ubChar(ub)
	, nStates(0)
	, head(NULL)
	, tail(&head)
	, toDo(NULL)
{
	Ins **work = new Ins * [ni + 1];
	uint nc = ub - lb;
	GoTo *goTo = new GoTo[nc];
	Span *span = new Span[nc];
	memset((char*) goTo, 0, nc*sizeof(GoTo));
	findState(work, closure(work, &ins[0]) - work);

	while (toDo)
	{
		State *s = toDo;
		toDo = s->link;

		Ins **cP, **iP, *i;
		uint nGoTos = 0;
		uint j;

		s->rule = NULL;

		for (iP = s->kernel; (i = *iP); ++iP)
		{
			if (i->i.tag == CHAR)
			{
				for (Ins *j = i + 1; j < (Ins*) i->i.link; ++j)
				{
					if (!(j->c.link = goTo[j->c.value - lb].to))
						goTo[nGoTos++].ch = j->c.value;

					goTo[j->c.value - lb].to = j;
				}
			}
			else if (i->i.tag == TERM)
			{
				if (!s->rule || ((RuleOp*) i->i.link)->accept < s->rule->accept)
					s->rule = (RuleOp*) i->i.link;
			}
			else if (i->i.tag == CTXT)
			{
				s->isPreCtxt = true;
			}
		}

		for (j = 0; j < nGoTos; ++j)
		{
			GoTo *go = &goTo[goTo[j].ch - lb];
			i = (Ins*) go->to;

			for (cP = work; i; i = (Ins*) i->c.link)
				cP = closure(cP, i + i->c.bump);

			go->to = findState(work, cP - work);
		}

		s->go.nSpans = 0;

		for (j = 0; j < nc;)
		{
			State *to = (State*) goTo[rep[j]].to;

			while (++j < nc && goTo[rep[j]].to == to) ;

			span[s->go.nSpans].ub = lb + j;

			span[s->go.nSpans].to = to;

			s->go.nSpans++;
		}

		for (j = nGoTos; j-- > 0;)
			goTo[goTo[j].ch - lb].to = NULL;

		s->go.span = new Span[s->go.nSpans];

		memcpy((char*) s->go.span, (char*) span, s->go.nSpans*sizeof(Span));

		(void) new Match(s);

	}

	delete [] work;
	delete [] goTo;
	delete [] span;
}

DFA::~DFA()
{
	State *s;

	while ((s = head))
	{
		head = s->next;
		delete s;
	}
}

void DFA::addState(State **a, State *s)
{
	s->label = nStates++;
	s->next = *a;
	*a = s;

	if (a == tail)
		tail = &s->next;
}

State *DFA::findState(Ins **kernel, uint kCount)
{
	Ins **cP, **iP, *i;
	State *s;

	kernel[kCount] = NULL;

	cP = kernel;

	for (iP = kernel; (i = *iP); ++iP)
	{
		if (i->i.tag == CHAR || i->i.tag == TERM || i->i.tag == CTXT)
		{
			*cP++ = i;
		}
		else
		{
			unmark(i);
		}
	}

	kCount = cP - kernel;
	kernel[kCount] = NULL;

	for (s = head; s; s = s->next)
	{
		if (s->kCount == kCount)
		{
			for (iP = s->kernel; (i = *iP); ++iP)
				if (!isMarked(i))
					goto nextState;

			goto unmarkAll;
		}

nextState:
		;
	}

	s = new State;
	addState(tail, s);
	s->kCount = kCount;
	s->kernel = new Ins * [kCount + 1];
	memcpy(s->kernel, kernel, (kCount + 1)*sizeof(Ins*));
	s->link = toDo;
	toDo = s;

unmarkAll:

	for (iP = kernel; (i = *iP); ++iP)
		unmark(i);

	return s;
}

} // end namespace re2c