From ac2a17f5ea92758b27d80651ef7599c3eaa4e7b2 Mon Sep 17 00:00:00 2001 From: nukeykt Date: Mon, 24 Feb 2020 00:39:03 +0900 Subject: [PATCH] Rednukem: dh wip # Conflicts: # GNUmakefile # platform/Windows/rednukem.vcxproj # platform/Windows/rednukem.vcxproj.filters # source/rr/src/common_game.h # source/rr/src/screens.cpp --- source/rr/src/actors.cpp | 2 + source/rr/src/common_game.h | 1 + source/rr/src/duke3d.h | 1 + source/rr/src/game.cpp | 10 +- source/rr/src/gamedef.cpp | 10 ++ source/rr/src/gamedef.h | 5 + source/rr/src/gameexec.cpp | 124 ++++++++++++++++-- source/rr/src/player.h | 2 + source/rr/src/rrdh.cpp | 250 ++++++++++++++++++++++++++++++++++++ source/rr/src/rrdh.h | 38 ++++++ source/rr/src/screens.cpp | 97 +++++++++++++- 11 files changed, 526 insertions(+), 14 deletions(-) create mode 100644 source/rr/src/rrdh.cpp create mode 100644 source/rr/src/rrdh.h diff --git a/source/rr/src/actors.cpp b/source/rr/src/actors.cpp index e9ad1787c..dca38624a 100644 --- a/source/rr/src/actors.cpp +++ b/source/rr/src/actors.cpp @@ -9550,6 +9550,8 @@ static void A_DoLight(int spriteNum) void A_PlayAlertSound(int spriteNum) { + if (DEER) + return; if (RR) { if (sprite[spriteNum].extra > 0) diff --git a/source/rr/src/common_game.h b/source/rr/src/common_game.h index f0b9ba44a..39384b003 100644 --- a/source/rr/src/common_game.h +++ b/source/rr/src/common_game.h @@ -20,6 +20,7 @@ BEGIN_RR_NS #define WW2GI (g_gameType & GAMEFLAG_WW2GI) #define NAM_WW2GI (g_gameType & (GAMEFLAG_NAM|GAMEFLAG_WW2GI)) #define SHAREWARE (g_gameType & GAMEFLAG_SHAREWARE) +#define DEER (g_gameType & GAMEFLAG_DEER) //#define DUKEBETA ((g_gameType & GAMEFLAG_DUKEBETA) == GAMEFLAG_DUKEBETA) //#define IONMAIDEN (g_gameType & GAMEFLAG_IONMAIDEN) diff --git a/source/rr/src/duke3d.h b/source/rr/src/duke3d.h index 0c93cfef3..09c5adb42 100644 --- a/source/rr/src/duke3d.h +++ b/source/rr/src/duke3d.h @@ -129,6 +129,7 @@ END_RR_NS #include "sector.h" #include "sounds.h" #include "soundsdyn.h" +#include "rrdh.h" BEGIN_RR_NS diff --git a/source/rr/src/game.cpp b/source/rr/src/game.cpp index a274a0733..21f2391e5 100644 --- a/source/rr/src/game.cpp +++ b/source/rr/src/game.cpp @@ -6769,7 +6769,15 @@ static void G_PostLoadPalette(void) // Has to be after setting the dynamic names (e.g. SHARK). static void A_InitEnemyFlags(void) { - if (RRRA) + if (DEER) + { + int DukeEnemies[] = { + DOGRUN, PIG, VIXEN, CHEER }; + + for (bssize_t i = ARRAY_SIZE(DukeEnemies) - 1; i >= 0; i--) + SETFLAG(DukeEnemies[i], SFLAG_HARDCODED_BADGUY|SFLAG_BADGUY_TILE|SFLAG_KILLCOUNT); + } + else if (RRRA) { int DukeEnemies[] = { BOULDER, BOULDER1, EGG, RAT, TORNADO, BILLYCOCK, BILLYRAY, BILLYRAYSTAYPUT, diff --git a/source/rr/src/gamedef.cpp b/source/rr/src/gamedef.cpp index d8f6a6a20..7f0ee1a5b 100644 --- a/source/rr/src/gamedef.cpp +++ b/source/rr/src/gamedef.cpp @@ -126,6 +126,7 @@ static tokenmap_t const vm_keywords[] = { "defineskillname", CON_DEFINESKILLNAME }, { "definesound", CON_DEFINESOUND }, { "definevolumename", CON_DEFINEVOLUMENAME }, + { "deploybias", CON_DEPLOYBIAS }, { "destroyit", CON_DESTROYIT }, { "else", CON_ELSE }, { "enda", CON_ENDA }, @@ -158,6 +159,7 @@ static tokenmap_t const vm_keywords[] = { "ifceilingdistl", CON_IFCEILINGDISTL }, { "ifcount", CON_IFCOUNT }, { "ifdead", CON_IFDEAD }, + { "iffindnewspot", CON_IFFINDNEWSPOT }, { "iffloordistl", CON_IFFLOORDISTL }, { "ifgapzl", CON_IFGAPZL }, { "ifgotweaponce", CON_IFGOTWEAPONCE }, @@ -195,6 +197,7 @@ static tokenmap_t const vm_keywords[] = { "ifsquished", CON_IFSQUISHED }, { "ifstrength", CON_IFSTRENGTH }, { "iftipcow", CON_IFTIPCOW }, + { "ifpupwind", CON_IFPUPWIND }, { "ifvare", CON_IFVARE }, { "ifvarg", CON_IFVARG }, { "ifvarl", CON_IFVARL }, @@ -208,6 +211,8 @@ static tokenmap_t const vm_keywords[] = { "iseat", CON_ISEAT }, { "killit", CON_KILLIT }, { "larrybird", CON_LARRYBIRD }, + { "leavedroppings", CON_LEAVEDROPPINGS }, + { "leavetrax", CON_LEAVETRAX }, { "lotsofglass", CON_LOTSOFGLASS }, { "mail", CON_MAIL }, { "mamaend", CON_MAMAEND }, @@ -2108,6 +2113,8 @@ ifvar: case CON_IFONMOTO: case CON_IFONBOAT: case CON_IFSIZEDOWN: + case CON_IFFINDNEWSPOT: + case CON_IFPUPWIND: { intptr_t offset; intptr_t lastScriptPtr = (g_scriptPtr-&apScript[0]-1); @@ -2503,6 +2510,9 @@ ifvar: case CON_GARYBANJO: case CON_MOTOLOOPSND: case CON_RNDMOVE: + case CON_LEAVETRAX: + case CON_LEAVEDROPPINGS: + case CON_DEPLOYBIAS: continue; case CON_NULLOP: diff --git a/source/rr/src/gamedef.h b/source/rr/src/gamedef.h index 84b04745c..7a93438f8 100644 --- a/source/rr/src/gamedef.h +++ b/source/rr/src/gamedef.h @@ -341,6 +341,11 @@ enum ScriptKeywords_t CON_ENDEVENT, // 159 CON_IFVARE, // 160 CON_IFVARVARE, // 161 + CON_IFFINDNEWSPOT, // 162 + CON_LEAVETRAX, // 163 + CON_LEAVEDROPPINGS, // 164 + CON_DEPLOYBIAS, // 165 + CON_IFPUPWIND, // 166 CON_END }; // KEEPINSYNC with the keyword list in lunatic/con_lang.lua diff --git a/source/rr/src/gameexec.cpp b/source/rr/src/gameexec.cpp index 412556b6e..485350e9e 100644 --- a/source/rr/src/gameexec.cpp +++ b/source/rr/src/gameexec.cpp @@ -269,6 +269,12 @@ GAMEEXEC_STATIC GAMEEXEC_INLINE void P_ForceAngle(DukePlayer_t *pPlayer) int32_t A_Dodge(spritetype * const); int32_t A_Dodge(spritetype * const pSprite) { + if (DEER) + { + pSprite->ang += ((rrdh_random() & 255) - 127) * 2; + pSprite->ang &= 2047; + return 0; + } vec2_t const msin = { sintable[(pSprite->ang + 512) & 2047], sintable[pSprite->ang & 2047] }; for (native_t nexti, SPRITES_OF_STAT_SAFE(STAT_PROJECTILE, i, nexti)) //weapons list @@ -653,7 +659,7 @@ GAMEEXEC_STATIC void VM_Move(void) if ((movflags&jumptoplayer_bits) == jumptoplayer_bits) { if (AC_COUNT(vm.pData) < 16) - vm.pSprite->zvel -= (RRRA && vm.pSprite->picnum == CHEER) ? (sintable[(512+(AC_COUNT(vm.pData)<<4))&2047]/40) + vm.pSprite->zvel -= (!DEER && RRRA && vm.pSprite->picnum == CHEER) ? (sintable[(512+(AC_COUNT(vm.pData)<<4))&2047]/40) : (sintable[(512+(AC_COUNT(vm.pData)<<4))&2047]>>5); } @@ -866,6 +872,28 @@ GAMEEXEC_STATIC void VM_Move(void) = { (spriteXvel * (sintable[(angDiff + 512) & 2047])) >> 14, (spriteXvel * (sintable[angDiff & 2047])) >> 14, vm.pSprite->zvel }; vm.pActor->movflag = A_MoveSprite(vm.spriteNum, &vect, CLIPMASK0); + if (DEER && vm.pSprite->picnum != DOGRUN) + { + if ((vm.pActor->movflag & 49152) == 32768) + { + int const wallnum = vm.pActor->movflag & (MAXWALLS-1); + if (ghcons_isanimalescapewall(wallnum)) + { + vm.pSprite->z = sector[vm.pSprite->sectnum].ceilingz; + A_MoveSprite(vm.spriteNum, &vect, CLIPMASK0); + vm.pSprite->z = sector[vm.pSprite->sectnum].floorz; + } + } + else if ((vm.pActor->movflag & 49152) == 16384) + { + int sectnum = vm.pActor->movflag & (MAXSECTORS-1); + if (ghcons_isanimalescapesect(sectnum)) + { + A_MoveSprite(vm.spriteNum, &vect, CLIPMASK0); + vm.pSprite->z = sector[vm.pSprite->sectnum].floorz; + } + } + } } if (!badguyp) @@ -1133,7 +1161,8 @@ static void VM_Fall(int const spriteNum, spritetype * const pSprite) if ((unsigned)newsect < MAXSECTORS) changespritesect(spriteNum, newsect); - A_PlaySound(THUD, spriteNum); + if (!DEER) + A_PlaySound(THUD, spriteNum); } } @@ -1366,6 +1395,18 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) { uspritetype *pSprite = (uspritetype *)&sprite[pPlayer->i]; + if (DEER) + { + if (sintable[vm.pSprite->ang&2047] * (pSprite->y - vm.pSprite->y) + sintable[(vm.pSprite->ang+512)&2047] * (pSprite->x - vm.pSprite->x) >= 0) + tw = cansee(vm.pSprite->x, vm.pSprite->y, vm.pSprite->z - (krand2() % 13312), vm.pSprite->sectnum, + pSprite->x, pSprite->y, pPlayer->opos.z-(krand2() % 8192), pPlayer->cursectnum); + else + tw = 0; + + VM_CONDITIONAL(tw); + continue; + } + // select sprite for monster to target // if holoduke is on, let them target holoduke first. // @@ -1411,7 +1452,16 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) continue; } - case CON_IFHITWEAPON: VM_CONDITIONAL(A_IncurDamage(vm.spriteNum) >= 0); continue; + case CON_IFHITWEAPON: + if (DEER) + { + VM_CONDITIONAL(ghtrophy_isakill(vm.spriteNum)); + } + else + { + VM_CONDITIONAL(A_IncurDamage(vm.spriteNum) >= 0); + } + continue; case CON_IFSQUISHED: VM_CONDITIONAL(VM_CheckSquished()); continue; @@ -1442,7 +1492,7 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) continue; case CON_IFPDISTL: - VM_CONDITIONAL(vm.playerDist < *(++insptr)); + VM_CONDITIONAL(!(DEER && sub_535EC()) && vm.playerDist < *(++insptr)); if (vm.playerDist > MAXSLEEPDIST && vm.pActor->timetosleep == 0) vm.pActor->timetosleep = SLEEPTIME; continue; @@ -1728,6 +1778,11 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) } continue; + case CON_DEPLOYBIAS: + insptr++; + ghdeploy_bias(vm.spriteNum); + continue; + case CON_MAMAEND: insptr++; g_player[myconnectindex].ps->level_end_timer = 150; @@ -1778,6 +1833,15 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) VM_CONDITIONAL(0); continue; + case CON_IFFINDNEWSPOT: + VM_CONDITIONAL(ghcons_findnewspot(vm.spriteNum)); + continue; + + case CON_LEAVEDROPPINGS: + insptr++; + ghtrax_leavedroppings(vm.spriteNum); + continue; + case CON_TEARITUP: insptr++; for (bssize_t SPRITES_OF_SECT(vm.pSprite->sectnum, spriteNum)) @@ -1829,6 +1893,13 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) continue; case CON_ADDKILLS: + if (DEER) + { + // no op + insptr++; + insptr++; + continue; + } insptr++; if (g_gameType & GAMEFLAG_RR) { @@ -1930,6 +2001,11 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) pPlayer->pos.z = sector[sprite[pPlayer->i].sectnum].ceilingz; sprite[pPlayer->i].z = pPlayer->pos.z; continue; + + case CON_LEAVETRAX: + insptr++; + ghtrax_leavetrax(vm.spriteNum); + continue; case CON_DESTROYIT: insptr++; @@ -2244,6 +2320,11 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) continue; case CON_IFONWATER: + if (DEER) + { + VM_CONDITIONAL(sector[vm.pSprite->sectnum].hitag == 2003); + continue; + } VM_CONDITIONAL(sector[vm.pSprite->sectnum].lotag == ST_1_ABOVE_WATER && klabs(vm.pSprite->z - sector[vm.pSprite->sectnum].floorz) < ZOFFSET5); continue; @@ -2270,7 +2351,18 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) VM_CONDITIONAL(g_windTime > 0); continue; - case CON_IFINWATER: VM_CONDITIONAL(sector[vm.pSprite->sectnum].lotag == ST_2_UNDERWATER); continue; + case CON_IFPUPWIND: + VM_CONDITIONAL(ghtrax_isplrupwind(vm.spriteNum, vm.playerNum)); + continue; + + case CON_IFINWATER: + if (DEER) + { + VM_CONDITIONAL(sector[vm.pSprite->sectnum].hitag == 2003 && klabs(vm.pSprite->z - sector[vm.pSprite->sectnum].floorz) < ZOFFSET5); + continue; + } + VM_CONDITIONAL(sector[vm.pSprite->sectnum].lotag == ST_2_UNDERWATER); + continue; case CON_IFCOUNT: insptr++; @@ -2317,12 +2409,13 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) || ((moveFlags & pwalkingback) && playerXVel <= -8 && !TEST_SYNC_KEY(syncBits, SK_RUN)) || ((moveFlags & prunningback) && playerXVel <= -8 && TEST_SYNC_KEY(syncBits, SK_RUN)) || ((moveFlags & pkicking) - && (pPlayer->quick_kick > 0 - || (pPlayer->curr_weapon == KNEE_WEAPON && pPlayer->kickback_pic > 0))) - || ((moveFlags & pshrunk) && sprite[pPlayer->i].xrepeat < (RR ? 8 : 32)) + && (DEER ? ghsound_pfiredgunnear(vm.pSprite, vm.playerNum) :(pPlayer->quick_kick > 0 + || (pPlayer->curr_weapon == KNEE_WEAPON && pPlayer->kickback_pic > 0)))) + || ((moveFlags & pshrunk) && (DEER ? pPlayer->dhat60f && !sub_535EC() : sprite[pPlayer->i].xrepeat < (RR ? 8 : 32))) || ((moveFlags & pjetpack) && pPlayer->jetpack_on) - || ((moveFlags & ponsteroids) && pPlayer->inv_amount[GET_STEROIDS] > 0 && pPlayer->inv_amount[GET_STEROIDS] < 400) - || ((moveFlags & ponground) && pPlayer->on_ground) + || ((moveFlags & ponsteroids) && (DEER ? ghsound_pmadesound(vm.pSprite, vm.playerNum) : + pPlayer->inv_amount[GET_STEROIDS] > 0 && pPlayer->inv_amount[GET_STEROIDS] < 400)) + || ((moveFlags & ponground) && (DEER ? ghsound_pmadecall(vm.pSprite, vm.playerNum) : pPlayer->on_ground)) || ((moveFlags & palive) && sprite[pPlayer->i].xrepeat > (RR ? 8 : 32) && sprite[pPlayer->i].extra > 0 && pPlayer->timebeforeexit == 0) || ((moveFlags & pdead) && sprite[pPlayer->i].extra <= 0)) nResult = 1; @@ -2377,7 +2470,14 @@ GAMEEXEC_STATIC void VM_Execute(native_t loop) case CON_IFHITSPACE: VM_CONDITIONAL(TEST_SYNC_KEY(g_player[vm.playerNum].inputBits->bits, SK_OPEN)); continue; - case CON_IFOUTSIDE: VM_CONDITIONAL(sector[vm.pSprite->sectnum].ceilingstat & 1); continue; + case CON_IFOUTSIDE: + if (DEER) + { + VM_CONDITIONAL(sector[vm.pSprite->sectnum].hitag = 2000); + continue; + } + VM_CONDITIONAL(sector[vm.pSprite->sectnum].ceilingstat & 1); + continue; case CON_IFMULTIPLAYER: VM_CONDITIONAL((g_netServer || g_netClient || ud.multimode > 1)); continue; @@ -2830,7 +2930,7 @@ void A_Execute(int spriteNum, int playerNum, int playerDist) VM_Move(); - if (vm.pSprite->statnum != STAT_ACTOR) + if (DEER || vm.pSprite->statnum != STAT_ACTOR) { if (vm.pSprite->statnum == STAT_STANDABLE) { diff --git a/source/rr/src/player.h b/source/rr/src/player.h index 135c5efb7..120fe07fc 100644 --- a/source/rr/src/player.h +++ b/source/rr/src/player.h @@ -221,6 +221,8 @@ typedef struct { int32_t sea_sick; uint8_t hurt_delay2, nocheat; + int32_t dhat60f; + int8_t crouch_toggle; int8_t padding_[3]; } DukePlayer_t; diff --git a/source/rr/src/rrdh.cpp b/source/rr/src/rrdh.cpp new file mode 100644 index 000000000..d66fff601 --- /dev/null +++ b/source/rr/src/rrdh.cpp @@ -0,0 +1,250 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 2016 EDuke32 developers and contributors +Copyright (C) 2020 Nuke.YKT + +This file is part of EDuke32. + +EDuke32 is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 2 +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ +//------------------------------------------------------------------------- + +#include "compat.h" +#include "baselayer.h" +#include "duke3d.h" + +int rrdh_randseed = 1; + +int rrdh_random(void) +{ + static int seedinit = 0; + if (!seedinit) + { + rrdh_randseed = (int)timerGetPerformanceCounter(); + seedinit = 1; + } + rrdh_randseed = (rrdh_randseed*1103515245)+12345; + return (rrdh_randseed>>16)&0x7fff; +} + + +int ghcons_isanimalescapewall(short w) +{ + walltype *wl = &wall[w]; + switch (wall[w].picnum) + { + case 1182: + case 1183: + case 1184: + case 1185: + case 2347: + case 3802: + case 3803: + case 7870: + case 7871: + case 7872: + return 1; + } + return 0; +} + +int ghcons_isanimalescapesect(short s) +{ + sectortype *sc = §or[s]; + return sector[s].hitag == 2001; +} +int ghcons_findnewspot(short a1) +{ + // TODO + return 0; +} + +int ghsound_pmadecall(spritetype *a1, short a2) +{ + switch (DYNAMICTILEMAP(a1->picnum)) + { + case DOGRUN__STATICRR: + if (A_CheckSoundPlaying(-1, 41)) + return 1; + case VIXEN__STATICRR: + if (A_CheckSoundPlaying(-1, 40)) + return 1; + case PIG__STATICRR: + if (A_CheckSoundPlaying(-1, 42)) + return 1; + case CHEER__STATICRR: + if (A_CheckSoundPlaying(-1, 43)) + return 1; + } + return 0; +} + +int ghsound_pmadesound(spritetype *a1, short a2) +{ + int d = klabs(g_player[a2].ps->pos.x - a1->x) + klabs(g_player[a2].ps->pos.y - a1->y); + if (A_CheckSoundPlaying(-1, 1) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 2)) + return 1; + if (A_CheckSoundPlaying(-1, 3) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 4)) + return 1; + if (A_CheckSoundPlaying(-1, 5) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 6)) + return 1; + if (A_CheckSoundPlaying(-1, 7) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 8) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 56) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 57) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 58) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 59) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 25) && d < 21504) + return 1; + if (A_CheckSoundPlaying(-1, 11) && d < 10752) + return 1; + if (A_CheckSoundPlaying(-1, 9) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 10) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 12) && d < 19968) + return 1; + if (A_CheckSoundPlaying(-1, 15) && d < 10752) + return 1; + if (A_CheckSoundPlaying(-1, 13) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 14) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 16) && d < 19968) + return 1; + if (A_CheckSoundPlaying(-1, 19) && d < 10752) + return 1; + if (A_CheckSoundPlaying(-1, 17) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 18) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 20) && d < 19968) + return 1; + if (A_CheckSoundPlaying(-1, 23) && d < 10752) + return 1; + if (A_CheckSoundPlaying(-1, 21) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 22) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 24) && d < 19968) + return 1; + if (A_CheckSoundPlaying(-1, 81) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 80) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 41) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 40) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 42) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 43) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 88) && d < 10752) + return 1; + if (A_CheckSoundPlaying(-1, 89) && d < 15360) + return 1; + if (A_CheckSoundPlaying(-1, 90) && d < 23040) + return 1; + if (A_CheckSoundPlaying(-1, 27) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 36) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 30) && d < 30720) + return 1; + if (A_CheckSoundPlaying(-1, 33) && d < 30720) + return 1; + return 0; +} + +int ghsound_pfiredgunnear(spritetype *a1, short a2) +{ + if (A_CheckSoundPlaying(-1, 2)) + return 1; + if (A_CheckSoundPlaying(-1, 4)) + return 1; + if (A_CheckSoundPlaying(-1, 6)) + return 1; + if (A_CheckSoundPlaying(-1, 8) && klabs(g_player[a2].ps->pos.x - a1->x) + klabs(g_player[a2].ps->pos.y - a1->y) < 23040) + return 1; + return 0; +} + +int dword_AA2F4; + +void sub_535DC(void) +{ + dword_AA2F4 ^= 1; +} + +int sub_535EC(void) +{ + return dword_AA2F4; +} + +int dword_AA300; + +struct struct2B80E0 { + short f_0; + short f_2; + int f_4; + int f_8; + int f_c; + int f_10; +}; + +struct2B80E0 f2B80E0[20]; + +int ghtrophy_isakill(short a1) +{ + spritetype *spr = &sprite[a1]; + for (int i = 0; i < dword_AA300; i++) + { + if (f2B80E0[i].f_0 == a1) + return 1; + } + return 0; +} +int ghtrax_isplrupwind(short a1, short a2) +{ + // TODO + return 0; +} + +void ghtrax_leavetrax(short a1) +{ + // TODO +} +void ghtrax_leavedroppings(short a1) +{ + // TODO +} + +void ghdeploy_bias(short a1) +{ + // TODO +} diff --git a/source/rr/src/rrdh.h b/source/rr/src/rrdh.h new file mode 100644 index 000000000..c045b63c8 --- /dev/null +++ b/source/rr/src/rrdh.h @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 2016 EDuke32 developers and contributors +Copyright (C) 2020 Nuke.YKT + +This file is part of EDuke32. + +EDuke32 is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 2 +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ +//------------------------------------------------------------------------- + +#pragma once + +int rrdh_random(void); +int ghcons_isanimalescapewall(short w); +int ghcons_isanimalescapesect(short s); +int ghtrophy_isakill(short a1); +int sub_535EC(void); +void ghdeploy_bias(short a1); +int ghcons_findnewspot(short a1); +void ghtrax_leavedroppings(short a1); +void ghtrax_leavetrax(short a1); +int ghtrax_isplrupwind(short a1, short a2); +int ghsound_pfiredgunnear(spritetype* a1, short a2); +int ghsound_pmadesound(spritetype* a1, short a2); +int ghsound_pmadecall(spritetype* a1, short a2); diff --git a/source/rr/src/screens.cpp b/source/rr/src/screens.cpp index 7715a18f1..80dcc54c9 100644 --- a/source/rr/src/screens.cpp +++ b/source/rr/src/screens.cpp @@ -894,7 +894,7 @@ void G_DisplayRest(int32_t smoothratio) menutext_(160<<16, (90+16+8)<<16, -g_levelTextTime+22/*quotepulseshade*/, currentLevel->DisplayName(), o, TEXT_XCENTER); } - if (g_player[myconnectindex].ps->newowner == -1 && ud.overhead_on == 0 && cl_crosshair && ud.camerasprite == -1) + if (!DEER && g_player[myconnectindex].ps->newowner == -1 && ud.overhead_on == 0 && ud.crosshair && ud.camerasprite == -1) { int32_t a = CROSSHAIR; if ((unsigned) a < MAXTILES) @@ -1164,6 +1164,101 @@ void G_DisplayLogo(void) Mus_Stop(); FX_StopAllSounds(); // JBF 20031228 S_ClearSoundLocks(); // JBF 20031228 + if (DEER) + { + if (!g_noLogo /* && (!g_netServer && ud.multimode < 2) */) + { + if (!I_CheckAllInput() && g_noLogoAnim == 0) + { + videoClearScreen(0); + + P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 0); // JBF 20040308 + fadepal(0, 0, 0, 0, 252, 28); + renderFlushPerms(); + rotatesprite_fs(160 << 16, 100 << 16, 65536L, 0, 7106, 0, 0, 2 + 8 + 64 + BGSTRETCH); + videoNextPage(); + fadepaltile(0, 0, 0, 252, 0, -4, 7106); + totalclock = 0; + + while (totalclock < (120 * 3) && !I_CheckAllInput()) + { + if (G_FPSLimit()) + { + videoClearScreen(0); + rotatesprite_fs(160 << 16, 100 << 16, 65536L, 0, 7106, 0, 0, 2 + 8 + 64 + BGSTRETCH); + G_HandleAsync(); + + if (g_restorePalette) + { + P_SetGamePalette(g_player[myconnectindex].ps, g_player[myconnectindex].ps->palette, 0); + g_restorePalette = 0; + } + videoNextPage(); + } + } + + fadepaltile(0, 0, 0, 0, 252, 4, 7106); + } + + videoClearScreen(0L); + videoNextPage(); + + inputState.ClearAllInput(); + + videoClearScreen(0L); + videoNextPage(); + + videoClearScreen(0); + + //g_player[myconnectindex].ps->palette = drealms; + //G_FadePalette(0,0,0,252); + + if (!inputState.CheckAllInput() && g_noLogoAnim == 0) + { + videoClearScreen(0); + + P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 8 + 2 + 1); // JBF 20040308 + fadepal(0, 0, 0, 0, 252, 28); + renderFlushPerms(); + rotatesprite_fs(160 << 16, 100 << 16, 65536L, 0, 7107, 0, 0, 2 + 8 + 64 + BGSTRETCH); + videoNextPage(); + fadepaltile(0, 0, 0, 252, 0, -4, 7107); + totalclock = 0; + + while (totalclock < (120 * 3) && !I_CheckAllInput()) + { + if (G_FPSLimit()) + { + videoClearScreen(0); + rotatesprite_fs(160 << 16, 100 << 16, 65536L, 0, 7107, 0, 0, 2 + 8 + 64 + BGSTRETCH); + G_HandleAsync(); + + if (g_restorePalette) + { + P_SetGamePalette(g_player[myconnectindex].ps, g_player[myconnectindex].ps->palette, 0); + g_restorePalette = 0; + } + videoNextPage(); + } + } + + fadepaltile(0, 0, 0, 0, 252, 4, 7107); + } + + inputState.ClearAllInput(); + } + + renderFlushPerms(); + videoClearScreen(0L); + videoNextPage(); + + //g_player[myconnectindex].ps->palette = palette; + P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 0); // JBF 20040308 + + //G_FadePalette(0,0,0,0); + videoClearScreen(0L); + return; + } if (RRRA) return; if (RR)