]> 4ch.mooo.com Git - 16.git/blobdiff - 16/WOLFSRC/WL_ACT1.C
got 8086 port of wolf3d to work and sod to work
[16.git] / 16 / WOLFSRC / WL_ACT1.C
diff --git a/16/WOLFSRC/WL_ACT1.C b/16/WOLFSRC/WL_ACT1.C
new file mode 100755 (executable)
index 0000000..10d84e4
--- /dev/null
@@ -0,0 +1,900 @@
+// WL_ACT1.C\r
+\r
+#include "WL_DEF.H"\r
+#pragma hdrstop\r
+\r
+/*\r
+=============================================================================\r
+\r
+                                                       STATICS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+statobj_t      statobjlist[MAXSTATS],*laststatobj;\r
+\r
+\r
+struct\r
+{\r
+       int             picnum;\r
+       stat_t  type;\r
+} statinfo[] =\r
+{\r
+{SPR_STAT_0},                                  // puddle          spr1v\r
+{SPR_STAT_1,block},                            // Green Barrel    "\r
+{SPR_STAT_2,block},                            // Table/chairs    "\r
+{SPR_STAT_3,block},                            // Floor lamp      "\r
+{SPR_STAT_4},                                  // Chandelier      "\r
+{SPR_STAT_5,block},                            // Hanged man      "\r
+{SPR_STAT_6,bo_alpo},                  // Bad food        "\r
+{SPR_STAT_7,block},                            // Red pillar      "\r
+//\r
+// NEW PAGE\r
+//\r
+{SPR_STAT_8,block},                            // Tree            spr2v\r
+{SPR_STAT_9},                                  // Skeleton flat   "\r
+{SPR_STAT_10,block},                   // Sink            " (SOD:gibs)\r
+{SPR_STAT_11,block},                   // Potted plant    "\r
+{SPR_STAT_12,block},                   // Urn             "\r
+{SPR_STAT_13,block},                   // Bare table      "\r
+{SPR_STAT_14},                                 // Ceiling light   "\r
+#ifndef SPEAR\r
+{SPR_STAT_15},                                 // Kitchen stuff   "\r
+#else\r
+{SPR_STAT_15,block},                   // Gibs!\r
+#endif\r
+//\r
+// NEW PAGE\r
+//\r
+{SPR_STAT_16,block},                   // suit of armor   spr3v\r
+{SPR_STAT_17,block},                   // Hanging cage    "\r
+{SPR_STAT_18,block},                   // SkeletoninCage  "\r
+{SPR_STAT_19},                                 // Skeleton relax  "\r
+{SPR_STAT_20,bo_key1},                 // Key 1           "\r
+{SPR_STAT_21,bo_key2},                 // Key 2           "\r
+{SPR_STAT_22,block},                   // stuff                                (SOD:gibs)\r
+{SPR_STAT_23},                                 // stuff\r
+//\r
+// NEW PAGE\r
+//\r
+{SPR_STAT_24,bo_food},                         // Good food       spr4v\r
+{SPR_STAT_25,bo_firstaid},             // First aid       "\r
+{SPR_STAT_26,bo_clip},                 // Clip            "\r
+{SPR_STAT_27,bo_machinegun},   // Machine gun     "\r
+{SPR_STAT_28,bo_chaingun},             // Gatling gun     "\r
+{SPR_STAT_29,bo_cross},                        // Cross           "\r
+{SPR_STAT_30,bo_chalice},              // Chalice         "\r
+{SPR_STAT_31,bo_bible},                        // Bible           "\r
+//\r
+// NEW PAGE\r
+//\r
+{SPR_STAT_32,bo_crown},                        // crown           spr5v\r
+{SPR_STAT_33,bo_fullheal},             // one up          "\r
+{SPR_STAT_34,bo_gibs},                 // gibs            "\r
+{SPR_STAT_35,block},                   // barrel          "\r
+{SPR_STAT_36,block},                   // well            "\r
+{SPR_STAT_37,block},                   // Empty well      "\r
+{SPR_STAT_38,bo_gibs},                 // Gibs 2          "\r
+{SPR_STAT_39,block},                   // flag                         "\r
+//\r
+// NEW PAGE\r
+//\r
+#ifndef SPEAR\r
+{SPR_STAT_40,block},                   // Call Apogee          spr7v\r
+#else\r
+{SPR_STAT_40},                                 // Red light\r
+#endif\r
+//\r
+// NEW PAGE\r
+//\r
+{SPR_STAT_41},                                 // junk            "\r
+{SPR_STAT_42},                                 // junk                    "\r
+{SPR_STAT_43},                                 // junk            "\r
+#ifndef SPEAR\r
+{SPR_STAT_44},                                 // pots            "\r
+#else\r
+{SPR_STAT_44,block},                   // Gibs!\r
+#endif\r
+{SPR_STAT_45,block},                   // stove           " (SOD:gibs)\r
+{SPR_STAT_46,block},                   // spears          " (SOD:gibs)\r
+{SPR_STAT_47},                                 // vines                        "\r
+//\r
+// NEW PAGE\r
+//\r
+#ifdef SPEAR\r
+{SPR_STAT_48,block},                   // marble pillar\r
+{SPR_STAT_49,bo_25clip},               // bonus 25 clip\r
+{SPR_STAT_50,block},                   // truck\r
+{SPR_STAT_51,bo_spear},                        // SPEAR OF DESTINY!\r
+#endif\r
+\r
+{SPR_STAT_26,bo_clip2},                        // Clip            "\r
+{-1}                                                   // terminator\r
+};\r
+\r
+/*\r
+===============\r
+=\r
+= InitStaticList\r
+=\r
+===============\r
+*/\r
+\r
+void InitStaticList (void)\r
+{\r
+       laststatobj = &statobjlist[0];\r
+}\r
+\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= SpawnStatic\r
+=\r
+===============\r
+*/\r
+\r
+void SpawnStatic (int tilex, int tiley, int type)\r
+{\r
+       laststatobj->shapenum = statinfo[type].picnum;\r
+       laststatobj->tilex = tilex;\r
+       laststatobj->tiley = tiley;\r
+       laststatobj->visspot = &spotvis[tilex][tiley];\r
+\r
+       switch (statinfo[type].type)\r
+       {\r
+       case block:\r
+               (unsigned)actorat[tilex][tiley] = 1;            // consider it a blocking tile\r
+       case dressing:\r
+               laststatobj->flags = 0;\r
+               break;\r
+\r
+       case    bo_cross:\r
+       case    bo_chalice:\r
+       case    bo_bible:\r
+       case    bo_crown:\r
+       case    bo_fullheal:\r
+               if (!loadedgame)\r
+                 gamestate.treasuretotal++;\r
+\r
+       case    bo_firstaid:\r
+       case    bo_key1:\r
+       case    bo_key2:\r
+       case    bo_key3:\r
+       case    bo_key4:\r
+       case    bo_clip:\r
+       case    bo_25clip:\r
+       case    bo_machinegun:\r
+       case    bo_chaingun:\r
+       case    bo_food:\r
+       case    bo_alpo:\r
+       case    bo_gibs:\r
+       case    bo_spear:\r
+               laststatobj->flags = FL_BONUS;\r
+               laststatobj->itemnumber = statinfo[type].type;\r
+               break;\r
+       }\r
+\r
+       laststatobj++;\r
+\r
+       if (laststatobj == &statobjlist[MAXSTATS])\r
+               Quit ("Too many static objects!\n");\r
+}\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= PlaceItemType\r
+=\r
+= Called during game play to drop actors' items.  It finds the proper\r
+= item number based on the item type (bo_???).  If there are no free item\r
+= spots, nothing is done.\r
+=\r
+===============\r
+*/\r
+\r
+void PlaceItemType (int itemtype, int tilex, int tiley)\r
+{\r
+       int                     type;\r
+       statobj_t       *spot;\r
+\r
+//\r
+// find the item number\r
+//\r
+       for (type=0 ;  ; type++)\r
+       {\r
+               if (statinfo[type].picnum == -1)                // end of list\r
+                       Quit ("PlaceItemType: couldn't find type!");\r
+               if (statinfo[type].type == itemtype)\r
+                       break;\r
+       }\r
+\r
+//\r
+// find a spot in statobjlist to put it in\r
+//\r
+       for (spot=&statobjlist[0] ; ; spot++)\r
+       {\r
+               if (spot==laststatobj)\r
+               {\r
+                       if (spot == &statobjlist[MAXSTATS])\r
+                               return;                                                 // no free spots\r
+                       laststatobj++;                                          // space at end\r
+                       break;\r
+               }\r
+\r
+               if (spot->shapenum == -1)                               // -1 is a free spot\r
+                       break;\r
+       }\r
+//\r
+// place it\r
+//\r
+       spot->shapenum = statinfo[type].picnum;\r
+       spot->tilex = tilex;\r
+       spot->tiley = tiley;\r
+       spot->visspot = &spotvis[tilex][tiley];\r
+       spot->flags = FL_BONUS;\r
+       spot->itemnumber = statinfo[type].type;\r
+}\r
+\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+                                                       DOORS\r
+\r
+doorobjlist[] holds most of the information for the doors\r
+\r
+doorposition[] holds the amount the door is open, ranging from 0 to 0xffff\r
+       this is directly accessed by AsmRefresh during rendering\r
+\r
+The number of doors is limited to 64 because a spot in tilemap holds the\r
+       door number in the low 6 bits, with the high bit meaning a door center\r
+       and bit 6 meaning a door side tile\r
+\r
+Open doors conect two areas, so sounds will travel between them and sight\r
+       will be checked when the player is in a connected area.\r
+\r
+Areaconnect is incremented/decremented by each door. If >0 they connect\r
+\r
+Every time a door opens or closes the areabyplayer matrix gets recalculated.\r
+       An area is true if it connects with the player's current spor.\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define DOORWIDTH      0x7800\r
+#define OPENTICS       300\r
+\r
+doorobj_t      doorobjlist[MAXDOORS],*lastdoorobj;\r
+int                    doornum;\r
+\r
+unsigned       doorposition[MAXDOORS];         // leading edge of door 0=closed\r
+                                                                               // 0xffff = fully open\r
+\r
+byte           far areaconnect[NUMAREAS][NUMAREAS];\r
+\r
+boolean                areabyplayer[NUMAREAS];\r
+\r
+\r
+/*\r
+==============\r
+=\r
+= ConnectAreas\r
+=\r
+= Scans outward from playerarea, marking all connected areas\r
+=\r
+==============\r
+*/\r
+\r
+void RecursiveConnect (int areanumber)\r
+{\r
+       int     i;\r
+\r
+       for (i=0;i<NUMAREAS;i++)\r
+       {\r
+               if (areaconnect[areanumber][i] && !areabyplayer[i])\r
+               {\r
+                       areabyplayer[i] = true;\r
+                       RecursiveConnect (i);\r
+               }\r
+       }\r
+}\r
+\r
+\r
+void ConnectAreas (void)\r
+{\r
+       memset (areabyplayer,0,sizeof(areabyplayer));\r
+       areabyplayer[player->areanumber] = true;\r
+       RecursiveConnect (player->areanumber);\r
+}\r
+\r
+\r
+void InitAreas (void)\r
+{\r
+       memset (areabyplayer,0,sizeof(areabyplayer));\r
+       areabyplayer[player->areanumber] = true;\r
+}\r
+\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= InitDoorList\r
+=\r
+===============\r
+*/\r
+\r
+void InitDoorList (void)\r
+{\r
+       memset (areabyplayer,0,sizeof(areabyplayer));\r
+       _fmemset (areaconnect,0,sizeof(areaconnect));\r
+\r
+       lastdoorobj = &doorobjlist[0];\r
+       doornum = 0;\r
+}\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= SpawnDoor\r
+=\r
+===============\r
+*/\r
+\r
+void SpawnDoor (int tilex, int tiley, boolean vertical, int lock)\r
+{\r
+       int     areanumber;\r
+       unsigned        far *map;\r
+\r
+       if (doornum==64)\r
+               Quit ("64+ doors on level!");\r
+\r
+       doorposition[doornum] = 0;              // doors start out fully closed\r
+       lastdoorobj->tilex = tilex;\r
+       lastdoorobj->tiley = tiley;\r
+       lastdoorobj->vertical = vertical;\r
+       lastdoorobj->lock = lock;\r
+       lastdoorobj->action = dr_closed;\r
+\r
+       (unsigned)actorat[tilex][tiley] = doornum | 0x80;       // consider it a solid wall\r
+\r
+//\r
+// make the door tile a special tile, and mark the adjacent tiles\r
+// for door sides\r
+//\r
+       tilemap[tilex][tiley] = doornum | 0x80;\r
+       map = mapsegs[0] + farmapylookup[tiley]+tilex;\r
+       if (vertical)\r
+       {\r
+               *map = *(map-1);                        // set area number\r
+               tilemap[tilex][tiley-1] |= 0x40;\r
+               tilemap[tilex][tiley+1] |= 0x40;\r
+       }\r
+       else\r
+       {\r
+               *map = *(map-mapwidth);                                 // set area number\r
+               tilemap[tilex-1][tiley] |= 0x40;\r
+               tilemap[tilex+1][tiley] |= 0x40;\r
+       }\r
+\r
+       doornum++;\r
+       lastdoorobj++;\r
+}\r
+\r
+//===========================================================================\r
+\r
+/*\r
+=====================\r
+=\r
+= OpenDoor\r
+=\r
+=====================\r
+*/\r
+\r
+void OpenDoor (int door)\r
+{\r
+       if (doorobjlist[door].action == dr_open)\r
+               doorobjlist[door].ticcount = 0;                 // reset open time\r
+       else\r
+               doorobjlist[door].action = dr_opening;  // start it opening\r
+}\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= CloseDoor\r
+=\r
+=====================\r
+*/\r
+\r
+void CloseDoor (int door)\r
+{\r
+       int     tilex,tiley,area;\r
+       objtype *check;\r
+\r
+//\r
+// don't close on anything solid\r
+//\r
+       tilex = doorobjlist[door].tilex;\r
+       tiley = doorobjlist[door].tiley;\r
+\r
+       if (actorat[tilex][tiley])\r
+               return;\r
+\r
+       if (player->tilex == tilex && player->tiley == tiley)\r
+               return;\r
+\r
+       if (doorobjlist[door].vertical)\r
+       {\r
+               if ( player->tiley == tiley )\r
+               {\r
+                       if ( ((player->x+MINDIST) >>TILESHIFT) == tilex )\r
+                               return;\r
+                       if ( ((player->x-MINDIST) >>TILESHIFT) == tilex )\r
+                               return;\r
+               }\r
+               check = actorat[tilex-1][tiley];\r
+               if (check && ((check->x+MINDIST) >> TILESHIFT) == tilex )\r
+                       return;\r
+               check = actorat[tilex+1][tiley];\r
+               if (check && ((check->x-MINDIST) >> TILESHIFT) == tilex )\r
+                       return;\r
+       }\r
+       else if (!doorobjlist[door].vertical)\r
+       {\r
+               if (player->tilex == tilex)\r
+               {\r
+                       if ( ((player->y+MINDIST) >>TILESHIFT) == tiley )\r
+                               return;\r
+                       if ( ((player->y-MINDIST) >>TILESHIFT) == tiley )\r
+                               return;\r
+               }\r
+               check = actorat[tilex][tiley-1];\r
+               if (check && ((check->y+MINDIST) >> TILESHIFT) == tiley )\r
+                       return;\r
+               check = actorat[tilex][tiley+1];\r
+               if (check && ((check->y-MINDIST) >> TILESHIFT) == tiley )\r
+                       return;\r
+       }\r
+\r
+\r
+//\r
+// play door sound if in a connected area\r
+//\r
+       area = *(mapsegs[0] + farmapylookup[doorobjlist[door].tiley]\r
+                       +doorobjlist[door].tilex)-AREATILE;\r
+       if (areabyplayer[area])\r
+       {\r
+               PlaySoundLocTile(CLOSEDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley); // JAB\r
+       }\r
+\r
+       doorobjlist[door].action = dr_closing;\r
+//\r
+// make the door space solid\r
+//\r
+       (unsigned)actorat[tilex][tiley]\r
+               = door | 0x80;\r
+}\r
+\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= OperateDoor\r
+=\r
+= The player wants to change the door's direction\r
+=\r
+=====================\r
+*/\r
+\r
+void OperateDoor (int door)\r
+{\r
+       int     lock;\r
+\r
+       lock = doorobjlist[door].lock;\r
+       if (lock >= dr_lock1 && lock <= dr_lock4)\r
+       {\r
+               if ( ! (gamestate.keys & (1 << (lock-dr_lock1) ) ) )\r
+               {\r
+                       SD_PlaySound (NOWAYSND);                // locked\r
+                       return;\r
+               }\r
+       }\r
+\r
+       switch (doorobjlist[door].action)\r
+       {\r
+       case dr_closed:\r
+       case dr_closing:\r
+               OpenDoor (door);\r
+               break;\r
+       case dr_open:\r
+       case dr_opening:\r
+               CloseDoor (door);\r
+               break;\r
+       }\r
+}\r
+\r
+\r
+//===========================================================================\r
+\r
+/*\r
+===============\r
+=\r
+= DoorOpen\r
+=\r
+= Close the door after three seconds\r
+=\r
+===============\r
+*/\r
+\r
+void DoorOpen (int door)\r
+{\r
+       if ( (doorobjlist[door].ticcount += tics) >= OPENTICS)\r
+               CloseDoor (door);\r
+}\r
+\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= DoorOpening\r
+=\r
+===============\r
+*/\r
+\r
+void DoorOpening (int door)\r
+{\r
+       int             area1,area2;\r
+       unsigned        far     *map;\r
+       long    position;\r
+\r
+       position = doorposition[door];\r
+       if (!position)\r
+       {\r
+       //\r
+       // door is just starting to open, so connect the areas\r
+       //\r
+               map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]\r
+                       +doorobjlist[door].tilex;\r
+\r
+               if (doorobjlist[door].vertical)\r
+               {\r
+                       area1 = *(map+1);\r
+                       area2 = *(map-1);\r
+               }\r
+               else\r
+               {\r
+                       area1 = *(map-mapwidth);\r
+                       area2 = *(map+mapwidth);\r
+               }\r
+               area1 -= AREATILE;\r
+               area2 -= AREATILE;\r
+               areaconnect[area1][area2]++;\r
+               areaconnect[area2][area1]++;\r
+               ConnectAreas ();\r
+               if (areabyplayer[area1])\r
+               {\r
+                       PlaySoundLocTile(OPENDOORSND,doorobjlist[door].tilex,doorobjlist[door].tiley);  // JAB\r
+               }\r
+       }\r
+\r
+//\r
+// slide the door by an adaptive amount\r
+//\r
+       position += tics<<10;\r
+       if (position >= 0xffff)\r
+       {\r
+       //\r
+       // door is all the way open\r
+       //\r
+               position = 0xffff;\r
+               doorobjlist[door].ticcount = 0;\r
+               doorobjlist[door].action = dr_open;\r
+               actorat[doorobjlist[door].tilex][doorobjlist[door].tiley] = 0;\r
+       }\r
+\r
+       doorposition[door] = position;\r
+}\r
+\r
+\r
+/*\r
+===============\r
+=\r
+= DoorClosing\r
+=\r
+===============\r
+*/\r
+\r
+void DoorClosing (int door)\r
+{\r
+       int             area1,area2,move;\r
+       unsigned        far     *map;\r
+       long    position;\r
+       int             tilex,tiley;\r
+\r
+       tilex = doorobjlist[door].tilex;\r
+       tiley = doorobjlist[door].tiley;\r
+\r
+       if ( ((unsigned)actorat[tilex][tiley] != (door | 0x80))\r
+       || (player->tilex == tilex && player->tiley == tiley) )\r
+       {                       // something got inside the door\r
+               OpenDoor (door);\r
+               return;\r
+       };\r
+\r
+       position = doorposition[door];\r
+\r
+//\r
+// slide the door by an adaptive amount\r
+//\r
+       position -= tics<<10;\r
+       if (position <= 0)\r
+       {\r
+       //\r
+       // door is closed all the way, so disconnect the areas\r
+       //\r
+               position = 0;\r
+\r
+               doorobjlist[door].action = dr_closed;\r
+\r
+               map = mapsegs[0] + farmapylookup[doorobjlist[door].tiley]\r
+                       +doorobjlist[door].tilex;\r
+\r
+               if (doorobjlist[door].vertical)\r
+               {\r
+                       area1 = *(map+1);\r
+                       area2 = *(map-1);\r
+               }\r
+               else\r
+               {\r
+                       area1 = *(map-mapwidth);\r
+                       area2 = *(map+mapwidth);\r
+               }\r
+               area1 -= AREATILE;\r
+               area2 -= AREATILE;\r
+               areaconnect[area1][area2]--;\r
+               areaconnect[area2][area1]--;\r
+\r
+               ConnectAreas ();\r
+       }\r
+\r
+       doorposition[door] = position;\r
+}\r
+\r
+\r
+\r
+\r
+/*\r
+=====================\r
+=\r
+= MoveDoors\r
+=\r
+= Called from PlayLoop\r
+=\r
+=====================\r
+*/\r
+\r
+void MoveDoors (void)\r
+{\r
+       int             door;\r
+\r
+       if (gamestate.victoryflag)              // don't move door during victory sequence\r
+               return;\r
+\r
+       for (door = 0 ; door < doornum ; door++)\r
+               switch (doorobjlist[door].action)\r
+               {\r
+               case dr_open:\r
+                       DoorOpen (door);\r
+                       break;\r
+\r
+               case dr_opening:\r
+                       DoorOpening(door);\r
+                       break;\r
+\r
+               case dr_closing:\r
+                       DoorClosing(door);\r
+                       break;\r
+               }\r
+}\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+                                               PUSHABLE WALLS\r
+\r
+=============================================================================\r
+*/\r
+\r
+unsigned       pwallstate;\r
+unsigned       pwallpos;                       // amount a pushable wall has been moved (0-63)\r
+unsigned       pwallx,pwally;\r
+int                    pwalldir;\r
+\r
+/*\r
+===============\r
+=\r
+= PushWall\r
+=\r
+===============\r
+*/\r
+\r
+void PushWall (int checkx, int checky, int dir)\r
+{\r
+       int             oldtile;\r
+\r
+       if (pwallstate)\r
+         return;\r
+\r
+\r
+       oldtile = tilemap[checkx][checky];\r
+       if (!oldtile)\r
+               return;\r
+\r
+       switch (dir)\r
+       {\r
+       case di_north:\r
+               if (actorat[checkx][checky-1])\r
+               {\r
+                       SD_PlaySound (NOWAYSND);\r
+                       return;\r
+               }\r
+               (unsigned)actorat[checkx][checky-1] =\r
+               tilemap[checkx][checky-1] = oldtile;\r
+               break;\r
+\r
+       case di_east:\r
+               if (actorat[checkx+1][checky])\r
+               {\r
+                       SD_PlaySound (NOWAYSND);\r
+                       return;\r
+               }\r
+               (unsigned)actorat[checkx+1][checky] =\r
+               tilemap[checkx+1][checky] = oldtile;\r
+               break;\r
+\r
+       case di_south:\r
+               if (actorat[checkx][checky+1])\r
+               {\r
+                       SD_PlaySound (NOWAYSND);\r
+                       return;\r
+               }\r
+               (unsigned)actorat[checkx][checky+1] =\r
+               tilemap[checkx][checky+1] = oldtile;\r
+               break;\r
+\r
+       case di_west:\r
+               if (actorat[checkx-1][checky])\r
+               {\r
+                       SD_PlaySound (NOWAYSND);\r
+                       return;\r
+               }\r
+               (unsigned)actorat[checkx-1][checky] =\r
+               tilemap[checkx-1][checky] = oldtile;\r
+               break;\r
+       }\r
+\r
+       gamestate.secretcount++;\r
+       pwallx = checkx;\r
+       pwally = checky;\r
+       pwalldir = dir;\r
+       pwallstate = 1;\r
+       pwallpos = 0;\r
+       tilemap[pwallx][pwally] |= 0xc0;\r
+       *(mapsegs[1]+farmapylookup[pwally]+pwallx) = 0; // remove P tile info\r
+\r
+       SD_PlaySound (PUSHWALLSND);\r
+}\r
+\r
+\r
+\r
+/*\r
+=================\r
+=\r
+= MovePWalls\r
+=\r
+=================\r
+*/\r
+\r
+void MovePWalls (void)\r
+{\r
+       int             oldblock,oldtile;\r
+\r
+       if (!pwallstate)\r
+               return;\r
+\r
+       oldblock = pwallstate/128;\r
+\r
+       pwallstate += tics;\r
+\r
+       if (pwallstate/128 != oldblock)\r
+       {\r
+       // block crossed into a new block\r
+               oldtile = tilemap[pwallx][pwally] & 63;\r
+\r
+               //\r
+               // the tile can now be walked into\r
+               //\r
+               tilemap[pwallx][pwally] = 0;\r
+               (unsigned)actorat[pwallx][pwally] = 0;\r
+               *(mapsegs[0]+farmapylookup[pwally]+pwallx) = player->areanumber+AREATILE;\r
+\r
+               //\r
+               // see if it should be pushed farther\r
+               //\r
+               if (pwallstate>256)\r
+               {\r
+               //\r
+               // the block has been pushed two tiles\r
+               //\r
+                       pwallstate = 0;\r
+                       return;\r
+               }\r
+               else\r
+               {\r
+                       switch (pwalldir)\r
+                       {\r
+                       case di_north:\r
+                               pwally--;\r
+                               if (actorat[pwallx][pwally-1])\r
+                               {\r
+                                       pwallstate = 0;\r
+                                       return;\r
+                               }\r
+                               (unsigned)actorat[pwallx][pwally-1] =\r
+                               tilemap[pwallx][pwally-1] = oldtile;\r
+                               break;\r
+\r
+                       case di_east:\r
+                               pwallx++;\r
+                               if (actorat[pwallx+1][pwally])\r
+                               {\r
+                                       pwallstate = 0;\r
+                                       return;\r
+                               }\r
+                               (unsigned)actorat[pwallx+1][pwally] =\r
+                               tilemap[pwallx+1][pwally] = oldtile;\r
+                               break;\r
+\r
+                       case di_south:\r
+                               pwally++;\r
+                               if (actorat[pwallx][pwally+1])\r
+                               {\r
+                                       pwallstate = 0;\r
+                                       return;\r
+                               }\r
+                               (unsigned)actorat[pwallx][pwally+1] =\r
+                               tilemap[pwallx][pwally+1] = oldtile;\r
+                               break;\r
+\r
+                       case di_west:\r
+                               pwallx--;\r
+                               if (actorat[pwallx-1][pwally])\r
+                               {\r
+                                       pwallstate = 0;\r
+                                       return;\r
+                               }\r
+                               (unsigned)actorat[pwallx-1][pwally] =\r
+                               tilemap[pwallx-1][pwally] = oldtile;\r
+                               break;\r
+                       }\r
+\r
+                       tilemap[pwallx][pwally] = oldtile | 0xc0;\r
+               }\r
+       }\r
+\r
+\r
+       pwallpos = (pwallstate/2)&63;\r
+\r
+}\r
+\r