| 1380 | |
| 1381 | #if defined(__clang__) || defined(__GNUC__) |
| 1382 | __attribute__((no_sanitize("shift-base"))) |
| 1383 | #endif |
| 1384 | void StartWalk3(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, int EndDir, int sdir) |
| 1385 | { |
| 1386 | int px, py, x, y; |
| 1387 | |
| 1388 | if ((DWORD)pnum >= MAX_PLRS) { |
| 1389 | app_fatal("StartWalk3: illegal player %d", pnum); |
| 1390 | } |
| 1391 | |
| 1392 | if (plr[pnum]._pInvincible && !plr[pnum]._pHitPoints && pnum == myplr) { |
| 1393 | SyncPlrKill(pnum, -1); |
| 1394 | return; |
| 1395 | } |
| 1396 | |
| 1397 | SetPlayerOld(pnum); |
| 1398 | px = xadd + plr[pnum].WorldX; |
| 1399 | py = yadd + plr[pnum].WorldY; |
| 1400 | x = mapx + plr[pnum].WorldX; |
| 1401 | y = mapy + plr[pnum].WorldY; |
| 1402 | |
| 1403 | if (!PlrDirOK(pnum, EndDir)) { |
| 1404 | return; |
| 1405 | } |
| 1406 | |
| 1407 | plr[pnum]._px = px; |
| 1408 | plr[pnum]._py = py; |
| 1409 | |
| 1410 | if (pnum == myplr) { |
| 1411 | ScrollInfo._sdx = plr[pnum].WorldX - ViewX; |
| 1412 | ScrollInfo._sdy = plr[pnum].WorldY - ViewY; |
| 1413 | } |
| 1414 | |
| 1415 | dPlayer[plr[pnum].WorldX][plr[pnum].WorldY] = -1 - pnum; |
| 1416 | dPlayer[px][py] = -1 - pnum; |
| 1417 | plr[pnum]._pVar4 = x; |
| 1418 | plr[pnum]._pVar5 = y; |
| 1419 | dFlags[x][y] |= BFLAG_PLAYERLR; |
| 1420 | plr[pnum]._pxoff = xoff; |
| 1421 | plr[pnum]._pyoff = yoff; |
| 1422 | |
| 1423 | if (leveltype) { |
| 1424 | ChangeLightXY(plr[pnum]._plid, x, y); |
| 1425 | PM_ChangeLightOff(pnum); |
| 1426 | } |
| 1427 | |
| 1428 | plr[pnum]._pmode = PM_WALK3; |
| 1429 | plr[pnum]._pxvel = xvel; |
| 1430 | plr[pnum]._pyvel = yvel; |
| 1431 | plr[pnum]._pVar1 = px; |
| 1432 | plr[pnum]._pVar2 = py; |
| 1433 | plr[pnum]._pVar6 = xoff * 256; |
| 1434 | plr[pnum]._pVar7 = yoff * 256; |
| 1435 | plr[pnum]._pVar3 = EndDir; |
| 1436 | |
| 1437 | if (!(plr[pnum]._pGFXLoad & PFILE_WALK)) { |
| 1438 | LoadPlrGFX(pnum, PFILE_WALK); |
| 1439 | } |
no test coverage detected