- Added DTA_TopOffset and DTA_LeftOffset values to the automap background drawer.

- Fixed: DECORATE color translations with explicit colors didn't work because the
  code treated byte values as fixed point.
- Fixed: LEVEL_NOALLIES must clear MF_FRIENDLY off any spawned actor except players.
  Otherwise it doesn't work properly.
- Fixed: Entering a backslash in the player's name box caused a crash because 
  the code analyzing the string was missing a NULL pointer check.
- Fixed: Thing_Hate and Teleport_ZombieChanger unconditionally made state jumps,
  even for dead monsters.
- Fixed: The palette flash for item pickup was not reset upon a player's death.
- Fixed: P_DamageMobj tried to get damage multiplier information from the
  damage inflictor, not the attacker.
- Fixed: PowerTimeFreezer::DoEffect did not call its superclass method.
- fixed: When morphed monsters died they tried to set MF3_STAYMORPHED for the
  attacker, not themselves. This caused a crash when they were killed by a crusher.


SVN r539 (trunk)
This commit is contained in:
Christoph Oelckers 2007-07-12 15:15:57 +00:00
parent 8f6fdc1d21
commit 2829361c5c
12 changed files with 45 additions and 13 deletions

View file

@ -19,7 +19,7 @@ CFLAGS += -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -DNEED_STRUPR
LDFLAGS += -lFLAC++ -lFLAC -lz -ljpeg -lfmod `sdl-config --libs` `pkg-config gtk+-2.0 --libs` LDFLAGS += -lFLAC++ -lFLAC -lz -ljpeg -lfmod `sdl-config --libs` `pkg-config gtk+-2.0 --libs`
NASMFLAGS += -f elf -DM_TARGET_LINUX NASMFLAGS += -f elf -DM_TARGET_LINUX
SRCDIRS = src/ $(addprefix src/,g_doom/ g_heretic/ g_hexen/ g_raven/ g_shared/ g_strife/ oplsynth/ sound/ sdl/ textures/ ) SRCDIRS = src/ $(addprefix src/,g_doom/ g_heretic/ g_hexen/ g_raven/ g_shared/ g_strife/ oplsynth/ sound/ sdl/ textures/ thingdef/)
VPATH = $(SRCDIRS) VPATH = $(SRCDIRS)
INCLUDES = $(addprefix -I,$(SRCDIRS)) INCLUDES = $(addprefix -I,$(SRCDIRS))
CFLAGS += $(INCLUDES) CFLAGS += $(INCLUDES)

View file

@ -1,3 +1,20 @@
July 12, 2007 (Changes by Graf Zahl)
- Added DTA_TopOffset and DTA_LeftOffset values to the automap background drawer.
- Fixed: DECORATE color translations with explicit colors didn't work because the
code treated byte values as fixed point.
- Fixed: LEVEL_NOALLIES must clear MF_FRIENDLY off any spawned actor except players.
Otherwise it doesn't work properly.
- Fixed: Entering a backslash in the player's name box caused a crash because
the code analyzing the string was missing a NULL pointer check.
- Fixed: Thing_Hate and Teleport_ZombieChanger unconditionally made state jumps,
even for dead monsters.
- Fixed: The palette flash for item pickup was not reset upon a player's death.
- Fixed: P_DamageMobj tried to get damage multiplier information from the
damage inflictor, not the attacker.
- Fixed: PowerTimeFreezer::DoEffect did not call its superclass method.
- fixed: When morphed monsters died they tried to set MF3_STAYMORPHED for the
attacker, not themselves. This caused a crash when they were killed by a crusher.
May 28, 2007 (Changes by Graf Zahl) May 28, 2007 (Changes by Graf Zahl)
- Split thingdef.cpp into several files so that the state and property code - Split thingdef.cpp into several files so that the state and property code
no longer gets in the way of the main parser. no longer gets in the way of the main parser.

View file

@ -1108,7 +1108,7 @@ void AM_clearFB (int color)
{ {
for (x = mapxstart >> MAPBITS; x < f_w; x += pwidth) for (x = mapxstart >> MAPBITS; x < f_w; x += pwidth)
{ {
screen->DrawTexture (mapback, x, y, DTA_ClipBottom, f_h, TAG_DONE); screen->DrawTexture (mapback, x, y, DTA_ClipBottom, f_h, DTA_TopOffset, 0, DTA_LeftOffset, 0, TAG_DONE);
} }
} }
} }

View file

@ -589,7 +589,7 @@ void D_ReadUserInfoStrings (int i, BYTE **stream, bool update)
value = ptr; value = ptr;
infotype++; infotype++;
} }
else else if (breakpt != NULL)
{ {
value = breakpt + 1; value = breakpt + 1;
if ( (breakpt = strchr (value, '\\')) ) if ( (breakpt = strchr (value, '\\')) )

View file

@ -1398,6 +1398,7 @@ void APowerTimeFreezer::InitEffect( )
void APowerTimeFreezer::DoEffect( ) void APowerTimeFreezer::DoEffect( )
{ {
Super::DoEffect();
if ( EffectTics > 4*32 if ( EffectTics > 4*32
|| (( EffectTics > 3*32 && EffectTics <= 4*32 ) && EffectTics % 16 != 0 ) || (( EffectTics > 3*32 && EffectTics <= 4*32 ) && EffectTics % 16 != 0 )
|| (( EffectTics > 2*32 && EffectTics <= 3*32 ) && EffectTics % 8 != 0 ) || (( EffectTics > 2*32 && EffectTics <= 3*32 ) && EffectTics % 8 != 0 )

View file

@ -375,7 +375,7 @@ void AMorphedMonster::Destroy ()
void AMorphedMonster::Die (AActor *source, AActor *inflictor) void AMorphedMonster::Die (AActor *source, AActor *inflictor)
{ {
// Dead things don't unmorph // Dead things don't unmorph
source->flags3 |= MF3_STAYMORPHED; flags3 |= MF3_STAYMORPHED;
Super::Die (source, inflictor); Super::Die (source, inflictor);
if (UnmorphedMe != NULL && (UnmorphedMe->flags & MF_UNMORPHED)) if (UnmorphedMe != NULL && (UnmorphedMe->flags & MF_UNMORPHED))
{ {

View file

@ -892,14 +892,14 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage
return; return;
} }
}
// Handle active damage modifiers (e.g. PowerDamage) // Handle active damage modifiers (e.g. PowerDamage)
if (inflictor->Inventory != NULL) if (source != NULL && source->Inventory != NULL)
{ {
int olddam = damage; int olddam = damage;
inflictor->Inventory->ModifyDamage(olddam, mod, damage, false); source->Inventory->ModifyDamage(olddam, mod, damage, false);
if (olddam != damage && damage <= 0) return; if (olddam != damage && damage <= 0) return;
} }
}
// Handle passive damage modifiers (e.g. PowerProtection) // Handle passive damage modifiers (e.g. PowerProtection)
if (target->Inventory != NULL) if (target->Inventory != NULL)
{ {

View file

@ -773,7 +773,7 @@ FUNC(LS_Teleport_ZombieChanger)
if (it != NULL) if (it != NULL)
{ {
EV_Teleport (arg0, arg1, ln, backSide, it, false, false, false); EV_Teleport (arg0, arg1, ln, backSide, it, false, false, false);
it->SetState (it->FindState(NAME_Pain)); if (it->health >= 0) it->SetState (it->FindState(NAME_Pain));
return true; return true;
} }
return false; return false;
@ -1286,7 +1286,7 @@ FUNC(LS_Thing_Hate)
hater->target = hatee; hater->target = hatee;
if (!(hater->flags2 & MF2_DORMANT)) if (!(hater->flags2 & MF2_DORMANT))
{ {
hater->SetState (hater->SeeState); if (hater->health > 0) hater->SetState (hater->SeeState);
} }
} }
} }

View file

@ -3220,6 +3220,10 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t
return NULL; return NULL;
} }
} }
if (level.flags & LEVEL_NOALLIES && !actor->player)
{
actor->flags &= ~MF_FRIENDLY;
}
// [RH] Count monsters whenever they are spawned. // [RH] Count monsters whenever they are spawned.
if (actor->CountsAsKill()) if (actor->CountsAsKill())
{ {

View file

@ -1035,6 +1035,8 @@ void APlayerPawn::Die (AActor *source, AActor *inflictor)
{ {
Super::Die (source, inflictor); Super::Die (source, inflictor);
if (player != NULL && player->mo == this) player->bonuscount = 0;
if (player != NULL && player->mo != this) if (player != NULL && player->mo != this)
{ // Make the real player die, too { // Make the real player die, too
player->mo->Die (source, inflictor); player->mo->Die (source, inflictor);

View file

@ -194,6 +194,8 @@ int main (int argc, char **argv)
GtkAvailable = gtk_init_check (&argc, &argv); GtkAvailable = gtk_init_check (&argc, &argv);
setlocale (LC_ALL, "C");
if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1)
{ {
fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError());

View file

@ -609,6 +609,12 @@ static void AddToTranslation(unsigned char * translation, char * range)
gs = g2 - g1; gs = g2 - g1;
bs = b2 - b1; bs = b2 - b1;
} }
r <<= FRACBITS;
g <<= FRACBITS;
b <<= FRACBITS;
rs <<= FRACBITS;
gs <<= FRACBITS;
bs <<= FRACBITS;
if (start == end) if (start == end)
{ {
translation[start] = ColorMatcher.Pick translation[start] = ColorMatcher.Pick