shithub: choc

Download patch

ref: dfef246198170fc7efdc5df3a8a7287ded30672d
parent: 95482c25b1e0ec85c90a9150c6c1da4a6aff1046
author: Samuel Villareal <svkaiser@gmail.com>
date: Wed Sep 8 23:12:23 EDT 2010

+ More codepointers implemented
+ Converted some while loops to for loops in dialog functions

Subversion-branch: /branches/strife-branch
Subversion-revision: 2049

--- a/src/strife/info.c
+++ b/src/strife/info.c
@@ -143,7 +143,7 @@
 void A_SpawnZombie();
 void A_ZombieInSpecialSector();
 void A_CrystalExplode();
-void A_DeathMsg();
+void A_QuestMsg();
 void A_ExtraLightOff();
 void A_CrystalRadiusAtk();
 void A_DeathExplode5();
@@ -1360,7 +1360,7 @@
 /*S_PSTN_01*/       { SPR_PSTN, 1, 8, { NULL }, S_PSTN_00 },        //1159
 /*S_PSTN_02*/       { SPR_PSTN, 32768, 4, { A_Scream }, S_PSTN_03 },        //1160
 /*S_PSTN_03*/       { SPR_PSTN, 32769, 4, { A_Fall }, S_PSTN_04 },      //1161
-/*S_PSTN_04*/       { SPR_PSTN, 32770, 4, { A_DeathMsg }, S_PSTN_05 },      //1162
+/*S_PSTN_04*/       { SPR_PSTN, 32770, 4, { A_QuestMsg }, S_PSTN_05 },      //1162
 /*S_PSTN_05*/       { SPR_PSTN, 32771, 4, { A_SpawnSparkPuff }, S_PSTN_06 },        //1163
 /*S_PSTN_06*/       { SPR_PSTN, 32772, 4, { A_BodyParts }, S_PSTN_07 },     //1164
 /*S_PSTN_07*/       { SPR_PSTN, 32773, 4, { NULL }, S_PSTN_08 },        //1165
@@ -1373,7 +1373,7 @@
 /*S_SECR_03*/       { SPR_SECR, 32771, 4, { NULL }, S_SECR_00 },        //1172
 /*S_SECR_04*/       { SPR_SECR, 32772, 5, { A_SpawnSparkPuff }, S_SECR_05 },        //1173
 /*S_SECR_05*/       { SPR_SECR, 32773, 5, { A_Fall }, S_SECR_06 },      //1174
-/*S_SECR_06*/       { SPR_SECR, 32774, 5, { A_DeathMsg }, S_SECR_07 },      //1175
+/*S_SECR_06*/       { SPR_SECR, 32774, 5, { A_QuestMsg }, S_SECR_07 },      //1175
 /*S_SECR_07*/       { SPR_SECR, 32775, 5, { A_BodyParts }, S_SECR_08 },     //1176
 /*S_SECR_08*/       { SPR_SECR, 32776, 5, { A_SpawnSparkPuff }, S_SECR_09 },        //1177
 /*S_SECR_09*/       { SPR_SECR, 9, 5, { NULL }, S_SECR_10 },        //1178
@@ -1390,7 +1390,7 @@
 /*S_EARS_00*/       { SPR_EARS, 0, -1, { NULL }, S_NULL },      //1189
 /*S_COMM_00*/       { SPR_COMM, 0, -1, { NULL }, S_NULL },      //1190
 /*S_BOOM_00*/       { SPR_BOOM, 32768, 1, { A_CrystalRadiusAtk }, S_BOOM_01 },     //1191
-/*S_BOOM_01*/       { SPR_BOOM, 32769, 3, { A_DeathMsg }, S_BOOM_02 },      //1192
+/*S_BOOM_01*/       { SPR_BOOM, 32769, 3, { A_QuestMsg }, S_BOOM_02 },      //1192
 /*S_BOOM_02*/       { SPR_BOOM, 32770, 2, { A_CrystalExplode }, S_BOOM_03 },        //1193
 /*S_BOOM_03*/       { SPR_BOOM, 32771, 3, { A_SpawnSparkPuff }, S_BOOM_04 },        //1194
 /*S_BOOM_04*/       { SPR_BOOM, 32772, 3, { NULL }, S_BOOM_05 },        //1195
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -800,7 +800,8 @@
     currentchoice = &(currentdialog->choices[choice]);
 
     // I_StartVoice(0); -- verify (should stop previous voice I believe)
-    do
+    // villsa 09/08/10: converted into for loop
+    for(i = 0; i < MDLG_MAXITEMS; i++)
     {
         if(P_PlayerHasItem(dialogplayer, currentchoice->needitems[i]) <
                                          currentchoice->needamounts[i])
@@ -807,9 +808,7 @@
         {
             candochoice = false; // nope, missing something
         }
-        ++i;
     }
-    while(i < 3);
 
     if(choice != dialogmenu.numitems - 1 && candochoice)
     {
@@ -827,14 +826,13 @@
         {
             // if successful, take needed items
             int count = 0;
-            do
+            // villsa 09/08/10: converted into for loop
+            for(count = 0; count < MDLG_MAXITEMS; count++)
             {
                 P_TakeDialogItem(dialogplayer, 
                                  currentchoice->needitems[count],
                                  currentchoice->needamounts[count]);
-                ++count;
             }
-            while(count < 3);
         }
         else
             message = "You seem to have enough!";
@@ -945,7 +943,8 @@
         if(currentdialog->jumptoconv == 0)
             break;
 
-        do
+        // villsa 09/08/10: converted into for loop
+        for(i = 0; i < MDLG_MAXITEMS; i++)
         {
             // if the item is non-zero, the player must have at least one in his
             // or her inventory
@@ -952,9 +951,7 @@
             if(currentdialog->checkitem[i] != 0 &&
                 P_PlayerHasItem(dialogplayer, currentdialog->checkitem[i]) < 1)
                 break;
-            ++i;
         }
-        while(i < MDLG_MAXITEMS);
 
         if(i < MDLG_MAXITEMS) // didn't find them all? this is our dialog!
             break;
--- a/src/strife/p_enemy.c
+++ b/src/strife/p_enemy.c
@@ -2540,14 +2540,60 @@
     P_SpawnMobj(actor->x, actor->y, actor->z, MT_ZOMBIE);
 }
 
+//
+// A_ZombieInSpecialSector
+//
+// villsa [STRIFE] new codepointer
+//
 void A_ZombieInSpecialSector(mobj_t* actor)
 {
-    // STRIFE-TODO
+    sector_t* sector;
+    fixed_t force;
+    angle_t angle;
+    int tagval;
+
+    sector = actor->subsector->sector;
+    if(actor->z != sector->floorheight) // [STRIFE] TODO - verify
+        return;
+
+    if(sector->special <= 15)
+        P_DamageMobj(actor, NULL, NULL, 999);
+    else if(sector->special == 18)
+    {
+        tagval = sector->tag - 100;
+        force = (tagval % 10) << 12;
+        angle = (tagval / 10) << 29;
+        P_ThrustMobj(actor, angle, force);  // inlined in asm
+    }
 }
 
+//
+// A_CrystalExplode
+//
+// villsa [STRIFE] new codepointer
+//
 void A_CrystalExplode(mobj_t* actor)
 {
-    // STRIFE-TODO
+    sector_t* sector;
+    mobj_t* rubble;
+    int i;
+    int r;
+
+    sector = actor->subsector->sector;
+    sector->lightlevel = 0;
+    sector->floorheight = P_FindLowestFloorSurrounding(sector);
+
+    // spawn rubble
+    for(i = 0; i < 8; i++)
+    {
+        rubble = P_SpawnMobj(actor->x, actor->y, actor->z, MT_RUBBLE1 + i);
+        r = P_Random();
+        rubble->momx = ((r & 0x0f) - (P_Random() & 7)) << FRACBITS;
+        r = P_Random();
+        rubble->momy = ((r & 7) - (P_Random() & 7)) << FRACBITS;
+        rubble->momz = ((P_Random() & 3) << FRACBITS) + (7*FRACUNIT);
+
+    }
 }
 
 // [STRIFE] New static global - buffer used for various player messages.
@@ -2595,9 +2641,30 @@
     }
 }
 
-void A_DeathMsg(mobj_t* actor)
+//
+// A_QuestMsg
+//
+// villsa [STRIFE] new codepointer
+// Displays text based on quest item's name
+// Quest item is based on actor's speed
+//
+void A_QuestMsg(mobj_t* actor)
 {
-    // STRIFE-TODO
+    char* name;
+    int quest;
+    int i;
+
+    // get name
+    name = mobjinfo[(MT_TOKEN_QUEST1 - 1) + actor->info->speed].name;
+    strcpy(pmsgbuffer, name);   // inlined in asm
+
+    // give quest and display message to players
+    for(i = 0; i < MAXPLAYERS; i++)
+    {
+        quest = 1 << ((actor->info->speed) - 1);
+        players[i].message = pmsgbuffer;
+        players[i].questflags |= quest;
+    }
 }
 
 //
@@ -2912,9 +2979,24 @@
     actor->subsector->sector->soundtarget = NULL;
 }
 
+//
+// A_DropBurnFlesh
+//
+// villsa [STRIFE] new codepointer
+//
 void A_DropBurnFlesh(mobj_t* actor)
 {
-    // STRIFE-TODO
+    mobj_t* mo;
+    mobjtype_t type;
+
+    type = actor->type;
+
+    mo = P_SpawnMobj(actor->x, actor->y, actor->z + (24*FRACUNIT), MT_BURNDROP);
+    mo->momz = -FRACUNIT;
+
+    actor->type = MT_SFIREBALL;
+    P_RadiusAttack(actor, actor, 64);
+    actor->type = type;
 }
 
 //
@@ -2929,8 +3011,37 @@
     actor->momz = (P_Random() & 3) << FRACBITS;
 }
 
+//
+// A_ClearForceField
+//
+// villsa [STRIFE] new codepointer
+// check for all matching lines in the sector
+// and disable blocking/midtextures
+//
 void A_ClearForceField(mobj_t* actor)
 {
-    // STRIFE-TODO
+    int i;
+    sector_t *sec;
+    line_t *secline;
+
+    actor->flags &= ~(MF_SOLID|MF_SPECIAL);
+    sec = actor->subsector->sector;
+
+    if(!sec->linecount)
+        return;
+
+    for(i = 0; i < sec->linecount; i++)
+    {
+        secline = sec->lines[i];
+        if(!(secline->flags & ML_TWOSIDED))
+            continue;
+        if(secline->special != 148)
+            continue;
+
+        secline->flags &= ~ML_BLOCKING;
+        secline->special = 0;
+        sides[secline->sidenum[0]].midtexture = 0;
+        sides[secline->sidenum[1]].midtexture = 0;
+    }
 }