@@ -1306,6 +1306,18 @@ weapon::weapon(zfix X,zfix Y,zfix Z,int32_t Id,int32_t Type,int32_t pow,int32_t
13061306 case wThrown:
13071307 misc_wflags = WFLAG_BREAK_WHEN_LANDING;
13081308 break ;
1309+ case wLitBomb:
1310+ case wLitSBomb:
1311+ if (parentitem>=0 )
1312+ {
1313+ itemdata const & parent = itemsbuf[parentitem];
1314+ if ((parent.family ==itype_bomb || parent.family ==itype_sbomb)
1315+ && (parent.flags &ITEM_FLAG3))
1316+ {
1317+ misc_wflags |= WFLAG_STOP_WHEN_LANDING;
1318+ }
1319+ }
1320+ break ;
13091321 }
13101322
13111323
@@ -3430,15 +3442,19 @@ void weapon::limited_animate()
34303442 if (!misc)
34313443 break ;
34323444
3433- if (clk==(misc-2 ) && step==0 )
3445+ bool fixboom = !get_bit (quest_rules,qr_BROKEN_MOVING_BOMBS);
3446+ bool canboom = (fixboom || step==0 );
3447+ if (clk==(misc-2 ) && canboom)
34343448 {
34353449 id = (id>wEnemyWeapons ? (id==ewLitSBomb||id==ewSBomb ? ewSBomb : ewBomb)
34363450 : parentitem>-1 ? ((itemsbuf[parentitem].family ==itype_sbomb) ? wSBomb:wBomb)
34373451 : (id==wLitSBomb||id==wSBomb ? wSBomb : wBomb));
34383452 hxofs=2000 ;
3453+ step = 0 ;
3454+ if (fixboom) moveflags &= ~FLAG_OBEYS_GRAV;
34393455 }
34403456
3441- if (clk==(misc-1 ) && step== 0 )
3457+ if (clk==(misc-1 ) && canboom )
34423458 {
34433459 sfx ((id>=wEnemyWeapons || parentitem<0 ) ? WAV_BOMB :
34443460 itemsbuf[parentitem].usesound ,pan (int32_t (x)));
@@ -3456,14 +3472,19 @@ void weapon::limited_animate()
34563472 usedefence = usedefencedummy;
34573473 useweapon = useweapondummy;
34583474 hzsz=16 ;
3475+ step = 0 ;
3476+ if (fixboom) moveflags &= ~FLAG_OBEYS_GRAV;
34593477 }
34603478
34613479 int32_t boomend = (misc+(((id == wBomb || id == wSBomb || id == wLitBomb || id == wLitSBomb) &&
34623480 (parentitem>-1 && itemsbuf[parentitem].flags & ITEM_FLAG1)) ? 35 : 31 ));
34633481
3464- if (clk==boomend && step==0 )
3482+ if (clk==boomend && canboom)
3483+ {
34653484 hxofs=2000 ;
3466-
3485+ step = 0 ;
3486+ if (fixboom) moveflags &= ~FLAG_OBEYS_GRAV;
3487+ }
34673488 if (id<wEnemyWeapons)
34683489 {
34693490 if (clk==(misc-1 ))
@@ -3543,7 +3564,7 @@ void weapon::limited_animate()
35433564
35443565 if (clk==misc+34 )
35453566 {
3546- if (step== 0 )
3567+ if (canboom )
35473568 {
35483569 dead=1 ;
35493570 }
@@ -3892,6 +3913,8 @@ bool weapon::animate(int32_t index)
38923913
38933914 if (misc_wflags & WFLAG_BREAK_WHEN_LANDING) // Die
38943915 dead = 0 ;
3916+ if (misc_wflags & WFLAG_STOP_WHEN_LANDING) // Stop movement
3917+ step = 0 ;
38953918 }
38963919
38973920 if (y>192 ) dead=0 ; // Out of bounds
@@ -3906,8 +3929,13 @@ bool weapon::animate(int32_t index)
39063929 if (fakez <= 0 )
39073930 {
39083931 fakez = fakefall = 0 ;
3909- if (didfall && (misc_wflags & WFLAG_BREAK_WHEN_LANDING)) // Die
3910- dead = 0 ;
3932+ if (didfall)
3933+ {
3934+ if (misc_wflags & WFLAG_BREAK_WHEN_LANDING) // Die
3935+ dead = 0 ;
3936+ if (misc_wflags & WFLAG_STOP_WHEN_LANDING) // Stop movement
3937+ step = 0 ;
3938+ }
39113939 }
39123940 else if (fakefall <= (int32_t )zinit.terminalv )
39133941 {
@@ -3922,8 +3950,13 @@ bool weapon::animate(int32_t index)
39223950 if (z <= 0 )
39233951 {
39243952 z = fall = 0 ;
3925- if (didfall && (misc_wflags & WFLAG_BREAK_WHEN_LANDING)) // Die
3926- dead = 0 ;
3953+ if (didfall)
3954+ {
3955+ if (misc_wflags & WFLAG_BREAK_WHEN_LANDING) // Die
3956+ dead = 0 ;
3957+ if (misc_wflags & WFLAG_STOP_WHEN_LANDING) // Stop movement
3958+ step = 0 ;
3959+ }
39273960 }
39283961 else if (fall <= (int32_t )zinit.terminalv )
39293962 {
0 commit comments