shithub: choc

Download patch

ref: d0bb59a02c17dddef40f8f84364792aaf9c75771
parent: ad816c1bc28ab81ddb892ff878f65969bddd9764
parent: e1f905cd3c481d561f2faf8c80e800cffe4d2035
author: Fabian Greffrath <fabian@greffrath.com>
date: Tue Jan 20 01:58:34 EST 2015

Merge branch 'master' of https://github.com/chocolate-doom/chocolate-doom into hexndemo

--- a/PHILOSOPHY
+++ b/PHILOSOPHY
@@ -155,15 +155,8 @@
 other hand, painstakingly emulating Vanilla Doom by starting with no
 sound or music by default is not helpful to anyone.
 
-== Other philosophical aspects ==
+== Minimalism ==
 
-Chocolate Doom aims for maximal portability. That includes running on
-many different CPUs, different operating systems and different devices
-(ie. not just a desktop machine with a keyboard and mouse).
-
-Chocolate Doom is and will always remain Free Software. It will never
-include code that is not compatible with the GNU GPL.
-
 Chocolate Doom aims to be minimalist and straightforward to configure;
 in particular, the setup tool should have a sane interface. Part of
 the inspiration for Chocolate Doom came from Boom's complicated maze
@@ -179,6 +172,29 @@
 the setup tool. The assumption is that if you care enough about those
 obscure features, editing a configuration file by hand should not be a
 huge problem for you.
+
+Also inspirational was the README file from Havoc's Metacity window
+manager, where the list of features begins:
+
+  Boring window manager for the adult in you. Many window managers
+  are like Marshmallow Froot Loops; Metacity is like Cheerios.
+
+I'd like to think that Chocolate Doom's philosophy towards features is
+similar. The idea is for a source port that is boring. I find the best
+software - both proprietary and open source - is software that is
+"egoless": it does a job well without pretentions about its importance
+or delusions of grandeur. A couple of other notable examples of
+software that I feel embody this spirit of design in a beautiful way
+are Marco Pesenti Gritti's Epiphany web browser and Evince PDF viewer.
+
+== Other philosophical aspects ==
+
+Chocolate Doom aims for maximal portability. That includes running on
+many different CPUs, different operating systems and different devices
+(ie. not just a desktop machine with a keyboard and mouse).
+
+Chocolate Doom is and will always remain Free Software. It will never
+include code that is not compatible with the GNU GPL.
 
 # vim: tw=70
 
--- a/codeblocks/doom.cbp
+++ b/codeblocks/doom.cbp
@@ -114,6 +114,9 @@
 		<Unit filename="../src/doom/deh_ammo.c">
 			<Option compilerVar="CC" />
 		</Unit>
+		<Unit filename="../src/doom/deh_bexstr.c">
+			<Option compilerVar="CC" />
+		</Unit>
 		<Unit filename="../src/doom/deh_cheat.c">
 			<Option compilerVar="CC" />
 		</Unit>
--- a/src/doom/g_game.c
+++ b/src/doom/g_game.c
@@ -281,7 +281,7 @@
 static int G_NextWeapon(int direction)
 {
     weapontype_t weapon;
-    int i;
+    int start_i, i;
 
     // Find index in the table.
 
@@ -302,13 +302,13 @@
         }
     }
 
-    // Switch weapon.
-
+    // Switch weapon. Don't loop forever.
+    start_i = i;
     do
     {
         i += direction;
         i = (i + arrlen(weapon_order_table)) % arrlen(weapon_order_table);
-    } while (!WeaponSelectable(weapon_order_table[i].weapon));
+    } while (i != start_i && !WeaponSelectable(weapon_order_table[i].weapon));
 
     return weapon_order_table[i].weapon_num;
 }
@@ -445,12 +445,11 @@
     // next_weapon variable is set to change weapons when
     // we generate a ticcmd.  Choose a new weapon.
 
-    if (next_weapon != 0)
+    if (gamestate == GS_LEVEL && next_weapon != 0)
     {
         i = G_NextWeapon(next_weapon);
         cmd->buttons |= BT_CHANGE;
         cmd->buttons |= i << BT_WEAPONSHIFT;
-        next_weapon = 0;
     }
     else
     {
@@ -468,6 +467,8 @@
             }
         }
     }
+
+    next_weapon = 0;
 
     // mouse
     if (mousebuttons[mousebforward]) 
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -228,7 +228,7 @@
 static int G_NextWeapon(int direction)
 {
     weapontype_t weapon;
-    int i;
+    int start_i, i;
 
     // Find index in the table.
 
@@ -249,13 +249,13 @@
         }
     }
 
-    // Switch weapon.
-
+    // Switch weapon. Don't loop forever.
+    start_i = i;
     do
     {
         i += direction;
         i = (i + arrlen(weapon_order_table)) % arrlen(weapon_order_table);
-    } while (!WeaponSelectable(weapon_order_table[i].weapon));
+    } while (i != start_i && !WeaponSelectable(weapon_order_table[i].weapon));
 
     return weapon_order_table[i].weapon_num;
 }
@@ -466,7 +466,8 @@
     // we generate a ticcmd.  Choose a new weapon.
     // (Can't weapon cycle when the player is a chicken)
 
-    if (players[consoleplayer].chickenTics == 0 && next_weapon != 0)
+    if (gamestate == GS_LEVEL
+     && players[consoleplayer].chickenTics == 0 && next_weapon != 0)
     {
         i = G_NextWeapon(next_weapon);
         cmd->buttons |= BT_CHANGE;
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -451,9 +451,11 @@
 
     // Weapon cycling. Switch to previous or next weapon.
     // (Disabled when player is a pig).
-
-    if (players[consoleplayer].morphTics == 0 && next_weapon != 0)
+    if (gamestate == GS_LEVEL
+     && players[consoleplayer].morphTics == 0 && next_weapon != 0)
     {
+        int start_i;
+
         if (players[consoleplayer].pendingweapon == WP_NOCHANGE)
         {
             i = players[consoleplayer].readyweapon;
@@ -463,9 +465,11 @@
             i = players[consoleplayer].pendingweapon;
         }
 
+        // Don't loop forever.
+        start_i = i;
         do {
-            i = (i + next_weapon) % NUMWEAPONS;
-        } while (!players[consoleplayer].weaponowned[i]);
+            i = (i + next_weapon + NUMWEAPONS) % NUMWEAPONS;
+        } while (i != start_i && !players[consoleplayer].weaponowned[i]);
 
         cmd->buttons |= BT_CHANGE;
         cmd->buttons |= i << BT_WEAPONSHIFT;
--- a/src/strife/g_game.c
+++ b/src/strife/g_game.c
@@ -289,7 +289,7 @@
 static int G_NextWeapon(int direction)
 {
     weapontype_t weapon;
-    int i;
+    int start_i, i;
 
     // Find index in the table.
 
@@ -311,12 +311,12 @@
     }
 
     // Switch weapon.
-
+    start_i = i;
     do
     {
         i += direction;
         i = (i + arrlen(weapon_order_table)) % arrlen(weapon_order_table);
-    } while (!WeaponSelectable(weapon_order_table[i].weapon));
+    } while (i != start_i && !WeaponSelectable(weapon_order_table[i].weapon));
 
     return weapon_order_table[i].weapon_num;
 }
@@ -511,12 +511,11 @@
     // next_weapon variable is set to change weapons when
     // we generate a ticcmd.  Choose a new weapon.
 
-    if (next_weapon != 0)
+    if (gamestate == GS_LEVEL && next_weapon != 0)
     {
         i = G_NextWeapon(next_weapon);
         cmd->buttons |= BT_CHANGE;
         cmd->buttons |= i << BT_WEAPONSHIFT;
-        next_weapon = 0;
     }
     else
     {
@@ -534,6 +533,8 @@
             }
         }
     }
+
+    next_weapon = 0;
 
     // mouse
     if (mousebuttons[mousebforward])